本文主要描述同乙個node之內的pod之間的通訊,以及不同node之間的pod之間的通訊。
同乙個
node上的不同
pod之間的通訊:
假設上圖的pod a要和pod b 通訊: pod a 傳送乙個包,目的ip為pod b,當包路由後,按路由從pod a的veth0介面出去。這是查詢veth0介面下的arp table,如果arp table中沒有pod b的record,則進行arp位址解析,即傳送arp request,請求reserve 10.1.20.3的mac位址,這個arp request包經docker0 bridge**到pod b,從而完成位址解析。於是pod a的包填充pod b的mac位址,從veth0發出去。
veth0/veth1是veth對,即從其中乙個介面的發包,就轉化為另乙個介面對該包的接收。所以,pod a從veth0發出的包,相當於docker0 bridge從veth1介面收到這個包。然後docker0 bridge查詢**表(key為dst mac),將包從veth0傳送,pod b則在veth1介面接收這個來自pod a的包,通訊完成。
不同
node上的不同
pod之間的通訊:
假設上圖的poda 要和另外乙個node上的pod x通訊,pod x的pod ip為10.1.15.2/24.
pod a組包:
src ip: 10.1.20.2 dst ip: 10.1.15.2
由於10.1.15.2和自己不在同乙個網路10.1.20.0/24, 包需要經veth0傳送到自己的閘道器10.1.20.1(docker0 bridge)。然後開始填充mac, 自然目的mac為docker0 bridge的mac。
當包通過veth對到達docker0 bridge。
docker0 bridge收到這個包後,丟給核心網路協議棧處理,網路協議棧經過路由發現,這個包的目的位址不是本機,則forward。forward時重新進行路由,即查詢dst ip 為10.1.15.2的route entry。這個dst ip 為10.1.15.2的route entry的out device為flannel0,則將包傳送給flannel0裝置處理。
flannel0是乙個虛擬的vxlan裝置,收到這個包後,構建這個包的mac層。
如果flannel0的arp table沒有10.1.15.2對應的mac位址,則會觸發乙個kernel事件: l3 miss。
使用者空間有個程序flanneld收到這個l3 miss事件後,從etcd中取得10.1.15.2的mac位址,以及其對應的node的ip位址(假設為192.168.12.100),然後將arp資訊填充到flannel0裝置下,使得flannel0裝置能構建發向10.1.15.2的mac位址。然後flannel0裝置構建eth/ip/udp/vxlan包來傳送pod a要傳送到10.1.15.2的包(eth packet):
(下圖為pod a 發向10.1.15.2的原始包)
(下圖為pod a 發向10.1.15.2的vxlan包)
src mac: pod a所在的node的eth0, dst mac: pod x所在的node的eth0
src ip: pod a所在的node的eth0 ip- 192.168.0.200, ds tip: pod x所在node的eth0 ip – 192.168.12.100.
於是pod a發出的包就被整個封裝在vxlan裡面傳送到對端node上。
k8s集群建立pod,執行pod
k8s集群搭建好後,各個node的狀態變成了ready,就可以建立pod,建立完成後,就會預設的執行其中的container。使用乙個簡單yaml檔案描述pod apiversion v1 必選,版本號,例如v1,版本號必須可以用 kubectl api versions 查詢到 kind pod ...
k8s檢視pod的命令
引數解析 name pod名 ready 準備好的副本數 status 狀態 restarts 重啟 age 已經執行的時間 kubectl get pod o wide 引數解析 ip ip位址 node 執行節點 nominated node 指定節點 kubectl describe pod ...
k8s排程 原理 K8s排程原理和Pod生命週期
1 k8s排程原理 pod只存在某乙個物理節點上,可以執行多個container 2 pod的生命週期 暫停pod,可以暫停deployment kubectl get depolyment kubectl scale replicas 0 deployment 刪除pod。刪除之後,狀態變成suc...