Kubernetes 根據(jù) PID 獲取 Pod 名稱

原文鏈接:https://fuckcloudnative.io/posts/find-kubernetes-pod-info-from-process-id/ 原文作者: 米開(kāi)朗基楊

在管理 Kubernetes 集群的過(guò)程中纪他,我們經(jīng)常會(huì)遇到這樣一種情況:在某臺(tái)節(jié)點(diǎn)上發(fā)現(xiàn)某個(gè)進(jìn)程資源占用量很高雌隅,卻又不知道是哪個(gè)容器里的進(jìn)程。有沒(méi)有辦法可以根據(jù) PID 快速找到 Pod 名稱呢运敢?

假設(shè)現(xiàn)在有一個(gè) prometheus 進(jìn)程的 PID 是 14338

image

為了進(jìn)一步挖掘信息版确,有兩種思路,一種是挖掘 PID 對(duì)應(yīng)的容器的信息,另一種是挖掘 PID 對(duì)應(yīng)的 Pod 的信息取具。

1. Container ID

要獲取容器的 ID,可以查看 PID 對(duì)應(yīng)的 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

可以看到該進(jìn)程對(duì)應(yīng)的容器 ID 為 d6f24b62...扁耐,可以再優(yōu)化一下上面的命令暇检,直接獲取容器 ID:

$ CID=$(cat /proc/14338/cgroup | awk -F '/' '{print $5}')

$ echo ${CID:0:8}
d6f24b62

最后一步根據(jù)容器 ID 獲取 Pod 名稱,如果你的容器運(yùn)行時(shí)是 containerdcrio婉称,可以使用 crictl 來(lái)獲取容器信息:

# 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"

使用 Go templatejq 都能獲取 Pod 名稱块仆,看個(gè)人喜好。

如果你的容器運(yùn)行時(shí)是 Docker王暗,可以使用命令行工具 docker 來(lái)獲取悔据,方法和上面類似。

2. Pod UID

下面來(lái)看看第二種方法俗壹,先根據(jù) PID 直接獲取 Pod UID

$ cat /proc/14338/mountinfo | grep "etc-hosts" | awk -F / {'print $6'}
8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1

然后根據(jù) Pod UID 獲取 Pod 名稱:

$ crictl ps -o json | jq  '.[][].labels | select (.["io.kubernetes.pod.uid"] == "8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1") | .["io.kubernetes.pod.name"]'|uniq
"prometheus-k8s-0"

3. 整合

方法是有了科汗,怎么才能將所有的步驟合并成一個(gè)步驟,一步到位獲取 Pod 名稱呢策肝?可以在 ~/.bashrc 中添加一個(gè) shell 函數(shù)肛捍,選擇上面的方法 1,并使用 go template 來(lái)格式化(你也可以使用上面提到的其他方法之众,但需要安裝 jq):

podinfo() {
  CID=$(cat /proc/$1/cgroup | awk -F '/' '{print $5}')
  CID=$(echo ${CID:0:8})
  crictl inspect -o go-template --template='{{index .status.labels "io.kubernetes.pod.name"}}' $CID
}

執(zhí)行下面的命令使修改立即生效:

$ source ~/.bashrc

然后就可以使用該函數(shù)來(lái)獲取 Pod 名稱啦:

$ podinfo 14338
prometheus-k8s-0

4. 舉一反三

這個(gè)思路也可以用來(lái)解決其他問(wèn)題拙毫,大家要學(xué)會(huì)舉一反三,我舉個(gè)例子棺禾。Kubernetes 中的很多組件都是通過(guò) HTTPS 協(xié)議來(lái)暴露指標(biāo)缀蹄,比如 kubelet,那么如何使用 API 來(lái)訪問(wèn)這些指標(biāo)呢?

先選取一個(gè)容器缺前,比如 prometheus蛀醉,找到它的 PID:

$ ps -ef|grep "/bin/prometheus"

1000     14338 14246  4 7月10 ?       04:29:02 /bin/prometheus --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries --config.file=/etc/prometheus/config_out/prometheus.env.yaml --storage.tsdb.path=/prometheus --storage.tsdb.retention.time=24h --web.enable-lifecycle --storage.tsdb.no-lockfile --web.route-prefix=/
1000     14402 14246  0 7月10 ?       00:00:10 /bin/prometheus-config-reloader --log-format=logfmt --reload-url=http://localhost:9090/-/reload --config-file=/etc/prometheus/config/prometheus.yaml.gz --config-envsubst-file=/etc/prometheus/config_out/prometheus.env.yaml
root     15956   555  0 18:19 pts/0    00:00:00 grep --color=auto /bin/prometheus

根據(jù) PID 找到 Pod UID:

$ cat /proc/14338/mountinfo | grep "etc-hosts" | awk -F / {'print $6'}
8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1

根據(jù) Pod UID 找到 Service Account 的 token 掛載目錄:

$ ll /var/lib/kubelet/pods/8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/volumes/kubernetes.io~secret/prometheus-k8s-token-p7bgb/

