K8S 调试运行中报错的 Pod

开始调试有问题的 Pod

准备环境

创建一个例子用于测试:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentnamespace: apps
spec:selector:matchLabels:app: nginxreplicas: 2template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80

创建好以后查看状态

kubectl get po -n apps
NAME                                READY   STATUS    RESTARTS     AGE
nginx-deployment-765cb4ff6b-72kmj   1/1     Running   0            5m40s
nginx-deployment-765cb4ff6b-986t6   1/1     Running   0            5m40s

查看 Pod 详细状态

kubectl describe po -n apps nginx-deployment-765cb4ff6b-72kmj

这里就不再展示了,太长了。

调试 Pending 状态的 Pod

为了测试咱们手动修改Pod 请求资源,修改cpu 请求为8核心 5个副本,根据我这个集群上现有的资源最少有一个Pod是无法调度的。

[root@master01 yaml]# kubectl get po -n apps -owide
NAME                                READY   STATUS    RESTARTS     AGE     IP               NODE       NOMINATED NODE   READINESS GATES
nginx-deployment-765cb4ff6b-47jbj   1/1     Running   0            4m54s   172.18.71.17     master03   <none>           <none>
nginx-deployment-765cb4ff6b-5lzcc   1/1     Running   0            4m54s   172.29.55.36     node01     <none>           <none>
nginx-deployment-765cb4ff6b-72kmj   1/1     Running   0            31m     172.21.231.131   node02     <none>           <none>
nginx-deployment-765cb4ff6b-986t6   1/1     Running   0            31m     172.31.112.159   master01   <none>           <none>
nginx-deployment-779898f6f5-fmmph   0/1     Pending   0            4m54s   <none>           <none>     <none>           <none>
nginx-deployment-779898f6f5-p7hfw   0/1     Pending   0            4m53s   <none>           <none>     <none>           <none>

查看 nginx-deployment-779898f6f5-fmmph 没有调度的原因

kubectl describe po -n apps nginx-deployment-779898f6f5-fmmph

输出如下:

## 只是粘贴了  部分代码
Events:Type     Reason            Age                   From               Message----     ------            ----                  ----               -------Warning  FailedScheduling  7m15s                 default-scheduler  0/5 nodes are available: 5 Insufficient cpu. preemption: 0/5 nodes are available: 5 No preemption victims found for incoming pod..Warning  FailedScheduling  104s (x2 over 7m14s)  default-scheduler  0/5 nodes are available: 5 Insufficient cpu. preemption: 0/5 nodes are available: 5 No preemption victims found for incoming pod..

提示集群中没有可用的节点,因为所有5个节点都缺乏足够的 CPU 资源来运行这个 Pod。

查看集群中发生的事件

 kubectl get events -n apps

除了 kubectl describe pod 以外,另一种获取 Pod 额外信息(除了 kubectl get pod)的方法 是给 kubectl get pod 增加 -o yaml 输出格式参数。 该命令将以 YAML 格式为你提供比 kubectl describe pod 更多的信息 —— 实际上是系统拥有的关于 Pod 的所有信息。 在这里,你将看到注解(没有标签限制的键值元数据,由 Kubernetes 系统组件在内部使用)、 重启策略、端口和卷等。

