最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

k8s集群pod常見狀態(tài)故障排查

2023-03-15 18:35 作者:awldls-sre  | 我要投稿

Pod 異常排錯:一般來說,無論 Pod 處于什么異常狀態(tài),都可以執(zhí)行以下命令來查看 Pod 的狀態(tài)

kubectl get pod <pod-name> -o yaml 查看 Pod 的配置是否正確

kubectl describe pod <pod-name> 查看 Pod 的事件

kubectl logs <pod-name> [-c <container-name>] 查看容器日志

這些事件和日志通常都會有助于排查 Pod 發(fā)生的問題。

1.Pod 一直處于 Pending 狀態(tài)

Pending 說明 Pod 還沒有調(diào)度到某個 Node 上面。可以通過 kubectl describe pod <pod-name> 命令查看到當前 Pod 的事件,進而判斷為什么沒有調(diào)度。如

kubectl describe pod mypod

...

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Warning FailedScheduling 12s (x6 over 27s) default-scheduler 0/4 nodes are available: 2 Insufficient cpu.

可能的原因包括

資源不足,集群內(nèi)所有的 Node 都不滿足該 Pod 請求的 CPU、內(nèi)存、GPU 或者臨時存儲空間等資源。解決方法是刪除集群內(nèi)不用的 Pod 或者增加新的 Node。

HostPort 端口已被占用,通常推薦使用 Service 對外開放服務(wù)端口

2.Pod 一直處于 Waiting 或 ContainerCreating 狀態(tài)

首先還是通過 kubectl describe pod <pod-name> 命令查看到當前 Pod 的事件

kubectl -n kube-system describe pod nginx-pod

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Normal Scheduled 1m default-scheduler Successfully assigned nginx-pod to node1

Normal SuccessfulMountVolume 1m kubelet, gpu13 MountVolume.SetUp succeeded for volume "config-volume"

Normal SuccessfulMountVolume 1m kubelet, gpu13 MountVolume.SetUp succeeded for volume "coredns-token-sxdmc"

Warning FailedSync 2s (x4 over 46s) kubelet, gpu13 Error syncing pod

Normal SandboxChanged 1s (x4 over 46s) kubelet, gpu13 Pod sandbox changed, it will be killed and re-created.

可以發(fā)現(xiàn),該 Pod 的 Sandbox 容器無法正常啟動,具體原因需要查看 Kubelet 日志:

journalctl -u kubelet

...

Mar 14 04:22:04 node1 kubelet[29801]: E0314 04:22:04.649912 29801 cni.go:294] Error adding network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.4.1/24

Mar 14 04:22:04 node1 kubelet[29801]: E0314 04:22:04.649941 29801 cni.go:243] Error while adding to cni network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.4.1/24

Mar 14 04:22:04 node1 kubelet[29801]: W0314 04:22:04.891337 29801 cni.go:258] CNI failed to retrieve network namespace path: Cannot find network namespace for the terminated container "c4fd616cde0e7052c240173541b8543f746e75c17744872aa04fe06f52b5141c"

Mar 14 04:22:05 node1 kubelet[29801]: E0314 04:22:05.965801 29801 remote_runtime.go:91] RunPodSandbox from runtime service failed: rpc error: code = 2 desc = NetworkPlugin cni failed to set up pod "nginx-pod" network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.4.1/24

發(fā)現(xiàn)是 cni0 網(wǎng)橋配置了一個不同網(wǎng)段的 IP 地址導(dǎo)致,刪除該網(wǎng)橋(網(wǎng)絡(luò)插件會自動重新創(chuàng)建)即可修復(fù)

ip link set cni0 down

brctl delbr cni0

除了以上錯誤,其他可能的原因還有

鏡像拉取失敗,比如

配置了錯誤的鏡像

Kubelet 無法訪問鏡像(國內(nèi)環(huán)境訪問?gcr.io?需要特殊處理)

私有鏡像的密鑰配置錯誤

鏡像太大,拉取超時(可以適當調(diào)整 kubelet 的 --image-pull-progress-deadline 和 --runtime-request-timeout 選項)

CNI 網(wǎng)絡(luò)錯誤,一般需要檢查 CNI 網(wǎng)絡(luò)插件的配置,比如

無法配置 Pod 網(wǎng)絡(luò)

無法分配 IP 地址

容器無法啟動,需要檢查是否打包了正確的鏡像或者是否配置了正確的容器參數(shù)

3.Pod 處于 ImagePullBackOff 狀態(tài)

這通常是鏡像名稱配置錯誤或者私有鏡像的密鑰配置錯誤導(dǎo)致。這種情況可以使用 docker pull <image> 來驗證鏡像是否可以正常拉取。

kubectl describe pod mypod

