国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【kubernetes】Pod進(jìn)階

這篇具有很好參考價(jià)值的文章主要介紹了【kubernetes】Pod進(jìn)階。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

資源限制

官網(wǎng)示例:

Pod 和 容器 的資源請(qǐng)求和限制:

CPU 資源單位

內(nèi)存 資源單位?

示例1:

示例2:

重啟策略(restartPolicy)

1、Always

2、OnFailure

3、Never

示例

容器進(jìn)入error狀態(tài)不會(huì)進(jìn)行重啟

健康檢查:又稱為探針(Probe)?

探針的三種規(guī)則:

●livenessProbe?

●readinessProbe

●startupProbe(這個(gè)1.17版本增加的)

Probe支持三種檢查方法:

●exec

●tcpSocket

●httpGet

每次探測(cè)都將獲得以下三種結(jié)果之一

官網(wǎng)示例:

示例1:exec方式

示例2:httpGet方式

示例3:tcpSocket方式

示例4:就緒檢測(cè)

readiness探測(cè)失敗,無(wú)法進(jìn)入READY狀態(tài)

示例5:就緒檢測(cè)2

readiness探測(cè)失敗,Pod 無(wú)法進(jìn)入READY狀態(tài),且端點(diǎn)控制器將從 endpoints 中剔除刪除該 Pod 的 IP 地址

啟動(dòng)、退出動(dòng)作

在 node02 節(jié)點(diǎn)上查看

刪除 pod 后,再在 node02 節(jié)點(diǎn)上查看


資源限制

當(dāng)定義 Pod 時(shí)可以選擇性地為每個(gè)容器設(shè)定所需要的資源數(shù)量。 最常見的可設(shè)定資源是 CPU 和內(nèi)存大小,以及其他類型的資源。

當(dāng)為 Pod 中的容器指定了 request 資源時(shí),代表容器運(yùn)行所需的最小資源量,調(diào)度器就使用該信息來(lái)決定將 Pod 調(diào)度到哪個(gè)節(jié)點(diǎn)上。當(dāng)還為容器指定了 limit 資源時(shí),kubelet 就會(huì)確保運(yùn)行的容器不會(huì)使用超出所設(shè)的 limit 資源量。kubelet 還會(huì)為容器預(yù)留所設(shè)的 request 資源量, 供該容器使用。

如果 Pod 運(yùn)行所在的節(jié)點(diǎn)具有足夠的可用資源,容器可以使用超出所設(shè)置的 request 資源量。不過(guò),容器不可以使用超出所設(shè)置的 limit 資源量。

如果給容器設(shè)置了內(nèi)存的 limit 值,但未設(shè)置內(nèi)存的 request 值,Kubernetes 會(huì)自動(dòng)為其設(shè)置與內(nèi)存 limit 相匹配的 request 值。 類似的,如果給容器設(shè)置了 CPU 的 limit 值但未設(shè)置 CPU 的 request 值,則 Kubernetes 自動(dòng)為其設(shè)置 CPU 的 request 值 并使之與 CPU 的 limit 值匹配。

官網(wǎng)示例:

https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

Pod 和 容器 的資源請(qǐng)求和限制:

spec.containers[].resources.requests.cpu?? ???     ?//定義創(chuàng)建容器時(shí)預(yù)分配的CPU資源
spec.containers[].resources.requests.memory?? ???  ?//定義創(chuàng)建容器時(shí)預(yù)分配的內(nèi)存資源
spec.containers[].resources.limits.cpu?? ??? ???  ? //定義 cpu 的資源上限?
spec.containers[].resources.limits.memory?? ??? ?   //定義內(nèi)存的資源上限

CPU 資源單位

CPU 資源的 request 和 limit 以 cpu 為單位。Kubernetes 中的一個(gè) cpu 相當(dāng)于1個(gè) vCPU(1個(gè)超線程)。
Kubernetes 也支持帶小數(shù) CPU 的請(qǐng)求。spec.containers[].resources.requests.cpu 為 0.5 的容器能夠獲得一個(gè) cpu 的一半 CPU 資源(類似于Cgroup對(duì)CPU資源的時(shí)間分片)。表達(dá)式 0.1 等價(jià)于表達(dá)式 100m(毫核),表示每 1000 毫秒內(nèi)容器可以使用的 CPU 時(shí)間總量為 0.1*1000 毫秒。
Kubernetes 不允許設(shè)置精度小于 1m 的 CPU 資源。?

內(nèi)存 資源單位?

內(nèi)存的 request 和 limit 以字節(jié)為單位??梢砸哉麛?shù)表示,或者以10為底數(shù)的指數(shù)的單位(E、P、T、G、M、K)來(lái)表示, 或者以2為底數(shù)的指數(shù)的單位(Ei、Pi、Ti、Gi、Mi、Ki)來(lái)表示。
如:1KB=10^3=1000,1MB=10^6=1000000=1000KB,1GB=10^9=1000000000=1000MB
1KiB=2^10=1024,1MiB=2^20=1048576=1024KiB

