iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0

今天會用一個簡單範例跟大家分享 Pods 的生命週期,藉由範例觀察 Pods status 的變化。但在此之前先,另外介紹一個在本機啟用 Kubernetes 的方式,如果有安裝 Docker Desktop 的話,可以透過介面的方式,產出本地運行的 Kubernetes cluster,與 MineKube 不同的是它提供 GUI,這在我們觀察狀態進行監控的時候會更加友善。

Kubernetes on Docker Desktop

  • Docker Desktop Perferences
    docker-perfernces

  • Active
    k8s enable

  • 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 請參考
    token

  • Success

    kubernetes-dashboard

安裝過程遇到 kubernetes 一直卡在 Starting... 的朋友,請更新一下你的 Docker Desktop ,這基本上是版本過舊導致,筆者更新到 2.3.0.5 後便可以順利啟動。

docker version

Pod Lifetime

Pod Lifetime

Pod Phase

實體化出來的 Pods 會有幾種不同的狀態,用來描述該 Pod 當前生命週期階段。

  • Pending : Pod 啟用已被 kubernetes 接受,但裡面的 containers 尚未啟用完全
  • Running : Pod 已啟用,且內部 containers 已正確運行中
  • Succeeded : Pod 與內部 containers 已啟用並正確結束,此狀態 Pod 不會自動重啟
  • Failed : Pod 內的 containers 皆已停止,且至少一個 container 以異常終止方式停止
  • Unknown : Pod 的狀態無法被更新,通常發生在 Pods 與 Nodes 連線溝通異常時

Container restart policy

這個策略的設置是我們在使用 yaml 需要注意的,在 .yaml spec 裏有 restartPolicy 設定供我們進行下列幾種策略調整:

  • Policy
    • Always : 預設值,任何方式結束 Pods 內 containers 都會觸發重啟
    • OnFailure : 僅在內部 containers 發生錯誤停止時重啟 Pod
    • Never : 不重啟
  • Container state
    • Waiting : 等待啟動階段,容器尚在準備中
    • Running : 完成啟動,運行中
    • Terminated : 結束狀態,包含正常結束與異常結束

Example

這邊幫大家準備了一個每秒隨機 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

keep restart

希望藉由這樣的範例可以幫助你了解,ReplicaSet 管理下的 Pods 出現異常的時候,是如何保持整體服務正常運作,而不會完全死亡。當然在實務上若任一個 Pod 任一個 container 發生錯誤時,我們還是會針對 bug 進行修正,而非放任錯誤發生。


上一篇
Day22 Kubernetes (Minikube & Deployment)
下一篇
Day24 Istio (Install & Simple Usage)
系列文
Go Distributed & Go Consistently30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言