使用API管理K8s集群

本文介绍如何使用EDAS提供的Java SDK调用API导入和取消导入K8s集群。

前提条件

在导入或取消导入K8s集群前,您必须提前完成以下准备工作:

  • 安装EDAS的Java SDK。更多信息,请参见Java SDK接入指南
  • 确定导入或取消导入K8s集群的地域,假设为cn-hangzhou

  • 容器服务Kubernetes版控制台创建集群。具体操作,请参见:

    如果已经创建容器服务K8s集群或Serverless K8s集群,请调用GetK8sCluster接口查询容器服务K8s集群或Serverless K8s集群列表,获取目标集群的ClusterId,假设为da60f685-558a-4e00-b549-15e9143d****

  • 创建微服务空间。具体操作,请参见创建命名空间

    如果已经存在命名空间,您可以调用ListUserDefineRegion接口查询用户自定义命名空间列表,获取目标命名空间的RegionId

Kubernetes集群功能简介

现EDAS支持导入在容器服务Kubernetes版控制台创建的专有版Kubernetes集群、托管版Kubernetes集群和Serverless Kubernetes集群,3种集群形态的对比详情,请参见什么是容器服务 Kubernetes 版

专有版Kubernetes集群和托管版Kubernetes集群导入到EDAS中对应的是容器服务K8s集群,Serverless Kubernetes集群导入到EDAS中对应的是Serverless K8s集群。

混合云集群(其他云域或IDC内自建的集群)需要先将这些集群注册到容器服务Kubernetes版控制台,然后将集群导入EDAS。混合云集群导入到EDAS对应的是容器服务K8s集群。

混合云集群注册到容器服务Kubernetes版的具体操作,请参见通过控制台创建注册集群

在EDAS中管理的K8s集群相对自建K8s集群来说有以下功能优势:

  • 在云原生Kubernetes之上,提供应用托管能力,以应用视角一站式完成开源微服务治理和K8s应用轻量化运维:

    • 应用为中心的视角,管理K8s的原生工作负载如Deployment、Pod等,提供多AZ实例打散的高可用部署。

    • 提供分批发布、按流量比例、请求参数的金丝雀灰度发布,借助EDAS全维度监控的发布变更单,让您的变更记录可跟踪。

    • EDAS对接了主流DevOps系统,助力企业CI/CD落地,降本增效。

  • 在开源微服务体系之上,对于使用市面上近五年的Spring Cloud和Dubbo框架自建的微服务应用无需修改任何代码即可迁移至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.ImportK8sClusterRequest;
import com.aliyuncs.edas.model.v20170801.ImportK8sClusterResponse;

public class ImportK8sCluster {

    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");
        //导入K8s集群的所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        ImportK8sClusterRequest request = new ImportK8sClusterRequest();
        //指定K8s集群的集群ID。
        request.setClusterId("da60f685-558a-4e00-b549-15e9143d****");
        //指定K8s集群导入到的目标微服务空间。
        request.setNamespaceId("cn-hangzhou:doc");
        //是否安装服务网格,true表示安装,false表示不安装。
        request.setEnableAsm(true);


        try {
            ImportK8sClusterResponse response = client.getAcsResponse(request);
            System.out.println("Data=" + response.getData() + "\nMessage=" + response.getMessage()+ "\nRequestId=" + response.getRequestId());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下:

Data=4d45f6db-2942-4747-a7ba-b0d43273****
Message=success
RequestId=847CF607-B352-4A71-828A-C0F8DECDEDF6

取消导入集群

以下代码用于取消导入集群。

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.DeleteClusterRequest;
import com.aliyuncs.edas.model.v20170801.DeleteClusterResponse;

public class DeleteCluster {

    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");
        //取消导入K8s集群的所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        DeleteClusterRequest request = new DeleteClusterRequest();
        //需要取消导入集群的集群ID。
        request.setClusterId("da60f685-558a-4e00-b549-15e9143d****");


        try {
            DeleteClusterResponse response = client.getAcsResponse(request);
            System.out.println("Data=" + response.getData() + "\nMessage=" + response.getMessage()+ "\nRequestId=" + response.getRequestId());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下:

Data=true
Message=success
RequestId=68CDDEC0-593E-4C1A-9CDC-96F9FEF0924E

结果验证

在导入或者取消导入K8s集群的操作后,您可以调用GetK8sCluster接口获取容器服务K8s集群或Serverless K8s集群列表,根据返回结果中的集群导入状态(ClusterImportStatus)参数值判断您是否操作成功。

调用GetK8sCluster接口返回的结果如下:

{
  "RequestId": "809FCC08-FFE1-417D-8ADF-F5D5BFD968D7",
  "Message": "success",
  "ClusterPage": {
    "ClusterList": {
      "Cluster": [
        {
          "ClusterImportStatus": 1,
          "NodeNum": 6,
          "ClusterId": "da60f685-558a-4e00-b549-15e9143d****",
          ......
        },
        {
          "ClusterImportStatus": 0,
          "NodeNum": 3,
          "ClusterId": "6dca9bc0-b928-4f2c-ae76-396bd108****",
          ......
        }
      ]
    },
    "PageSize": 12,
    "CurrentPage": 0,
    "TotalSize": 12
  },
  "Code": 200
}

请查看上述执行结果中的集群导入状态ClusterImportStatus参数值,通过该值判断导入或取消导入K8s集群是否成功。ClusterImportStatus的取值如下:

  • 0:没有导入

  • 1:导入成功

  • 2:导入失败

  • 3:正在导入

  • 4:集群已删除