檢視 Pods 和節點

學習如何使用 kubectl get、kubectl describe、kubectl logs 和 kubectl exec 疑難排解 Kubernetes 應用程式。

目標

  • 了解 Kubernetes Pod。
  • 了解 Kubernetes 節點。
  • 疑難排解已部署的應用程式。

Kubernetes Pod

當您在模組 2 中建立 Deployment 時,Kubernetes 建立了一個 Pod 來託管您的應用程式執行個體。Pod 是 Kubernetes 的抽象概念,代表一組或多個應用程式容器 (例如 Docker),以及這些容器的一些共用資源。這些資源包括

  • 共用儲存空間,作為磁碟區
  • 網路,作為唯一的叢集 IP 位址
  • 關於如何執行每個容器的資訊,例如容器映像檔版本或要使用的特定埠口

Pod 模擬應用程式特定的「邏輯主機」,並且可以包含不同的應用程式容器,這些容器相對緊密耦合。例如,Pod 可能同時包含 Node.js 應用程式的容器,以及將資料饋送到 Node.js 網頁伺服器發布的不同容器。Pod 中的容器共用 IP 位址和埠口空間,始終共置和共同排程,並在同一節點上的共用內容中執行。

Pod 是 Kubernetes 平台上的原子單位。當我們在 Kubernetes 上建立 Deployment 時,該 Deployment 會建立包含容器的 Pod (而不是直接建立容器)。每個 Pod 都繫結到排程它的節點,並保留在那裡直到終止 (根據重新啟動策略) 或刪除。如果節點發生故障,則會在叢集中其他可用的節點上排程相同的 Pod。

摘要

  • Pods
  • 節點
  • Kubectl 主要命令

Pod 是一組或多個應用程式容器 (例如 Docker) 的群組,包括共用儲存空間 (磁碟區)、IP 位址和關於如何執行它們的資訊。


Pod 概觀


節點

Pod 始終在 節點 上執行。節點是 Kubernetes 中的工作機器,可能是虛擬機器或實體機器,具體取決於叢集。每個節點都由控制平面管理。一個節點可以有多個 Pod,Kubernetes 控制平面會自動處理跨叢集中節點的 Pod 排程。控制平面的自動排程會考量每個節點上的可用資源。

每個 Kubernetes 節點至少執行

  • Kubelet,一個負責 Kubernetes 控制平面和節點之間通訊的程序;它管理機器上執行的 Pod 和容器。
  • 容器執行階段 (例如 Docker),負責從登錄檔提取容器映像檔、解壓縮容器並執行應用程式。

只有當容器緊密耦合且需要共用磁碟等資源時,才應將容器排程在單個 Pod 中。


節點概觀


使用 kubectl 進行疑難排解

在模組 2 中,您使用了 kubectl 命令列介面。您將在模組 3 中繼續使用它來取得關於已部署應用程式及其環境的資訊。最常見的操作可以使用以下 kubectl 子命令完成

  • kubectl get- 列出資源
  • kubectl describe- 顯示關於資源的詳細資訊
  • kubectl logs- 從 Pod 中的容器印出記錄
  • kubectl exec- 在 Pod 中的容器上執行命令

您可以使用這些命令來查看應用程式何時部署、它們目前的狀態是什麼、它們在哪裡執行以及它們的組態是什麼。

現在我們更了解我們的叢集元件和命令列,讓我們探索我們的應用程式。

節點是 Kubernetes 中的工作機器,可能是 VM 或實體機器,具體取決於叢集。多個 Pod 可以在一個節點上執行。

檢查應用程式組態

讓我們驗證我們在上一個情境中部署的應用程式是否正在執行。我們將使用 kubectl get 命令並尋找現有的 Pod

kubectl get pods

如果沒有 Pod 正在執行,請稍等幾秒鐘並再次列出 Pod。當您看到一個 Pod 正在執行時,您可以繼續。

接下來,為了檢視該 Pod 內部有哪些容器,以及使用哪些映像檔來建置這些容器,我們執行 kubectl describe pods 命令

kubectl describe pods

我們在這裡看到關於 Pod 容器的詳細資訊:IP 位址、使用的埠口以及與 Pod 生命週期相關的事件列表。

的輸出describe子命令非常廣泛,涵蓋了一些我們尚未解釋的概念,但別擔心,在本訓練營結束時,您將會熟悉它們。

注意:describe子命令可用於取得關於大多數 Kubernetes 基本元件的詳細資訊,包括節點、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 Pod 名稱:$POD_NAME

若要查看我們應用程式的輸出,請執行 curl 請求

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/

URL 是 Pod API 的路由。

檢視容器記錄

應用程式通常會傳送到標準輸出的任何內容都會變成 Pod 內容器的記錄。我們可以使用 kubectl logs 命令擷取這些記錄

kubectl logs "$POD_NAME"

注意:我們不需要指定容器名稱,因為我們的 Pod 內只有一個容器。

在容器上執行命令

一旦 Pod 啟動並運行後,我們可以直接在容器上執行命令。為此,我們使用 exec 子命令,並將 Pod 的名稱作為參數。讓我們列出環境變數

kubectl exec "$POD_NAME" -- env

再次強調,由於 Pod 中只有一個容器,因此容器本身的名稱可以省略。

接下來,讓我們在 Pod 容器中啟動一個 bash 會話

kubectl exec -ti $POD_NAME -- bash

現在我們在容器上開啟了一個控制台,我們在其中運行 NodeJS 應用程式。應用程式的原始碼在server.js檔案

cat server.js

您可以透過執行curl命令

curl http://localhost:8080

注意: 這裡我們使用了localhost因為我們在 NodeJS Pod 內部執行了命令。如果您無法連線到 localhost:8080,請檢查以確保您已執行 kubectl exec 命令,並且是從 Pod 內部啟動命令

若要關閉您的容器連線,請輸入 exit

準備就緒後,請繼續前往 使用服務公開您的應用程式

上次修改時間:2023 年 11 月 30 日下午 12:00 PST:Updated kubernetes tutorials from deploy-intro.html to update-intro.html (6ad170bf17)