创建service后,kubernetes会发生什么?
内容提要
本文介绍了Kubernetes中的Service概念和创建流程,Service用于提供服务的抽象集合,实现负载均衡和网络访问。文章还解释了Service、Endpoint、Pod和kube-proxy组件之间的关联协作结构。创建Service的流程包括用户请求、api-server鉴权和写入etcd、Endpoint-controller生成Endpoint资源对象、kube-proxy生成节点规则等。Endpoint-controller负责监听Service和Pod的变化,管理Endpoint的生命周期。
延伸解读
ClusterIP 并非真实 IP,理解其虚拟性很关键
文章指出 Service 的 ClusterIP 是虚拟 IP,实际流量转发依赖节点上的 kube-proxy 维护 iptables 或 ipvs 规则,将目的地址 DNAT 为后端 Pod IP。这意味着集群外节点无法直接访问 ClusterIP,因为外部节点没有 kube-proxy 刷新规则。读者需注意:ClusterIP 的可达性完全取决于节点规则,而非网络路由。
Endpoint-controller 是 Service 与 Pod 的桥梁
Endpoint-controller 通过 watch 机制监听 Service 和 Pod 变化,动态维护同名 Endpoint 对象。当 Pod 异常时,它会将 Pod IP 从 Endpoint 后端列表中剔除;Pod 恢复或新建后重新加入。这一机制确保 Service 的后端列表始终与健康 Pod 同步,是负载均衡准确性的基础。读者应理解 Endpoint 并非静态配置,而是随 Pod 生命周期实时调整。
Headless Service 的特殊性:无 IP 也无转发规则
文章提到 Headless Service 没有 ClusterIP,kube-proxy 不会为其创建 iptables/ipvs 转发规则。这种设计适用于客户端需要直接发现并选择后端 Pod 的场景,绕过 Service 的负载均衡。读者需注意:Headless Service 的访问依赖 DNS 解析返回 Pod IP 列表,而非虚拟 IP 转发,因此客户端需自行处理负载均衡和连接逻辑。
Q&A
Kubernetes 为什么需要引入 Service?
因为 Pod 实例的 IP 地址会随着工作负载生命周期的变化而变化,直接通过 Pod IP 访问不再实用;同时需要将流量请求负载均衡转发到多个后端 Pod 实例。
Kubernetes 中的 Service 有哪些类型?各自有什么用途?
ClusterIP:默认类型,分配虚拟 IP,仅集群内可访问;NodePort:将 Service 端口映射到每个 Node 的端口,供集群外通过节点 IP+端口访问;LoadBalancer:映射到云厂商的负载均衡器 IP;ExternalName:将集群外部服务引入集群内;Headless Service:无访问入口(无 IP),kube-proxy 不创建转发规则,由客户端直接发现后端实例。
为什么集群外节点无法直接访问 Service 的 ClusterIP?
ClusterIP 是虚拟 IP,并非真实 IP。它依赖节点上的 kube-proxy 组件刷新 iptables 或 ipvs 规则,将报文目的 IP 从 ClusterIP DNAT 转换为 Pod IP 来打通。集群外节点没有 kube-proxy 组件刷新相关规则,因此无法访问 ClusterIP。
创建一个 Service 后,Kubernetes 各组件是如何协同工作的?
用户通过 kubectl 向 api-server 发起创建请求;api-server 鉴权、准入控制后写入 etcd;Endpoint-controller 通过 watch 机制感知 Service 变化,结合 Pod 标签生成 Endpoint 资源并写回 etcd;kube-proxy 通过 watch 感知 Service 和 Endpoint 变化,在每个节点上生成 iptables 或 ipvs 规则。
Endpoint-controller 的职责是什么?它如何管理 Endpoint?
Endpoint-controller 监听 Service 和 Pod 的变化,管理 Endpoint 的生命周期:Service 创建时创建同名 Endpoint,并根据标签获取关联 Pod IP 和端口;Service 更新时更新对应 Endpoint;Service 删除时删除同名 Endpoint;Pod 变化时更新 Endpoint 的 Pod IP 列表,剔除异常 Pod,恢复或新建后重新加入。
Headless Service 和普通 Service 有什么区别?
Headless Service 没有访问入口(即没有 IP 地址),kube-proxy 不会为其创建 iptables/ipvs 转发规则,客户端直接发现和选择后端实例;普通 Service 有 ClusterIP,通过 kube-proxy 实现负载均衡和转发。