如果您希望為ACK叢集提供精細化的流量管理、流量隔離、網路原則配置和IP管理能力,可以通過使用Terway彈性網卡中繼為每個Pod配置固定IP、獨立的虛擬交換器或安全性群組來實現。
背景資訊
彈性網卡中繼(Trunk ENI)是一種新的虛擬網卡。除了提供原有彈性網卡(ENI)相同的功能外,還支援將額外的ENI掛載到Trunk ENI上使用。這部分額外的ENI將以獨佔的方式分配給Pod。
在為叢集啟用Trunk ENI功能後,可以讓一部分Pod使用自訂配置,另外的Pod則使用共用配置。Pod自訂配置是可選功能,預設情況下建立的Pod使用的是共用ENI上的IP地址。只有當您主動聲明為指定Pod開啟自訂配置後,相應的Pod才能使用自訂配置。
啟用Pod自訂配置後,叢集內將部署terway-controlplane組件,其工作模式如下圖所示。
使用限制
如果您的叢集為ACK專有叢集,需到配額平台申請容器網路支援Terway ENI Trunking模式。
使用Terway外掛程式Trunk功能,您需要選擇支援Trunk功能,且響應參數為
EniTrunkSupported=true
的執行個體。關於執行個體支援情況,請參見DescribeInstanceTypes。單節點所支援的Pod數量有限制,關於節點所支援容器網路Pod數量的詳細描述,請參見使用Terway網路外掛程式。
Pod安全性群組規則不會應用到同節點Pod之間的流量以及同節點上節點與Pod之間的流量。如果您需要限制,可以通過NetworkPolicy進行配置。
步驟一:為叢集啟用Trunk ENI功能
ACK專有叢集需要額外申請Trunk執行個體使用許可權,請向ECS提交工單申請。ACK託管叢集無需額外申請Trunk執行個體使用許可權。
為建立叢集啟用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提交工單申請即可使用Trunk ENI功能。
對於存量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-enniip。
執行如下命令,編輯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管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在自訂資源頁面,單擊使用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 status: status: Ready
參數說明如下:
參數
說明
allocationType
(描述Pod IP分配的策略)
type
取值範圍:
Elastic:彈性IP策略。Pod刪除後,IP資源被釋放。
Fixed:固定IP策略。
啟用後,該PodNetworking只對有狀態(StatefulSet)的Pod生效。關於StatefulSet,請參見Kubernetes具狀態服務-StatefulSet使用最佳實務。
說明如果您使用了固定IP策略,Pod重建後的可用性區域將被添加約束,來確保和第一次調度的可用性區域匹配。
releaseStrategy
IP釋放策略,只有將
type
配置為Fixed
時,該參數才有效。參數取值範圍如下。TTL
:延遲釋放IP策略。當Pod被刪除一段時間後,才會釋放IP,最小值為5分鐘。Never
:不釋放IP策略。當您無需使用IP時,需要自行刪除PodENI資源。
releaseAfter
延遲回收時間。僅在
releaseStrategy
為TTL
模式下生效,支援時間格式為Go time type,例如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將無法建立。
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自訂資源後,需要為指定命名空間增加匹配的標籤,確保與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
遷移叢集完成後,檢查遷移結果。
說明關於遷移叢集的具體操作,請參見熱遷移ACK專有叢集至ACK叢集Pro版。
如果遷移叢集失敗,執行以下命令,恢複webhook和terway-controlplane。
# 恢複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: elastic
Terway將建立Pod同名、同命名空間的PodENI資源,用於記錄所使用的網路設定資訊。您可以通過以下方式查詢。
kubectl get podenis.network.alibabacloud.com your-pod-name -n default -oyaml apiVersion: network.alibabacloud.com/v1beta1 kind: PodENI metadata: finalizers: - pod-eni generation: 1 name: your-pod-name 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。