在雲端原生架構中,Kubernetes 已成為容器編排的標準。然而,隨應用複雜度增加,手動管理大量 YAML 文件變得繁瑣且易錯。本文旨在提供一條實踐路徑,從解析 Kubernetes 核心組件與使用 Minikube 建立本地叢集開始,進而演示如何透過 Deployment 與 Service 部署應用。核心重點在於引入 Helm 包管理器,探討如何將分散的資源打包成標準化的 Chart。透過掌握 Helm Chart 的創建、發布與使用,團隊能大幅簡化應用部署、升級與版本控制流程,實現基礎設施即程式碼(IaC)的管理模式,提升開發與維運效率。

Kubernetes 實戰:從本地安裝到 Helm 包管理

深入解析 Kubernetes 的架構與本地安裝方法,學習如何部署和管理應用程式,並透過 Helm 包管理器簡化 Kubernetes 應用程式的部署與生命週期管理,包括使用公共 Chart 和創建自定義 Chart

本節將聚焦於 Kubernetes 的實戰應用。我們將深入探討 Kubernetes 的架構,並詳細介紹如何在本地機器上安裝 Kubernetes 環境,以便進行開發和測試。隨後,我們將學習如何部署一個簡單的 Kubernetes 應用程式,並介紹 Kubernetes Dashboard 的安裝與使用,以提供可視化的管理界面。最後,我們將引入 Helm,作為 Kubernetes 的強大包管理器,學習如何使用公共 Helm Chart,以及如何創建和發布自己的 Chart,以極大化地簡化 Kubernetes 應用程式的部署與管理。

Kubernetes 架構概覽與本地安裝

理解 Kubernetes 的架構是有效管理其部署的基礎。本地安裝則為開發者提供了獨立的實驗環境。

  1. Kubernetes 架構:

    • 控制平面 (Control Plane): 負責管理整個叢集的狀態和決策。主要組件包括:
      • API Server: 叢集所有操作的入口。
      • etcd: 持久化叢集狀態的鍵值存儲。
      • Scheduler: 分配 Pod 到節點。
      • Controller Manager: 運行各種控制器,維護叢集狀態。
    • 節點 (Nodes): 工作負載執行的實例。每個節點包含:
      • Kubelet: 與 API Server 通信,確保容器在 Pod 中運行。
      • Kube-proxy: 負責服務的網絡代理和負載均衡。
      • Container Runtime: 如 Docker 或 containerd,負責運行容器。
  2. 本地 Kubernetes 安裝:

    • Minikube: 最流行的本地 Kubernetes 運行環境,可以在單個節點上運行 Kubernetes。它支援多種驅動程式(如 Docker, VirtualBox, KVM)。
    • Kind (Kubernetes IN Docker): 使用 Docker 容器作為 Kubernetes 節點,啟動速度快,資源消耗較低。
    • Docker Desktop: 內建了 Kubernetes 支持,可以輕鬆啟用。
    • 安裝步驟 (以 Minikube 為例):
      1. 安裝 Docker。
      2. 安裝 Minikube。
      3. 啟動 Minikube:minikube start --driver=docker (或選擇其他驅動程式)。
      4. 配置 kubectl:Minikube 會自動配置 kubectl 指向 Minikube 的叢集。
  3. Kubernetes Dashboard 安裝:

    • 目的: 提供一個基於 Web 的圖形化界面,用於管理 Kubernetes 叢集中的資源。
    • 安裝: 通常通過應用一個 YAML 文件來部署 Dashboard 的組件。
    • 訪問: 安裝後,需要通過 kubectl proxy 命令啟動代理,然後訪問 Dashboard 的 URL。可能還需要創建一個 Service Account 和 ClusterRoleBinding 來獲取訪問令牌。

Kubernetes 應用程式部署與 Helm 包管理

