ack集羣Terway網絡場景下的vSwitch擴容
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4b96486d2cfaee7b772748330705c281cae05b3bd98477fd611289aaf8768f31b4.jpg)
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
的日誌,會有下面內容
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
地址
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229beca325b5f584ac9ce75bc46fdd7f300fdb1a883707d2c3840e3e5d077cef5980.jpg)
vSwitch
創建完成後,需要對這個 vSwitch
配置 NAT
策略,以便訪問外部網絡
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4b2ba63af74f30c19b2ca809789ea9e7d5136aefbc5bd8182bdf8b8cdaa9e231c7.jpg)
3.2 配置集羣的Terway
配置集羣的 Terway
,添加上面創建的 vSwitch
到 Terway
的 ConfigMap
配置中
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
重啟所有 Terway
的 pod
以便快速刷新緩存生效
# kubectl -n kube-system delete pod -l app=terway-eniip # kubectl -n kube-system get pod | grep terway
重啟後檢查異常的 pod
是否正常獲取了 ip
即可
當排查某個 pod
的 ip
分配相關問題時,也可以通過進入到所在節點的 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 ~
- Gradle打包工具入門
- 服務網格和Istio初識-續
- 服務網格和Istio初識
- Golang與非對稱加密
- ack集羣Terway網絡場景下的vSwitch擴容
- Golang與對稱加密
- 基於ack k8s集羣調度的方案設計
- 基於Dockerfile構建容器鏡像的最佳實踐
- Golang反射-下篇
- Golang反射-上篇
- Azure DevOps的使用入門
- Golang接口類型-下篇
- Golang接口類型-上篇
- 基於Python實現原生的登錄驗證碼
- Golang開發命令行工具之flag包的使用
- Golang文件操作-下篇
- k8s環境下處理容器時間問題的多種姿勢
- Golang基準測試
- 淺談Prometheus的數據存儲
- Golang單元測試