jq怎么获取label的值_根据 PID 获取 K8S Pod名称 反之 POD名称 获取 PID

背景

随着 Kubernetes 越来越火爆,运维人员排查问题难度越来越大。比如我们收到监控报警,某台 Kubernetes Node 节点负载高。通过 top 或者 pidstat 命令获取 Pid,问题来了,这个 Pid 对应那个 Kubernetes Pod 呢?

下面是作者写的两个小工具,可以帮助运维同胞们快速定位问题。

根据 Pid 获取 K8s Pod 名称

脚本工具

$ vim pod_name_info.sh

#!/usr/bin/env bash
Check_jq() {
  which jq &> /dev/null
  if [ $? != 0 ];then
    echo -e "\033[32;32m 系统没有安装 jq 命令,请参考下面命令安装!  \033[0m \n"
    echo -e "\033[32;32m Centos 或者 RedHat 请使用命令 yum install jq -y 安装 \033[0m"
    echo -e "\033[32;32m Ubuntu 或者 Debian 请使用命令 apt-get install jq -y 安装 \033[0m"
    exit 1
  fi
}

Pod_name_info() {
  CID=`cat /proc/${pid}/cgroup | head -1 | awk -F '/' '{print $5}'`
  CID=$(echo ${CID:0:8})
  docker inspect $CID | jq '.[0].Config.Labels."io.kubernetes.pod.name"'
}

pid=$1
Check_jq
Pod_name_info

上面 Shell 脚本需要服务器上安装 jq 命令,因为脚本依赖 jq 来处理 json 格式。

简单介绍下 jqjson

有些小伙伴们可能没有听说过 jq 命令,下面简单介绍下 jqjson

JSON 是一种轻量级的数据交换格式。其采用完全独立于语言的文本格式,具有方便人阅读和编写,同时也易于机器的解析和生成。这些特性决定了 JSON 格式越来越广泛的应用于现代的各种系统中。作为系统管理员,在日常的工作中无论是编辑配置文件或者通过 http 请求查询信息,我们都不可避免的要处理 JSON 格式的数据。

jq 是一款命令行下处理 JSON 数据的工具。其可以接受标准输入命令管道或者文件中的 JSON 数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出到标准输出中。jq 的这种特性使我们可以很容易地在 Shell 脚本中调用它。

演示

运行方式
# 通过 Pid 获取 Pod 名称
$ ./pod_name_info.sh Pid
下面展示输出结果
e27457a1222ebc2ee7e0457da91ed4b5.png
通过 Pid 获取 Pod 名称

上面脚本是根据 Pid 来获取 Pod 名称,但有时想通过 Pod 名称来获取 Pid,这又怎么获取了,接着看下文。

根据 Pod 名称获取 Pid

脚本工具

$ vim pod_pid_info.sh

#!/usr/bin/env bash
Check_jq() {
  which jq &> /dev/null
  if [ $? != 0 ];then
    echo -e "\033[32;32m 系统没有安装 jq 命令,请参考下面命令安装!  \033[0m \n"
    echo -e "\033[32;32m Centos 或者 RedHat 请使用命令 yum install jq -y 安装 \033[0m"
    echo -e "\033[32;32m Ubuntu 或者 Debian 请使用命令 apt-get install jq -y 安装 \033[0m"
    exit 1
  fi
}

Pid_info() {
  docker_storage_location=`docker info  | grep 'Docker Root Dir' | awk '{print $NF}'`

  for docker_short_id in `docker ps | grep ${pod_name} | grep -v pause | awk '{print $1}'`
  do
    docker_long_id=`docker inspect ${docker_short_id} | jq ".[0].Id" | tr -d '"'`
    cat ${docker_storage_location}/containers/${docker_long_id}/config.v2.json | jq ".State.Pid"
  done
}

pod_name=$1
Check_jq
Pid_info

演示

运行方式
# 通过 Pod名称 获取 Pid
$ ./pod_pid_info.sh Pod名称
下面展示输出结果
0890e13f44442302dacd80de67a5674f.png
通过 Pod名称 获取 Pid

热门文章推荐

  • Docker 网络配置那些事
  • 前端本地缓存概况之浏览器缓存策略
  • Kubeconfig文件自动合并-实现K8S多集群切换
  • Kubernetes 中利用 LXCFS 控制容器资源可见性
  • Kubernetes Node节点主机名 修改
  • 阿里云出品-深入浅出Kubernetes与CDN排坑指南

最后

  • 欢迎您加我微信【ypxiaozhan01】,拉您进技术群,一起交流学习...
  • 欢迎您关注【YP小站】,学习互联网最流行的技术,做个专业的技术人...
689339729604fe824eca6cb157bbb02f.png

  【文章让您有收获,?  或者 在看 支持我吧】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值