PS:在買硬盤的時(shí)候,操作系統(tǒng)報(bào)的數(shù)量要比產(chǎn)品標(biāo)出或商家號(hào)稱的小一些,主要原因是標(biāo)出的是以 MB、GB為單位的,1GB 就是1,000,000,000Byte,而操作系統(tǒng)是以2進(jìn)制為處理單位的,因此檢查硬盤容量時(shí)是以MiB、GiB為單位,1GiB=2^30=1,073,741,824,相比較而言,1GiB要比1GB多出1,073,741,824-1,000,000,000=73,741,824Byte,所以檢測(cè)實(shí)際結(jié)果要比標(biāo)出的少一些。

示例1:

apiVersion: v1
kind: Pod
metadata:
? name: frontend
spec:
? containers:
? - name: app
? ? image: images.my-company.example/app:v4
? ? env:
? ? - name: MYSQL_ROOT_PASSWORD
? ? ? value: "password"
? ? resources:
? ? ? requests:
? ? ? ? memory: "64Mi"
? ? ? ? cpu: "250m"
? ? ? limits:
? ? ? ? memory: "128Mi"
? ? ? ? cpu: "500m"
? - name: log-aggregator
? ? image: images.my-company.example/log-aggregator:v6
? ? resources:
? ? ? requests:
? ? ? ? memory: "64Mi"
? ? ? ? cpu: "250m"
? ? ? limits:
? ? ? ? memory: "128Mi"
? ? ? ? cpu: "500m"


此例子中的 Pod 有兩個(gè)容器。每個(gè)容器的 request 值為 0.25 cpu 和 64MiB 內(nèi)存,每個(gè)容器的 limit 值為 0.5 cpu 和 128MiB 內(nèi)存。那么可以認(rèn)為該 Pod 的總的資源 request 為 0.5 cpu 和 128 MiB 內(nèi)存,總的資源 limit 為 1 cpu 和 256MiB 內(nèi)存。

示例2:

vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:
? name: frontend
spec:
? containers:
? - name: web
? ? image: nginx
? ? env:
? ? - name: WEB_ROOT_PASSWORD
? ? ? value: "password"
? ? resources:
? ? ? requests:
? ? ? ? memory: "64Mi"
? ? ? ? cpu: "250m"
? ? ? limits:
? ? ? ? memory: "128Mi"
? ? ? ? cpu: "500m"
? - name: db
? ? image: mysql
? ? env:
? ? - name: MYSQL_ROOT_PASSWORD
? ? ? value: "abc123"
? ? resources:
? ? ? requests:
? ? ? ? memory: "512Mi"
? ? ? ? cpu: "0.5"
? ? ? limits:
? ? ? ? memory: "1Gi"
? ? ? ? cpu: "1"
kubectl apply -f pod2.yaml
kubectl describe pod frontend
kubectl get pods -o wide
NAME ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES
frontend ? 2/2 ? ? Running ? 5 ? ? ? ? ?15m ? 10.244.2.4 ? node02 ? <none> ? ? ? ? ? <none>
kubectl describe nodes node02?? ??? ??? ??? ?#由于當(dāng)前虛擬機(jī)有2個(gè)CPU,所以Pod的CPU Limits一共占用了50%
Namespace ? ? ? ? ? ? ? ? ?Name ? ? ? ? ? ? ? ? ? ? ? ? ? CPU Requests ?CPU Limits ?Memory Requests ?Memory Limits ?AGE
? --------- ? ? ? ? ? ? ? ? ?---- ? ? ? ? ? ? ? ? ? ? ? ? ? ------------ ?---------- ?--------------- ?------------- ?---
? default ? ? ? ? ? ? ? ? ? ?frontend ? ? ? ? ? ? ? ? ? ? ? 500m (25%) ? ?1 (50%) ? ? 128Mi (3%) ? ? ? 256Mi (6%) ? ? 16m
? kube-system ? ? ? ? ? ? ? ?kube-flannel-ds-amd64-f4pbp ? ?100m (5%) ? ? 100m (5%) ? 50Mi (1%) ? ? ? ?50Mi (1%) ? ? ?19h
? kube-system ? ? ? ? ? ? ? ?kube-proxy-pj4wp ? ? ? ? ? ? ? 0 (0%) ? ? ? ?0 (0%) ? ? ?0 (0%) ? ? ? ? ? 0 (0%) ? ? ? ? 19h
Allocated resources:
? (Total limits may be over 100 percent, i.e., overcommitted.)
? Resource ? ? ? ? ? Requests ? ?Limits
? -------- ? ? ? ? ? -------- ? ?------
? cpu ? ? ? ? ? ? ? ?600m (30%) ?1100m (55%)
? memory ? ? ? ? ? ? 178Mi (4%) ?306Mi (7%)
? ephemeral-storage ?0 (0%) ? ? ?0 (0%)

