首页主机资讯centos k8s部署怎样进行服务发现

centos k8s部署怎样进行服务发现

时间2025-11-20 16:17:04发布访客分类主机资讯浏览1305
导读:CentOS 上 Kubernetes 服务发现实践 一 核心原理 在 Kubernetes 中,服务发现由两层共同完成: 通过 Service 为一组 Pod 提供稳定的虚拟 IP(ClusterIP)和端口; 通过 CoreDNS...

CentOS 上 Kubernetes 服务发现实践

一 核心原理

  • 在 Kubernetes 中,服务发现由两层共同完成:
    1. 通过 Service 为一组 Pod 提供稳定的虚拟 IP(ClusterIP)和端口;
    2. 通过 CoreDNS 将“服务名”自动解析为 ClusterIP,供集群内应用以名称访问。
  • 同时,Kubernetes 为每个 Service 自动维护 Endpoints 对象,保存符合标签选择器的后端 Pod IP:Port 列表,实现后端实例的动态变更与负载分发。
  • v1.11 起默认使用 CoreDNS(早期为 kube-dns),应用的 /etc/resolv.conf 会被自动配置为使用集群 DNS。

二 方式一 DNS 名称解析

  • 前提条件
    • 集群已部署 CoreDNS(kube-system 命名空间运行),并且 kubelet 为 Pod 正确配置了 DNS 服务器与搜索域(常见为 kube-dns.kube-system.svc.cluster.local)。
  • 基本用法
    • 同命名空间直连:在 default 命名空间创建名为 web 的 Service,其他 Pod 可直接用域名 web 访问。
    • 跨命名空间访问:使用全域名 web.namespace.svc.cluster.local
  • 快速示例
    • 创建后端 Deployment(标签 app=web):
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: web
        labels:
          app: web
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: web
        template:
          metadata:
            labels:
              app: web
          spec:
            containers:
            - name: web
              image: nginx:1.25
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: web
        namespace: default
      spec:
        selector:
          app: web
        ports:
        - port: 80
          targetPort: 80
      
    • 在集群任意 Pod 内测试解析与访问:
      kubectl run -it --rm dns-test --image=busybox:1.36 --restart=Never -- nslookup web
      kubectl run -it --rm dns-test --image=busybox:1.36 --restart=Never -- curl http://web
      
    • 如需从集群外部访问,可创建 NodePortLoadBalancer 类型的 Service(见下一节)。

三 方式二 环境变量注入

  • 机制说明
    • kubelet 会在 Pod 启动时,将同一命名空间中已存在的 Service 以环境变量形式注入,如:{ SVCNAME} _SERVICE_HOST{ SVCNAME} _SERVICE_PORT
    • 限制:
      • 仅对“先于客户端 Pod 创建”的 Service 生效;
      • 名称需大写,横线转下划线;
      • 跨命名空间不可用。
  • 示例
    • 若已存在名为 redis-master 的 Service(端口 6379),客户端 Pod 内将自动拥有:
      • REDIS_MASTER_SERVICE_HOST=10.0.0.11
      • REDIS_MASTER_SERVICE_PORT=6379
      • 以及若干 REDIS_MASTER_PORT_6379_TCP_* 变量。

四 对外暴露与 7 层路由

  • NodePort
    • 将 Service 类型设为 NodePort,在每个节点开放静态端口,外部通过 NodeIP:NodePort 访问:
      kubectl expose deploy nginx --name=svc-nginx --type=NodePort --port=80 --target-port=80 -n dev
      # 获取映射端口
      kubectl get svc svc-nginx -n dev -o wide
      # 外部访问示例:http://<
          任意节点IP>
          :<
          NodePort>
          
      
  • LoadBalancer
    • 在云环境或支持 LB 的平台上,使用 LoadBalancer 类型自动创建外部负载均衡器。
  • Ingress
    • 基于 Ingress Controller(如 Nginx Ingress)提供 HTTP/HTTPS 7 层路由、域名与路径转发、TLS 终止等能力,适合对外统一入口与路由治理。

五 验证与常见问题

  • 验证要点
    • 检查 CoreDNS 运行状态与解析:
      kubectl get pods -n kube-system -l k8s-app=coredns
      kubectl logs -n kube-system deploy/coredns
      kubectl run -it --rm dns-test --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local
      
    • 查看 Endpoints 是否正确关联后端 Pod:
      kubectl get endpoints <
          svc-name>
           -n <
          namespace>
          
      
  • 常见问题
    • Pod 内无法解析:检查 /etc/resolv.conf 的 nameserver 是否为 kube-dnsClusterIP,以及搜索域是否包含 svc.cluster.local
    • 环境变量方式拿不到服务:确认 Service 是否在客户端 Pod 之前创建,且处于同一命名空间。
    • DNS 记录未及时生效:确认 CoreDNS 已监听 Service/Endpoint 事件并具备相应 RBAC 权限(常见为对 services、endpoints、pods、namespaces 的 list/watch 权限)。

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


若转载请注明出处: centos k8s部署怎样进行服务发现
本文地址: https://pptw.com/jishu/752156.html
centos与k8s网络配置 centos k8s部署怎样配置网络

游客 回复需填写必要信息