...

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Normal Scheduled 36s default-scheduler Successfully assigned sh to k8s-agentpool1-38622806-0

Normal SuccessfulMountVolume 35s kubelet, k8s-agentpool1-38622806-0 MountVolume.SetUp succeeded for volume "default-token-n4pn6"

Normal Pulling 17s (x2 over 33s) kubelet, k8s-agentpool1-38622806-0 pulling image "a1pine"

Warning Failed 14s (x2 over 29s) kubelet, k8s-agentpool1-38622806-0 Failed to pull image "a1pine": rpc error: code = Unknown desc = Error response from daemon: repository a1pine not found: does not exist or no pull access

Warning Failed 14s (x2 over 29s) kubelet, k8s-agentpool1-38622806-0 Error: ErrImagePull

Normal SandboxChanged 4s (x7 over 28s) kubelet, k8s-agentpool1-38622806-0 Pod sandbox changed, it will be killed and re-created.

Normal BackOff 4s (x5 over 25s) kubelet, k8s-agentpool1-38622806-0 Back-off pulling image "a1pine"

Warning Failed 1s (x6 over 25s) kubelet, k8s-agentpool1-38622806-0 Error: ImagePullBackOff

如果是私有鏡像,需要首先創(chuàng)建一個 docker-registry 類型的 Secret

kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

然后在容器中引用這個 Secret

spec:

containers:

- name: private-reg-container

image: <your-private-image>

imagePullSecrets:

- name: my-secret

Pod 一直處于 CrashLoopBackOff 狀態(tài)

CrashLoopBackOff 狀態(tài)說明容器曾經(jīng)啟動了,但又異常退出了。此時 Pod 的 RestartCounts 通常是大于 0 的,可以先查看一下容器的日志

kubectl describe pod <pod-name>

kubectl logs <pod-name>

kubectl logs --previous <pod-name>

這里可以發(fā)現(xiàn)一些容器退出的原因,比如

容器進程退出

健康檢查失敗退出

OOMKilled

$ kubectl describe pod mypod

...

Containers:

sh:

Container ID: docker://3f7a2ee0e7e0e16c22090a25f9b6e42b5c06ec049405bc34d3aa183060eb4906

Image: alpine

Image ID: docker-pullable://alpine@sha256:7b848083f93822dd21b0a2f14a110bd99f6efb4b838d499df6d04a49d0debf8b

Port: <none>

Host Port: <none>

State: Terminated

Reason: OOMKilled

Exit Code: 2

Last State: Terminated

Reason: OOMKilled

Exit Code: 2

Ready: False

Restart Count: 3

Limits:

cpu: 1

memory: 1G

Requests:

cpu: 100m

memory: 500M

...

如果此時如果還未發(fā)現(xiàn)線索,還可以到容器內(nèi)執(zhí)行命令來進一步查看退出原因

kubectl exec cassandra -- cat /var/log/cassandra/system.log

如果還是沒有線索,那就需要 SSH 登錄該 Pod 所在的 Node 上,查看 Kubelet 或者 Docker 的日志進一步排查了

# Query Node

kubectl get pod <pod-name> -o wide

# SSH to Node

ssh <username>@<node-name>

4.Pod 處于 Error 狀態(tài)

通常處于 Error 狀態(tài)說明 Pod 啟動過程中發(fā)生了錯誤。常見的原因包括

依賴的 ConfigMap、Secret 或者 PV 等不存在

請求的資源超過了管理員設(shè)置的限制,比如超過了 LimitRange 等

違反集群的安全策略,比如違反了 PodSecurityPolicy 等

容器無權(quán)操作集群內(nèi)的資源,比如開啟 RBAC 后,需要為 ServiceAccount 配置角色綁定

5.Pod 處于 Terminating 或 Unknown 狀態(tài)

從 v1.5 開始,Kubernetes 不會因為 Node 失聯(lián)而刪除其上正在運行的 Pod,而是將其標記為 Terminating 或 Unknown 狀態(tài)。想要刪除這些狀態(tài)的 Pod 有三種方法:

