Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The difference between Kubenet and Azure CNI in AKS

The difference between Kubenet and Azure CNI in AKS

探討 AKS 創建過程中兩個不同的網路選項 Kubenet 以及 Azure CNI 的差異,以及實務上部署 AKS 的時候要注意的些許問題,特別是 VPC Network 的規劃以及 AKS 的規模是如何與這兩種模式息息相關

Hung-Wei Chiu

December 14, 2023
Tweet

More Decks by Hung-Wei Chiu

Other Decks in Technology

Transcript

  1. Azure Kubernetes Service • Azure Kubernetes Service(AKS) 是 Azure 提供的

    Kubernetes 託 管服務 • 與 Azure 高度整合,簡化各種 Kubernetes 操作上的煩惱 • 然而也因為高度整合,因此部署 AKS 上會遇到一些不清楚差異的選 項
  2. Azure Kubernetes Service • Kubernetes 是分散式架構 • 每個節點上都會運行一堆容器 • 如果直接複製常見

    Docker 運作方式的話,網路會有明顯的問題 • Gateway IP 重複,明顯封包不通
  3. Container Networking Interface • CNI 的目的就是兩個 • 分配 Pod IP

    • 讓 Pod 有能力上網 • 接下來嘗試使用這兩個選項來部署 AKS 看看!
  4. Kubenet CNI • 分配 Pod IP • 看起來每個節點都有自己的網段 • AKS

    本身設定 Pod CIDR (10.244.0.0/16) • 每個節點本身往下去切,變成 10.244.x.0/24 • 節點這樣計算起來可以跑 2^8 = 256 左右個 Pod • AKS 可以支援 255 個節點左右 • 需求超過怎麼辦? • 好好重創 Cluster • 初始設定就不要寫太小 • 假如一開始設定 10.244.0.0/8 • 理論上可以支援 65535 節點,但是實際上只能跑 400 個節點
  5. CNI • 擁有網路能力 • 基本上邏輯跟預設 Docker 一樣,都有一個 Linux Bridge 作為

    Gateway 來處理封包的轉發 • 不過問題反而是 Azure Network 又不理解 AKS 內的 Pod,怎麼知道 10.244.0.0/24, 10.244.1.0./24, 10.244.2.0/24 要轉發到哪些節點?
  6. UDR • User Defined Route • 當有新節點加入到 AKS 後,AKS 會偷偷的去創建一條

    UDR 的規則讓 Azure Network 知道要如何轉發這些 Pod 的封包 • 目前一個 Azure Network 內最多 400 條 UDR • 每個節點一條,意味最多支援 400 個節點
  7. KubeNet • 每個 Pod 都有屬於自己的私有網段 • 網路轉發概念簡單,依賴 UDR 動態新增路由 •

    但受限於 UDR 的限制,最多四百條規則 • 以預設每個節點最多 110 個 Pod 來說, 大概一個 AKS 最多就是 44k 個 Pod • 會有 SNAT 的介入 • 封包出去節點的時候會把 source IP 換成節點 IP • Pod 才可以存取其他外部服務 • 多餘的網路操作會造成一些效能影響 • 如果有多個 Azure Network 需要 Peering 的話,K8s Pod 網段一樣 會有 Route 問題
  8. Container Networking Interface • 回過來看看 Azure CNI • 到底 Azure

    CNI 打什麼如意算盤, 跟 Kubenet 有什麼不同?
  9. Container Networking Interface • 可以觀察到,這些 Pod 的 IP 與 Network

    的 IP 同網段 • Azure CNI 將網路直接打通 • 網段一樣,轉發更為簡單
  10. Container Networking Interface • Azure CNI 到底怎麼處理兩件事情的 • IP 分配

    • azure-vnet-ipam • https://github.com/Azure/azure-container-networking/blob/master/cni/ipam/ipam.go • 網路轉發 • azure-vnet • https://github.com/Azure/azure-container-networking/blob/master/cni/cni.go • IP 分配必須要跟網路一致,同時又要確保每個節點上拿到的 IP 是唯 一的,不能有衝突
  11. IPAM • Azure CNI 希望跟 Azure Virtual Network 共享 IP

    • 每個 Pod 分配的 IP 都屬於 Azure Virtual Network • 這意味 IPAM 分配過程必須要有辦法取得 IP • 同時也要確保其他節點分配的 Pod 不會有重複 IP
  12. IPAM • Azure 環境中有一個虛擬 IP, 168.63.129.16 • Azure resource 可以透過該

    IP 跟 Azure 溝通來獲取一些系統資源 • http://168.63.129.16/machine/plugins?comp=nmagent&type=getinterf aceinfov1
  13. IPAM • 相對於前述 Kubenet 是採取 Private IP 制度, Azure CNI

    直接共用 Azure Virtual Network 會有什麼限制? • Azure Virtual Network Subnet 的數量不能太小,不然你 Pod 會跑 不起來 • 每個節點多少 IP • 每個 Cluster IP • 其他服務是不是也需要用到 IP ?
  14. IPAM • 假設需要跑 150 個節點 • 每個節點 30 Pod •

    150*30 = 4500, 最小容納範圍就是 8192,所以至少要比 /19 大 • 若每個節點 110 Pod • 150 * 110 = 16500, 最小容納範圍就是 16384, 所以至少要比 /18 大 • 若每個節點 250 Pod • 150 * 250 = 37500, 最小容納範圍就是 65536, 所以至少要比 /16 大 • 因此若採用 Azure CNI 作為 Production 一定要仔細規劃 VPC 的大 小,否則未來 IP 不夠就很麻煩了。
  15. Network Route • Azure CNI 由於所有的 Pod 都一樣,這種情況下路由就會變得相對 簡單 •

    目標是自己節點上的 Pod,直接轉發過去 • 否則就往外送,讓 Azure Network 去處理後續轉發流程
  16. Azure CNI • IP 共享 Azure Network • 沒有規劃好可能會導致網路中的IP都被 Pod

    用光 • IP 被用光非常麻煩 • 事先規劃非常重要,但是實務上又不容易,畢竟很難預估業務成長 • 其他服務可以直接存取 Pod • Azure CNI 後來新增兩種模式來處理這個問題
  17. Azure CNI • Azure-CNI-Overlay • 回歸到與 Kubenet 一樣的分配 IP 方式,但是整個網路存取的部分與

    Azure 有更高度的整合,因此效能上更好 • Azure-CNI Dynamic • Azure Network Subnet 裡面可以設定將 Node 與 Pod 使用的 subnet 分別 開來,設定上更彈性
  18. Azure CNI 情境 Kubenet Azure CNI Azure CNI Overlay Pod

    to Pod 可以 可以 可以 Pod to VM 可以 可以 可以 VM to Pod 不可以 可以 不可以 IP 分配 私有 IP 共享 Network 私有 IP 路由 仰賴 UDR Network 直接處理 特別處理 叢集規模(節點) 400 看網路大小與節點 Pod 數量 1000 Pod 數量/節點 250 250 250