Kubernetes CKA課程筆記 20

Networking in K8s,and Container Communication

ZONGRU Li
Oct 16, 2021

首先看看Master node狀態仍有幾項異常:

coredns只在Pending,且Node沒有Ready

其實上述兩個問題出在還沒在Kubernetes內安裝Pod Network!!!!

至於啥是Pod Network?

並且Kubernetes內部的Networking怎麼溝通?

後面會理解其概念並安裝Networking application或稱Networking Layer

來將上述問題修正!!!

Kubernetes中的Networking概念:

  1. 就是PodsNetworking
  2. 或是ContainerNetworking

首先要瞭解到:

  1. Pods怎麼建立的?
  2. Pod的Networking長啥樣?
  3. Pods間如果是一個Node怎麼溝通得?
  4. 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指令:

執行後就開始下在Postgres的image

同樣網頁下拉有介紹啟動時怎麼帶入密碼等

理論上可以執行如下指令順帶指定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被單一應用程式搶走的問題!!!

因為是各自Pod8080 PORT被綁定,真實機台(Node)沒有問題!

No Conflits!

Pods間就好像各子獨立隔絕的機台一樣

好處:

  • 容易更換Container Runtime
  • Kubernetesconfiguration還是保持一樣(因為設定檔還在Pod level)
  • 亦即KubernetesContainer Runtime Implementation之間為低耦合!

再來還有個問題是,有些Pod內有複數個Containers:

  • 這種情況通常用在一個輔助(Helper)或side(側邊)應用程式
  • 來協助主要運作的應用程式
  • 例如(Synchronising,Back-upContainer,又稱side-car Container)
  • 其他還有像Authentication gateway...etc
side-car

至於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可以看到它

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet