使用API在K8s集群中单批发布应用

本文介绍如何使用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

使用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****");
        // 应用实例数。
        request.setReplicas(2);
        // 应用运行过程中,应用实例的CPU限额、内存限额等,0表示不限制。
        request.setCpuLimit(0);
        request.setMemoryLimit(0);
        request.setCpuRequest(0);
        request.setMemoryRequest(0);
        // JAR包或者WAR包地址、版本。
        request.setPackageUrl("https://doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.2-SNAPSHOT.jar");
        request.setPackageVersion("20210227");
        // 部署包依赖的JDK版本。可选的参数值为Open JDK 7和Open JDK 8。
        request.setJDK("Open JDK 8");
        // 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=1c18b409-07ac-4a37-990b-66bd87d7****
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");
        // 要执行API调用的应用所在地域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("c44227c7-fc5e-46ca-80ac-8f342d45****");
        // 应用实例数。
        request.setReplicas(2);
        // 镜像地址。
        request.setImage("registry-vpc.cn-hangzhou.aliyuncs.com/image-demo-project/provider:2.0");
        // 应用运行过程中,应用实例的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=1c18b409-07ac-4a37-990b-66bd87d7****
Message=success

结果验证

您在单批发布应用后,可以调用GetChangeOrderInfo接口查看应用变更流程详情,获取单批发布应用的变更状态。具体API参数详情,请参见GetChangeOrderInfo

调用GetChangeOrderInfo接口查看应用变更流程详情,返回的执行结果如下:

  • 使用JAR包或WAR包单批发布应用的变更单详情。

    {
        "Message": "success",
        "RequestId": "A9DD1E44-DB9E-46D8-9A32-1D45C847E564",
        "Code": 200,
        "changeOrderInfo": {
            "Status": 2,
            "Desc": "单批发布(JAR包)",
            "PipelineInfoList": {
                "PipelineInfo": [
                    {
                        ......
                        "TaskMessage": "Apply success. <br>application is ready at desired state, version: 22"
                        ......
                        // 此处未罗列全部执行结果,仅供参考。
  • 使用镜像单批发布应用的变更单详情。

    {
        "Message": "success",
        "RequestId": "8DEDB234-979D-40AA-A508-187279B1C0D1",
        "Code": 200,
        "changeOrderInfo": {
            "Status": 1,
            "Desc": "单批发布(镜像)",
            "PipelineInfoList": {
                "PipelineInfo": [
                    {
                        ......
                        "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参数的值分析错误原因,解决问题后重新单批发布应用。