Kubernetes(k8s)-Pod状态(Status)

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们前面介绍了很多类型的工作负载,最后都会落实到具体的Pod上的。上一小节我们也介绍了Pod的创建流程,实际运维中Pod状态也会根据实际情况进行变化,所以了解Pod的各种状态,对于分析处理问题非常有帮助。

在 Kubernetes 中,Pod 的生命周期涵盖了多个状态,其中包括一些长期状态和短暂状态。下面是这些状态的综合描述:

长期状态

  1. Pending(挂起):Pod 已经被 Kubernetes 系统接受,但一个或多个容器尚未被创建或调度,可能出现问题的原因是没有合适的节点,或者标签亲和性等不匹配,通过descirbe命令可以看到具体原因。

  2. Running(运行中):Pod 已经被调度到一个节点上,所有容器都被创建,至少有一个容器正在运行、启动或重启。如果是1/1, 2/2这种前后一致就说明是正常状态,如果前后数字不一致,就说明有部分容器异常。

  3. Completed(成功完成):Pod 中的所有容器都正常运行完成,并且退出码为 0。哪些Job任务或者InitContainers正常执行退出的容器就是这个状态。

  4. Unknown(未知):Pod 的状态无法被 Kubernetes 确定,通常是由于与 Pod 所在节点的通信故障。

  5. Evicted(被驱逐):Pod 被系统驱逐,通常是因为资源紧张,如内存或磁盘空间不足。属于服务器主动状态驱逐的,如果是维护管理员主动驱逐则Pod会被删除,不会保留状态。

短暂状态

  1. ContainerCreating:Pod 已经被调度到一个节点但容器尚未完全创建。Kubernetes 可能在拉取镜像、设置网络和准备储存卷。如果是长期存在,则说明该Pod异常,需要检查。Kubernetes 可能在拉取镜像、设置网络和准备储存卷。如果是长期存在,则说明该Pod异常,需要检查。如果是长期存在,则说明该Pod异常,需要检查。

  2. Init:Waiting:Pod 有初始化容器,这些容器在主容器启动前运行,如果正在等待它们完成,则会显示此状态。

  3. Terminating:Pod 正在被删除,处于清理和资源回收过程中。

  4. CrashLoopBackOff:Pod 中的一个或多个容器尝试启动后失败,Kubernetes 正在尝试重新启动容器。

  5. ImagePullBackOff/ErrImagePull:Kubernetes 无法拉取指定的容器镜像。

当然其实这些所谓的长期和短暂状态其实不太准确,因为如果出现问题,这些状态就会长期保持,比如我们前面讲解InitContainers,就故意设置错误让这个初始化无法完成,他的状态就会长期维持在Init:xxx状态。

我们通过前面的状态,只能看到一个Pod状态,如果想要知道引发这个状态的详细信息,则可以通过下面的命令来实现。

kubectl get pod <pod-name>
kubectl describe pod <pod-name>

在 kubectl describe pod 的输出中,Events 部分会显示 Pod 的生命周期中的各种短暂状态和相关事件,提供有关 Pod 创建、启动或删除过程中发生的详细信息,有助于诊断和解决问题。

但是这些状态并不绝对,短期状态也可能持续存在,比如下载镜像失败,就会持续存在。

特别注意Terminating状态如果长期不消失则只能强制删除,但是一般不要轻易这样操作。

要强制删除一个 Pod,你可以使用 kubectl 命令并传递 --force 和 --grace-period=0 参数。这将立即删除 Pod 而不等待优雅终止的过程。请记住,强制删除可能会导致 Pod 中运行的服务不正常终止,可能会引起数据不一致或其他问题。只有当 Pod 无法正常删除时,才建议使用强制删除。

下面是强制删除 Pod 的命令:

kubectl delete pod <pod-name> --force --grace-period=0

这里的 <pod-name> 是你想要删除的 Pod 的名字。

如果节点失联,节点的Pod出现Unknown状态,一般不需要手工删除,只要等待节点恢复以后,这些Pod就会被自动删除。

另一个注意事项是,如果 Pod 被设置了 finalizers(终结器),那么即使使用了 --force 参数,它仍可能不会被立即删除。这是因为 finalizers 是用于在删除资源之前执行特定的清理工作。在这种情况下,你可能需要编辑 Pod 资源以移除 finalizers:

kubectl edit pod <pod-name>

然后删除或清空 metadata.finalizers 字段,保存并退出编辑器,Pod 将被删除。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

