k8s mysql operator_将 MySQL 通过 presslabs/mysql-operator 部署到 k8s 内部
目前 openbayes 的幾乎所有組件都部署在 k8s 內部,但 mysql 作為核心的數據存儲節點對其要求都蠻高的,對于目前的業務場景,其要求主要包含以下幾點:
需要持久化存儲,一旦數據丟失問題非常嚴重
對性能有要求,不然會拖垮依賴它的一切服務
需要一些額外的備份機制,可以快速的從一個備份做恢復
需要對應的監控體系
mysql 需要可以比較容易的通過各種客戶端訪問,方便不同的角色對數據做分析或者做 debug
*在規模比較大的時候可能會做讀寫分離
之所以希望將 mysql 部署到 k8s 內主要還是希望達到以下目的:
減少外部依賴,支持更廣泛部署場景;目前對于一些環境是使用了云服務商所提供的數據庫(aws / ucloud),然而并不是所有的情況都能這么做。
統一部署模式,降低部署門檻;對于無法使用云服務商的數據庫的場景,通常需要獨立在某一臺機器上安裝 mysql 但這個部署模式與 k8s 是分離的,相當于多了一部分手工部署的工作量,而且手動部署也很難滿足以上的幾點要求的,自動化越少,部署門檻就會越高。
下面介紹 presslabs/mysql-operator 如何滿足這些要求,實現在一些環境中成功使用 k8s 內的 mysql 的。
基本介紹
在使用云服務商的數據庫的時候我就在想,如果能有一套 k8s 的 operator 能夠支持快速部署 / 數據庫配置 / 周期性備份 / prometheus 指標暴露也不是難事呀,在做了簡單的搜索后還真的發現了這么個東西 presslabs/mysql-operator ,滿足了說所提及的這一切:
內置了 mysql 部署配置,簡單修改配置可以實現將 mysql 的存儲放置在 hostPath 或者指定的 storageClass 解決了持久化存儲的問題
既然可以指定具體部署的存儲,那么也能指定 mysql 部署的節點,性能的問題基本得到解決
內置 extraBackup 支持手動或者 cronjob 周期性備份數據庫到指定的對象存儲
部署起來的 mysql 自帶 exporter 可以直接和 prometheus 對接,然后把數據通過 grafana 展示,監控 / 告警也就有了
通過配置額外的 nodePort 類型的 Service 可以將 mysql 服務暴露出來,外部訪問的問題就解決了
這個 operator 本身就支持讀寫分離,不過我并沒測試
https://github.com/presslabs/mysql-operator/blob/master/charts/mysql-operator/values.yaml 這是 helm charts 的 values.yaml 把這個文件下載到本地,按照具體環境做一定修改后執行以下命令即可部署 operator 了:
# 這里用的是 helm3
helm repo add presslabs https://presslabs.github.io/charts
helm install mysql presslabs/mysql-operator \
-f values.yaml \
-n infra --create-namespace
其中 values.yaml 需要修改的部分主要就是兩部分:
鏡像位置(image sidecarImage orchestrator.image),國內部署速度不太行,建議自行拉到訪問比較好的國內節點
存儲,默認 persistence.enabled: false 可以按照自己的情況做修改,這里只支持 storageClass 的方式
部署好之后才是第一步,即成功部署了 operator 本身,下面就是具體部署一個 mysql 了,在 https://github.com/presslabs/mysql-operator/tree/master/examples 有一個例子,可以看到 mysql 被定義為了一個叫做 MysqlCluster 的 CRD。主要需要修改的部分有以下:
secretName 見 https://github.com/presslabs/mysql-operator/blob/master/examples/example-cluster-secret.yaml 指初始化的一些數據,如 root 密碼,數據庫名稱,用戶名,用戶密碼
image / mysqlVersion mysql 的鏡像,同樣推薦修改為國內的鏡像,具體版本也依照實際情況
backupSchedule 如果設置則是需要周期性備份,數據會按照該配置定期備份到指定的對象存儲中,當然 backupSecretName 也需要配置正確才能使用
mysqlConf 對應 mysql.cnf 中的字段,依據自己需求配置
volumeSpec 數據持久化方式,和上文中 operator 的類似,但是更靈活,支持 hostPath
initFileExtraSQL 感覺這個 MysqlCluster 是希望用戶每個數據庫建立一個獨立的資源,但是 openbayes 這里有一些附屬數據庫如果分開放置感覺有點沒必要,所以這里就采用這個機制同時初始化了其他的數據庫
initFileExtraSQL:
- "CREATE DATABASE IF NOT EXISTS ``"
- "DROP USER IF EXISTS @'%'"
- "CREATE USER @'%' IDENTIFIED BY ''"
- "GRANT ALL PRIVILEGES ON .* TO @'%'"
- "FLUSH PRIVILEGES"
注意這里有個奇怪的寫法是需要先去 DROP USER… 至于為啥我并不知道,我只知道不這么做就是會報錯…
備份 / 恢復
如上文所述,這個 MysqlCluster 支持自動的備份,當然也支持主動的備份,具體的文檔在這里。
既然支持備份也支持恢復,具體的文檔在這里。
這些步驟我都測試過了,確認可以走的通的。以及這個備份的功能已經非常體貼了:
支持手動備份通過 cron 控制
支持保存最近的 N 個版本
恢復只需要在初始 mysql 時填寫 s3 路徑即可
在備份到 s3 不成功可以看看具體的報錯信息,它具體備份采用的是 rclone 這個工具。不成功基本就是兩個方向:
s3 設置有問題,上傳直接掛了
你所使用的對象存儲可能不是 rclone 會完全支持的,這種情況比較少見,但是我確實踩到了,具體來講就是 ucloud 之前缺乏某些操作的支持,但是目前已經支持了呢
監控
如上圖所示,這是我直接將 https://grafana.com/grafana/dashboards/7362 這個儀表盤導入所看到的效果。
外部訪問
增加一個額外的 NodePort 即可:
apiVersion: v1
kind: Service
metadata:
name: local-openbayes-mysql-nodeport-master
spec:
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: 3306
nodePort: 30016
selector:
app.kubernetes.io/managed-by: mysql.presslabs.org
app.kubernetes.io/name: mysql
mysql.presslabs.org/cluster:
role: master
type: NodePort
獨立 io
在使用的過程中遇到一個特殊的情況,mysql 如果和其他的服務共用一個 storageClass 可能會出現 io 搶占的情況,導致 mysql 的延遲非常巨大。目前 k8s 還沒有一個很好的辦法解決這個問題。唯一想到的就是為 mysql 分配一套單獨的 storageClass (比如 local storage path 的方案)。
總結
以上是生活随笔為你收集整理的k8s mysql operator_将 MySQL 通过 presslabs/mysql-operator 部署到 k8s 内部的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输卵管不通怎么治疗才会怀孕
- 下一篇: 求一个感觉自己好傻个性签名。