kubectl get po -n apps nginx-deployment-765cb4ff6b-47jbj -oyaml
apiVersion: v1
kind: Pod
metadata:annotations:k8tz.io/injected: "true"k8tz.io/timezone: Asia/ShanghaicreationTimestamp: "2024-04-25T07:43:58Z"generateName: nginx-deployment-765cb4ff6b-labels:app: nginxpod-template-hash: 765cb4ff6bname: nginx-deployment-765cb4ff6b-47jbjnamespace: appsownerReferences:- apiVersion: apps/v1blockOwnerDeletion: truecontroller: truekind: ReplicaSetname: nginx-deployment-765cb4ff6buid: 8b5e6ae0-c6a1-4e99-8816-f8411b4f878aresourceVersion: "12533713"uid: 58703bd6-59de-4899-aeb1-3cd2605426f7
spec:containers:- env:- name: TZvalue: Asia/Shanghaiimage: nginximagePullPolicy: Alwaysname: nginxports:- containerPort: 80protocol: TCPresources:limits:cpu: 500mmemory: 128Mirequests:cpu: 500mmemory: 128MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /var/run/secrets/kubernetes.io/serviceaccountname: kube-api-access-8p4c2readOnly: true- mountPath: /etc/localtimename: k8tzreadOnly: truesubPath: Asia/Shanghai- mountPath: /usr/share/zoneinfoname: k8tzreadOnly: truednsPolicy: ClusterFirstenableServiceLinks: trueinitContainers:- args:- bootstrapimage: quay.io/k8tz/k8tz:0.16.0imagePullPolicy: IfNotPresentname: k8tzresources: {}securityContext:allowPrivilegeEscalation: falsecapabilities:drop:- ALLseccompProfile:type: RuntimeDefaultterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /mnt/zoneinfoname: k8tz- mountPath: /var/run/secrets/kubernetes.io/serviceaccountname: kube-api-access-8p4c2readOnly: truenodeName: master03preemptionPolicy: PreemptLowerPrioritypriority: 0restartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}serviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30tolerations:- effect: NoExecutekey: node.kubernetes.io/not-readyoperator: ExiststolerationSeconds: 300- effect: NoExecutekey: node.kubernetes.io/unreachableoperator: ExiststolerationSeconds: 300volumes:- name: kube-api-access-8p4c2projected:defaultMode: 420sources:- serviceAccountToken:expirationSeconds: 3607path: token- configMap:items:- key: ca.crtpath: ca.crtname: kube-root-ca.crt- downwardAPI:items:- fieldRef:apiVersion: v1fieldPath: metadata.namespacepath: namespace- emptyDir: {}name: k8tz

检查 Pod 的日志

查看有问题的日志

kubectl logs -n apps nginx-deployment-779898f6f5-p7hfw

如果容器之前崩溃过,可以通过下面命令访问之前容器的崩溃日志:

kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}

使用容器 exec 进行调试

##  说明: -c ${CONTAINER_NAME} 是可选择的。如果 Pod 中仅包含一个容器,就可以忽略它。
kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}## 进入容器
kubectl -n apps exec -it busybox-6c8989b4f7-pmwkd sh

在外面执行容器中的命令

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

使用临时容器调试

当由于容器崩溃或容器镜像不包含调试程序(例如无发行版镜像等) 而导致 kubectl exec 无法运行时,临时容器对于排除交互式故障很有用。

添加临时容器

使用上面创建的nginx Pod,这个默认是没有 ps,ping等命令的,咱们用 debug 命令给他添加一个临时容器。

## “nginx-deployment-78d88c66dd-svtpz”   这个是Pod 名字
## “--image=busybox:1.28”         给Pod 添加的临时容器,正常情况下推出以后临时容器会自动关闭。
## “--target nginx”               Pod 里运行的主容器名字或者是业务容器名字。
kubectl debug -it nginx-deployment-78d88c66dd-svtpz --image=busybox:1.28 --target nginx -n apps

进入以后是下面这样的,然后可以在容器里调,比如ps,ping 等命令就都可以使用。

Defaulting debug container name to debugger-8xzrl.
If you don't see a command prompt, try pressing enter.
/ #

也可以使用 kubectl describe po -n apps nginx-deployment-78d88c66dd-tn2cr 查看

Ephemeral Containers:debugger-wmmrd:Container ID:   containerd://70ef78f9e9f9422e8480bc86d5a7d030302dca82a07217d032de6237c948911bImage:          busybox:1.28Image ID:       docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47Port:           <none>Host Port:      <none>State:          TerminatedReason:       CompletedExit Code:    0Started:      Fri, 26 Apr 2024 09:53:12 +0800Finished:     Fri, 26 Apr 2024 09:53:12 +0800Ready:          FalseRestart Count:  0Environment:    <none>Mounts:         <none>

复杂调试

还是基于nginx Pod 演示。

## “nginx-deployment-78d88c66dd-m7h7s”   需要调试等Pod名字
## “--image=busybox:1.28”    为 nginx Pod 提供调试的容器
## “--share-processes”       允许调试容器与原始 Pod 共享进程命名空间
## “--copy-to=myapp-debug”   这个标志指示 Kubernetes 在执行调试时创建一个新的 Pod,其名称为 myapp-debug,并将原始 Pod 的卷和配置复制到新的调试 Pod 中。
kubectl debug nginx-deployment-78d88c66dd-m7h7s -it --image=busybox:1.28 --share-processes --copy-to=myapp-debug -n apps

