ack叢集Terway網路場景下的vSwitch擴容

語言: CN / TW / HK

1、Terway網路介紹

Terway 是阿里雲開源的基於專有網路VPC的容器網路介面 CNI (Container Network Interface)外掛,支援基於 Kubernetes 標準的網路策略來定義容器間的訪問策略。可以通過使用 Terway 網路外掛實現 Kubernetes 叢集內部的網路互通

Terway 網路外掛將原生的彈性網絡卡分配給 Pod 實現 Pod 網路,支援基於 Kubernetes 標準的網路策略(Network Policy)來定義容器間的訪問策略,併兼容 Calico 的網路策略

Terway 網路外掛中,每個 Pod 都擁有自己網路棧和 IP 地址。同一臺 ECS 內的 Pod 之間通訊,直接通過機器內部的轉發,跨 ECSPod 通訊,報文通過 VPC 的彈性網絡卡直接轉發。由於不需要使用 VxLAN 等的隧道技術封裝報文,因此 Terway 模式網路具有較高的通訊效能

一句話總結, Terway 最大的特點就是藉助於雲上 ECS 伺服器的特性,將 podnode 的網路進行了拉平,同時使用 VPCvSwitch 中的 ip

2、問題現象

由於使用了 Terway 網路模式,隨著 node 機器和 pod 數量的增多,每分配一個 ip 出去都需要消耗掉 vpcvsw 的可用 ip 。如果某短時間業務快速增長,導致 pod 大量消耗可用 ip ,這個時候就有可能因前期規劃不充足導致 vSwitch 的可用 ip 不足

這個時候新建立的 pod 狀態為 ContainerCreatingdescribe 檢視 pod 提示 error allocate ip... ,這個時候檢視 Pod 所在節點的 Terway 的日誌,會有下面內容

Message: The specified VSwitch "vsw-xxxxx" has not enough IpAddress.

提示沒有足夠的 ip ,這個時候基本都是由於交換機的 ip 不夠用,登入到交換機的控制檯可以檢視到這個節點所在的交換機的可用 ip 數,如果很少甚至為 0 ,就表示需要擴容了

3、擴容操作

3.1 新增交換機並配置NAT

在專有網路管理控制檯對應的 VPC 建立新的 vSwitch ,該 vSwitch 必須與 IP 資源不足的 vSwitch 在同一個區域。這是因為 Terway 分配給 pod ip 時的策略是,分配 node 所在可用區中的 vSwitch 對應的 ip ,因此,擴容就需要擴容同一可用區的交換機

在初始化叢集新建交換機以及擴容交換機的時候都應該考慮,因 Pod 密度越來越大,為了滿足 PodIP 地址日益增長的需求,建議建立給 Pod 使用的 vSwitch 的網路位小於等於 19 ,即每個網段中至少包含 8192 個可用 IP 地址

vSwitch 建立完成後,需要對這個 vSwitch 配置 NAT 策略,以便訪問外部網路

3.2 配置叢集的Terway

配置叢集的 Terway ,新增上面建立的 vSwitchTerwayConfigMap 配置中

kubectl -n kube-system edit cm eni-config

配置樣例參考 Terway配置參考 ,部分內容說明如下

apiVersion: v1
kind: ConfigMap
metadata:
  name: eni-config
  namespace: kube-system
data:
  10-terway.conf: |-
    {
      "cniVersion": "0.3.0",
      "name": "terway",
      "type": "terway"
    }
  disable_network_policy: "true"
  eni_conf: |-
    {
      "version": "1",  # 版本
      "max_pool_size": 80,  # 資源池最大水位
      "min_pool_size": 20,  # 資源池最小水位
      "credential_path": "/var/addon/token-config",
      "vswitches": {"cn-shanghai-f":["vsw-AAA", "vsw-BBB"]},  # 關聯的虛擬交換機(ENI多IP模式),新增vsw-BBB到VSwitches部分,其中vsw-AAA是已經存在的且IP資源不足的VSwitch
      "eni_tags": {"ack.aliyun.com":"xxxxxxxxx"},
      "service_cidr": "172.16.0.0/16",  # 服務CIDR
      "security_group": "sg-xxxxxxx", # 安全組ID
      "vswitch_selection_policy": "ordered"
    }

上面配置引數中,資源池水位的配置值。 Terway 使用底層虛擬化底層的網路資源打通容器網路,網路資源的建立和釋放需要一系列的 API 呼叫,如果在 Pod 建立銷燬時頻繁呼叫 API 會導致 Pod 配置時間較長。 Terway 通過池化的方式對資源進行快取,當小於資源的池的最小水位時自動補充資源,在大於資源池最大水位時開始釋放資源,這樣保障了高效的資源利用和分配的效率

相當於預先分配了 ip ,具體設定可以考慮到所在機器節點規格支援的最大 eni 輔助網絡卡個數以及最大 pod 數靈活設定

3.3 重啟terway

重啟所有 Terwaypod 以便快速重新整理快取生效

# kubectl -n kube-system delete pod -l app=terway-eniip
# kubectl -n kube-system get pod | grep terway

重啟後檢查異常的 pod 是否正常獲取了 ip 即可

當排查某個 podip 分配相關問題時,也可以通過進入到所在節點的 terway pod 中,執行命令列,檢視當前已分配的ip情況,以及已經從 vSwitch 分配得來後,暫時空閒的 ip 情況

# terway-cli mapping
Status | Pod Name                                               | Res ID                           | Factory Res ID
Normal | node-problem-detector-l5h52                            | 00:16:10:48:3e:37.10.244.18.167 | 00:16:10:48:3e:37.10.244.18.167
...
Idle   |                                                        | 00:16:10:48:3e:37.10.244.18.132 | 00:16:10:48:3e:37.10.244.18.132
Idle   |                                                        | 00:16:10:48:3e:37.10.244.18.18  | 00:16:10:48:3e:37.10.244.18.18
Idle   |                                                        | 00:16:10:48:3e:37.10.244.18.54  | 00:16:10:48:3e:37.10.244.18.54

See you ~