配置eci-profile
為了減少您對業(yè)務(wù)YAML的改動,ECI支持了eci-profile功能。eci-profile可以提供集群維度的ECI資源視圖,支持根據(jù)selector實現(xiàn)Pod編排。本文介紹如何配置eci-profile。
功能介紹
阿里云容器服務(wù)ACK通過VK(部署ack-virtual-node組件)使用ECI時,可能會碰到以下問題:
需要上層業(yè)務(wù)修改YAML才能調(diào)度Pod到ECI
需要上層業(yè)務(wù)修改YAML才能開啟ECI特有的高級特性
這類問題導(dǎo)致了運維管理工作和業(yè)務(wù)管理工作混淆在一起。為解決此類問題,ECI支持了eci-profile。eci-profile可以實現(xiàn)以下三個功能:
ECI Scheduler
在混合使用ECI和普通節(jié)點的場景下,一般可以通過配置Pod Label、配置Namespace Label和配置ECI彈性調(diào)度等方式將Pod調(diào)度到ECI,但這些方式均需要對存量資源做一定的修改,無法做到零侵入。
對于上述情況,ECI Scheduler基于Mutating Webhook機制實現(xiàn)了一種新的調(diào)度機制。在eci-profile中,您可以自定義selector,selector可以根據(jù)Pod的Label或者Pod所屬Namespace的Label來篩選Pod,滿足selector篩選條件的Pod會自動調(diào)度到ECI。
ECI Effect
對于ECI的一些功能特性,例如指定ECS實例規(guī)格,啟用鏡像緩存,設(shè)置NTP服務(wù)等,需要在Pod中追加Annotation或者Label來實現(xiàn)。更多信息,請參見ECI Pod Annotation。
對于上述情況,ECI Effect實現(xiàn)了自動追加Annotation和Label的功能。在eci-profile中,您可以自定義selector,在selector中同時指定篩選條件和要追加的Annotation和Label,滿足selector篩選條件的Pod會自動調(diào)度到ECI,并自動追加指定的Annotation和Label。
配置熱更新
eci-profile中包含了Cluster IP、混合云模式、日志采集、交換機等配置,您可以根據(jù)需要進行更新。
更新配置時無需重啟VK。
對于新創(chuàng)建的ECI Pod,可以即時生效更新后的配置;對于存量ECI Pod,需要滾動發(fā)布后才能生效更新后的配置。
注意事項
使用該功能時,請確保集群中的VK(ack-virtual-node組件)為最新版本。關(guān)于如何升級組件,請參見管理組件。
如果需要使用ECI Scheduler功能,則必須要開啟Webhook。ACK Serverless集群默認調(diào)度Pod到ECI,無需使用ECI Scheduler功能。
配置說明
創(chuàng)建Pod時,系統(tǒng)會讀取kube-system命名空間下的eci-profile配置文件(名為eci-profile的ConfigMap),按其data配置來創(chuàng)建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,用于實現(xiàn)ECI Scheduler和ECI Effect功能。您可以根據(jù)需要靈活配置selectors。 | |
除selectors外,vpcId、vswitchIds等固定配置項 | 集群級別配置項,支持熱更新。您可以根據(jù)需要更新配置項取值。 |
修改eci-profile的方式如下:
通過kubectl edit命令
kubectl edit configmap eci-profile -n kube-system
通過容器服務(wù)管理控制臺
在集群頁面,找到目標集群,單擊集群名稱。
在集群管理頁的左側(cè)導(dǎo)航欄,選擇配置管理>配置項。
選擇命名空間為kube-system。
找到eci-profile,單擊YAML編輯。
配置selectors
selectors包含了ECI Scheduler和ECI Effect的配置。創(chuàng)建Pod時,系統(tǒng)會按照selectors去匹配Pod,對于Label能夠匹配上的Pod,會自動調(diào)度到ECI,或者追加Annotation和Label,以便生效ECI的功能特性。
selectors中可以包含多個selector,在每個selector中,您必須聲明selector的name,可以根據(jù)需要聲明以下信息:
namespaceSelector:要匹配的Namespace Label。
objectSelector:要匹配的Pod Label。
effect:要動態(tài)追加的Annotation和Label。
selectors的配置模板如下:
請根據(jù)自身業(yè)務(wù)場景設(shè)計selectors,實際配置時請去除注釋信息。
data:
selectors: |
[
{
"name": "selector-demo1", #selector名稱,必填,不能為空
"namespaceSelector": { #通過NameSpace Label篩選,可選
"matchLabels": { #要匹配的NameSpace Label。如果填寫多個,為與關(guān)系
"eci": "true"
}
},
"objectSelector": { #通過Pod Label篩選,可選
"matchLabels": { #要匹配的Pod Label。如果填寫多個,為與關(guān)系
"eci": "true"
}
},
"effect": { #要動態(tài)追加的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可以實現(xiàn)以下功能:
如果Pod所屬命名空間含有eci: true
Label,并且Pod本身含有eci: true
Label,則該Pod會自動調(diào)度到ECI,并且增加"k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
的Annotation,以及created-by-eci: true
Label。
在一個selector中,建議您至少配置namespaceSelector和objectSelector中的一個。如果兩者同時配置了,則Pod需要同時匹配兩者;如果兩者均未配置但配置了effect,則effect對所有調(diào)度到ECI的Pod均生效。
如果配置了多個selector,將按照順序匹配selector。匹配成功后,會自動把effect中聲明的Annotation和Label追加到Pod中(只追加,不覆蓋)。對于重復(fù)的Annotation和Label,Pod中原有聲明的值優(yōu)先級最高,其次是順序匹配上的第一個selector中的effect,以此類推。
配置selectors后,您可以通過以下命令確認selectors是否生效。如果返回的YAML中已包含配置的selectors,則表示配置成功;如果未包含selectors,請檢查selectors的格式是否有誤。
kubectl get mutatingwebhookconfigurations -o yaml vk-webhook
配置示例一:將特定Pod調(diào)度到ECI
配置namespaceSelector和objectSelector實現(xiàn)以下功能:
如果Pod含有created-by-eci: true
Label,且所屬Namespace含有type: eci
Label,則該Pod會被調(diào)度到ECI。
data:
selectors: |
[
{
"name":"eci-selector",
"namespaceSelector":{
"matchLabels":{
"type":"eci"
}
},
"objectSelector":{
"matchLabels":{
"created-by-eci":"true"
}
}
}
]
配置示例二:將特定Pod調(diào)度到ECI并使用GPU規(guī)格創(chuàng)建
配置namespaceSelector和effect實現(xiàn)以下功能:
如果Pod所屬Namespace含有gpu: true
Label,則該Pod會被調(diào)度到ECI,并使用指定的GPU實例規(guī)格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調(diào)度到ECI并開啟自動匹配鏡像緩存
配置objectSelector和effect實現(xiàn)以下功能:
如果Pod含有imc: auto
Label,則該Pod會被調(diào)度到ECI,并使用自動匹配鏡像緩存功能。
data:
selectors: |
[
{
"name":"autoimc-object-selector",
"objectSelector":{
"matchLabels":{
"imc":"auto"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-auto-imc": "true"
}
}
}
]
更新固定配置項
data中包含的vpcId、vswitchIds等固定配置項對應(yīng)VPC、交換機等信息,您可以根據(jù)需要進行更新,更新后的配置可以即時生效(無需重啟VK)。支持更新的配置項如下:
以下配置項均為集群級別的配置項,即在創(chuàng)建ECI Pod時,如果沒有額外配置,會采用eci-profile中的配置。
配置項 | 示例值 | 說明 |
enableClusterIp | "true" | 是否支持Cluster IP。 |
enableLinuxArm64Node | "false" | 是否開啟ARM節(jié)點。更多信息,請參見調(diào)度Pod到ARM架構(gòu)的虛擬節(jié)點。 |
enableLogController | "false" | 是否開啟SLS CRD日志采集功能。如果配置為true,還需配置 slsMachineGroup。 |
enablePVCController | "false" | 是否開啟云盤在線擴容功能。如果配置為true,則允許對綁定了云盤的PVC進行在線擴容。 |
enablePrivateZone | "false" | 是否使用PrivateZone進行域名解析。 |
enableReuseSSLKey | "false" | 是否開啟SSL Key復(fù)用。如果配置為true,則在創(chuàng)建ECI Pod時,會復(fù)用SSL Key來提升創(chuàng)建效率。 重要 默認情況下,創(chuàng)建ECI Pod時,VK會給每個ECI Pod下發(fā)不同的SSL證書,這在大批量創(chuàng)建時會影響效率。開啟SSL Key復(fù)用后,VK會給每個ECI Pod下發(fā)同一個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****