Kubernetes 最小部署單位 Pod
Kubernetes Pod 簡介與使用範例
文章目錄
在 Kubernetes 中最小的部署單位 Pod 係由一至多個容器所組成,而在一般應用層面上由於下述幾點原因,使其較接近於一般使用的 VM:
- 共享同樣的 IP 位址及 Port space
- 共享儲存空間 (volumes)
- 耦合性較高之應用
相較於 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 環境中有人做比起誰做來得重要。
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 中執行。
接著我們來建立一個含有兩個容器: backend
、frontend
的 pod
- backend: 固定每秒將現在時間輸出到位於共享儲存空間的 index.html (/tmp/index.html)
- frontend: 上面執行 HTTP 伺服器來將共享儲存空間內的 index.html 呈現給使用者
apiVersion: v1
kind: Pod
metadata:
name: example-pod
namespace: default
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
由於 172.16.31.4
這組 IP 是只有在 Kubernetes 叢集內可以存取到,所以我們額外開啟一個 Pod 來測試
$ kubectl -n default run curl-test --image=radial/busyboxplus:curl -i --tty --rm
接下來,嘗試抓取該網頁應該就會看到 web server 回應當下的時間!
[ root@curl-test-74cc7dc45f-4qjk4:/ ]$ curl http://172.16.31.4:8080
Mon Jun 25 05:51:54 UTC 2018
相關文章
- Kubernetes 兩步安裝一次上手
- Kubernetes Service 深度剖析 - 標籤對於 Service 的影響
- 從 Google Kubernetes Engine 移除節點
- Kubernetes Service 深度剖析 - 存取路徑差異
- Kubernetes Service 概念詳解
文章內容的轉載、重製、發佈,請註明出處: https://tachingchen.com/tw/
Twitter
Google+
Facebook
Reddit
LinkedIn
StumbleUpon
Pinterest
Email