与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面
作者:若禾、昱晟、瑜佳
記者: 各位阿里巴巴云原生的讀者朋友們大家好,歡迎再次來到探究身世之謎系列專訪欄目,今天邀請來的還是大家的老朋友,『阿里云容器服務 ACK 發行版』,上次的訪談中它為我們介紹了阿里巴巴開源集群鏡像技術 sealer,以及它們是如何相互配合來達成阿里云 ACK 服務的快速穩定交付。錯過的讀者不要忘記去回顧一下哦~那么這次做客,它又會為我們介紹哪位小伙伴呢?
阿里云容器服務 ACK 發行版(簡稱 ACK Distro) :大家好,我們又見面了!相信經過上次的自我介紹,你們對我已經有了大概的了解,這次就不多贅述了。本次采訪我將繼續為大家詳細講解我的好伙伴:阿里巴巴的開源 Kubernetes 容器網絡解決方案 hybridnet,以及我是如何借助它來構建混合云統一網絡平面。
記者: 好的,那您請先談一下 hybridnet 是什么以及項目組成員是出于怎樣的設計理念才誕生了 hybridnet。
hybridnet 的定義及其設計理念
ACK Distro: 好的,首先 hybridnet 是阿里巴巴開源的一款面向混合云場景的 Kubernetes 容器網絡解決方案。它可以幫助用戶在物理機和虛擬機的異構環境之上,構建一層 underlay + overlay 的統一網絡平面,并提供豐富的管控運維能力。同時為混合云場景下集群部署和應用交付過程中出現的容器網絡部署及運維問題,提出了一種全新的解決思路。
它的基本設計準則是:
不同于與單一 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: 0nodeSelector:network: network1type: Underlay--- apiVersion: networking.alibaba.com/v1 kind: Subnet metadata:name: underlay-subnet1 spec:network: underlay-network1netID: 0range: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)添加云原生小助手!獲取更多相關資訊!
?? 發布云原生技術最新資訊、匯集云原生技術最全內容,定期舉辦云原生活動、直播,阿里產品及用戶最佳實踐發布。與你并肩探索云原生技術點滴,分享你需要的云原生內容。
關注【阿里巴巴云原生】公眾號,獲取更多云原生實時資訊!
總結
以上是生活随笔為你收集整理的与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鉴机识变,面向未来|RocketMQ S
- 下一篇: 企业深入使用微服务后会面临哪些问题?云原