前言
Kubernetes(簡稱 K8s)是 Google 開源的容器編排引擎,目前已經成為容器化應用管理的業界標準。如果你剛開始接觸 Kubernetes,面對一大堆專有名詞可能會感到頭暈目眩。這篇文章就是為此而寫——用最清晰的方式帶你理解 Kubernetes 的架構、核心概念與基本物件。
Kubernetes 是什麼?
簡單來說,Kubernetes 是一套用來自動化部署、擴縮和管理容器化應用程式的系統。你可以把 Kubernetes 叢集想成一台巨大的虛擬電腦,不管底層有多少台伺服器,部署應用的方法永遠一致。
對應用開發者而言,Kubernetes 提供了:
- 服務發現與負載均衡
- 自動擴縮容
- 自我修復(Self-healing)
- 滾動更新與回滾
- 設定與密鑰管理
叢集架構
Kubernetes 叢集由 Master 節點和 Node 節點組成。應用程式部署在 Node 節點上,Master 節點負責整個叢集的管控。
Master 節點
Master 節點是叢集的控制中心,由四個核心元件構成:
| 元件 | 功能 |
|---|---|
| API Server | 叢集的統一入口,所有元件的通訊中繼站。接受外部請求並將資訊寫入 etcd |
| Controller Manager | 執行叢集級別功能,如副本管理、節點監控、故障處理等 |
| Scheduler | 根據資源可用性、節點親和性等條件,決定容器應該在哪個 Node 上運行 |
| etcd | 分散式鍵值資料庫,儲存整個叢集的配置和狀態 |
生產環境通常會部署 3 個 Master 節點以確保高可用。
Node 節點
Node 節點是實際運行容器的工作節點:
| 元件 | 功能 |
|---|---|
| kubelet | 管理節點上的容器,與 Container Runtime 和 API Server 互動 |
| kube-proxy | 處理節點上的網路代理,實作 Service 的流量轉發 |
| Container Runtime | 容器執行環境(如 containerd),負責拉取映像和運行容器 |
Kubernetes 的擴充性設計
Kubernetes 開放了三大核心介面,讓擴充性達到最大化:
- CRI(Container Runtime Interface):容器執行環境介面,隔離不同容器引擎的差異(containerd、CRI-O 等)
- CNI(Container Network Interface):容器網路介面,讓 Kubernetes 可以支援不同的網路環境(Calico、Cilium、Flannel 等)
- CSI(Container Storage Interface):容器儲存介面,支援各種類型的儲存(雲端區塊儲存、NFS、Ceph 等)
這種插件化的設計是 Kubernetes 能夠在各種環境中運行的關鍵原因。
核心基本物件
了解了架構之後,接下來認識 Kubernetes 中最常用的基本物件。
工作負載類
| 物件 | 說明 | 適用場景 |
|---|---|---|
| Pod | K8s 最小的部署單位,封裝一個或多個容器,共享網路和儲存 | 所有工作負載的基礎 |
| Deployment | 管理無狀態應用的 Pod,支援滾動更新和回滾 | Web 服務、API 服務 |
| StatefulSet | 管理有狀態應用,每個 Pod 有固定的 ID 和持久化儲存 | 資料庫、分散式系統 |
| DaemonSet | 確保每個節點上都運行一個 Pod | 日誌收集、監控 Agent |
| Job / CronJob | 一次性或排程批次任務,完成後自動退出 | 資料處理、定時任務 |
網路與服務類
| 物件 | 說明 |
|---|---|
| Service | 為一組 Pod 提供固定 IP 和負載均衡,基於四層(TCP/UDP)轉發 |
| Ingress | 基於七層(HTTP/HTTPS)轉發,支援透過域名和路徑做更細緻的路由 |
配置與儲存類
| 物件 | 說明 |
|---|---|
| ConfigMap | 儲存配置資料的鍵值對,實現配置與程式碼分離 |
| Secret | 加密儲存敏感資訊(憑證、私鑰等),比 ConfigMap 更安全 |
| PersistentVolume (PV) | 定義持久化儲存卷(如 NFS 目錄) |
| PersistentVolumeClaim (PVC) | 申請持久化儲存資源,不需關心底層實作 |
Kubernetes 物件的描述格式
Kubernetes 中的資源使用 YAML(或 JSON)格式描述,每個物件由四個部分組成:
- apiVersion / kind(typeMeta):宣告物件的 API 版本和類型
- metadata(objectMeta):物件的中繼資料,包含名稱、標籤等
- spec:物件的期望狀態(使用什麼映像、多少副本等)
- status:物件的實際狀態(由系統填入,建立時無需指定)
快速體驗:部署第一個應用
建立 nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 100m
memory: 200Mi
部署並驗證:
$ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx created
$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 9s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-685898579b-qrt4d 1/1 Running 0 15s
nginx-685898579b-t9zd2 1/1 Running 0 15s
nginx-685898579b-w59jn 1/1 Running 0 15s
搭建叢集的方式
- minikube:適合本地開發和學習,單節點叢集
- kubeadm:官方推薦的叢集建置工具,適合自建叢集
- 雲端託管服務:AWS EKS、GCP GKE、Azure AKS 等,省去維護 Control Plane 的工作
- 二進位安裝:最複雜但學習價值最高的方式
個人建議
如果你是剛接觸 Kubernetes 的新手,我建議從 minikube 開始動手,先把上面提到的基本物件都實際操作一遍。理解了 Pod、Deployment、Service 這些核心概念後,再逐步深入到 StatefulSet、DaemonSet、Ingress 等進階主題。不要一開始就試圖理解所有東西,Kubernetes 的學習曲線確實陡峭,但只要掌握了核心概念,其餘的都是延伸。

發佈留言