Service ClusterIP 分配
在 Kubernetes 中,Service 是一种抽象方式,用于暴露运行在一组 Pods 上的应用。Service 可以拥有一个集群范围的虚拟 IP 地址(使用 type: ClusterIP
类型的 Service)。客户端可以使用该虚拟 IP 地址进行连接,然后 Kubernetes 将流量负载均衡到该 Service 后端的不同 Pod 上。
如何分配 Service ClusterIP?
当 Kubernetes 需要为 Service 分配虚拟 IP 地址时,分配方式有两种:
- 动态分配
- 集群的控制平面会自动从为
type: ClusterIP
Service 配置的 IP 范围中选择一个空闲的 IP 地址。 - 静态分配
- 你可以在为 Service 配置的 IP 范围内指定一个你选择的 IP 地址。
在你的整个集群中,每个 Service 的 ClusterIP
必须是唯一的。尝试创建一个指定了已被分配的 ClusterIP
的 Service 将会返回错误。
为什么需要预留 Service Cluster IP?
有时你可能希望 Service 运行在某个知名 IP 地址上,以便集群中的其他组件和用户可以使用它们。
最好的例子是集群的 DNS Service。按照惯例,一些 Kubernetes 安装程序会将 Service IP 范围内的第 10 个 IP 地址分配给 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 中用于为 Service 分配 ClusterIP 的分配策略降低了冲突的风险。
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
下一步
- 阅读有关 Service 外部流量策略 的内容
- 阅读有关 使用 Service 连接应用 的内容
- 阅读有关 Service 的内容