【云原生】k8s集群命令行工具kubectl之故障排除和调试命令

一、describe

显示某个资源或某组资源的详细信息。
用法:

kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)

示例:

# 显示单个node节点详细信息
kubectl describe nodes k8s-node1
# 显示单个pod详细信息
kubectl describe pods/nginx
# 显示文件描述的资源的详细信息
kubectl describe -f myapp-deployment.yaml
# 显示以k8s开头的节点的详细信息
kubectl describe node k8s
# 显示以myapp-deployment开头的pod的详细信息,pod命名通常与其控制器有关
kubectl describe pods myapp-deployment
# 显示指定label的pod详细信息
kubectl describe po -l name=myapp

二、logs

输出 pod 中某容器的日志。
用法:

kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]

示例:

  1. 首先:

    # 运行一个nginx Pod
    kubectl run nginx --image=nginx
    
  2. 其次:

    # 获取pod第一个容器的日志
    kubectl logs nginx
    # 获取pod中所有容器的日志
    kubectl logs <podname> --all-containers=true
    # 获取labels包含 name=myapp的所有pod下的所有容器日志
    kubectl logs -l name=myapp --all-containers=true
    # 持续输出pod中某个容器产生的日志,容器名为 myhello
    kubectl logs -f -c myhello <podname>
    # 持续输出labels包含 name=myapp的所有pod下的所有容器日志,最大并发日志请求数为10
    kubectl logs -f -l name=myapp --all-containers=true --max-log-requests=10
    # 获取最近几行日志
    kubectl logs --tail=5 nginx
    # 获取最近一个小时的日志
    kubectl logs --since=1h nginx
    # 获取pod中第一个容器的日志
    kubectl logs pod/<podname>
    # 获取指定deployment中,第一个pod的指定容器的日志。默认日志请求并发数为5
    kubectl logs deployment/myapp-deployment -c myhello
    
  3. 更多示例:

    # 输出pod web-1中曾经运行过的,但目前已终止的容器ruby的日志
    kubectl logs -p -c ruby web-1
    

三、attach

连接到一个正在运行的容器。
用法:

kubectl attach (POD | TYPE/NAME) -c CONTAINER

示例:

# 连接到指定pod中正在运行的第一个容器
kubectl attach <podname>
# 连接到指定pod中正在运行容器名为 myhello的容器
kubectl attach <podname> -c myhello
# 连接到指定deployments正在运行的第一个容器
kubectl attach deployments/myapp-deployment

四、exec

在容器中执行相关命令。
用法:

kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]

示例:

# 在pod nginx 第一个容器中执行date命令
kubectl exec nginx -- date
# 通过-c 指定容器
kubectl exec <podname> -c myhello -- date
# 传入 ls命令和相关参数
kubectl exec <podname> -c myhello -- ls -al ./
# 通过 -it 开启一个虚拟终端
kubectl exec <podname> -c myhello -i -t -- /bin/sh
# deployment/myapp-deployment第一个容器中执行命令
kubectl exec deployments/myapp-deployment -- date
# svc/myapp-svc 第一个容器中执行命令
kubectl exec svc/myapp-svc -- date

五、port-forward

将一个或者多个本地端口转发到 pod。如果有多个pod符合条件,将自动选择一个pod。当所选pod终止时,转发会话结束,需要重新运行该命令才能恢复转发。

用法:

kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT [... [LOCAL_PORT_N:]REMOTE_PORT_N]

示例:

# 转发本机5000 6000 端口到pod对应端口
kubectl port-forward pod/nginx 5000 6000
# 转发本机 5000 6000 分别到80和81端口
kubectl port-forward pod/nginx 5000:80 6000:81
# 从deployments/myapp-deployment 选择一个pod进行转发操作
kubectl port-forward deployments/myapp-deployment 5000 6000
# 从service中选择第一个pod,并将端口转发到端口名为http的端口上
kubectl port-forward service/myapp-svc 8080:http
# 通过--address指定监听地址
kubectl port-forward --address localhost,192.168.239.142 pod/nginx 8888:80
# 随机一个本地端口,转发到pod的指定端口
kubectl port-forward pod/nginx :80

六、proxy

在本地主机和Kubernetes API服务器之间创建代理服务器或应用程序级网关。它还允许通过指定的HTTP路径提供静态内容。所有传入数据都通过一个端口进入并转发到远程Kubernetes API服务器端口,但与静态内容路径匹配的路径除外。

用法:

kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--apiprefix=prefix]

示例:

kubectl proxy --api-prefix=/custom/ --port=8011 --www=$HOME/ --wwwprefix=/static/
# 通过代理访问apiserver接口
curl http://127.0.0.1:8011/custom/api/v1/pods
# 通过代理访问静态内容
curl http://127.0.0.1:8011/static/

七、cp

将文件和目录拷入/拷出容器。
用法:

kubectl cp <file-spec-src> <file-spec-dest>

示例:

# 把pod第一个容器中当前工作目录下的app 复制到宿主机的/tmp/app
kubectl cp <podname>:app /tmp/app
# 把/tmp/app 文件复制到 pod第一个容器当前工作目录下,命名为app1
kubectl cp /tmp/app <podname>:app1
# 把default命名空间下pod中容器myhello中当前工作目录下的app 复制到宿主机的/tmp/app
kubectl cp default/<podname>:app /tmp/app -c myhello
# 查看容器当前工作目录内容
kubectl exec <podname> ls

八、debug

创建用于排查工作负载和节点故障的调试会话。

用法:

kubectl debug (POD | TYPE[[.VERSION].GROUP]/NAME) [ -- COMMAND [args...] ]

8.1、案例1:共享进程空间