重啟策略(restartPolicy)

當(dāng) Pod 中的容器退出時(shí)通過(guò)節(jié)點(diǎn)上的 kubelet 重啟容器。適用于 Pod 中的所有容器。

1、Always

當(dāng)容器終止退出后,總是重啟容器,默認(rèn)策略

2、OnFailure

當(dāng)容器異常退出(退出狀態(tài)碼非0)時(shí),重啟容器;正常退出則不重啟容器

3、Never

當(dāng)容器終止退出,從不重啟容器。
注意:K8S 中不支持重啟 Pod 資源,只有刪除重建。
? ? ? 在用 yaml 方式創(chuàng)建 Deployment 和 StatefulSet 類型時(shí),restartPolicy 只能是 Always,kubectl run 創(chuàng)建 Pod 可以選擇 Always,OnFailure,Never 三種策略

kubectl edit deployment nginx-deployment
......
? restartPolicy: Always

示例

vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
? name: foo
spec:
? containers:
? - name: busybox
? ? image: busybox
? ? args:
? ? - /bin/sh
? ? - -c
? ? - sleep 30; exit 3


kubectl apply -f pod3.yaml

查看Pod狀態(tài),等容器啟動(dòng)后30秒后執(zhí)行exit退出進(jìn)程進(jìn)入error狀態(tài),就會(huì)重啟次數(shù)加1

kubectl get pods
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?READY ? STATUS ? ? ? ? ? ? RESTARTS ? AGE
foo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1/1 ? ? Running ? ? ? ? ? ?1 ? ? ? ? ?50s
kubectl delete -f pod3.yaml
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
? name: foo
spec:
? containers:
? - name: busybox
? ? image: busybox
? ? args:
? ? - /bin/sh
? ? - -c
? ? - sleep 30; exit 3
? restartPolicy: Never
#注意:跟container同一個(gè)級(jí)別

kubectl apply -f pod3.yaml

容器進(jìn)入error狀態(tài)不會(huì)進(jìn)行重啟

kubectl get pods -w

健康檢查:又稱為探針(Probe)?

探針是由kubelet對(duì)容器執(zhí)行的定期診斷。

探針的三種規(guī)則:

●livenessProbe?

判斷容器是否正在運(yùn)行。如果探測(cè)失敗,則kubelet會(huì)殺死容器,并且容器將根據(jù) restartPolicy 來(lái)設(shè)置 Pod 狀態(tài)。 如果容器不提供存活探針,則默認(rèn)狀態(tài)為Success。

●readinessProbe

判斷容器是否準(zhǔn)備好接受請(qǐng)求。如果探測(cè)失敗,端點(diǎn)控制器將從與 Pod 匹配的所有 service endpoints 中剔除刪除該P(yáng)od的IP地址。 初始延遲之前的就緒狀態(tài)默認(rèn)為Failure。如果容器不提供就緒探針,則默認(rèn)狀態(tài)為Success。

●startupProbe(這個(gè)1.17版本增加的)

判斷容器內(nèi)的應(yīng)用程序是否已啟動(dòng),主要針對(duì)于不能確定具體啟動(dòng)時(shí)間的應(yīng)用。如果配置了 startupProbe 探測(cè),則在 startupProbe 狀態(tài)為 Success 之前,其他所有探針都處于無(wú)效狀態(tài),直到它成功后其他探針才起作用。 如果 startupProbe 失敗,kubelet 將殺死容器,容器將根據(jù) restartPolicy 來(lái)重啟。如果容器沒(méi)有配置 startupProbe, 則默認(rèn)狀態(tài)為 Success。
#注:以上規(guī)則可以同時(shí)定義。在readinessProbe檢測(cè)成功之前,Pod的running狀態(tài)是不會(huì)變成ready狀態(tài)的。

Probe支持三種檢查方法:

●exec

在容器內(nèi)執(zhí)行指定命令。如果命令退出時(shí)返回碼為0則認(rèn)為診斷成功。

●tcpSocket

對(duì)指定端口上的容器的IP地址進(jìn)行TCP檢查(三次握手)。如果端口打開,則診斷被認(rèn)為是成功的。

●httpGet

對(duì)指定的端口和uri路徑上的容器的IP地址執(zhí)行HTTPGet請(qǐng)求。如果響應(yīng)的狀態(tài)碼大于等于200且小于400,則診斷被認(rèn)為是成功的

每次探測(cè)都將獲得以下三種結(jié)果之一

●成功(Success):表示容器通過(guò)了檢測(cè)。
●失?。‵ailure):表示容器未通過(guò)檢測(cè)。
●未知(Unknown):表示檢測(cè)沒(méi)有正常進(jìn)行。

官網(wǎng)示例:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

示例1:exec方式

