服务集群 IP 分配

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

服务 ClusterIP 如何分配?

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

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

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

为什么要保留服务 ClusterIP?

有时您可能希望在已知 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

pie showData title 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

pie showData title 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

pie showData title 10.96.0.0/16 "静态" : 256 "动态" : 65278

下一步

上次修改于 2023 年 8 月 20 日下午 10:58 PST:修复链接 (07f224714a)