Information in this document may be out of date
This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Service ClusterIP allocation
Service ClusterIP 分配
在 Kubernetes 中,Service 是一种抽象的方式,
用于公开在一组 Pod 上运行的应用。
Service 可以具有集群作用域的虚拟 IP 地址(使用 type: ClusterIP
的 Service)。
客户端可以使用该虚拟 IP 地址进行连接,Kubernetes 通过不同的后台 Pod 对该 Service 的流量进行负载均衡。
Service ClusterIP 是如何分配的?
当 Kubernetes 需要为 Service 分配虚拟 IP 地址时,该分配会通过以下两种方式之一进行:
- 动态分配
- 集群的控制面自动从所配置的 IP 范围内为
type: ClusterIP
选择一个空闲 IP 地址。 - 静态分配
- 根据为 Service 所配置的 IP 范围,选定并设置你的 IP 地址。
在整个集群中,每个 Service 的 ClusterIP
都必须是唯一的。
尝试使用已分配的 ClusterIP
创建 Service 将返回错误。
为什么需要预留 Service 的 ClusterIP ?
有时你可能希望 Services 在众所周知的 IP 上面运行,以便集群中的其他组件和用户可以使用它们。
最好的例子是集群的 DNS Service。作为一种非强制性的约定,一些 Kubernetes 安装程序 将 Service IP 范围中的第 10 个 IP 地址分配给 DNS 服务。假设将集群的 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 尚未被保留。如果在 DNS 启动之前或同时采用动态分配机制创建其他 Service, 则它们有可能被分配此 IP,因此,你将无法创建 DNS Service,因为它会因冲突错误而失败。
如何避免 Service ClusterIP 冲突?
Kubernetes 中用來将 ClusterIP 分配给 Service 的分配策略降低了冲突的风险。
ClusterIP
范围根据公式 min(max(16, cidrSize / 16), 256)
进行划分,
描述为不小于 16 且不大于 256,并在二者之间有一个渐进的步长。
默认情况下,动态 IP 分配使用地址较高的一段,一旦用完,它将使用较低范围。 这将允许用户在冲突风险较低的较低地址段上使用静态分配。
示例
示例 1
此示例使用 IP 地址范围:10.96.0.0/24(CIDR 表示法)作为 Service 的 IP 地址。
范围大小: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
示例 2
此示例使用 IP 地址范围 10.96.0.0/20(CIDR 表示法)作为 Service 的 IP 地址。
范围大小: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
示例 3
此示例使用 IP 地址范围 10.96.0.0/16(CIDR 表示法)作为 Service 的 IP 地址。
范围大小: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