為了減少您對業務YAML的改動,ECI支援了eci-profile功能。eci-profile可以提供叢集維度ECI資源檢視,支援根據selector實現Pod編排。本文介紹如何配置eci-profile。
功能介紹
阿里雲Container ServiceACK通過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
通過Container Service管理主控台
在叢集頁面,找到目的地組群,單擊叢集名稱。
在叢集管理頁的左側導覽列,選擇組態管理>配置項。
選擇命名空間為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****