Kubernetes 最小部署單位 Pod

Kubernetes Pod 簡介與使用範例

ta-ching chen

2 minute read

 文章目錄

Pod 

在 Kubernetes 中最小的部署單位 Pod 係由一至多個容器所組成,而在一般應用層面上由於下述幾點原因,使其較接近於一般使用的 VM:

  • 共享同樣的 IP 位址及 Port space
  • 共享儲存空間 (volumes)
  • 耦合性較高之應用

共享同樣的 IP 位址及 Port space 

相較於 Docker 中每個容器會擁有各自獨立的 IP,Kubernetes 則是每個在 Pod 內的容器會共享同樣的 IP address 以及 Port space。最直接的好處就是同個 Pod 內的容器可以透過 localhost 來互相溝通。這點和我們在使用一般虛擬機是相同的情況: one prcoess find others with localhost:port

由於擁有各自 IP 位址,因此每個位處於同樣 Kubernetes 集群內的 Pod 可以直接透過該 IP 和其他 Pod 進行聯繫,但一般而言我們會透過 service 來取代直接 Pod 存取,這其中表明一件很重要的事情: 在 Cloud 環境中有人做比起誰做來得重要。

共享儲存空間 (volumes) 

Kubernetes 支援許多不同種類的 Volumes,舉例來說 emptyDir 會在 Pod 建立時一併建立起來、Pod 結束時刪除,Pod 內的容器可以自由儲存所有放在該 volume 內的檔案。

試想當我們同時執行一個應用程式以及一個 Log parser 在同個 Pod 內時,應用程式只要把生成的日誌放置到 volume 內,然後由 Log parser 來讀取並監控異常狀況,達到分工的效果。由於兩者的容器映像檔是完全獨立的,因此在大型團隊進行開發時,在格式保持相同的狀況下,兩個映像檔可以獨立升級而不必影響彼此,讓團隊能夠專心在各自的業務範圍內全速衝刺。

耦合性較高之應用 

通常來說容器內只會執行單一的應用程式,但很多情況下我們會需要 sidecar container 來輔助主容器,正如前面的所說我們可以將應用程式與 Log parser 放置在同個 Pod,讓 Pod 的功能性更加完整。

在所謂的 pre-container world 這些程式往往會放置在同個 VM 中來一併執行,而在 Kubernetes 這些程式轉變成為一個個獨立的容器並同時在 Pod 中執行。

Service container and sidecar containers

動手做 

接著我們來建立一個含有兩個容器: backendfrontend 的 pod

  • backend: 固定每秒將現在時間輸出到位於共享儲存空間的 index.html (/tmp/index.html)
  • frontend: 上面執行 HTTP 伺服器來將共享儲存空間內的 index.html 呈現給使用者
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    service: example-pod
spec:
  containers:
    - name: backend
      image: ubuntu
      command:
        - "bash"
        - "-c"
      args:
        - "while true; do date > /tmp/index.html ; sleep 1; done"
      volumeMounts:
        - mountPath: /tmp # the mount point for volume
          name: content-volume # should match the volume name defined below
    - name: frontend
      image: trinitronx/python-simplehttpserver
      command:
        - "sh"
        - "-c"
      args:
        - "python -m SimpleHTTPServer 8080"
      ports:
        - containerPort: 8080
      volumeMounts:
      - mountPath: /var/www # we can define different mount point for different container
        name: content-volume
  volumes:
    - name: content-volume
      emptyDir: {}

找到 pod 在 Kubernetes 集群內的內部 IP

$ kubectl get pod -o wide
NAME                    READY     STATUS    RESTARTS   AGE       IP             NODE
example-pod             2/2       Running   0          4m        172.16.31.4    10.101.0.199

接下來,嘗試抓取該網頁應該就會出現當下的時間!

$ curl http://172.16.31.4:8080
Sun Nov 27 15:25:04 UTC 2016

延伸閱讀 


comments powered by Disqus