Pod介紹
Pod空镜,是K8S對(duì)象模型中的最小單元浩淘,Pod里面包含著一組容器(單個(gè)容器或多個(gè)緊密耦合的容器),這時(shí)候Pod可以理解為一個(gè)機(jī)器吴攒,而Pod里面的容器則理解為該機(jī)器里面的進(jìn)程张抄。
Pod的容器運(yùn)行時(shí)由容器引擎提供,默認(rèn)的容器引擎是Docker
洼怔;并且K8S管理的是Pod署惯,而不是容器。
一個(gè)Pod內(nèi)部的容器共享:
- 存儲(chǔ):一個(gè)Pod可以指定一組共享存儲(chǔ)卷镣隶。
- 網(wǎng)絡(luò):每個(gè)Pod分配一個(gè)唯一IP(集群內(nèi)IP)极谊,共享網(wǎng)絡(luò)命名空間诡右,包括 IP 地址和網(wǎng)絡(luò)端口。Pod內(nèi)的容器可以使用localhost互相通信轻猖,集群內(nèi)Pod與Pod通信可以使用Pod分配的IP帆吻,但是由于Pod的IP是隨機(jī)分配的,這種互通信的方式不太適合使用蜕依。
盡管一個(gè)Pod內(nèi)可以包含多個(gè)Pod桅锄,但我們?cè)诓渴饝?yīng)用容器時(shí)的最佳實(shí)踐是一個(gè)Pod里面只包含一個(gè)應(yīng)用容器作為主容器,其他容器為主容器服務(wù)样眠,稱之為輔助容器。例如主容器崩潰了翠肘,會(huì)有一個(gè)輔助容器去重啟主容器檐束。輔助容器可以有也可以沒有,因?yàn)镻od里面容器的生命周期可以被Pod的生命周期取代束倍,而Pod的生命周期可以通過Pod管理器來管理維護(hù)被丧。
將我們應(yīng)用服務(wù)隔離單獨(dú)部署在Pod的好處可以羅列以下:
- Pod可以分別的調(diào)度到各個(gè)K8S節(jié)點(diǎn),充分利用了節(jié)點(diǎn)的計(jì)算資源绪妹;
- 方便我們單獨(dú)為某個(gè)應(yīng)用服務(wù)做擴(kuò)縮操作甥桂。
Pod創(chuàng)建
在K8S集群中一般不會(huì)直接單獨(dú)創(chuàng)建Pod,而是通過Pod管理器邮旷。如果單獨(dú)創(chuàng)建Pod黄选,Pod的進(jìn)程被結(jié)束的話,Pod就永遠(yuǎn)被刪除婶肩;使用Pod管理器創(chuàng)建出來的Pod办陷,Pod管理器會(huì)負(fù)責(zé)保證Pod按期調(diào)度,即使Pod被刪除律歼,也會(huì)重新被調(diào)度起來民镜。簡而言之,Pod的生存由Pod管理器全權(quán)負(fù)責(zé)险毁。
Pod管理器包含很多種制圈,由很早的ReplicationController
過渡到ReplicaSet
再過渡到當(dāng)前普遍使用的Deployment
,其實(shí)這三者能做的事情是類似的畔况,都是調(diào)度和監(jiān)視Pod列表鲸鹦,保證Pod列表與聲明的數(shù)量和其他期望相符。
除此之外還有其他的管理器:
- StatefuleSet:帶狀態(tài)的Pod管理器问窃,需要持久存儲(chǔ)數(shù)據(jù)亥鬓,一般用于創(chuàng)建數(shù)據(jù)庫類型的應(yīng)用實(shí)例,如mysql域庇,redis嵌戈;
- DaemonSet:每個(gè)符合條件的Node都分配一個(gè)Pod覆积,一般用于創(chuàng)建agent服務(wù),如日志收集組件熟呛,指標(biāo)數(shù)據(jù)收集組件等宽档。
一般通過以下方式創(chuàng)建Pod
- 單行命令創(chuàng)建Pod
kubectl run nginx --image=nginx:latest --replicas=2
以上命令實(shí)際上是創(chuàng)建了一個(gè)Deployment資源和由其管理的2個(gè)Pod。
- 定義資源清單庵朝,創(chuàng)建Pod
以yaml或者json格式定義Pod資源吗冤,大都選擇yaml。如果你使用VSCode的話九府,那么Kubernetes Support
插件會(huì)成為你的利器。
我們先定義個(gè)一個(gè)Pod的資源文件pod-sample.yaml:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
restartPolicy: Never
resources:
requests:
memory: "128Mi"
cpu: "256m"
limits:
memory: "256Mi"
cpu: "512m"
ports:
- containerPort: 80
以上是一個(gè)簡單的Pod定義文件侄旬,我們可以從這個(gè)文件得到這些信息:
- 運(yùn)行nginx鏡像肺蔚,作為Pod的主容器儡羔,向外暴露80端口;
- 每次啟動(dòng)這個(gè)Pod都會(huì)從網(wǎng)絡(luò)拉取鏡像汰蜘;
- 如果主容器不小心掛了仇冯,則不會(huì)被重啟;
- 容器啟動(dòng)需要的最小資源和運(yùn)行最大資源苛坚。
然后通過kubectl
命令創(chuàng)建(下面這行命令也適用于更新Pod):
kubectl apply -f pod-sample.yaml
查看Pod:
kubectl get pod -o wide
通過查看Pod的描述、Pod里面容器的運(yùn)行日志坪创,或直接進(jìn)入Pod容器分析定位問題:
# 描述Pod詳情
kubectl describe pod <POD_NAME>
# 查看Pod容器控制臺(tái)運(yùn)行日志
kubectl logs <POD_NAME>
# 進(jìn)入Pod
kubectl exec -it <POD_NAME> -c <CONTAINER_NAME> -- <COMMAND>
刪除Pod:
kubectl delete -f pod-sample.yaml
kubectl delete pod <POD_NAME>
Pod字段
通過以下命令查看定義Pod資源的字段即作用:
kubectl explain pod
kubectl explain pod.spec
對(duì)一些字段簡單介紹一下:
imagePullPolicy
鏡像拉取策略,有三種莱预,Always柠掂、IfNotPresent、Never
- Always:每次都拉取最新鏡像依沮,默認(rèn)策略涯贞;
- IfNotPresent:如果Pod被調(diào)度的Node上已經(jīng)存在鏡像了則直接使用鏡像,不存在在拉任:怼宋渔;
- Never:只使用Node上的鏡像,即使不存在也不拉取辜限。
restartPolicy
Pod重啟策略皇拣,有三種:Always、OnFaliure、Never
- Always:Pod只要終止運(yùn)行氧急,kubelet就會(huì)重啟它颗胡;
- OnFaliure:Pod非正常終止,退出碼不為零吩坝,kubelet就會(huì)重啟它毒姨,正常退出不會(huì)重啟;
- Never:退出了就不重啟钉寝。
nodeSelector
定義Lable對(duì)弧呐,選擇調(diào)度到擁有該Label對(duì)的Node節(jié)點(diǎn)。
livenessProbe
存活指針嵌纲,可以理解為Pod內(nèi)容器運(yùn)行的健康檢查俘枫,如果健康檢查沒通過,則重啟Pod內(nèi)容器疹瘦,這里面的內(nèi)容有點(diǎn)多崩哩,有機(jī)會(huì)詳細(xì)講。
readinessProbe
就緒指針言沐,也是通過健康檢查機(jī)制,對(duì)外呈現(xiàn)Pod的就緒狀態(tài)酣栈,如果健康檢查通過险胰,Pod狀態(tài)為就緒,可以接受外部流量請(qǐng)求矿筝。流量無法轉(zhuǎn)發(fā)到非就緒狀態(tài)的Pod起便。
command
容器啟動(dòng)時(shí)的命令列表,和Dockerfile中定義的CMD作用一樣窖维。
args
容器啟動(dòng)命令的參數(shù)榆综。
env
容器內(nèi)的環(huán)境變量列表,和Dockerfile中定義的ENV作用一樣铸史。
resource
可以定義容器啟動(dòng)的最小字段和運(yùn)行最大分配資源鼻疮,對(duì)Pod的資源使用的控制。