小編給大家分享一下Kubernetes中如何使用臨時容器進行故障排查,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
容器及其周圍的生態系統改變了工程師部署、維護和排查工作負載故障的方式。但是,在 Kubernetes 集群上調試應用程序有時可能會很困難,因為你可能在容器中找不到所需的調試工具。許多工程師使用基于精簡、發行版構建無發行版的基礎鏡像,其中甚至沒有包管理器或shell。甚至一些團隊使用 scratch 作為基礎鏡像,并且只添加應用程序運行所需的文件。這種常見做法的一些原因是:
具有較小的攻擊區域。
為了獲得更快的掃描性能。
減小了鏡像大小。
為了有更快的構建和更短CD/CI周期。
減少依賴關系。
這些精簡的基礎鏡像不包括用于對應用程序或其依賴項進行故障排查的工具。這是 Kubernetes 臨時容器功能最大用途。臨時容器允許創建包含可能需要的所有調試工具的容器鏡像。一旦需要調試,就可以將臨時容器部署到所選的正在運行的 Pod 中。
我們不能將容器添加到已部署的容器;您需要更新spec,并重新創建資源。但是,可以將臨時容器添加到現有 Pod 中,以便對線上問題進行故障排查。
本文介紹如何使用臨時容器進行Kubernetes上工作負載的問題排查。
臨時容器與其他容器的不同之處在于,它們缺少對資源或執行的保證,并且永遠不會自動重啟, 因此不適用于構建應用程序。 臨時容器使用與常規容器相同的 ContainerSpec 節來描述,但許多字段是不兼容和不允許的。
臨時容器沒有端口配置,因此像 ports,livenessProbe,readinessProbe 這樣的字段是不允許的。
Pod 資源分配是不可變的,因此 resources 配置是不允許的。
有關允許字段的完整列表,請參見 EphemeralContainer 參考文檔。
臨時容器是使用 API 中的一種特殊的 ephemeralcontainers 處理器進行創建的, 而不是直接添加到 pod.spec 段,因此無法使用 kubectl edit 來添加一個臨時容器。
與常規容器一樣,將臨時容器添加到 Pod 后,將不能更改或刪除臨時容器。
臨時容器與常規容器共享相同的spec。但是,某些字段被禁用,并且某些行為被更改。下面列出了一些重大變化;檢查臨時容器規范以獲取完整列表。
它們不會重新啟動。
不允許定義資源。
不允許使用端口。
不允許使用啟動、活動和就緒探測。
首先,檢查是否啟用了臨時容器功能。
kubectl debug -it <POD_NAME> --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 參數中的--feature-gates=后, 例如:
... --feature-gates=RemoveSelfLink=false,EphemeralContainers=true ...
現在,集群支持臨時容器功能,讓我們來試試吧。要創建臨時容器,使用 kubectl 命令行工具的 debug 子命令。首先,創建一個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 中創建一個新的臨時容器。臨時容器的鏡像是busybox。-i 和 -t 參數允許我們附加到新創建的容器。
$ kubectl debug -it pods/nginx-deployment-66b6c48dd5-frsv9 --image=busybox
現在我們可以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 ...
當使用 kubectl describe pod <POD_NAME> 命令時,可以看到一個新字段 "Ephemeral Containers",此部分包含臨時容器及其屬性。
$ kubectl describe pods <POD_NAME> ... ... Ephemeral Containers: debugger-thwrn: Container ID: containerd://eec23aa9ee63d96b82970bb947b29cbacc30685bbc3418ba840dee109f871bf0 Image: busybox Image ID: docker.io/library/busybox@sha256:e7157b6d7ebbe2cce5eaa8cfe8aa4fa82d173999b9f90a9ec42e57323546c353 Port: <none> Host Port: <none>
進程命名空間共享一直是一個很好的故障排查選項,此功能可用于臨時容器。進程命名空間共享不能應用于現有容器,因此必須創建目標容器的副本。--share-processesflag 在與 --copy-to 一起使用時,可實現進程命名空間共享。這些標志將現有的 Pod spec定義復制到新定義中,并在spec中啟用了進程命名空間共享。
$ kubectl debug -it <POD_NAME> --image=busybox --share-processes --copy-to=debug-pod
運行 ps 命令以查看正在運行的進程。正如您所期望的那樣,您可以從 busybox 容器中看到 /pause,從 nginx-deployment 容器中看到 nginx 進程。
# 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
使用進程命名空間,共享容器文件系統也是可訪問的,這對于調試非常有用。您可以使用 /proc//root 鏈接訪問容器。從上面的輸出中,我們知道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
在這里,我們可以看到目標容器上的Nginx目錄結構和配置文件。
以上是“Kubernetes中如何使用臨時容器進行故障排查”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。