apiVersion: v1
kind: Pod
metadata:
? labels:
? ? test: liveness
? name: liveness-exec
spec:
? containers:
? - name: liveness
? ? image: k8s.gcr.io/busybox
? ? args:
? ? - /bin/sh
? ? - -c
? ? - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 60
? ? livenessProbe:
? ? ? exec:
? ? ? ? command:
? ? ? ? - cat
? ? ? ? - /tmp/healthy
? ? ? failureThreshold: 1
? ? ? initialDelaySeconds: 5
? ? ? periodSeconds: 5

initialDelaySeconds:指定 kubelet 在執(zhí)行第一次探測(cè)前應(yīng)該等待5秒,即第一次探測(cè)是在容器啟動(dòng)后的第6秒才開始執(zhí)行。默認(rèn)是 0 秒,最小值是 0。
#periodSeconds:指定了 kubelet 應(yīng)該每 5 秒執(zhí)行一次存活探測(cè)。默認(rèn)是 10 秒。最小值是 1。
failureThreshold: 當(dāng)探測(cè)失敗時(shí),Kubernetes 將在放棄之前重試的次數(shù)。 存活探測(cè)情況下的放棄就意味著重新啟動(dòng)容器。就緒探測(cè)情況下的放棄 Pod 會(huì)被打上未就緒的標(biāo)簽。默認(rèn)值是 3。最小值是 1。
timeoutSeconds:探測(cè)的超時(shí)后等待多少秒。默認(rèn)值是 1 秒。最小值是 1。(在 Kubernetes 1.20 版本之前,exec 探針會(huì)忽略 timeoutSeconds 探針會(huì)無(wú)限期地 持續(xù)運(yùn)行,甚至可能超過(guò)所配置的限期,直到返回結(jié)果為止。)

可以看到 Pod 中只有一個(gè)容器。kubelet 在執(zhí)行第一次探測(cè)前需要等待 5 秒,kubelet 會(huì)每 5 秒執(zhí)行一次存活探測(cè)。kubelet 在容器內(nèi)執(zhí)行命令 cat /tmp/healthy 來(lái)進(jìn)行探測(cè)。如果命令執(zhí)行成功并且返回值為 0,kubelet 就會(huì)認(rèn)為這個(gè)容器是健康存活的。 當(dāng)?shù)竭_(dá)第 31 秒時(shí),這個(gè)命令返回非 0 值,kubelet 會(huì)殺死這個(gè)容器并重新啟動(dòng)它。

vim exec.yaml
apiVersion: v1
kind: Pod
metadata:
? name: liveness-exec
? namespace: default
spec:
? containers:
? - name: liveness-exec-container
? ? image: busybox
? ? imagePullPolicy: IfNotPresent
? ? command: ["/bin/sh","-c","touch /tmp/live ; sleep 30; rm -rf /tmp/live; sleep 3600"]
? ? livenessProbe:
? ? ? exec:
? ? ? ? command: ["test","-e","/tmp/live"]
? ? ? initialDelaySeconds: 1
? ? ? periodSeconds: 3
vim exec.yaml
apiVersion: v1
kind: Pod
metadata:
? name: liveness-exec
? namespace: default
spec:
? containers:
? - name: liveness-exec-container
? ? image: busybox
? ? imagePullPolicy: IfNotPresent
? ? command: ["/bin/sh","-c","touch /tmp/live ; sleep 30; rm -rf /tmp/live; sleep 3600"]
? ? livenessProbe:
? ? ? exec:
? ? ? ? command: ["test","-e","/tmp/live"]
? ? ? initialDelaySeconds: 1
? ? ? periodSeconds: 3
kubectl get pods -w
NAME ? ? ? ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE
liveness-exec ? ? ? 1/1 ? ? Running ? 1 ? ? ? ? ?85s

示例2:httpGet方式

apiVersion: v1
kind: Pod
metadata:
? labels:
? ? test: liveness
? name: liveness-http
spec:
? containers:
? - name: liveness
? ? image: k8s.gcr.io/liveness
? ? args:
? ? - /server
? ? livenessProbe:
? ? ? httpGet:
? ? ? ? path: /healthz
? ? ? ? port: 8080
? ? ? ? httpHeaders:
? ? ? ? - name: Custom-Header
? ? ? ? ? value: Awesome
? ? ? initialDelaySeconds: 3
? ? ? periodSeconds: 3

在這個(gè)配置文件中,可以看到 Pod 也只有一個(gè)容器。initialDelaySeconds 字段告訴 kubelet 在執(zhí)行第一次探測(cè)前應(yīng)該等待 3 秒。periodSeconds 字段指定了 kubelet 每隔 3 秒執(zhí)行一次存活探測(cè)。kubelet 會(huì)向容器內(nèi)運(yùn)行的服務(wù)(服務(wù)會(huì)監(jiān)聽 8080 端口)發(fā)送一個(gè) HTTP GET 請(qǐng)求來(lái)執(zhí)行探測(cè)。如果服務(wù)器上 /healthz 路徑下的處理程序返回成功代碼,則 kubelet 認(rèn)為容器是健康存活的。如果處理程序返回失敗代碼,則 kubelet 會(huì)殺死這個(gè)容器并且重新啟動(dòng)它。

