日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

k8s mysql operator_将 MySQL 通过 presslabs/mysql-operator 部署到 k8s 内部

發(fā)布時(shí)間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 k8s mysql operator_将 MySQL 通过 presslabs/mysql-operator 部署到 k8s 内部 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目前 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。