0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

K8s容器debug高級(jí)技巧

馬哥Linux運(yùn)維 ? 來(lái)源:51CTO ? 2024-01-12 11:31 ? 次閱讀

使用 kubectl exec 執(zhí)行指令

如果您在 Kubernetes 上運(yùn)行軟件,您會(huì)想要在某些時(shí)候去調(diào)試您所部署的軟件的一些方面。對(duì)于習(xí)慣于使用虛擬機(jī) (VMs) 的人來(lái)說(shuō)能自然使用的一種簡(jiǎn)單的調(diào)試方法,就是連接到一個(gè)正在運(yùn)行的 pod,然后進(jìn)行解譯:

kubectl exec -it podname -c containername -- bash

這通常行之有效,而且非常管用。然而,至少有兩種 Kubernetes "最佳實(shí)踐 "限制了 exec 的實(shí)用性:

不以 root 用戶身份運(yùn)行。容器盡可能以最少的特權(quán)運(yùn)行,甚至可能使用隨機(jī)的用戶標(biāo)識(shí)符 (UID) 運(yùn)行。

最小化鏡像。鏡像盡可能小,你甚至可以將二進(jìn)制文件寫(xiě)入到 distroless image。

當(dāng)應(yīng)用這些最佳實(shí)踐時(shí),使用kubectl exec連接到您的容器要么不可行,要么進(jìn)入到不適合進(jìn)行調(diào)試的環(huán)境。

kubectl exec 指令不允許指定用戶標(biāo)志或能力以啟動(dòng)進(jìn)程,而是會(huì)從目標(biāo)容器的主指令中復(fù)制這些設(shè)置。

調(diào)試容器

在解決運(yùn)行容器問(wèn)題時(shí),Kubernetes 提供了一種原生化調(diào)試策略,即使用kubectl debug。調(diào)試指令會(huì)在運(yùn)行中的 pod 中啟動(dòng)一個(gè)新的容器。這個(gè)新容器能夠以不同的用戶身份以及從您選擇的任何鏡像去運(yùn)行。由于調(diào)試容器與目標(biāo)容器位于同一個(gè) pod 中運(yùn)行(因此在同一個(gè)節(jié)點(diǎn)上),兩者之間不需要絕對(duì)的隔離。調(diào)試容器可以與同一 pod 中運(yùn)行的其他容器共享系統(tǒng)資源。

考慮去檢查在 podpostpod中的容器postcont里運(yùn)行的 PostgreSQL 數(shù)據(jù)庫(kù)的 CPU 使用情況。這個(gè) pod 并不以 root 用戶身份運(yùn)行,并且 Postgres 鏡像沒(méi)有安裝類似 top 或 htop 的工具,也就是說(shuō),kubectl exec指令幾乎沒(méi)有作用。您可以按照以下的指令去運(yùn)行:

kubectl debug -it  
 --container=debug-container  
 --image=alpine  
 --target=postcont  
 postpod

您將以 root 身份登錄(這是 Alpine 鏡像的默認(rèn)設(shè)置),并可以輕松安裝您最喜歡的交互式進(jìn)程查看器 htop (apt add htop)。您與postcont容器共享同一個(gè)進(jìn)程命名空間,可以查看并甚至終止在此運(yùn)行的所有進(jìn)程!當(dāng)您退出進(jìn)程時(shí),臨時(shí)容器也會(huì)終止。

如果希望調(diào)試容器與postcont共享相同的進(jìn)程命名空間,即使postcont是在postpod中運(yùn)行的唯一容器,指定--target是不具備選擇性的 (non-optional)。

您可以按 CTRL+P CTRL+D 斷開(kāi)與臨時(shí)容器/bash 會(huì)話 (session) 的連接,而無(wú)需退出 (終止) 它。再使用kubectl attach即可重新連接。

kubectl debug提供的功能比這里概述的更多,比如使用一個(gè)修改后的啟動(dòng)指令復(fù)制 pods,或通過(guò)訪問(wèn)節(jié)點(diǎn)文件系統(tǒng)的啟動(dòng)一個(gè) "節(jié)點(diǎn) (node) " pod。

原理解釋

