Kubernetes解析-service网络实现

113 阅读1分钟

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