Kubernetes Pod 與 Docker 的關係

Kubernetes (k8s) Pod 中的應用程式可以透過 Docker 建立的容器映像檔來運行,但這不是唯一的方式。以下是詳細說明:( k8s 安裝可以查看先前的文章 link )

須知得基礎如下:

基本關係

  1. 傳統方式 (早期 k8s 版本)
    • Kubernetes 最初使用 Docker 作為默認的容器運行時(container runtime)
    • 開發者用 Docker 工具構建映像檔
    • k8s 通過 Docker 運行這些容器映像檔
  2. 現代方式 (當前 k8s 版本)
    • Kubernetes 已移除了對 Docker 的直接依賴
    • 改用符合 CRI (Container Runtime Interface) 標準的運行時
    • 仍可使用 Docker 構建映像檔,但運行時不一定使用 Docker

當前實際運作方式

  1. 映像檔構建
    • 您仍然可以使用 Docker 工具 (docker build) 構建容器映像檔
    • 也可以使用其他工具如 Buildah、Podman 或 Kaniko
  2. 映像檔運行
    • Kubernetes 使用符合 CRI 的運行時來運行容器,例如:
      • containerd (最常見,Docker 也使用它作為底層)
      • CRI-O
    • 這些運行時可以載入標準 OCI 格式的容器映像檔
  3. 實際流程範例

為什麼 Kubernetes 不再直接依賴 Docker

  1. 架構簡化:移除不必要的組件
  2. 標準化:使用 CRI 接口支持多種運行時
  3. 性能:containerd 比完整 Docker 更輕量

如何檢查您的集群使用什麼運行時

kubectl get nodes -o wide
# 查看 CONTAINER-RUNTIME 列

# 或直接在節點上檢查
ps aux | grep containerd
ps aux | grep docker

Kubernetes 部署 Pod 的完整流程

一般情況下部署應用到 Kubernetes 的基本流程確實包含「先建立容器映像檔,再部署到 k8s」的步驟,但具體實現方式有許多變化。以下是詳細說明:

1. 建立容器映像檔(Docker 是選項之一)

docker build -t your-username/your-app:tag .

2. 推送至映像檔倉庫

docker push your-username/your-app:tag

3. 部署到 Kubernetes

kubectl create deployment your-app --image=your-username/your-app:tag

或使用 YAML 定義文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-app
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: main
        image: your-username/your-app:tag