概述

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
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
clusterIP: 10.254.10.100 # 可选:指定固定 IP
ports:
- port: 80
targetPort: 8080
selector:
app: my-app

访问方式:

1
2
3
4
5
6
7
8
# 方式1:通过 Service Name(推荐)
curl http://my-service:80

# 方式2:通过 Cluster IP
curl http://10.254.10.100:80

# 方式3:完整 FQDN
curl http://my-service.default.svc.cluster.local:80

IP 范围配置:

1
2
3
# kube-apiserver 配置
--service-cluster-ip-range=10.254.0.0/16
--service-node-port-range=30000-32767

关键点:

💡 Service Name 才是对外暴露服务的关键,用户无需关心具体的 Cluster IP。

Pod IP(容器 IP)

定义: 分配给 Pod 的 IP 地址

特点:

特性说明
作用范围集群内所有 Pod 可互访
动态性Pod 重启后 IP 会变化
唯一性每个 Pod 拥有独立 IP
网络插件由 CNI 插件分配

Flannel 网络配置:

1
2
3
# Flannel 配置
FLANNEL_NETWORK=172.30.0.0/16 # 整个集群的 Pod 网络
FLANNEL_SUBNET=172.30.46.1/24 # 单个节点的子网

IP 分配示例:

1
2
3
Node 1: 172.30.1.0/24   → Pod1: 172.30.1.2, Pod2: 172.30.1.3 ...
Node 2: 172.30.2.0/24 → Pod3: 172.30.2.2, Pod4: 172.30.2.3 ...
Node 3: 172.30.3.0/24 → Pod5: 172.30.3.2, Pod6: 172.30.3.3 ...

网络规划注意事项:

注意点说明
⚠️ IP 段冲突避免与主机网络、Service 网络冲突
⚠️ 子网分配每个节点需要足够的地址空间
⚠️ 虚拟网卡Flannel 会创建虚拟网卡管理流量

关键点:

💡 用户无需关心 Pod IP,通过 Service 访问即可。但需要合理规划网络以避免冲突。

Node IP(主机 IP)

定义: Kubernetes 节点(物理机/虚拟机)的 IP 地址

特点:

特性说明
物理地址真实的网络 IP
外部访问可从集群外部访问
NodePort配合 NodePort Service 使用
管理端口kubectl、kubelet 通信使用

查看节点 IP:

1
2
3
4
5
$ kubectl get nodes -o wide
NAME STATUS AGE VERSION INTERNAL-IP EXTERNAL-IP
172.20.0.113 Ready 12d v1.6.0 172.20.0.113 <none>
172.20.0.114 Ready 12d v1.6.0 172.20.0.114 <none>
172.20.0.115 Ready 12d v1.6.0 172.20.0.115 <none>

NodePort Service 示例:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # 可选:指定端口
selector:
app: my-app

访问方式:

1
2
3
# 通过任意节点 IP + NodePort 访问
curl http://172.20.0.113:30080
curl http://172.20.0.114:30080 # 效果相同

IP 地址对比

三种 IP 对比表

IP 类型范围示例分配方式是否固定作用域
Cluster IP10.254.0.0/16Service 创建时分配✅ 可固定集群内部
Pod IP172.30.0.0/16CNI 插件动态分配❌ 动态变化集群内部
Node IP192.168.1.0/24物理网络分配✅ 固定集群内外

网络层次结构

1
2
3
4
5
6
7
外部网络

Node IP (192.168.1.x)

Cluster IP (10.254.x.x) ← Service

Pod IP (172.30.x.x) ← Pod

固定 Cluster IP

为什么需要固定 Cluster IP

使用场景:

场景说明
替换遗留服务保持相同的 IP 地址
DNS 条目固定外部 DNS 已配置
硬编码依赖旧系统依赖特定 IP
LoadBalancer某些 LB 需要固定后端 IP

配置方法

Service 配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Service
metadata:
name: my-fixed-service
spec:
type: ClusterIP
clusterIP: 10.43.77.110 # 固定 IP
clusterIPs:
- 10.43.77.110
ports:
- port: 80
targetPort: 8080
selector:
app: my-app

注意事项:

要求说明
合法性IP 必须是有效的 IP 地址
范围内必须在 service-cluster-ip-range
未占用IP 不能被其他 Service 使用
⚠️ 谨慎使用尽量使用动态分配避免冲突

错误示例:

1
2
3
4
# IP 不在范围内
Error: HTTP 422 - The Service "my-service" is invalid:
spec.clusterIP: Invalid value: "192.168.1.100":
must be within the service CIDR range: 10.43.0.0/16

查看 Service CIDR 范围