從集群中刪除該 Node。使用公有云時,kube-controller-manager 會在 VM 刪除后自動刪除對應(yīng)的 Node。而在物理機部署的集群中,需要管理員手動刪除 Node(如 kubectl delete node <node-name>。

Node 恢復(fù)正常。Kubelet 會重新跟 kube-apiserver 通信確認這些 Pod 的期待狀態(tài),進而再決定刪除或者繼續(xù)運行這些 Pod。

用戶強制刪除。用戶可以執(zhí)行 kubectl delete pods <pod> --grace-period=0 --force 強制刪除 Pod。除非明確知道 Pod 的確處于停止狀態(tài)(比如 Node 所在 VM 或物理機已經(jīng)關(guān)機),否則不建議使用該方法。特別是 StatefulSet 管理的 Pod,強制刪除容易導(dǎo)致腦裂或者數(shù)據(jù)丟失等問題。

如果 Kubelet 是以 Docker 容器的形式運行的,此時 kubelet 日志中可能會發(fā)現(xiàn)如下的錯誤:

{"log":"I0926 19:59:07.162477 54420 kubelet.go:1894] SyncLoop (DELETE, \"api\"): \"billcenter-737844550-26z3w_meipu(30f3ffec-a29f-11e7-b693-246e9607517c)\"\n","stream":"stderr","time":"2017-09-26T11:59:07.162748656Z"}

{"log":"I0926 19:59:39.977126 54420 reconciler.go:186] operationExecutor.UnmountVolume started for volume \"default-token-6tpnm\" (UniqueName: \"404 Page not found") pod \"30f3ffec-a29f-11e7-b693-246e9607517c\" (UID: \"30f3ffec-a29f-11e7-b693-246e9607517c\") \n","stream":"stderr","time":"2017-09-26T11:59:39.977438174Z"}

{"log":"E0926 19:59:39.977461 54420 nestedpendingoperations.go:262] Operation for \"\\\"404 Page not found" (\\\"30f3ffec-a29f-11e7-b693-246e9607517c\\\")\" failed. No retries permitted until 2017-09-26 19:59:41.977419403 +0800 CST (durationBeforeRetry 2s). Error: UnmountVolume.TearDown failed for volume \"default-token-6tpnm\" (UniqueName: \"404 Page not found") pod \"30f3ffec-a29f-11e7-b693-246e9607517c\" (UID: \"30f3ffec-a29f-11e7-b693-246e9607517c\") : remove /var/lib/kubelet/pods/30f3ffec-a29f-11e7-b693-246e9607517c/volumes/kubernetes.io~secret/default-token-6tpnm: device or resource busy\n","stream":"stderr","time":"2017-09-26T11:59:39.977728079Z"}

如果是這種情況,則需要給 kubelet 容器設(shè)置 --containerized 參數(shù)并傳入以下的存儲卷

# 以使用 calico 網(wǎng)絡(luò)插件為例

-v /:/rootfs:ro,shared \

-v /sys:/sys:ro \

-v /dev:/dev:rw \

-v /var/log:/var/log:rw \

-v /run/calico/:/run/calico/:rw \

-v /run/docker/:/run/docker/:rw \

-v /run/docker.sock:/run/docker.sock:rw \

-v /usr/lib/os-release:/etc/os-release \

-v /usr/share/ca-certificates/:/etc/ssl/certs \

-v /var/lib/docker/:/var/lib/docker:rw,shared \

-v /var/lib/kubelet/:/var/lib/kubelet:rw,shared \

-v /etc/kubernetes/ssl/:/etc/kubernetes/ssl/ \

-v /etc/kubernetes/config/:/etc/kubernetes/config/ \

-v /etc/cni/net.d/:/etc/cni/net.d/ \

-v /opt/cni/bin/:/opt/cni/bin/ \

處于 Terminating 狀態(tài)的 Pod 在 Kubelet 恢復(fù)正常運行后一般會自動刪除。但有時也會出現(xiàn)無法刪除的情況,并且通過 kubectl delete pods <pod> --grace-period=0 --force 也無法強制刪除。此時一般是由于 finalizers 導(dǎo)致的,通過 kubectl edit 將 finalizers 刪除即可解決。

"finalizers": [

"foregroundDeletion"

]

6.Pod 行為異常

這里所說的行為異常是指 Pod 沒有按預(yù)期的行為執(zhí)行,比如沒有運行 podSpec 里面設(shè)置的命令行參數(shù)。這一般是 podSpec yaml 文件內(nèi)容有誤,可以嘗試使用 --validate 參數(shù)重建容器,比如

kubectl delete pod mypod

kubectl create --validate -f mypod.yaml

也可以查看創(chuàng)建后的 podSpec 是否是對的,比如

kubectl get pod mypod -o yaml


k8s集群pod常見狀態(tài)故障排查的評論 (共 條)

分享到微博請遵守國家法律
江津市| 阳信县| 溆浦县| 伊宁县| 孟村| 彝良县| 南华县| 资阳市| 浦县| 莆田市| 玉屏| 万源市| 河南省| 佳木斯市| 寻乌县| 响水县| 玛沁县| 博白县| 饶河县| 海伦市| 千阳县| 舞钢市| 罗城| 金溪县| 尉犁县| 金乡县| 阳泉市| 昌邑市| 湟中县| 灵璧县| 思南县| 永年县| 泉州市| 长宁县| 新竹县| 龙泉市| 广南县| 平乡县| 启东市| 商河县| 临武县|