服务 ClusterIP 分配

在 Kubernetes 中,Service 是一种抽象方式,用于暴露运行在一组 Pod 上的应用程序。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 中实现的将 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

饼图显示数据 标题 10.96.0.0/24 "静态" : 16 "动态" : 238

示例 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

饼图显示数据 标题 10.96.0.0/20 "静态" : 256 "动态" : 3838

示例 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

饼图显示数据 标题 10.96.0.0/16 "静态" : 256 "动态" : 65278

下一步

最后修改于 2024 年 10 月 24 日太平洋标准时间下午 5:03:更新 cluster-ip-allocation.md (e57546d9a1)