All Products
Search
Document Center

Container Service for Kubernetes:Manage clusters

Last Updated:Aug 07, 2023

This topic provides examples on how to perform basic cluster operations, including how to create, scale out, and delete a cluster and how to query the status and nodes of a cluster.

Note

You must install Container Service for Kubernetes (ACK) SDK before you can use it to manage clusters. For more information, see Install ACK SDK.

Sample code

// This file is auto-generated, don't edit it. Thanks.
package aliyun.com.alibabacloud.CS20151215;
import com.aliyun.tea.*;
public class Client {
    /**
     * Use your AccessKey ID and AccessKey secret to initialize the client.
     * @param accessKeyId
     * @param accessKeySecret
     * @param regionId
     * @param endpoint
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.cs20151215.Client createClient(String accessKeyId, String accessKeySecret, String regionId) throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();      
        config.accessKeyId = accessKeyId;
        config.accessKeySecret = accessKeySecret;
        config.regionId = regionId;
        return new com.aliyun.cs20151215.Client(config);
    }
    /**
     * Create an ACK cluster.
     * @param client
     * @return CreateClusterResponse
     * @throws Exception
     */
    public static com.aliyun.cs20151215.models.CreateClusterResponse createCluster(com.aliyun.cs20151215.Client client) throws Exception {
        com.aliyun.cs20151215.models.CreateClusterRequest createClusterRequest = new com.aliyun.cs20151215.models.CreateClusterRequest()
                .setName("my-test-Kubernetes-cluster")
                .setTimeoutMins((long)60)
                .setClusterType("ManagedKubernetes")
                .setRegionId("cn-beijing")
                .setVpcid("vpc-2zegvl5etah5requ0****")
                .setContainerCidr("172.20.0.0/16")
                .setServiceCidr("172.21.0.0/20")
                .setLoginPassword("Test_1234")
                .setWorkerInstanceChargeType("PostPaid")
                .setWorkerInstanceTypes(java.util.Arrays.asList(
            "ecs.sn2.3xlarge"
        ))
                .setWorkerVswitchIds(java.util.Arrays.asList(
            "vsw-2ze48rkq464rsdts****"
        ))
                .setWorkerSystemDiskCategory("cloud_efficiency")
                .setWorkerSystemDiskSize(120)
                .setNumOfNodes(3)
                .setOsType("Linux");
        return client.createCluster(createClusterRequest);
    }
    /**
     * Query the status of an ACK cluster.
     * @param client
     * @param clusterId
     * @return DescribeClusterDetailResponse
     * @throws Exception
     */
    public static com.aliyun.cs20151215.models.DescribeClusterDetailResponse describeClusterDetail(com.aliyun.cs20151215.Client client, String clusterId) throws Exception {
        return client.describeClusterDetail(clusterId);
    }
    /**
     * Scale out an ACK cluster.
     * @param client
     * @param clusterId
     * @return ScaleOutClusterResponse
     * @throws Exception
     */
    public static com.aliyun.cs20151215.models.ScaleOutClusterResponse scaleOutCluster(com.aliyun.cs20151215.Client client, String clusterId) throws Exception {
        com.aliyun.cs20151215.models.ScaleOutClusterRequest scaleOutClusterRequest = new com.aliyun.cs20151215.models.ScaleOutClusterRequest()
                .setLoginPassword("Test_1234")
                .setVswitchIds(java.util.Arrays.asList(
            "vsw-uf684tfrpwup8gcsw****"
        ))
                .setWorkerInstanceTypes(java.util.Arrays.asList(
            "ecs.c5.xlarge"
        ))
                .setWorkerSystemDiskCategory("cloud_efficiency")
                .setWorkerSystemDiskSize(120L)
                .setCount(3L);
        return client.scaleOutCluster(clusterId, scaleOutClusterRequest);
    }
    /**
     * Query the nodes in an ACK cluster.
     * @param client
     * @param clusterId
     * @return DescribeClusterNodesResponse
     * @throws Exception
     */
    public static com.aliyun.cs20151215.models.DescribeClusterNodesResponse describeClusterNodes(com.aliyun.cs20151215.Client client, String clusterId) throws Exception {
        com.aliyun.cs20151215.models.DescribeClusterNodesRequest describeClusterNodesRequest = new com.aliyun.cs20151215.models.DescribeClusterNodesRequest()
                .setPageSize("18")
                .setPageNumber("1")
                .setNodepoolId("nodepool_id")
                .setState("running");
        return client.describeClusterNodes(clusterId, describeClusterNodesRequest);
    }
    /**
     * Delete an ACK cluster.
     * @param client
     * @param clusterId
     * @return DescribeClusterDetailResponse
     * @throws Exception
     */
    public static com.aliyun.cs20151215.models.DeleteClusterResponse deleteCluster(com.aliyun.cs20151215.Client client, String clusterId) throws Exception {
        com.aliyun.cs20151215.models.DeleteClusterRequest deleteClusterRequest = new com.aliyun.cs20151215.models.DeleteClusterRequest()
                .setRetainResources(java.util.Arrays.asList(
            "sg-2ze6ess9kho6fdn9****"
        ));
        return client.deleteCluster(clusterId, deleteClusterRequest);
    }
    public static void main(String[] args) throws Exception {
        // 1. Initialize the client.
        // Make sure that the following environment variables are specified: ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, and ALIBABA_CLOUD_REGION_ID. 
        // If the project code is leaked, the AccessKey pair may be disclosed and security issues may occur in all resources that belong to your Alibaba Cloud account. The following sample code shows how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call operations of the ACK API. The sample code is for reference only. We recommend that you use Security Token Service (STS). For more information, see Configure credentials. 
        com.aliyun.cs20151215.Client client = Client.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),System.getenv("ALIBABA_CLOUD_REGION_ID"));
        // 2. Create an ACK cluster.
        com.aliyun.cs20151215.models.CreateClusterResponse createClusterRes = Client.createCluster(client);
        String clusterId = createClusterRes.body.clusterId;
        // 3. Query the status of an ACK cluster.
        com.aliyun.cs20151215.models.DescribeClusterDetailResponse describeClusterDetailRes = Client.describeClusterDetail(client, clusterId);
        // 4. Scale out an ACK cluster when it is in the running state.
        while (true) {
            if (com.aliyun.teautil.Common.equalString(describeClusterDetailRes.body.state, "initial")) {
                // If the cluster is in the initial state, it indicates that the cluster has not been created. Set the sleep mode to 3 minutes and try again after the cluster wakes.
                com.aliyun.teautil.Common.sleep(180000);
            } else if (com.aliyun.teautil.Common.equalString(describeClusterDetailRes.body.state, "running")) {
                // Scale out the cluster after it is created.
                com.aliyun.cs20151215.models.ScaleOutClusterResponse scaleClusterRes = Client.scaleOutCluster(client, clusterId);
                com.aliyun.teaconsole.Client.log(scaleClusterRes.body.requestId);
                break;
            } else {
                // Exit if the cluster is in other states.
                return ;
            }
        }
        // 5. Query the nodes in an ACK cluster.
        com.aliyun.cs20151215.models.DescribeClusterNodesResponse describeClusterNodesRes = Client.describeClusterNodes(client, clusterId);
        java.util.Map<String, String> describeClusterNodesResHeaders = describeClusterNodesRes.headers;
        com.aliyun.teaconsole.Client.log(describeClusterNodesResHeaders.get("x-acs-request-id"));
        // 6. Delete an ACK cluster.
        com.aliyun.cs20151215.models.DeleteClusterResponse deleteClusterRes = Client.deleteCluster(client, clusterId);
        java.util.Map<String, String> deleteCLusterResHeaders = deleteClusterRes.headers;
        com.aliyun.teaconsole.Client.log(deleteCLusterResHeaders.get("x-acs-request-id"));
    }
}
  
   
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import sys
from typing import List
from alibabacloud_cs20151215.client import Client as CSClient
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_cs20151215 import models as cs_models
from alibabacloud_tea_util.client import Client as UtilClient
from alibabacloud_tea_console.client import Client as ConsoleClient
class Client:
    def __init__(self):
        pass
    @staticmethod
    def create_client(
        access_key_id: str,
        access_key_secret: str,
        region_id: str,
    ) -> CSClient:
        """
        Use your AccessKey ID and AccessKey secret to initialize the client.
        @param access_key_id:
        @param access_key_secret:
        @param region_id:
        @param endpoint:
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config()
        config.access_key_id = access_key_id
        config.access_key_secret = access_key_secret
        config.region_id = region_id
        return CSClient(config)
    @staticmethod
    async def create_client_async(
        access_key_id: str,
        access_key_secret: str,
        region_id: str,
    ) -> CSClient:
        """
        Use your AccessKey ID and AccessKey secret to initialize the client.
        @param access_key_id:
        @param access_key_secret:
        @param region_id:
        @param endpoint:
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config()
        config.access_key_id = access_key_id
        config.access_key_secret = access_key_secret
        config.region_id = region_id
        return CSClient(config)
    @staticmethod
    def create_cluster(
        client: CSClient,
    ) -> cs_models.CreateClusterResponse:
        """
        Create an ACK cluster. 
        @param client:
        @return: CreateClusterResponse
        @throws Exception
        """
        create_cluster_request = cs_models.CreateClusterRequest(
            name='my-test-Kubernetes-cluster',
            timeout_mins=60,
            cluster_type='ManagedKubernetes',
            region_id='cn-beijing',
            vpcid='vpc-2zegvl5etah5requ0****',
            container_cidr='172.20.0.0/16',
            service_cidr='172.21.0.0/20',
            login_password='Test_1234',
            worker_instance_charge_type='PostPaid',
            worker_instance_types=[
                'ecs.sn2.3xlarge'
            ],
            worker_vswitch_ids=[
                'vsw-2ze48rkq464rsdts****'
            ],
            worker_system_disk_category='cloud_efficiency',
            worker_system_disk_size=120,
            num_of_nodes=3,
            os_type='Linux'
        )
        return client.create_cluster(create_cluster_request)
    @staticmethod
    async def create_cluster_async(
        client: CSClient,
    ) -> cs_models.CreateClusterResponse:
        """
        Create an ACK cluster.
        @param client:
        @return: CreateClusterResponse
        @throws Exception
        """
        create_cluster_request = cs_models.CreateClusterRequest(
            name='my-test-Kubernetes-cluster',
            timeout_mins=60,
            cluster_type='ManagedKubernetes',
            region_id='cn-beijing',
            vpcid='vpc-2zegvl5etah5requ0****',
            container_cidr='172.20.0.0/16',
            service_cidr='172.21.0.0/20',
            login_password='Test_1234',
            worker_instance_charge_type='PostPaid',
            worker_instance_types=[
                'ecs.sn2.3xlarge'
            ],
            worker_vswitch_ids=[
                'vsw-2ze48rkq464rsdts****'
            ],
            worker_system_disk_category='cloud_efficiency',
            worker_system_disk_size=120,
            num_of_nodes=3,
            os_type='Linux'
        )
        return await client.create_cluster_async(create_cluster_request)
    @staticmethod
    def describe_cluster_detail(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.DescribeClusterDetailResponse:
        """
        Query the status of an ACK cluster.
        @param client:
        @param cluster_id:
        @return: DescribeClusterDetailResponse
        @throws Exception
        """
        return client.describe_cluster_detail(cluster_id)
    @staticmethod
    async def describe_cluster_detail_async(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.DescribeClusterDetailResponse:
        """
        Query the status of an ACK cluster.
        @param client:
        @param cluster_id:
        @return: DescribeClusterDetailResponse
        @throws Exception
        """
        return await client.describe_cluster_detail_async(cluster_id)
    @staticmethod
    def scale_out_cluster(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.ScaleOutClusterResponse:
        """
        Scale out the cluster after it is created.
        @param client:
        @param cluster_id:
        @return: ScaleOutClusterResponse
        @throws Exception
        """
        scale_out_cluster_request = cs_models.ScaleOutClusterRequest(
            login_password='Test_1234',
            vswitch_ids=[
                'vsw-uf684tfrpwup8gcsw****'
            ],
            worker_instance_types=[
                'ecs.c5.xlarge'
            ],
            worker_system_disk_category='cloud_efficiency',
            worker_system_disk_size=120,
            count=3
        )
        return client.scale_out_cluster(cluster_id, scale_out_cluster_request)
    @staticmethod
    async def scale_out_cluster_async(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.ScaleOutClusterResponse:
        """
        Scale out the cluster after it is created.
        @param client:
        @param cluster_id:
        @return: ScaleOutClusterResponse
        @throws Exception
        """
        scale_out_cluster_request = cs_models.ScaleOutClusterRequest(
            login_password='Test_1234',
            vswitch_ids=[
                'vsw-uf684tfrpwup8gcsw****'
            ],
            worker_instance_types=[
                'ecs.c5.xlarge'
            ],
            worker_system_disk_category='cloud_efficiency',
            worker_system_disk_size=120,
            count=3
        )
        return await client.scale_out_cluster_async(cluster_id, scale_out_cluster_request)
    @staticmethod
    def describe_cluster_nodes(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.DescribeClusterNodesResponse:
        """
        Query the nodes in an ACK cluster.
        @param client:
        @param cluster_id:
        @return: DescribeClusterNodesResponse
        @throws Exception
        """
        describe_cluster_nodes_request = cs_models.DescribeClusterNodesRequest(
            page_size='18',
            page_number='1',
            nodepool_id='nodepool_id',
            state='running'
        )
        return client.describe_cluster_nodes(cluster_id, describe_cluster_nodes_request)
    @staticmethod
    async def describe_cluster_nodes_async(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.DescribeClusterNodesResponse:
        """
        Query the nodes in an ACK cluster.
        @param client:
        @param cluster_id:
        @return: DescribeClusterNodesResponse
        @throws Exception
        """
        describe_cluster_nodes_request = cs_models.DescribeClusterNodesRequest(
            page_size='18',
            page_number='1',
            nodepool_id='nodepool_id',
            state='running'
        )
        return await client.describe_cluster_nodes_async(cluster_id, describe_cluster_nodes_request)
    @staticmethod
    def delete_cluster(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.DeleteClusterResponse:
        """
        Delete an ACK cluster.
        @param client:
        @param cluster_id:
        @return: DescribeClusterDetailResponse
        @throws Exception
        """
        delete_cluster_request = cs_models.DeleteClusterRequest(
            retain_resources=[
                'sg-2ze6ess9kho6fdn9****'
            ]
        )
        return client.delete_cluster(cluster_id, delete_cluster_request)
    @staticmethod
    async def delete_cluster_async(
        client: CSClient,
        cluster_id: str,
    ) -> cs_models.DeleteClusterResponse:
        """
        Delete an ACK cluster.
        @param client:
        @param cluster_id:
        @return: DescribeClusterDetailResponse
        @throws Exception
        """
        delete_cluster_request = cs_models.DeleteClusterRequest(
            retain_resources=[
                'sg-2ze6ess9kho6fdn9****'
            ]
        )
        return await client.delete_cluster_async(cluster_id, delete_cluster_request)
    @staticmethod
    def main(
        args: List[str],
    ) -> None:
        # 1. Initialize the client.
        # Make sure that the following environment variables are specified: ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET. 
        # If the project code is leaked, the AccessKey pair may be disclosed and security issues may occur in all resources that belong to your Alibaba Cloud account. The following sample code shows how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call operations of the ACK API. The sample code is for reference only. We recommend that you use STS. For more information, see Configure credentials. 
        client = Client.create_client(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], os.environ['ALIBABA_CLOUD_REGION_ID'])
        # 2. Create an ACK cluster.
        create_cluster_res = Client.create_cluster(client)
        cluster_id = create_cluster_res.body.cluster_id
        # 3. Query the status of an ACK cluster.
        describe_cluster_detail_res = Client.describe_cluster_detail(client, cluster_id)
        # 4. Scale out an ACK cluster when it is in the running state.
        while True:
            if UtilClient.equal_string(describe_cluster_detail_res.body.state, 'initial'):
                # If the cluster is in the initial state, it indicates that the cluster has not been created. Set the sleep mode to 3 minutes and try again after the cluster wakes.
                UtilClient.sleep(180000)
            elif UtilClient.equal_string(describe_cluster_detail_res.body.state, 'running'):
                # Scale out the ACK cluster after it is created.
                scale_cluster_res = Client.scale_out_cluster(client, cluster_id)
                ConsoleClient.log(scale_cluster_res.body.request_id)
                break
            else:
                # Exit if the ACK cluster is in other states.
                return
        # 5. Query the nodes in an ACK cluster.
        describe_cluster_nodes_res = Client.describe_cluster_nodes(client, cluster_id)
        describe_cluster_nodes_res_headers = describe_cluster_nodes_res.headers
        ConsoleClient.log(describe_cluster_nodes_res_headers.get('x-acs-request-id'))
        # 6. Delete an ACK cluster.
        delete_cluster_res = Client.delete_cluster(client, cluster_id)
        delete_cluster_res_headers = delete_cluster_res.headers
        ConsoleClient.log(delete_cluster_res_headers.get('x-acs-request-id'))
    @staticmethod
    async def main_async(
        args: List[str],
    ) -> None:
        # 1. Initialize the client.
        # Make sure that the following environment variables are specified: ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET. 
        # If the project code is leaked, the AccessKey pair may be disclosed and security issues may occur in all resources that belong to your Alibaba Cloud account. The following sample code shows how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call operations of the ACK API. The sample code is for reference only. We recommend that you use STS. For more information, see Configure credentials. 
        client = await Client.create_client_async(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], os.environ['ALIBABA_CLOUD_REGION_ID'])
        # 2. Create an ACK cluster.
        create_cluster_res = await Client.create_cluster_async(client)
        cluster_id = create_cluster_res.body.cluster_id
        # 3. Query the status of an ACK cluster.
        describe_cluster_detail_res = await Client.describe_cluster_detail_async(client, cluster_id)
        # 4. Scale out an ACK cluster when it is in the running state.
        while True:
            if UtilClient.equal_string(describe_cluster_detail_res.body.state, 'initial'):
                # If the cluster is in the initial state, it indicates that the cluster has not been created. Set the sleep mode to 3 minutes and try again after the cluster wakes.
                await UtilClient.sleep_async(180000)
            elif UtilClient.equal_string(describe_cluster_detail_res.body.state, 'running'):
                # Scale out the ACK cluster after it is created.
                scale_cluster_res = await Client.scale_out_cluster_async(client, cluster_id)
                ConsoleClient.log(scale_cluster_res.body.request_id)
                break
            else:
                # Exit if the ACK cluster is in other states.
                return
        # 5. Query the nodes in an ACK cluster.
        describe_cluster_nodes_res = await Client.describe_cluster_nodes_async(client, cluster_id)
        describe_cluster_nodes_res_headers = describe_cluster_nodes_res.headers
        ConsoleClient.log(describe_cluster_nodes_res_headers.get('x-acs-request-id'))
        # 6. Delete an ACK cluster.
        delete_cluster_res = await Client.delete_cluster_async(client, cluster_id)
        delete_cluster_res_headers = delete_cluster_res.headers
        ConsoleClient.log(delete_cluster_res_headers.get('x-acs-request-id'))
if __name__ == '__main__':
    Client.main(sys.argv[1:])
// This file is auto-generated, don't edit it. Thanks.
package main
import (
  "os"
  cs  "github.com/alibabacloud-go/cs-20151215/v2/client"
  openapi  "github.com/alibabacloud-go/darabonba-openapi/client"
  util  "github.com/alibabacloud-go/tea-utils/service"
  console  "github.com/alibabacloud-go/tea-console/client"
  "github.com/alibabacloud-go/tea/tea"
)
/**
 * Initialize the client by using your AccessKey ID and AccessKey secret. 
 * @param accessKeyId
 * @param accessKeySecret
 * @param regionId
 * @param endpoint
 * @return Client
 * @throws Exception
 */
func CreateClient (accessKeyId *string, accessKeySecret *string, regionId *string) (_result *cs.Client, _err error) {
  config := &openapi.Config{}
  config.AccessKeyId = accessKeyId
  config.AccessKeySecret = accessKeySecret
  config.RegionId = regionId
  _result = &cs.Client{}
  _result, _err = cs.NewClient(config)
  return _result, _err
}
/**
 * Create an ACK cluster. 
 * @param client
 * @return CreateClusterResponse
 * @throws Exception
 */
func CreateCluster (client *cs.Client) (_result *cs.CreateClusterResponse, _err error) {
  createClusterRequest := &cs.CreateClusterRequest{
    // The name of the cluster. 
    Name: tea.String("my-test-Kubernetes-cluster"),
    // The timeout period for the system to create the ACK cluster. 
    TimeoutMins: tea.Int64(60),
    // The cluster type. In this example, the value is set to ManagedKubernetes. 
    ClusterType: tea.String("ManagedKubernetes"),
    // The region. 
    RegionId: tea.String("cn-beijing"),
    // The ID of the virtual private cloud (VPC) where the cluster resides. 
    Vpcid: tea.String("vpc-2zegvl5etah5requ0****"),
    // The pod CIDR block. 
    ContainerCidr: tea.String("172.20.0.0/16"),
    // The Service CIDR block. 
    ServiceCidr: tea.String("172.21.0.0/20"),
    // The SSH password of worker nodes. You can select SSH authentication or key pair authentication. 
    LoginPassword: tea.String("Test_1234"),
    // The billing method of worker nodes. Valid values: PrePaid and PostPaid. 
    WorkerInstanceChargeType: tea.String("PostPaid"),
    // The instance types of worker nodes. You can specify multiple instance types. 
    WorkerInstanceTypes: []*string{tea.String("ecs.sn2.3xlarge")},
    // The IDs of one or more vSwitches. You can specify one to five vSwitches. 
    WorkerVswitchIds: []*string{tea.String("vsw-2ze48rkq464rsdts****")},
    // The type of the system disk mounted to worker nodes. 
    WorkerSystemDiskCategory: tea.String("cloud_efficiency"),
    // The size of the system disk mounted to worker nodes. 
    WorkerSystemDiskSize: tea.Int64(120),
    // The number of worker nodes. 
    NumOfNodes: tea.Int64(3),
    // The operating system of the nodes that run pods. You can specify the Linux or Windows operating system. 
    OsType: tea.String("Linux"),
  }
  _result = &cs.CreateClusterResponse{}
  _body, _err := client.CreateCluster(createClusterRequest)
  if _err != nil {
    return _result, _err
  }
  _result = _body
  return _result, _err
}
/**
 * Query the status of an ACK cluster.
 * @param client
 * @param clusterId
 * @return DescribeClusterDetailResponse
 * @throws Exception
 */
func DescribeClusterDetail (client *cs.Client, clusterId *string) (_result *cs.DescribeClusterDetailResponse, _err error) {
  _result = &cs.DescribeClusterDetailResponse{}
  _body, _err := client.DescribeClusterDetail(clusterId)
  if _err != nil {
    return _result, _err
  }
  _result = _body
  return _result, _err
}
/**
 * Scale out an ACK cluster.
 * @param client
 * @param clusterId
 * @return ScaleOutClusterResponse
 * @throws Exception
 */
func ScaleOutCluster (client *cs.Client, clusterId *string) (_result *cs.ScaleOutClusterResponse, _err error) {
  scaleOutClusterRequest := &cs.ScaleOutClusterRequest{
    // The name of the key pair that is used to log on to worker nodes. You can select SSH authentication or key pair authentication.
    LoginPassword: tea.String("Test_1234"),
    // The IDs of one or more vSwitches. You can specify one to three vSwitches.
    VswitchIds: []*string{tea.String("vsw-uf684tfrpwup8gcsw****")},
    // The instance types of worker nodes. You can specify multiple instance types.
    WorkerInstanceTypes: []*string{tea.String("ecs.c5.xlarge")},
    // The size of the system disk mounted to worker nodes.
    WorkerSystemDiskCategory: tea.String("cloud_efficiency"),
    // The size of the system disk mounted to worker nodes.
    WorkerSystemDiskSize: tea.Int64(120),
    // The number of nodes to be added to the ACK cluster.
    Count: tea.Int64(3),
  }
  _result = &cs.ScaleOutClusterResponse{}
  _body, _err := client.ScaleOutCluster(clusterId, scaleOutClusterRequest)
  if _err != nil {
    return _result, _err
  }
  _result = _body
  return _result, _err
}
/**
 * Query the nodes in an ACK cluster.
 * @param client
 * @param clusterId
 * @return DescribeClusterNodesResponse
 * @throws Exception
 */
func DescribeClusterNodes (client *cs.Client, clusterId *string) (_result *cs.DescribeClusterNodesResponse, _err error) {
  describeClusterNodesRequest := &cs.DescribeClusterNodesRequest{
    // The number of entries to return on each page. This parameter is optional.
    PageSize: tea.String("18"),
    // The number of the page to return. This parameter is optional.
    PageNumber: tea.String("1"),
    // The node pool ID. This parameter is optional.
    NodepoolId: tea.String("nodepool_id"),
    // The status of the node pool. 
    State: tea.String("running"),
  }
  _result = &cs.DescribeClusterNodesResponse{}
  _body, _err := client.DescribeClusterNodes(clusterId, describeClusterNodesRequest)
  if _err != nil {
    return _result, _err
  }
  _result = _body
  return _result, _err
}
/**
 * Delete an ACK cluster.
 * @param client
 * @param clusterId
 * @return DescribeClusterDetailResponse
 * @throws Exception
 */
func DeleteCluster (client *cs.Client, clusterId *string) (_result *cs.DeleteClusterResponse, _err error) {
  deleteClusterRequest := &cs.DeleteClusterRequest{
    // The resources that are retained after an ACK cluster is deleted. This parameter is optional.
    RetainResources: []*string{tea.String("sg-2ze6ess9kho6fdn9****")},
  }
  _result = &cs.DeleteClusterResponse{}
  _body, _err := client.DeleteCluster(clusterId, deleteClusterRequest)
  if _err != nil {
    return _result, _err
  }
  _result = _body
  return _result, _err
}
func _main (args []*string) (_err error) {
  // 1. Initialize the client.
  // Make sure that the following environment variables are specified: ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET. 
  // If the project code is leaked, the AccessKey pair may be disclosed and security issues may occur in all resources that belong to your Alibaba Cloud account. The following sample code shows how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call operations of the ACK API. The sample code is for reference only. We recommend that you use STS. For more information, see Configure credentials. 
  client, _err := CreateClient(tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),tea.String(os.Getenv("ALIBABA_CLOUD_REGION_ID")))
  if _err != nil {
    return _err
  }
  // 2. Create an ACK cluster.
  createClusterRes, _err := CreateCluster(client)
  if _err != nil {
    return _err
  }
  clusterId := createClusterRes.Body.ClusterId
  // 3. Query the status of an ACK cluster.
  describeClusterDetailRes, _err := DescribeClusterDetail(client, clusterId)
  if _err != nil {
    return _err
  }
  // 4. Scale out an ACK cluster when it is in the running state.
  for true {
    if tea.BoolValue(util.EqualString(describeClusterDetailRes.Body.State, tea.String("initial"))) {
      // If the cluster is in the initial state, it indicates that the cluster has not been created. Set the sleep mode to 3 minutes and try again after the cluster wakes.
      _err = util.Sleep(tea.Int(180000))
      if _err != nil {
        return _err
      }
    } else if tea.BoolValue(util.EqualString(describeClusterDetailRes.Body.State, tea.String("running"))) {
      // Scale out the cluster after it is created.
      scaleClusterRes, _err := ScaleOutCluster(client, clusterId)
      if _err != nil {
        return _err
      }
      console.Log(scaleClusterRes.Body.RequestId)
      break
    } else {
      // Exit if the cluster is in other states.
      return _err
    }
  }
  // 5. Query the nodes in an ACK cluster.
  describeClusterNodesRes, _err := DescribeClusterNodes(client, clusterId)
  if _err != nil {
    return _err
  }
  describeClusterNodesResHeaders := describeClusterNodesRes.Headers
  console.Log(describeClusterNodesResHeaders["x-acs-request-id"])
  // 6. Delete an ACK cluster.
  deleteClusterRes, _err := DeleteCluster(client, clusterId)
  if _err != nil {
    return _err
  }
  deleteCLusterResHeaders := deleteClusterRes.Headers
  console.Log(deleteCLusterResHeaders["x-acs-request-id"])
  return _err
}
func main() {
  err := _main(tea.StringSlice(os.Args))
  if err != nil {
    panic(err)
  }
}
static async main(args: string[]): Promise<void> {
    // 1. Initialize the client.
    // Make sure that the following environment variables are specified: ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET. 
    // If the project code is leaked, the AccessKey pair may be disclosed and security issues may occur in all resources that belong to your Alibaba Cloud account. The following sample code shows how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call operations of the ACK API. The sample code is for reference only. We recommend that you use STS. For more information, see Configure credentials. 
    let client = await Client.createClient(process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], process.env['ALIBABA_CLOUD_REGION_ID']);
    // 2. Create an ACK cluster.
    let createClusterRes = await Client.createCluster(client);
    let clusterId = createClusterRes.body.clusterId;

    // 3. Query the status of an ACK cluster.
    let describeClusterDetailRes = await Client.describeClusterDetail(client, clusterId!);
    // 4. Scale out an ACK cluster when it is in the running state.
    while (true) {
      if (Util.equalString(describeClusterDetailRes.body.state, "initial")) {
        // If the cluster is in the initial state, it indicates that the cluster has not been created. Set the sleep mode to 3 minutes and try again after the cluster wakes.
        await Util.sleep(180000);
      } else if (Util.equalString(describeClusterDetailRes.body.state, "running")) {
        // Scale out the cluster after it is created.
        let scaleClusterRes = await Client.scaleOutCluster(client, clusterId!);
        Console.log(scaleClusterRes.body.requestId);
        break;
      } else {
        // Exit if the cluster is in other states.
        return ;
      }
    }
    // 5. Query the nodes in an ACK cluster.
    let describeClusterNodesRes = await Client.describeClusterNodes(client, clusterId!);
    let describeClusterNodesResHeaders = describeClusterNodesRes.headers;
    Console.log(describeClusterNodesResHeaders["x-acs-request-id"]);
    // 6. Delete an ACK cluster.
    let deleteClusterRes = await Client.deleteCluster(client, clusterId!);
    let deleteCLusterResHeaders = deleteClusterRes.headers;
    Console.log(deleteCLusterResHeaders["x-acs-request-id"]);
  }