前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 1.24: 避免为 Services 分配 IP 地址时发生冲突

Kubernetes 1.24: 避免为 Services 分配 IP 地址时发生冲突

作者头像
CNCF
发布2022-06-10 14:24:53
1.3K0
发布2022-06-10 14:24:53
举报
文章被收录于专栏:CNCFCNCF

作者: Antonio Ojea (Red Hat)

在 Kubernetes 中,Services[1]是一种抽象,用来暴露运行在一组 Pod 上的应用。Service 可以有一个集群范围的虚拟 IP 地址(使用 type: ClusterIP 的 Service)。客户端可以使用该虚拟 IP 地址进行连接, Kubernetes 为对该 Service 的访问流量提供负载均衡,以访问不同的后端 Pod。

Service ClusterIP 是如何分配的?

Service ClusterIP 有如下分配方式:

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

静态:你可以指定一个来自 Service 配置的 IP 范围内的 IP 地址。

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

为什么需要预留 Service Cluster IP?

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

最好的例子是集群的 DNS Service。一些 Kubernetes 安装程序将 Service IP 范围中的第 10 个地址分配给 DNS Service。假设你配置集群 Service IP 范围是 10.96.0.0/16,并且希望 DNS Service IP 为 10.96.0.10, 那么你必须创建一个如下所示的 Service:

代码语言:javascript
复制
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 冲突?{#avoid-ClusterIP-conflict}

在 Kubernetes 1.24 中,你可以启用一个新的特性门控 ServiceIPStaticSubrange。启用此特性允许你为 Service 使用不同的 IP 分配策略,减少冲突的风险。

ClusterIP 范围将根据公式 min(max(16, cidrSize / 16), 256) 进行划分, 该公式可描述为 “在不小于 16 且不大于 256 之间有一个步进量(Graduated Step)”。

分配默认使用上半段地址,当上半段地址耗尽后,将使用下半段地址范围。这将允许用户使用下半段地址中静态分配的地址并且降低冲突的风险。

举例:

Service IP CIDR 地址段:10.96.0.0/24

地址段大小: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

Service IP CIDR 地址段:10.96.0.0/20

地址段大小:212 - 2 = 4094 地址段偏移:min(max(16,4094/16),256) = min(256,256) = 256 静态地址段起点:10.96.0.1 静态地址段终点:10.96.1.0 地址范围终点:10.96.15.254

Service IP CIDR 地址段:10.96.0.0/16

地址段大小: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

参考资料

[1]

Services: /zh/docs/concepts/services-networking/service/

[2]

KEPs: https://github.com/orgs/kubernetes/projects/10

[3]

issues: https://github.com/kubernetes/kubernetes/issues?q=is%3Aopen+is%3Aissue+label%3Asig%2Fnetwork

[4]

SIG Network 会议: https://github.com/kubernetes/community/tree/master/sig-network


CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。

CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Service ClusterIP 是如何分配的?
  • 为什么需要预留 Service Cluster IP?
  • 如何避免 Service ClusterIP 冲突?{#avoid-ClusterIP-conflict}
    • Service IP CIDR 地址段:10.96.0.0/24
      • Service IP CIDR 地址段:10.96.0.0/20
        • Service IP CIDR 地址段:10.96.0.0/16
          • 参考资料
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档