Kubernetes- Pod 學習紀錄
本節會學習到
- Pod的核心概念
- 如何創建pods
- 檢查pod的健康狀態
Pod的核心概念
Pod的概念,引述K8S官網:
Pods are the smallest deployable units of computing that you can create and manage in Kubernetes.
最小運行單位
簡單來說就是,K8S運行的最小單元,包含著一個或多個containers,這些container
- 彼此共享同樣的儲存與網路資源
- 都吃著同樣的設定
Pod有著自己的IP
可以說Pods提供了Containers運行所必要的環境,Pod擁有自己的
- IP address
- 這些在同一個pod內的container都共享著同樣的loopback network interface (localhost)
- 容器間可以透過
localhost
(127.0.0.1)溝通
- 容器間可以透過
- 不同的container必須要在不同的port監聽服務
- 不同的container在不同pod可以有相同的port
- 這些在同一個pod內的container都共享著同樣的loopback network interface (localhost)
- memory usage
- storage volumes
Pods都會運行在一個Node環境內,且為Node定義ReplicaSet
,必須要滿足N個運行正常的pods,若pods有問題,k8s會置換掉
Pod就像是之前透過Docker Compose,管理一組container的啟動與運作
透過組成多個container的pod,來打造輕量級的VM
不過通常來說一個Pod內只會運行一個container服務,運行多個container的情況是少見的
為何要有Node這個角色??
通常Node扮演管控底下Pods的角色,因為某些Pods需要特定機器規格的資源。
例如我們有Node專門訓練AI models的Pods,以及有Node專門運行區塊鏈節點的Pods,每個Node所具備的硬體資源就會因應不同需求而有所不同
這篇文章講述了Pod在Node的角色,可以瀏覽看看
Medium: DevOps: Where is My PodPod — Pod Arrangement by smalltown
如何創建一個pod
以直接方式創建
- 直接創造一個pod:
kubectl run [podname] --image=imageName:version
本範例會創建一個有nginx的pod
nginx是可用來架設web services的工具,nginx official site 任意門
1 | $ k run nginx-pod --image=nginx:alpine |
透過yaml方式創建
kubectl create/apply [yaml file]
此方法好處是,可以把每次的創建過程透過yaml給記錄到版本控制中
yaml是什麼?? 請看這裡 -> link
範例: 用yaml檔案定義一個nginx pod
指令
1 | $ kubectl create -f file.pod.yml --dry-run --validate=true |
-f
yaml檔案--validate
預設為true,驗證yaml檔案是否合規--dry-run
會先試驗產出建立後結果,但不會真的建立
範例: 用apply方式套用yaml設定,並創造出pod
指令
1 | $ kubectl apply -f file.pod.yml |
要注意這方法,要在一開始用kubectl create
時,需搭配--save-config
才能夠用kubectl apply
--save-config
會將pod的資訊儲存到 yaml檔案中的annotations
中
yaml範例
1 | apiVersion: v1 |
1 | $ k create -f nginx.yaml |
查看pod資訊
1 | $ k get pods |
指定剛創建好的nginx pod,因為創建時有透過--save-config
,可看到有annotation,說明目前版本是什麼
透過kubectl describe pod my-nginx
查看pod運行資訊
- ip address
- event: 創建pod時發生的事件,可用來除錯用
接著再使用kubectl apply
來變更pod
1 | $ kubectl apply -f nginx.yaml |
透過 kubectl exec [pod]
進入pod內的環境
1 | $ kubectl exec my-nginx -it sh |
取得pods資訊
1 | $ kubectl get pods |
輸出結果
1 | $ kubectl get pods |
將pods對外開放連接
k8s創建pods時預設是只能在k8s cluster內連線,意思就是無法透過本機ping到在k8s架設好的nginx pod,所以要透過port-forward
方式才行
指令
1 | $ kubectl port-forward [name of pod] [external port]:[internal (in k8s) port] |
範例
1 | $ kubectl port-forward nginx-pod 8080:80 |
砍掉pod
指令
1 | $ kubectl delete pod [name-of-pod] |
範例
1 | $ kubectl delete pod nginx-pod |
不過要注意的是,若在deployment中定義replicaSet,要滿足一定pod的運行數量,那砍掉後會在被重新創造出來
正式砍掉pod的方法,也必須把管理pod的deployment給砍掉
1 | $ kubectl delete deployment [name-of-deployment] |
也可以透過 yaml方式砍掉
1 | $ kubectl delete -f [yaml file] |
檢查Pod的健康狀態
透過Probe方式,檢查Pod的狀況
有兩種Probe:
- Liveness Probe
- 檢查pod是否運作正常
- Readiness Probe
- 檢查Pod是否可以收到請求
Probe Action種類
- ExecAction
- 在container內執行動作
- TCPSocketAction
- 以TCP Check方式檢查container的IP address以及port
- HTTPGETAction
- 以HTTP GET請求方式對container做測試
會有以下狀態
- Success
- Failure
- Unknown
範例
在yaml檔案中定義要檢查的probe類型
HTTPGETAction類型
1 | apiVersion: v1 |
ExecAction類型
1 | apiVersion: v1 |
這個範例會在pod啟動時,執行以下動作
1 | $ touch /tmp/healthy; # 創建簡單的檔案 healthy |
tmp/healthy
的檔案被砍掉後,liveness probe就無法成功執行 cat /tmp/healthy
指令,就會發生錯誤,通知k8s要重新創建pod服務
搭配Readiness Probe類型 (也可以與Liveness Probe同時定義)
1 | apiVersion: v1 |
實際執行看看,透過kubectl create -f [yaml]
來創建pod,可看到nginx服務運作正常
由於我們在yaml檔案中有定義liveness probe與readiness probe,透過httpGet
方式確認網頁服務是否還活著否,這時將nginx內的預設index.html
給砍掉,來看看liveness probe會給出怎樣的警告
砍掉後nginx服務也終止了,表示k8s也正準備重新啟動container
接著透過 kubectl describe pod [pod name]
來看看readiness probe的訊息,可以看到liveness probe與readiness probe無法成功讀取index.html首頁。
但liveness probe還會做一件事,那就是失敗次數達到yaml檔案內定義的failureThreshold
次數後,會請k8s重新啟動pod的ningx服務
Readiness Probe與Liveness Probe差異
-
Liveness Probe: 定義container什麼時候才重啟
-
Readiness Probe: 定義container什麼時候才能開始接收請求或流量
參考
- Kuberetes Pods:
- Kubernetes for Developers: Core Concepts