<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Kubernetes 中如何使用臨時(shí)容器進(jìn)行故障排查

          共 3409字,需瀏覽 7分鐘

           ·

          2022-03-06 09:02

          容器及其周圍的生態(tài)系統(tǒng)改變了工程師部署、維護(hù)和排查工作負(fù)載故障的方式。但是,在 Kubernetes 集群上調(diào)試應(yīng)用程序有時(shí)可能會(huì)很困難,因?yàn)槟憧赡茉谌萜髦姓也坏剿璧恼{(diào)試工具。許多工程師使用基于精簡(jiǎn)、發(fā)行版構(gòu)建無(wú)發(fā)行版的基礎(chǔ)鏡像,其中甚至沒(méi)有包管理器或shell。甚至一些團(tuán)隊(duì)使用 scratch 作為基礎(chǔ)鏡像,并且只添加應(yīng)用程序運(yùn)行所需的文件。這種常見(jiàn)做法的一些原因是:

          • 具有較小的攻擊區(qū)域。
          • 為了獲得更快的掃描性能。
          • 減小了鏡像大小。
          • 為了有更快的構(gòu)建和更短CD/CI周期。
          • 減少依賴關(guān)系。
          這些精簡(jiǎn)的基礎(chǔ)鏡像不包括用于對(duì)應(yīng)用程序或其依賴項(xiàng)進(jìn)行故障排查的工具。這是 Kubernetes 臨時(shí)容器功能最大用途。臨時(shí)容器允許創(chuàng)建包含可能需要的所有調(diào)試工具的容器鏡像。一旦需要調(diào)試,就可以將臨時(shí)容器部署到所選的正在運(yùn)行的 Pod 中。
          我們不能將容器添加到已部署的容器;您需要更新spec,并重新創(chuàng)建資源。但是,可以將臨時(shí)容器添加到現(xiàn)有 Pod 中,以便對(duì)線上問(wèn)題進(jìn)行故障排查。
          本文介紹如何使用臨時(shí)容器進(jìn)行Kubernetes上工作負(fù)載的問(wèn)題排查。

          臨時(shí)容器的配置

          臨時(shí)容器與常規(guī)容器共享相同的spec。但是,某些字段被禁用,并且某些行為被更改。下面列出了一些重大變化;檢查臨時(shí)容器規(guī)范以獲取完整列表。

          • 它們不會(huì)重新啟動(dòng)。
          • 不允許定義資源。
          • 不允許使用端口。
          • 不允許使用啟動(dòng)、活動(dòng)和就緒探測(cè)。

          啟動(dòng)臨時(shí)容器

          首先,檢查是否啟用了臨時(shí)容器功能。

          kubectl?debug?-it??--image=busybox

          如果未啟用該功能,您將看到類似下面的消息。

          Defaulting?debug?container?name?to?debugger-wg54p.
          error:?ephemeral?containers?are?disabled?for?this?cluster?(error?from?server:?"the?server?could?not?find?the?requested?resource").

          將 EphemeralContainers=true 附加到 kubelet、kube-apiserver、kube-controller-manager、kube-proxy、kube-scheduler 參數(shù)中的--feature-gates=后, 例如:

          ...
          --feature-gates=RemoveSelfLink=false,EphemeralContainers=true
          ...

          使用臨時(shí)容器

          現(xiàn)在,集群支持臨時(shí)容器功能,讓我們來(lái)試試吧。要?jiǎng)?chuàng)建臨時(shí)容器,使用 kubectl 命令行工具的 debug 子命令。首先,創(chuàng)建一個(gè)Deployment

          kubectl?create?deployment?nginx-deployment?--image=nginx

          獲取需要debug的Pod的名稱

          $?kubectl?get?pods

          NAME????????????????????????????????READY???STATUS????RESTARTS???AGE
          nginx-deployment-66b6c48dd5-frsv9???1/1?????Running???6??????????62d

          以下命令將在 pod nginx-deployment-66b6c48dd5-frsv9 中創(chuàng)建一個(gè)新的臨時(shí)容器。臨時(shí)容器的鏡像是busybox。-i 和 -t 參數(shù)允許我們附加到新創(chuàng)建的容器。

          $?kubectl?debug?-it?pods/nginx-deployment-66b6c48dd5-frsv9?--image=busybox

          現(xiàn)在我們可以debug了

          /?#?ping?8.8.8.8
          PING?8.8.8.8?(8.8.8.8):?56?data?bytes
          64?bytes?from?8.8.8.8:?seq=0?ttl=112?time=9.797?ms
          64?bytes?from?8.8.8.8:?seq=1?ttl=112?time=9.809?ms
          ^C
          /?#?nc?--help
          BusyBox?v1.34.1?(2021-11-11?01:55:05?UTC)?multi-call?binary.

          Usage:?nc?[OPTIONS]?HOST?PORT??-?connect
          nc?[OPTIONS]?-l?-p?PORT?[HOST]?[PORT]??-?listen
          ...

          當(dāng)使用 kubectl describe pod 命令時(shí),可以看到一個(gè)新字段 "Ephemeral Containers",此部分包含臨時(shí)容器及其屬性。

          $?kubectl?describe?pods?

          ...
          ...
          Ephemeral?Containers:
          ??debugger-thwrn:
          ????Container?ID:???containerd://eec23aa9ee63d96b82970bb947b29cbacc30685bbc3418ba840dee109f871bf0
          ????Image:??????????busybox
          ????Image?ID:???????docker.io/library/busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353
          ????Port:???????????
          ????Host?Port:??????

          與臨時(shí)容器共享進(jìn)程命名空間

          進(jìn)程命名空間共享一直是一個(gè)很好的故障排查選項(xiàng),此功能可用于臨時(shí)容器。進(jìn)程命名空間共享不能應(yīng)用于現(xiàn)有容器,因此必須創(chuàng)建目標(biāo)容器的副本。--share-processesflag 在與 --copy-to 一起使用時(shí),可實(shí)現(xiàn)進(jìn)程命名空間共享。這些標(biāo)志將現(xiàn)有的 Pod spec定義復(fù)制到新定義中,并在spec中啟用了進(jìn)程命名空間共享。

          $?kubectl?debug?-it??--image=busybox?--share-processes?--copy-to=debug-pod

          運(yùn)行 ps 命令以查看正在運(yùn)行的進(jìn)程。正如您所期望的那樣,您可以從 busybox 容器中看到 /pause,從 nginx-deployment 容器中看到 nginx 進(jìn)程。

          #?ps?aux

          PID???USER?????TIME??COMMAND
          ????1?root??????0:00?/pause
          ????6?root??????0:00?nginx:?master?process?nginx?-g?daemon?off;
          ???11?101???????0:00?nginx:?worker?process
          ???12?root??????0:00?sh
          ???17?root??????0:00?ps?aux

          使用進(jìn)程命名空間,共享容器文件系統(tǒng)也是可訪問(wèn)的,這對(duì)于調(diào)試非常有用。您可以使用 /proc//root 鏈接訪問(wèn)容器。從上面的輸出中,我們知道nginx的PID為6。

          #?ls?/proc/6/root/etc/nginx

          conf.d?koi-utf?mime.types?nginx.conf?uwsgi_params?fastcgi_params?koi-win?modules?scgi_params?win-utf

          在這里,我們可以看到目標(biāo)容器上的Nginx目錄結(jié)構(gòu)和配置文件。

          結(jié)論

          臨時(shí)容器功能無(wú)疑給調(diào)試排查問(wèn)題帶來(lái)了很大便利,而進(jìn)程命名空間共享允許高級(jí)調(diào)試功能。如果你也使用在 Kubernetes 集群中運(yùn)行的應(yīng)用程序,那么值得花時(shí)間嘗試這些功能。不難想象,一些團(tuán)隊(duì)甚至使用這些工具自動(dòng)執(zhí)行工作流,例如在readiness probes探針失敗時(shí)自動(dòng)修復(fù)其他容器。

          原文:https://tinyurl.com/3658tdzs

          文章轉(zhuǎn)載:進(jìn)擊云原生

          (版權(quán)歸原作者所有,侵刪)


          點(diǎn)擊下方“閱讀原文”查看更多

          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色视屏欧美日韩 | 嫩苞又嫩又紧AV无码 | 思思热这里在线 | AV电影一区 | 囯产精品久久久 |