Ack集群Terway網絡場景下的vSwitch擴容

2021.12.28

目录

  • 1、Terway 網絡介紹
  • 2、問題現象
  • 3、擴容操作
    • 3.1 新增交換機並配置 NAT
    • 3.2 配置集群的 Terway
    • 3.3 重啟 terway
       

      1、Terway 網絡介紹 

      Terway是阿里雲開源的基於專有網絡 VPC 的容器網絡接口CNI(Container Network Interface)插件,支持基於Kubernetes標準的網絡策略來定義容器間的訪問策略。可以通過使用Terway網絡插件實現Kubernetes集群內部的網絡互通

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

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

      一句話總結,Terway最大的特點就是藉助於雲上ECS服務器的特性,將pod與node的網絡進行了拉平,同時使用VPC下vSwitch中的ip

      2、問題現象

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

      這個時候新創建的pod狀態為ContainerCreating,describe查看pod提示error allocate ip...,這個時候查看Pod所在節點的Terway的日誌,會有下面內容

      1. 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密度越來越大,為了滿足Pod對IP地址日益增長的需求,建議創建給Pod使用的vSwitch的網絡位小於等於19,即每個網段中至少包含8192個可用IP地址
         

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

        3.2 配置集群的 Terway 

        配置集群的Terway,添加上面創建的vSwitch到Terway的ConfigMap配置中。

        1. kubectl -n kube-system edit cm eni-config 

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

          1. apiVersion: v1 
          2. kind: ConfigMap 
          3. metadata: 
          4.   name: eni-config 
          5.   namespace: kube-system 
          6. data: 
          7.   10-terway.conf: |- 
          8.     { 
          9.       "cniVersion": "0.3.0", 
          10.       "name": "terway", 
          11.       "type": "terway" 
          12.     } 
          13.   disable_network_policy: "true" 
          14.   eni_conf: |- 
          15.     { 
          16.       "version": "1",  # 版本 
          17.       "max_pool_size": 80,  # 资源池最大水位 
          18.       "min_pool_size": 20,  # 资源池最小水位 
          19.       "credential_path": "/var/addon/token-config", 
          20.       "vswitches": {"cn-shanghai-f":["vsw-AAA", "vsw-BBB"]},  # 关联的虚拟交换机(ENI多IP模式),添加vsw-BBB到VSwitches部分,其中vsw-AAA是已经存在的且IP资源不足的VSwitch 
          21.       "eni_tags": {"ack.aliyun.com":"xxxxxxxxx"}, 
          22.       "service_cidr": "172.16.0.0/16",  # 服务CIDR 
          23.       "security_group": "sg-xxxxxxx", # 安全组ID 
          24.       "vswitch_selection_policy": "ordered" 
          25.     } 

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

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

            3.3 重啟 terway

            重啟所有Terway的pod以便快速刷新緩存生效。

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

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

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

              1. # terway-cli mapping 
              2. Status | Pod Name                                               | Res ID                           | Factory Res ID 
              3. 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 
              4. ... 
              5. Idle   |                                                        | 00:16:10:48:3e:37.10.244.18.132 | 00:16:10:48:3e:37.10.244.18.132 
              6. Idle   |                                                        | 00:16:10:48:3e:37.10.244.18.18  | 00:16:10:48:3e:37.10.244.18.18 
              7. Idle   |                                                        | 00:16:10:48:3e:37.10.244.18.54  | 00:16:10:48:3e:37.10.244.18.54 

                See you ~