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