服务 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
示例 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
示例 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
后续步骤
- 阅读有关服务外部流量策略的信息
- 阅读有关使用服务连接应用程序的信息
- 阅读有关服务的信息