首页 > 系统相关 >Kubernetes:根据进程 Pid 获取 Pod 名称

Kubernetes:根据进程 Pid 获取 Pod 名称

时间:2023-10-12 22:45:51浏览次数:57  
标签:Kubernetes 986a pod8e018a8e Pid jq 4ac6 1a5133a4bcf1 docker Pod

前言

在管理 Kubernetes 集群的过程中,我们经常会遇到这样一种情况:在某台节点上发现某个进程资源占用量很高,却又不知道是哪个容器里的进程。有没有办法可以根据进程 PID 快速找到 Pod 名称呢?

解决

假设现在有一个 prometheus 进程的 PID14338

要获取容器的 ID,可以查看 PID 对应的 cgroup 信息:

cat /proc/14338/cgroup
 
11:blkio:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
10:cpuset:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
9:freezer:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
8:hugetlb:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
7:perf_event:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
6:cpuacct,cpu:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
5:pids:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
4:devices:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
3:net_prio,net_cls:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
2:memory:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
1:name=systemd:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c

可以看到该进程对应的容器 IDd6f24b62...,可以再优化一下上面的命令,直接获取容器 ID

$ CID=$(cat /proc/14338/cgroup | awk -F '/' '{print $5}')
 
$ echo ${CID:0:8}
d6f24b62

运行时为:containerd、crio

最后一步根据容器 ID 获取 Pod 名称,如果你的容器运行时是 containerdcrio,可以使用 crictl 来获取容器信息:

# 使用 Go template 或 jq 都能获取 Pod 名称,看个人喜好。

# Go Template
$ crictl inspect -o go-template --template='{{index .status.labels "io.kubernetes.pod.name"}}' d6f24b62
prometheus-k8s-0

# jq
$ crictl inspect d6f24b62|jq '.status.labels["io.kubernetes.pod.name"]'
"prometheus-k8s-0"

运行时为:Docker

如果你的容器运行时是 Docker,可以使用命令行工具 docker 来获取,方法和上面类似。

$ docker inspect d6f24b62 | jq '.[0].Config.Labels."io.kubernetes.pod.name"'
"prometheus-k8s-0"

一种特殊情况的处理,上面的方法适用于大多数场景。但有可能你的 cat /proc/14338/cgroup 输出的结果是这样的:

$ cat /proc/14338/cgroup

11:blkio:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/docker-d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
10:cpuset:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/docker-d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
9:freezer:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/docker-d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
......

这时你就需要将上面取容器 ID 的方法稍做修改:

$ cat /proc/d6f24b62/cgroup | awk -F '/' '{print $5}'|sed 's/docker-//g'
11:blkio:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
10:cpuset:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c
9:freezer:/kubepods/burstable/pod8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/d6f24b62ea28e9e67f7bc06f98de083cc49454f353389cd396f5d3ac6448f19c

go script 脚本

package main

import (
	"fmt"
	"github.com/bitfield/script"
	"log"
	"os"
)

func main() {
	if len(os.Args) < 2 {
		log.Fatal("请传递一个 PID 作为参数")
	}

	pid := os.Args[1]

	data, err := script.File(fmt.Sprintf("/proc/%s/cgroup", pid)).Exec("awk -F '/' '{print $5}'").String()
	if err != nil {
		panic(err)
	}
	cid := data[7:19]
	podName, err := script.Exec(fmt.Sprintf("docker inspect %s", cid)).JQ(".[0].Config.Labels.\"io.kubernetes.pod.name\"").String()
	if err != nil {
		panic(err)
	}
	fmt.Println(podName)
	podNameSpace, err := script.Exec(fmt.Sprintf("docker inspect %s", cid)).JQ(".[0].Config.Labels.\"io.kubernetes.pod.namespace\"").String()
	if err != nil {
		panic(err)
	}
	fmt.Println(podNameSpace)
}

根据 Pid 获取 K8s Pod 名称,Shell 脚本

$ 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 格式。

简单介绍下 jq

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

运行方式

# 通过 Pid 获取 Pod 名称
$ ./pod_name_info.sh Pid

通过 Pid 获取 Pod 名称

根据 Pod 名称获取 Pid,Shell脚本

$ 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名称

通过 Pod名称 获取 Pid

巨人的肩膀

