全部產品
Search
文件中心

Container Service for Kubernetes:配置eci-profile

更新時間:Sep 20, 2024

為了減少您對業務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

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

叢集層級配置項,支援熱更新。您可以根據需要更新配置項取值。

更新固定配置項

修改eci-profile的方式如下:

  • 通過kubectl edit命令

    kubectl edit configmap eci-profile -n kube-system
  • 通過Container Service管理主控台

    1. 登入Container Service管理主控台

    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****