← 返回上一頁
Kubernetes

Kubernetes 入門指南:架構、核心概念與基本物件一次搞懂

本頁目錄

前言

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)格式描述,每個物件由四個部分組成:

  1. apiVersion / kind(typeMeta):宣告物件的 API 版本和類型
  2. metadata(objectMeta):物件的中繼資料,包含名稱、標籤等
  3. spec:物件的期望狀態(使用什麼映像、多少副本等)
  4. 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 的學習曲線確實陡峭,但只要掌握了核心概念,其餘的都是延伸。

參考資料

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料