任何大于或等于 200 并且小于 400 的返回代碼標(biāo)示成功,其它返回代碼都標(biāo)示失敗。

vim httpget.yaml
apiVersion: v1
kind: Pod
metadata:
? name: liveness-httpget
? namespace: default
spec:
? containers:
? - name: liveness-httpget-container
? ? image: soscscs/myapp:v1
? ? imagePullPolicy: IfNotPresent
? ? ports:
? ? - name: http
? ? ? containerPort: 80
? ? livenessProbe:
? ? ? httpGet:
? ? ? ? port: http
? ? ? ? path: /index.html
? ? ? initialDelaySeconds: 1
? ? ? periodSeconds: 3
? ? ? timeoutSeconds: 10
kubectl create -f httpget.yaml
kubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.html
kubectl get pods
NAME ? ? ? ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE
liveness-httpget ? 1/1 ? ? Running ? 1 ? ? ? ? ?2m44s

示例3:tcpSocket方式

apiVersion: v1
kind: Pod
metadata:
? name: goproxy
? labels:
? ? app: goproxy
spec:
? containers:
? - name: goproxy
? ? image: k8s.gcr.io/goproxy:0.1
? ? ports:
? ? - containerPort: 8080
? ? readinessProbe:
? ? ? tcpSocket:
? ? ? ? port: 8080
? ? ? initialDelaySeconds: 5
? ? ? periodSeconds: 10
? ? livenessProbe:
? ? ? tcpSocket:
? ? ? ? port: 8080
? ? ? initialDelaySeconds: 15
? ? ? periodSeconds: 20

這個(gè)例子同時(shí)使用 readinessProbe 和 livenessProbe 探測(cè)。kubelet 會(huì)在容器啟動(dòng) 5 秒后發(fā)送第一個(gè) readinessProbe 探測(cè)。這會(huì)嘗試連接 goproxy 容器的 8080 端口。如果探測(cè)成功,kubelet 將繼續(xù)每隔 10 秒運(yùn)行一次檢測(cè)。除了 readinessProbe 探測(cè),這個(gè)配置包括了一個(gè) livenessProbe 探測(cè)。kubelet 會(huì)在容器啟動(dòng) 15 秒后進(jìn)行第一次 livenessProbe 探測(cè)。就像 readinessProbe 探測(cè)一樣,會(huì)嘗試連接 goproxy 容器的 8080 端口。如果 livenessProbe 探測(cè)失敗,這個(gè)容器會(huì)被重新啟動(dòng)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-646623.html

vim tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata:
? name: probe-tcp
spec:
? containers:
? - name: nginx
? ? image: soscscs/myapp:v1
? ? livenessProbe:
? ? ? initialDelaySeconds: 5
? ? ? timeoutSeconds: 1
? ? ? tcpSocket:
? ? ? ? port: 8080
? ? ? periodSeconds: 10
? ? ? failureThreshold: 2
kubectl create -f tcpsocket.yaml
kubectl exec -it probe-tcp ?-- netstat -natp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address ? ? ? ? ? Foreign Address ? ? ? ? State ? ? ? PID/Program name ? ?
tcp ? ? ? ?0 ? ? ?0 0.0.0.0:80 ? ? ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?1/nginx: master pro
kubectl get pods -w
NAME ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE
probe-tcp ? 1/1 ? ? Running ? ? ? ? ? ? 0 ? ? ? ? ?1s
probe-tcp ? 1/1 ? ? Running ? ? ? ? ? ? 1 ? ? ? ? ?25s ? ? ? #第一次是 init(5秒) + period(10秒) * 2
probe-tcp ? 1/1 ? ? Running ? ? ? ? ? ? 2 ? ? ? ? ?45s ? ? ? #第二次是 period(10秒) + period(10秒) ?重試了兩次
probe-tcp ? 1/1 ? ? Running ? ? ? ? ? ? 3 ? ? ? ? ?65s

示例4:就緒檢測(cè)

vim readiness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
? name: readiness-httpget
? namespace: default
spec:
? containers:
? - name: readiness-httpget-container
? ? image: soscscs/myapp:v1
? ? imagePullPolicy: IfNotPresent
? ? ports:
? ? - name: http
? ? ? containerPort: 80
? ? readinessProbe:
? ? ? httpGet:
? ? ? ? port: 80
? ? ? ? path: /index1.html
? ? ? initialDelaySeconds: 1
? ? ? periodSeconds: 3
? ? livenessProbe:
? ? ? httpGet:
? ? ? ? port: http
? ? ? ? path: /index.html
? ? ? initialDelaySeconds: 1
? ? ? periodSeconds: 3
? ? ? timeoutSeconds: 10
kubectl create -f readiness-httpget.yaml