# 运行一个nginx pod
kubectl run nginx --image=nginx
# 创建一个新的pod my-debugger 用来调试,
#将原有pod内的容器拷贝到新的pod,并增加一个镜像为ubuntu的容器
# 并且通过进程共享
kubectl debug nginx -it --image=ubuntu --copy-to=my-debugger --share-processes
# 开启另一个终端,可以查看命名空间共享配置
kubectl get pod my-debugger -o yaml | grep shareProcessNamespace

调试容器内,执行ps ax可以看到包括被调试容器在内的所有进程。
在这里插入图片描述

通过访问/proc/{PID}/root 可访问到其他容器的文件系统,PID为主进程ID。
在这里插入图片描述

8.2、案例2:更改启动命令、容器镜像

# 运行一个myhello的pod
kubectl run myhello --image=xlhmzch/hello:1.0.0
# 更改容器启动命令
kubectl debug myhello -it --copy-to=my-debugger1 --container=myhello -- /bin/sh
# 更改容器镜像
kubectl debug myhello -it --copy-to=my-debugger2 --set-image=myhello=xlhmzch/hello:1.0.1
kubectl debug <podname> -it --copy-to=my-debugger3 --set-image=myhello=xlhmzch/hello:1.0.1,myredis=redis:alpine
# 复制并注入临时容器,共享进程空间同时修改myhello容器的镜像
kubectl debug myhello -it --copy-to=my-debugger4 --image=busybox --setimage=myhello=xlhmzch/hello:1.0.1 --share-processes

8.3、案例3:调试节点

# 通过创建Pod来调试节点,Pod将运行在指定的节点上,节点的根文件系统挂载在/host目录下
kubectl debug node/k8s-node1 -it --image=busybox

8.4、其他

其他,需要为集群开启临时容器等特性功能,否则无法使用以下操作。

# 直接在指定的pod中创建一个基于busybox的临时容器
kubectl debug <podname> -it --image=busybox
# 直接在指定的pod中创建一个基于自定义镜像的容器,并且为容器指定容器名为debugger
kubectl debug <podname> --image=<cusimage> -c debugger

总结

以下是常用的kubectl故障排除和调试命令:

  1. kubectl get 用于查看资源对象的状态,常用的参数包括:

    • kubectl get pods:查看Pod的状态;
    • kubectl get nodes:查看Node的状态;
    • kubectl get services:查看Service的状态;
    • kubectl get deployments:查看Deployment的状态。
  2. kubectl describe 用于查看资源对象的详细信息,常用的参数包括:

    • kubectl describe pod :查看Pod的详细信息;
    • kubectl describe node :查看Node的详细信息;
    • kubectl describe service :查看Service的详细信息;
    • kubectl describe deployment :查看Deployment的详细信息。
  3. kubectl logs 用于查看容器的日志信息,常用的参数包括:

    • kubectl logs :查看Pod中所有容器的日志信息;
    • kubectl logs -c :查看Pod中指定容器的日志信息。
  4. kubectl exec 用于在容器中执行命令,常用的参数包括:

    • kubectl exec :在Pod中执行指定命令;
    • kubectl exec -c :在Pod中指定容器中执行指定命令。
  5. kubectl port-forward 用于将Pod中的端口映射到本地端口,常用的参数kubectl port-forward <pod-name> <local-port>:<pod-port>将Pod中指定端口映射到本地端口。

  6. kubectl apply 用于应用或更新Kubernetes资源对象的配置,常用的参数kubectl apply -f <filename>应用或更新指定文件中的资源对象配置。

  7. kubectl delete 用于删除Kubernetes资源对象,常用的参数包括:

    • kubectl delete pod :删除指定Pod;
    • kubectl delete node :删除指定Node;
    • kubectl delete service :删除指定Service;
    • kubectl delete deployment :删除指定Deployment。

以上是常用的kubectl故障排除和调试命令,可以帮助管理员对Kubernetes集群进行故障排除和调试。
在这里插入图片描述

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
云原生是一种软件开发和部署的方法论,旨在利用云计算的优势,实现更快、更灵活、更可靠的部署和运行。云原生的核心是容器化和微服务化,通过将应用程序打包成容器,使其更易于部署、扩展和管理。同时,云原生也强调自动化、可观察性、故障恢复等方面的技术和实践。 云平台是云计算的基础设施,提供了计算、存储、网络等基础服务。云平台可以提供虚拟机、容器、对象存储等不同的计算和存储资源,以满足不同的应用需求。云平台也提供了自动化的管理服务,如负载均衡、弹性伸缩、安全等,帮助用户快速构建和管理应用程序。 Kubernetes(简称K8s)是一种容器编排平台,提供了容器编排、自动化部署、扩展、负载均衡等功能。K8s可以自动管理应用程序的容器,使其更易于部署、扩展和管理。K8s也提供了自动化的管理服务,如服务发现、故障恢复、滚动升级等,帮助用户快速构建和管理应用程序。 微服务是一种架构风格,将应用程序划分成小型服务,每个服务独立部署和扩展。微服务架构强调松耦合、高内聚、自治性等特点,使得应用程序更易于扩展和维护。微服务也可以利用容器技术进行部署和管理,实现更高效的运维。 综上所述,云原生、云平台、K8s和微服务都是云计算中的重要概念和技术,它们之间存在密切的关联。云平台提供了基础设施和自动化管理服务,支持云原生应用程序的部署和运行;K8s提供了容器编排和自动化管理服务,支持微服务架构的部署和运行;云原生、云平台、K8s和微服务共同构成了现代化的云计算架构,使得企业可以更加敏捷、高效地开发和运营应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值