本文档主要是针对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
版权归原作者 女程序猿 所有, 如有侵权,请联系我们删除。