kubernetes网络模型分析

以kubernetes的helloworld为例,分析kubernetes的网络模型php

kubernetes版本:1.3.7node

 

拓扑:docker

kube-apiserverapi

192.168.1.200网络

 

node1负载均衡

192.168.1.202 frontend

docker0:  10.0.1.1/24dom

 

node2ide

192.168.1.203spa

docker0: 10.1.2.1/24

 

不一样node上的容器之间的链路,已用quagga打通

 

helloworld

wKiom1h7j6eSnFZCAAHAwzoq9Pg964.png

 

wKiom1h7j8LyXVuOAAI-z_C53Eo234.png

 

 

kubernetes网络模型的简单描述:

1. pod之间经过service进行相互访问

①service的ip地址为与之关联的全部pod的公共虚拟ip

②全部pod能够经过访问service的ip地址,自动调度到service关联的任意一个pod上

 

2. 外部client访问pod

①经过配置service的nodePort在全部node上映射一个指定端口

②外部client能够经过访问任意一个node的指定端口,自动调度到service关联的任意一个pod上

 

以上的两大功能是由kube-proxy修改iptables的nat表的规则来实现的

 

 

查看iptables信息:

iptables -t nat -L -n   

//查看每一个node节点的nat表的信息,kube-proxy根据从kube-apiserver上获取的service以及pod信息,修改nat表的规则。所以每一个node节点上看到的nat表的信息相同

 

wKioL1h7j-HQFwR_AAI6k4ETjjA500.png

 

查找30001端口相关规则

wKiom1h7j_ugU9O1AADg12BS20Y904.png

 

查找frontend的serviceip的相关规则(10.254.73.7)

wKioL1h7kBazXFznAAEwLRsQsEc135.png

结论:

不管是外部客户端经过noded节点的30001访问php-frontend仍是pod经过service的虚拟ip访问php-frontend,最终都会被转移到相同的自定义链上。

 

查看这个自定义链

wKiom1h7kC7jIR5RAACVcJtIRMY525.png

 

wKiom1h7kEXxBpC_AADrSuVXfnc387.png

 

wKioL1h7kFuyW-vqAADL02ljFZc920.png

 

 

关于动态调度的实现方法

wKioL1h7kHXCzFmWAAEL-kjisbE035.png

 

 

总结:

  1. 一个service会引用一个自定义链用于维护与之关联的pod

  2. 不管是经过service定义的nodePort仍是service的ip地址访问service,相应的数据包都会传递到维护pod的自定义链上,最终使用DNAT修改目标地址为被访问容器的ip地址,并结合iptables的statistic模块中的random模式,实现各个容器的负载均衡

相关文章
相关标签/搜索