云原生之深入解析MySQL在K8S环境中部署与监控

一、准备工作

  • MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
  • 本文主要分析 mysql 如何部署在 k8s 上,mysql 部署在 k8s 上的优势主要有以下几点:
    • 资源隔离;
    • 动态弹性扩缩容;
    • 环境一致性;
    • 运维方便。
  • MySQL 的使用,可以参考:MySQL官方文档
  • MySQL 的原理大致如下:

在这里插入图片描述

  • 部署的大致流程如下:

在这里插入图片描述

二、添加源

helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/mysql
tar -xf mysql-9.3.3.tgz

三、修改配置

  • 修改 mysql/values.yaml:
...

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
  • 添加 mysql/templates/pv.yaml:
{
    
    {
    
    - 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 }}
  • 添加 mysql/templates/storage-class.yaml:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: {
    
    {
    
     .Values.primary.persistence.storageClass }}
provisioner: kubernetes.io/no-provisioner

四、开始安装

# 创建持久化目录
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

在这里插入图片描述

  • 查看 pod 状态:
kubectl get pods,svc -n mysql -owide

在这里插入图片描述

五、Prometheus 监控

  • Prometheus:
https://prometheus.k8s.local/targets?search=mysql

在这里插入图片描述

  • 可以通过命令查看采集数据:
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:
https://grafana.k8s.local/
  • 账号:admin,密码通过下面命令获取:
kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
  • 导入 grafana 模板,集群资源监控:7362,官方模块下载地址:
https://grafana.com/grafana/dashboards/

在这里插入图片描述

六、卸载

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

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/131510335