配置eci-profile

为了减少您对业务YAML的改动,ECI支持了eci-profile功能。eci-profile可以提供集群维度的ECI资源视图,支持根据selector实现Pod编排。本文介绍如何配置eci-profile。

功能介绍

阿里云容器服务ACK通过VK(部署ack-virtual-node组件)使用ECI时,可能会碰到以下问题:

  • 需要上层业务修改YAML才能调度Pod到ECI

  • 需要上层业务修改YAML才能开启ECI特有的高级特性

这类问题导致了运维管理工作和业务管理工作混淆在一起。为解决此类问题,ECI支持了eci-profile。eci-profile可以实现以下三个功能:

  • ECI Scheduler

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

    对于上述情况,ECI Scheduler基于Mutating Webhook机制实现了一种新的调度机制。在eci-profile中,您可以自定义selector,selector可以根据Pod的Label或者Pod所属Namespace的Label来筛选Pod,满足selector筛选条件的Pod会自动调度到ECI。

  • ECI Effect

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

    对于上述情况,ECI Effect实现了自动追加Annotation和Label的功能。在eci-profile中,您可以自定义selector,在selector中同时指定筛选条件和要追加的Annotation和Label,满足selector筛选条件的Pod会自动调度到ECI,并自动追加指定的Annotation和Label。

  • 配置热更新

    eci-profile中包含了Cluster IP、混合云模式、日志采集、交换机等配置,您可以根据需要进行更新。

    • 更新配置时无需重启VK。

    • 对于新创建的ECI Pod,可以即时生效更新后的配置;对于存量ECI Pod,需要滚动发布后才能生效更新后的配置。

注意事项

  • 使用该功能时,请确保集群中的VK(ack-virtual-node组件)为最新版本。关于如何升级组件,请参见管理组件

  • 如果需要使用ECI Scheduler功能,则必须要开启Webhook。ACK Serverless集群默认调度Pod到ECI,无需使用ECI Scheduler功能。

配置说明

创建Pod时,系统会读取kube-system命名空间下的eci-profile配置文件(名为eci-profile的ConfigMap),按其data配置来创建Pod。您可以通过kubectl get cm -n kube-system eci-profile -o yaml命令查看eci-profile的YAML。eci-profile的YAML模板如下:

apiVersion: v1
data:
  enableClusterIp: "true"
  enableHybridMode: "false"
  enableLinuxArm64Node: "false" 
  enableLogController: "false"
  enablePVCController: "false"
  enablePrivateZone: "false"
  enableReuseSSLKey: "false"
  featureGates: "WaitForFirstConsumer=false"
  securityGroupId: sg-2zeeyaaxlkq9sppl****
  selectors: ""
  slsMachineGroup: ""
  vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
  vpcId: vpc-2zeghwzptn5zii0w7****
kind: ConfigMap
metadata:
  creationTimestamp: "2023-01-11T08:28:14Z"
  name: eci-profile
  namespace: kube-system
  resourceVersion: "356"
  uid: b345fa8c-919e-41fc-a981-57864b1a****

您可以修改eci-profile中的data配置,配置selectors或更新固定配置项。

data中的配置项

说明

详细说明及示例

selectors

可自定义增加selector(分为objectSelector和namespaceSelector)和effect,用于实现ECI Scheduler和ECI Effect功能。您可以根据需要灵活配置selectors。

配置selectors

除selectors外,vpcId、vswitchIds等固定配置项

集群级别配置项,支持热更新。您可以根据需要更新配置项取值。

更新固定配置项

修改eci-profile的方式如下:

  • 通过kubectl edit命令

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

    1. 登录容器服务管理控制台

    2. 在集群页面,找到目标集群,单击集群名称。

    3. 在集群管理页的左侧导航栏,选择配置管理>配置项

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

    5. 找到eci-profile,单击YAML编辑

配置selectors

selectors包含了ECI Scheduler和ECI Effect的配置。创建Pod时,系统会按照selectors去匹配Pod,对于Label能够匹配上的Pod,会自动调度到ECI,或者追加Annotation和Label,以便生效ECI的功能特性。

selectors中可以包含多个selector,在每个selector中,您必须声明selector的name,可以根据需要声明以下信息:

  • namespaceSelector:要匹配的Namespace Label。

  • objectSelector:要匹配的Pod Label。

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

selectors的配置模板如下:

说明

请根据自身业务场景设计selectors,实际配置时请去除注释信息。

data:
  selectors: |
    [
      {
        "name": "selector-demo1", #selector名称,必填,不能为空
        "namespaceSelector": {    #通过NameSpace Label筛选,可选
          "matchLabels": {        #要匹配的NameSpace Label。如果填写多个,为与关系
            "eci": "true"
          }
        },
        "objectSelector": {       #通过Pod Label筛选,可选
          "matchLabels": {        #要匹配的Pod Label。如果填写多个,为与关系
            "eci": "true"
          }
        },
        "effect": {               #要动态追加的Annotation和Label,可选
          "annotations": {
            "k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
          },
          "labels": {
            "created-by-eci": "true"
          }
        }
      },
      {
        "name": "selector-demo2",   
        "objectSelector": {      
          "matchLabels": {     
            "eci": "test"
    	  }
        }
      }
    ]

上述模板中,名为selector-demo1的selector可以实现以下功能:

