云原生 Spiderpool:基于跨越網(wǎng)絡(luò)區(qū)域的 IP 分配
Underlay 網(wǎng)絡(luò)是底層基礎(chǔ)網(wǎng)絡(luò),具有低延遲、可靠、安全等特性。這些特性能滿足一些延時敏感的應用業(yè)務需求、提供優(yōu)質(zhì)的用戶體驗以及有效管理和保護網(wǎng)絡(luò)資源,通常應用在延時敏感、防火墻安全管控中:
- 延時敏感的應用:某些特定行業(yè)或應用(如金融交易、實時視頻傳輸?shù)龋W(wǎng)絡(luò)延遲非常敏感。在這種情況下,Underlay 網(wǎng)絡(luò)可以提供更低的延遲,通過直接控制物理和鏈路層的連接來減少數(shù)據(jù)傳輸?shù)臅r間。這種低延遲的特性使得 Underlay 網(wǎng)絡(luò)成為滿足這些應用需求的理想選擇。
- 防火墻安全管控:在集群中,防火墻通常用于管理南北向通信,即集群內(nèi)部和外部網(wǎng)絡(luò)之間的通信。為了實現(xiàn)安全管控,防火墻需要對通信流量進行檢查和過濾,并對出口通信進行限制。在這種情況下,通過 Underlay 網(wǎng)絡(luò)的 IPAM 對應用固定出口 IP 地址,可以更好地管理和控制集群與外部網(wǎng)絡(luò)之間的通信,提高網(wǎng)絡(luò)的安全性。
隨著數(shù)據(jù)中心私有云的不斷普及,Underlay 網(wǎng)絡(luò)作為數(shù)據(jù)中心網(wǎng)絡(luò)架構(gòu)的重要組成部分,已經(jīng)被廣泛應用于數(shù)據(jù)中心的網(wǎng)絡(luò)架構(gòu)中,以提供更高效的網(wǎng)絡(luò)傳輸和更好的網(wǎng)絡(luò)拓撲管理能力。
01跨網(wǎng)絡(luò)區(qū)域的 IP 地址分配需求
筆者最近在使用 Underlay 網(wǎng)絡(luò)時,遇到了這樣的場景:有一個集群,但集群的節(jié)點分布在不同地區(qū)或數(shù)據(jù)中心,一些節(jié)點的區(qū)域只能使用子網(wǎng) 10.6.1.0/24,一些節(jié)點的區(qū)域只能使用子網(wǎng) 172.16.2.0/24, 在此背景下,當一個應用跨子網(wǎng)部署副本時,要求 IPAM 能夠在不同的節(jié)點上,為同一個應用下的不同 Pod 分配出與子網(wǎng)匹配的 IP 地址,且能正確運行。對此,希望能通過 IP 地址管理(IPAM)實現(xiàn)跨網(wǎng)絡(luò)區(qū)域的 IP 分配,為應用程序提供靈活的部署和擴展性。
該場景的網(wǎng)絡(luò)拓撲圖如下:
通過上述場景,在 Underlay 網(wǎng)絡(luò)下,同一應用的不同副本之間實現(xiàn)跨域網(wǎng)絡(luò)的 IP 地址分配是生產(chǎn)場景中常見且需要去解決的需求。開源社區(qū)中的一個 Kubernetes 的 IPAM 插件項目:Spiderpool,帶來一種全新的解決方案,它可以靈活而智能地實現(xiàn)跨網(wǎng)絡(luò)區(qū)域的 IP 分配,一起來了解一下。
02全新解決方案:Spiderpool
Spiderpool (https://github.com/spidernet-io/spiderpool) 是一個 Kubernetes 的 IPAM 插件項目,其主要針對于 Underlay 網(wǎng)絡(luò)的 IP 地址管理需求而設(shè)計,能夠為任何兼容第三方 IPAM 插件的 CNI 項目所使用。而基于跨越網(wǎng)絡(luò)區(qū)域的 IP 分配是 Spiderpool 的一個重要功能支持,同時它還包括應用 IP 地址固定、IP 地址自動彈性擴縮容、多網(wǎng)卡、雙棧支持等特點。更多說明參考 Spiderpool 功能 (https://github.com/spidernet-io/spiderpool/blob/main/README-zh_CN.md) 介紹。
03環(huán)境
為演示 Spiderpool 的跨網(wǎng)絡(luò)區(qū)域分配 IP 的能力,筆者準備了一套跨網(wǎng)絡(luò)區(qū)域的集群,并為節(jié)點打上可用的子網(wǎng)標簽,以下是所使用的集群信息:
~# kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP
controller-node-1 Ready control-plane 1h v1.25.3 10.6.168.71 <none>
worker-node-1 Ready <none> 1h v1.25.3 10.7.168.73 <none>
~# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
controller-node-1 Ready control-plane,master 1h v1.25.3 node-subnet=subnet-6, ...
worker-node-1 Ready <none> 1h v1.25.3 node-subnet=subnet-7, ...
以下是筆者集群的網(wǎng)絡(luò)拓撲圖:
04安裝
根據(jù) Spiderpool 的官方文檔: https://github.com/spidernet-io/spiderpool/blob/main/docs/usage/get-started-macvlan-zh_CN.md 搭建了一套 Multus 、Macvlan、Veth 、Spiderpool 的環(huán)境,以下是根據(jù)自身環(huán)境已創(chuàng)建的 SpiderSubnet 實例:
~# kubectl get spidersubnet
NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT
subnet-6 4 10.6.0.0/16 0 10
subnet-7 4 10.7.0.0/16 0 10
以下示例中將會創(chuàng)建 Multus 的 network-attachment-definition 配置: macvlan-conf,其中:
- master:在此示例用接口 ens192 作為 master 的參數(shù),注意的是跨網(wǎng)絡(luò)區(qū)的不同節(jié)點的接口名稱需一致,此參數(shù)應與集群節(jié)點上的接口名稱匹配。
cat <<EOF | kubectl apply -f -
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
namespace: kube-system
spec:
config: |-
{
"cniVersion": "0.3.1",
"name": "macvlan-conf",
"plugins": [
{
"type": "macvlan",
"master": "ens192",
"mode": "bridge",
"ipam": {
"type": "spiderpool"
}
},{
"type": "veth",
"service_cidr": ["10.233.0.0/18"]
}
]
}
EOF
05創(chuàng)建 IPPools
Spiderpool 的 CRD:SpiderIPPool 提供了 nodeAffinity 字段,當 Pod 在某個節(jié)點上啟動,嘗試從 SpiderIPPool 分配 IP 時,若 Pod 所在節(jié)點符合該 nodeAffinity 設(shè)置,則能從該 SpiderIPPool 中成功分配出 IP,否則無法從該 SpiderIPPool 中分配出IP。
依據(jù)如上所述,使用如下的 Yaml,創(chuàng)建 2 個 SpiderIPPool,它們將為不同節(jié)點上的 Pod 提供 IP 地址。
~# cat <<EOF | kubectl apply -f -
apiVersion: spiderpool.spidernet.io/v2beta1
kind: SpiderIPPool
metadata:
name: test-ippool-6
spec:
subnet: 10.6.0.0/16
ips:
- 10.6.168.60-10.6.168.69
gateway: 10.6.0.1
nodeAffinity:
matchExpressions:
- {key: node-subnet, operator: In, values: [subnet-6]}
---
apiVersion: spiderpool.spidernet.io/v2beta1
kind: SpiderIPPool
metadata:
name: test-ippool-7
spec:
subnet: 10.7.0.0/16
ips:
- 10.7.168.60-10.7.168.69
gateway: 10.7.0.1
nodeAffinity:
matchExpressions:
- {key: node-subnet, operator: In, values: [subnet-7]}
EOF
06創(chuàng)建應用
以下的示例 Yaml 中, 會創(chuàng)建一個 daemonSet 應用,其中:
- ipam.spidernet.io/ippool:用于指定 Spiderpool 的 IP 池,可以設(shè)置多個 IP 池用作備選池,Spiderpool 會按照 "IP 池數(shù)組" 中元素的順序依次嘗試分配 IP 地址,在節(jié)點跨網(wǎng)絡(luò)區(qū)域的場景分配 IP 時,如果應用副本被調(diào)度到的節(jié)點,符合第一個 IP 池的 _**IPPool.spec.nodeAffinity**_ 注解, Pod 會從該池中獲得 IP 分配,如果不滿足,Spiderpool 會嘗試從備選池中選擇 IP 池繼續(xù)為 Pod 分配 IP ,直到所有備選池全部篩選失敗。可以通過[備選池](https://github.com/spidernet-io/spiderpool/blob/main/docs/usage/ippool-multi.md) 了解更多用法。
- v1.multus-cni.io/default-network:用于指定 Multus 的 NetworkAttachmentDefinition 配置,會為應用創(chuàng)建一張默認網(wǎng)卡。
~# cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: test-app
spec:
selector:
matchLabels:
app: test-app
template:
metadata:
annotations:
ipam.spidernet.io/ippool: |-
{
"ipv4": ["test-ippool-6", "test-ippool-7"]
}
v1.multus-cni.io/default-network: kube-system/macvlan-conf
labels:
app: test-app
spec:
containers:
- name: test-app
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
EOF
完成創(chuàng)建后,可以發(fā)現(xiàn) Pod 的 IP 屬于 Pod 所在節(jié)點的子網(wǎng)內(nèi),所對應的 IP 池為應用的不同副本分配了 IP 地址。
~# kubectl get po -l app=test-app -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-app-j9ftl 1/1 Running 0 45s 10.6.168.65 controller-node-1 <none> <none>
test-app-nkq5h 1/1 Running 0 45s 10.7.168.61 worker-node-1 <none> <none>
~# kubectl get spiderippool
NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT DEFAULT DISABLE
test-ippool-6 4 10.6.0.0/16 1 10 false false
test-ippool-7 4 10.7.0.0/16 1 10 false false
跨網(wǎng)絡(luò)區(qū)域的 Pod 與 Pod 之間的通訊情況:
~# kubectl exec -ti test-app-j9ftl -- ping 10.7.168.61 -c 2
PING 10.7.168.61 (10.7.168.61) 56(84) bytes of data.
64 bytes from 10.7.168.61: icmp_seq=1 ttl=63 time=1.06 ms
64 bytes from 10.7.168.61: icmp_seq=2 ttl=63 time=0.515 ms
--- 10.7.168.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.515/0.789/1.063/0.274 ms
07結(jié)論
經(jīng)過測試:不同網(wǎng)絡(luò)區(qū)域的 Pod 能夠通過 Pod IP、clusterIP、nodePort 等方式通信,Spiderpool 可以很好地實現(xiàn)基于跨越網(wǎng)絡(luò)區(qū)域的 IP 分配需求。