pod 知識(shí)點(diǎn) 下
上一篇分享了 pod 的基本知識(shí)點(diǎn),有 K8S 環(huán)境的小伙伴還是可以用起來的,還對(duì)比較簡(jiǎn)單,知道了 pod 的 yaml 文件結(jié)構(gòu),標(biāo)識(shí),基本的創(chuàng)建 pod 和刪除 pod 的用法等等,我們繼續(xù)

## pod 的基本分類
前面我們說到了 **pod 分為靜態(tài) pod 和普通的 pod** ,那么這倆有啥區(qū)別呢?

**靜態(tài) pod**
- 由 kubelet 進(jìn)行管理
- 存在于特定 Node 上的 pod
- **不能通過 Api Server 管理**
- 無法 ReplicationController,Deployment,Daemonset 進(jìn)行關(guān)聯(lián)
- kubelet 無法對(duì)該 pod 進(jìn)行健康檢查
**普通 pod**
- 一旦創(chuàng)建,就會(huì)被放到 etcd 存儲(chǔ)中
- 會(huì)被 k8s 中的 master 調(diào)度到某個(gè) Node 上面并綁定,該 Node 上的 kubelet 會(huì)實(shí)例化成 docker 容器 運(yùn)行起來
- k8s 會(huì)對(duì) pod 做健康檢查,若 pod 中的容器暫?;蛘弋惓?,k8s 會(huì)將他們重啟
- **若 pod 所在的 Node 宕機(jī)了,那么 k8s 會(huì)將 該 Node 的所有 pod 重新調(diào)度到別的節(jié)點(diǎn)上面**
## pod 的生命周期是啥樣的

如上圖,我們可以看到 mykubia pod 的運(yùn)行狀態(tài)是 **RUNNING** , 那么 pod 的生命周期是什么樣子的呢?會(huì)有哪些狀態(tài)呢?
- Pending
**Pending 狀態(tài) 表示? Api Server 已經(jīng)創(chuàng)建好了該 pod**,但是 pod 中的一個(gè)或者多個(gè)容器還沒有被創(chuàng)建,或者現(xiàn)在正在下載鏡像
- Running
**pod 內(nèi)所有的容器已經(jīng)創(chuàng)建好了**,至少有一個(gè)容器是**運(yùn)行狀態(tài)、正在啟動(dòng)狀態(tài)**或者是**正在重啟狀態(tài)**
- Completed
pod 內(nèi)的容器均已執(zhí)行正常退出,且不會(huì)再次重啟了
- Failed
pod 內(nèi)的容器均已執(zhí)行正常退出,至少有一個(gè)容器是退出失敗的
- Unknown
由于某種原因無法獲取到 pod 的狀態(tài),例如網(wǎng)絡(luò)問題等等
## pod 的重啟策略是啥樣的

上一篇文章我們手寫 yaml 的時(shí)候,還記得 yaml 里面的這個(gè)字段嗎? `restartPolicy: [Always|Never|OnFailure]`
restartPolicy 指的是 pod 的重啟策略,分別為:
- Always
如果 pod 里面的容器失效的時(shí)候,**kubelet 會(huì)自動(dòng)重啟這個(gè)容器**
- Never
不管容器運(yùn)行的狀態(tài)怎么樣,正常還是異常,**kubelet 都不會(huì)重啟該容器**
- OnFailure
容器終止運(yùn)行的時(shí)候,**并且退出碼不是 0**, kubelet 就會(huì)重啟該 容器?
**上面說到的 pod 的狀態(tài)又是如何轉(zhuǎn)換的呢?**

我們可以來對(duì)比一下,當(dāng) pod 中有 1 個(gè) 或者多個(gè)容器在運(yùn)行的時(shí)候,發(fā)生如下情況,pod 的狀態(tài)會(huì)是如何轉(zhuǎn)換的
**當(dāng) pod 中有 1 個(gè)容器的時(shí)候:**
| 當(dāng)前 pod 的狀態(tài) | 若發(fā)生如下事件 | pod 的狀態(tài)會(huì)如何調(diào)整? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
| --------------- | -------------- | ------------------------------------------------------------ |
| Running? ? ? ? ?| 容器成功退出? ?| - Always 重啟策略<br />狀態(tài)仍然是 **Running**<br />- Never 重啟策略<br />狀態(tài)會(huì)變成 **Completed**<br />- OnFailure 重啟策略<br />狀態(tài)會(huì)變成 **Completed** |
| Running? ? ? ? ?| 容器退出異常? ?| - Always 重啟策略<br />狀態(tài)仍然是 **Running**<br />- Never 重啟策略<br />狀態(tài)會(huì)變成 **Failed**<br />- OnFailure 重啟策略<br />狀態(tài)會(huì)變成 **Running** |
**當(dāng) pod 中有 2 個(gè)以上的容器的時(shí)候:**
| 當(dāng)前 pod 的狀態(tài) | 若發(fā)生如下事件? ? ? ? ? ? ?| pod 的狀態(tài)會(huì)如何調(diào)整? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
| --------------- | -------------------------- | ------------------------------------------------------------ |
| Running? ? ? ? ?| 有 1 容器退出異常? ? ? ? ? | - Always 重啟策略<br />狀態(tài)仍然是 **Running**<br />- Never 重啟策略<br />狀態(tài)會(huì)變成 **Running**<br />- OnFailure 重啟策略<br />狀態(tài)會(huì)變成 **Running** |
| Running? ? ? ? ?| 容器資源被限制,容器被殺掉 | - Always 重啟策略<br />狀態(tài)仍然是 **Running**<br />- Never 重啟策略<br />狀態(tài)會(huì)變成 **Failed**<br />- OnFailure 重啟策略<br />狀態(tài)會(huì)變成 **Running** |
## pod 的資源是如何配置的?
例如上一篇我們手寫的 yaml 就有提到?

pod 的 yaml 中,我們可以設(shè)置 cpu 的個(gè)數(shù)和 memory 的大小,這些值都是一個(gè)具體的值,都是絕對(duì)值
**cpu 的單位是 個(gè)數(shù)** , 例如可以配置 500m 表示 0.5 個(gè) CPU
**memory 的單位是 字節(jié)數(shù)** , 例如可以配置 64 Mi 表示 64 M 的內(nèi)存
- request
表示資源申請(qǐng)的最小數(shù)量,滿足系統(tǒng)必須要求
- limits
表示申請(qǐng)?jiān)撡Y源的最大數(shù)量,這個(gè)值是不能突破的,如果突破了,K8S 就會(huì)將該 pod 殺掉
**今天就到這里,學(xué)習(xí)所得,若有偏差,還請(qǐng)斧正**
## 歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是**阿兵云原生**,歡迎點(diǎn)贊關(guān)注收藏,下次見~?