创建完成以后查看会多出来一个Pod 名字为myapp-debug

[root@master01 yaml]# kubectl get po -n apps 
NAME                                READY   STATUS    RESTARTS      AGE
busybox-6c8989b4f7-pmwkd            1/1     Running   2 (27h ago)   3d18h
myapp-debug                         2/2     Running   1 (3s ago)    76s
nginx-deployment-78d88c66dd-m7h7s   1/1     Running   0             2m31s

拷贝有问题的Pod 并修改启动命令

为了模拟应用崩溃的场景,使用 kubectl run 命令创建一个立即退出的容器:

kubectl run --image=busybox:1.28 myapp -- false

使用 kubectl describe pod myapp 命令,你可以看到容器崩溃了:

Containers:myapp:Image:         busybox...Args:falseState:          WaitingReason:       CrashLoopBackOffLast State:     TerminatedReason:       ErrorExit Code:    1

使用 kubectl debug 命令创建新的 Pod 的一个副本并改变默认启动命令为交互式 shell:

## “myapp”  需要拷贝的有问题Pod 名字
## “--copy-to=myapp-debug”    将拷贝的Pod 重新命名为 myapp-debug
## “--container=myapp”        指定需要拷贝Pod 主容器的名字(这里的Pod名和容器名字是一样的,所有都是myapp,如果不一样的话需要修改成自己的)
kubectl debug myapp -it --copy-to=myapp-debug --container=myapp -- sh
If you don't see a command prompt, try pressing enter.
/ #

拷贝有问题的Pod 并修改镜像。

在某些情况下,可能需要修改一个行为异常的 Pod,即从其正常的生产容器镜像更改为包含调试构建程序或其他实用程序的镜像。

例子:

kubectl run myapp --image=busybox:1.28 --restart=Never -- sleep 1d

使用 kubectl debug 创建一个拷贝并将其容器镜像更改为 ubuntu:

## 参数基本和上面的一样。 “--set-image=*=ubuntu” 表示将原来的镜像修改为ubuntu
kubectl debug myapp --copy-to=myapp-debug --set-image=*=ubuntu
  • “*=ubuntu”: 表示把所有容器的镜像改为 ubuntu。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统安全及应用(1)

目录 一.账号安全控制 系统账号清理 二.密码安全控制 密码安全控制 三.命令历史限制 命令历史限制 四.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 ​编辑五.PAM认证的构成 六.使用sudo机制提升权限…

IDEA离线安装插件

1、下载地址 https://plugins.jetbrains.com/idea 如果去其他编辑器&#xff0c;点击下拉&#xff0c;选择即可。 2.搜索 在输入框输入关键词&#xff0c;按照提示选择即可&#xff0c;点击搜索按钮&#xff0c;查看结果。 3、选择版本 按照自己的版本选择合适的版本 4、安…

linux的SSH(远程登录)服务

目录 1.SSH远程管理 1.1 SSH的概述 1.2 OpenSSH服务器 1.3 SSH端口、配置文件 2.服务端重要配置 3.登录验证方式 3.1 密码验证 3.2 密钥对验证 4.使用 SSH 客户端程序 4.1 ssh 远程登录 4.2 scp 远程复制 4.3 sftp文件传输 5.创建使用密钥对 6.TCP Wrappers访问控…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Linux线程(pthread)概念以及编程

pthread 线程的意思 1.简的来说&#xff0c;线程的概念就是在一个程序中&#xff0c;同时进行多个函数的运行比如以下代码 2.要引入头文件#include <pthread.h> ; 线程被调函数的定义是空指针类型的如&#xff1a; void *func1() 在main函数中&#xff0c;pthread_cre…

【软件】ERETCAD-Env:在轨空间环境3D动态仿真软件

文章介绍了Extreme-environment Radiation Effect Technology Computer-Aided Design – Environment (ERETCAD-Env)软件&#xff0c;文章的介绍和展示了ERETCAD-Env软件的功能和特点&#xff0c;这是一款用于动态模拟在轨卫星所处空间环境的计算机辅助设计软件。强调了该软件在…

Rust异步并发编程tokio异步运行时讲解和使用,新手必学

Rust 在v1.39版本以后就引入了async关键字&#xff0c;用于支持异步编程。 async fn foo() {}Rust中&#xff0c;async函数或块会被视作一个 Future 对象&#xff0c;async 关键字只是用来定义这个 Future 对象&#xff0c;定义好的这片异步代码并不会自动执行&#xff0c;而是…

