部署
一、认识
在 Kubernetes
中,使用 StatefulSet
部署 MySQL
是管理有状态应用程序的一种推荐方法,因为它提供了稳定的网络标识和持久化存储。以下是基于 StatefulSet
部署 MySQL
的完整流程。
1. 准备 MySQL
配置:
-
Secret
: 用于存储敏感信息(如MySQL root
用户密码),确保安全性。 -
ConfigMap
: 用于存储MySQL
配置文件(如my.cnf
),实现灵活的配置管理。
2. 创建 MySQL
持久化存储: 为了确保 MySQL
的数据在 Pod
重启或迁移时不会丢失,需要创建 PersistentVolume
和 PersistentVolumeClaim
。若集群支持动态存储,建议使用 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.yaml
, StatefulSet
需要一个 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