k8s pod內部容器 K8S 容器之間通訊方式

2021-10-13 06:19:30 字數 2654 閱讀 6688

概述

首先k8s裡面容器是存在於pod裡面的,所以容器之間通訊,一般分為三種型別:

1. pod內部容器之間

2. pod 與 pod 容器之間

3. pod 訪問service服務

pod內部容器之間

這種情況下容器通訊比較簡單,因為k8s pod內部容器是共享網路空間的,所以容器直接可以使用localhost訪問其他容器。

k8s在啟動容器的時候會先啟動乙個pause容器,這個容器就是實現這個功能的。

pod 與 pod 容器之間

這種型別又可以分為兩種情況:

1. 兩個pod在一台主機上面

2. 兩個pod分布在不同主機之上

針對第一種情況,就比較簡單了,就是docker預設的docker網橋互連容器。

docker --daemon --bip=172.17.18.1/24

注意其中的「--bip=172.17.18.1/24」這個引數,它限制了所在節點容器獲得的ip範圍。

跨節點通訊時,傳送端資料會從docker0路由到flannel0虛擬網絡卡,接收端資料會從flannel0路由到docker0,這是因為flannel會新增乙個路由

傳送端:

route -n

172.17.0.0    0.0.0.0    255.255.0.0      u  0  0  0   flannel0

172.17.13.0  0.0.0.0    255.255.255.0  u  0  0  0   docker0

接收端:

172.18.0.0    0.0.0.0    255.255.0.0      u  0  0  0  flannel0

172.17.12.0  0.0.0.0    255.255.255.0  u  0  0  0   docker0

例如現在有乙個資料報要從ip為172.17.13.2的容器發到ip為172.17.12.2的容器。根據資料傳送節點的路由表,它只與172.17.0.0/16匹配這條記錄匹配,因此資料從docker0出來以後就被投遞到了flannel0。同理在目標節點,由於投遞的位址是乙個容器,因此目的位址一定會落在docker0對於的172.17.12.0/24這個記錄上,自然的被投遞到了docker0網絡卡。

flannel的原理是將網路包封裝在udp裡面,所以傳送端和接收端需要裝包和解包,對效能有一定的影響。

k8s也支援其他的網路模型,比較有名的還有calico,不過我並沒有使用過。

pod 訪問service服務

這裡涉及到k8s裡面乙個重要的概念service。它是乙個服務的抽象,通過label(k8s會根據service和pod直接的關係建立endpoint,可以通過kubectl get ep檢視)關聯到後端的pod容器。

service分配的ip叫cluster ip是乙個虛擬ip(相對固定,除非刪除service),這個ip只能在k8s集群內部使用,如果service需要對外提供,只能使用nodeport方式對映到主機上,使用主機的ip和埠對外提供服務。(另外還可以使用loadbalance方式,但這種方式是在gce這樣的雲環境裡面使用的 )。

節點上面有個kube-proxy程序,這個程序從master apiserver獲取資訊,感知service和endpoint的建立,然後做兩個事:

1. 為每個service 在集群中每個節點上面建立乙個隨機埠,任何該埠上面的連線會**到相應的pod

kube-portals-container 從容器中通過service cluster ip和埠訪問service的請求

kube-portals-host 從主機中通過service cluster ip和埠訪問service的請求

kube-nodeport-container 從容器中通過service nodeport埠訪問service的請求

kube-nodeport-host 從主機中通過service nodeport埠訪問service的請求。

見下面測試環境的內容:

-a kube-nodeport-container -p tcp -m comment --comment "smart/ccdb:port1521"  -m tcp --dport 50171 -j redirect --to-ports 52244

-a kube-nodeport-host -p tcp -m comment --comment "smart/ccdb:port1521" -m tcp --dport 50171 -j dnat --to-destination 10.45.25.227:52244

-a kube-portals-container -d 10.254.120.169/32 -p tcp -m comment --comment "smart/ccdb:port1521" -m tcp --dport 1521 -j redirect --to-ports 52244

-a kube-portals-host -d 10.254.120.169/32 -p tcp -m comment --comment "smart/ccdb:port1521" -m tcp --dport 1521 -j dnat --to-destination 10.45.25.227:52244

52244就是kube-proxy針對service 「"smart/ccdb:port1521"」 在節點上面監聽的埠。

參考:2. 《kubernetes權威指南》

k8s 容器鉤子

有兩個鉤子暴露在容器中 poststart 這個鉤子在建立容器之後立即執行。但是,不能保證鉤子會在容器入口點之前執行。沒有引數傳遞給處理程式。kind deployment metadata name testlifecycle labels spec replicas 1 selector mat...

容器編排工具k8s

如何實踐 1 搜尋kubunetes online kubernetes playground katacoda pod k8s最小排程單位 docker pause 二個容器 deployments 維持pod一定數量 service 解決deploytemnets內部之間的乙個負載均衡 dns解...

k8s的 容器映象

my registry.example.com 5000 example web example v1.0.1 2.綠色部分 registry 埠 3.紫色部分 repository 名字 4.紅色部分 image 名字 5.棕色部分 image 標籤 更新映象 如果您期望每次啟動 pod 時,都強...