在 Kubernetes 環境中佈署應用程式時,Helm Charts 提供了便捷的封裝和佈署方式。本文將示範如何使用 Helm 佈署 WordPress 與 Kubernetes Dashboard。首先,我們會使用 Bitnami 提供的 WordPress Chart,設定必要的引數,例如資料函式庫連線資訊、管理員帳號等,並透過 NodePort 暴露服務。佈署完成後,將會說明如何取得 WordPress 的存取網址以及登入憑證。接著,我們會安裝 Kubernetes Dashboard,並設定安全的存取方式,包含建立 ServiceAccount、ClusterRoleBinding 和 Token,確保只有授權使用者才能存取 Dashboard。最後,將會提供一些常用的 Helm 命令和 Kubernetes Dashboard 的操作說明,方便讀者快速上手。

使用 Helm Charts 與 Operators 佈署 WordPress

本章節將介紹如何使用由 Bitnami 提供的 Helm chart 來佈署 WordPress。Bitnami 是一家專門在各種平台(如 Kubernetes)上分發開源軟體的公司。

新增 Bitnami 倉函式庫並安裝 Helm Chart

首先,我們需要將 Bitnami 倉函式庫新增到 Helm 安裝中:

$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories

接著,建立一個名為 wordpress 的 namespace:

$ kubectl create ns wordpress
namespace/wordpress created

組態 Helm Chart 引數

在安裝 Helm chart 之前,我們需要準備一些佈署的細節。可以透過 --set 引數傳遞個別引數,或者使用檔案傳遞變數。讓我們建立一個名為 wp-values.yaml 的檔案來儲存變數和值:

# wp-values.yaml
wordpressUsername: wpadmin
wordpressPassword: wppassword
wordpressEmail: admin@example.com
wordpressFirstName: WP
wordpressLastName: Admin
service:
  type: NodePort
volumePermissions:
  enabled: true

內容解密:

  • wordpressUsernamewordpressPassword 用於設定 WordPress 管理員的使用者名稱和密碼。
  • wordpressEmailwordpressFirstNamewordpressLastName 用於設定管理員的電子郵件、姓和名。
  • service.type: NodePort 將服務型別設定為 NodePort,因為我們使用的是 minikube 叢集。
  • volumePermissions.enabled: true 用於啟用卷許可權。

安裝 WordPress 使用 Helm

現在我們可以安裝 WordPress 了,使用 wp-demo 作為此次釋出的名稱:

$ helm install wp-demo bitnami/wordpress -n wordpress --values wp-values.yaml
NAME: wp-demo
LAST DEPLOYED: Tue Jun 4 21:27:49 2024
NAMESPACE: wordpress
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 22.4.2
APP VERSION: 6.5.3
...

內容解密:

  • helm install 命令用於安裝 Helm chart。
  • -n wordpress 指定了 namespace。
  • --values wp-values.yaml 指定了組態檔案。

取得 WordPress 網址

根據 Helm 的輸出,我們可以透過以下命令取得 WordPress 網址:

export NODE_PORT=$(kubectl get --namespace wordpress -o jsonpath="{.spec.ports[0].nodePort}" services wp-demo-wordpress)
export NODE_IP=$(kubectl get nodes --namespace wordpress -o jsonpath="{.items[0].status.addresses[0].address}")
echo "WordPress URL: http://$NODE_IP:$NODE_PORT/"

內容解密:

  • kubectl get 命令用於取得服務的 NodePort 和節點的 IP 地址。
  • jsonpath 用於提取 JSON 輸出中的特定欄位。

驗證 WordPress 佈署

  1. 等待資料函式庫初始化並佈署 Pods,檢查 Pod 狀態:
$ kubectl get po -n wordpress
NAME READY STATUS RESTARTS AGE
wp-demo-mariadb-0 1/1 Running 9 (5m57s ago) 31m
wp-demo-wordpress-5d98c44785-9xd6h 1/1 Running 0 31m

內容解密:

  • kubectl get po 命令用於取得 Pods 的狀態。
  1. 注意資料函式庫是以 StatefulSet 方式佈署的:
$ kubectl get statefulsets.apps -n wordpress
NAME READY AGE
wp-demo-mariadb 1/1 99s

內容解密:

  • kubectl get statefulsets.apps 命令用於取得 StatefulSets 的狀態。
  1. 等待 wp-demo Service 物件取得埠詳情:
