CentOS K8s服务发现机制介绍
导读:CentOS 上 Kubernetes 服务发现机制概览 在 CentOS 环境中,Kubernetes 的服务发现以 Service + Endpoints + CoreDNS 为核心:Service 提供稳定的访问入口,Endpoint...
CentOS 上 Kubernetes 服务发现机制概览
在 CentOS 环境中,Kubernetes 的服务发现以 Service + Endpoints + CoreDNS 为核心:Service 提供稳定的访问入口,Endpoints 维护后端健康 Pod 列表,CoreDNS 将服务名解析为 ClusterIP,配合 kube-proxy 完成负载均衡与转发,使应用以名称而非易变的 Pod IP 进行通信。
核心机制与工作流程
- 服务注册
- 创建 Service 时获得稳定的 ClusterIP 和端口;若指定 selector,控制平面自动创建并更新同名 Endpoints(保存后端 Pod 的 IP:Port)。
- 集群 DNS(默认 CoreDNS)通过监听 API Server 自动为 Service 写入 DNS 记录,实现“名称→ClusterIP”的映射。
- 服务发现
- 集群内客户端通过名称访问服务,Pod 内 /etc/resolv.conf 已配置为使用集群 DNS,解析得到 ClusterIP 后发起访问。
- 流量转发
- 各节点 kube-proxy 监听 Service/Endpoints 变更,生成 iptables/IPVS 规则,将目标为 ClusterIP:Port 的流量转发至后端健康 Pod(四层转发,默认轮询)。
发现方式与访问路径
- 环境变量注入
- kubelet 会在 Pod 中注入同集群内所有 Service 的环境变量,如:REDIS_MASTER_SERVICE_HOST/PORT 等。
- 限制:Service 必须比使用该变量的 Pod 更早创建,否则变量不会注入,实际可用性受限。
- DNS 解析(推荐)
- 全域名格式:..svc.(常见为 cluster.local),例如 my-svc.default.svc.cluster.local。
- 跨命名空间访问需使用全域名或设置搜索域;代码中使用全域名可减少解析歧义与延迟。
- Service 类型与对外暴露
- ClusterIP:默认,仅集群内访问。
- NodePort:在每个节点开放 30000–32767 端口,外部通过 NodeIP:NodePort 访问。
- LoadBalancer:对接云厂商负载均衡器,对外暴露服务。
- ExternalName:为外部域名创建服务别名(返回 CNAME),便于以服务名访问外部服务。
关键组件与配置要点
- CoreDNS
- 自 v1.11 起成为默认 DNS 组件,插件化、性能更好,支持自定义上游与记录;为每个 Service 创建 A 记录(Headless 服务返回 Pod IP 集合)。
- 典型解析链路:Pod → /etc/resolv.conf(nameserver 指向 kube-dns Service 的 ClusterIP)→ CoreDNS → 返回 ClusterIP → kube-proxy 转发至 Endpoints。
- kube-proxy 与转发模式
- 支持 userspace(已不推荐)、iptables(默认)、IPVS(更适合大规模,连接级调度)。
- 负载分发策略默认 RoundRobin,支持基于客户端 IP 的会话保持(SessionAffinity)。
- Headless Services
- spec.clusterIP: None,不分配虚拟 IP,DNS 直接返回后端 Pod IP 列表,便于 StatefulSet 等场景按实例直连。
- Pod DNS 配置
- Pod 的 dnsPolicy 与 /etc/resolv.conf 决定解析行为;常见为 ClusterFirst,nameserver 指向集群 DNS Service。
- 性能与可观测性
- 大规模集群建议启用 Node 本地 DNS 缓存(如 nodelocaldns),降低查询延迟与 CoreDNS 压力;结合 Endpoints/EndpointSlice、Service 事件与 CoreDNS 日志/指标排查解析与连通性问题。
快速验证示例
- 创建一个简单的 Service 并验证 DNS 解析与访问:
- 部署后端示例
- kubectl create deployment nginx --image=nginx:1.25 --replicas=2
- kubectl expose deployment nginx --port=80 --target-port=80
- 验证解析(集群内临时容器)
- kubectl run -it --rm dns-test --image=busybox:1.36 --restart=Never – nslookup nginx.default.svc.cluster.local
- 访问测试
- kubectl run -it --rm curl-test --image=curlimages/curl:8.5 --restart=Never – curl -s http://nginx.default.svc.cluster.local
- 跨命名空间访问
- kubectl create ns demo
- kubectl run -it --rm dns-test2 --image=busybox:1.36 --restart=Never -n demo – nslookup nginx.default.svc.cluster.local
- 预期:解析返回 ClusterIP,访问返回 200 OK;跨命名空间需使用全域名或在目标命名空间创建对应 Service/Endpoint。
- 部署后端示例
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS K8s服务发现机制介绍
本文地址: https://pptw.com/jishu/770690.html
