文本翻译自: https://itnext.io/ip-and-pod-allocations-in-eks-5be6612b8325
运行 EKS 集群时,你可能会遇到两个问题:
- 调配给 pod 的 IP 地址用完了。
- 每个节点的 pod 数量少(因为 ENI 限度)。
在本文中,你将学习如何克服这些问题。
在咱们开始之前,这里有一些对于节点内网络如何在 Kubernetes 中工作的背景常识。
创立节点时,kubelet 委托:
- 创立容器到容器运行时。
- 将容器连贯到 CNI 的网络。
- 将卷装置到 CSI。
让咱们关注 CNI 局部。
每个 pod 都有本人独立的 Linux 网络命名空间,并连贯到一个网桥。
CNI 负责创立网桥、调配 IP 并将 veth0 连贯到 cni0。
这通常会产生,但不同的 CNI 可能会应用其余形式将容器连贯到网络。
例如,可能没有 cni0 网桥。
AWS-CNI 是此类 CNI 的一个示例。
在 AWS 中,每个 EC2 实例都能够有多个网络接口 (ENI)。
你能够为每个 ENI 调配无限数量的 IP。
例如,一个 m5.large
实例能够为 ENI 调配最多 10 个 IP。
在这 10 个 IP 中,你必须将一个调配给网络接口。
剩下的你能够不必管。
以前,你能够应用额定的 IP 并将它们调配给 Pod。
然而有一个很大的限度:IP 地址的数量。
让咱们看一个例子。
应用 m5.large
实例,你最多有 3 个 ENI,每个有 10 个 IP 公有地址。
因为保留了一个 IP,每个 ENI 还剩下 9 个(总共 27 个)。
这意味着你的 m5.large
实例最多能够运行 27 个 Pod。
这不是很多。
然而 AWS 公布了对 EC2 的更改,容许将“地址前缀”调配给网络接口。
地址前缀是什么?!
简而言之,ENI 当初反对范畴而不是单个 IP 地址。
如果以前你能够领有 10 个公有 IP 地址,那么当初你能够领有 10 个 IP 地址槽。
地址槽有多大呢?
默认状况下,16 个 IP 地址。
应用 10 个槽,你最多能够领有 160 个 IP 地址。
这是一个相当显着的变动!
让咱们看一个例子。
应用 m5.large
实例,你有 3 个 ENI,每个有 10 个插槽(或 IP)。
因为为 ENI 保留了一个 IP,因而你还剩下 9 个插槽。
每个插槽是 16 个 IP,所以是 9*16=144
个 IP。
因为有 3 个 ENI,那就是 144x3=432
个 IP。
你当初最多能够领有 432 个 Pod(之前是 27 个)。
AWS-CNI 反对插槽并将 Pod 的最大数量限度为 110 或 250,因而你最多能够在 m5.large 中领有 432 个 pod 。
还值得指出的是,这不是默认启用的——即便在较新的集群中也是如此。
可能是因为只有 nitro 实例反对它。
调配插槽十分棒,直到你意识到 CNI 一次提供 16 个 IP 地址,而不是仅提供 1 个,这具备以下含意:
- 更快地耗尽 IP 空间。
- 碎片化。
让咱们回顾一下。
一个 pod 被调度到一个节点。
AWS-CNI 调配 1 个 slot(16 个 IP),pod 应用一个。
当初设想一下有 5 个节点和一个蕴含 5 个正本的部署。
会产生什么?
Kubernetes 调度程序更喜爱将 pod 散布在整个集群中。
很可能,每个节点接管 1 个 pod,AWS-CNI 调配 1 个插槽(16 个 IP)。
你从你的网络调配了 5*15=75
个 IP,但仅应用了 5 个。
但还有更多。
插槽调配一个间断的 IP 地址块。
如果调配了一个新 IP(例如创立了一个节点),你可能会遇到碎片问题。
怎么解决这些问题呢?
- 你能够为 EKS 调配一个次级 CIDR。
- 你能够在子网内保留 IP 空间供插槽独占应用。
相干链接:
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni...
- https://aws.amazon.com/blogs/containers/amazon-vpc-cni-increa...
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefi...