Kubernetes 系列(一):入門篇 - 認識 K8s 與核心架構
前言
如果你已經熟悉 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 作為容器運行時,而是使用 containerd 或 CRI-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 | # 所有 kubectl 指令都是在和 API Server 溝通 |
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 只需幾步:
- 開啟 Docker Desktop
- 進入 Settings → Kubernetes
- 勾選「Enable Kubernetes」
- 點擊「Apply & Restart」
等待幾分鐘,K8s 圖示變綠即表示成功。
Minikube 安裝
1 | # macOS |
驗證安裝
無論使用哪種方式,都可以用以下指令驗證:
1 | # 查看叢集資訊 |
kubectl 基礎指令
kubectl 是與 K8s 互動的命令列工具,掌握它是使用 K8s 的第一步。
指令結構
1 | kubectl [動作] [資源類型] [資源名稱] [選項] |
常用指令速查
1 | # 查看資源 |
實用技巧
1 | # 設定別名(加入 ~/.zshrc 或 ~/.bashrc) |
第一個 K8s 應用
讓我們部署一個簡單的 Nginx 來驗證環境:
快速部署
1 | # 建立 Deployment |
使用 YAML 配置(推薦)
建立 nginx-demo.yaml:
1 | # Deployment:管理 Pod 的部署 |
1 | # 套用配置 |
清理資源
1 | kubectl delete -f nginx-demo.yaml |
本章重點回顧
核心要點
Kubernetes 定位
- 容器編排平台,不是取代 Docker
- 解決大規模容器管理的問題
架構組成
- Control Plane:API Server、etcd、Scheduler、Controller Manager
- Worker Node:Kubelet、Kube-Proxy、Container Runtime
核心概念
- Pod:最小部署單位
- Deployment:管理 Pod 部署
- Service:提供穩定存取端點
開發環境
- 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:實戰篇 - 部署完整微服務應用






