Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes簇内的子网_Kubernetes - Fatal编程技术网

Kubernetes簇内的子网

Kubernetes簇内的子网,kubernetes,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本身可以确定特定的部署 Kubernetes中的部署是一种高级抽象,依赖于控制器来构建基本对象。这与对象本身不同,例如pod或服务 如果查看中的部署规范,您会注意到没有定义子网这样的事情,也没有特定于部署的IP地址,因此您无法为部署指定子网 库伯内特的观点是,豆荚是短暂

我有两个部署—比如部署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本身可以确定特定的部署

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

如果查看中的部署规范,您会注意到没有定义子网这样的事情,也没有特定于部署的IP地址,因此您无法为部署指定子网

库伯内特的观点是,豆荚是短暂的。由于IP是随机分配的,所以不应尝试通过IP地址来标识资源。如果pod死亡,它将拥有另一个IP地址。如果需要唯一稳定的网络标识符,可以尝试查看类似statefulset的内容

虽然Kubernetes不支持此功能,但我使用Calico:feature找到了解决方法

首先,您需要安装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)
列出IPTools时,您会注意到新添加的IPTools:

➜  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将使用不同的池

哇……太棒了。谢谢你详细的解释。我试试看