虚拟 IP 能不能固定下来
ClusterIP 可以在创建时从 Service 网段内指定,创建之后就不可修改。它由 kube-proxy 或等价组件在节点上以转发规则实现,并没有对应实体网卡,这也是它 ping 不通、但端口可以连接的原因。删除重建 Service 通常会拿到新的虚拟 IP,把 IP 硬编码到调用方配置里属于反模式:应用应通过 DNS 名称访问,DNS 名在重建后保持不变。
基本信息
| 适用对象 | 各版本的 Service |
|---|---|
| 关键字段 | spec.clusterIP 与 spec.clusterIPs |
| 可选取值范围 | 集群 Service 网段内且未被占用的地址 |
| 可否修改 | 不可变字段,只能删除重建 |
| 推荐访问方式 | 使用 DNS 名称而不是固定 IP |
典型使用场景
- 兼容历史系统:外部系统必须填写固定地址时,创建时指定虚拟 IP
- 迁移梳理:确认哪些调用方依赖固定 IP,评估改造范围
- 排查地址冲突:核对指定地址是否已被其他服务占用
- 理解重建影响:预估删除重建对调用方的影响面
- 访问方式治理:把固定 IP 依赖逐步替换为 DNS 名称
指定 clusterIP 与查看网段
指定 clusterIP 与查看网段
apiVersion: v1
kind: Service
metadata:
name: legacy-api
namespace: prod
spec:
clusterIP: 10.96.0.100 # 必须落在 Service 网段内且未被占用
selector:
app: legacy-api
ports:
- port: 80
targetPort: 8080核对网段与占用情况
核对网段与占用情况
kubectl get svc kubernetes -n default -o jsonpath='{.spec.clusterIP}'
kubectl cluster-info dump | grep -i -m1 service-cluster-ip-range
kubectl get svc -A -o custom-columns='NS:.metadata.namespace,NAME:.metadata.name,IP:.spec.clusterIP' | grep 10.96.0
kubectl get svc -A -o jsonpath='{range .items[*]}{.spec.clusterIP}{"\n"}{end}' | sort | uniq -d相关操作与影响
| 操作 | 是否允许 | 影响 |
|---|---|---|
| 创建时指定地址 | 允许 | 必须是网段内未占用的地址 |
| 修改已有地址 | 不允许 | 必须先删除再重建 |
| 删除后重建 | 允许 | 虚拟 IP 可能变化,DNS 名保持不变 |
| 依赖固定 IP | 不推荐 | 重建后调用方中断,且旧地址可能被他人占用 |
虚拟 IP 由转发规则实现,没有实体接口:ping 不通不能作为服务不可用的判断依据,应改用端口连接或 HTTP 响应来验证。
DNS 名称在 Service 重建后保持稳定,是比固定 IP 更可靠的访问方式;改造时优先把调用方的地址配置换成 DNS 名。
指定地址前先全量列出已用虚拟 IP:同一网段里被其他命名空间占用的地址同样会冲突,只在自己的命名空间里查容易漏。