在 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
內容解密:
wordpressUsername和wordpressPassword用於設定 WordPress 管理員的使用者名稱和密碼。wordpressEmail、wordpressFirstName和wordpressLastName用於設定管理員的電子郵件、姓和名。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 佈署
- 等待資料函式庫初始化並佈署 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 的狀態。
- 注意資料函式庫是以 StatefulSet 方式佈署的:
$ kubectl get statefulsets.apps -n wordpress
NAME READY AGE
wp-demo-mariadb 1/1 99s
內容解密:
kubectl get statefulsets.apps命令用於取得 StatefulSets 的狀態。
- 等待
wp-demoService 物件取得埠詳情:
$ 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 的狀態。
- 使用 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。
- 開啟網頁瀏覽器並導航到 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 到成功登入並使用其功能的整個流程。每一步驟都與前述的文字說明相對應,提供了視覺化的指引。透過這個圖表,讀者可以更容易地理解整個操作流程及其背後的邏輯關係。