本文将详细介绍如何在 Kubernetes 1.26 上使用 StatefulSet 部署 MySQL 8,并使用 nfs-client
存储类。同时,我们将通过 ConfigMap 管理 MySQL 的配置文件,并为其添加一些优化参数。最后,我们还会配置一个 NodePort
类型的 Service,以便外部访问 MySQL 服务。
前提条件
-
已安装 Kubernetes 1.26 集群。
-
已安装 Helm。
-
已配置 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
验证部署
-
检查 StatefulSet 和 Pod:
kubectl get statefulset kubectl get pods -l app=mysql8
你应该会看到一个名为
mysql8-0
的 Pod 正在运行。 -
检查 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 的配置文件,并为其添加了一些优化参数。你可以根据实际需求进一步调整配置。
希望本文对你有所帮助!如果有任何问题,欢迎在评论区留言讨论。