K8s Pod IP是如何分配的?

Pod 作为 K8s 中一等公民,其承载了最核心的 Container(s) 的运行。同时,Pod 也是 K8s 中资源调度的最小单位,因此熟悉其初始化过程(包括网络、存储、运行时等)将会使我们更加深入理解 K8s 的容器编排原理,以期更好的服务各类业务。

1. 概述

Pod 作为 K8s 中一等公民,其承载了最核心的 Container(s) 的运行。同时,Pod 也是 K8s 中资源调度的最小单位,因此熟悉其初始化过程(包括网络、存储、运行时等)将会使我们更加深入理解 K8s 的容器编排原理,以期更好的服务各类业务。

Pod 初始化核心流程如下:

  • kube-apiserver 收到客户端请求(Controller 或 kubectl 客户端)后,创建对应的 Pod;

  • kube-scheduler 按照配置的调度策略进行 Pod 调度,选择最为合适的 Node 作为目标节点;

  • kubelet(运行于每个 Node 上的 K8s agent)Watch 监听到调度到所在节点的 Pod(s),开始真正创建 Pod;

  • 由 CRI 首先创建出 PodSandbox,初始化对应的网络 net namespace,调用 CNI 获取 Pod IP;

  • 接着 CRI 开始创建 Pod 中第一个 pause container,绑定到上一步创建的 net namespace 和 Pod IP;

  • 接着由 CRI 依次创建和启动 Pod 中声明的 initContainers 和 containers 容器;

  • 当所有的 containers 运行起来后,探针探测容器运行符合预期后,Pod 状态最终更新为 Running;

本文将从 K8s 中多种 IP CIDR、Pod 生命周期、kubelet 核心逻辑、CNI IPAM 分配 Pod IP、双协议栈(IPv4/IPv6)、IP 固定与回收等流程,说明 Pod IP 的分配机制。

本文基于 K8s v1.27,CRI 已移除 Dockershim。

2. K8s 中多种 IP

2.1 Pod IP CIDR

在 K8s 中最常见的 IP 类型就是 Pod IP,在初始化 K8s 集群的时候,通过 --cluster-cidr 参数控制 Pod IP CIDR 网段,所有 Pod 动态分配的 IP 都会落在此 CIDR 网段内。

具体参数控制如下: 通过 kube-controller-manager 组件的 --cluster-cidr 参数进行配置,根据集群规模一般会选择 16 位的网段来配置集群支持的 Pod IP CIDR 网段,如 10.0.0.0/16,理论上最大支持 2 ^ (32 - 16) = 65536 个 Pod IP 的分配。

【集群规模】可按需配置 Pod IP CIDR,K8s 官方支持的一个大集群(large cluster),最大支持约 5k Nodes、15w Pods。

2.2 Node CIDR

在通过 kube-controller-manager 组件的 --cluster-cidr 控制了 Pod IP 的 CIDR 网段后,首先会在集群中每个 Node 分配一个 subnet CIDR,他们都属于 --cluster-cidr 网段。

具体参数控制如下: 通过 kube-controller-manager 组件的 --allocate-node-cidrs=true--node-cidr-mask-size=24 参数控制每个 Node 节点的 subnet CIDR 子网段,这样落在每个 Node 上的 Pod 最大的可分配 IP 数量为 2 ^ (32 - 24) = 256 个,各云厂商会根据自己的网络策略,一般会预留一部分,最终可分配的 IP 一般为最大个数的一半 (128 个)。

【双协议栈】若开启了 dual-stack IP,则可通过 --node-cidr-mask-size-ipv4=24--node-cidr-mask-size-ipv6=64 分别控制 IPv4 和 IPv6 的 Node CIDR 子网大小。

在 K8s 标准集群中,通过 kubelet 组件的 --max-pods=110 控制了默认一个 Node 最大的 Pod 数量为 110 个。

2.3 Service IP CIDR

除了上面提到的 Pod IP CIDR 和 Node CIDR 外,K8s 中还有一类 Service IP CIDR,控制 Service 资源的 ClusterIP 网段范围。

具体参数控制如下: 通过 kube-apiserver 和 kube-controller-manager 组件的 --service-cluster-ip-range=10.96.0.0/12 控制 Service ClusterIP 的网段范围。

根据 Service Type 不同,除了 Headless Service 显式将 .spec.clusterIP=None 设置后,生成的 Service 将不会分配 ClusterIP,其他类型的 Service 则都会动态分配 ClusterIP。示例如下:

kubectl get svc -n demo

NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
demo-clusterip      ClusterIP   10.96.0.46    <none>        80/TCP              6d11h
demo-nodeport       NodePort    10.96.0.25    <none>        80:31666/TCP        6d11h
demo-loadbalancer   ClusterIP   10.96.0.250   11.234.50.12  80/TCP              153d
demo-headless       ClusterIP   None          <none>        8080/TCP,80
### Kubernetes (K8S) 的定义 Kubernetes 即是一款容器编排工具,也是一个全新的基于容器技术的分布式架构方案[^1]。作为 Google 开源的容器集群管理系统(谷歌内部称为 Borg),Kubernetes 在 Docker 技术基础上提供了从创建应用到应用部署、提供服务、动态伸缩以及应用更新的一系列完整功能,显著提升了大规模容器集群管理的便捷性和效率[^2]。 ### 基本概念 #### Service(服务) Service 是 Kubernetes 中的一个重要抽象对象,它定义了一组 Pod 的逻辑集合和访问策略。由于 Pod 生命周期短暂且 IP 地址不稳定,因此不建议直接从外部访问 Pod 容器。相反,通过 Service 可以为这些 Pod 提供稳定的网络入口和服务发现能力。每个 Service 都拥有 K8s 集群内的唯一私有虚拟 IP 和对外公开的端口,以便接收来自客户端或其他组件的数据流[^3]。 为了使位于集群之外的应用程序也能够顺利连接至内部的服务实例,通常采用以下几种方式之一: - **LoadBalancer**:云服务商提供的负载均衡器会分配一个公网可访问的静态 IP 给指定 service; - **NodePort**:将特定节点上的某个固定端口号映射给目标 service 并允许外界经由该路径发起请求; - **Ingress**:一种更高级别的 API 对象,支持配置 HTTP(S) 路由规则来实现复杂的反向代理需求。 #### Deployment 与 ReplicaSet Deployment 控制器负责管理和维护一组无状态的工作负载副本集——即所谓的 ReplicaSets。当用户提交一个新的 deployment 或者修改现有版本时,系统便会自动调整相应数量的目标 pod 实例以匹配预期的状态描述。例如,在命令行界面执行 `kubectl get pods` 后可以看到当前运行中的所有 pod 列表及其所属关系;而进一步利用 `kubectl describe deployments/<name>` 查看具体详情,则有助于深入理解整个应用程序生命周期内的变更历史记录[^4]。 ```bash (base) [root@bigdata1 data]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-7848d4b86f-66m7z 1/1 Running 0 61m nginx-deployment-7848d4b86f-g65j6 1/1 Running 0 61m ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值