自建Kubernetes集群通过ACK Virtual Node接入云上Serverless算力

ACK Virtual Node实现Kubernetes与云上Serverless算力的无缝连接。本文介绍如何在数据中心Kubernetes部署ACK Virtual Node组件。

ACK Virtual Node介绍

ACK Virtual Node实现Kubernetes与云上Serverless算力的无缝连接,使自建Kubernetes集群能够轻松获得云上的弹性算力,包括CPU和GPU。通过ACK Virtual Node,您可以在自建Kubernetes集群创建Serverless Pod,利用云上算力高效应对业务增长和流量高峰。

image
说明
  • 数据中心和阿里云VPC需使用专线互联。

  • 文档中涉及{region}表示数据中心要访问弹性容器实例ECI所在地域的Region ID,例如张家口地域为cn-zhangjiakou。更多关于弹性容器实例ECI的地域信息,请参见服务接入点

  • 对于每个Serverless Pod,ACK Virtual Node会创建云上弹性容器实例,无需额外维护节点。

前提条件

  • 已完成Kubernetes集群的部署,推荐Kubernetes版本为1.18及以上。

  • 已为使用ACK Virtual Node Helm Chart的阿里云RAM用户或角色创建AccessKey,同时授予相应的调用ECI OpenAPI权限,具体操作请参见RAM子账号授权。授权信息如下:

展开查看授权信息

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "eci:CreateContainerGroup",
                "eci:DeleteContainerGroup",
                "eci:DescribeContainerGroups",
                "eci:DescribeContainerGroupStatus",
                "eci:DescribeContainerGroupEvents",
                "eci:DescribeContainerLog",
                "eci:UpdateContainerGroup",
                "eci:UpdateContainerGroupByTemplate",
                "eci:CreateContainerGroupFromTemplate",
                "eci:RestartContainerGroup",
                "eci:ExportContainerGroupTemplate",
                "eci:DescribeContainerGroupMetric",
                "eci:DescribeMultiContainerGroupMetric",
                "eci:ExecContainerCommand",
                "eci:CreateImageCache",
                "eci:DescribeImageCaches",
                "eci:DeleteImageCache",
                "vpc:DescribeVSwitches"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}

安装组件

  1. 根据以下示例创建my-values.yaml,并保存到本地目录。

    virtualNode:
      image:
        repository: registry-{Region}.ack.aliyuncs.com/acs/virtual-nodes-eci
        tag: v2.12.1
    env:
      ECI_REGION: cn-zhangjiakou
      ECI_VSWITCH: vsw-8vb***
      ECI_SECURITY_GROUP: sg-8vb***
      ECI_ACCESS_KEY: LTAI5t***
      ECI_SECRET_KEY: 99K***

    参数说明:

    参数名称

    参数说明

    是否必选

    示例值

    virtualNode.image.repository

    virtual-node镜像仓库地址。

    必选

    registry-cn-zhangjiakou.ack.aliyuncs.com/acs/virtual-nodes-eci

    virtualNode.image.tag

    virtual-node镜像Tag。

    必选

    v2.12.1

    env.ECI_REGION

    弹性容器实例所在地域ID。

    必选

    cn-zhangjiakou

    env.ECI_VSWITCH

    弹性容器实例所在交换机ID,多个交换机使用英文半角逗号分隔。根据Serverless Pod数量为交换机预留足够的IP地址。

    必选

    vsw-8vb***

    env.ECI_SECURITY_GROUP

    弹性容器实例所在安全组ID。

    必选

    sg-8vb***

    env.ECI_ACCESS_KEY

    云账号AccessKeyId。确保该云账号有调用ECI API的权限。

    必选

    LTAI5t***

    env.ECI_SECRET_KEY

    云账号AccessKeySecret。确保该云账号有调用ECI API的权限。

    必选

    99K***

    env.KUBERNETES_APISERVER_HOST

    API Server地址,如有需要指定API Server地址,请设置。

    可选

    192.168.0.1

    env.KUBERNETES_APISERVER_PORT

    API Server内网地址端口。

    可选

    6443

    env.ECI_VPC

    弹性容器实例所在VPC ID。

    可选

    vpc-8vb***

    env.ALIYUN_RESOURCEGROUP_ID

    弹性容器实例归属的资源组ID。

    可选

    rg-acf***

  2. 执行以下命令,添加Helm Repo。

    helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
  3. 执行以下命令,安装ack-virtual-node

    helm install ack-virtual-node aliyunhub/ack-virtual-node --namespace kube-system --values my-values.yaml
  4. 执行以下命令,查看应用状态。

    kubectl  get no |grep virtual-kubelet

    预期输出:

    virtual-kubelet-cn-zhangjiakou-c   Ready    agent    10d   v1.18.8