$ kubectl get svc -n wordpress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wp-demo-mariadb ClusterIP 10.100.118.79 <none> 3306/TCP 2m39s
wp-demo-wordpress NodePort 10.100.149.20 <none> 80:30509/TCP,443:32447/TCP 2m39s

內容解密:

  • kubectl get svc 命令用於取得 Services 的狀態。
  1. 使用 minikube 取得 IP 地址和埠詳情:
$ minikube service --url wp-demo-wordpress -n wordpress
http://192.168.59.150:30509
http://192.168.59.150:32447

內容解密:

  • minikube service 命令用於取得服務的 URL。
  1. 開啟網頁瀏覽器並導航到 WordPress 網址:
http://192.168.59.150:30509

這樣,我們就成功地使用 Helm chart 在 Kubernetes 上佈署了 WordPress。

使用 Helm Charts 與 Operators 的實踐

瀏覽 WordPress 儀錶板與存取憑證

成功佈署 WordPress Helm Chart 後,您可以透過 http://192.168.59.150:30509/wp-admin 存取 WordPress 儀錶板。若未設定 WordPress 登入引數,您需要檢索 Helm 自動生成的預設值。以下命令用於取得儲存在 Secret 物件中的憑證:

$ kubectl get secret --namespace wordpress wp-demo-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode
wppassword

使用上述命令解碼後取得的密碼,即可登入 WordPress 管理員介面。

檢查 Helm 釋出狀態與資源

佈署完成後,您可以檢查由 Helm Chart 佈署的各種資源,例如 Pods、Services、Deployments 和 StatefulSets,以深入瞭解 Chart 的元件及其互動關係。

若需查詢叢集中所有 Helm 釋出的資訊,請執行以下命令:

$ helm list -n wordpress

輸出範例如下:

NAME      NAMESPACE   REVISION   UPDATED                             STATUS      CHART           APP VERSION
wp-demo   wordpress   1          2024-06-04 22:20:32.556683096 +0800 +08   deployed    wordpress-22.4.2   6.5.3

移除 Helm 釋出

當您需要清理已佈署的資源時,Helm 提供了 helm uninstall 命令以簡化操作。以下範例展示如何移除 wp-demo 釋出:

$ helm uninstall wp-demo -n wordpress
release "wp-demo" uninstalled

該命令會刪除釋出相關的大部分 Kubernetes 物件,但 PersistentVolumes (PV) 和 PersistentVolumeClaims (PVC) 需要手動清理。

Helm Chart 結構剖析

以 Bitnami 的 WordPress Helm Chart 為例,其目錄結構如下:

  • Chart.yaml:包含 Chart 的中繼資料,如版本、關鍵字和依賴項。
  • LICENSE:可選的純文字檔案,包含授權資訊。
  • README.md:使用者可見的 README 檔案,會顯示在 Artifact Hub 上。
  • values.yaml:預設的組態值,供 YAML 範本使用。使用者可透過 CLI 或提供自訂 YAML 檔案覆寫這些值。
  • values.schema.json:可選的 JSON 結構描述,用於驗證 values.yaml
  • charts/:可選目錄,包含依賴的其他 Chart。
  • crds/:可選目錄,包含 Kubernetes 自訂資源定義。
  • templates/:最重要的目錄,包含生成 Kubernetes YAML 清單檔案的範本。

Chart.yaml 與依賴關係

檢視 Chart.yaml 可發現 WordPress Chart 依賴 MariaDB Chart(當 mariadb.enabled 設定為 true 時):

appVersion: 6.5.3
dependencies:
- condition: memcached.enabled
  name: memcached
  repository: oci://registry-1.docker.io/bitnamicharts
  version: 7.x.x
- condition: mariadb.enabled
  name: mariadb
  repository: oci://registry-1.docker.io/bitnamicharts
  version: 18.x.x

values.yaml 與預設值

values.yaml 中,MariaDB 預設為啟用狀態:

mariadb:
  enabled: true

templates/deployment.yaml 範例

檢視 deployment.yaml 可見 Kubernetes Deployment 物件範本,其中 ReplicaCount 是參照自提供的數值:

kind: Deployment
...
spec:
  ...
  replicas: {{ .Values.replicaCount }}
...

詳細解說:

此段落程式碼定義了一個 Kubernetes Deployment 物件,用於管理 WordPress Pod 的佈署數量。其中 .Values.replicaCount 表示從使用者提供的 values.yaml 或命令列引數中取得的副本數量。這個設計使得使用者能夠靈活地根據需求調整佈署規模,而無需修改 Chart 的原始範本。透過這種範本化的方式,Helm Chart 能夠在不同環境和需求下保持高度的可重複使用性和可組態性。

