配置ECI Profile

在Kubernetes场景中通过Virtual Kubelet使用ECI,如果遇到Pod无法无缝调度或者运行在ECI的问题,您可以尝试通过配置ECI Profile的方式来解决。本文介绍什么是ECI Profile以及如何配置ECI Profile。

ECI Profile介绍

在Kubernetes场景中通过Virtual Kubelet(简称VK)使用ECI时,可能会碰到Pod无法无缝调度到ECI,或者Pod调度到ECI后,为了生效ECI的功能特性(如镜像缓存)需要添加Pod Annotation。这类问题一般由集群管理员处理,但目前却需要研发人员通过调整Pod的配置文件来解决。

针对上述场景,ECI支持通过配置ECI Profile来解决。ECI Profile包括以下三个能力:

  • ECI Scheduler

    在混合使用ECI和普通节点的场景下,一般可以通过配置Pod Label、配置Namespace Label和配置ECI弹性调度等方式将Pod调度到ECI,但这些方式均需要对存量资源做一定的修改,无法做到零侵入。

    对于上述情况,ECI Scheduler基于Mutating Webhook机制实现了一种新的调度机制,即在ECI Profile中,您可以声明需要匹配的Namespace或者Pod的Label,对于Label能够匹配上的Pod,将被自动调度到ECI。

  • ECI Effect

    对于ECI的一些功能特性,例如指定ECS实例规格,启用镜像缓存,设置NTP服务等,需要在Pod中追加Annotation或者Label来实现。更多信息,请参见ECI Pod Annotation

    对于上述情况,ECI Effect实现了自动追加Annotation和Label的功能,即在ECI Profile中,您可以声明需要匹配的Namespace或者Pod的Label,以及需要追加的Annotation和Label,对于Label能够匹配上的Pod,将自动追加配置的Annotation和Label。

  • 配置热更新

    在ECI Profile中,包含了Cluster IP、混合云模式、PrivateZone的开关配置,以及资源组、安全组、VPC和交换机等配置,您可以根据需要进行更新,更新后的配置可以即时生效(无需重启VK)。

准备工作

使用ECI Profile时,您需要确保集群中的VK为最新版本,并且如果需要使用ECI Scheduler,则必须要开启Webhook。

对于不同的Kubernetes集群,相应的准备工作如下:

  • 阿里云ASK集群

    自动升级VK到最新版本。

    说明

    ASK集群默认调度Pod到ECI,无需使用ECI Scheduler。

  • 阿里云ACK集群

    • VK托管:自动升级VK到最新版本,并开启Webhook。

    • VK非托管:您需要手动修改VK的配置文件,升级VK到最新版本,并开启Webhook。

  • 其他集群

    您需要手动修改VK的配置文件,升级VK到最新版本,并开启Webhook。

关于如何升级VK,请参见升级Virtual Kubelet

配置说明

ECI Profile会读取kube-system命名空间下的eci-profile配置文件,然后按照配置文件中的selectors去匹配Pod,对于Label能够匹配上的Pod,将自动调度到ECI,或者追加Annotation和Label,以便生效ECI的功能特性。

您可以通过以下两种方式编辑eci-profile配置文件:

  • 通过kubectl edit命令

    kubectl edit configmap eci-profile -n kube-system
  • 通过容器服务管理控制台

    1. 容器服务管理控制台的集群页面,找到要配置的集群,单击集群名称进入集群详情页面。

    2. 在左侧导航栏选择配置管理>配置项

    3. 选择命名空间为kube-system

    4. 找到eci-profile进行编辑。

一个典型的eci-profile配置文件示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: eci-profile
  namespace: kube-system
data:
  vpcId: "vpc-xxx"
  securityGroupId: "sg-xxx"
  vswitchIds: "vsw-111,vsw-222"
  enableClusterIp: "true"
  enableHybridMode: "false"
  enablePrivateZone: "false"
  selectors: |
    [
        {
            "name":"default-selector-1",
            "objectSelector":{
                "matchLabels":{
                    "alibabacloud.com/eci":"true"
                }
            }
        },
        {
            "name":"default-selector-2",
            "objectSelector":{
                "matchLabels":{
                    "eci":"true"
                }
            }
        },
        {
            "name":"default-selector-3",
            "namespaceSelector":{
                "matchLabels":{
                    "alibabacloud.com/eci":"true"
                }
            }
        },
        {
            "name":"default-selector-4",
            "namespaceSelector":{
                "matchLabels":{
                    "eci":"true"
                }
            }
        },
        {
            "name":"default-selector-5",
            "namespaceSelector":{  
                "matchLabels":{
                    "virtual-node-affinity-injection":"enabled"
                }
            },
            "effect":{ 
            "annotations":{
                "k8s.aliyun.com/eci-image-cache": "true"
            },
            "labels":{
                "created-by-eci":"true"
            }
          }
        }
    ]

在上述配置文件中,data中包含了vpcId、vswitchIds、selectors等配置项。

