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 ~