首页主机资讯CentOS K8s服务发现机制介绍

CentOS K8s服务发现机制介绍

时间2025-12-12 17:21:04发布访客分类主机资讯浏览1003
导读: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/EndpointSliceService 事件与 CoreDNS 日志/指标排查解析与连通性问题。

快速验证示例

  • 创建一个简单的 Service 并验证 DNS 解析与访问:
    1. 部署后端示例
      • kubectl create deployment nginx --image=nginx:1.25 --replicas=2
      • kubectl expose deployment nginx --port=80 --target-port=80
    2. 验证解析(集群内临时容器)
      • kubectl run -it --rm dns-test --image=busybox:1.36 --restart=Never – nslookup nginx.default.svc.cluster.local
    3. 访问测试
      • kubectl run -it --rm curl-test --image=curlimages/curl:8.5 --restart=Never – curl -s http://nginx.default.svc.cluster.local
    4. 跨命名空间访问
      • 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
CentOS K8s自动扩缩容实现方法 CentOS K8s持久化卷使用指南

游客 回复需填写必要信息