本文介绍如何使用EDAS提供的Java SDK调用API在K8s集群中分批发布应用(JAR包、WAR包和镜像)。
准备工作
调用API分批发布应用之前,您必须提前完成以下准备工作:
在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分批发布应用时,推荐选用自动分批发布方式。如果您选用手动分批发布方式,则还需要调用ContinuePipeline接口手动确认执行下一批发布。具体操作,请参见手动确认下一批发布。
此处提供两种示例分批发布策略,请根据你的实际场景选择并修改策略。
Pod实例分2批发布+手动分批。
{"type":"BatchUpdate","batchUpdate":{"batch":2,"releaseType":"manual"}}
Pod实例分2批发布+自动分批+分批间隔2分钟。
{"type":"BatchUpdate","batchUpdate":{"batch":2,"releaseType":"auto","batchWaitTime":2}}
使用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 14:01:12");
//部署包依赖的JDK版本。可选的参数值为Open JDK 7和Open JDK 8。
request.setJDK("Open JDK 8");
//自定义分批发布策略。此处示例值代表“Pod实例分2批发布+自动分批+分批间隔2分钟”。
request.setUpdateStrategy("{\"type\":\"BatchUpdate\",\"batchUpdate\":{\"batch\":2,\"releaseType\":\"auto\",\"batchWaitTime\":2}}");
//应用实例数。
request.setReplicas(3);
//应用运行过程中,应用实例的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=e16bdf30-00c9-4b12-87b5-0ad35f3f****
Message=success
使用镜像分批发布应用
以下代码适用于在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/edas-demo-project/provider:2.0");
//自定义分批发布策略。此处示例值代表“Pod实例分2批发布+手动分批”,您可以根据需要修改为自动分批策略。
request.setUpdateStrategy("{"type":"BatchUpdate","batchUpdate":{"batch":2,"releaseType":"manual"}}");
//应用实例数。
request.setReplicas(3);
//应用运行过程中,应用实例的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=7ed96c93-cbd5-4614-a304-861ede6c****
Message=success
结果验证
您在分批发布应用后,可以调用GetChangeOrderInfo接口查看变更流程详情,获取分批发布应用的变更状态。具体API参数详情,请参见GetChangeOrderInfo。
调用GetChangeOrderInfo接口查看变更流程详情,返回的执行结果如下:
使用JAR包或WAR包分批发布应用的变更流程详情。
{ "Message": "success", "RequestId": "DA4E96FA-4C75-486A-A4F4-30F62C9EA53C", "Code": 200, "changeOrderInfo": { "Status": 2, "Desc": "分批发布(JAR包)", "PipelineInfoList": { "PipelineInfo": [ { ...... "TaskMessage": "Apply success. <br>application is ready at desired state, version: 22" ...... //此处未罗列全部执行结果,仅供参考。
使用镜像分批发布应用的变更流程详情。
{ "Message": "success", "RequestId": "FE1722D2-4B81-467C-9828-EFFBA3B3F565", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "分批发布(镜像)", "PipelineInfoList": { "PipelineInfo": [ { ...... "PipelineId": "4ff02b63-e14d-4124-86ff-22239f80****" ...... "PipelineId": "6dbbfff8-bcf7-4300-aa59-ccb06909****" ....... "TaskMessage": "Apply success. <br>application is ready at desired state, version: 22" ...... //此处未罗列全部执行结果,仅供参考。
请查看上述执行结果中的changeOrderInfo.Status参数值,通过该值判断分批发布应用的变更是否成功。changeOrderInfo.Status的取值如下:
0:准备
1:执行中
2:执行成功
3:执行失败
6:终止
8:手动分批发布模式下,等待手工确认执行下一批。
9:自动分批发布模式下,等待下一批执行中。
10:系统异常执行失败
如果返回结果中的changeOrderInfo.Status值为3,即表示分批发布应用失败。您可以根据返回结果中的TaskMessage参数的值分析错误原因,解决问题后重新分批发布应用。
手动确认下一批发布
如果您使用的是手动确认分批发布方式,则需要调用ContinuePipeline接口进行手动确认下一批发布。
调用GetChangeOrderInfo接口,获取分批发布应用变更的相关批次的流程ID(PipelineId)。
调用GetChangeOrderInfo接口,返回结果如下:
{ "Message": "success", "RequestId": "FE1722D2-4B81-467C-9828-EFFBA3B3F565", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "分批发布(镜像)", "PipelineInfoList": { "PipelineInfo": [ { ...... "PipelineId": "4ff02b63-e14d-4124-86ff-22239f80****" ...... "PipelineId": "6dbbfff8-bcf7-4300-aa59-ccb06909****" ....... "TaskMessage": "Apply success. <br>application is ready at desired state, version: 22" ...... //此处未罗列全部执行结果,仅供参考。
说明本示例使用的是Pod实例分2批发布+手动确认的分批发布场景,在调用GetChangeOrderInfo接口返回结果中会出现2个流程ID(PipelineId),第二次出现的流程ID(PipelineId)代表需要手动确认发布的批次。
按此规律,如果是Pod实例分3批发布+手动确认的分批发布场景,则会出现3个流程ID(PipelineId),第二次和第三次出现的流程ID(PipelineId)代表需要手动确认发布的批次。
调用ContinuePipeline接口,手动确认下一批发布。
返回结果如下:
{ "Message": "success", "RequestId": "B8ECF6F7-672D-40E9-91DD-1C33F06D4FD8", "Code": 200 }
说明本示例使用的是Pod实例分2批发布+手动确认的分批发布场景,只需要手动确认一批。如果您是需要手动确认多批的场景,请选择正确批次的流程ID(PipelineId)并重复执行此步骤。
重复执行此步骤时,请等待批次内部署间隔时长,默认10秒。