服务 ClusterIP 分配

在 Kubernetes 中,服务是一种抽象的方式,用于公开运行在一组 Pod 上的应用程序。服务可以拥有集群范围内的虚拟 IP 地址(使用 type: ClusterIP 的服务)。客户端可以使用该虚拟 IP 地址进行连接,然后 Kubernetes 会将流量负载均衡到不同后端 Pod 的该服务。

如何分配服务 ClusterIP?

当 Kubernetes 需要为服务分配虚拟 IP 地址时,该分配将通过以下两种方式之一进行

动态分配
集群的控制平面会从 type: ClusterIP 服务的已配置 IP 范围内自动选择一个空闲 IP 地址。
静态分配
您可以从服务的已配置 IP 范围内指定您选择的 IP 地址。

在整个集群中,每个服务的 ClusterIP 必须是唯一的。尝试使用已分配的特定 ClusterIP 创建服务将返回错误。

为什么要保留服务 Cluster IP?

有时,您可能希望服务在众所周知的 IP 地址上运行,以便集群中的其他组件和用户可以使用它们。

最好的例子是集群的 DNS 服务。作为一种软性约定,一些 Kubernetes 安装程序会将服务 IP 范围内的第 10 个 IP 地址分配给 DNS 服务。假设您将集群配置为服务 IP 范围 10.96.0.0/16,并且您希望 DNS 服务 IP 为 10.96.0.10,则必须创建如下服务

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 尚未被保留;如果其他服务在动态分配之前或与动态分配并行创建,则它们有可能分配此 IP,因此,您将无法创建 DNS 服务,因为它将因冲突错误而失败。

如何避免服务 ClusterIP 冲突?

Kubernetes 中实现的用于为服务分配 ClusterIP 的分配策略降低了冲突的风险。

ClusterIP 范围是根据公式 min(max(16, cidrSize / 16), 256) 进行划分的,该公式描述为“*永远不少于 16 或大于 256,它们之间有一个渐变的步长*”。

默认情况下,动态 IP 分配使用上限,一旦上限用尽,它将使用下限。这将允许用户在下限上使用静态分配,并且冲突的风险很低。

示例

示例 1

此示例使用 IP 地址范围:10.96.0.0/24(CIDR 表示法)作为服务的 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

饼图 showData 标题 10.96.0.0/24 “静态”:16 “动态”:238

示例 2

此示例使用 IP 地址范围:10.96.0.0/20(CIDR 表示法)作为服务的 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

饼图 showData 标题 10.96.0.0/20 “静态”:256 “动态”:3838

示例 3

此示例使用 IP 地址范围:10.96.0.0/16(CIDR 表示法)作为服务的 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

饼图 showData 标题 10.96.0.0/16 “静态”:256 “动态”:65278

后续步骤

上次修改时间:2023 年 8 月 20 日太平洋标准时间上午 10:58:修复链接 (07f224714a)