Kubernetes解析-service网络实现
在说完pod的网络通信之后,我们再来看service的网络实现。和pod一样,每个service也有k8s为其分配的ip,称为cluster ip。在k8s的内部网络中,通过访问cluster ip就可以访问service。
# kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
index-api 192.168.3.168 <none> 30080/TCP 18d
kubernetes 192.168.3.1 <none> 443/TCP 94d
my-nginx 192.168.3.179 <nodes> 80/TCP 90d
nginx-kit 192.168.3.196 <nodes> 80/TCP 12d
rbd-rest-api 192.168.3.22 <none> 8080/TCP 60d
cluster ip可以认为是一个假ip,因为cluster ip没有关联任何物理或逻辑设备,完全定义iptables的规则链上。
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
# iptables -t nat -nL
Chain KUBE-SERVICES (2 references)
target prot opt source destination
KUBE-SVC-AU252PRZZQGOERSG tcp -- 0.0.0.0/0 192.168.3.22 /* default/rbd-rest-api: cluster IP */ tcp dpt:8080
Chain KUBE-SVC-AU252PRZZQGOERSG (1 references)
target prot opt source destination
KUBE-SEP-I6L4LR53UYF7FORX all -- 0.0.0.0/0 0.0.0.0/0 /* default/rbd-rest-api: */ statistic mode random probability 0.50000000000
KUBE-SEP-LBWOKUH4CUTN7XKH all -- 0.0.0.0/0 0.0.0.0/0 /* default/rbd-rest-api: */
Chain KUBE-SEP-I6L4LR53UYF7FORX (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- 172.16.99.6 0.0.0.0/0 /* default/rbd-rest-api: */
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/rbd-rest-api: */ tcp to:172.16.99.6:8080
Chain KUBE-SEP-LBWOKUH4CUTN7XKH (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- 172.16.99.7 0.0.0.0/0 /* default/rbd-rest-api: */
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/rbd-rest-api: */ tcp to:172.16.99.7:8080
Chain KUBE-MARK-MASQ (17 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000
在规则链中,service还会在pod上进行负载均衡(Chain KUBE-SVC-AU252PRZZQGOERSG),并且将destination ip转换为容器ip,最终发送到容器中。
对于从k8s网络外访问service,可以使用以下几种方式
- NodePort
- ingress
- proxy api
参考文献
[1]: 理解Kubernetes网络之Flannel网络
[2]: kubernetes从入门到放弃3--(网络原理)
[3]: Kubernetes(k8s)底层网络原理刨析
[4]: Create a minikube cluster