CentOS上的K8s服务发现机制主要通过以下方式实现:
- DNS服务发现:
- 基于CoreDNS(默认DNS服务器),为Service和Pod分配域名,如
service-name.namespace.svc.cluster.local
,支持动态解析服务IP。
- 支持SRV记录解析端口,如
_http._tcp.service-name.namespace.svc.cluster.local
。
- 环境变量:
- Pod启动时,Kubernetes注入集群内所有Service的IP和端口,格式为
{SERVICE_NAME}_SERVICE_HOST
和{SERVICE_NAME}_SERVICE_PORT
,但仅在Pod创建时更新,不推荐用于动态场景。
- Service与Endpoint资源:
- Service通过Label Selector关联Pod,定义虚拟IP(ClusterIP)和端口,流量由kube-proxy转发至后端Pod。
- Endpoint记录Service对应Pod的IP和端口,实时更新以应对Pod变化。
- kube-proxy组件:
- 监听Service和Endpoint变化,通过iptables/IPVS规则实现流量转发,屏蔽后端Pod IP变化,提供负载均衡。
- Ingress资源(外部访问):
- 管理外部HTTP/HTTPS访问,配合Ingress Controller实现路由、负载均衡和SSL终止。
- Service Mesh(高级场景):
- 如Istio、Linkerd,提供更细粒度的流量管理、故障恢复和可观测性,适用于复杂微服务架构。
核心逻辑:通过DNS解析、Service抽象和kube-proxy的流量转发,实现服务在集群内的动态发现与可靠通信,无需依赖Pod的固定IP。