Kubernetes中的Networking概念:
- 就是Pods的Networking
- 或是Container的Networking
首先要瞭解到:
- Pods怎麼建立的?
- Pod的Networking長啥樣?
- Pods間如果是同一個Node怎麼溝通得?
- Pods間如果是不同一個Node怎麼溝通得?
Kubernetes Networking:Container Communication
- 為什麼多了Pod這個抽象層是有用的?(而不直接用Container就好)
- Container vs Pod
- 甚麼情況下需要在單一Pod中建立多個Container?
- Pod中的Containers間如何溝通的?
Pods — 解決了PORT分配問題!:
- 每個Pod都有唯一的IP位置
- 在K8s Cluster中的不同的Pods間的IP位置都可以被觸及
如果沒有Pod會怎樣:
參考以前我個人本機的Dokcer Tool box來測試
例如起一個Postgres的Container
首先來到Dockerhub-Postgres找到拉Postgres的Docker指令:
同樣網頁下拉有介紹啟動時怎麼帶入密碼等
理論上可以執行如下指令順帶指定PORT:
docker run -p 5000:5432 -e POSTGRES_PASSWORD=pwd -d postgres
上述的5432 PORT是Container內Postgres使用的PORT
前面5000 PORT則是Container對應存活在機台上綁定的PORT
執行後並確認:
如果想再起第二個Postgres,唯一的選擇只有綁定不同host PORT如下:
如上,機台上本身的5000 PORT與5001 PORT相繼被(綁)咬住了!!
如果今天機台要跑上百個應用程式,誰能知道機台還剩哪些PORT沒被綁!?
但是使用Pod就能解決這個問題了
Pod就像個機台一樣也有自己的IP位置,並且通常只有一個Container在裡面
- Pod透過內部虛擬乙太網路可以連接到下底線基礎設施的網路中
- 亦即Pod本身就像是一台電子元件Host
- (如筆電那樣有自己IP位置&有範圍的PORTs來提供給裡面的Container)
所以不像Container直接跑在機台上咬住PORT
用Pod則不在擔心PORT的Mapping
機台PORT的綁定問題則限縮到Pod之內
但是Pod內運作的Container通常頂多到6個就很多了
這樣就容易釐清那些PORT被綁了(畢竟頂多6個容器跑在Pod裡面)
所以考慮到有微服務應用程式都使用8080 PORT,如下跑在多個Pods
完全不會有機台PORT 8080被單一應用程式搶走的問題!!!
因為是各自Pod的8080 PORT被綁定,真實機台(Node)沒有問題!
No Conflits!
Pods間就好像各子獨立隔絕的機台一樣
好處:
- 容易更換Container Runtime
- Kubernetes的configuration還是保持一樣(因為設定檔還在Pod level)
- 亦即Kubernetes與Container Runtime Implementation之間為低耦合!
再來還有個問題是,有些Pod內有複數個Containers:
- 這種情況通常用在一個輔助(Helper)或side(側邊)應用程式
- 來協助主要運作的應用程式
- 例如(Synchronising,Back-up等Container,又稱side-car Container)
- 其他還有像Authentication gateway...etc
至於Pod內多個Containers之間如何溝通呢?
- 如前面所述,Pod內也是一個獨立網路空間
- 所以內部多個Containers之間溝通就直接透過Pod內部網路
Pause Container:
- 注意當在Kubernetes內運行Docker Containers時
- 每個Pod內都會有一個side-car叫Pause Container
- 又被稱為"sandbox container"
- 其持有了Pod內的network namespace
- 其主要工作是設置預定並保留Pod內部網路空間供內部所有Container使用
- 使得Pod內複數個Containers之間得以保持溝通
- 並且Pod內某個Container掛了,在起新的Container後
- Pod會繼續在,並持有同樣的IP位置
- 但是如果是Pod掛掉,則新的Pod起來時會帶有新的IP位置
- 預設是隱藏的,但是docker ps -a可以看到它