將應用程式部署到 Kubernetes 並進行有效管理,是實際應用中的關鍵環節。Helm 在此過程中扮演著重要角色。

  1. Kubernetes 應用程式部署範例:

    • YAML 部署文件: Kubernetes 使用 YAML 文件來聲明式地定義資源,如 Pod, Deployment, Service。
    • Deployment: 定義應用程式的期望狀態,包括使用的映像檔、副本數量、更新策略等。
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-nginx-deployment
      spec:
        replicas: 2 # 期望運行 2 個 Pod
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:latest # 使用 Nginx 映像檔
              ports:
              - containerPort: 80
      
    • Service: 為 Deployment 中的 Pod 提供一個穩定的網絡訪問點。
      apiVersion: v1
      kind: Service
      metadata:
        name: my-nginx-service
      spec:
        selector:
          app: nginx # 選擇標籤為 app=nginx 的 Pod
        ports:
          - protocol: TCP
            port: 80 # Service 監聽的端口
            targetPort: 80 # 轉發到 Pod 的端口
        type: LoadBalancer # 創建一個外部負載均衡器 (在雲端提供商環境中)
      
    • 部署命令:
      kubectl apply -f deployment.yaml
      kubectl apply -f service.yaml
      
  2. Helm:Kubernetes 的包管理器:

    • 目的: 將 Kubernetes 應用程式打包成可重用的 Chart,簡化部署、升級和管理。
    • Chart: Helm 的打包格式,包含應用程式的所有 Kubernetes 資源定義文件,以及用於模板化和配置的 القيم文件。
    • Helm Client: 安裝 Helm CLI 工具。
  3. 使用公共 Helm Chart:

    • Artifact Hub: 一個用於查找 Helm Chart、Kubernetes 操作和 OPA 策略的公共倉庫。
    • 添加倉庫: helm repo add <repo-name> <repo-url>
    • 更新倉庫: helm repo update
    • 搜索 Chart: helm search repo <chart-name>
    • 安裝 Chart: helm install <release-name> <chart-name> (例如 helm install my-nginx stable/nginx)
    • 配置 Chart: 可以通過 --set 參數或提供自定義 values.yaml 文件來覆蓋 Chart 的預設值。
  4. 創建自定義 Helm Chart:

    • 初始化 Chart: helm create my-chart
    • Chart 結構:
      • charts/: 包含子 Chart。
      • templates/: 存放 Kubernetes 資源的 YAML 模板文件。
      • values.yaml: Chart 的預設配置值。
      • Chart.yaml: Chart 的元數據文件(名稱、版本、描述等)。
    • 模板化: 在 templates/ 目錄下的 YAML 文件中使用 Go 模板語法,引用 values.yaml 中的值。
      # templates/deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: {{ .Release.Name }}-nginx-deployment # 使用 Release 名稱
      spec:
        replicas: {{ .Values.replicaCount }} # 使用 values.yaml 中的 replicaCount
        template:
          spec:
            containers:
            - name: nginx
              image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" # 使用 image 配置
      
    • 打包 Chart: helm package ./my-chart
    • 本地安裝: helm install my-release ./my-chart
  5. 發布 Helm Chart:

    • 創建 Chart Repository: 可以使用 GitHub Pages, ChartMuseum, Harbor 等工具來託管 Chart。
    • 推送 Chart: 將打包好的 Chart 文件上傳到 Chart Repository。
    • 添加 Repository: 其他用戶可以添加您的 Chart Repository (helm repo add) 並安裝您的 Chart。

Kubernetes 部署與 Helm 架構圖示

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start

partition "Kubernetes 應用部署與管理" {
  partition "Kubernetes 基礎" {
    :1. 本地安裝 Kubernetes (Minikube, Kind);
    :2. 部署 Kubernetes Dashboard;
    :3. 編寫 Kubernetes YAML 文件 (Deployment, Service);
    :4. 使用 `kubectl apply` 部署應用;
  }

  partition "Helm 包管理器" {
    partition "Helm Client" {
      :安裝 Helm CLI;
      :添加 Chart Repository (Artifact Hub);
      :搜索與更新 Chart;
    }
    partition "Helm Chart" {
      :Chart 結構 (templates/, values.yaml, Chart.yaml);
      :模板化 Kubernetes 資源定義;
      :創建自定義 Chart (`helm create`);
      :打包 Chart (`helm package`);
    }
    partition "Chart Repository" {
      :託管公共或私有 Chart;
      :發布 Chart;
    }
    :5. 使用公共 Chart 快速部署 (helm install);
    :6. 使用自定義 Chart 管理應用生命週期;
    :7. 簡化部署、升級、回滾操作;
  }

  partition "應用程式生命週期管理" {
    :部署;
    :升級;
    :回滾;
    :配置管理;
  }
}

stop

@enduml

看圖說話:

此圖示全面展示了 Kubernetes 應用程式的部署與管理流程,從基礎的 Kubernetes 環境搭建到高級的 Helm 包管理。開頭的「Kubernetes 基礎」部分,涵蓋了本地安裝 Kubernetes、部署 Dashboard 以及使用 YAML 文件進行應用部署的關鍵步驟。圖示的主體部分是「Helm 包管理器」,它詳細介紹了 Helm Client 的操作,如添加倉庫、搜索 Chart、以及 Chart 的結構(templates, values.yaml 等)。特別強調了如何通過創建自定義 Chart 和使用公共 Chart 來簡化部署和管理。最後,「應用程式生命週期管理」部分總結了 Helm 在部署、升級、回滾和配置管理方面的核心價值。這張圖為理解和實踐 Kubernetes 應用部署提供了一個結構化的視角。

縱觀現代雲原生架構的演進,部署的複雜性與標準化,是決定交付效能的關鍵瓶頸。Helm 的出現,將部署思維從管理零散的 YAML 組態,提升至經營標準化的應用程式「包」,大幅降低了人為錯誤與協作成本。然而,相較於使用公共 Chart,真正的價值突破點在於建立內部自訂 Chart 的開發與治理體系,這才是將「基礎設施即代碼」理念從底層延伸至應用層,實現徹底自動化的核心。

展望未來,Chart 將深度整合安全掃描與策略即代碼,形成自動化且合規的交付生態。因此,對於追求卓越工程效能的技術領導者,優先投資建立團隊的 Chart 治理能力,是將技術潛力轉化為穩定商業價值的最佳策略。