readiness探測(cè)失敗,無(wú)法進(jìn)入READY狀態(tài)

kubectl get pods?
NAME ? ? ? ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE
readiness-httpget ? 0/1 ? ? Running ? 0 ? ? ? ? ?18s
kubectl exec -it readiness-httpget sh
?# cd /usr/share/nginx/html/
?# ls
50x.html ? ?index.html
?# echo 123 > index1.html?
?# exit
kubectl get pods?
NAME ? ? ? ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE
readiness-httpget ? 1/1 ? ? Running ? 0 ? ? ? ? ?2m31s
kubectl exec -it readiness-httpget -- rm -rf /usr/share/nginx/html/index.html
kubectl get pods -w
NAME ? ? ? ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE
readiness-httpget ? 1/1 ? ? Running ? 0 ? ? ? ? ?4m10s
readiness-httpget ? 0/1 ? ? Running ? 1 ? ? ? ? ?4m15s

示例5:就緒檢測(cè)2

vim readiness-myapp.yaml
apiVersion: v1
kind: Pod
metadata:
? name: myapp1
? labels:
? ? ?app: myapp
spec:
? containers:
? - name: myapp
? ? image: soscscs/myapp:v1
? ? ports:
? ? - name: http
? ? ? containerPort: 80
? ? readinessProbe:
? ? ? httpGet:
? ? ? ? port: 80
? ? ? ? path: /index.html
? ? ? initialDelaySeconds: 5
? ? ? periodSeconds: 5
? ? ? timeoutSeconds: 10?
---
apiVersion: v1
kind: Pod
metadata:
? name: myapp2
? labels:
? ? ?app: myapp
spec:
? containers:
? - name: myapp
? ? image: soscscs/myapp:v1
? ? ports:
? ? - name: http
? ? ? containerPort: 80
? ? readinessProbe:
? ? ? httpGet:
? ? ? ? port: 80
? ? ? ? path: /index.html
? ? ? initialDelaySeconds: 5
? ? ? periodSeconds: 5
? ? ? timeoutSeconds: 10?
---
apiVersion: v1
kind: Pod
metadata:
? name: myapp3
? labels:
? ? ?app: myapp
spec:
? containers:
? - name: myapp
? ? image: soscscs/myapp:v1
? ? ports:
? ? - name: http
? ? ? containerPort: 80
? ? readinessProbe:
? ? ? httpGet:
? ? ? ? port: 80
? ? ? ? path: /index.html
? ? ? initialDelaySeconds: 5
? ? ? periodSeconds: 5
? ? ? timeoutSeconds: 10?
---
apiVersion: v1
kind: Service
metadata:
? name: myapp
spec:
? selector:
? ? app: myapp
? type: ClusterIP
? ports:
? - name: http
? ? port: 80
? ? targetPort: 80
kubectl create -f readiness-myapp.yaml
kubectl get pods,svc,endpoints -o wide
NAME ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES
pod/myapp1 ? 1/1 ? ? Running ? 0 ? ? ? ? ?3m42s ? 10.244.2.13 ? node02 ? <none> ? ? ? ? ? <none>
pod/myapp2 ? 1/1 ? ? Running ? 0 ? ? ? ? ?3m42s ? 10.244.1.15 ? node01 ? <none> ? ? ? ? ? <none>
pod/myapp3 ? 1/1 ? ? Running ? 0 ? ? ? ? ?3m42s ? 10.244.2.14 ? node02 ? <none> ? ? ? ? ? <none>

NAME ? ? ? ? ? ? ? ? TYPE ? ? ? ?CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? AGE ? ? SELECTOR
......
service/myapp ? ? ? ?ClusterIP ? 10.96.138.13 ? <none> ? ? ? ?80/TCP ? ?3m42s ? app=myapp

NAME ? ? ? ? ? ? ? ? ? ENDPOINTS ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?AGE
......
endpoints/myapp ? ? ? ?10.244.1.15:80,10.244.2.13:80,10.244.2.14:80 ? 3m42s
kubectl exec -it pod/myapp1 -- rm -rf /usr/share/nginx/html/index.html

readiness探測(cè)失敗,Pod 無(wú)法進(jìn)入READY狀態(tài),且端點(diǎn)控制器將從 endpoints 中剔除刪除該 Pod 的 IP 地址

kubectl get pods,svc,endpoints -o wide
NAME ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES
pod/myapp1 ? 0/1 ? ? Running ? 0 ? ? ? ? ?5m17s ? 10.244.2.13 ? node02 ? <none> ? ? ? ? ? <none>
pod/myapp2 ? 1/1 ? ? Running ? 0 ? ? ? ? ?5m17s ? 10.244.1.15 ? node01 ? <none> ? ? ? ? ? <none>
pod/myapp3 ? 1/1 ? ? Running ? 0 ? ? ? ? ?5m17s ? 10.244.2.14 ? node02 ? <none> ? ? ? ? ? <none>
NAME ? ? ? ? ? ? ? ? TYPE ? ? ? ?CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? AGE ? ? SELECTOR
......
service/myapp ? ? ? ?ClusterIP ? 10.96.138.13 ? <none> ? ? ? ?80/TCP ? ?5m17s ? app=myapp

