Service 的请求会先从用户空间进入内核 iptables,将其转发到本地的服务代理端口,然后再回到用户空间,由 kube-proxy 完成后端 Endpoints 的选择和代理工作。
如此,反复在用户空间和内核空间之间切换,非常影响服务性能。
kube-proxy 持续监听 Service 以及 Endpoints 对象的变化;对每个 Service,在本地节点开放一个端口,作为其服务代理端口。发往该端口的请求会采用一定的策略转发给与该服务对应的后端 Pod 实体。
+--------+ +---------+
| Client | -----> | CoreDNS | -----+
+--------+ +---------+ |
|
+------------+ +----------+ |
| kube-proxy | <----- | iptables | <----+
+------------+ +----------+
|
+---------|---------+
| | |
| | |
+-----+ +-----+ +-----+
| Pod | | Pod | | Pod |
+-----+ +-----+ +-----+
目前 K8s 正在移除 user space 相关代码,未来全部移除后将废弃 user space 模式