概述
Kubernetes 集群中存在多种类型的 IP 地址,包括 Cluster IP、Pod IP、Node IP 等。理解这些 IP 的作用范围和配置方法对于网络规划至关重要。
核心内容:
- 🌐 Kubernetes 各类 IP 地址详解
- 📋 IP 地址范围配置
- 🔒 固定 IP 地址实现方案
- ⚙️ K8s/K3s 配置差异
Kubernetes IP 地址类型
Cluster IP(服务 IP)
定义: Service 的虚拟 IP 地址,用于集群内部服务访问
特点:
| 特性 | 说明 |
|---|---|
| 作用范围 | 仅集群内部可访问 |
| 生命周期 | 与 Service 绑定(除非删除 Service) |
| DNS 解析 | 通过 Service Name 自动解析 |
| 负载均衡 | 自动分发流量到后端 Pod |
工作机制:
1 | Client → Service Name → kube-dns 解析 → Cluster IP → kube-proxy → Pod |
示例:
1 | apiVersion: v1 |
访问方式:
1 | # 方式1:通过 Service Name(推荐) |
IP 范围配置:
1 | # kube-apiserver 配置 |
关键点:
💡 Service Name 才是对外暴露服务的关键,用户无需关心具体的 Cluster IP。
Pod IP(容器 IP)
定义: 分配给 Pod 的 IP 地址
特点:
| 特性 | 说明 |
|---|---|
| 作用范围 | 集群内所有 Pod 可互访 |
| 动态性 | Pod 重启后 IP 会变化 |
| 唯一性 | 每个 Pod 拥有独立 IP |
| 网络插件 | 由 CNI 插件分配 |
Flannel 网络配置:
1 | # Flannel 配置 |
IP 分配示例:
1 | Node 1: 172.30.1.0/24 → Pod1: 172.30.1.2, Pod2: 172.30.1.3 ... |
网络规划注意事项:
| 注意点 | 说明 |
|---|---|
| ⚠️ IP 段冲突 | 避免与主机网络、Service 网络冲突 |
| ⚠️ 子网分配 | 每个节点需要足够的地址空间 |
| ⚠️ 虚拟网卡 | Flannel 会创建虚拟网卡管理流量 |
关键点:
💡 用户无需关心 Pod IP,通过 Service 访问即可。但需要合理规划网络以避免冲突。
Node IP(主机 IP)
定义: Kubernetes 节点(物理机/虚拟机)的 IP 地址
特点:
| 特性 | 说明 |
|---|---|
| 物理地址 | 真实的网络 IP |
| 外部访问 | 可从集群外部访问 |
| NodePort | 配合 NodePort Service 使用 |
| 管理端口 | kubectl、kubelet 通信使用 |
查看节点 IP:
1 | $ kubectl get nodes -o wide |
NodePort Service 示例:
1 | apiVersion: v1 |
访问方式:
1 | # 通过任意节点 IP + NodePort 访问 |
IP 地址对比
三种 IP 对比表
| IP 类型 | 范围示例 | 分配方式 | 是否固定 | 作用域 |
|---|---|---|---|---|
| Cluster IP | 10.254.0.0/16 | Service 创建时分配 | ✅ 可固定 | 集群内部 |
| Pod IP | 172.30.0.0/16 | CNI 插件动态分配 | ❌ 动态变化 | 集群内部 |
| Node IP | 192.168.1.0/24 | 物理网络分配 | ✅ 固定 | 集群内外 |
网络层次结构
1 | 外部网络 |
固定 Cluster IP
为什么需要固定 Cluster IP
使用场景:
| 场景 | 说明 |
|---|---|
| 替换遗留服务 | 保持相同的 IP 地址 |
| DNS 条目固定 | 外部 DNS 已配置 |
| 硬编码依赖 | 旧系统依赖特定 IP |
| LoadBalancer | 某些 LB 需要固定后端 IP |
配置方法
Service 配置示例:
1 | apiVersion: v1 |
注意事项:
| 要求 | 说明 |
|---|---|
| ✅ 合法性 | IP 必须是有效的 IP 地址 |
| ✅ 范围内 | 必须在 service-cluster-ip-range 内 |
| ✅ 未占用 | IP 不能被其他 Service 使用 |
| ⚠️ 谨慎使用 | 尽量使用动态分配避免冲突 |
错误示例:
1 | # IP 不在范围内 |
查看 Service CIDR 范围
Kubernetes(K8s)
查看 kube-apiserver 配置:
1 | # 方法1:检查 Pod 配置 |
K3s
查看 K3s 配置:
1 | # 查看运行参数 |
K3s 配置文件(v1.19.1+):
1 | # /etc/rancher/k3s/config.yaml |
应用配置:
1 | # 修改配置后重启 K3s |
固定 IP 最佳实践
推荐做法:
1 | # 1. 预留 IP 段用于固定分配 |
固定 Pod IP
方案概述
挑战: Pod IP 默认是动态分配的,重启后会变化
解决方案:
| 方案 | 实现方式 | 复杂度 | 推荐度 |
|---|---|---|---|
| Calico IPAM | 使用 Calico 的 IPPool 功能 | 中 | ⭐⭐⭐⭐ |
| StatefulSet | 使用 Headless Service | 低 | ⭐⭐⭐ |
| 固定 IP 插件 | 第三方 IP 管理插件 | 高 | ⭐⭐ |
Calico 固定 Pod IP
前提条件: 集群使用 Calico 作为 CNI 插件
配置步骤:
1. 创建 IPPool:
1 | apiVersion: projectcalico.org/v3 |
2. 为 Pod 指定固定 IP:
1 | apiVersion: v1 |
3. StatefulSet 固定 IP:
1 | apiVersion: apps/v1 |
参考资源
Calico 固定 IP 配置:
网络规划建议
IP 地址规划
推荐配置:
| 网络类型 | CIDR 范围 | 说明 |
|---|---|---|
| Node Network | 192.168.1.0/24 | 物理网络 |
| Pod Network | 10.42.0.0/16 | Pod IP 池 |
| Service Network | 10.43.0.0/16 | Service IP 池 |
避免冲突检查清单:
1 | ✅ Node IP 与 Pod Network 不冲突 |
配置示例(K3s)
1 | # /etc/rancher/k3s/config.yaml |
总结
核心要点:
| IP 类型 | 用途 | 是否固定 | 配置位置 |
|---|---|---|---|
| Cluster IP | Service 虚拟 IP | ✅ 可固定 | Service spec |
| Pod IP | Pod 容器 IP | ❌ 动态(可通过 Calico 固定) | CNI 插件 |
| Node IP | 节点物理 IP | ✅ 固定 | 基础设施 |
最佳实践:
- ✅ 优先使用 Service Name 而非 IP 地址
- ✅ 合理规划网络 CIDR 避免冲突
- ✅ 谨慎使用固定 IP 仅在必要时配置
- ✅ 文档化 IP 分配 维护清晰的记录
- ✅ 使用 Calico 如需固定 Pod IP
快速参考:
1 | # 查看 Service IP 范围 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小五的个人杂货铺!
