首页 > 解决方案 > Kubernetes 集群内的子网划分

问题描述

我有几个部署——比如部署 A 和部署 B。K8s 子网是 10.0.0.0/20。我的要求:是否可以让部署 A 中的所有 pod 从 10.0.1.0/24 获取 IP,并从 10.0.2.0/24 获取部署 B 中的 pod。这有助于网络清洁,并且在 IP 本身的帮助下,可以识别特定的部署。

标签: kubernetes

解决方案


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

如果您查看Kubernetes API 概述中的部署规范,您会注意到没有定义子网之类的东西,也没有特定于部署的 IP 地址,因此您无法为部署指定子网。

Kubernetes 的想法是 pod 是短暂的。您不应尝试通过 IP 地址来识别资源,因为 IP 是随机分配的。如果 pod 死了,它将有另一个 IP 地址。如果您追求唯一的稳定网络标识符,您可以尝试查看 statefulsets 之类的东西。

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

首先你需要calicoctl安装。安装 calicoctl文档中提到了几种方法。

我选择安装calicoctl为 Kubernetes pod:

 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)

列出 ippools 你会注意到新添加的:

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


推荐阅读