前言

如果你已經熟悉 Docker,能夠將應用程式打包成容器並順利運行,那麼恭喜你已經跨出了容器化的第一步!但當你的應用從單一容器發展到數十甚至數百個容器時,新的挑戰隨之而來:如何確保容器崩潰後自動重啟?如何在多台機器之間分配容器?如何實現服務的滾動更新而不影響使用者?這時候,你就需要 Kubernetes(簡稱 K8s) 這個目前最主流的容器編排工具。

  • 如何確保容器崩潰後自動重啟?
  • 如何在多台機器之間分配容器?
  • 如何實現服務的滾動更新而不影響使用者?
  • 如何讓容器之間互相通訊?

這時候,你就需要一個容器編排工具,而 Kubernetes(簡稱 K8s) 正是目前最主流的解決方案。

本篇文章將帶你從零開始認識 Kubernetes,理解它的核心架構與設計理念,為後續的深入學習打下堅實基礎。


什麼是 Kubernetes?

命名由來

Kubernetes 源自希臘語「κυβερνήτης」,意為「舵手」或「領航員」。這個名字暗示了它的核心功能:掌舵你的容器艦隊

為什麼叫 K8s?因為「Kubernetes」中間有 8 個字母(ubernete),所以簡稱 K8s。

一句話定義

Kubernetes 是一個用於自動部署、擴展和管理容器化應用程式的開源平台。

K8s 能做什麼?

功能 說明
自動部署 宣告式配置,描述期望狀態,K8s 自動達成
自動擴展 根據 CPU、記憶體或自定義指標自動增減容器數量
自我修復 容器崩潰自動重啟,節點故障自動遷移
服務發現 內建 DNS,容器透過服務名稱互相通訊
負載均衡 自動將流量分配到多個容器
滾動更新 無停機時間更新應用,支援版本回滾
密鑰管理 安全管理敏感資訊,無需硬編碼

Docker vs Kubernetes:釐清關係

很多初學者會問:「我已經有 Docker 了,為什麼還需要 Kubernetes?」

它們的關係

graph TD
    subgraph "開發環境"
        A[Docker] --> B[建立容器映像檔]
        B --> C[單機運行容器]
    end

    subgraph "生產環境"
        D[Kubernetes] --> E[編排多個容器]
        E --> F[跨多台機器部署]
        F --> G[自動化維運]
    end

    C -.->|規模變大| D

簡單比喻

角色 Docker Kubernetes
比喻 貨櫃(Container) 港口管理系統
功能 打包和運行單一容器 管理成千上萬個容器
層級 容器運行時(Container Runtime) 容器編排(Container Orchestration)

Docker 負責「造船」,Kubernetes 負責「管理船隊」。

K8s 不一定需要 Docker

從 Kubernetes 1.24 版開始,K8s 不再直接支援 Docker 作為容器運行時,而是使用 containerdCRI-O。但這不影響你使用 Docker 建立映像檔——Docker 建立的映像檔完全符合 OCI 標準,可以在任何容器運行時執行。


Kubernetes 核心架構

K8s 集群由兩種類型的節點組成:Control Plane(控制平面)Worker Node(工作節點)

graph TB
    subgraph "Control Plane 控制平面"
        API[API Server<br/>叢集入口]
        ETCD[etcd<br/>分散式儲存]
        SCHED[Scheduler<br/>調度器]
        CM[Controller Manager<br/>控制器管理]
    end

    subgraph "Worker Node 1"
        K1[Kubelet]
        KP1[Kube-Proxy]
        CR1[Container Runtime]
        P1[Pod A]
        P2[Pod B]
    end

    subgraph "Worker Node 2"
        K2[Kubelet]
        KP2[Kube-Proxy]
        CR2[Container Runtime]
        P3[Pod C]
        P4[Pod D]
    end

    API --> ETCD
    API --> SCHED
    API --> CM

    API <--> K1
    API <--> K2

    K1 --> CR1
    K2 --> CR2

    CR1 --> P1
    CR1 --> P2
    CR2 --> P3
    CR2 --> P4

Control Plane 元件

Control Plane 是叢集的「大腦」,負責全局決策和狀態管理。

1. API Server(kube-apiserver)

  • 角色:K8s 叢集的唯一入口
  • 功能:接收所有 REST 請求,驗證並處理
  • 特點:所有元件都只和 API Server 通訊