使用 Helm Charts 安裝 Kubernetes Dashboard

Kubernetes Dashboard 是官方提供的 Web UI,用於提供叢集的總覽檢視。該元件的 Helm chart 由 Kubernetes 社群官方維護。我們將使用預設引數進行安裝,因為目前不需要進行任何自定義。

新增 kubernetes-dashboard 倉函式庫到 Helm

首先,將 kubernetes-dashboard 倉函式庫新增到 Helm:

$ helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
"kubernetes-dashboard" has been added to your repositories

安裝 Kubernetes Dashboard

接下來,我們可以將 Helm chart 安裝為叢集中的 kubernetes-dashboard 發布版本:

$ helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

等待安裝完成,並檢查輸出訊息。注意以下訊息,我們稍後將使用它來存取 Dashboard WEBUI:

...
Congratulations! You have just installed Kubernetes Dashboard in your cluster.
To access the Dashboard, run the following:
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
...

驗證 Pod 狀態

確保 Pod 處於 Running 狀態:

$ kubectl get pod -n kubernetes-dashboard
NAME                                    READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-api-86c68c7896-7jxwz   1/1     Running   0          2m53s
kubernetes-dashboard-auth-59784dd8b-vsr99   1/1     Running   0          2m53s
kubernetes-dashboard-kong-7696bb8c88-6q7zs   1/1     Running   0          2m53s
kubernetes-dashboard-metrics-scraper-5485b64c47-9d69q   1/1     Running   0          2m53s
kubernetes-dashboard-web-84f8d6fff4-nxt5f   1/1     Running   0          2m53s

安全存取 Kubernetes Dashboard

預設情況下,Kubernetes Dashboard 優先考慮安全性,使用最小的 RBAC 組態。這有助於保護叢集資料。目前,登入 Dashboard 需要 Bearer Token。

建立 ServiceAccount

建立 ServiceAccount;準備以下 YAML:

# dashboard-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

建立 ServiceAccount:

$ kubectl apply -f dashboard-sa.yaml
serviceaccount/admin-user created

建立 ClusterRoleBinding

建立 ClusterRoleBinding 以允許存取。準備以下 YAML:

# dashboard-rbac.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

建立 ClusterRoleBinding:

$ kubectl apply -f dashboard-rbac.yml
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

建立 Token

建立 Token:

$ kubectl -n kubernetes-dashboard create token admin-user

複製產生的長 Token 字串,我們將在下一節中使用它來登入叢集 Dashboard。

存取 Dashboard WEBUI

Kubernetes Dashboard 提供多種存取方法。這裡,我們將重點介紹預設方法。執行以下命令(您從 Helm 安裝輸出中複製的)以取得 Dashboard 存取權。命令將保持在 port-forward 狀態;請勿離開命令:

$ kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
Forwarding from 127.0.0.1:8443 -> 8443
Forwarding from [::1]:8443 -> 8443
...

現在,在網頁瀏覽器中存取 URL https://localhost:8443/。您可以忽略 SSL 證書警告,因為 Dashboard 使用自簽署的 SSL 證書。輸入您在「安全存取 Kubernetes Dashboard」步驟 3 中產生的 Token,並登入 Dashboard,如下圖所示。

圖 14.5:Kubernetes Dashboard chart – 登入頁面

登入後,您可以瀏覽其功能:

圖 14.6:Kubernetes Dashboard chart – Deployments 頁面

此時,您已經可以存取 Dashboard,並可以瀏覽其功能。

此圖示說明瞭 Kubernetes Dashboard 的基本使用流程和安全性組態,涵蓋了從安裝到存取的全過程,並強調了 RBAC 組態和 Token 的使用,以確保叢集的安全性。

Kubernetes Dashboard 存取流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Kubernetes 佈署 WordPress 與 Dashboard

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

此圖表展示了存取 Kubernetes Dashboard 的主要步驟,包括安裝、組態 RBAC 和登入。

#### 內容解密:

此 Plantuml 圖表清晰地展示了從安裝 Kubernetes Dashboard 到成功登入並使用其功能的整個流程。每一步驟都與前述的文字說明相對應,提供了視覺化的指引。透過這個圖表,讀者可以更容易地理解整個操作流程及其背後的邏輯關係。