以上的kubectl debug指令是通過(guò)創(chuàng)建臨時(shí)容器 (ephemeral container) 來(lái)實(shí)現(xiàn)。這些容器應(yīng)在現(xiàn)有 pod 中臨時(shí)運(yùn)行,以支持故障排除等操作?!捌胀ā比萜骱团R時(shí)容器之間的區(qū)別很小。而查看 Kubernetes 在創(chuàng)立之初所做的基礎(chǔ)架構(gòu)選擇最能讓我們理解使用臨時(shí)容器的原因:

Pod 應(yīng)該是一次性的、可替換的,并且 Pod 規(guī)范也是不可改變的。


當(dāng) Kubernetes 主要用于部署無(wú)狀態(tài)工作負(fù)載時(shí),這一點(diǎn)更加合理——因?yàn)榇藭r(shí) pod 本身會(huì)被認(rèn)為是臨時(shí)的。在這個(gè) Kubernetes 中它可能會(huì)受到限制。Pod 規(guī)范保持不變,但 Kubernetes 會(huì)將臨時(shí)容器作為 Pod 的子資源建模。與“普通”容器不同,臨時(shí)容器不屬于 Pod 規(guī)范的一部分。

掛載卷 (volumes)

內(nèi)置指令kubectl debug非常有用。它允許您在運(yùn)行的 pod 中添加一個(gè)臨時(shí)容器,并可選擇與運(yùn)行中的容器共享進(jìn)程命名空間。不過(guò),如果您希望使用kubectl debug來(lái)檢查或修改運(yùn)行中容器文件系統(tǒng)的某個(gè)部分,那就不走運(yùn)了——因?yàn)檎{(diào)試 pod 的文件系統(tǒng)與您將其連接到的容器的文件系統(tǒng)是分離的。幸運(yùn)的是,我們可以做的更好。原理很簡(jiǎn)單:

讀取正在運(yùn)行的目標(biāo)容器的規(guī)范。

將一個(gè)臨時(shí)容器填充到 pod 中。將其配置成與目標(biāo)容器共享相同的進(jìn)程命名空間,并包含相同的卷掛載。

因?yàn)闆](méi)有用于創(chuàng)建臨時(shí)容器的 kubectl 命令,所以我們需要構(gòu)建一個(gè) PATCH 請(qǐng)求到 K8s API 來(lái)創(chuàng)建它。kubectl proxy指令允許訪問(wèn) K8s API。這一過(guò)程對(duì)用戶來(lái)說(shuō)并不太友好,因此將這一過(guò)程封裝到腳本或 kubectl 插件中是合理的。您可以在這里找到這樣一個(gè)腳本實(shí)現(xiàn)示例:

https://github.com/JonMerlevede/kubectl-superdebug?source=post_page-----2ba160c47ef5------


需要注意的是,這種方法和腳本可以很容易地?cái)U(kuò)展到從目標(biāo)容器中復(fù)制環(huán)境變量的規(guī)范。如果您將此腳本保存為kubectl-superdebug,并將其放在您的路徑上,就可以在任何地方以kubectl superdebug的形式運(yùn)行,如下所示:


還可以嘗試擴(kuò)展此腳本,將目標(biāo)容器的其他方面復(fù)制到調(diào)試容器中,例如環(huán)境變量引用。

至此,Kubernetes 本機(jī)調(diào)試運(yùn)行中的容器的方法概述就完成了,應(yīng)該能滿足大多數(shù)人的需求。

非 Kubernetes 原生方法

Kubernetes 不提供以 root 身份連接到正在運(yùn)行的容器的方法(除非主進(jìn)程以 root 身份運(yùn)行),也不提供從另一個(gè)容器訪問(wèn)容器根文件系統(tǒng)的方法。但這并不意味著這些事情不可能做到。畢竟, Kubernetes 只是一個(gè)位于容器化引擎之上的容器編排器。如果出于某種原因,確實(shí)有必要的話,您通??梢酝ㄟ^(guò)移除抽象層來(lái)做任何您想做的事。

如果您使用的是 Docker 引擎,并且可以直接從節(jié)點(diǎn)或通過(guò)節(jié)點(diǎn)上運(yùn)行的特權(quán)容器訪問(wèn)您的引擎,那么您就可以運(yùn)行docker exec --user,并以您選擇的用戶身份執(zhí)行一個(gè)進(jìn)程。