總用量 0
lrwxrwxrwx 1 root root 13 7月  10 21:24 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root root 16 7月  10 21:24 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 12 7月  10 21:24 token -> ..data/token

獲取 token 信息:

$ export TOKEN=$(cat /var/lib/kubelet/pods/8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/volumes/kubernetes.io~secret/prometheus-k8s-token-p7bgb/token)

通過(guò) curl 直接訪問(wèn)指標(biāo):

$ curl -s -H "Authorization: Bearer $TOKEN" --cacert /var/lib/kubelet/pods/8e018a8e-4aaa-4ac6-986a-1a5133a4bcf1/volumes/kubernetes.io~secret/prometheus-k8s-token-p7bgb/ca.crt --insecure https://127.0.0.1:10250/metrics/cadvisor

當(dāng)然,如果你能找到集群管理員的證書(shū)衅码、密鑰和 CA 證書(shū)拯刁,也可以直接使用它們來(lái)訪問(wèn),我就不展開(kāi)說(shuō)了逝段。

5. 真奇技淫巧

最后再介紹一個(gè)思路清奇的方案垛玻,雖然有點(diǎn)小瑕疵,但思路很巧妙奶躯,大家可以借鑒一下帚桩。Kubernetes 創(chuàng)建的容器中的主機(jī)名對(duì)應(yīng)的就是 Pod 名稱,沿著這個(gè)思路嘹黔,我們可以得到一個(gè)更巧妙的方法账嚎,通過(guò) PID 的 uts namespace 來(lái)獲得容器的主機(jī)名,進(jìn)而就可以知道 Pod 名稱儡蔓,具體可以借助 nsenter 這個(gè)工具:

$ nsenter -t 14338 --uts hostname
prometheus-k8s-0

這么一看郭蕉,確實(shí)比上面的方法優(yōu)雅多了,但這個(gè)方法會(huì)有一點(diǎn)小問(wèn)題浙值,當(dāng)容器使用 HostNetwork 模式運(yùn)行時(shí)恳不,hostname 是宿主機(jī)的 hostname,通過(guò)這種方法就得不到 Pod 名稱开呐。雖然不是通用的方法,但思路還是可以借鑒的规求,除了使用 nsenter 獲取主機(jī)名外筐付,還可以通過(guò)環(huán)境變量來(lái)獲取,命令如下:

$ xargs -0 -L1 -a /proc/14338/environ | grep HOSTNAME
HOSTNAME=prometheus-k8s-0

解釋一下這幾個(gè)參數(shù):

  • -0 : 表示使用 null 作為分隔符
  • -L : 表示指定多少行作為一個(gè)命令行參數(shù)阻肿。-L1 就表示指定 1 行作為命令行參數(shù)瓦戚,即每一行分別運(yùn)行一次命令。xargs 的作用就是將標(biāo)準(zhǔn)輸入轉(zhuǎn)換為命令行參數(shù)丛塌,如果 xargs 后面沒(méi)有跟上真正要執(zhí)行的命令较解,就表示使用默認(rèn)的 echo。所以這里的 -L1 就表示分隔出來(lái)的每一行分別運(yùn)行一次 echo 命令赴邻。
  • -a : 從文件中讀取內(nèi)容印衔,而不是從標(biāo)準(zhǔn)輸入讀取。

如果你還不理解姥敛,好吧我盡力了奸焙。

最后再推薦一個(gè)項(xiàng)目,可以找到所有容器的 PID 以及對(duì)應(yīng)的 Pod 信息,項(xiàng)目地址:pid2pod与帆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末了赌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玄糟,更是在濱河造成了極大的恐慌勿她,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫂拴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贮喧,警方通過(guò)查閱死者的電腦和手機(jī)筒狠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箱沦,“玉大人辩恼,你說(shuō)我怎么就攤上這事∥叫危” “怎么了灶伊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寒跳。 經(jīng)常有香客問(wèn)我聘萨,道長(zhǎng),這世上最難降的妖魔是什么童太? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任米辐,我火速辦了婚禮,結(jié)果婚禮上书释,老公的妹妹穿的比我還像新娘翘贮。我一直安慰自己,他們只是感情好爆惧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布狸页。 她就那樣靜靜地躺著,像睡著了一般扯再。 火紅的嫁衣襯著肌膚如雪芍耘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天熄阻,我揣著相機(jī)與錄音斋竞,去河邊找鬼。 笑死饺律,一個(gè)胖子當(dāng)著我的面吹牛窃页,可吹牛的內(nèi)容都是我干的跺株。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脖卖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乒省!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起畦木,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袖扛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后十籍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛆封,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年勾栗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惨篱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡围俘,死狀恐怖砸讳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情界牡,我是刑警寧澤簿寂,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站宿亡,受9級(jí)特大地震影響常遂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挽荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一克胳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坤按,春花似錦毯欣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腹忽。三九已至来累,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窘奏,已是汗流浹背嘹锁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留着裹,地道東北人领猾。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親摔竿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子面粮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348