https://www.hi-linux.com/posts/1620.html
https://mp.weixin.qq.com/s/77v46oIraV22acC8eYqC5A
https://mp.weixin.qq.com/s/HF5rzr5fULiMWq1NPe780g

标签:Kubernetes,986a,pod8e018a8e,Pid,jq,4ac6,1a5133a4bcf1,docker,Pod
From: https://www.cnblogs.com/niuben/p/17753705.html

相关文章

  • POD 题解
    考虑每种颜色都只在一条链上出现这个限制。考虑使用随机化\(\text{hash}\),我们对每个点随机一个权值,使得每种颜色所有点异或值为\(0\)。这样一种颜色如果只在一条链上,那对两条链\(\text{hash}\)异或值的贡献就是\(0\),否则就是两个随机值。这样如果存在一个颜色存在于两条......
  • 基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和
    作者:车漾前文回顾:本系列将介绍如何基于ACKFluid支持和优化混合云的数据访问场景,相关文章请参考:-基于ACKFluid的混合云优化数据访问(一):场景与架构-基于ACKFluid的混合云优化数据访问(二):搭建弹性计算实例与第三方存储的桥梁-基于ACKFluid的混合云优化数据访问(三):加速......
  • 深入Pod —— 探针
    一、探针容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态一)类型1、StartupProbek8s1.16版本新增的探针,用于判断应用程序是否已经启动了。当配置了startupProbe后,会先禁用其他探针,直到startupProbe成功后,其他探针才会继续。作用:由于有时候不能准确预估......
  • 记一次线上华为云Kubernetes(CCE)环境Jenkins 发版爆雷事故
    一、前言2023年10月11号下午17:16分,临近下班之际,研发同事在办公室发出了尖锐的爆鸣声....紧接着企业微信呼唤,说线上项目突然无法正常发版了....与此同时接收到消息,便展开一系列排查。二、排查思路定位从报错信息上来看,在gitpull项目的过程就出错了,提示无法写入新的配置文件.....c......
  • k8s pod command使用
    简单说明我们启pod服务时,有时需要在服务启动前做一些初始化的工作,这里可能会涉及多个shell命令以及判断执行,这里可以参考下面的步骤进行:command:["/bin/bash"]args:-"-c"-|set-exif[!-d"/opt/test"];thenmkdir/opt/testcp-r/opt......
  • 搭建 Kubernetes 集群 —— API 概述
    官网文档:https://kubernetes.io/zh-cn/docs/reference/using-api/RESTAPI是Kubernetes系统的重要部分,组件之间的所有操作和通信均由APIServer处理的RESTAPI调用,大多数情况下,API定义和实现都符合标准的HTTPREST格式,可以通过kubectl命令管理工具或其他命令行工具来......
  • 搭建 Kubernetes 集群 —— 命令行工具 kubectl
    命令行工具(kubectl)Kubernetes提供kubectl是使用KubernetesAPI与Kubernetes集群的控制面进行通信的命令行工具。这个工具叫做kubectl。一、在任意节点使用kubectl最开始只能在master节点上使用kubectl工具,比如kubectlgetnodes因为之前在部署master节点时......
  • [k8s] Kubernetes Architecture
    ControlPlaneMaster节点主要有4个主要组件:APIServer跟集群进行交互的接口(kubectl)etcd,集群数据存储Scheduler,根据不同的因素决定最终的容器运行在哪个节点node上ControllerManager,管理不同的controller的WorkerNodeWorker节点的三个主要组件:kubelet运行在每一个node上的age......
  • Kubernetes集群通过Helm部署skywalking及测试
     目录1.前言2.skywalking组件3.Helm部署步骤3.1安装包下载3.2修改配置3.3helm安装3.4访问方式4.制作skywalking-agent-sidecar镜像5.在deployment中应用skywalking-agent 1.前言本文主要介绍Kubernetes中如何用Helm3部署skywalking,并对pod应用进行链路......
  • 原云生技术Kubernetes和Doker
    一、云计算云计算是一种新型的分布式计算模式,它通过互联网将计算和存储资源进行集中和共享,为用户提供各种计算服务、存储服务、应用服务等.二、原云生CNCF(原云生基金会)为,Kubernetes为第一个项目2019年云原生技术基础和容器(Doker)大规模应用......