温馨提示×

Kubernetes 服务发现机制在 Ubuntu 上如何配置

小樊
44
2026-01-05 05:02:59
栏目: 智能运维

在 Ubuntu 上配置 Kubernetes 服务发现

一 核心原理与组件

  • 服务发现依赖两大支柱:一是 Service 为一组 Pod 提供稳定的虚拟 IP(ClusterIP)与负载均衡入口;二是 CoreDNS 将 Service 自动注册为 DNS 记录,供集群内通过名称访问。Service 的完整域名格式为:..svc.cluster.local。Kubernetes 还支持通过环境变量注入服务信息,但仅对启动前已存在的 Service 有效,现代集群以 DNS 为主。CoreDNS 默认部署在 kube-system 命名空间,监听 API Server 变更并自动更新记录。

二 前置条件与检查

  • Ubuntu 节点上准备并加入集群(如使用 kubeadm 部署),确保网络插件(如 Flannel)已就绪,节点状态为 Ready
    • 安装工具:sudo apt-get update && sudo apt-get install -y apt-transport-https curl
    • 初始化控制面:sudo kubeadm init --pod-network-cidr=10.244.0.0/16
    • 部署网络插件:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    • 加入工作节点:使用 kubeadm join 输出的命令
    • 检查节点:kubectl get nodes
  • 确认 kube-proxy 正常运行(负责将 Service 的虚拟 IP 转发到后端 Pod):kubectl -n kube-system get pods -l k8s-app=kube-proxy。kube-proxy 支持 iptables(默认)与 ipvs(高性能)两种模式,可按需切换。

三 配置 CoreDNS 服务发现

  • 查看与确认 CoreDNS 部署:
    • kubectl -n kube-system get pods -l k8s-app=kube-dns
    • kubectl -n kube-system get svc kube-dns 应看到 ClusterIP(如 10.96.x.x)与端口 53/UDP、53/TCP
  • 按需调整 CoreDNS 配置(示例:添加静态解析与上游转发):
    • 编辑配置:kubectl -n kube-system edit configmap coredns -o yaml
    • 示例 Corefile 片段:
      .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        hosts {
          10.1.2.3 external-db.local
          fallthrough
        }
        forward . /etc/resolv.conf
      }
      
    • 使配置生效:kubectl -n kube-system rollout restart deployment coredns
  • 说明:
    • 默认 pods insecure 允许直接解析 Pod 名称(便于调试);生产可改为 pods verified 并配合 Pod 注解使用。
    • 通过 hosts 插件可添加静态记录;通过 forward 插件将未知域名转发至宿主机 /etc/resolv.conf 指定的上游 DNS。

四 应用接入与验证

  • 创建后端应用与 Service(示例):
    • 部署:kubectl apply -f deployment.yaml(nginx:latest,label: app=my-app)
    • 暴露:kubectl apply -f service.yaml
      apiVersion: v1
      kind: Service
      metadata:
        name: my-app-service
        namespace: default
      spec:
        selector:
          app: my-app
        ports:
          - port: 80
            targetPort: 80
        type: ClusterIP
      
  • 在集群内通过 DNS 访问与验证:
    • 临时调试容器:kubectl run -it --rm --restart=Never --image=busybox:1.36 --restart=Never – nslookup my-app-service.default.svc.cluster.local
    • 或在应用容器中直接请求 http://my-app-servicehttp://my-app-service.default.svc.cluster.local
  • 环境变量的局限说明:
    • 仅当 Pod 启动时已存在的 Service 才会被注入为环境变量(如 MYSERVICE_SERVICE_HOST/PORT);后续新增的 Service 不会自动出现,因此生产建议使用 DNS 方式。

五 常见问题与排查

  • Pod 无法解析内网域名:
    • 检查 dnsPolicy(默认 ClusterFirst),以及 Pod 内 /etc/resolv.conf 是否包含 nameserver 与正确的 search 域。
    • 查看 CoreDNS 日志:kubectl -n kube-system logs -l k8s-app=kube-dns --tail=50
    • 检查 Endpoints:kubectl get endpoints my-app-service 是否关联到后端 Pod IP
  • 外部域名解析异常:
    • 确认 CoreDNS 的 forward . /etc/resolv.conf 存在,且宿主机 /etc/resolv.conf 包含可用上游 DNS(如 8.8.8.8
  • 需要更高 DNS 性能或定制转发:
    • 在 CoreDNS 中调整 forward 插件顺序与上游列表;必要时切换 kube-proxyipvs 模式以提升 Service 转发性能。

0