helm 部署单节点 mysql 8.0.36
添加 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/hostname
            operator: In
            values:
            - 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 store
Services:
  echo Primary: mysql-store.store.svc.cluster.local:3306
Execute the following to get the administrator credentials:
  echo Username: root
  MYSQL_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 -- bash
  2. 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:
  - ReadWriteOnce
  capacity:
    storage: 30Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: data-mysql-store-0
    namespace: store
  hostPath:
    path: /data/k8s-data/mysql-data
    type: "DirectoryOrCreate"
  persistentVolumeReclaimPolicy: Retain
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - 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-backup
  namespace: store
spec:
  schedule: "0 17 * * *"
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 2
  jobTemplate:
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: mysql-back
                    operator: Exists
          containers:
          - name: mysql-backup
            imagePullPolicy: IfNotPresent
            image: docker.io/bitnami/mysql:8.0.36-debian-12-r12
            env:
              - name: MYSQL_HOST
                value: mysql-store.store.svc.cluster.local
              - name: TZ
                value: Asia/Shanghai
              - name: LANG
                value: en_US.UTF-8
            command:
            - /bin/sh
            - -c
            - |
              set -ex
              mysqldump --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-backup
              mountPath: /mysql-backup
          restartPolicy: OnFailure
          volumes:
          - name: mysql-backup
            hostPath:
              path: /data/k8s-data/mysql-back
              type: DirectoryOrCreate
                        
                    
                
                
            
        
浙公网安备 33010602011771号