今天會用一個簡單範例跟大家分享 Pods 的生命週期,藉由範例觀察 Pods status 的變化。但在此之前先,另外介紹一個在本機啟用 Kubernetes 的方式,如果有安裝 Docker Desktop 的話,可以透過介面的方式,產出本地運行的 Kubernetes cluster,與 MineKube 不同的是它提供 GUI,這在我們觀察狀態進行監控的時候會更加友善。
Docker Desktop Perferences
Active
Apply GUI
> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
> kubectl proxy
Starting to serve on 127.0.0.1:8001
Add Token
Token create 請參考
Success
安裝過程遇到 kubernetes 一直卡在 Starting... 的朋友,請更新一下你的 Docker Desktop ,這基本上是版本過舊導致,筆者更新到 2.3.0.5 後便可以順利啟動。
實體化出來的 Pods 會有幾種不同的狀態,用來描述該 Pod 當前生命週期階段。
這個策略的設置是我們在使用 yaml 需要注意的,在 .yaml spec
裏有 restartPolicy
設定供我們進行下列幾種策略調整:
這邊幫大家準備了一個每秒隨機 panic 的範例,方便我們觀察 containers 狀態,與 Kubernetes 在 Pods 遇到錯誤保持服務存活的策略。我們同時也可以利用剛剛安裝的 kubernetes/dashboard,持續的觀察其滾動的情況。
每秒印出當前時間,並且隨機觸發 panic
func main() {
for {
time.Sleep(time.Second)
fmt.Println(time.Now().String())
rand.Seed(time.Now().UnixNano())
if rand.Intn(10) == 1 {
panic("Now panic and restart")
}
}
}
部署
> kubectl create -f restart-deployment.yaml
> kubectl proxy
Starting to serve on 127.0.0.1:8001
觀察 Dashboard
希望藉由這樣的範例可以幫助你了解,ReplicaSet 管理下的 Pods 出現異常的時候,是如何保持整體服務正常運作,而不會完全死亡。當然在實務上若任一個 Pod 任一個 container 發生錯誤時,我們還是會針對 bug 進行修正,而非放任錯誤發生。