其他
8 张图详解 MySQL 在 K8S 环境中部署与监控
关注公众号并添加到“星标⭐”,防止错过消息
后台回复【资料包】获取学习资料
作者:liugp
出处:https://u.kubeinfo.cn/zVK7Yb
一、概述
MySQL
是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。这里主要讲 mysql 部署在 k8s 上,mysql 部署在 k8s 上的优势主要有以下几点:
资源隔离 动态弹性扩缩容 环境一致性 运维方便
官方文档:
https://docs.oracle.com/en-us/iaas/mysql-database/doc/getting-started.html
二、开始部署(一主两从)
1)添加源
helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/mysql
tar -xf mysql-9.3.3.tgz
2)修改配置
...
image:
registry: myharbor.com
repository: bigdata/mysql
tag: 8.0.30-debian-11-r15
...
architecture: replication
...
primary:
persistence:
enabled: true
size: 10Gi
storageClass: "mysql-local-storage"
# 目录需要提前在宿主机上创建
local:
- name: mysql-0
host: "local-168-182-110"
path: "/opt/bigdata/servers/mysql/data/data1"
service:
type: NodePort
nodePorts:
mysql: "30306"
secondary:
replicaCount: 2
persistence:
enabled: true
size: 10Gi
storageClass: "mysql-local-storage"
# 目录需要提前在宿主机上创建
local:
- name: mysql-1
host: "local-168-182-111"
path: "/opt/bigdata/servers/mysql/data/data1"
- name: mysql-2
host: "local-168-182-112"
path: "/opt/bigdata/servers/mysql/data/data1"
service:
type: NodePort
nodePorts:
mysql: "30307"
...
metrics:
## @param metrics.enabled Start a side-car prometheus exporter
##
enabled: true
image:
registry: myharbor.com
repository: bigdata/mysqld-exporter
tag: 0.14.0-debian-11-r33
{{- range .Values.primary.persistence.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .name }}
labels:
name: {{ .name }}
spec:
storageClassName: {{ $.Values.primary.persistence.storageClass }}
capacity:
storage: {{ $.Values.primary.persistence.size }}
accessModes:
- ReadWriteOnce
local:
path: {{ .path }}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- {{ .host }}
---
{{- end }}
{{- range .Values.secondary.persistence.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .name }}
labels:
name: {{ .name }}
spec:
storageClassName: {{ $.Values.secondary.persistence.storageClass }}
capacity:
storage: {{ $.Values.secondary.persistence.size }}
accessModes:
- ReadWriteOnce
local:
path: {{ .path }}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- {{ .host }}
---
{{- end }}
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: {{ .Values.primary.persistence.storageClass }}
provisioner: kubernetes.io/no-provisioner
3)开始安装
# 创建持久化目录
mkdir -p /opt/bigdata/servers/mysql/data/data1
# 先准备好镜像
docker pull docker.io/bitnami/mysql:8.0.30-debian-11-r15
docker tag docker.io/bitnami/mysql:8.0.30-debian-11-r15 myharbor.com/bigdata/mysql:8.0.30-debian-11-r15
docker push myharbor.com/bigdata/mysql:8.0.30-debian-11-r15
# mysqld-exporter
docker pull docker.io/bitnami/mysqld-exporter:0.14.0-debian-11-r33
docker tag docker.io/bitnami/mysqld-exporter:0.14.0-debian-11-r33 myharbor.com/bigdata/mysqld-exporter:0.14.0-debian-11-r33
docker push myharbor.com/bigdata/mysqld-exporter:0.14.0-debian-11-r33
# 开始安装
helm install mysql ./mysql -n mysql --create-namespace
NAME: mysql
LAST DEPLOYED: Mon Sep 19 23:57:18 2022
NAMESPACE: mysql
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 9.3.3
APP VERSION: 8.0.30
** Please be patient while the chart is being deployed **
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace mysql
Services:
echo Primary: mysql-primary.mysql.svc.cluster.local:3306
echo Secondary: mysql-secondary.mysql.svc.cluster.local:3306
Execute the following to get the administrator credentials:
echo Username: root
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace mysql mysql -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-client --rm --tty -i --restart='Never' --image myharbor.com/bigdata/mysql:8.0.30-debian-11-r15 --namespace mysql --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
2. To connect to primary service (read/write):
mysql -h mysql-primary.mysql.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
3. To connect to secondary service (read-only):
mysql -h mysql-secondary.mysql.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
To access the MySQL Prometheus metrics from outside the cluster execute the following commands:
kubectl port-forward --namespace mysql svc/mysql-metrics 9104:9104 &
curl http://127.0.0.1:9104/metrics
kubectl get pods,svc -n mysql -owide
4)测试验证
【温馨提示】从库(slave)是只读的。就是简单的读写测试,还有就是 pod 挂了,能否正常拉起等等。这个测试验证比较简单。这里就不一步步的演示了。
5)Prometheus 监控
kubectl get --raw http://10.244.0.74:9104/metrics
kubectl get --raw http://10.244.1.125:9104/metrics
kubectl get --raw http://10.244.2.178:9104/metrics
Grafana:
账号:admin
,密码通过下面命令获取
kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
导入 grafana 模板,集群资源监控:7362
官方模块下载地址:
6)卸载
helm uninstall mysql -n mysql
kubectl delete pod -n mysql `kubectl get pod -n mysql |awk 'NR>1{print $1}'` --force
kubectl patch ns mysql -p '{"metadata":{"finalizers":null}}'
kubectl delete ns mysql --force
总结
- END -
推荐阅读
K8S 1.25 中的重大更改和删除K8S 1.25 两特性减少应用滚动上线停机时间
Docker Desktop v4.12 发布,包含这些更新!
Adobe 用 Argo 高级部署模式的最佳实践14 张图详解 Zookeeper + Kafka on K8S 环境部署阿里开源K8S 本地调试工具包 kt-connectHelm 进阶到骨灰玩家,收藏版!
2.4W 字 Helm 从入门到专家
Docker 镜像构建保姆级入门实战指南12 图入门高性能分布式对象存储 MinIO
32 张配图详解 K8S 1.24 高可用部署,保姆级详细版!17 张图实战 + 理清 K8S 网络排错思路,硬核!16 张图硬核讲解 Kubernetes 网络模型K8S 的 TCP 数据包流量可视化超详细分布式对象存储 MinIO 实战教程