隨着 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

下面展示輸出結果

上面腳本是根據 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名稱
相關文章