咱們接觸的pod大多數是控制器控制的pod,那麼今天講的是自主式pod(也就是由yaml文件來建立的pod),也就是pod本身去控制本身,防止pod被控制器殺死。node
1,首先咱們來建立一個nginx的pod資源對象:nginx
在建立pod以前,咱們來查看一下鏡像的下載策略:web
[root@master yaml]# kubectl explain pod.spec.containers 查看imagePullpolicy的策略字段: imagePullPolicy <string> Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images
幾種策略解釋:docker
Always:鏡像標籤爲「latest」或鏡像標籤不存在的時候,老是在從指定的倉庫(Dockerhub)中獲取鏡像。
目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經包括了數量超過 2,650,000 的鏡像。大部分需求均可以經過在 Docker Hub 中直接下載鏡像來實現。json
默認的獲取策略以下:
鏡像標籤爲「latest」,它的默認下載策略是Always。
鏡像標籤爲自定義(不是默認的latest),它的默認下載策略是IfNotPresent。vim
//建立一個pod(定義某種策略):api
[root@master yaml]# vim test-pod.yaml apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: myapp image: nginx imagePullPolicy: Always #定義鏡像下載策略(從指定倉庫獲取鏡像) ports: - containerPort: 80 #暴露容器的端口
//執行yaml文件: [root@master yaml]# vim test-pod.yaml [root@master yaml]# kubectl apply -f test-pod.yaml
//查看pod的狀態: [root@master yaml]# kubectl get pod test-pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-pod 1/1 Running 0 7m55s 10.244.2.2 node02 <none> <none>
//以json格式查看pod的一個詳細信息: [root@master yaml]# kubectl get pod test-pod -o json
image鏡像相位(狀態):app
Running:Pod所需的容器已經被成功調度到某個節點,且已經成功運行。ide
Pending:APIserver建立了pod資源對象,而且已經存入etcd中,但它還沒有被調度完成或者仍然處於倉庫中下載鏡像的過程。測試
Succeeded:Pod中的全部容器已成功終止,而且不會從新啓動。
Failed:Pod中的全部容器均已終止,而且至少一個容器因故障而終止。也就是說,容器要麼以非零狀態退出,要麼被系統終止
必定要熟悉而且記住這幾種狀態,由於這有利於在集羣出現故障時可以準確的找到問題,且快速的排查錯誤。
2,pod的重啓策略:
//首先咱們查看pod的一個重啓策略: [root@master yaml]# kubectl explain pod.spec #查看pod的spec字段的重啓策略
3,咱們模擬一下,建立一個pod,使用公司內部的私有倉庫中的鏡像,其鏡像下載策略爲:Never(使用本地鏡像),pod的重啓策略爲Never(從不重啓)。
[root@master yaml]# vim nginx-pod1.yaml apiVersion: v1 kind: Pod metadata: name: mynginx labels: #定義標籤與servic相關聯 test: myweb spec: restartPolicy: Never #定義鏡像重啓策略爲Never containers: - name: myweb image: 172.16.1.30:5000/nginx:v1 imagePullPolicy: Never #定義鏡像下載策略爲Never --- apiVersion: v1 kind: Service metadata: name: mynginx spec: type: NodePort selector: test: myweb ports: - name: nginx port: 8080 #定義Cluster IP端口 targetPort: 80 #暴露容器端口 nodePort: 30000 #定義給外網經過宿主機暴露的端口
[root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
//查看pod當前狀態:
查看pod信息能夠看到鏡像拉取失敗,因此咱們查看該pod的詳細信息進行排查:
[root@master yaml]# kubectl describe pod mynginx
能夠看到是策略的緣由,Nerver策略只能從該節點的本地鏡像進行下載,因此咱們須要在該節點(node02)上將私有倉庫中的鏡像進行拉取到本地。
[root@node02 ~]# docker pull 172.16.1.30:5000/nginx:v1 v1: Pulling from nginx Digest: sha256:189cce606b29fb2a33ebc2fcecfa8e33b0b99740da4737133cdbcee92f3aba0a Status: Downloaded newer image for 172.16.1.30:5000/nginx:v1
//回到master,再次查看pod1是否運行: [root@master yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mynginx 1/1 Running 0 7m32s 10.244.2.4 node02 <none> <none> test-pod 1/1 Running 1 7h10m 10.244.2.3 node02 <none> <none>
2)測試pod重啓策略:
咱們模擬pod非正常退出
[root@master yaml]# vim nginx-pod1.yaml apiVersion: v1 kind: Pod metadata: name: mynginx labels: test: myweb spec: restartPolicy: Never containers: - name: myweb image: 172.16.1.30:5000/nginx:v1 imagePullPolicy: Never args: [/bin/sh -c sleep 10; exit 1] #添加args字段,模擬sleep10秒後退出
//從新啓動pod [root@master yaml]# kubectl delete -f nginx-pod1.yaml pod "mynginx" deleted service "mynginx" deleted [root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
PS:由於在pod的文件中設置了pod的重啓策略爲Never,因此在沒法修改策略的狀況下,須要將該pod刪除,從新執行yaml文件生成新的pod。
//第一次查看pod狀態:
看到新的pod再node01節點上,因此咱們還需再node01上將鏡像拉取到本地。
[root@node01 ~]# docker pull 172.16.1.30:5000/nginx:v1 v1: Pulling from nginx Digest: sha256:189cce606b29fb2a33ebc2fcecfa8e33b0b99740da4737133cdbcee92f3aba0a Status: Downloaded newer image for 172.16.1.30:5000/nginx:v1
爲了更好的查看到效果,咱們從新執行yaml文件,生成新pod:
[root@master yaml]# kubectl delete -f nginx-pod1.yaml
[root@master yaml]# kubectl apply -f nginx-pod1.yaml
//查看pod的最終狀態:
咱們來查看該pod的詳細信息(查看pod運行失敗的緣由): [root@master yaml]# kubectl describe pod mynginx
從上面的信息中咱們能夠得知pod在建立出容器後,卻非正常退出了,最後致使容器建立失敗。
3)咱們修改策略規則,將規則設置爲OnFailure:
//從新運行pod: [root@master yaml]# kubectl delete -f nginx-pod1.yaml pod "mynginx" deleted service "mynginx" deleted [root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
查看pod狀態(失敗): [root@master yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mynginx 0/1 RunContainerError 3 55s 10.244.2.8 node02 <none> <none>
[root@master yaml]# kubectl get pod -o json
咱們能夠看到當前pod建立容器失敗。
//咱們立刻實時監控pod當前的狀態:
能夠看到pod一直在不停的重啓,緣由是咱們在設置pod重啓爲OnFailure時,同時設置了pod在睡眠10秒後,便會重啓,因此該pod會一直重啓下去。
4)咱們修改策略規則,並將其pod恢復正常運行:
//從新運行yaml文件,生成新的pod: [root@master yaml]# kubectl delete -f nginx-pod1.yaml pod "mynginx" deleted service "mynginx" deleted k[root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
//查看pod是否恢復正常運行:(正常運行) [root@master yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mynginx 1/1 Running 0 71s 10.244.1.8 node01 <none> <none>
5) 查看servie信息,驗證nginx的web界面可否正常訪問:
[root@master yaml]# kubectl get svc mynginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mynginx NodePort 10.101.131.36 <none> 8080:30000/TCP 4m23s
———————— 本文至此結束,感謝閱讀 ————————