作者:若禾、昱晟、瑜佳
記者: 各位阿里巴巴雲原生的讀者朋友們大家好,歡迎再次來到探究身世之謎系列專訪欄目,今天邀請來的還是大家的老朋友,『阿里雲容器服務 ACK 發行版』,上次的訪談中它為我們介紹了阿里巴巴開源叢集映象技術 sealer,以及它們是如何相互配合來達成阿里雲 ACK 服務的快速穩定交付。錯過的讀者不要忘記去回顧一下哦~那麼這次做客,它又會為我們介紹哪位小夥伴呢?
阿里雲容器服務 ACK 發行版(簡稱 ACK Distro) :大家好,我們又見面了!相信經過上次的自我介紹,你們對我已經有了大概的瞭解,這次就不多贅述了。本次採訪我將繼續為大家詳細講解我的好夥伴:阿里巴巴的開源 Kubernetes 容器網路解決方案 hybridnet,以及我是如何藉助它來構建混合雲統一網路平面。
記者: 好的,那您請先談一下 hybridnet 是什麼以及專案組成員是出於怎樣的設計理念才誕生了 hybridnet。
hybridnet 的定義及其設計理念
ACK Distro: 好的,首先 hybridnet 是阿里巴巴開源的一款面向混合雲場景的 Kubernetes 容器網路解決方案。它可以幫助使用者在物理機和虛擬機器的異構環境之上,構建一層 underlay + overlay 的統一網路平面,並提供豐富的管控運維能力。同時為混合雲場景下叢集部署和應用交付過程中出現的容器網路部署及運維問題,提出了一種全新的解決思路。
它的基本設計準則是:
- 為了確定統一網路模型,降低認知與維護成本,並且保證穩定的長期演進
- 遮蔽底層異構基礎設施,提升交付落地魯棒性,降低生產交付、PoC 成本
- 在統一模型的約束下,既能提供 underlay 高效能直通網路方案,來滿足網路打通和效能的雙重需求,又能支援在某些效能不敏感的場景下提供 overlay 虛擬網路方案
- 儘量降低對於外部環境的依賴,保證資料面的簡單
- 與 Kubernetes 深度整合,提供雙棧、IP 保持、IP 固定等高階 IPAM 能力,保證使用者上雲後使用習慣不變
不同於與單一 IaaS 廠商的公有云或專有云底座繫結輸出的 terway、aws-cni 等容器網路方案,專案組成員希望 hybridnet 能夠解決多雲混合雲場景下異構底座帶來的一致性和適配性難題,在不同的基礎網路環境上提供敏捷、通用和穩定的交付能力,並且通過統一視角的模型約束和運維管控,解決複雜場景下的網路規劃、管理及運維等問題。
記者: 那我是不是可以這麼理解,hybridnet 力求做到“underlay/overlay 混合部署” 和“underlay/overlay 統一管理運維”。
ACK Distro: 是的沒錯,hybridnet 也確實做到了。我可以再擴充描述下,在一個使用了 hybridnet 的 Kubernetes 叢集中,同一個節點上可以同時有 underlay 和 overlay的 Pod,所有 Pod 之間的叢集內部訪問行為完全一致不需要任何額外感知。這樣,使用者可以在“純 overlay 叢集”、“純 underlay 叢集”、“underlay 混合叢集” 之間進行自由選擇和轉化,同時享受 underlay 網路帶來的高效能和網路直通能力,以及 overlay 網路的資源無限和高適配性。而且在統一模型的約束下,underlay 網路和 overlay 網路在管理、運維上也保持了概念一致。
記者: 除了它的設計理念,您可以用更直觀的方法讓讀者明白 hybridnet 可以做什麼嗎?
ACK Distro: 當然,我從介紹它的核心模型入手闡釋其功能屬性吧~為了使 hybridnet 的使用者可以通過初始化不同的核心模型來對基礎網路環境進行靈活多樣地描述,讓容器網路以不同的形態執行,專案組成員通過對經典網路中的概念進行抽象,引入了下面三個核心 CRD 模型來對網路資源進行抽象和管理。
hybridnet 的核心模型
Network
在 hybridnet 中,每個 Network 表示一個“排程域“,一個排程域表示一組具有相同網路性質的節點,Network 是環境拓撲資訊傳入的主要入口。一個特定的 IP 可以在其所屬排程域內的各個節點間自由遷移。
Network 通過 nodeSelector 與節點相關聯,對於一些特殊的 Network,比如 overlay 的 Network,nodeSelector 可能為空,這種 Network 的排程域為叢集內的所有節點。
Subnet
在 hybridnet 中,Subnet 表示一個排程域內可以分配的 IP 資源,Subnet 是環境網路 IP 資源規劃資訊傳入的主要入口。每個 Subnet 必須屬於一個 Network。Subnet 具有比較靈活的屬性:
- 支援 cidr 可分配地址範圍的選擇,通過 spec.range.start 和 spec.range.end 可以從一個 cidr 中再精確地劃分出一個小的網段
- 支援保留離散的 IP 地址不分配,當網段中已經有 IP 地址被使用了的時候,可以通過將已經被使用了的 IP 填寫入 spec.range.excludeIPs 的陣列欄位,hybridnet 將不會再將這些 IP 分配給 Pod
- 支援保留指定的 IP 不被使用,當網段中需要保留某些 Pod 的 IP,僅被特定的 Pod 指定使用時,可以通過將這些 IP 填寫入 spec.range.reservedPs 的陣列欄位,hybridnet 將不會再把這些 IP 用於非指定 IP 的分配
IPInstance
IPInstance 目前只用作監控,每個 IPInstance 代表一個實際已經被分配出容器網路的 IP。能夠通過 kubectl get IPInstance 看到其對應的 Pod、所屬 Subnet、Pod 對應的節點等等資訊。
記者:那麼 hybridnet 的優勢如何在您身上體現呢?換句話說,您怎樣管理 hybridnet 以達到最佳實踐呢?
如何在 ACK Distro 中管理 hybridnet
ACK Distro: 我通過操作上述的 CRD 模型來為大家進行網路管理操作示例吧~其中,hybridnet 會作為我唯一內建的網路外掛部署。(當然啦,通過 sealer 的能力,自定義第三方的網路外掛也是可行的,大家可以參考本系列第一篇文章。)
預設行為
作為我的固定行為,初始化一定會存在一個 overlay 的 Network,並且此時預設網路型別是 overlay,通過下面命令可以檢視此時的 Network 和 Subnet 資訊:
[root@iZf8zdygpbo4hx57g2wahaZ ~]# kubectl get network
NAME NETID SWITCHID
network-0 4 virtual-switch
[root@iZf8zdygpbo4hx57g2wahaZ ~]# kubectl get subnet
NAME VERSION CIDR START END GATEWAY TOTAL USED AVAILABLE NETID NETWORK
subnet-0-network-0 4 100.64.0.0/16 100.64.0.1 65533 2 65531 network-0
大家可以看到,用預設配置初始化的我會建立一個名叫 network-0 的 Network 和 subnet-0-network-0 的 Subnet,容器網段的 CIDR 為 100.64.0.0/16,此時新建立的 Pod 都會以 overlay 的方式拉起。
因為我的基礎元件本身沒有特別的網路訴求,這樣最大的好處是,overlay 網路幫助我遮蔽了底層基礎網路設施,換言之,我可以藉助 hybridnet 以相同的配置在任何網路環境中一鍵拉起,同時並不影響後續網路擴充套件的可能性。
從混合雲環境的交付經驗來看,這種方式能將網路規劃(主要是 underlay 網路)延後到“運維”的階段,可以最小化“交付”階段的落地成本,提升部署效率。
新增 underlay 網路
如果存在部分 underlay 網路訴求(比如出於“overlay 效能瓶頸” 或者 “Pod IP 對外直接透出能力”的考慮),underlay Pod 佔比較少,特別是您不希望佔用基礎網路環境中的 IP 資源時,可以選擇在預設行為建立的 overlay Network 之外,額外新增一個 underlay 的 Network 以及對應的 Subnet。(新舊 overlay/underlay Network 在模型上沒有任何依賴順序關係)
在這次示例的實驗環境中,節點網段為 192.168.56.0/24(所有節點在一個經典二層網路中),因為節點 IP 只用了 192.168.56.1、192.168.56.2、192.168.56.3、192.168.56.4,我們考慮將未被使用的 192.168.56.100~192.168.56.150 地址範圍留給容器使用,搭建一個最簡單的 underlay 網路。這種情況我們只需要應用如下 yaml:
---
apiVersion: networking.alibaba.com/v1
kind: Network
metadata:
name: underlay-network1
spec:
netID: 0
nodeSelector:
network: network1
type: Underlay
---
apiVersion: networking.alibaba.com/v1
kind: Subnet
metadata:
name: underlay-subnet1
spec:
network: underlay-network1
netID: 0
range:
version: "4"
cidr: "192.168.56.0/24"
gateway: "192.168.56.254"
start: "192.168.56.100"
end: "192.168.56.150"
因為 Network 通過 nodeSelector 關聯 Node,我們需要給想要部署 underlay Pod 的節點打上對應 Network nodeSelector 的標籤,這裡我們只希望在節點 izf8zdygpbo4hx57g2wah8z 上有 underlay 型別的 Pod:
kubectl label node izf8zdygpbo4hx57g2wah8z network=network1
此時預設網路型別仍然是 overlay 網路,建立 underlay 的 Pod 只需要簡單通過給 Pod 新增 networking.alibaba.com/network-type: Underlay 的 annotation 指定。效果如圖:
[root@iZf8zdygpbo4hx57g2wahaZ ~]# kubectl get po -owide -n test
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
curl-deployment-1-5cfb5dcb8c-65fr7 1/1 Running 0 11m 100.64.0.29 izf8zdygpbo4hx57g2wahbz <none> <none>
curl-deployment-1-5cfb5dcb8c-hp626 1/1 Running 0 11m 100.64.0.26 izf8zdygpbo4hx57g2wahbz <none> <none>
curl-deployment-1-5cfb5dcb8c-qbr6w 1/1 Running 0 11m 100.64.0.27 izf8zdygpbo4hx57g2wah7z <none> <none>
curl-deployment-1-5cfb5dcb8c-zclv2 1/1 Running 0 11m 100.64.0.31 izf8zdygpbo4hx57g2wahbz <none> <none>
curl-deployment-1-5cfb5dcb8c-zfqkp 1/1 Running 0 11m 100.64.0.28 izf8zdygpbo4hx57g2wah7z <none> <none>
curl-ss-0 1/1 Running 0 6m24s 192.168.56.140 izf8zdygpbo4hx57g2wah8z <none> <none>
curl-ss-1 1/1 Running 0 6m5s 192.168.56.141 izf8zdygpbo4hx57g2wah8z <none> <none>
curl-ss-2 1/1 Running 0 6m1s 192.168.56.142 izf8zdygpbo4hx57g2wah8z <none> <none>
修改預設網路型別為 underlay
如果您 underlay 的網路訴求佔絕大多數,希望預設建立出來的就是 overlay 的 Pod,也可以修改預設網路型別為 underlay,修改完之後,預設會以 underlay 的網路建立 Pod,並且仍然可以通過給 Pod 新增 annotation 的方式指定 Pod 以 overlay 的網路被建立。已經建立的 overlay Pod 不會受到影響。
修改預設網路型別需要分別 kubectl edit deploy hybridnet-webhook -n kube-system 和 kubectl edit deploy hybridnet-manager -n kube-system,修改容器啟動的 DEFAULT_NETWORK_TYPE 環境變數為 Underlay:
spec:
containers:
- name: hybridnet-[manager|webhook]
command:
- /hybridnet/hybridnet-[manager|webhook]
env:
- name: DEFAULT_NETWORK_TYPE
# "Overlay" or "Underlay",
# default "Underlay" if environment variable not configured.
value: Underlay
這樣修改完之後,Pod 將會預設以 underlay 的方式被建立,新的 underlay Pod 與原有 overlay Pod 的網路連通性不受影響(簡單來說,相當於 underlay Pod 會有一個與其他 overlay Pod 通訊的 overlay 的身份)。**
新增/刪除網路資源
就如同上面示例中展示的,新增 Network/Subnet 的網路資源只需要應用對應 CR 的 yaml 即可,一旦 Network/Subnet 被應用,hybridnet 會認為環境中已經完成基礎網路配置,並且使用對應 CR 進行網路資源分配。
出於安全形度考慮,刪除 Network/Subnet 的操作是有基本約束的。只有當 Subnet 中沒有 IP 在被使用時,Subnet 本身才能被刪除;同理,只用先刪除 Network 中的所有 Subnet,Network 本身才能被刪除。
ACK Distro:總而言之,藉助 hybridnet ,我可以使阿里雲容器服務 ACK 在異構環境之上,構建一層 underlay + overlay 的統一網路平面,提高管控運維能力,為廣大的開發者帶來更好的容器服務體驗。
記者: 好的,十分感謝您這次的細心講解,第二彈深度訪談到這裡又要跟大家說再見了,期待下次與讀者朋友們的相遇。
ACK Distro: 我們下次再見!
相關連結
[1] hybridnet 開源倉庫地址
https://github.com/alibaba/hybridnet
[2] hybridnet 社群文件
https://github.com/alibaba/hybridnet/wiki
[3]ACK Distro 官網
https://www.aliyun.com/product/aliware/ackdistro
[4] ACK Distro 官方 GitHub[]
https://github.com/AliyunContainerService/ackdistro
往期推薦
1、讓創新觸手可及,阿里雲容器服務 ACK 發行版開放免費下載
2、與阿里雲容器服務 ACK 發行版的深度對話第一彈:如何藉助 sealer 實現快速構建 & 部署
瞭解更多相關資訊,請掃描下方二維碼或搜尋微訊號(AlibabaCloud888)新增雲原生小助手!獲取更多相關資訊!