欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 在Kubernetes 1.26 上使用 StatefulSet 部署 MySQL8

在Kubernetes 1.26 上使用 StatefulSet 部署 MySQL8

2025/3/22 9:29:02 来源:https://blog.csdn.net/weixin_44923842/article/details/146430380  浏览:    关键词:在Kubernetes 1.26 上使用 StatefulSet 部署 MySQL8

本文将详细介绍如何在 Kubernetes 1.26 上使用 StatefulSet 部署 MySQL 8,并使用 nfs-client 存储类。同时,我们将通过 ConfigMap 管理 MySQL 的配置文件,并为其添加一些优化参数。最后,我们还会配置一个 NodePort 类型的 Service,以便外部访问 MySQL 服务。


前提条件

  1. 已安装 Kubernetes 1.26 集群。

  2. 已安装 Helm。

  3. 已配置 NFS 服务器,并确保 Kubernetes 集群可以访问。


步骤 1: 安装 NFS 客户端 Provisioner

首先,我们需要安装 NFS 客户端 Provisioner,以便 Kubernetes 能够动态创建 NFS 存储卷。

安装 NFS 客户端 Provisioner

运行以下命令:

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \--set nfs.server=<NFS_SERVER_IP> \--set nfs.path=<NFS_SHARE_PATH>

将 <NFS_SERVER_IP> 替换为你的 NFS 服务器 IP 地址,将 <NFS_SHARE_PATH> 替换为 NFS 共享路径。

验证 StorageClass

安装完成后,验证 nfs-client StorageClass 是否创建成功:

kubectl get storageclass

步骤 2: 创建 ConfigMap 保存 MySQL 配置文件

我们将使用 ConfigMap 来管理 MySQL 的配置文件,并为其添加一些优化参数。

创建 ConfigMap

创建一个名为 mysql-config.yaml 的文件,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:name: mysql8-configlabels:app: mysql8
data:my.cnf: |[mysqld]# Basic Settingsbind-address = 0.0.0.0port = 3306datadir = /var/lib/mysqlsocket = /var/run/mysqld/mysqld.sock# Character Setcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci# Connection Settingsmax_connections = 1000max_user_connections = 500wait_timeout = 600interactive_timeout = 600# Buffer Settingsinnodb_buffer_pool_size = 1G  # Adjust based on available memory (e.g., 70% of total RAM)innodb_buffer_pool_instances = 8  # Recommended for high-concurrency workloadsinnodb_log_file_size = 512M  # Larger log files improve write performanceinnodb_log_buffer_size = 64M# Query Cache (Disabled by default in MySQL 8)query_cache_type = 0query_cache_size = 0# Table Open Cachetable_open_cache = 4000table_definition_cache = 2000# Threadingthread_cache_size = 100thread_stack = 256K# Logginglog_error = /var/log/mysql/error.logslow_query_log = 1slow_query_log_file = /var/log/mysql/slow.loglong_query_time = 2# Binary Logging (Enable for replication and point-in-time recovery)log_bin = /var/lib/mysql/mysql-binexpire_logs_days = 7binlog_format = ROW# InnoDB Settingsinnodb_file_per_table = 1  # Store each table in a separate fileinnodb_flush_log_at_trx_commit = 1  # Full ACID compliance (set to 2 for better performance)innodb_flush_method = O_DIRECT  # Avoid double bufferinginnodb_io_capacity = 2000  # Adjust based on disk performanceinnodb_io_capacity_max = 4000# Securityskip_symbolic_links = 1local_infile = 0[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4

应用 ConfigMap:

kubectl apply -f mysql-config.yaml

步骤 3: 编写 StatefulSet 和 Service 的 YAML 文件

接下来,我们编写 StatefulSet 和 Service 的 YAML 文件。

创建 YAML 文件

创建一个名为 mysql-statefulset-nodeport-configmap.yaml 的文件,内容如下:

---
# Service for MySQL (NodePort)
apiVersion: v1
kind: Service
metadata:name: mysql8labels:app: mysql8
spec:type: NodePortports:- port: 3306targetPort: 3306nodePort: 31036  # Optional: Specify a NodePort between 30000-32767selector:app: mysql8
---
# StatefulSet for MySQL
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql8labels:app: mysql8
spec:serviceName: mysql8replicas: 1selector:matchLabels:app: mysql8template:metadata:labels:app: mysql8spec:containers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalue: "your-root-password"  # Replace with your desired root passwordports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql8-datamountPath: /var/lib/mysql- name: mysql8-configmountPath: /etc/mysql/conf.dvolumes:- name: mysql8-configconfigMap:name: mysql8-configvolumeClaimTemplates:- metadata:name: mysql8-dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "nfs-client"resources:requests:storage: 100Gi

步骤 4: 部署 MySQL StatefulSet 和 Service

部署 YAML 文件

运行以下命令部署 MySQL:

kubectl apply -f mysql-statefulset-nodeport-configmap.yaml

验证部署

  1. 检查 StatefulSet 和 Pod:

    kubectl get statefulset
    kubectl get pods -l app=mysql8

    你应该会看到一个名为 mysql8-0 的 Pod 正在运行。

  2. 检查 Service:

    kubectl get svc -l app=mysql8

    你应该会看到一个名为 mysql8 的 Service,类型为 NodePort,并且有一个分配的 NodePort(例如 31306)。


步骤 5: 验证 MySQL 服务

获取节点 IP

运行以下命令获取 Kubernetes 节点的 IP 地址:

kubectl get nodes -o wide

记录下其中一个节点的 INTERNAL-IP 或 EXTERNAL-IP

连接 MySQL

使用 MySQL 客户端连接到 MySQL 服务:

mysql -h <NODE_IP> -P 30036 -u root -p

将 <NODE_IP> 替换为你的节点 IP 地址,输入你在 YAML 文件中设置的 MYSQL_ROOT_PASSWORD


步骤 6: 验证配置文件

进入 Pod

进入 MySQL Pod:

kubectl exec -it mysql8-0 -- bash

查看配置文件

查看配置文件是否挂载到 /etc/mysql/conf.d

cat /etc/mysql/conf.d/my.cnf

你应该会看到 ConfigMap 中定义的 my.cnf 内容。


步骤 7: 清理资源(可选)

如果需要删除部署的资源,可以运行以下命令:

kubectl delete -f mysql-statefulset-nodeport-configmap.yaml
kubectl delete configmap mysql-config

总结

通过以上步骤,我们成功在 Kubernetes 1.26 上使用 StatefulSet 部署了 MySQL 8,并通过 NodePort 类型的 Service 暴露了 MySQL 服务。同时,使用 ConfigMap 管理了 MySQL 的配置文件,并为其添加了一些优化参数。你可以根据实际需求进一步调整配置。


希望本文对你有所帮助!如果有任何问题,欢迎在评论区留言讨论。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词