将Pod调度到云上Serverless算力运行

在自建Kubernetes集群上,通过以下三种方式可将Pod调度到ECI上运行。

方式一:配置Pod标签

  1. 执行以下命令部署指定Pod标签的测试用例。

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx-deployment-pod-label
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            alibabacloud.com/eci: 'true'   # 指定Pod标签使用云上Serverless算力运行
            app: nginx
        spec:
          containers:
            - image: 'registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2'
              imagePullPolicy: IfNotPresent
              name: nginx
              ports:
                - containerPort: 80
                  protocol: TCP
              resources:
                limits:
                  cpu: 500m
    EOF
  2. 执行以下命令,查看应用状态。

     kubectl get pod -owide | grep nginx-deployment-pod-label

    预期输出:

    nginx-deployment-pod-label-6575548559-7p9hf     1/1     Running   0          33s    192.168.XX.XXX    virtual-kubelet-cn-zhangjiakou-c   <none>           <none>
    nginx-deployment-pod-label-6575548559-tztm6     1/1     Running   0          33s    192.168.XX.XXX    virtual-kubelet-cn-zhangjiakou-c   <none>           <none>

方式二:配置命名空间标签

  1. 执行以下命令,创建名为vk的命名空间。

    kubectl create ns vk
  2. 执行以下命令为命名空间添加alibabacloud.com/eci=true标签。

    kubectl label namespace vk alibabacloud.com/eci=true
  3. 执行以下命令将测试用例部署到指定命名空间。

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx-deployment-ns-label
      namespace: vk
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - image: 'registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2'
              imagePullPolicy: IfNotPresent
              name: nginx
              ports:
                - containerPort: 80
                  protocol: TCP
              resources:
                limits:
                  cpu: 500m
    EOF
  4. 执行以下命令,查看应用状态。

    kubectl get po -nvk -owide |grep  nginx-deployment-ns-label

    预期输出:

    nginx-deployment-ns-label-7bc784448c-5llgb   1/1     Running   0          30s   192.168.XX.XXX   virtual-kubelet-cn-zhangjiakou-c   <none>           <none>
    nginx-deployment-ns-label-7bc784448c-8ns9q   1/1     Running   0          30s   192.168.XX.XXX   virtual-kubelet-cn-zhangjiakou-c   <none>           <none>

方式三:指定节点名称

  1. 执行以下命令将测试用例部署到指定节点。

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx-deployment-node-name
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeName: virtual-kubelet-cn-zhangjiakou-c             # 指定ack-virtual-node的nodeName
          containers:
            - image: 'registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2'
              imagePullPolicy: IfNotPresent
              name: nginx
              ports:
                - containerPort: 80
                  protocol: TCP
              resources:
                limits:
                  cpu: 500m
    EOF
  2. 执行以下命令,查看应用状态。

    kubectl get pod -owide |grep nginx-deployment-node-name

    预期输出:

    nginx-deployment-node-name-864dffd59f-jq58n     1/1     Running   0          23s     192.168.XX.XXX     virtual-kubelet-cn-zhangjiakou-c   <none>           <none>
    nginx-deployment-node-name-864dffd59f-r87zp     1/1     Running   0          23s     192.168.XX.XXX     virtual-kubelet-cn-zhangjiakou-c   <none>           <none>

相关文档