檢視 Pod 和節點
目標
- 瞭解 Kubernetes Pod。
- 瞭解 Kubernetes Node。
- 排查已部署應用程式的問題。
Kubernetes Pod
當你在模組 2 中建立 Deployment 時,Kubernetes 建立了一個 Pod 來託管你的應用程式例項。Pod 是 Kubernetes 的一個抽象概念,它表示一組一個或多個應用程式容器(如 Docker),以及這些容器的一些共享資源。這些資源包括:
- 共享儲存,作為卷
- 網路,作為唯一的叢集 IP 地址
- 關於如何執行每個容器的資訊,例如容器映象版本或要使用的特定埠
Pod 建模了一個特定於應用程式的“邏輯主機”,可以包含相對緊密耦合的不同應用程式容器。例如,一個 Pod 可能包含你的 Node.js 應用程式容器以及一個不同的容器,該容器提供要由 Node.js Web 伺服器釋出的資料。Pod 中的容器共享一個 IP 地址和埠空間,總是共同位於同一節點上並共同排程,並在同一節點上的共享上下文中執行。
Pod 是 Kubernetes 平臺上的原子單元。當我們在 Kubernetes 上建立 Deployment 時,該 Deployment 會建立包含容器的 Pod(而不是直接建立容器)。每個 Pod 都繫結到其被排程的節點,並一直保留在那裡,直到終止(根據重啟策略)或刪除。如果節點發生故障,相同的 Pod 將被排程到叢集中其他可用的節點上。
Pod 概覽
節點
Pod 總是執行在 Node 上。Node 是 Kubernetes 中的工作機器,可以是虛擬或物理機器,具體取決於叢集。每個 Node 都由控制平面管理。一個 Node 可以有多個 Pod,Kubernetes 控制平面會自動處理 Pod 在叢集中各個 Node 上的排程。控制平面的自動排程會考慮每個 Node 上的可用資源。
每個 Kubernetes Node 至少執行
Kubelet,一個負責 Kubernetes 控制平面與 Node 之間通訊的程序;它管理機器上執行的 Pod 和容器。
一個容器執行時(如 Docker),負責從登錄檔拉取容器映象、解壓容器並執行應用程式。
Node 概覽
使用 kubectl 進行故障排除
在模組 2 中,你使用了 kubectl 命令列介面。你將在模組 3 中繼續使用它來獲取有關已部署應用程式及其環境的資訊。最常見的操作可以透過以下 kubectl 子命令完成
kubectl get
- 列出資源kubectl describe
- 顯示資源的詳細資訊kubectl logs
- 列印 Pod 中容器的日誌kubectl exec
- 在 Pod 中的容器上執行命令
你可以使用這些命令檢視應用程式何時部署、當前狀態、執行位置以及配置。
現在我們對叢集元件和命令列有了更多瞭解,讓我們來探索我們的應用程式。
檢查應用程式配置
讓我們驗證一下我們在上一個場景中部署的應用程式是否正在執行。我們將使用 kubectl get
命令並查詢現有的 Pod
kubectl get pods
如果沒有 Pod 正在執行,請等待幾秒鐘,然後再次列出 Pod。看到一個 Pod 正在執行後即可繼續。
接下來,要檢視該 Pod 中有哪些容器以及用於構建這些容器的映象是哪些,我們執行 kubectl describe pods
命令
kubectl describe pods
我們在此處看到 Pod 容器的詳細資訊:IP 地址、使用的埠以及與 Pod 生命週期相關的事件列表。
describe
子命令的輸出內容豐富,涵蓋了一些我們尚未解釋的概念,但不用擔心,在本教程結束時,它們將變得熟悉。
注意
describe
子命令可用於獲取大多數 Kubernetes 原語的詳細資訊,包括 Node、Pod 和 Deployment。describe
輸出旨在供人類閱讀,而不是用於指令碼。在終端中顯示應用程式
回想一下,Pod 執行在隔離的私有網路中,因此我們需要代理訪問它們,以便我們可以除錯和與它們互動。為此,我們將使用 kubectl proxy
命令在**第二個終端**中執行一個代理。開啟一個新的終端視窗,並在該新終端中執行
kubectl proxy
現在,我們將再次獲取 Pod 名稱並直接透過代理查詢該 Pod。要獲取 Pod 名稱並將其儲存在 POD_NAME
環境變數中
export POD_NAME="$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')"
echo Name of the Pod: $POD_NAME
要檢視應用程式的輸出,請執行 curl
請求
curl https://:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/
URL 是 Pod API 的路由。
注意
我們不需要指定容器名稱,因為 Pod 中只有一個容器。在容器上執行命令
一旦 Pod 啟動並執行,我們就可以直接在容器上執行命令。為此,我們使用 exec
子命令並將 Pod 名稱作為引數。讓我們列出環境變數
kubectl exec "$POD_NAME" -- env
同樣值得一提的是,由於 Pod 中只有一個容器,因此可以省略容器本身的名稱。
接下來,讓我們在 Pod 的容器中啟動一個 bash 會話
kubectl exec -ti $POD_NAME -- bash
我們現在在執行 Node.js 應用程式的容器上有一個開啟的控制檯。應用程式的原始碼在 server.js
檔案中
cat server.js
您可以透過執行 curl 命令來檢查應用程式是否已啟動
curl https://:8080
注意
這裡我們使用了localhost
,因為我們是在 Node.js Pod 內部執行的命令。如果無法連線到 localhost:8080
,請檢查確保您已執行 kubectl exec
命令並且正在從 Pod 內部啟動該命令。要關閉容器連線,請鍵入 exit
。
下一步
- 教程使用服務暴露您的應用程式。
- 瞭解更多關於Pod的資訊。
- 瞭解更多關於Node的資訊。