k8s logs查询日志常用命令

女程序猿 2024-08-02 13:07:02 阅读 57

本文档主要是针对k8s日志进行说明。

node、pod、容器关系

一台物理机或者虚机作为node,node里面有多个pod,pod里面可以有1个或者多个容器

常用命令整理

查询有哪些pod

kubectl get pod #默认是查询命名空间是default的pod

kubectl get pod --all-namespaces #查询所有命名空间下

kubectl get pod -A #查询所有命名空间下简写

kubectl get pod -A |grep podname #过滤podname

查询指定pod的日志

kubectl logs podname 

查询指定pod下的指定容器的日志

kubectl logs podname -c containname

查询一个服务部署在多个pod下的日志

方式1:每个pod日志查询,不方便需要开多个终端监控各个pod查看日志

kubectl logs podname -c containname

方式2:使用标签查询,一个命令查询这几个pod的日志

kubectl get pod --show-labels | grep podname #查询指定podname的标签,若是有一致的标签,使用标签统一查看相同服务下的pod的日志

kubectl logs -l 标签名

日志查看最新几行,以及实时跟踪

kubectl logs -l 标签名 -n 命名空间名 --tail 5 -f

综上常用这两句查询日志

kubectl logs podname -n 命名空间名称 --tail5 -f   #通过pod名称查询实时日志

kubectl logs -l 标签名 -n 命名空间名 --tail 5 -f #通过标签名称查询实时日志

详细说明

kubectl命令模板

kubectl [command] [TYPE] [NAME] -o=<output_format>

-o 参数:

-o=custom-columns=<spec>    根据自定义列名进行输出,以逗号分隔

-o=custom-colimns-file=<filename>    从文件中获取自定义列名进行输出

-o=json    以JSON格式显示结果

-o=jsonpath=<template>    输出jsonpath表达式定义的字段信息

-o=jsonpath-file=<filename>    输出jsonpath表达式定义的字段信息,来源于文件

-o=name    仅输出资源对象的名称

-o=wide    输出额外信息。对于Pod,将输出Pod所在的Node名

-o=yaml    以yaml格式显示结果

说明:

使用-o wide 可以看到pod所在的node

使用-o json yaml  获取 Pod 的 YAML 文件,可以用于备份或还原 Pod,也可以生成json格式

describe 主要是用于描述node pod的详细信息,比如ip、运行状态:

kubectl describe node {name} - 显示指定节点的详细信息

kubectl describe pod {name} - 显示指定pod的详细信息

kubectl describe deployment {name} - 显示指定deployment的详细信息

kubectl describe service {name} - 显示指定service的详细信息

pod相关

获取pod、node、namespace、service命令都类似:

kubectl get pod

kubectl get node

kubectl get namespace

kubectl get service

kubectl get all 获取所有类型,这条可以搭配 |grep XX查询使用 

针对pod,默认获取的是命名空间是default的pod,所以若是想要查看所有空间下的pod,命令如下:

kubectl get pod --all-namespaces 显示所有namespace下的pods信息

kubectl get pod -A(简写是-A)

kubectl get pods -l {label} - 显示所有带有指定label的pods的信息

kubectl cp <pod_name>:<container_path> <host_path>:将 Pod 内指定路径的文件或目录拷贝到主机上。

kubectl top pod <pod_name>:查看 Pod 的 CPU 和内存使用情况。

Pod有以下几个状态:

Pending           等待中

Running           运行中

Succeeded      正常终止

Failed              异常停止

Unkonwn         未知状态

Pod 的详细的状态说明:

状态     描述

CrashLoopBackOff     容器退出,kubelet正在将它重启

InvalidImageName    无法解析镜像名称

ImageInspectError    无法校验镜像

ErrImageNeverPull    策略禁止拉取镜像

ImagePullBackOff    正在重试拉取

RegistryUnavailable    连接不到镜像中心

ErrImagePull    通用的拉取镜像出错

CreateContainerConfigError    不能创建kubelet使用的容器配置

CreateContainerError    创建容器失败

m.internalLifecycle.PreStartContainer    执行hook报错

RunContainerError    启动容器失败

PostStartHookError    执行hook报错

ContainersNotInitialized    容器没有初始化完毕

ContainersNotRead    容器没有准备完毕

ContainerCreating    容器创建中

PodInitializing    pod 初始化中

DockerDaemonNotReady    docker还没有完全启动

NetworkPluginNotReady    网络插件还没有完全启动

标签相关

查看 pod 标签

kubectl get pod --show-labels

查看某个具体的标签,大写L,会把标签的=号左侧内容作为列

kubectl get pod -L creation_method,rel

列出含有 rel 标签的所有pod,小写的l是过滤标签

kubectl get pod -l rel

列出不含 rel 标签的所有 pod

kubectl get pod -l '!rel'

# 列出含有 creation_method 标签,但是其值不能为 manual 的 Pod

$ kubectl get pod -l 'creation_method!=manual'

# 列出含有 rel 标签,且其值为 beta 或是 stable 的 Pod

$ kubectl get pod -l 'rel in (beta,stable)'

# 列出含有 rel 标签,且其值不为 beta 和 stable 的 Pod

$ kubectl get pod -l 'rel notin (beta,stable)'

# 列出含有标签 creation_method=manual 和 rel=stable 的 Pod

$ kubectl get pod -l creation_method=manual,rel=stable

exec命令

-i, --interactive: 保持标准输入打开,允许用户与命令交互。

-t, --tty: 分配一个伪终端,通常与 -i 一起使用以便在容器内部使用终端命令行。

-u, --user: 指定执行命令的用户名或用户ID。

-d, --detach: 在后台模式下执行命令。

-e, --env: 设置环境变量。

-w, --workdir: 指定命令的工作目录。

最常用的是-it

kubectl exec -it {name} -- /bin/bash - 进入指定pod的bash终端

kubectl exec -it {name} -- curl {url} - 在指定pod中使用curl工具测试HTTP连接

docker exec my_container ls /app --在容器内执行命令

kubectl exec -it <pod_name> -- <command>:在运行中的 Pod 内部启动一个新的容器,并在其中执行指定的命令。

kubectl exec -it <Pod-Name> -n <Namespaces> -c <Container-Name> bash

logs命令

kubectl logs {name}  #显示指定pod的日志信息

kubectl logs nginx -c nginx -n 命名空间名   #pod 上有多个容器,需要指定参数 -c 容器名 进行查询

持续获取Pod日志

语法:kubectl logs -f <pod>

获取倒数多少行

kubectl logs --tail 5

# 获取pod中容器名

$ kubectl get pods my-dep-5b7868d854-8d5kf -o jsonpath={.spec.containers[*].name}  

nginx 容器名

#然后再获取指定容器日志

 kubectl logs my-dep-5b7868d854-8d5kf -c nginx

 

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。