本文已发布超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已不正确。
Kubernetes 1.24: 避免为 Services 分配 IP 地址时发生冲突
在 Kubernetes 中,Service 是一种抽象方式,用于公开运行在一组 Pods 上的应用程序。Service 可以拥有集群范围的虚拟 IP 地址(使用 type: ClusterIP
的 Service)。客户端可以使用该虚拟 IP 地址连接,然后 Kubernetes 会将流量负载均衡到该 Service 的不同后端 Pods 上。
Service ClusterIP 如何分配?
可以为 Service 的 ClusterIP
分配以下类型:
- 动态分配
- 集群的控制平面从为
type: ClusterIP
Service 配置的 IP 范围内自动选择一个空闲的 IP 地址。 - 静态分配
- 您可以从为 Service 配置的 IP 范围内指定一个您选择的 IP 地址。
在整个集群中,每个 Service 的 ClusterIP
都必须是唯一的。尝试创建一个指定了已被分配的 ClusterIP
的 Service 将返回错误。
为什么需要保留 Service Cluster IP?
有时您可能希望 Service 运行在众所周知的 IP 地址上,以便集群中的其他组件和用户可以使用它们。
最好的例子是集群的 DNS Service。一些 Kubernetes 安装程序会将 Service IP 范围内的第 10 个地址分配给 DNS Service。假设您使用 Service IP 范围 10.96.0.0/16 配置了集群,并且希望 DNS Service IP 为 10.96.0.10,则必须像这样创建一个 Service:
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: CoreDNS
name: kube-dns
namespace: kube-system
spec:
clusterIP: 10.96.0.10
ports:
- name: dns
port: 53
protocol: UDP
targetPort: 53
- name: dns-tcp
port: 53
protocol: TCP
targetPort: 53
selector:
k8s-app: kube-dns
type: ClusterIP
但正如我之前解释的,IP 地址 10.96.0.10 尚未保留;如果在动态分配之前或同时创建其他 Service,它们可能会分配此 IP,因此,您将无法创建 DNS Service,因为它会因冲突错误而失败。
如何避免 Service ClusterIP 冲突?
在 Kubernetes 1.24 中,您可以启用新的特性门控 ServiceIPStaticSubrange
。启用此特性门控后,您可以对 Service 使用不同的 IP 分配策略,从而降低冲突风险。
ClusterIP
范围将被划分,划分基于公式 min(max(16, cidrSize / 16), 256)
,该公式被描述为永不小于 16 或大于 256,并在两者之间采取渐进式步长。
动态 IP 分配默认将使用较高段,一旦该段耗尽,将使用较低段。这将允许用户在较低段上进行静态分配,从而降低冲突风险。
示例
Service IP CIDR 块:10.96.0.0/24
范围大小:28 - 2 = 254
段偏移:min(max(16, 256/16), 256)
= min(16, 256)
= 16
静态分配段起始:10.96.0.1
静态分配段结束:10.96.0.16
范围结束:10.96.0.254
Service IP CIDR 块:10.96.0.0/20
范围大小:212 - 2 = 4094
段偏移:min(max(16, 4096/16), 256)
= min(256, 256)
= 256
静态分配段起始:10.96.0.1
静态分配段结束:10.96.1.0
范围结束:10.96.15.254
Service IP CIDR 块:10.96.0.0/16
范围大小:216 - 2 = 65534
段偏移:min(max(16, 65536/16), 256)
= min(4096, 256)
= 256
静态分配段起始:10.96.0.1
静态分配段结束:10.96.1.0
范围结束:10.96.255.254
参与 SIG Network
当前 SIG-Network 在 GitHub 上的 KEP 和 议题 展示了 SIG 的重点领域。
SIG Network 会议是一个友好、受欢迎的场所,您可以在这里与社区交流并分享您的想法。期待您的参与!