NAME ? ? ? ? ? ? ? ? ? ENDPOINTS ? ? ? ? ? ? ? ? ? ? ? AGE
......
endpoints/myapp ? ? ? ?10.244.1.15:80,10.244.2.14:80 ? 5m17s

啟動(dòng)、退出動(dòng)作

vim post.yaml
apiVersion: v1
kind: Pod
metadata:
? name: lifecycle-demo
spec:
? containers:
? - name: lifecycle-demo-container
? ? image: soscscs/myapp:v1
? ? lifecycle: ? #此為關(guān)鍵字段
? ? ? postStart:
? ? ? ? exec:
? ? ? ? ? command: ["/bin/sh", "-c", "echo Hello from the postStart handler >> /var/log/nginx/message"] ? ? ?
? ? ? preStop:
? ? ? ? exec:
? ? ? ? ? command: ["/bin/sh", "-c", "echo Hello from the poststop handler >> /var/log/nginx/message"]
? ? volumeMounts:
? ? - name: message-log
? ? ? mountPath: /var/log/nginx/
? ? ? readOnly: false
? initContainers:
? - name: init-myservice
? ? image: soscscs/myapp:v1
? ? command: ["/bin/sh", "-c", "echo 'Hello initContainers' ? >> /var/log/nginx/message"]
? ? volumeMounts:
? ? - name: message-log
? ? ? mountPath: /var/log/nginx/
? ? ? readOnly: false
? volumes:
? - name: message-log
? ? hostPath:
? ? ? path: /data/volumes/nginx/log/
? ? ? type: DirectoryOrCreate
kubectl create -f post.yaml
kubectl get pods -o wide
NAME ? ? ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? ?IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES
lifecycle-demo ? 1/1 ? ? Running ? 0 ? ? ? ? ?2m8s ? 10.244.2.28 ? node02 ? <none> ? ? ? ? ? <none>
kubectl exec -it lifecycle-demo -- cat /var/log/nginx/message
Hello initContainers
Hello from the postStart handler

在 node02 節(jié)點(diǎn)上查看

cd /data/volumes/nginx/log/
ls
access.log ?error.log ?message
cat message?
Hello initContainers
Hello from the postStart handler
#由上可知,init Container先執(zhí)行,然后當(dāng)一個(gè)主容器啟動(dòng)后,Kubernetes 將立即發(fā)送 postStart 事件。

刪除 pod 后,再在 node02 節(jié)點(diǎn)上查看

kubectl delete pod lifecycle-demo
cat message?
Hello initContainers
Hello from the postStart handler
Hello from the poststop handler
#由上可知,當(dāng)在容器被終結(jié)之前, Kubernetes 將發(fā)送一個(gè) preStop 事件。

