跳转至

2026-07-09

今日主题

  • K8s 集群域 cluster.local 的本质与修改
  • Service 类型与暴露模型

新增认知

K8s 集群域 cluster.local 的本质与修改

  • .local 规范分层:mDNS 的 .local 由 RFC 6762/6761 保留(公网递归 DNS 不得转发其查询),
    与 RFC 1918 私有 IP 同属硬规范;K8s 的 cluster.local 字符串不在 RFC 保留列表,只是社区默认值,可自定义。
    两者只共享"local=本地"语义,解析体系独立。

  • 改集群域三处同步:只能改后缀字符串(如改成 mycluster.local),命名结构 服务名.命名空间.svc. 写死改不了。三处:
    kube-controller-manager --cluster-domain(决定 Service DNS 记录后缀)、每节点 kubelet --cluster-domain(写进 Pod resolv.conf search 域)、CoreDNS Corefile kubernetes 块(声明权威域)。

  • kubelet 最易漏:漏掉会出现长域名能解析、短域名解析不了的怪现象,因为 Pod resolv.conf 的 search 域没更新;
    且改后只对新 Pod 生效,老 Pod resolv.conf 不会更新,需滚动重启;生产基本无人改默认 cluster.local,
    强需求多见于多集群互联避免域名冲突。

Service 类型与暴露模型

  • 脉络:正交性混淆源于字段与功能维度错位
    感觉 Service 类型不正交,是因为把 spec.type(唯一正交的类型维度,4 选 1)与 clusterIP、externalIPs、externalName、externalTrafficPolicy 这些独立字段都当成"类型"看。这些字段各自独立、可组合,本就不该和 type 比正交性。把"功能语义(代理 vs DNS 别名)"和"字段语义"对齐后,正交性就清楚了——它们分属不同字段,可以叠加组合。

  • type 四值递进叠加而非平级
    ClusterIP / NodePort / LoadBalancer 不是平级,而是大体递进:NodePort 在 ClusterIP 基础上开节点端口,LoadBalancer 在 NodePort 基础上接外部 LB。但现代实现可用 allocateLoadBalancerNodePorts=false 让 LB 不分配 NodePort,所以是"大体递进"而非严格叠加——这是个容易被忽略的边界条件。

  • ExternalName 是 DNS alias 异类
    ExternalName 是 spec.type 的第四个合法值,与前三个不是一类:它做 DNS CNAME(CoreDNS 把 service.namespace.cluster.local 指向 externalName),无 selector、无 Endpoints、kube-proxy 不参与、不做四层转发。K8s 把它塞进 type 的动机是"给外部服务一个集群内稳定别名",将来外部服务迁进集群时换成带 selector 的普通 Service,应用连接串不用改。它做的是服务发现命名,不是流量代理。

  • headless 是开关不是第五种类型
    headless 不是 Service 的第五种 type,而是 clusterIP: None——ClusterIP 类型的一个开关。它不分配 VIP,DNS 查询直接返回后端 Pod IP 列表,用于 StatefulSet、客户端自做负载均衡、直连 Pod。所以"ClusterIP 和 headless 是两种类型"的表述本身就不对。

  • externalIPs 是字段复用 ClusterIP 流水线
    externalIPs 不是 type,是 ServiceSpec 的独立字段,API 层面可配在任意 type 上(实践基本只配 ClusterIP,ExternalName 用不了因无 selector)。机制:若外部网络已能把某 IP 流量送到集群节点,kube-proxy 让该 Service 响应该目的 IP,转发逻辑与 ClusterIP 完全同一套(iptables/IPVS DNAT + 负载均衡 + conntrack),只是 match 的 dst IP 不同。可理解成"自定义 ClusterIP"——但 K8s 不分配也不宣告这个 IP,路由/ARP/BGP/VIP 全靠管理员;与 NodePort 区别在认 IP 而非开端口,与 LoadBalancer 区别在 IP 你给、路由你管。本质为没有云 LB 的裸金属场景设计,所以云上少见。

  • externalIPs v1.36 废弃因权限模型缺陷
    spec.externalIPs 在 v1.36(2026)正式 deprecated(使用告警),v1.43 计划完全移除。原因是长期安全设计缺陷:任何有 Service 创建权限的用户都能设任意 externalIPs,从而劫持不属于自己的 IP 的流量,集群管理员难以约束。deprecated 不等于 removed,旧集群仍能用。迁移方向:云上用 LoadBalancer,裸金属用 MetalLB + LoadBalancer,南北向长期用 Gateway API,固定外部 IP 接入可用无 selector Service + 手写 Endpoints。