k8s 建立mysql叢集
在網上找了好幾種方案 發現大家用的最多的就是k8s 官網的。
比較簡單方便。
該頁面顯示如何使用StatefulSet控制器去執行一個有狀態的應用程式。此例是一主多從的 MySQL 叢集。
請注意這不是生產配置。 重點是, MySQL 設定保留在不安全的預設值上,使重點放在 Kubernetes 中執行有狀態應用程式的常規模式。
準備開始
-
你必須擁有一個 Kubernetes 的叢集,同時你的 Kubernetes 叢集必須帶有 kubectl 命令列工具。 如果你還沒有叢集,你可以通過
要獲知版本資訊,請輸入kubectl version
. -
您需要有一個帶有預設StorageClass的動態持續卷供應程式,或者自己靜態的提供持久卷來滿足這裡使用的持久卷請求。
- 本教程假定您熟悉PersistentVolumes與StatefulSets, 以及其他核心概念,例如Pods,Services, 與ConfigMaps
教程目標
- 使用 StatefulSet 控制器部署複製的 MySQL 拓撲。
- 傳送 MySQL 客戶端流量。
- 觀察對宕機的抵抗力。
- 縮放 StatefulSet 的大小。
部署 MySQL
部署 MySQL 示例,包含一個 ConfigMap,兩個 Services,與一個 StatefulSet。
ConfigMap
從以下的 YAML 配置檔案建立 ConfigMap :
application/mysql/mysql-configmap.yaml |
---|
|
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-configmap.yaml
這個 ConfigMap 提供my.cnf
覆蓋,使您可以獨立控制 MySQL 主伺服器和從伺服器的配置。 在這種情況下,您希望主伺服器能夠將複製日誌提供給從伺服器,並且希望從伺服器拒絕任何不是通過複製進行的寫操作。
ConfigMap 本身沒有什麼特別之處,它可以使不同部分應用於不同的 Pod。 每個 Pod 都會決定在初始化時要看基於 StatefulSet 控制器提供的資訊。
Services
從以下 YAML 配置檔案建立服務:
application/mysql/mysql-services.yaml |
---|
|
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-services.yaml
Headless Service 給 StatefulSet 控制器為集合中每個 Pod 建立的 DNS 條目提供了一個宿主。因為 Headless Service 名為mysql
,所以可以通過在同一 Kubernetes 叢集和 namespace 中的任何其他 Pod 內解析<pod-name>.mysql
來訪問 Pod。
客戶端 Service 稱為mysql-read
,是一種常規 Service,具有其自己的群集 IP,該群集 IP 在報告為就緒的所有MySQL Pod 中分配連線。可能端點的集合包括 MySQL 主節點和所有從節點。
請注意,只有讀取查詢才能使用負載平衡的客戶端 Service。因為只有一個 MySQL 主伺服器,所以客戶端應直接連線到 MySQL 主伺服器 Pod (通過其在 Headless Service 中的 DNS 條目)以執行寫入操作。
StatefulSet
最後,從以下 YAML 配置檔案建立 StatefulSet:
application/mysql/mysql-statefulset.yaml |
---|
|
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-statefulset.yaml
您可以通過執行以下命令檢視啟動進度:
kubectl get pods -l app=mysql --watch
一段時間後,您應該看到所有3個 Pod 都開始執行:
NAME READY STATUS RESTARTS AGE
mysql-0 2/2 Running 0 2m
mysql-1 2/2 Running 0 1m
mysql-2 2/2 Running 0 1m
輸入Ctrl+C取消觀察。 如果您看不到任何進度,確保已啟用前提條件中提到的動態 PersistentVolume 預配器。