前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 集群部署 MySQL+ mysqld_exporter (单节点)

Kubernetes 集群部署 MySQL+ mysqld_exporter (单节点)

作者头像
高楼Zee
发布2021-10-27 11:03:05
1.4K0
发布2021-10-27 11:03:05
举报
文章被收录于专栏:7DGroup7DGroup
「系统环境:」
  • MySQL 版本:5.7
  • Kubernetes 版本:1.19.5
  • 操作系统版本:CentOS 7.8

一、简介

MySQL 是我们常用的关系型数据库,在项目开发、测试、部署到生成环境时,经常需要部署一套 MySQL 来对数据进行缓存。这里介绍下如何在 Kubernetes 环境中部署用于开发、测试的环境的 MySQL 数据库,当然,部署的是单节点模式,并非用于生产环境的主从或集群模式。单节点的 MySQL 部署简单,且配置存活探针,能保证快速检测 MySQL 是否可用,当不可用时快速进行重启。

二、MySQL 参数配置

在使用 Kubernetes 部署应用后,一般会习惯于将应用的配置文件外置,用 ConfigMap 存储,然后挂载进入镜像内部。这样,只要修改 ConfigMap 里面的配置,再重启应用就能很方便就能够使应用重新加载新的配置,很方便。

1、创建 ConfigMap 存储 MySQL 配置文件

创建 Kubernetes 的 ConfigMap 资源,用于存储 MySQL 的配置文件 mysql.conf 内容:

「mysql-config.yaml:」

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-shadow-config
  labels:
    app: mysql-shadow
data:
  my.cnf: |-
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld] 
    max_connections = 2000
    secure_file_priv=/var/lib/mysql
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

2、 Kubectl 部署 ConfigMap

通过 kubectl 工具部署 Kubernetes ConfigMap 资源,命令如下:

代码语言:javascript
复制
$ kubectl create -f mysql-config.yaml\

三、MySQL 数据存储

Kubernetes 部署的应用一般都是无状态应用,部署后下次重启很可能会漂移到不同节点上,所以不能使用节点上的本地存储,而是网络存储对应用数据持久化,PV 和 PVC 是 Kubernetes 用于与储空关联的资源,可与不同的存储驱动建立连接,存储应用数据,所以接下来我们要创建 Kubernetes PV、PVC 资源。

1、创建 PV

PV 支持多种存储驱动,不同存储驱动的 PV 配置方式是不同的,需要根据你的存储系统来配置 PV 参数。这里用的是 NFS 存储(共享网络文件存储系统),直接使用前面创建的 StorageClass 即可。

具体参考:

2、创建 PVC 绑定 Mysql 存储空间

「mysql-storage.yaml:」

代码语言:javascript
复制
## PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-shadow
spec:
  storageClassName: nfs-storage #---指定StorageClass
  resources:
    requests:
      storage: 5Gi        #设置 pvc 存储资源大小
  accessModes:
  - ReadWriteOnce

3、通过 Kubectl 工具部署 PV、PVC

通过 kubectl 工具部署 Kubernetes PV、PVC 资源,命令如下:

代码语言:javascript
复制
$ kubectl create -f mysql-storage.yaml 

四、Kubernetes 部署 MySQL

1、mysqld_exporter

MySQL 没有自带 /metrics 接口供 Prometheus 使用,在这种情况下,我们也需要利用 exporter 服务来为 Prometheus 提供指标数据了。Prometheus 官方为许多应用就提供了对应的 exporter 应用,也有许多第三方的实现,我们可以前往官方网站进行查看:https://prometheus.io/docs/instrumenting/exporters/。

这里我们选择官方的 mysqld_exporter:

  • https://github.com/prometheus/mysqld_exporter

mysqld_exporter 其支持的版本:

  • MySQL >= 5.6.
  • MariaDB >= 10.1

2、构建 sidecar

这里通过 mysqld_exporter 的服务来监控 MySQL 服务,我们以 sidecar 的形式和主应用部署在同一个 Pod 中,比如我们这里来部署一个 MySQL,并用 mysqld_exporter 的方式来采集监控数据供 Prometheus 使用,如下资源清单文件:「promethues-mysql-deploy.yaml」

创建用于 Kubernetes Deployment 来配置部署 MySQL 的参数:

  • 配置 MySQL 的镜像地址、名称、版本号;
  • 配置其 CPU 与 Memory 资源的占用;
  • 配置探针监测应用可用性;
  • 配置 Volume 挂载之前创建的 PV、PVC、ConfigMap 资源等等;
  • 构建 sidecar 挂载 mysqld_exporter。
