Kubernetes 中的服务(Service)可以理解为对外暴露服务的最小单元对象,这个和 Pod 对象还是有不同的。例如用户通过发布服务对象 Deployment 发布应用,当在容器集群中启动后,ReplicaSet 副本对象会帮我们维持 Pod 实例的副本数。Pod 使用的容器网络默认会选择构建在主机网络上的覆盖网络(Overlay),默认外网是无法直接访问这些 Pod 实例服务的。为了能有效对接容器网络,Kubernetes 创建了另外一层虚拟网络 ClusterIP,即 Service 对象。从实现上来看,它借助 iptables 调用底层 netfilter 实现了虚拟 IP,然后通过相应的规则链把南北向流量准确无误的接入后端 Pod 实例。随着需求的衍生,后来扩展的 Ingress 对象则是借助第三方代理服务如 HAProxy、Nginx 等 7 层引流工具打通外部流量和内部 Service 对象的通路。Ingress 对象的目的就是为了解决容器集群中需要高性能应用网关接入的需求。
Service 的思考
Service 定义的网络基于 iptables 编排 netfilter 规则来支持虚拟 IP。Service 对象被设计为反向代理模式,支持南北向流量的负载均衡,通过 DNAT 把流量转到后端的具体业务的 Pod 中。为了劫持接入流量和 NAT 转换,Kubernetes 创建了两条自定义链规则 PREROUTING 和 OUTPUT。如:
-A