到了這里,關(guān)于【kubernetes】Pod進(jìn)階的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【kubernetes】Pod進(jìn)階

    目錄 資源限制 官網(wǎng)示例: Pod 和 容器 的資源請(qǐng)求和限制: CPU 資源單位 內(nèi)存 資源單位? 示例1: 示例2: 重啟策略(restartPolicy) 1、Always 2、OnFailure 3、Never 示例 容器進(jìn)入error狀態(tài)不會(huì)進(jìn)行重啟 健康檢查:又稱為探針(Probe)? 探針的三種規(guī)則: ●livenessProbe? ●readinessProb

    2024年02月13日
    瀏覽(12)
  • Kubernetes —Pod 和容器日志

    Kubernetes —Pod 和容器日志

    應(yīng)用日志可以讓你了解應(yīng)用內(nèi)部的運(yùn)行狀況。日志對(duì)調(diào)試問(wèn)題和監(jiān)控集群活動(dòng)非常有用。 大部分現(xiàn)代化應(yīng)用都有某種日志記錄機(jī)制。同樣地,容器引擎也被設(shè)計(jì)成支持日志記錄。 針對(duì)容器化應(yīng)用,最簡(jiǎn)單且最廣泛采用的日志記錄方式就是寫入標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流。 但是,

    2024年02月13日
    瀏覽(24)
  • Kubernetes中Pod容器的使用

    Pod是K8S系統(tǒng)中可以創(chuàng)建和管理的最小單元,是資源對(duì)象模型中由用戶創(chuàng)建或部署的最小資源對(duì)象模型 有許多組件圍繞Pod進(jìn)行擴(kuò)展和支持,比如控制器對(duì)象是用來(lái)管控Pod對(duì)象的,Service或者Ingress資源對(duì)象是用來(lái)暴露Pod引用對(duì)象的,PersistentVolume資源對(duì)象是用來(lái)為Pod提供存儲(chǔ)等。

    2024年02月15日
    瀏覽(26)
  • 【云原生】Kubernetes之 Pod hook(鉤子)

    Pod hook(鉤子)是由 Kubernetes 管理的 kubelet 發(fā)起的,當(dāng)容器中的進(jìn)程啟動(dòng)前或者容器中的進(jìn)程終止之前運(yùn)行,這是包含在容器的生命周期之中??梢酝瑫r(shí)為 Pod 中的所有容器都配置 hook。 Hook 的類型包括兩種: exec:執(zhí)行一段命令 HTTP:發(fā)送 HTTP 請(qǐng)求 示例如下: 說(shuō)明: postStar

    2024年02月15日
    瀏覽(19)
  • Kubernetes在容器內(nèi)獲取Pod信息

    我們知道,每個(gè) Pod 在被成功創(chuàng)建出來(lái)之后,都會(huì)被系統(tǒng)分配唯一的名字、IP 地址,并且處于某個(gè) Namespace 中,那么我們?nèi)绾卧?Pod 的容器內(nèi)獲取 Pod 的這些重要信息呢?答案就是使用 Downward API。 Downward API 可以通過(guò)以下兩種方式將 Pod 信息注入容器內(nèi)部。 (1)環(huán)境變量:用于單

    2024年02月10日
    瀏覽(22)
  • 【云原生】kubernetes深入理解Pod對(duì)象:基本管理

    【云原生】kubernetes深入理解Pod對(duì)象:基本管理

    目錄 一、Pod 基本概念 二、pod 常用命令 三、Pod 資源共享實(shí)現(xiàn)機(jī)制 3.1 共享網(wǎng)絡(luò) 3.2 共享存儲(chǔ) 四、Pod 狀態(tài)管理 五、重啟策略和健康檢查 5.1 基本概念 5.1.1 重啟策略 5.1.2 健康檢查有以下三種類型: 5.1.3 支持以下三種檢查方法: 5.2 示例講解 5.2.1 就緒健康檢查示例 六、Pod環(huán)境變

    2024年02月07日
    瀏覽(28)
  • kubernetes|云原生| 如何優(yōu)雅的重啟和更新pod---pod生命周期管理實(shí)務(wù)

    kubernetes|云原生| 如何優(yōu)雅的重啟和更新pod---pod生命周期管理實(shí)務(wù)

    kubernetes的管理維護(hù)的復(fù)雜性體現(xiàn)在了方方面面,例如,pod的管理,服務(wù)的管理,用戶的管理(RBAC),網(wǎng)絡(luò)的管理等等,因此,kubernetes安裝部署完畢僅僅是萬(wàn)里長(zhǎng)征的第一步,后面的運(yùn)營(yíng)和維護(hù)工作才是更為關(guān)鍵的東西。 那么,pod的生命周期是什么概念呢?這

    2024年02月04日
    瀏覽(17)
  • 在CSDN學(xué)Golang云原生(Kubernetes Pod)

    在 Kubernetes 中,Pod 是最小的可部署單元,它包含一個(gè)或多個(gè)容器。使用 Golang 來(lái)定義和操作 Pod 時(shí),需要使用 kubernetes/client-go 包提供的 API。 以下是 Golang 定義和基本用法 Pod 的示例: 安裝 kubernetes/client-go 包 在 Golang 環(huán)境中安裝 kubernetes/client-go 包,該包提供了訪問(wèn) Kubernetes

    2024年02月15日
    瀏覽(27)
  • 【云原生|Kubernetes】05-Pod的存儲(chǔ)卷(Volume)

    【云原生|Kubernetes】05-Pod的存儲(chǔ)卷(Volume)

    Volume 是Pod 中能夠被多個(gè)容器訪問(wèn)的共享目錄。 Kubernetes 中的Volume 概念、用 途和目的與 Docke 中的 Vo lume 比較類似,但二者不能等價(jià), 首先 Kubernetes 中的Volume 被定義在 Pod上 ,被一個(gè) Pod 里的多個(gè)容器掛載到具體的文件目錄 ;其次, Kubernete 中的 Volume與 Pod 的生命周期相同,但

    2024年02月07日
    瀏覽(44)
  • 在CSDN學(xué)Golang云原生(Kubernetes Pod調(diào)度)

    在 Kubernetes 中,可以使用 NodeSelector 字段來(lái)指定 Pod 調(diào)度到哪些節(jié)點(diǎn)上運(yùn)行。NodeSelector 是一個(gè)鍵值對(duì)的 map,其中鍵是節(jié)點(diǎn)的標(biāo)簽名,值是標(biāo)簽值。具體步驟如下: 在節(jié)點(diǎn)上添加標(biāo)簽 首先需要在節(jié)點(diǎn)上添加相應(yīng)的標(biāo)簽,例如: 編寫 Pod 的 YAML 文件 在編寫 Pod 的 YAML 文件時(shí),需

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包