Service 哪些字段能改
Service 的更新有明确边界:clusterIP 与 clusterIPs 属于不可变字段,创建之后无法修改,只能删除重建,而重建通常会让服务拿到新的虚拟 IP;type 可以在 ClusterIP、NodePort、LoadBalancer 之间切换,切换时节点端口与外部地址的分配情况随之变化;selector 与 ports 可以随时修改,改完会触发后端列表重算。变更前先弄清落在哪一类,才能预估影响。
基本信息
| 适用对象 | Kubernetes 各版本的 Service 对象 |
|---|---|
| 不可变字段 | clusterIP、clusterIPs,创建后无法修改 |
| 可切换字段 | type 可在三种服务类型之间变更 |
| 端口分配 | 在条件允许时,已分配的 nodePort 会尽量保留 |
| 重建影响 | 删除重建会更换虚拟 IP,依赖固定 IP 的调用方会中断 |
典型使用场景
- 临时对外暴露:把 ClusterIP 改成 NodePort 做验证,再决定是否长期保留
- 接入云负载均衡:把服务改成 LoadBalancer 型并获得外部地址
- 收敛暴露面:验证完成后把 NodePort 或 LoadBalancer 改回 ClusterIP
- 端口调整:后端端口变化时更新 targetPort
- 标签治理:修正 selector 让服务正确匹配后端 Pod
安全变更示例
安全变更示例
kubectl patch svc web -n prod -p '{"spec":{"type":"NodePort"}}'
kubectl get svc web -n prod -o wide # 观察分配的 nodePort 与地址
kubectl diff -f svc.yaml # 变更前先看差异
kubectl get endpointslices -l kubernetes.io/service-name=web -n prod # 核对后端列表常见变更与允许情况
| 变更 | 是否允许 | 影响 |
|---|---|---|
| 修改 clusterIP | 不允许 | 只能删除重建,虚拟 IP 会变化 |
| ClusterIP 改为 NodePort 或 LoadBalancer | 允许 | 新增节点端口或外部地址 |
| NodePort 改回 ClusterIP | 允许 | 节点端口被释放,外部依赖中断 |
| 修改 selector 或 ports | 允许 | 后端列表与转发规则重算 |
依赖固定虚拟 IP 属于反模式:应用应通过 DNS 名访问(服务名加命名空间和服务域后缀),DNS 名在服务重建后保持一致,只有 IP 会变。
删除重建会更换虚拟 IP,旧 IP 之后可能被分配给别的服务;外部系统若把 IP 硬编码在配置里,变更前务必先梳理引用方,否则会出现难以定位的串流问题。
变更前用 kubectl diff 或 dry-run 打印差异,再按「先加新入口、观察流量、后撤旧入口」的顺序推进;涉及外部地址的变更尤其要留意生效时间差,避免新旧入口同时失效。