本文介绍如何使用EDAS提供的Java SDK调用API在K8s集群中回滚应用到目标历史版本。
前提条件
回滚应用到目标历史版本前,您必须提前完成以下准备工作:
- 安装EDAS的Java SDK。更多信息,请参见Java SDK接入指南。
- 确定应用部署地域,假设为cn-hangzhou。
您的应用已经升级版本。目前支持多种升级应用的方式,请根据实际需求选择:
调用ListHistoryDeployVersion接口查询应用历史版本列表,获取目标历史版本的PackageVersion.Id,假设为e4aeb2972cde64d5ff0618966102****。
背景信息
您可以调用DeployK8sApplication接口,部署应用的历史版本,即可实现回滚应用到历史版本。本文仅提供简单示例代码实现部署应用的历史版本,如您需要了解更多部署应用的信息,请参见DeployK8sApplication。
回滚到目标历史版本
以下代码适用于在EDAS K8s集群中回滚应用到目标历史版本。
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****");
//通过ListHistoryDeployVersion接口查询到的目标历史版本的PackageVersion.Id。
request.setPackageVersionId("e4aeb2972cde64d5ff0618966102****");
//应用实例数。
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=1b0bec74-7ec3-43f7-b9c8-f8e746d2****
Message=success
结果验证
您在回滚应用到目标历史版本后,可以调用GetChangeOrderInfo接口查看变更流程详情,获取回滚应用的变更状态。具体API参数详情,请参见GetChangeOrderInfo。
调用GetChangeOrderInfo接口查看变更流程详情,返回的执行结果如下:
{
"Message": "success",
"RequestId": "3E9C6941-3945-4D43-9CBE-12CAB45569AA",
"Code": 200,
"changeOrderInfo": {
"Status": 2,
"Desc": "回滚到目标历史版本",
"PipelineInfoList": {
"PipelineInfo": [
{
"PipelineStatus": 2,
"PipelineName": "Batch 1 Change",
......
"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参数的值分析错误原因,解决问题后重新回滚应用到目标版本。