k8s 部署mysql 高可用
时间: 2023-07-09 20:04:19 浏览: 110
在 Kubernetes 中,可以使用 StatefulSet 来部署 MySQL 高可用。
1. 创建 PVC
首先需要创建一个 PersistentVolumeClaim(PVC) 用于存储 MySQL 数据。可以使用下面的 YAML 文件创建一个名为 mysql-pvc 的 PVC:
```
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
```
2. 部署 StatefulSet
接下来需要创建一个 StatefulSet 来运行 MySQL 实例。可以使用下面的 YAML 文件创建一个名为 mysql-statefulset 的 StatefulSet:
```
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-statefulset
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
```
在这个 YAML 文件中,我们指定了 StatefulSet 的副本数为 3,使用了 MySQL 5.7 的官方镜像,并且在容器中挂载了之前创建的 PVC。
3. 部署 Headless Service
最后需要创建一个 Headless Service 来提供 DNS 解析服务。可以使用下面的 YAML 文件创建一个名为 mysql 的 Headless Service:
```
kind: Service
apiVersion: v1
metadata:
name: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
```
在这个 YAML 文件中,我们指定了这个 Service 的 clusterIP 为 None,使其成为 Headless Service。同时指定了 Service 的端口为 3306,与 MySQL 的默认端口一致。
部署完成后,可以使用 kubectl get pods 查看 Pod 的状态,使用 kubectl get svc 查看 Service 的状态,使用 kubectl get statefulset 查看 StatefulSet 的状态,以及使用 kubectl get pvc 查看 PVC 的状态。
需要注意的是,使用 StatefulSet 部署 MySQL 高可用时,需要保证每个 Pod 的 hostname 和 PersistentVolumeClaim 的名称是唯一的。
阅读全文