ACK集群接入ACS算力

容器计算服务 ACS(Container Compute Service)已经集成到容器服务 Kubernetes 版,您可以通过ACK集群Pro版快速使用ACS提供的容器算力。本文介绍ACK集群如何接入ACS算力。

ACK集群对接方式

阿里云容器计算服务 ACS(Container Compute Service)是以Kubernetes为用户界面的容器服务产品,提供符合容器规范的算力资源。ACS的Kubernetes管控和容器算力分层设计,为Kubernetes提供一种层次化的解决方案:ACS 的计算资源层负责底层 Pod 容器资源的调度和分配,而 Kubernetes 则在此基础上负载业务负载管理,例如管理Deployment、Service、StatefulSet、CronJob等。

ACS容器算力可以以虚拟节点的形式接入到Kubernetes集群中,使得集群可以轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。ACS在接管Pod容器底层基础设施的管理工作后,Kubernetes不再需要直接负责单个Pod的放置、启动等工作,也不再需要关心底层虚拟机的资源情况,通过ACS即可确保Pod需要的资源随时可用。

ACK是全球首批通过Kubernetes一致性认证的服务平台,提供高性能的容器应用管理服务。它整合了阿里云虚拟化、存储、网络和安全能力,简化集群的搭建和扩容等工作,让您专注于容器化的应用的开发与管理。

ACK集群通过部署虚拟节点的方式来使用ACS。有了虚拟节点后,当您的ACK集群需要扩容时,无需规划节点的计算容量,可以直接在虚拟节点下按需创建ACS,ACS与集群中真实节点上的Pod之间网络互通。建议您将长时间运行的业务负载的弹性流量部分调度至ACS,这可以缩短弹性扩容的时间,减少扩容成本,并充分利用已有资源。当业务流量下降后,您可以快速释放部署在ACS上的Pod,从而降低使用成本。

在ACK集群中,您需要手动部署虚拟节点,才能创建ACS Pod。虚拟节点上的Pod均基于ACS运行在安全隔离的容器运行环境中,每个Pod对应一个ACS实例。更多信息,请参见ACK产品概述

前提条件

  • 对于不同ACK版本的集群,虚拟节点版本需要满足以下要求。

ACK版本

虚拟节点版本

1.26及以上

v2.13.0-beta.2及以上

准备工作

首次操作时,需完成服务开通和相关授权操作:

创建集群:

  • 已创建ACK托管集群,Kubernetes版本为1.26及以上版本。具体操作,请参见创建ACK托管集群

安装ack-virtual-node组件启用ACS算力

启用介绍。

  1. 选择ACK Pro集群进入集群控制台,进入“组件管理”页,在核心组件 tab 页选择“ack-virtual-node”组件进行安装或者升级到指定版本。

    image.png

  2. 安装ack-virtual-node前提示“开通并授权ACS”,需要按指引开通并授权ACS。完成ACS的开通和授权后点击“确定”安装。

    image.png

ACK使用ACS算力示例

ack-virtual-node安装或升级到指定版本将同时支持ACS和ECI两种算力,默认行为将保持不变会优先使用ECI弹性实例。使用ACS算力可以通过以下两步进行指定。

  1. 通过NodeSelector、亲和性和反亲和性、ResourcePolicy等调度方式将Pod调度到虚拟节点。具体步骤,请参见:节点亲和性调度

  2. 通过label(alibabacloud.com/compute-class:计算类型)指定创建ACS Pod的实例类型。实例类型介绍,请参加:ACS Pod实例概述

注:Pod调度到虚拟节点,但未指定ACS的算力类型,将执行默认行为创建ECI弹性实例。

具体操作步骤如下:

  1. 执行以下命令,查看虚拟节点的Label。

    kubectl get node virtual-kubelet-cn-hangzhou-k -oyaml

    预期输出(Label相关关键内容):

    apiVersion: v1
    kind: Node
    metadata:
      labels:
        kubernetes.io/arch: amd64
        kubernetes.io/hostname: virtual-kubelet-cn-hangzhou-k
        kubernetes.io/os: linux
        kubernetes.io/role: agent
        service.alibabacloud.com/exclude-node: "true"
        topology.diskplugin.csi.alibabacloud.com/zone: cn-hangzhou-k
        topology.kubernetes.io/region: cn-hangzhou
        topology.kubernetes.io/zone: cn-hangzhou-k
        type: virtual-kubelet # 所有虚拟节点都存在该标签,可以使用该标签实现Pod定向调度到虚拟节点。
      name: virtual-kubelet-cn-hangzhou-k
    spec:
      taints:
      - effect: NoSchedule
        key: virtual-kubelet.io/provider
        value: alibabacloud 
  2. 使用以下YAML内容创建Deployment,部署2个Pod。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          labels:
            app: nginx 
            # 计算类型 https://help.aliyun.com/document_detail/2586164.html
            alibabacloud.com/compute-class: general-purpose # 配置ACS Pod的算力类型,未配置默认general-purpose
            alibabacloud.com/compute-qos: default # 配置ACS Pod的qos,未配置默认default
        spec:
          nodeSelector:
            type: virtual-kubelet #定向调度到虚拟节点
          tolerations:
          - key: "virtual-kubelet.io/provider" # 容忍虚拟节点的污点 
            operator: "Exists"
            effect: "NoSchedule"
          containers:
          - name: nginx
            image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
            resources:
              limits:
                cpu: 2
              requests:
                cpu: 2
  3. 创建应用Nginx并查看部署结果。

    1. 执行以下命令,创建应用Nginx。

      kubectl apply -f nginx.yaml 

      预期输出:

      deployment.apps/nginx created
    2. 执行以下命令,查看部署结果。

      kubectl get pods -o wide

      预期输出:

      NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE                            NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-s****   1/1     Running   0          36s   10.0.6.68        virtual-kubelet-cn-hangzhou-j   <none>           <none>
      nginx-9cdf7bbf9-v****   1/1     Running   0          36s   10.0.6.67        virtual-kubelet-cn-hangzhou-k   <none>           <none>

      由预期输出得到,前两个Pod被调度到labeltype=virtual-kubelet的节点上。

  4. 查看应用Nginx的Pod详情,确认Pod为ACS Pod实例。

    1. 执行以下命令,查看应用Nginx的Pod详情。

      kubectl describe pod nginx-9cdf7bbf9-s**** 

      预期输出(关键信息):

      Annotations:      ProviderCreate: done
                        alibabacloud.com/client-token: edf29202-54ac-438e-9626-a1ca007xxxxx
                        alibabacloud.com/custom-tags: <tag_key1>:<tag_value1>,<tag_key2>:<tag_value2>
                        alibabacloud.com/instance-id: acs-2ze008giupcyaqbxxxxx
                        alibabacloud.com/pod-ephemeral-storage: 30Gi
                        alibabacloud.com/pod-use-spec: 2-4Gi
                        alibabacloud.com/request-id: A0EF3BF3-37E7-5A07-AC2D-68A0CFCxxxxx
                        alibabacloud.com/schedule-result: finished
                        alibabacloud.com/user-id: 14889995898xxxxx
                        kubernetes.io/pod-stream-port: 10250
                        kubernetes.io/preferred-scheduling-node: virtual-kubelet-cn-hangzhou-j/1

      输出的Pod内容中存在annotation 'alibabacloud.com/instance-id'则可确认该Pod为ACS Pod实例。