[root@k8s-master dashboard]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml -O dashboard.yaml --2025-12-04 21:57:27-- https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml 正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.109.133, 185.199.108.133, ... 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:7552 (7.4K) [text/plain] 正在保存至: “dashboard.yaml” 100%[=========================================================================================================>] 7,552 --.-K/s 用时 0s 2025-12-04 21:57:28 (69.1 MB/s) - 已保存 “dashboard.yaml” [7552/7552]) [root@k8s-master dashboard]# ls dashboard.yaml [root@k8s-master dashboard]# vim dashboard.yaml [root@k8s-master dashboard]# kubectl apply -f dashboard.yaml namespace/kubernetes-dashboard unchanged serviceaccount/kubernetes-dashboard unchanged service/kubernetes-dashboard unchanged secret/kubernetes-dashboard-certs unchanged secret/kubernetes-dashboard-csrf unchanged secret/kubernetes-dashboard-key-holder unchanged configmap/kubernetes-dashboard-settings unchanged role.rbac.authorization.k8s.io/kubernetes-dashboard unchanged clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard unchanged rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard unchanged clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard unchanged deployment.apps/kubernetes-dashboard created service/dashboard-metrics-scraper created deployment.apps/dashboard-metrics-scraper created [root@k8s-master dashboard]# kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-5b947dcc4-47987 1/1 Running 2 4d kube-flannel kube-flannel-ds-9zjns 1/1 Running 2 4d2h kube-flannel kube-flannel-ds-hs79x 1/1 Running 2 4d2h kube-flannel kube-flannel-ds-vl9qs 1/1 Running 2 4d2h kube-system coredns-9d85f5447-4dcps 1/1 Running 2 4d3h kube-system coredns-9d85f5447-g6c49 1/1 Running 2 4d3h kube-system etcd-k8s-master 1/1 Running 2 4d3h kube-system kube-apiserver-k8s-master 1/1 Running 2 4d3h kube-system kube-controller-manager-k8s-master 1/1 Running 2 4d3h kube-system kube-proxy-6wfbb 1/1 Running 2 4d3h kube-system kube-proxy-7pkrq 1/1 Running 2 4d3h kube-system kube-proxy-jhc22 1/1 Running 2 4d3h kube-system kube-scheduler-k8s-master 1/1 Running 2 4d3h kubernetes-dashboard dashboard-metrics-scraper-755b949fd6-7bv8k 0/1 ContainerCreating 0 9s kubernetes-dashboard kubernetes-dashboard-7f4c8d4968-qc7lk 0/1 ContainerCreating 0 9s [root@k8s-master dashboard]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard service/kubernetes-dashboard edited [root@k8s-master dashboard]# kubectl get pods,svc -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-755b949fd6-7bv8k 1/1 Running 0 2m24s pod/kubernetes-dashboard-7f4c8d4968-qc7lk 1/1 Running 0 2m24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.98.100.238 <none> 8000/TCP 2m24s service/kubernetes-dashboard NodePort 10.108.200.146 <none> 443:31486/TCP 7m46s [root@k8s-master dashboard]# kubectl get svc -A |grep kubernetes-dashboard kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.98.100.238 <none> 8000/TCP 3m22s kubernetes-dashboard kubernetes-dashboard NodePort 10.108.200.146 <none> 443:31486/TCP 8m44s [root@k8s-master dashboard]# kubectl get pods,svc -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-755b949fd6-7bv8k 1/1 Running 0 6m4s pod/kubernetes-dashboard-7f4c8d4968-qc7lk 1/1 Running 0 6m4s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.98.100.238 <none> 8000/TCP 6m4s service/kubernetes-dashboard NodePort 10.108.200.146 <none> 443:31486/TCP 11m 最后的命令输出是否正确?
最新发布
12-05
<think>首先,用户提供了一个Kubernetes操作序列,最后的问题是“最后的命令输出是否正确?”。我需要分析命令输出。 用户执行了以下步骤: 1. 下载Kubernetes Dashboard的YAML文件: ``` wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml -O dashboard.yaml ``` 下载成功,保存为dashboard.yaml。 2. 编辑dashboard.yaml: ``` vim dashboard.yaml ``` 用户没有指定编辑了什么,但之后的应用命令显示了一些资源是“unchanged”,而deployment是“created”,说明用户可能修改了配置。 3. 应用YAML文件: ``` kubectl apply -f dashboard.yaml ``` 输出显示: - namespace/kubernetes-dashboard unchanged - serviceaccount/kubernetes-dashboard unchanged - ... (其他资源unchanged) - deployment.apps/kubernetes-dashboard created - service/dashboard-metrics-scraper created - deployment.apps/dashboard-metrics-scraper created 这表示一些资源已经存在(unchanged),而一些是新创建的。特别是deployment被创建,说明用户可能修改了deployment部分。 4. 检查所有pods: ``` kubectl get pods -A ``` 输出显示在kubernetes-dashboard命名空间中有两个pods: - dashboard-metrics-scraper-755b949fd6-7bv8k: 0/1 ContainerCreating - kubernetes-dashboard-7f4c8d4968-qc7lk: 0/1 ContainerCreating 状态是ContainerCreating,表示pods正在创建中。 5. 编辑service: ``` kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard ``` 用户没有指定编辑了什么,但之后的服务类型改变了。 6. 再次检查pods和services: ``` kubectl get pods,svc -n kubernetes-dashboard ``` 输出: - pods: 两个pods现在都是Running状态(READY 1/1)。 - services: dashboard-metrics-scraper是ClusterIP,kubernetes-dashboard是NodePort(443:31486/TCP)。 7. 检查所有命名空间的services: ``` kubectl get svc -A |grep kubernetes-dashboard ``` 输出: - kubernetes-dashboard dashboard-metrics-scraper ClusterIP ... - kubernetes-dashboard kubernetes-dashboard NodePort ... 8. 再次检查pods和services: ``` kubectl get pods,svc -n kubernetes-dashboard ``` 输出类似上一步:pods Running,services类型如上。 现在,用户问:“最后的命令输出是否正确?” 最后的命令是: ``` kubectl get pods,svc -n kubernetes-dashboard ``` 输出是: ``` NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-755b949fd6-7bv8k 1/1 Running 0 6m4s pod/kubernetes-dashboard-7f4c8d4968-qc7lk 1/1 Running 0 6m4s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.98.100.238 <none> 8000/TCP 6m4s service/kubernetes-dashboard NodePort 10.108.200.146 <none> 443:31486/TCP 11m ``` 这个输出是否正确?在Kubernetes Dashboard的标准部署中: - dashboard-metrics-scraper通常是ClusterIP类型,用于内部访问。 - kubernetes-dashboard默认在recommended.yaml中是ClusterIP类型,但用户编辑了service,将其改为了NodePort类型(从输出中可以看到NodePort 443:31486/TCP)。 用户之前编辑了service(kubectl edit svc kubernetes-dashboard),所以修改为NodePort是用户的操作。因此,输出是符合用户操作的。 pods的状态是Running,这是健康的,没有任何错误。 所以,输出是正确的。 现在,我需要用中文回答问题,并确保在回答后提出3-5个相关问题,以"§§相关问题§§"开头。 回答结构: - 先解释输出是否正确。 - 然后提供相关分析。 - 最后以"§§相关问题§§"开头,列出3-5个问题。 相关问题必须基于用户的问题和我的回答。用户的问题是“最后的命令输出是否正确?”,我回答是正确。 可能的§§相关问题: 1. 如何确认Kubernetes Dashboard是否可访问? 2. 为什么在部署Dashboard时pods初始状态是ContainerCreating? 3. 如何修改Kubernetes Dashboard的服务类型为LoadBalancer? 4. Kubernetes Dashboard的默认认证方式是什么? 5. 如果Dashboard pods没有启动,如何排查问题? 确保问题数量3-5个。 最终回答: - 是的,最后的命令输出是正确的。 - 解释为什么:pods状态为Running表示正常运行,services类型NodePort是用户编辑的结果。 - 然后"§§相关问题§§" - 列出问题。 </think> 是的,最后的命令输出(`kubectl get pods,svc -n kubernetes-dashboard`)是**正确**的。以下是详细分析: 1. **Pods 状态正确**: - 两个 Pod(`kubernetes-dashboard-*` 和 `dashboard-metrics-scraper-*`)均显示 `READY 1/1` 和 `STATUS Running`,表明 Dashboard 及其指标收集器已成功部署并运行正常。初始状态 `ContainerCreating`(在第一次 `kubectl get pods -A` 中)是临时状态,最终过渡到 `Running` 符合预期。 2. **Services 配置正确**: - `kubernetes-dashboard` 服务类型为 `NodePort`(端口映射 `443:31486/TCP`),这与您通过 `kubectl edit svc` 修改服务类型的操作一致(默认 `recommended.yaml` 中是 `ClusterIP`,但您显式改为了 `NodePort` 以便外部访问)。 - `dashboard-metrics-scraper` 服务保持 `ClusterIP` 类型,这是标准配置,仅用于内部指标收集。 3. **一致性验证**: - 输出中的 `AGE` 字段与部署时间线匹配(如 Pods 运行约 6 分钟,Service 存在约 11 分钟),且无错误信息(如 `CrashLoopBackOff`),表明部署健康。 若需进一步验证,可通过 NodePort 访问 Dashboard(例如 `https://<节点IP>:31486`),并使用 Token 登录(Token 可通过 `kubectl -n kubernetes-dashboard create token admin-user` 获取)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值