首页主机资讯Kubernetes 服务发现如何在 Ubuntu 上配置

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

时间2026-01-21 19:49:04发布访客分类主机资讯浏览1063
导读:在 Ubuntu 上配置 Kubernetes 服务发现 一 核心原理与准备 服务发现依赖 Service + Endpoints + CoreDNS:Service 提供稳定的 ClusterIP 和端口,Endpoints 维护后端...

在 Ubuntu 上配置 Kubernetes 服务发现

一 核心原理与准备

  • 服务发现依赖 Service + Endpoints + CoreDNS:Service 提供稳定的 ClusterIP 和端口,Endpoints 维护后端 Pod IP:Port 列表,CoreDNS 为每个 Service 自动生成 DNS 记录,典型全名为 ..svc.cluster.local,Pod 内可直接用服务名访问。也可辅以环境变量注入,但 DNS 是主流方式。
  • 前置要求:在 Ubuntu 上部署好集群并安装 kubelet/kubeadm/kubectl,初始化 Master 后部署 Pod 网络插件(如 Flannel/Calico),确保节点状态为 Ready。示例初始化命令:sudo kubeadm init --pod-network-cidr=10.244.0.0/16;Flannel 安装:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml。

二 使用 Service 与 DNS 的标准做法

  • 创建后端应用 Deployment(示例为 nginx:1.25,标签 app=backend),暴露 80 端口。
  • 创建 Service(示例名 backend-svc,类型 ClusterIP,端口 80→80),标签选择器匹配 app=backend
  • 在集群内通过 DNS 访问:
    • 同命名空间:直接 http://backend-svc:80
    • 跨命名空间:使用全名 http://backend-svc..svc.cluster.local:80
  • 验证要点:
    • 查看 Endpoints 是否同步到后端 Pod IP:kubectl get endpoints backend-svc
    • 进入临时调试容器验证解析:kubectl run -it --rm --image=busybox:1.36 --restart=Never dns-test – nslookup backend-svc.default.svc.cluster.local
  • 最小示例清单(可直接 apply):
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
  labels:
    app: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
---
# backend-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-svc
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

说明:Service 创建后,Kubernetes 为该服务分配稳定的 ClusterIP,CoreDNS 为其生成记录;Endpoints 会自动维护后端 Pod IP 列表,实现自动发现与负载分发。

三 Headless Service 与有状态场景

  • 当需要对后端 Pod 逐一寻址(如数据库主从、有状态服务)时,将 Service 设置为 Headless(ClusterIP: None)。此时 DNS 不再返回单一 ClusterIP,而是返回匹配 Pod 的 A 记录列表,客户端可自行选择或实现自定义负载均衡。
  • 示例:
apiVersion: v1
kind: Service
metadata:
  name: backend-headless
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  clusterIP: None   # Headless
  • 验证解析(返回多个 Pod IP):kubectl run -it --rm --image=busybox:1.36 --restart=Never dns-test – nslookup backend-headless.default.svc.cluster.local。

四 对外暴露与路由

  • NodePort:在每个节点开放静态端口,将流量转发到 Service,适合测试或简单外部访问。
  • LoadBalancer:在云环境自动创建外部负载均衡器(需要云厂商支持)。
  • Ingress:基于 HTTP/HTTPS 的七层路由与域名统一入口,可与 Service 配合实现复杂路由规则。示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backend-svc
            port:
              number: 80

说明:Ingress 本身不是服务发现机制,而是建立在 Service/DNS 之上的路由层,常与 CoreDNS 配合实现外部域名访问。

五 常见问题排查

  • DNS 解析失败:确认 CoreDNSkube-system 命名空间运行(kubectl get pods -n kube-system -l k8s-app=coredns),检查 kube-dns Service 的 ClusterIP 是否分配,Pod 内 /etc/resolv.conf 应包含 nameserver 且 search 包含 svc.cluster.local
  • Endpoints 为空:核对 Service 的 selector 与后端 Pod 的 labels 完全一致;查看 Endpoints:kubectl get endpoints ;确认应用容器 containerPort 与 Service targetPort 一致。
  • 跨命名空间访问失败:使用全名 ..svc.cluster.local;或在客户端所在命名空间创建 ServiceAccount/RoleBinding 以允许跨命名空间解析与访问(如需要)。
  • Headless 未返回 Pod IP:确认 clusterIP: None 且 Endpoints 中有后端 Pod IP:Port;若使用 StatefulSet,建议结合 Headless Service 使用稳定的网络标识。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Kubernetes 服务发现如何在 Ubuntu 上配置
本文地址: https://pptw.com/jishu/789019.html
Ubuntu Kubernetes 故障排查有哪些方法 如何在 Ubuntu 上升级 Kubernetes 版本

游客 回复需填写必要信息