kubectl ssh和kubectl exec-user等插件實(shí)現(xiàn)了這種方法。但遺憾的是,containerd 和 CRI-O 等現(xiàn)代引擎不再提供--user這樣標(biāo)志功能,這意味著這些插件無(wú)法在當(dāng)下的 Kubernetes 安裝上運(yùn)行。

不過(guò),即使是這些現(xiàn)代引擎,通常也只是與 Linux 命名空間接口。通過(guò)輸入相應(yīng)的 Linux 命名空間集,您可以在任何您想要的“容器”中運(yùn)行指令。kpexec 工具實(shí)現(xiàn)了這種方法。它在與目標(biāo)容器相同的節(jié)點(diǎn)上啟動(dòng)一個(gè)有權(quán)限的 pod,然后確定要針對(duì)哪些 (Linux) 命名空間,在這些 (Linux) 命名 空間中執(zhí)行命令,最后將其輸出流式傳輸?shù)侥慕K端。作為額外的收獲,它還能在目標(biāo)容器的文 件系統(tǒng)之上疊加一套用于調(diào)試的工具。

與 kubectl exec 不同,kpexec 可以使用不同的 uid/gid 運(yùn)行指令,甚至可以使用與容器主進(jìn)程不同的功能。它與 containerd 和 cri-o 兼容。只是 kpexec 采用的方法有些笨重和脆弱,可能與集群的安全配置不兼容。但如果 kubectl (super) 調(diào)試無(wú)法滿足您的需求,則值得考慮它。

需要注意,kpexec 使用 nsenter 是直接在命名空間中執(zhí)行指令的。它與無(wú)處不在的容器運(yùn)行時(shí) runc 兼容,但與 Kata Containers 等運(yùn)行時(shí)不兼容。

借助 Appilot 對(duì)話式診斷 K8s

Appilot 是一款面向 DevOps 場(chǎng)景的開(kāi)源 AI 助手,它可以充分利用 AI 大語(yǔ)言模型的能力讓用戶直接輸入自然語(yǔ)言進(jìn)一步簡(jiǎn)化應(yīng)用部署與管理體驗(yàn)。用戶可以根據(jù)自身的需求和使用習(xí)慣,將 Appilot 集成到任意平臺(tái),進(jìn)而實(shí)現(xiàn)通過(guò)輸入自然語(yǔ)言即可調(diào)用后端平臺(tái)的能力,輕松完成 Kubernetes debug 工作。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    606

    瀏覽量

    35617
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    29805

    瀏覽量

    268102
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    492

    瀏覽量

    22027
  • DEBUG
    +關(guān)注

    關(guān)注

    3

    文章

    89

    瀏覽量

    19848

