文章目录
-
- 前言
- 技术积累
- [helm 安装 MySQL 1主2从](#helm 安装 MySQL 1主2从)
-
- [1. 添加 bitnami 的仓库](#1. 添加 bitnami 的仓库)
- [2. 查询 MySQL 资源](#2. 查询 MySQL 资源)
- [3. 拉取 MySQL chart 到本地](#3. 拉取 MySQL chart 到本地)
- [4. 对chart 本地 values-test.yaml 修改](#4. 对chart 本地 values-test.yaml 修改)
- [5. 对本地 templates 模板 修改](#5. 对本地 templates 模板 修改)
- [6. 安装 MySQL 集群](#6. 安装 MySQL 集群)
- [7. 查看部署的 MySQL 集群](#7. 查看部署的 MySQL 集群)
- [8. 连接 MySQL 集群 验证服务](#8. 连接 MySQL 集群 验证服务)
- ingress-nginx开放主从端口
前言
K8S对于云原生部署有着至关重要的作用,几乎所有的应用和中间件都可以部署在K8S,让其帮助我们进行管理。一般情况下我们推荐数据库不使用容器化部署,但是在某些场合为了方便管理也可以采用该种方式。今天我们就用在K8S集群部署MySQL,仅当作学习学习,在生产环境谨慎使用。
技术积累
什么是Helm
Helm是K8S中包管理工具,包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum一样,能快速查找、下载和安装软件包, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。具体介绍和安装使用参见之前博文: Kubernetes包管理工具Helm简介及使用
StorageClass
由于数据库需要使用存储资源,K8S集群中我们可手动创建pv、pvc,StorageClass工具则可以自动车床件pvc。具体简介和使用参见之前博文:【实战】Kubernetes安装持久化工具NFS-StorageClass
使用的工具版本
软件 | 版本 |
---|---|
chart | 9.12.0 |
mysql | 8.0.34 |
kubernetes | version v1.27.2 |
helm | version v3.12.1 |
helm 安装 MySQL 1主2从
1. 添加 bitnami 的仓库
$ helm repo add bitnami https://charts.bitnami.com/bitnami
2. 查询 MySQL 资源
$ helm repo update
root@master k8s\]# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/mysql 9.12.1 8.0.34 MySQL is a fast, reliable, scalable, and easy t...
bitnami/phpmyadmin 12.1.0 5.2.1 phpMyAdmin is a free software tool written in P...
bitnami/mariadb 13.1.2 11.0.3 MariaDB is an open source, community-developed ...
bitnami/mariadb-galera 9.1.1 11.0.3 MariaDB Galera is a multi-primary database clus...
#### 3. 拉取 MySQL chart 到本地
$ mkdir -p /k8s/mysql \&\& cd /k8s/mysql
#拉取 chart 到本地 /root/mysql 目录
$ helm pull bitnami/mysql --version 9.12.1
$ tar -xvf mysql-9.12.1.tgz
$ cp mysql/values.yaml ./values-test.yaml
#查看当前目录层级
\[root@master mysql\]# tree -L 2
.
├── mysql
│ ├── Chart.lock
│ ├── charts
│ ├── Chart.yaml
│ ├── README.md
│ ├── templates
│ ├── values.schema.json
│ └── values.yaml
├── mysql-9.12.1.tgz
└── values-test.yaml
3 directories, 7 files
#### 4. 对chart 本地 values-test.yaml 修改
查看集群 storageclasses
\[root@master mysql\]# kubectl get storageclass
```bash
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage (default) nfs-provisioner Delete Immediate false 10d
```
修改配置
$ vim values-test.yaml
```bash
#镜像修改
image:
registry: registry.cn-hangzhou.aliyuncs.com
repository: senfel/mysql
tag: 8.0.34-debian-11-r31
#架构改为集群复制
architecture: replication
#root密码 主从复制密码
auth:
rootPassword: "123456root"
#主节点
primary:
configuration: |-
[mysqld]
default_authentication_plugin=caching_sha2_password ## 加密方式
persistence: ## 储存方式
storageClass: "nfs-storage"
#从节点副本数
secondary:
replicaCount: 2
#从节点
secondary:
configuration: |-
[mysqld]
default_authentication_plugin=caching_sha2_password ## 加密方式
read_only=1 ##限定普通用户只读
super_read_only=on ##限定root只读
persistence: ##储存方式
storageClass: "nfs-storage"
```
#### 5. 对本地 templates 模板 修改
mysql5会有以下问题,mysql8无需处理
\[root@master mysql\]# kubectl api-versions
```bash
# k8s v1.27.2 版本中,statefulsets 版本为:apps/v1 而不是模板中 apps/v1beta1 的版本
# 因此需要替换 master-statefulset.yaml 和 slave-statefulset.yaml 模板
$ sed -i "s#apps/v1beta1#apps/v1#" mysql/templates/master-statefulset.yaml
$ sed -i "s#apps/v1beta1#apps/v1#" mysql/templates/slave-statefulset.yaml
未替换模板中 statefulsets 版本,直接安装服务会报错
$ helm install mysql-cluster mysql -f values-test.yaml
Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: unable to recognize "": no matches for kind "StatefulSet" in version "apps/v1beta1"
```
#### 6. 安装 MySQL 集群
#创建 mysql-cluster 名称空间
$ kubectl create ns mysql-cluster
#安装 MySQL 集群
$ helm install mysql-cluster -n mysql-cluster mysql -f values-test.yaml
##helm -n NAMESAPCE install SERVER_NAME FILE_NAME -f CONFIG_FILE
-n 指定 kubernetes 集群名称空间
-f 指定使用的配置文件,文件中定义的配置可以覆盖 mysql/values.yaml 文件中配置
\[root@master mysql\]# helm install mysql-cluster -n mysql-cluster mysql -f values-test.yaml
```bash
NAME: mysql-cluster
LAST DEPLOYED: Mon Sep 4 15:09:28 2023
NAMESPACE: mysql-cluster
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 9.12.1
APP VERSION: 8.0.34
** Please be patient while the chart is being deployed **
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace mysql-cluster
Services:
echo Primary: mysql-cluster-primary.mysql-cluster.svc.cluster.local:3306
echo Secondary: mysql-cluster-secondary.mysql-cluster.svc.cluster.local:3306
Execute the following to get the administrator credentials:
echo Username: root
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace mysql-cluster mysql-cluster -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-cluster-client --rm --tty -i --restart='Never' --image registry.cn-hangzhou.aliyuncs.com/senfel/mysql:8.0.34-debian-11-r31 --namespace mysql-cluster --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
2. To connect to primary service (read/write):
mysql -h mysql-cluster-primary.mysql-cluster.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
3. To connect to secondary service (read-only):
mysql -h mysql-cluster-secondary.mysql-cluster.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
```
#### 7. 查看部署的 MySQL 集群
\[root@master mysql\]# kubectl get svc,pods -n mysql-cluster
```bash
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql-cluster-primary ClusterIP 10.102.253.38