Kubernetes 文档 / 概念 / 服务、负载均衡和联网 / Service ClusterIP 分配

Kubernetes 文档 / 概念 / 服务、负载均衡和联网 / Service ClusterIP 分配

此文档从 Kubernetes 官网摘录
中文地址
英文地址

在 Kubernetes 中,Service 是一种抽象的方式, 用于公开在一组 Pod 上运行的应用。 Service 可以具有集群作用域的虚拟 IP 地址(使用 type: ClusterIP 的 Service)。 客户端可以使用该虚拟 IP 地址进行连接,Kubernetes 通过不同的后台 Pod 对该 Service 的流量进行负载均衡。

Service ClusterIP 是如何分配的

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

  • 动态分配

    集群的控制面自动从所配置的 IP 范围内为 type: ClusterIP 选择一个空闲 IP 地址。

  • 静态分配

    根据为 Service 所配置的 IP 范围,选定并设置你的 IP 地址。

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

为什么需要预留 Service 的 ClusterIP ?

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

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

yaml 复制代码
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 尚未被保留。如果在 DNS 启动之前或同时采用动态分配机制创建其他 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

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

相关推荐
奔跑吧邓邓子9 小时前
【Python爬虫(36)】深挖多进程爬虫性能优化:从通信到负载均衡
开发语言·爬虫·python·性能优化·负载均衡·多进程
努力的小T10 小时前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
东风微鸣11 小时前
TTRSS 迁移实战
docker·云原生·kubernetes·可观察性
转身後 默落13 小时前
04.Docker 镜像命令
docker·容器·eureka
IT_张三13 小时前
Docker+Kubernetes_第一章_Docker入门
java·docker·kubernetes
企鹅侠客14 小时前
kube-proxy怎么修改ipvs规则?
云原生·kubernetes·kubelet
仇辉攻防14 小时前
【云安全】云原生- K8S 污点横移
web安全·网络安全·云原生·容器·kubernetes·k8s·安全威胁分析
人工干智能17 小时前
科普:“docker”与“docker compose”
运维·docker·容器
神马都会亿点点的毛毛张17 小时前
【Docker教程】万字长文详解Docker命令
java·运维·后端·docker·容器
Anna_Tong17 小时前
阿里云 ACS:高效、弹性、低成本的容器计算解决方案
人工智能·阿里云·容器·kubernetes·serverless·云计算·devops