c语言指针的应用场景

​ 1.什么是指针&#xff1f; 当我们提起指针的时候&#xff0c;可能第一反应会露出惊喜的表情 &#xff08;但是我们其实没必要那么慌&#xff0c;因为当我们随着我们学习的越来越深入就会发现&#xff0c;指针虽然看起来难&#xff0c;实际上也不怎么简单。哈哈哈开玩笑的&a…

TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测

文章目录 效果一览文章概述 订阅专栏只能获取一份代码部分源码参考资料 效果一览 文章概述 TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测 matlab2021 订阅专栏只能获取一份代码 部分源码 %------------------------------------------------------------------…

c# winform打包

本次采用vs2022打包winform窗体应用&#xff0c;有时应用不需要打包为安装应用&#xff0c;执行一个EXE就运行了 测试了几次&#xff0c;winform 非.net Framework 和控制台程序也是非.net Framework项目能打包这种&#xff0c;后续在研究

边缘计算在视频监控领域的应用

一、边缘计算在视频监控领域的应用 运用边缘计算解决视频监控问题&#xff0c;可以带来许多优势。以下是一些具体的应用示例&#xff1a; 实时分析与处理&#xff1a;在视频监控系统中&#xff0c;边缘计算盒子可以实时处理和分析视频流&#xff0c;实现对监控画面的智能识别…

STM32H7 HSE时钟的使用方法介绍

目录 概述 1 STM32H750 HSE时钟介绍 2 使用STM32Cube创建Project 3 认识HSE时钟 3.1 HSE时钟的特性 3.2 HSE的典型应用电路 4 STM32Cube中配置时钟 4.1 时钟需求 4.2 配置参数 4.2.1 使能外围资源 4.2.2 使用STM32Cube注意项 4.2.3 配置参数 5 总结 概述 本文主要…

IBM SPSS Statistics for Mac v27.0.1中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具&#xff0c;为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac v27.0.1中文激活版下载 该软件拥有丰富的统计分析功能&#xff0c;无论是描述性统计、推论性统计&#xff0c;还是高级的多元统计…

论文解读:(CAVPT)Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model

v1文章名字&#xff1a;Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model v2文章名字&#xff1a;Class-Aware Visual Prompt Tuning for Vision-Language Pre-Trained Model 文章汇总 对该文的改进&#xff1a;论文解读&#xff1a;(VPT)Visual Prompt …

Visual Studio 对 C++ 头文件和模块的支持

在 C 编程领域&#xff0c;头文件和模块的管理有时候确实比较令人头疼。但是&#xff0c;有许多工具和功能可以简化此过程&#xff0c;提高效率并减少出错的可能性。下面是我们为 C 头文件和模块提供的几种工具的介绍。 构建明细 通过菜单栏 Build > Run Build Insights&a…

【个人博客搭建】(11)swagger添加jwt信息

这个主要是为了方便使用swagger时&#xff0c;能更好的带入我们的token。 ps&#xff1a;如果使用其他第三方api工具&#xff08;apipost、postman等&#xff09;则不需要。 &#xff08;当然&#xff0c;不用不能没有&#xff0c;是吧&#xff09; 1、在AddSwaggerGen内添加…

本地Windows主机,使用pycharm通过wsl的ubuntu来创建django项目

Windows主机在pycharm中通过wsl的ubuntu来创建django项目 需求&#xff1a;在windows主机中创建python项目再转接到linux服务器中运行&#xff0c;有点麻烦。【特别是存放日志文件或其他文件路径时需要修改为linux中的路径】 1&#xff1a;我的是windows主机 2&#xff1a;有…

关于SSL加密,您应该知道什么?

SSL加密&#xff0c;全称为安全套接字层加密&#xff0c;是一种网络安全协议&#xff0c;主要用于在网络通信中提供隐私和数据完整性。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传输过程中不被窃取或篡改。随着互联网的普及和电子商务的快速发展&am…

前端提高篇(二十四)JS进阶18对象属性的高级用法

x:1, y:2, } Object.defineProperty(obj1, ‘z’,{ value:3, writable:true, enumerable:true, configurable:true, }) for (var i in obj1){ console.log(i ’ : ’ obj1[i]); } 运行效果&#xff1a; 不可枚举时&#xff1a; var obj1 { x:1, y:2, } Obj…