详解MeterSphere 配置外部Mysql5.7的全过程
我从cnaaa.com购买了云服务器。
搭建一个主从复制(Master-Slave)的MySQL集群
本地存储原理
这里使用了本地存储,也就是说,用户希望Kubernetes能够直接使用宿主机上的本地磁盘目录,而不依赖于远程存储服务,来提供持久化的容器Volume
1、我们把存储固定在一个节点上,但是Pod在调度的时候,是飘来飘去的,怎么能让Pod通过PVC也能固定在PVC上?
2、给这个Pod加上一个nodeAffinity行不行?
当然行,但是这变相破坏了开发人员对资源对象的定义规范了,开发人员应该不需要时刻考虑调度的细节。调度的改动应该交给运维就行。所以我们为了实现本地存储,我们采用了延迟绑定的方法。方法很简单,我们都知道StorageClass一般由运维人员设计,我们只需要在StorageClass指定no-provisioner。这是因为Local Persistent Volume目前尚不支持Dynamic Provisioning,所以它没办法在用户创建PVC的时候,就自动创建出对应的PV。与此同时,这个StorageClass还定义了一个volumeBindingMode=WaitForFirstConsumer的属性。它是Local Persistent Volume里一个非常重要的特性,即:延迟绑定。
创建PV
先在Node (实验用的Node节点IP是node1)节点上,预先分配几个PV(不建议在生产上这样操作),要保证在node1上有对应的目录
ssh root@node1
mkdir -pv /data/svr/projects/{
mysql,mysql2,mysql3}
vim 01-persistentVolume-1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-mysql-pv
spec:
capacity:
storage: 15Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /data/svr/projects/mysql
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
vim 01-persistentVolume-2.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-mysql-pv-2
spec:
capacity:
storage: 15Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /data/svr/projects/mysql2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
vim 01-persistentVolume-3.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-mysql-pv-3
spec:
capacity:
storage: 15Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /data/svr/projects/mysql3
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
记住,这是在生产上不推荐的做法,我只是实验用途才这样手动预先创建,**正规的做法应该通过StorageClass采用Dynamic Provisioning, 而不是Static Provisioning机制生产PV
[root@master mysql]# kubectl apply -f 01-persistentVolume-1.yaml
persistentvolume/example-mysql-pv created
[root@master mysql]# kubectl apply -f 01-persistentVolume-2.yaml
persistentvolume/example-mysql-pv-2 created
[root@master mysql]# kubectl apply -f 01-persistentVolume-3.yaml
persistentvolume/example-mysql-pv-3 created
[root@master mysql]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
example-mysql-pv 15Gi RWO Delete Available local-storage 8s
example-mysql-pv-2 15Gi RWO Delete Available local-storage 6s
example-mysql-pv-3 15Gi RWO Delete Available local-storage 3s
02-storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
[root@master mysql]# kubectl apply -f 02-storageclass.yaml
storageclass.storage.k8s.io/local-storage created
[root@master mysql]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 5s
创建Namespace
03-mysql-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mysql
labels:
app: mysql
[root@master mysql]# kubectl apply -f 03-mysql-namespace.yaml
namespace/mysql unchanged
[root@master mysql]# kubectl get ns -n mysql
NAME STATUS AGE
mysql Active 3d
创建数据库的配置文件configmap
使用ConfigMap为Master/Slave节点分配不同的配置文件
vim 04-mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
data:
master.cnf: |
# Master配置
[mysqld]
log-bin=mysqllog
skip-name-resolve
slave.cnf: |
# Slave配置
[mysqld]
super-read-only
skip-name-resolve
log-bin=mysql-bin
replicate-ignore-db=mysql
[root@master mysql]# kubectl apply -f 04-mysql-configmap.yaml
configmap/mysql created
[root@master mysql]# kubectl get