以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
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表的信息相同
查找30001端口相關規則
查找frontend的serviceip的相關規則(10.254.73.7)
結論:
不管是外部客戶端經過noded節點的30001訪問php-frontend仍是pod經過service的虛擬ip訪問php-frontend,最終都會被轉移到相同的自定義鏈上。
查看這個自定義鏈
關於動態調度的實現方法
總結:
一個service會引用一個自定義鏈用於維護與之關聯的pod
不管是經過service定義的nodePort仍是service的ip地址訪問service,相應的數據包都會傳遞到維護pod的自定義鏈上,最終使用DNAT修改目標地址爲被訪問容器的ip地址,並結合iptables的statistic模塊中的random模式,實現各個容器的負載均衡