Kubernetes(K8s)

查看 kube-apiserver 配置:

1
2
3
4
5
6
7
8
9
10
# 方法1:检查 Pod 配置
kubectl get pod -n kube-system kube-apiserver-master \
-o yaml | grep service-cluster-ip-range

# 方法2:查看配置文件
cat /etc/kubernetes/manifests/kube-apiserver.yaml | \
grep service-cluster-ip-range

# 输出示例
--service-cluster-ip-range=10.254.0.0/16

K3s

查看 K3s 配置:

1
2
3
4
5
6
# 查看运行参数
ps aux | grep k3s | grep service-cidr

# 默认配置
--cluster-cidr value # Pod IP 范围 (default: "10.42.0.0/16")
--service-cidr value # Service IP 范围 (default: "10.43.0.0/16")

K3s 配置文件(v1.19.1+):

1
2
3
# /etc/rancher/k3s/config.yaml
cluster-cidr: "10.42.0.0/16" # Pod 网络
service-cidr: "10.43.0.0/16" # Service 网络

应用配置:

1
2
# 修改配置后重启 K3s
systemctl restart k3s

固定 IP 最佳实践

推荐做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 预留 IP 段用于固定分配
# Service CIDR: 10.43.0.0/16
# 动态分配:10.43.0.0 - 10.43.200.255
# 固定分配:10.43.201.0 - 10.43.255.255

# 2. 文档化固定 IP
# 维护 IP 分配表,避免冲突

# 3. 使用有意义的 IP
# 例如:数据库服务使用 10.43.201.x
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
clusterIP: 10.43.201.10
# ...

固定 Pod IP

方案概述

挑战: Pod IP 默认是动态分配的,重启后会变化

解决方案:

方案实现方式复杂度推荐度
Calico IPAM使用 Calico 的 IPPool 功能⭐⭐⭐⭐
StatefulSet使用 Headless Service⭐⭐⭐
固定 IP 插件第三方 IP 管理插件⭐⭐

Calico 固定 Pod IP

前提条件: 集群使用 Calico 作为 CNI 插件

配置步骤:

1. 创建 IPPool:

1
2
3
4
5
6
7
8
9
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: fixed-ippool
spec:
cidr: 10.42.100.0/24 # 固定 IP 池
blockSize: 26
ipipMode: Always
natOutgoing: true

2. 为 Pod 指定固定 IP:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: my-pod
annotations:
cni.projectcalico.org/ipv4pools: '["fixed-ippool"]'
cni.projectcalico.org/ipAddrs: '["10.42.100.10"]'
spec:
containers:
- name: my-container
image: nginx:latest

3. StatefulSet 固定 IP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
annotations:
cni.projectcalico.org/ipv4pools: '["fixed-ippool"]'
spec:
containers:
- name: nginx
image: nginx:latest

参考资源

Calico 固定 IP 配置:

网络规划建议

IP 地址规划

推荐配置:

网络类型CIDR 范围说明
Node Network192.168.1.0/24物理网络
Pod Network10.42.0.0/16Pod IP 池
Service Network10.43.0.0/16Service IP 池

避免冲突检查清单:

1
2
3
4
5
✅ Node IP 与 Pod Network 不冲突
✅ Node IP 与 Service Network 不冲突
✅ Pod Network 与 Service Network 不冲突
✅ 各网络有足够的地址空间
✅ 预留子网用于固定 IP 分配

配置示例(K3s)

1
2
3
4
# /etc/rancher/k3s/config.yaml
cluster-cidr: "10.42.0.0/16" # 65536 个 Pod IP
service-cidr: "10.43.0.0/16" # 65536 个 Service IP
cluster-dns: "10.43.0.10" # CoreDNS Service IP

总结

核心要点:

IP 类型用途是否固定配置位置
Cluster IPService 虚拟 IP✅ 可固定Service spec
Pod IPPod 容器 IP❌ 动态(可通过 Calico 固定)CNI 插件
Node IP节点物理 IP✅ 固定基础设施

最佳实践:

  1. 优先使用 Service Name 而非 IP 地址
  2. 合理规划网络 CIDR 避免冲突
  3. 谨慎使用固定 IP 仅在必要时配置
  4. 文档化 IP 分配 维护清晰的记录
  5. 使用 Calico 如需固定 Pod IP

快速参考:

1
2
3
4
5
6
7
8
# 查看 Service IP 范围
kubectl cluster-info dump | grep service-cluster-ip-range

# 查看 Pod 网络配置
kubectl get cm -n kube-system kube-flannel-cfg -o yaml

# 查看 节点 IP
kubectl get nodes -o wide