您好,登錄后才能下訂單哦!
我們接觸的pod大多數(shù)是控制器控制的pod,那么今天講的是自主式pod(也就是由yaml文件來創(chuàng)建的pod),也就是pod自己去控制自己,防止pod被控制器殺死。
1,首先我們來創(chuàng)建一個(gè)nginx的pod資源對象:
在創(chuàng)建pod之前,我們來查看一下鏡像的下載策略:
[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
幾種策略解釋:
Always:總是在從指定的倉庫中獲取鏡像,也就是說每次創(chuàng)建pod都會重新拉取一次鏡像。
默認(rèn)的獲取策略如下:
鏡像標(biāo)簽為“l(fā)atest”,它的默認(rèn)下載策略是Always。
鏡像標(biāo)簽為自定義(不是默認(rèn)的latest),它的默認(rèn)下載策略是IfNotPresent。
//創(chuàng)建一個(gè)pod(定義某種策略):
[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 #暴露容器的端口
//執(zhí)行yaml文件:
[root@master yaml]# vim test-pod.yaml
[root@master yaml]# kubectl apply -f test-pod.yaml
//查看pod的狀態(tài):
[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的一個(gè)詳細(xì)信息:
[root@master yaml]# kubectl get pod test-pod -o json
image鏡像相位(狀態(tài)):
Running:Pod所需的容器已經(jīng)被成功調(diào)度到某個(gè)節(jié)點(diǎn),且已經(jīng)成功運(yùn)行。
Pending:APIserver創(chuàng)建了pod資源對象,并且已經(jīng)存入etcd中,但它尚未被調(diào)度完成或者仍然處于倉庫中下載鏡像的過程。
Succeeded:Pod中的所有容器已成功終止,并且不會重新啟動。
Failed:Pod中的所有容器均已終止,并且至少一個(gè)容器因故障而終止。也就是說,容器要么以非零狀態(tài)退出,要么被系統(tǒng)終止
一定要熟悉并且記住這幾種狀態(tài),因?yàn)檫@有利于在集群出現(xiàn)故障時(shí)能夠準(zhǔn)確的找到問題,且快速的排查錯(cuò)誤。
2,pod的重啟策略:
//首先我們查看pod的一個(gè)重啟策略:
[root@master yaml]# kubectl explain pod.spec #查看pod的spec字段的重啟策略
3,我們模擬一下,創(chuàng)建一個(gè)pod,使用公司內(nèi)部的私有倉庫中的鏡像,其鏡像下載策略為:Never(使用本地鏡像),pod的重啟策略為Never(從不重啟)。
[root@master yaml]# vim nginx-pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: mynginx
labels: #定義標(biāo)簽與servic相關(guān)聯(lián)
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 #定義給外網(wǎng)通過宿主機(jī)暴露的端口
[root@master yaml]# kubectl apply -f nginx-pod1.yaml
pod/mynginx created
service/mynginx created
//查看pod當(dāng)前狀態(tài):
查看pod信息可以看到鏡像拉取失敗,所以我們查看該pod的詳細(xì)信息進(jìn)行排查:
[root@master yaml]# kubectl describe pod mynginx
可以看到是策略的原因,Nerver策略只能從該節(jié)點(diǎn)的本地鏡像進(jìn)行下載,所以我們需要在該節(jié)點(diǎn)(node02)上將私有倉庫中的鏡像進(jìn)行拉取到本地。
[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是否運(yùn)行:
[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 7h20m 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:因?yàn)樵趐od的文件中設(shè)置了pod的重啟策略為Never,所以在無法修改策略的情況下,需要將該pod刪除,重新執(zhí)行yaml文件生成新的pod。
//第一次查看pod狀態(tài):
看到新的pod再node01節(jié)點(diǎn)上,所以我們還需再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
為了更好的查看到效果,我們重新執(zhí)行yaml文件,生成新pod:
[root@master yaml]# kubectl delete -f nginx-pod1.yaml
[root@master yaml]# kubectl apply -f nginx-pod1.yaml
//查看pod的最終狀態(tài):
我們來查看該pod的詳細(xì)信息(查看pod運(yùn)行失敗的原因):
[root@master yaml]# kubectl describe pod mynginx
從上面的信息中我們可以得知pod在創(chuàng)建出容器后,卻非正常退出了,最后導(dǎo)致容器創(chuàng)建失敗。
3)我們修改策略規(guī)則,將規(guī)則設(shè)置為OnFailure:
//重新運(yùn)行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狀態(tài)(失?。?[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
我們可以看到當(dāng)前pod創(chuàng)建容器失敗。
//我們馬上實(shí)時(shí)監(jiān)控pod當(dāng)前的狀態(tài):
可以看到pod一直在不停的重啟,原因是我們在設(shè)置pod重啟為OnFailure時(shí),同時(shí)設(shè)置了pod在睡眠10秒后,便會重啟,所以該pod會一直重啟下去。
4)我們修改策略規(guī)則,并將其pod恢復(fù)正常運(yùn)行:
//重新運(yùn)行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是否恢復(fù)正常運(yùn)行:(正常運(yùn)行)
[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信息,驗(yàn)證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
———————— 本文至此結(jié)束,感謝閱讀 ————————
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。