文章目录
- @[toc]
- 添加 helm 仓库
- 下载 chart 包
- 修改 values.yml 文件
- 安装 mysql
- 创建 pv
- 验证 mysql 版本
- 创建 mysql 备份 job
- 创建 mysql 备份用户
- 创建备份目录持久化
文章目录
- @[toc]
- 添加 helm 仓库
- 下载 chart 包
- 修改 values.yml 文件
- 安装 mysql
- 创建 pv
- 验证 mysql 版本
- 创建 mysql 备份 job
- 创建 mysql 备份用户
- 创建备份目录持久化
添加 helm 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
查看 helm 仓库,看看 8.0.36 版本的 mysql 对应哪个版本的 chart 包
helm search repo mysql -l | grep 8.0.36
bitnami 的一般列出来的都挺多的,我一般喜新厌旧
bitnami/mysql 10.2.1 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 10.1.1 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 10.1.0 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 10.0.0 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.23.0 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.22.0 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.21.2 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.21.1 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.19.1 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.19.0 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.18.2 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.18.0 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.17.1 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.17.0 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
bitnami/mysql 9.16.4 8.0.36 MySQL is a fast, reliable, scalable, and easy t...
下载 chart 包
helm pull bitnami/mysql --version 10.2.1
tar xf mysql-10.2.1.tgz
cd mysql
修改 values.yml 文件
先备份一下
cp values.yaml{,.bak}
利用
openssl rand 8
来生成八个字符的随机内容,这个内容不可读,利用-base64
转码变成可读的字符
openssl rand 8 -base64
原配置文件比较长,这里就展示一下我修改过的内容
# 一般 helm 部署的 pod 名字都是 releaseName 开头的,会把整体 pod 名字拉长了
## 直接使用 fullnameOverride 来指定自己想要生成的 pod 名字
fullnameOverride: "mysql-store"
auth:rootPassword: "10yX81E4E3A="createDatabase: false
primary:# 这里是配置 mysql 配置文件的,需要开启 binlog 之类的,自己添加一下就可以了configuration: |-affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.11.198
安装 mysql
store 是我这边使用的 namespace,大家需要替换成自己的
helm install -n store mysql ./ -f values.yaml --create-namespace
返回类似下面的输出,说明 yaml 没有问题
NAME: mysql
LAST DEPLOYED: Mon Jul 29 14:33:06 2024
NAMESPACE: store
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 10.2.1
APP VERSION: 8.0.36** Please be patient while the chart is being deployed **Tip:Watch the deployment status using the command: kubectl get pods -w --namespace storeServices:echo Primary: mysql-store.store.svc.cluster.local:3306Execute the following to get the administrator credentials:echo Username: rootMYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace store mysql-store -o jsonpath="{.data.mysql-root-password}" | base64 -d)To connect to your database:1. Run a pod that you can use as a client:kubectl run mysql-store-client --rm --tty -i --restart='Never' --image docker.m.daocloud.io/bitnami/mysql:8.0.36-debian-12-r12 --namespace store --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash2. To connect to primary service (read/write):mysql -h mysql-store.store.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:- primary.resources- secondary.resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
创建 pv
因为开启了持久化,所以需要 pv 和 pvc,可以通过下面的命令来查看 pvc 对应的名字,同样的,下面的 pod 名字和 namespace 需要替换成自己的
k describe pod -n store mysql-store-0 | grep ClaimName
我这里直接使用 localpath 的类型来创建 pv,因为 pvc 已经自动创建好了
创建本地目录
mkdir -p /data/k8s-data/mysql-data
chmod 777 /data/k8s-data/mysql-data
- storage 的大小,需要自己评估了,不要盲目的抄
- nodeAffinity 是节点绑定的,可以抄,别全抄,你没有我的节点名称的
---
apiVersion: v1
kind: PersistentVolume
metadata:name: data-mysql-store-0
spec:accessModes:- ReadWriteOncecapacity:storage: 30GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: data-mysql-store-0namespace: storehostPath:path: /data/k8s-data/mysql-datatype: "DirectoryOrCreate"persistentVolumeReclaimPolicy: RetainnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.11.198
apply yaml 文件,查看 pvc 是否处于 Bound 状态
k get pvc -n store | grep mysql
获取到的是 Bound 状态就没问题了
mysql-store-0 Bound mysql-store-0 30Gi RWO 63s
验证 mysql 版本
进入 mysql 容器
k exec -it -n store mysql-store-0 bash
登录 mysql(helm install 的时候有输出这个命令,拿来直接用就行)
mysql -h mysql-store.store.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
执行下面的 sql 查看 mysql 版本
SELECT version();
可以看到,mysql 的版本是 8.0.36
+-----------+
| version() |
+-----------+
| 8.0.36 |
+-----------+
1 row in set (0.00 sec)
创建 mysql 备份 job
创建 mysql 备份用户
- 先说一下用户权限问题,我只是起了一个测试使用的,这里只包含了下面两个权限
SELECT
:查询权限是肯定要有的,mysqldump 是将查询到的内容转换成 sql 语句
LOCK TABLES
:锁表备份需要有该权限,如果有 --single-transaction 参数不锁表备份,可以不赋予该权限
-- 创建 backupuser 用户
CREATE USER IF NOT EXISTS 'backupuser'@'%';
-- backupuser 用户配置密码
ALTER USER 'backupuser'@'%' IDENTIFIED BY '6xOVfuAg';
-- backupuser 用户赋权
GRANT SELECT,LOCK TABLES ON *.* TO 'backupuser'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看用户权限
SHOW GRANTS FOR 'backupuser'@'%';
用户被赋予了
SELECT
和LOCK TABLES
的权限
+------------------------------------------------------+
| Grants for backupuser@% |
+------------------------------------------------------+
| GRANT SELECT, LOCK TABLES ON *.* TO `backupuser`@`%` |
+------------------------------------------------------+
1 row in set (0.00 sec)
使用备份用户登录,验证用户名密码
mysql -h mysql-store.store.svc.cluster.local -ubackupuser -p6xOVfuAg
创建备份目录持久化
同样使用 hostpath 的方式存储
mkdir -p /data/k8s-data/mysql-back
chmod 777 /data/k8s-data/mysql-back
创建 job
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: mysql-backupnamespace: store
spec:schedule: "0 17 * * *"successfulJobsHistoryLimit: 1failedJobsHistoryLimit: 2jobTemplate:spec:template:spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: mysql-backoperator: Existscontainers:- name: mysql-backupimagePullPolicy: IfNotPresentimage: docker.io/bitnami/mysql:8.0.36-debian-12-r12env:- name: MYSQL_HOSTvalue: mysql-store.store.svc.cluster.local- name: TZvalue: Asia/Shanghai- name: LANGvalue: en_US.UTF-8command:- /bin/sh- -c- |set -exmysqldump --host=${MYSQL_HOST} --user=backupuser \--password=6xOVfuAg \--all-databases --quick \> /mysql-backup/mysql-$(date +"%Y%m%dT%H_%M_%S").sql && find /mysql-backup/ -type f -mtime +3 -exec rm -rf {} \;volumeMounts:- name: mysql-backupmountPath: /mysql-backuprestartPolicy: OnFailurevolumes:- name: mysql-backuphostPath:path: /data/k8s-data/mysql-backtype: DirectoryOrCreate