原文標(biāo)題:K8s容器debug高級(jí)技巧

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對(duì)比

    摘要: 今天,日志服務(wù)再次升級(jí)Kubernetes(k8s)的日志解決方案。1分鐘內(nèi)即可完成整個(gè)集群部署,支持動(dòng)態(tài)擴(kuò)容,提供采集宿主機(jī)日志、容器日志、容器stdout等所有數(shù)據(jù)源的一站式采集。點(diǎn)此
    發(fā)表于 02-28 12:49

    K8S容器編排的互通測(cè)試

    K8S容器編排之NetWorkPolicy官方實(shí)例
    發(fā)表于 06-06 11:28

    OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較

    OpenStack與K8S結(jié)合主要有兩種方案。一是K8S部署在OpenStack平臺(tái)之上,二是K8S和OpenStack組件集成。
    的頭像 發(fā)表于 10-14 09:38 ?2.7w次閱讀

    k8s容器運(yùn)行時(shí)演進(jìn)歷史

    在docker/k8s時(shí)代,經(jīng)常聽(tīng)到CRI, OCI,containerd和各種shim等名詞,看完本篇博文,您會(huì)有個(gè)徹底的理解。 典型的K8S Runtime架構(gòu) 從最常見(jiàn)的Docker說(shuō)起
    的頭像 發(fā)表于 02-02 13:50 ?1887次閱讀
    <b class='flag-5'>k8s</b><b class='flag-5'>容器</b>運(yùn)行時(shí)演進(jìn)歷史

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬(wàn)的容器,突然感覺(jué)不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來(lái)了解一下 K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3395次閱讀

    簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系

    這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利用圖文講解的很透徹,有需要的同學(xué)可以研究下 最近項(xiàng)目用到kubernetes(以下簡(jiǎn)稱k8s,ks之間有
    的頭像 發(fā)表于 06-24 15:48 ?3324次閱讀

    K8S集群服務(wù)訪問(wèn)失敗怎么辦 K8S故障處理集錦

    問(wèn)題1:K8S集群服務(wù)訪問(wèn)失??? ? ? 原因分析:證書(shū)不能被識(shí)別,其原因?yàn)椋鹤远x證書(shū),過(guò)期等。 解決方法:更新證書(shū)即可。 問(wèn)題2:K8S集群服務(wù)訪問(wèn)失??? curl: (7) Failed
    的頭像 發(fā)表于 09-01 11:11 ?1.6w次閱讀
    <b class='flag-5'>K8S</b>集群服務(wù)訪問(wèn)失敗怎么辦 <b class='flag-5'>K8S</b>故障處理集錦

    K8S(kubernetes)學(xué)習(xí)指南

    K8S(kubernetes)學(xué)習(xí)指南
    發(fā)表于 06-29 14:14 ?0次下載

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    k8s是什么意思? kubernetes簡(jiǎn)稱K8s,是一個(gè)開(kāi)源的,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效(powerful
    發(fā)表于 07-19 13:14 ?1085次閱讀

    什么是K3sK8s?K3sK8s有什么區(qū)別?

    Kubernetes,通??s寫(xiě)為 K8s,是領(lǐng)先的容器編排工具。該開(kāi)源項(xiàng)目最初由 Google 開(kāi)發(fā),幫助塑造了現(xiàn)代編排的定義。該系統(tǒng)包括了部署和運(yùn)行容器化系統(tǒng)所需的一切。
    的頭像 發(fā)表于 08-03 10:53 ?7145次閱讀

    k8s生態(tài)鏈包含哪些技術(shù)

    1. Apache APISIX Ingress 定義 ? 在 K8s 生態(tài)中,Ingress 作為表示 K8s 流量入口的一種資源,想要讓其生效,就需要有一個(gè) Ingress Controller
    的頭像 發(fā)表于 08-07 10:56 ?1149次閱讀
    <b class='flag-5'>k8s</b>生態(tài)鏈包含哪些技術(shù)

    跑大模型AI的K8s與普通K8s的區(qū)別分析

    Kubernetes是一個(gè)在大量節(jié)點(diǎn)上管理容器的系統(tǒng),其主要功能總結(jié)起來(lái),就是在想要啟動(dòng)容器的時(shí)候,負(fù)責(zé)“找一個(gè)「空閑」節(jié)點(diǎn),啟動(dòng)容器”。但是它默認(rèn)考慮的啟動(dòng)因素(資源類)主要就是“CPU+內(nèi)存”。就是
    發(fā)表于 09-03 12:07 ?849次閱讀

    K8s多集群管理:為什么需要多集群、多集群的優(yōu)勢(shì)是什么

    隨著K8s和云原生技術(shù)的快速發(fā)展,以及各大廠商在自己的數(shù)據(jù)中心使用K8s的API進(jìn)行容器化應(yīng)用編排和管理,讓?xiě)?yīng)用交付本身變得越來(lái)越標(biāo)準(zhǔn)化和統(tǒng)一化,并且實(shí)現(xiàn)了與底層基礎(chǔ)設(shè)施的完全解耦,為多集群和混合云提供了一個(gè)堅(jiān)實(shí)技術(shù)基礎(chǔ)。
    發(fā)表于 09-14 10:48 ?1122次閱讀
    <b class='flag-5'>K8s</b>多集群管理:為什么需要多集群、多集群的優(yōu)勢(shì)是什么

    K8S落地實(shí)踐經(jīng)驗(yàn)分享

    k8s 即 Kubernetes,是一個(gè)開(kāi)源的容器編排引擎,用來(lái)對(duì)容器化應(yīng)用進(jìn)行自動(dòng)化部署、 擴(kuò)縮和管理。
    的頭像 發(fā)表于 01-02 11:45 ?1004次閱讀
    <b class='flag-5'>K8S</b>落地實(shí)踐經(jīng)驗(yàn)分享

    常用的k8s容器網(wǎng)絡(luò)模式有哪些?

    常用的k8s容器網(wǎng)絡(luò)模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s容器網(wǎng)絡(luò)模
    的頭像 發(fā)表于 09-19 11:29 ?179次閱讀