调度Pod到x86架构的虚拟节点

对于ACK Serverless集群,所有Pod均运行在虚拟节点(默认x86架构)上,无需进行调度;对于ACK集群,即混合使用标准节点(ECS)和虚拟节点(ECI,基于VK)的模式下,默认会将Pod调度到ECS节点,您可以根据需要将Pod调度到虚拟节点。本文介绍如何将ACK集群中的Pod调度到x86架构的虚拟节点上。

调度方式概述

您可以通过以下几种方式将Pod调度到x86架构的虚拟节点:

说明

下述方式均需要对存量资源做一定的修改,无法做到零侵入,建议您配置ECI Profile,通过ECI Profile的ECI Scheduler能力,在eci-profile配置文件中声明需要匹配的Pod或者Namespace的Label,对于Label能够匹配上的Pod,将被自动调度到ECI。更多信息,请参见配置ECI Profile

  • 配置Pod Label

    如果您有个别Pod需要调度到ECI上运行,可以直接为Pod添加特定的Label,则该Pod将运行在x86架构的虚拟节点上。

  • 配置Namespace Label

    如果您有一类Pod需要调度到ECI上运行,可以创建一个Namespace并添加特定的Label,则该Namespace下的所有Pod将运行在x86架构的虚拟节点上。

  • (仅适用于ACK Pro集群)配置ECI弹性调度

    ECI弹性调度是阿里云提供的一种弹性调度策略,在部署服务时,您可以添加Annotations来声明只使用普通节点的资源或者虚拟节点的ECI资源,或者在普通节点的资源不足时自动使用ECI资源,以满足不同场景下对弹性资源的不同需求。

  • (不推荐)配置nodeSelector和tolerations、指定nodeName等其它方式

    x86架构的虚拟节点默认配置了Label和Taint,因此可以为Pod配置对应的nodeSelector和tolerations将Pod调度到x86架构的虚拟节点上,或者也可以采用指定nodeName的方式进行调度。

方式一:配置Pod Label

您可以为Pod添加alibabacloud.com/eci=true的Label,将Pod调度到ECI上运行。

说明

仍支持添加eci=true的Label,但不推荐。

配置示例如下:

  1. 创建Pod的YAML配置文件。

    vim test-pod.yaml

    test-pod.yaml的内容示例如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx1
      labels: 
        alibabacloud.com/eci: "true"   # 添加特定Label
    spec:
      containers:
      - image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        imagePullPolicy: Always
        name: nginx
  2. 创建Pod。

    kubectl create -f test-pod.yaml 

方式二:配置Namespace Label

您可以创建一个Namespace并添加alibabacloud.com/eci=true的Label,则该Namespace下的所有Pod将调度到ECI上运行。

说明

仍支持添加virtual-node-affinity-injection=enabled的Label,但不推荐。

配置示例如下:

  1. 创建Namespace。

    kubectl create ns vk
  2. 为Namespace添加Label。

    kubectl label namespace vk alibabacloud.com/eci=true
  3. 创建Pod的YAML配置文件。

    vim test-pod.yaml

    test-pod.yaml的内容示例如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: vk  # 指定添加了特定Label的Namespace
    spec:
      containers:
      - image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        imagePullPolicy: Always
        name: nginx
  4. 创建Pod。

    kubectl create -f test-pod.yaml 

方式三:配置ECI弹性调度

您可以在Pod metadata中添加Annotations来声明弹性资源的类型,对应的配置项为alibabacloud.com/burst-resource,取值如下:

  • eci:当集群普通节点的资源不足时,使用ECI。

  • eci_only:只使用ECI。

重要

该方式仅适用于ACK Pro版集群,且集群的Kubernetes版本不能低于1.18。更多信息,请参见使用ECI弹性调度

配置示例如下:

  1. 创建Deployment的YAML配置文件。

    vim test-deployment.yaml

    test-deployment.yaml的内容示例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          annotations:
            alibabacloud.com/burst-resource: eci  # 设置弹性调度的资源类型
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
            resources:
              limits:
                cpu: 2
              requests:
                cpu: 2
  2. 创建Deployment。

    kubectl create -f test-deployment.yaml 

(不推荐)其它方式

您可以通过配置nodeSelector和tolerations、指定nodeName等方式将Pod调度到ECI上运行。

配置示例如下:

  1. 创建Pod的YAML配置文件。

    vim test-pod.yaml

    test-pod.yaml的内容示例如下:

    • 配置nodeSelector和tolerations

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
      spec:
        containers:
        - image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
          imagePullPolicy: Always
          name: nginx
        nodeSelector:    # 配置nodeSelector
          type: virtual-kubelet
        tolerations:     # 配置tolerations
        - key: virtual-kubelet.io/provider
          operator: Exists
    • 指定nodeName

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
      spec:
        containers:
        - image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
          imagePullPolicy: Always
          name: nginx
        nodeName: virtual-kubelet-cn-beijing-g # 指定nodeName
  2. 创建Pod。

    kubectl create -f test-pod.yaml