如果您希望為ACK叢集提供精細化的流量管理、流量隔離、網路原則配置和IP管理能力,可以通過使用Terway彈性網卡中繼(Trunk ENI)為每個Pod配置固定IP、獨立的虛擬交換器或安全性群組來實現。
背景資訊
為了給 Pod 配置固定 IP、獨立虛擬交換器及安全性群組,ACK提供基於彈性網卡ENI的網路方案。在 ACK 叢集中,主要通過兩種模式來使用 ENI:
獨佔 ENI 模式:每個 Pod 直接綁定一個獨立的 ENI,享有獨立的網路資源。此模式的網路隔離性較強,但會消耗較多的 ENI 配額,更適用於對網路效能與隔離要求較高的應用。
使用此模式時,需在建立節點池時配置獨佔 ENI 網路模式。
Trunk ENI 模式:通過節點上的中繼網卡(Trunk ENI)作為通道,為節點上的多個 Pod 動態提供輔助 ENI。此模式可以提升單節點的 Pod 部署密度,適用於大規模自訂網路設定的情境。
使用此模式時,需預先在叢集中啟用 Trunk ENI 功能。啟用後,叢集將自動部署 terway-controlplane 組件,負責管理自訂網路設定的生命週期與策略下發。其工作架構如下圖所示。
基於 Trunk ENI 模式,您還可以啟用Pod 自訂網路設定的能力,按需為部分關鍵 Pod 指定獨立的虛擬交換器、安全性群組和固定 IP,而叢集中其餘的 Pod 仍可沿用預設的共用網路設定,實現了靈活與精細化的管理。
使用限制
如果您的叢集為ACK專有叢集,需到配額平台申請容器網路支援Terway ENI Trunking模式。
單節點所支援的Pod數量有限制,關於節點所支援容器網路Pod數量的詳細描述,請參見使用Terway網路外掛程式。
Pod安全性群組規則不會應用到同節點Pod之間的流量以及同節點上節點與Pod之間的流量。如果您需要限制,可以通過NetworkPolicy進行配置。
Terway 版本要求:
如需升級Terway,請參見組件。
Trunk ENI 模式:Terway 版本 ≥ v1.3.0
獨佔 ENI 模式:Terway 版本 ≥ v1.11.0
此功能僅支援 ECS 執行個體。
資料鏈路
下面的資料路徑,描述了使用Trunk(中繼)網卡和獨佔ENI的差異。
Pod獨立配置使用範圍
Pod 獨立配置通過為每個 Pod 建立自己專屬的彈性網卡,為彈性網卡設定Pod 專屬的交換器、安全性群組實現。
Pod 獨立配置依賴下面兩種節點配置模式:
支援中繼網卡的節點 | 支援彈性網卡的節點(請參考為節點池配置獨佔ENI網路模式) | |
預設支援叢集類型 | ACK託管叢集 | ACK託管叢集,ACK專有叢集 |
部署密度 | 普通 Pod 使用共用 eni,指定 Pod 使用獨佔 eni,整體密度高 | 節點上所有 Pod 只能使用獨佔彈性網卡, 密度低 |
支援節點類型 | ECS 節點 | ECS 節點 |
機型 | 您需要選擇支援Trunk功能,且響應參數為 | 支援彈性網卡的機型 |
適用情境 | 成本敏感、低並發業務 | 高效能、低延遲、高並發業務 |
Kubernetes 資源限制 |
| |
步驟一:為叢集啟用Trunk ENI功能
為建立叢集啟用Trunk ENI功能
建立ACK叢集,網路外掛程式選擇Terway,在Terway模式中選中Trunk ENI支援,該模式的網路外掛程式類型為terway-eniip。詳細資料,請參見建立ACK專有叢集(已停止建立)和建立ACK託管叢集。
從Kubernetes 1.31開始,建立的ACK託管叢集預設開啟Trunk ENI支援,無需配置。
建立叢集一旦啟用Trunk ENI功能,則不再支援修改。
為已有叢集啟用Trunk ENI功能
前提條件
已有叢集的網路外掛程式類型為terway-eniip。關於Terway網路外掛程式的更多資訊,請參見使用Terway網路外掛程式。
可以在叢集的組件管理頁面查看您安裝的網路外掛程式類型。
使用限制
2020年06月之前建立的ACK託管叢集可能不支援此功能,請通過步驟一檢查是否支援。
固定IP及獨立虛擬交換器、安全性群組開啟後不可關閉。
步驟一:查看叢集是否支援使用Trunk ENI功能
ACK專有叢集需要額外申請Trunk執行個體使用許可權,請向ECS提交工單申請。
對於存量ACK託管叢集或是由ACK專有叢集遷移過來的ACK託管叢集,需要查看叢集是否支援使用Trunk ENI功能,並修改配置。無需額外申請Trunk執行個體使用許可權。
執行以下命令,檢查token配置。
kubectl get secret -nkube-system addon.network.token預期輸出如下所示:
NAME TYPE DATA AGE
addon.network.token Opaque 1 69m如果存在token配置,則執行下一步;如果不存在token配置,表明該叢集不支援使用Trunk ENI功能,請建立叢集支援Trunk ENI功能。
步驟二:開啟terway-eniip並為叢集啟用Trunk ENI功能
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在組件管理頁面,單擊網路頁簽,找到terway-eniip組件。
在terway-eniip卡片,單擊升級,升級terway-eniip組件到最新版本。
如果卡片上沒有升級字樣,說明當前組件已經是最新版本,請跳過此步驟。
開啟terway-eniip。
執行如下命令,編輯eni-config。
kubectl edit cm -nkube-system eni-config編輯YAML檔案的eni-config參數:
參數
值
說明
enable_eni_trunking
true
啟用Trunk ENI功能。開啟後不可關閉。
credential_path
/var/addon/token-config
對於ACK託管叢集,如果YAML檔案中不存在該參數,請自行添加。
重要請勿修改其他參數。
eni-config內容需要為合法JSON格式。
配置參數樣本如下:
apiVersion: v1 data: eni_conf: | { "min_pool_size": 0, "enable_eni_trunking": true, "credential_path": "/var/addon/token-config", ... } kind: ConfigMap執行如下命令,重啟terway pods,使配置生效。
kubectl delete pod -n kube-system -l app=terway-eniip
請在terway-eniip參數配置完成後,在組件管理頁面的網路頁簽,安裝terway-controlplane組件。
安裝結束後,在terway-controlplane卡片上可以看到已安裝字樣。
步驟二:建立網路自訂資源PodNetworking
Terway增加一種名為PodNetworking的自訂資源來描述網路設定。您可以建立多個PodNetworking來規劃不同的網路平面。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在自訂資源頁面,單擊資源定義(CustomResourceDefinition)頁簽,然後單擊使用YAML建立資源。
建立PodNetworking的樣本如下:
apiVersion: network.alibabacloud.com/v1beta1 kind: PodNetworking metadata: name: example spec: allocationType: type: Fixed # Pod IP分配的策略,可以取值為Elastic或Fixed。 releaseStrategy: TTL # 只有將type配置為Fixed時,releaseStrategy參數才有效;type的配置為Elastic時,無需配置releaseStrategy和releaseAfter參數。 releaseAfter: "1h" # 在releaseStrategy為TTL模式下,releaseAfter參數才有效。 selector: podSelector: matchLabels: foo: bar namespaceSelector: matchLabels: foo: bar securityGroupIDs: - sg-bpxxxx vSwitchOptions: - vsw-bpxxxx eniOptions: eniType: Default參數說明如下:
參數
說明
allocationType
(描述Pod IP分配的策略)
type
取值範圍:
Elastic:彈性IP策略。Pod刪除後,IP資源被釋放。
Fixed:固定IP策略。
啟用後,該PodNetworking對固定名稱的Pod生效。預設支援StatefulSet和無ownerReferences 的Pod使用。如果您需要設定自訂工作負載,請在組件管理對terway-controlplane進行配置。
說明如果您使用了固定IP策略,Pod重建後的可用性區域將被添加約束,來確保和第一次調度的可用性區域匹配。
releaseStrategy
IP釋放策略,只有將
type配置為Fixed時,該參數才有效。參數取值範圍如下。TTL:延遲釋放IP策略。當Pod被刪除一段時間後,才會釋放IP,最小值為5分鐘。Never:不釋放IP策略。當您無需使用IP時,需要自行刪除PodENI資源。
releaseAfter
延遲回收時間。僅在
releaseStrategy為TTL模式下生效,支援時間格式為Go time type,請使用h、m時間單位 ,例如2h45m、5m0s。關於Go time type,請參見Go time type。selector
(用於配置標籤選取器,被選中的Pod將使用該網路設定)
podSelector
用來匹配Pod的Labels,匹配的Pod在建立時將使用這個網路設定。
如果同時配置
podSelector與namespaceSelector,符合全部匹配規則的Pod在建立時將使用這個網路設定。您在配置Pod標籤與PodNetworking中的selector時,請確保有唯一匹配關係,如果Pod被多個PodNetworking配置所匹配,將使用任一匹配的PodNetworking配置。
namespaceSelector
用來匹配Namespace的Labels,匹配的Pod在建立時將使用這個網路設定。
如果同時配置
podSelector與namespaceSelector,符合全部匹配規則的Pod在建立時將使用這個網路設定。您在配置Pod標籤與PodNetworking中的selector時,請確保有唯一匹配關係,如果Pod被多個PodNetworking配置匹配,將使用任意匹配的PodNetworking配置。
vSwitchOptions
-
用於配置Pod使用的vSwitch,多個vSwitchID之間為或的關係。Pod僅能使用一個vSwitch,Terway將選擇一個合格vSwitch。
您的Pod部署的可用性區域將被添加約束,來確保這些可用性區域保持和您配置的vSwitchOptions列表中的可用性區域一致。
請確保vSwitchOptions中的vSwitch所在可用性區域與您指定調度的節點可用性區域一致,並且擁有足夠的剩餘IP資源,否則Pod將無法建立。
說明如果您同時啟用了節點自動調整,vSwitchOptions參數添加的可用性區域約束可能導致節點池擴容無法觸發,詳情請參見依賴特定可用性區域啟動並執行Pod無法觸發多可用性區域的節點池擴容 節點自動調整FAQ。
vSwitchSelectOptions
(配置交換器的選擇策略)
vSwitchSelectionPolicy
取值範圍:
ordered:預設,按填寫的交換器順序。most:優先使用剩餘IP多的交換器。random:隨機播放交換器。
說明從Terway v1.11.0開始支援。
securityGroupIDs
-
可配置多個安全性群組ID,配置多個安全性群組時將同時生效,安全性群組數量小於等於5個。
eniOptions
(配置Pod使用的彈性網卡類型)
eniType
取值範圍:
Default:預設,在共用ENI叢集,使用Trunk ENI,在獨佔ENI叢集,使用獨佔ENI。ENI:使用獨佔ENI。Trunk:使用Trunk ENI。
說明從Terway v1.11.0開始支援。
單擊建立。
建立PodNetworking資源後,Terway將同步網路設定資訊,只有在
status成為Ready後,該網路資源才能對Pod生效。執行以下命令,查看資源狀態是否
ready。kubectl describe PodNetworking example # 請將example換成您自己的自訂資源名稱。
(可選)步驟三:為命名空間添加匹配標籤
在部署PodNetworking自訂資源後,如果通過Namespace標籤將命名空間與PodNetworking的規則相匹配,需要為指定命名空間增加相同的標籤。
執行以下命令,建立測試命名空間example。
kubectl create ns example執行以下命令,為命名空間打上
foo=bar標籤。kubectl label namespaces example foo=bar # 請將example換成您自己指定命名空間名稱。執行以下命令,查看命名空間的標籤。
kubectl get namespace example --show-labels # 請將example換成您自己指定命名空間名稱。預期輸出如下。
NAME STATUS AGE LABELS example Active 24s foo=bar,kubernetes.io/metadata.name=example
(可選)步驟四:建立應用Pod
當建立Pod時,Pod將根據標籤與PodNetworking資源進行匹配。如果Pod沒有匹配到任何PodNetworking資源,它將預設使用ENI提供的IP。如果有匹配的PodNetworking,Pod將按照該資源定義的配置來分配ENI。
對於這類Pod,Terway將建立一個名為PodENI的CRD來跟蹤Pod所佔用的網路資源。這個資源由Terway管理。有關Pod標籤的更多資訊,請參見標籤。
使用以下樣本應用的YAML內容,建立名為my-nginx.yaml檔案。
apiVersion: apps/v1 kind: StatefulSet metadata: name: my-nginx # 執行個體應用的名稱。 namespace: example # 指定命名空間為example。 labels: app: nginx spec: serviceName: "nginx-service" replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx foo: bar # 為Pod添加foo: bar標籤。 spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # 如果StatefulSet需要持久化儲存,需要定義volumeClaimTemplates。 # 例如 # volumeClaimTemplates: # - metadata: # name: nginx-storage # spec: # accessModes: ["ReadWriteOnce"] # storageClassName: "my-storage-class" # resources: # requests: # storage: 1Gi執行以下命令,部署樣本應用my-nginx。部署完成後,驗證操作請參見如何判斷Pod是否使用了PodNetworking的網路設定?
kubectl apply -f my-nginx.yaml
ACK專有叢集遷移時,停止terway-controlplane
ACK專有叢集在啟用Pod自訂配置後,不能隨即轉移到ACK託管叢集Pro版。您需要在遷移前停止terway-controlplane,並在遷移後啟用terway-controlplane。
遷移前準備。
執行以下命令,停止terway-controlplane。
kubectl scale deploy -nkube-system terway-controlplane --replicas 0執行以下命令,完成webhook配置。
# 備份webhook配置。 kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.mutatingwebhookconfigurations.yaml kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.validatingwebhookconfigurations.yaml # 清理webhook配置。 kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml執行以下命令,完成service配置。
# 備份原有service配置 kubectl get service -nkube-system terway-controlplane -oyaml > terway-controlplane.service.yaml # 清理原有service配置 kubectl delete -f terway-controlplane.service.yaml
遷移叢集完成後,檢查遷移結果。
說明關於遷移叢集的具體操作,請參見熱遷移ACK專有叢集至ACK託管叢集Pro版。
如果遷移叢集失敗,執行以下命令,恢複webhook和terway-controlplane。
# 恢複service配置 kubectl apply -f terway-controlplane.service.yaml # 恢複webhook配置。 kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml # 恢複terway-controlplane。 kubectl scale deploy -nkube-system terway-controlplane --replicas 1如果遷移叢集成功,執行以下命令,清理資源。
kubectl delete deploy -nkube-system terway-controlplane
在組件管理頁面安裝terway-controlplane。具體操作,請參見管理組件。
常見問題
如何判斷Pod是否使用了PodNetworking的網路設定?
Pod建立後,在
annotations中將以k8s.aliyun.com/pod-networking作為索引值記錄建立該Pod時是否使用了PodNetworking資源。apiVersion: v1 kind: Pod metadata: annotations: k8s.aliyun.com/pod-eni: "true" k8s.aliyun.com/pod-networking: podnetworking labels: app: example pod-ip: elasticTerway將建立與Pod同名、同命名空間的PodENI資源,用於記錄所使用的網路設定資訊。
kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # 替換<my-nginx-0>為Pod名稱,<example>為Pod所處命名空間輸出內容如下,則說明Pod已經使用PodNetworking配置。
apiVersion: network.alibabacloud.com/v1beta1 kind: PodENI metadata: finalizers: - pod-eni generation: 1 name: <my-nginx-0> namespace: default spec: allocations: - allocationType: type: Elastic eni: id: eni-bp1xxxx mac: 00:16:xx:xx:xx:xx securityGroupIDs: - sg-bp1xxxx vSwitchID: vsw-bp1xxxx zone: cn-hangzhou-h ipv4: 192.168.x.x ipv4CIDR: 192.168.x.x/19 ipv6: 2408:x:x:x:x:x:x:x ipv6CIDR: 2408:x:x:x::/64 zone: cn-hangzhou-h status: eniInfos: eni-bp1xxxx: id: eni-bp1xxxx status: Bind vid: 1001 instanceID: i-bp1xxxx phase: Bind podLastSeen: "2021-xx-xxT00:00:00Z" trunkENIID: eni-bp1xxxx
Pod建立後為什麼沒有使用PodNetworking中的網路設定?
請確保PodNetworking資源狀態為
Ready。請確保Pod標籤和PodNetworking中的標籤可以唯一匹配。
如果您使用固定IP策略,則非StatefulSet控制器建立的Pod將無法被匹配。
相關文檔
您可以為彈性網卡(ENI)配置多個安全性群組,從而實現更靈活的Pod網路防火牆策略。具體操作,請參見為彈性網卡(ENI)配置多個安全性群組。
在使用過程中遇到容器網路相關問題,請參見容器網路FAQ。