跳到主要内容

部署

2024年12月06日
柏拉文
越努力,越幸运

一、认识


Kubernetes 中,使用 StatefulSet 部署 MySQL 是管理有状态应用程序的一种推荐方法,因为它提供了稳定的网络标识和持久化存储。以下是基于 StatefulSet 部署 MySQL 的完整流程。

1. 准备 MySQL 配置:

  • Secret: 用于存储敏感信息(如 MySQL root 用户密码),确保安全性。

  • ConfigMap: 用于存储 MySQL 配置文件(如 my.cnf),实现灵活的配置管理。

2. 创建 MySQL 持久化存储: 为了确保 MySQL 的数据在 Pod 重启或迁移时不会丢失,需要创建 PersistentVolumePersistentVolumeClaim。若集群支持动态存储,建议使用 StorageClass,简化 PV 配置。

3. 创建 Headless Service 无头服务: Headless Service 提供无 ClusterIP 的服务,使 StatefulSet 的每个 Pod 可以通过 DNS 访问。

4. 基于 StatefulSet 部署 MySQL: StatefulSet 每个 Pod 的名称和存储卷是稳定的, 提供稳定的 DNS 名称,如 mysql-0, mysql-1,便于管理。数据存储使用 volumeClaimTemplates 自动绑定 PVC。适用于主从模式和 MySQL 集群场景。

二、配置文件


2.1 Secret

编写 mysql-secret.yaml 创建 Secret 保存敏感信息(如 root 密码)。

apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
root-password: cm9vdA== # 使用 echo -n 'yourpassword' | base64

2.2 ConfigMap

编写 mysql-config-map.yaml 创建 ConfigMap 保存 MySQL 的初始化配置文件

apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config-map
data:
my.cnf: |
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files

2.3 StatefulSet

编写 mysql-stateful-set.yaml 创建 StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-stateful-set
spec:
serviceName: "mysql-head-less-service"
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: registry.cn-hangzhou.aliyuncs.com/bolawen/mysql:9.0.1-linux-arm64
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root-password
volumeMounts:
- name: mysql-pvc
mountPath: /var/lib/mysql
- name: mysql-config-map-volume
mountPath: /etc/mysql/conf.d
volumes:
- name: mysql-config-map-volume
configMap:
name: mysql-config-map
volumeClaimTemplates:
- metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

2.4 Headless Service

创建 mysql-headless-service.yamlStatefulSet 需要一个 Headless Service 来为每个 Pod 提供稳定的 DNS 名称。

apiVersion: v1
kind: Service
metadata:
name: mysql-head-less-service
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306

2.5 PersistentVolume

编写 mysql-pv.yaml , 创建 pv 存储资源

apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/mysql
persistentVolumeReclaimPolicy: Retain

2.6 PersistentVolumeClaim

编写 mysql-pvc.yaml,创建 pvc 存储请求

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

三、资源部署


3.1 应用配置文件

kubectl apply -f mysql-secret.yaml
kubectl apply -f mysql-config-map.yaml
kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-headless-service.yaml
kubectl apply -f mysql-stateful-set.yaml

3.2 检查部署状态

kubectl get pods -l app=mysql
kubectl get svc mysql

3.3 验证 MySQL 服务

进入 Pod 检查 MySQL 是否正常运行

kubectl exec -it mysql-0 -- mysql -u root -p