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

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
地址

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

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單元測試