其中,selectors包含了ECI Scheduler和ECI Effect的配置。在每个selector中,您必须声明selector的名称,可以根据需要声明以下信息:

  • namespaceSelector:要匹配的Namespace Label。

  • objectSelector:要匹配的Pod Label。

  • effect:需要动态追加的Annotation和Label。

配置selectors后,您可以通过以下命令确认selectors是否生效。如果返回的YAML中已包含配置的selectors,则表示配置成功;如果未包含selectors,请检查selectors的格式是否有误。

kubectl get mutatingwebhookconfigurations -o yaml vk-webhook

另外,vpcId、vswitchIds等配置对应VPC、交换机等信息,您可以根据需要进行更新。支持更新的配置如下表所示。

配置项

示例值

说明

enableClusterIp

"true"

是否支持Cluster IP。

enableHybridMode

"false"

是否开启混合云模式。

enablePrivateZone

"false"

是否使用PrivateZone做域名解析。

resourceGroupId

rg-aek2z3elfs4qghy

资源组。

securityGroupId

sg-2ze0b9o8pjjzts4h****

安全组。

vSwitchIds

vsw-2zeet2ksvw7f14ryz****

交换机。可配置多个,用半角逗号间隔。

vpcId

vpc-2zeghwzptn5zii0w7****

VPC。

配置ECI Scheduler示例

在eci-profile的selectors中,您可以以数组的形式声明需要匹配的Namespace或者Pod的Label。对于Label能够匹配上的Pod,将会被自动调度到ECI。

配置示例如下:

注意

实际部署时请去除注释信息。

  selectors: |
   [
      {
        "name":"demo",  #必填,不能为空
        "namespaceSelector":{  #选填,K8s的Namespace Label(namespaceSelector和objectSelector至少配置一个)
            "matchLabels":{  #需要匹配的Label,如果填写多个,为与关系
                "department":"bigdata"
            }
        },
        "objectSelector":{  #选填,K8s的Pod Label(namespaceSelector和objectSelector至少配置一个)
            "matchLabels":{  #需要匹配的Label,如果填写多个,为与关系
                "type":"offline-task"
              }
          }
      }
   ]
注意

在一个selector中,您至少要配置namespaceSelector和objectSelector中的一个,如果两者同时配置了,则Pod需要同时匹配两者。

上述selectors中,声明了一个名为demo的selector,可以实现以下功能:

如果Pod所属命名空间含有department=bigdata标签,并且Pod本身含有type=offline-task标签,则该Pod将自动被调度到ECI。

配置ECI Effect示例

在eci-profile的selectors中,您可以以数组的形式声明需要匹配的Namespace或者Pod的Label,以及需要动态追加的Annotation和Label。对于Label能够匹配上的Pod,将自动追加配置的Annotation和Label。

配置示例如下:

注意

实际部署时请去除注释信息。

  selectors: |
   [
    {
        "name":"demo",  #必填,不能为空
        "namespaceSelector":{  #选填,K8s的Namespace Label
            "matchLabels":{  #需要匹配的Label,如果填写多个,为与关系
                "department":"bigdata"
            }
        },
        "objectSelector":{  #选填,K8s的Pod Label
            "matchLabels":{  #需要匹配的Label,如果填写多个,为与关系
                "type":"offline-task"
            }
        },
        "effect":{  #需要动态追加的Annotation和Label
            "annotations":{
                "k8s.aliyun.com/eci-image-cache": "true"
            },
            "labels":{
                "created-by-eci":"true"
            }
        }
    }
   ]
注意

  • 在一个selector中,您可以根据需要选择配置namespaceSelector和objectSelector。如果两者均未配置,则effect对所有调度到ECI的Pod均生效。

  • 如果配置了多个selector,将按照顺序匹配selector。匹配成功后,将自动把effect中声明的Annotation和Label追加到Pod中(只追加,不覆盖)。对于重复的Annotation和Label,Pod原有声明的值优先级最高,其次是顺序匹配上的第一个selector中的effect,以此类推。

上述selectors中,声明了一个名为demo的selector,可以实现以下功能:

如果Pod所在的命名空间有department=bigdata标签,并且Pod本身含有type=offline-task标签,则该Pod将自动调度到ECI,并且自动开启镜像缓存功能,增加created-by-eci=true标签。

配置热更新示例

在eci-profile的data中,您可以修改vSwitchIds来更新创建ECI实例时可以使用的交换机,以实现多可用区功能。配置示例如下:

data:
  enableClusterIp: "true"
  enableHybridMode: "false"
  enablePrivateZone: "false"
  resourceGroupId: ""
  securityGroupId: sg-2ze0b9o8pjjzts4h****
  selectors: ""
  vSwitchIds: vsw-2zeet2ksvw7f14ryz****,vsw-2ze94pjtfuj9vaymf****  #配置多个交换机实现多可用区功能
  vpcId: vpc-2zeghwzptn5zii0w7****