为了减少您对业务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外,vpcId、vswitchIds等固定配置项 | 集群级别配置项,支持热更新。您可以根据需要更新配置项取值。 |
修改eci-profile的方式如下:
通过kubectl edit命令
kubectl edit configmap eci-profile -n kube-system
通过容器服务管理控制台
登录容器服务管理控制台。
在集群页面,找到目标集群,单击集群名称。
在集群管理页的左侧导航栏,选择配置管理>配置项。
选择命名空间为kube-system。
找到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模式。
更多信息,请参见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****