跳到主內容

Pod 基本概念

Pod 概述

Pod 是 Kubernetes 系統中可以創建和管理的最小單位,是資源對象模型中由使用者創建或部署的最小資源對象模型,也是 Kubernetes 平台上運行容器化應用的資源對象。其他的資源對象都是用來支援或強化 Pod 的功能,例如:

  • 控制器 資源對象用來監控 Pod 的狀態
  • ServiceIngress 資源對象用來暴露 Pod 引用外部訪問
  • PersistentVolume 資源對象用來為 Pod 提供存儲等功能

Kubernetes 並不直接調度容器,而是調度 Pod。Pod 是由一個或多個容器組成的。

Pod 是 Kubernetes 的最重要概念。每一個 Pod 都有一個特殊的被稱為 Pause 容器 的容器。Pause 容器的鏡像對應於 Kubernetes 平台的一部分,負責維護 Pod 的網路命名空間及其他元數據。
除了 Pause 容器,每個 Pod 還包含一個或多個具備業務邏輯的使用者業務容器。

1. Pod 基本概念

  1. 最小部署單位
  2. 包含多個容器(容器集合)
  3. 一個 Pod 中的容器共享網路命名空間
  4. Pod 是短暫的(不永久存在)

2. Pod 存在意義

  1. 創建容器使用 Docker

    • 一個 Docker 對應一個容器
    • 一個容器有進程
    • 一個容器運行一個應用程序
  2. Pod 是多進程設計,運行多個應用程序

    • 一個 Pod 有多個容器
    • 一個容器裡面運行一個應用程序
  3. Pod 存在為了親密性應用

    • 兩個應用之間進行交互
    • 網路之間調用
    • 兩個應用需要頻繁調用

3. Pod 實現機制

  1. 共享網路
  2. 共享存儲

詳細說明:

  • 共享網路
    通過 Pause 容器,將其他業務容器加入到 Pause 容器裡面,讓所有業務容器在同一個命名空間中,可以實現網路共享。

  • 共享存儲
    引入數據卷的概念(Volume),使用數據卷進行持久化存儲。

image-1736749367514.png

以下是圖片中的文字辨識及繁體中文翻譯:


4.鏡像拉取策略

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: nginx
      image: nginx:1.14
      imagePullPolicy: Always

鏡像拉取策略說明:

  • IfNotPresent:預設值,當宿主機上沒有該鏡像時才會拉取。
  • Always:每次創建 Pod 時都會重新拉取一次鏡像。
  • Never:Pod 永遠不會主動拉取該鏡像。

以下是圖片中的文字辨識及翻譯成繁體中文:


5.Pod 資源限制示例

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
    - name: db
      image: mysql
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
      resources:
        requests:
          memory: "64Mi"
          cpu: "250m"
        limits:
          memory: "128Mi"
          cpu: "500m"

Pod 和 Container 的資源請求與限制說明:

  • spec.containers[].resources.limits.cpu:容器的 CPU 使用上限。
  • spec.containers[].resources.limits.memory:容器的記憶體使用上限。
  • spec.containers[].resources.requests.cpu:容器的 CPU 請求值。
  • spec.containers[].resources.requests.memory:容器的記憶體請求值。

以下是圖片中的文字辨識及繁體中文翻譯:


6.Pod 重啟策略

apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
    - name: busybox
      image: busybox:1.28.4
      args:
        - /bin/sh
        - -c
        - sleep 36000
  restartPolicy: Never

重啟策略說明:

  • Always:當容器終止退出後,總是重啟容器。這是預設的策略。
  • OnFailure:當容器異常退出(退出狀態碼非 0)時,才重啟容器
  • Never:當容器終止退出後,不會重啟容器

以下是圖片中的文字辨識及繁體中文翻譯:


7.Pod 健康檢查

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
    name: liveness-exec
spec:
  containers:
    - name: liveness
      image: busybox
      args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy
      livenessProbe:
        exec:
          command:
            - cat
            - /tmp/healthy
        initialDelaySeconds: 5
        periodSeconds: 5

健康檢查說明:

  • livenessProbe(存活檢查)

    • 如果檢查失敗,將殺死容器,根據 Pod 的 restartPolicy 來操作。

readinessProbe(就緒檢查)

  • 如果檢查失敗,Kubernetes 會將 Pod 從 Service 的 endpoints 中刪除

以下是 initialDelaySeconds 和 periodSeconds 的詳細說明:


簡單範例說明:

initialDelaySeconds: 5
periodSeconds: 5

這表示:

  1. Pod 啟動後等待 5 秒才開始執行健康檢查。
之後每隔 5 秒執行一次健康檢查。

🔎 其他常見健康檢查參數:

參數名稱
說明 initialDelaySeconds 首次檢查前的延遲時間 periodSeconds 每次檢查的間隔時間 timeoutSeconds 每次健康檢查的超時時間 successThreshold 判定為成功所需的連續檢查次數 failureThreshold 判定為失敗所需的連續檢查次數

小結:

  • initialDelaySeconds:控制首次健康檢查的延遲時間。
periodSeconds:控制每次健康檢查的間隔時間。

這些參數幫助 Kubernetes 有效管理容器的健康狀態,從而避免過早或過頻的檢查導致誤判。

如果需要進一步解釋,請告訴我!😊


Probe 支援的三種檢查方法:

  1. httpGet

    • 發送 HTTP 請求,返回 200-400 範圍的狀態碼為成功。

exec

  • 執行 Shell 命令,返回狀態碼為 0 為成功。

tcpSocket

  • 發起 TCP Socket 建立成功。