1
2
3
# 所有 kubectl 指令都是在和 API Server 溝通
kubectl get pods
kubectl apply -f deployment.yaml

2. etcd

  • 角色:分散式鍵值儲存資料庫
  • 功能:儲存叢集的所有狀態資料
  • 特點:高可用、強一致性
  • 重要性:etcd 掛掉 = 整個叢集癱瘓

生產環境建議:etcd 應部署為奇數個節點(3 或 5 個)以確保高可用。

3. Scheduler(kube-scheduler)

  • 角色:Pod 的「調度員」
  • 功能:決定 Pod 要運行在哪個 Node 上
  • 考量因素
    • 資源需求(CPU、記憶體)
    • 節點負載
    • 親和性/反親和性規則
    • 污點與容忍度

4. Controller Manager(kube-controller-manager)

  • 角色:控制器的「管理員」
  • 功能:運行各種控制器,確保叢集狀態符合期望
控制器 職責
Deployment Controller 管理 Deployment 和 ReplicaSet
ReplicaSet Controller 確保 Pod 副本數量正確
Node Controller 監控節點狀態
Service Account Controller 管理服務帳號

Worker Node 元件

Worker Node 是實際運行應用程式的節點。

1. Kubelet

  • 角色:節點的「代理人」
  • 功能
    • 從 API Server 接收 Pod 規格
    • 確保容器按規格運行
    • 回報節點和 Pod 狀態

2. Kube-Proxy

  • 角色:網路代理
  • 功能
    • 維護節點上的網路規則
    • 實現 Service 的負載均衡

3. Container Runtime

  • 角色:容器運行時
  • 常見選擇:containerd、CRI-O
  • 功能:實際運行容器

核心概念速覽

在深入學習之前,先認識幾個最重要的概念:

graph LR
    subgraph "Workloads 工作負載"
        POD[Pod<br/>最小單位]
        RS[ReplicaSet<br/>副本控制]
        DEP[Deployment<br/>部署管理]
    end

    subgraph "Service & Networking"
        SVC[Service<br/>服務暴露]
        ING[Ingress<br/>外部入口]
    end

    subgraph "Config & Storage"
        CM[ConfigMap<br/>配置管理]
        SEC[Secret<br/>密鑰管理]
        PV[PersistentVolume<br/>持久儲存]
    end

    DEP --> RS --> POD
    SVC --> POD
    ING --> SVC

Pod

  • K8s 中最小的部署單位
  • 一個 Pod 可包含一或多個容器
  • 同一 Pod 內的容器共享網路和儲存

Deployment

  • 管理 Pod 的部署和更新
  • 支援滾動更新和回滾
  • 聲明式配置:描述期望狀態

Service

  • 為一組 Pod 提供穩定的存取端點
  • 實現服務發現和負載均衡
  • 解決 Pod IP 動態變化的問題

本地開發環境搭建

想要動手實踐,首先需要一個 K8s 環境。以下是幾種常見選擇:

方案比較

工具 適用場景 優點 缺點
Docker Desktop macOS/Windows 最簡單,一鍵啟用 資源佔用較高
Minikube 所有平台 功能完整,插件豐富 需要額外安裝
Kind CI/CD 環境 輕量、快速 功能較少
k3d 本地開發 極輕量 社群較小

Docker Desktop(推薦新手)

如果你已經安裝了 Docker Desktop,啟用 Kubernetes 只需幾步:

  1. 開啟 Docker Desktop
  2. 進入 Settings → Kubernetes
  3. 勾選「Enable Kubernetes」
  4. 點擊「Apply & Restart」

等待幾分鐘,K8s 圖示變綠即表示成功。

Minikube 安裝

1
2
3
4
5
6
7
8
# macOS
brew install minikube

# 啟動叢集
minikube start

# 確認狀態
minikube status

驗證安裝

無論使用哪種方式,都可以用以下指令驗證:

1
2
3
4
5
6
7
8
9
# 查看叢集資訊
kubectl cluster-info

# 查看節點狀態
kubectl get nodes

# 預期輸出
# NAME STATUS ROLES AGE VERSION
# docker-desktop Ready control-plane 1d v1.28.2

kubectl 基礎指令

kubectl 是與 K8s 互動的命令列工具,掌握它是使用 K8s 的第一步。

