我有几个部署-例如部署A和部署B。K8s子网是10.0.0.0/20。 我的要求:是否可以让部署A中的所有Pod从10.0.1.0/24获得IP,而从部署B中的Pod从10.0.2.0/24获得IP。 这有助于清洁网络,并借助IP本身可以确定特定的部署。
答案 0 :(得分:1)
Kubernetes中的部署是一种高层抽象,它依赖于控制器来构建基本对象。这与对象本身(例如pod或service)不同。
如果您查看Kubernetes API Overview中的部署规范,则会发现没有定义子网的事情,也没有用于部署的IP地址,因此您无法为部署指定子网。
Kubernetes的想法是吊舱是短暂的。您不应尝试通过IP地址识别资源,因为IP是随机分配的。如果吊舱去世,它将具有另一个IP地址。如果您追求唯一的稳定网络标识符,则可以尝试查看诸如statefulsets之类的内容。
虽然Kubernetes不支持此功能,但我发现使用Calico:Migrate pools功能可以解决此问题。
首先,您需要安装calicoctl
。 install calicoctl文档中提到了几种方法。
我选择将calicoctl
安装为Kubernetes窗格:
kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl.yaml
要加快工作速度,您可以设置别名:
alias calicoctl="kubectl exec -i -n kube-system calicoctl /calicoctl -- "
我创建了两个Yaml文件来设置IP池:
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: pool1
spec:
cidr: 10.0.0.0/24
ipipMode: Always
natOutgoing: true
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: pool2
spec:
cidr: 10.0.1.0/24
ipipMode: Always
natOutgoing: true
然后,您已经应用了以下配置,但是由于我的yaml被放置在主机文件系统中而不是calico pod本身中,因此我将yaml放置为命令的输入:
➜ cat ippool1.yaml | calicoctl apply -f-
Successfully applied 1 'IPPool' resource(s)
➜ cat ippool2.yaml | calicoctl apply -f-
Successfully applied 1 'IPPool' resource(s)
列出ippool,您会注意到新添加的ippool:
➜ calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-ippool 192.168.0.0/16 true Always Never false all()
pool1 10.0.0.0/24 true Always Never false all()
pool2 10.0.1.0/24 true Always Never false all()
然后,您可以指定要为部署选择的池:
---
metadata:
labels:
app: nginx
name: deployment1-pool1
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
annotations:
cni.projectcalico.org/ipv4pools: "[\"pool1\"]"
---
我创建了一个类似的名为deployment2
的文件,它使用ippool2
,结果如下:
deployment1-pool1-6d9ddcb64f-7tkzs 1/1 Running 0 71m 10.0.0.198 acid-fuji
deployment1-pool1-6d9ddcb64f-vkmht 1/1 Running 0 71m 10.0.0.199 acid-fuji
deployment2-pool2-79566c4566-ck8lb 1/1 Running 0 69m 10.0.1.195 acid-fuji
deployment2-pool2-79566c4566-jjbsd 1/1 Running 0 69m 10.0.1.196 acid-fuji
还值得一提的是,在测试此功能时,我发现如果您的默认部署将具有许多副本并且将用完ips,那么Calico将使用其他池。