代码语言:javascript
复制
## Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: db-mysql-shadow
  labels:
    app: mysql-shadow
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-shadow
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9104"
      labels:
        app: mysql-shadow
    spec:     
      containers:
      - name: mysql-shadow
        image: centos/mysql-57-centos7:latest
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD    ## 配置Root用户默认密码
          value: "123456"
        resources:
          limits:
            cpu: 2000m
            memory: 512Mi
          requests:
            cpu: 2000m
            memory: 512Mi
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
        - name: config
          mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
        - name: localtime
          readOnly: true
          mountPath: /etc/localtime
      - name: mysql-exporter-shadow
        image: prom/mysqld-exporter:latest
        env:
        - name: DATA_SOURCE_NAME
          value: "root:123456@(db-mysql-produce:3306)/"
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 9104
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: mysql-shadow
      - name: config      
        configMap:
          name: mysql-shadow-config
      - name: localtime
        hostPath:
          type: File
          path: /etc/localtime
---
## Service
apiVersion: v1
kind: Service
metadata:
  name: db-mysql-shadow
  labels:
    app: mysql-shadow
spec:
  type: NodePort
  ports:
  - name: mysql
    port: 3306
    targetPort: 3306
    nodePort: 30338
  - name: prom
    port: 9104
    targetPort: 9104
  selector:
    app: mysql-produce

「参数简介:」

  • ports:配置镜像映射端口。
  • resources:配置 CPU、Memory 资源限制,可以通过配置该值来配置 Pod 的 QoS 级别。
  • livenessProbe:配置存活探针,定时检测 MySQL 应用运行状态,如果检测到 MySQL 挂掉将进行重启操作。
  • readinessProbe:配置就绪探针,定时检测 MySQL 应用启动状态,如果启动成功将允许流量涌入,启动失败将进行重启操作。
  • command:探针执行探测时执行的探测命令。
  • volumeMounts:存储卷挂载配置,用于镜像内存储的挂载配置,与 volumes 中对于的 name 进行绑定。
  • volumes:存储卷配置,可配置使用 pvc、hostPath、emptyDir、nfs 等存储,需要配置 name 值与 -VolumeMounts 进行绑定。

通过 kubectl 工具部署 Deployment 来创建 MySQL ,命令如下:

代码语言:javascript
复制
$ kubectl create -f mysql-deploy.yaml 

五、测试 MySQL 是否能够正常使用

进入MySQL 使用命令进行连接:

代码语言:javascript
复制
$ kubectl exec -ti db-mysql-shadow-6b69bdddd6-7crqg -- /bin/bash
root@db-mall-mysql-6b69bdddd6-7crqg:/# mysql -uroot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 423
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mall               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

可以看到,已经成功连接数据库,说明数据库能正常使用。

六、测试是否正常获取监控数据

创建完成后,我们可以看到 MySQL 的 Pod 里面包含有两个容器:

代码语言:javascript
复制
$ kubectl get pods 
NAME                                    READY   STATUS    RESTARTS   AGE
db-mysql- shadow-6b69bdddd6-7crqg          2/2     Running   0          4d20h

$ kubectl get svc 
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
db-mysql- shadow          NodePort    10.96.106.73    <none>        3306:30338/TCP,9104:30602/TCP         4d20h

我们可以通过 9104 端口来校验是否能够采集到数据:

代码语言:javascript
复制
$ curl 10.96.106.73:9104/metrics
 TYPE mysql_global_variables_ft_query_expansion_limit gauge
mysql_global_variables_ft_query_expansion_limit 20
# HELP mysql_global_variables_general_log Generic gauge metric from SHOW GLOBAL VARIABLES.
# TYPE mysql_global_variables_general_log gauge
mysql_global_variables_general_log 0
# HELP mysql_global_variables_group_concat_max_len Generic gauge metric from SHOW GLOBAL VARIABLES.
# TYPE mysql_global_variables_group_concat_max_len gauge
mysql_global_variables_group_concat_max_len 1024
# HELP mysql_global_variables_gtid_executed_compression_period Generic gauge metric from SHOW GLOBAL VARIABLES.
# TYPE mysql_global_variables_gtid_executed_compression_period gauge
mysql_global_variables_gtid_executed_compression_period 1000
# HELP mysql_global_variables_gtid_mode Generic gauge metric from SHOW GLOBAL VARIABLES.
# TYPE mysql_global_variables_gtid_mode gauge

......

源码文件:

  • https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-mysql-exporter
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 7DGroup 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、MySQL 参数配置
    • 1、创建 ConfigMap 存储 MySQL 配置文件
      • 2、 Kubectl 部署 ConfigMap
      • 三、MySQL 数据存储
        • 1、创建 PV
          • 2、创建 PVC 绑定 Mysql 存储空间
            • 3、通过 Kubectl 工具部署 PV、PVC
            • 四、Kubernetes 部署 MySQL
              • 1、mysqld_exporter
                • 2、构建 sidecar
                • 五、测试 MySQL 是否能够正常使用
                • 六、测试是否正常获取监控数据
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档