指令結構

1
kubectl [動作] [資源類型] [資源名稱] [選項]

常用指令速查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看資源
kubectl get pods # 列出所有 Pod
kubectl get pods -o wide # 顯示更多資訊
kubectl get all # 列出所有資源類型

# 詳細資訊
kubectl describe pod <pod-name> # 查看 Pod 詳情
kubectl logs <pod-name> # 查看 Pod 日誌
kubectl logs -f <pod-name> # 即時追蹤日誌

# 進入容器
kubectl exec -it <pod-name> -- /bin/sh

# 應用配置
kubectl apply -f deployment.yaml # 套用配置檔
kubectl delete -f deployment.yaml # 刪除配置

# 偵錯
kubectl get events # 查看叢集事件
kubectl top pods # 查看資源使用量

實用技巧

1
2
3
4
5
6
7
8
# 設定別名(加入 ~/.zshrc 或 ~/.bashrc)
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'

# 自動補全
source <(kubectl completion zsh) # Zsh
source <(kubectl completion bash) # Bash

第一個 K8s 應用

讓我們部署一個簡單的 Nginx 來驗證環境:

快速部署

1
2
3
4
5
6
7
8
# 建立 Deployment
kubectl create deployment nginx --image=nginx:alpine

# 暴露服務
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服務
kubectl get svc nginx

使用 YAML 配置(推薦)

建立 nginx-demo.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# Deployment:管理 Pod 的部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
labels:
app: nginx-demo
spec:
replicas: 3 # 運行 3 個副本
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
resources:
requests: # 最小資源需求
cpu: "100m"
memory: "64Mi"
limits: # 最大資源限制
cpu: "200m"
memory: "128Mi"
---
# Service:暴露 Pod 的存取端點
apiVersion: v1
kind: Service
metadata:
name: nginx-demo-service
spec:
selector:
app: nginx-demo
ports:
- port: 80
targetPort: 80
type: NodePort
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 套用配置
kubectl apply -f nginx-demo.yaml

# 查看 Pod 狀態
kubectl get pods -l app=nginx-demo

# 查看 Service
kubectl get svc nginx-demo-service

# 存取服務(Minikube)
minikube service nginx-demo-service

# 或使用 port-forward
kubectl port-forward svc/nginx-demo-service 8080:80
# 然後開啟瀏覽器訪問 http://localhost:8080

清理資源

1
2
3
4
kubectl delete -f nginx-demo.yaml
# 或
kubectl delete deployment nginx-demo
kubectl delete svc nginx-demo-service

本章重點回顧

核心要點

  1. Kubernetes 定位

    • 容器編排平台,不是取代 Docker
    • 解決大規模容器管理的問題
  2. 架構組成

    • Control Plane:API Server、etcd、Scheduler、Controller Manager
    • Worker Node:Kubelet、Kube-Proxy、Container Runtime
  3. 核心概念

    • Pod:最小部署單位
    • Deployment:管理 Pod 部署
    • Service:提供穩定存取端點
  4. 開發環境

    • Docker Desktop 最簡單
    • kubectl 是主要操作工具

K8s 學習路線圖

graph LR
    A[入門概念] --> B[Pod/Deployment/Service]
    B --> C[網路與 Ingress]
    C --> D[ConfigMap/Secret/Volume]
    D --> E[資源管理與擴展]
    E --> F[生產環境部署]

    style A fill:#4ecdc4
    style B fill:#95e1d3
    style C fill:#f38181
    style D fill:#fce38a
    style E fill:#eaffd0
    style F fill:#aa96da

下一篇預告

在下一篇文章中,我們將深入探討 Pod、Deployment 與 Service 這三個最核心的資源類型:

  • Pod 的生命週期與設計原則
  • Deployment 的更新策略與回滾機制
  • Service 的四種類型與使用場景
  • Label 與 Selector 的運作原理

系列文章導覽

  • Part 1:入門篇 - 認識 K8s 與核心架構(本篇)
  • Part 2:基礎篇 - Pod、Deployment 與 Service
  • Part 3:網路篇 - 服務發現與流量管理
  • Part 4:配置與存儲篇 - ConfigMap、Secret 與 Volume
  • Part 5:進階篇 - 資源管理與自動擴展
  • Part 6:實戰篇 - 部署完整微服務應用

參考資源