本文介紹如何使用EDAS提供的Java SDK調用API在K8s集群中進行金絲雀發布應用(JAR包、WAR包和鏡像)。
準備工作
金絲雀發布應用前,您必須提前完成以下準備工作:
- 確定應用部署地域,假設為cn-hangzhou。
在EDAS K8s環境中創建應用。目前支持多種創建應用的方式,請根據實際需求選擇:
如果已經創建應用,您可以調用ListApplication接口查詢應用列表,獲取目標應用的AppId,假設為6bbc57a2-a017-4bec-b521-49a15bd3****。
- 已將應用升級部署包(JAR包、WAR包和鏡像)上傳至目標地址。
- JAR包或WAR包:本示例以OSS存儲路徑為例,假設為https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.2-SNAPSHOT.jar。
- 鏡像:假設鏡像倉庫為image-demo-project,鏡像地址為registry-vpc.cn-hangzhou.aliyuncs.com/image-demo-project/provider:2.0。
背景信息
使用API金絲雀發布應用,在首批灰度發布后,您必須手動確認繼續剩余批次的發布。在確認剩余批次發布前,您可以進行小規模驗證,驗證后,再繼續剩余批次的發布,即將應用全量升級到新版本。
使用API金絲雀發布應用,設置剩余批次(除首批灰度發布外)的發布方式時推薦選用自動分批發布。如果您選用手動分批發布方式,則還需要調用ContinuePipeline接口手動確認執行下一批發布。
此處提供兩種金絲雀發布策略示例,請根據您的實際場景選擇并修改策略。
首批灰度發布2個Pod實例+剩余Pod實例分2批發布+自動分批+分批間隔1分鐘。
{"type":"GrayBatchUpdate","batchUpdate":{"batch":2,"releaseType":"auto","batchWaitTime":1},"grayUpdate":{"gray":2}}
首批灰度發布2個Pod實例+剩余Pod實例分2批發布+手動分批。
{"type":"GrayBatchUpdate","batchUpdate":{"batch":2,"releaseType":"manual"},"grayUpdate":{"gray":2}}
使用JAR包或WAR包金絲雀發布應用
運行以下示例代碼,使用JAR包或WAR包金絲雀發布應用。
以下代碼適用于在EDAS K8s集群中金絲雀發布應用(JAR包)。代碼中未設置調度規則、啟動命令、環境變量等高級參數,如需了解更多API參數信息,請參見DeployK8sApplication。
說明如果您需要使用WAR包金絲雀應用,請根據需要在示例代碼中增加以下兩個參數:
//部署包依賴的Tomcat版本。適用于通過WAR包部署的Spring Cloud和Dubbo應用。 request.setWebContainer("apache-tomcat-7.0.91"); //部署包依賴的EDAS Container版本。適用于通過WAR包部署的HSF應用。 request.setEdasContainerVersion("3.5.9");
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationRequest; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationResponse; public class DeployK8sApplication { public static void main(String[] args) { // 阿里云賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創建RAM用戶。 // 此處以把AccessKey和AccessKeySecret保存在環境變量為例說明。您可以根據業務需要,保存到配置文件里。 // 強烈建議不要把AccessKey和AccessKeySecret保存到代碼里,會存在密鑰泄漏風險。 String aliyun_user_ak = System.getenv("ACCESS_KEY_ID"); String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET"); //應用所在地域ID。 String region_id = "cn-hangzhou"; DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk); DefaultAcsClient client = new DefaultAcsClient(defaultProfile); //創建API請求,并設置參數。 DeployK8sApplicationRequest request = new DeployK8sApplicationRequest(); //應用ID。 request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****"); //JAR包或者WAR包地址、版本。 request.setPackageUrl("https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.2-SNAPSHOT.jar"); request.setPackageVersion("2021-04-15 16:41:52"); //部署包依賴的JDK版本。可選的參數值為Open JDK 7和Open JDK 8。 request.setJDK("Open JDK 8"); //自定義分批發布策略。此處示例值代表“首批灰度發布2個Pod實例+剩余Pod實例分2批發布+自動分批+分批間隔1分鐘”。 request.setUpdateStrategy("{\"type\":\"GrayBatchUpdate\",\"batchUpdate\":{\"batch\":2,\"releaseType\":\"auto\",\"batchWaitTime\":1},\"grayUpdate\":{\"gray\":2}}"); //灰度發布流量控制策略。示例策略表示:50%的流量會被轉發到灰度分組。 request.setTrafficControlStrategy("{\"http\":{\"rules\":[{\"conditionType\":\"percent\",\"percent\":50}]}}"); //應用實例數。 request.setReplicas(4); //應用運行過程中,應用實例的CPU限額、內存限額等,0表示不限制。 request.setCpuLimit(0); request.setMemoryLimit(0); request.setCpuRequest(0); request.setMemoryRequest(0); //CPU最小資源需求,單位:核數。0表示不限制。 request.setMcpuRequest(0); //CPU能使用的最大值,單位:核數。0表示不限制。 request.setMcpuLimit(0); //變更記錄描述。 request.setChangeOrderDesc("金絲雀發布(JAR包)"); try { DeployK8sApplicationResponse response = client.getAcsResponse(request); System.out.println("ChangeOrderId=" + response.getChangeOrderId() + "\nMessage=" + response.getMessage()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
運行程序,返回的執行結果如下:
ChangeOrderId=5886e6f9-05b1-42f0-a3d4-5d90558e**** Message=success
調用GetChangeOrderInfo接口,獲取金絲雀發布應用變更的相關批次的流程ID(PipelineId)。
調用GetChangeOrderInfo接口,返回結果如下:
{ "Message": "success", "RequestId": "19C54DC3-C66C-40D0-AEED-8D5A1F00F3BA", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "金絲雀發布(JAR包)", "PipelineInfoList": { "PipelineInfo": [ { "PipelineStatus": 2, "PipelineName": "Canary Change", ...... "PipelineId": "ca7221a6-2c39-40b5-b40a-53fd3d99****" ...... "PipelineId": "e228e628-f722-43bc-9c2b-45076c3a****" ...... "PipelineId": "d6dcb857-2ff0-4db9-90fa-a2d9db7b****" ...... //此處未羅列全部執行結果,僅供參考。
說明示例代碼中使用的是首批灰度發布2個Pod實例+剩余Pod實例分2批發布+自動分批+分批間隔1分鐘的金絲雀發布策略,在首批灰度發布2個Pod實例流程運行完以后,需要手動確認繼續剩余批次的發布。在調用GetChangeOrderInfo接口返回結果中出現3個流程ID(PipelineId),第二次出現的流程ID(PipelineId)代表需要手動確認繼續剩余批次的發布。
剩余批次的策略是剩余Pod實例分2批發布+自動分批+分批間隔1分鐘,則無需手動確認,系統自動完成剩余批次的發布。
調用ContinuePipeline接口,手動確認繼續剩余批次的發布。
返回結果如下:
{ "Message": "success", "RequestId": "050392EE-959D-4144-AA02-3A1E7CE2F736", "Code": 200 }
使用鏡像金絲雀發布應用
運行程序,使用鏡像金絲雀發布應用。
以下代碼適用于在EDAS K8s集群中金絲雀發布應用(鏡像)。代碼中未設置調度規則、啟動命令、環境變量等高級參數,如需了解更多API參數信息,請參見DeployK8sApplication。
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationRequest; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationResponse; public class DeployK8sApplication { public static void main(String[] args) { // 阿里云賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM用戶進行API訪問或日常運維,請登錄RAM控制臺創建RAM用戶。 // 此處以把AccessKey和AccessKeySecret保存在環境變量為例說明。您可以根據業務需要,保存到配置文件里。 // 強烈建議不要把AccessKey和AccessKeySecret保存到代碼里,會存在密鑰泄漏風險。 String aliyun_user_ak = System.getenv("ACCESS_KEY_ID"); String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET"); //應用所在地域ID。 String region_id = "cn-hangzhou"; DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk); DefaultAcsClient client = new DefaultAcsClient(defaultProfile); //創建API請求,并設置參數。 DeployK8sApplicationRequest request = new DeployK8sApplicationRequest(); //應用ID。 request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****"); //鏡像地址。 request.setImage("registry-vpc.cn-hangzhou.aliyuncs.com/image-demo-project/provider:2.0"); //自定義金絲雀發布策略。此處示例值代表“首批灰度發布2個Pod實例+剩余Pod實例分2批發布+手動分批”。 request.setUpdateStrategy("{\"type\":\"GrayBatchUpdate\",\"batchUpdate\":{\"batch\":2,\"releaseType\":\"manual\"},\"grayUpdate\":{\"gray\":2}}"); //灰度發布流量控制策略。示例策略表示:50%的流量會被轉發到灰度分組。 request.setTrafficControlStrategy("{\"http\":{\"rules\":[{\"conditionType\":\"percent\",\"percent\":50}]}}"); //應用實例數。 request.setReplicas(4); //應用運行過程中,應用實例的CPU限額、內存限額等,0表示不限制。 request.setCpuLimit(0); request.setMemoryLimit(0); request.setCpuRequest(0); request.setMemoryRequest(0); //CPU最小資源需求,單位:核數。0表示不限制。 request.setMcpuRequest(0); //CPU能使用的最大值,單位:核數。0表示不限制。 request.setMcpuLimit(0); //變更記錄描述。 request.setChangeOrderDesc("金絲雀發布(鏡像)"); try { DeployK8sApplicationResponse response = client.getAcsResponse(request); System.out.println("ChangeOrderId=" + response.getChangeOrderId() + "\nMessage=" + response.getMessage()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
運行程序,返回的執行結果如下:
ChangeOrderId=a7431f9e-7e05-4590-aef8-17088f0**** Message=success
調用GetChangeOrderInfo接口,獲取金絲雀發布應用變更的相關批次的流程ID(PipelineId)。
調用GetChangeOrderInfo接口,返回結果如下:
{ "Message": "success", "RequestId": "1B1127FB-251C-4946-AA20-D4FF5DF4788F", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "金絲雀發布(鏡像)", "PipelineInfoList": { "PipelineInfo": [ { "PipelineStatus": 2, "PipelineName": "Canary Change", ...... "PipelineId": "09e7d9aa-e79d-49ef-99b9-5405532d****" ...... "PipelineId": "1ea53844-2c60-46f1-b46d-df3b34d0****" ...... "PipelineId": "d99da075-b87d-4fe7-bbb6-ae1c6c26****" ...... //此處未羅列全部執行結果,僅供參考。
說明示例代碼中使用的是首批灰度發布2臺+剩余分2批發布+手動分批的金絲雀發布策略,在首批灰度發布2個Pod實例流程運行完以后,需要手動確認繼續剩余批次的發布。在調用GetChangeOrderInfo接口返回結果中出現3個流程ID(PipelineId),第二次出現的流程ID(PipelineId)代表需要手動確認繼續剩余批次的發布,第三次出現的流程ID(PipelineId)代表剩余批次中第一批完成后需要手動確認繼續下一批次的發布。
調用ContinuePipeline接口,手動確認繼續剩余批次發布。
返回結果如下:
{ "Message": "success", "RequestId": "B8ECF6F7-672D-40E9-91DD-1C33F06D4FD8", "Code": 200 }
調用ContinuePipeline接口,手動確認下一批發布。
返回結果如下:
{ "Message": "success", "RequestId": "7BB4F043-7C28-4A0E-B6A5-D4023EB24388", "Code": 200 }
說明示例代碼中使用的是首批灰度發布2個Pod實例+剩余Pod實例分2批發布+手動分批的金絲雀發布策略,運行到剩余批次發布過程,只需要手動確認一批。如果您是剩余批次需要手動確認多批的場景,請選擇正確批次的流程ID(PipelineId)并重復執行此步驟。
重復執行此步驟時,請等待批次內部署間隔時長,默認10秒。
結果驗證
您在金絲雀發布應用后,可以調用GetChangeOrderInfo接口查看變更流程詳情,獲取金絲雀發布應用的變更狀態。具體API參數詳情,請參見GetChangeOrderInfo。
調用GetChangeOrderInfo接口查看變更流程詳情,返回的執行結果如下:
{
"Message": "success",
"RequestId": "10DA427D-AF74-4ECE-BB0A-EECC0EBF7548",
"Code": 200,
"changeOrderInfo": {
"Status": 2,
"Desc": "金絲雀發布(***)",
"PipelineInfoList": {
"PipelineInfo": [
{
......
//此處未羅列全部執行結果,僅供參考。
請查看上述執行結果中的changeOrderInfo.Status參數值,通過該值判斷金絲雀發布應用的變更是否成功。changeOrderInfo.Status的取值如下:
0:準備
1:執行中
2:執行成功
3:執行失敗
6:終止
8:手動分批發布模式下,等待手工確認執行下一批。
9:自動分批發布模式下,等待下一批執行中。
10:系統異常執行失敗