Kubernetes集群内的子网划分

时间:2020-05-06 05:29:46

标签: kubernetes

我有几个部署-例如部署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本身可以确定特定的部署。

1 个答案:

答案 0 :(得分:1)

Kubernetes中的部署是一种高层抽象,它依赖于控制器来构建基本对象。这与对象本身(例如pod或service)不同。

如果您查看Kubernetes API Overview中的部署规范,则会发现没有定义子网的事情,也没有用于部署的IP地址,因此您无法为部署指定子网。

Kubernetes的想法是吊舱是短暂的。您不应尝试通过IP地址识别资源,因为IP是随机分配的。如果吊舱去世,它将具有另一个IP地址。如果您追求唯一的稳定网络标识符,则可以尝试查看诸如statefulsets之类的内容。

虽然Kubernetes不支持此功能,但我发现使用Calico:Migrate pools功能可以解决此问题。

首先,您需要安装calicoctlinstall 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将使用其他池。