kubernetes - 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 中的部署是一种高级抽象,它依赖于控制器来构建基本对象。这与对象本身(例如 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 将使用不同的池。
推荐阅读
- sql - 函数参数列表中的错误:“=”无法识别。无法解析 SSRS 中的查询
- django - 使用 Django 批量保存编辑过的项目?
- javascript - 单击时播放音频文件的按钮
- javascript - 多页tiff格式节点js
- xamarin.forms - 是否可以为 mapbox 中的一条折线设置更多 Line Dasharray
- android - 空值检查运算符用于颤振的空值
- python - psutil.Process 和 lsof 命令差异
- java - 使用 JOOQ 的查询构建器中的函数 json 对象、json 数组
- terraform-provider-aws - 使用动态块作为安全组入口规则的 Terraform 问题
- wordpress - Elementor - 在标签之后添加自定义代码