如果Pod所属命名空间含有eci: true Label,并且Pod本身含有eci: true Label,则该Pod会自动调度到ECI,并且增加"k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"的Annotation,以及created-by-eci: true Label。

重要
  • 在一个selector中,建议您至少配置namespaceSelector和objectSelector中的一个。如果两者同时配置了,则Pod需要同时匹配两者;如果两者均未配置但配置了effect,则effect对所有调度到ECI的Pod均生效。

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

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

kubectl get mutatingwebhookconfigurations -o yaml vk-webhook

配置示例一:将特定Pod调度到ECI

配置namespaceSelector和objectSelector实现以下功能:

如果Pod含有created-by-eci: true Label,且所属Namespace含有type: eci Label,则该Pod会被调度到ECI。

data:
  selectors: |
    [
      {
        "name":"eci-selector",
        "namespaceSelector":{
          "matchLabels":{
            "type":"eci"
          }
        },
        "objectSelector":{
          "matchLabels":{
            "created-by-eci":"true"
          }
        }
      }
    ]

配置示例二:将特定Pod调度到ECI并使用GPU规格创建

配置namespaceSelector和effect实现以下功能:

如果Pod所属Namespace含有gpu: true Label,则该Pod会被调度到ECI,并使用指定的GPU实例规格ecs.gn6v-c8g1.2xlarge,同时添加gpu: test Label。

data:
  selectors: |
    [
      {
        "name":"gpu-namespace-selector",
        "namespaceSelector":{
          "matchLabels":{
            "gpu":"true"
          }
        },
        "effect": {
          "annotations": {
            "k8s.aliyun.com/eci-use-specs":"ecs.gn6v-c8g1.2xlarge"
          },        
          "labels":{
            "gpu":"test"
          }
        }
      }
    ]

配置示例三:将特定Pod调度到ECI并开启自动匹配镜像缓存

配置objectSelector和effect实现以下功能:

如果Pod含有imc: auto Label,则该Pod会被调度到ECI,并使用自动匹配镜像缓存功能。

data:
  selectors: |
    [
      {
        "name":"autoimc-object-selector",
        "objectSelector":{
          "matchLabels":{
            "imc":"auto"
          }
        },
        "effect": {
          "annotations": {
            "k8s.aliyun.com/eci-auto-imc": "true"
          }
        }
      }
    ]

更新固定配置项

data中包含的vpcId、vswitchIds等固定配置项对应VPC、交换机等信息,您可以根据需要进行更新,更新后的配置可以即时生效(无需重启VK)。支持更新的配置项如下:

说明

以下配置项均为集群级别的配置项,即在创建ECI Pod时,如果没有额外配置,会采用eci-profile中的配置。

配置项

示例值

说明

enableClusterIp

"true"

是否支持Cluster IP。

enableLinuxArm64Node

"false"

是否开启ARM节点。更多信息,请参见调度Pod到ARM架构的虚拟节点

enableLogController

"false"

是否开启SLS CRD日志采集功能。如果配置为true,还需配置

slsMachineGroup。

enablePVCController

"false"

是否开启云盘在线扩容功能。如果配置为true,则允许对绑定了云盘的PVC进行在线扩容。

enablePrivateZone

"false"

是否使用PrivateZone进行域名解析。

enableReuseSSLKey

"false"

是否开启SSL Key复用。如果配置为true,则在创建ECI Pod时,会复用SSL Key来提升创建效率。

重要

默认情况下,创建ECI Pod时,VK会给每个ECI Pod下发不同的SSL证书,这在大批量创建时会影响效率。开启SSL Key复用后,VK会给每个ECI Pod下发同一个SSL证书,这在安全性上会有所降低。

featureGates

"WaitForFirstConsumer=false"

featureGates表示灰度特性,您可以按需配置,目前仅支持配置WaitForFirstConsumer。

配置WaitForFirstConsumer=true时,表示VK+ECI模式下,StorageClass默认使用WaitForFirstConsumer模式。

  • 启用该配置前,需确保csi-provisioner组件已升级到最新release版本,

  • 启用该配置后,当PVC被Pod使用时,需要Pod完成调度后,才触发PV和后端存储的创建,同时完成PVC和PV的绑定。此时,StorageClass中的Zone和Region将不再生效,而是使用Pod调度所在节点的Zone和Region创建存储资源,以保证计算资源调度优先。

更多信息,请参见Volume Binding Mode

securityGroupId

sg-2ze0b9o8pjjzts4h****

ECI Pod所属安全组。

slsMachineGroup

"test-mg"

ECI Pod所属机器组。当enableLogController配置为true时,需配置该项。

vSwitchIds

vsw-2zeet2ksvw7f14ryz****

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

vpcId

vpc-2zeghwzptn5zii0w7****

ECI Pod所属VPC。

配置示例如下:

data:
  enableClusterIp: "true"
  enableHybridMode: "false"
  enableLinuxArm64Node: "false" 
  enableLogController: "false"
  enablePVCController: "false"
  enablePrivateZone: "false"
  enableReuseSSLKey: "false"
  featureGates: "WaitForFirstConsumer=false"
  securityGroupId: sg-2zeeyaaxlkq9sppl****
  selectors: ""
  slsMachineGroup: ""
  vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
  vpcId: vpc-2zeghwzptn5zii0w7****