阅读量:2
CentOS 上 Kubernetes 服务发现实践
一 核心原理
- 在 Kubernetes 中,服务发现由两层共同完成:
- 通过 Service 为一组 Pod 提供稳定的虚拟 IP(ClusterIP)和端口;
- 通过 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 - 如需从集群外部访问,可创建 NodePort 或 LoadBalancer 类型的 Service(见下一节)。
- 创建后端 Deployment(标签 app=web):
三 方式二 环境变量注入
- 机制说明
- 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_* 变量。
- 若已存在名为 redis-master 的 Service(端口 6379),客户端 Pod 内将自动拥有:
四 对外暴露与 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>:
- 将 Service 类型设为 NodePort,在每个节点开放静态端口,外部通过 NodeIP: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-n
- 检查 CoreDNS 运行状态与解析:
- 常见问题
- Pod 内无法解析:检查 /etc/resolv.conf 的 nameserver 是否为 kube-dns 的 ClusterIP,以及搜索域是否包含 svc.cluster.local。
- 环境变量方式拿不到服务:确认 Service 是否在客户端 Pod 之前创建,且处于同一命名空间。
- DNS 记录未及时生效:确认 CoreDNS 已监听 Service/Endpoint 事件并具备相应 RBAC 权限(常见为对 services、endpoints、pods、namespaces 的 list/watch 权限)。
以上就是关于“centos k8s部署怎样进行服务发现”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm