centos k8s部署怎样进行服务发现
导读:CentOS 上 Kubernetes 服务发现实践 一 核心原理 在 Kubernetes 中,服务发现由两层共同完成: 通过 Service 为一组 Pod 提供稳定的虚拟 IP(ClusterIP)和端口; 通过 CoreDNS...
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> :< NodePort>
- 将 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 < svc-name> -n < namespace>
- 检查 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 权限)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos k8s部署怎样进行服务发现
本文地址: https://pptw.com/jishu/752156.html
