MySQL statefulset_kubernetes使用StatefulSet部署mysql一主多从
有状态服务一般数据需要永久保存,先创建动态存储卷(这里存储使用nfs)rabc文件(base)[root nlp-test-server-no~]#cat nfs-rbac.yamlapiVersion:v1kind:ServiceAccountmetadata:name:nfs-client-provisionernamespace:default---kind:ClusterRoleapiVe
有状态服务一般数据需要永久保存,先创建动态存储卷(这里存储使用nfs)
rabc文件
(base)[root nlp-test-server-no~]#cat nfs-rbac.yaml
apiVersion:v1
kind:ServiceAccount
metadata:
name:nfs-client-provisioner
namespace:default
---
kind:ClusterRole
apiVersion:rbac.authorization.k8s.io/v1
metadata:
name:nfs-client-provisioner-runner
rules:
-apiGroups:[""]
resources:["persistentvolumes"]
verbs:["get","list","watch","create","delete"]
-apiGroups:[""]
resources:["persistentvolumeclaims"]
verbs:["get","list","watch","update"]
-apiGroups:["storage.k8s.io"]
resources:["storageclasses"]
verbs:["get","list","watch"]
-apiGroups:[""]
resources:["events"]
verbs:["list","watch","create","update","patch"]
-apiGroups:[""]
resources:["endpoints"]
verbs:["create","delete","get","list","watch","patch","update"]
---
kind:ClusterRoleBinding
apiVersion:rbac.authorization.k8s.io/v1
metadata:
name:run-nfs-client-provisioner
subjects:
-kind:ServiceAccount
name:nfs-client-provisioner
namespace:default
roleRef:
kind:ClusterRole
name:nfs-client-provisioner-runner
apiGroup:rbac.authorization.k8s.io
StorageClass文件
(base)[root nlp-test-server-no~]#cat nfs-storageclass.yaml
apiVersion:storage.k8s.io/v1
kind:StorageClass
metadata:
name:course-nfs-storage
namespace:default
provisioner:fuseim.pri/ifs
nfs-provisioner文件
(base)[root nlp-test-server-no~]#cat nfs-provisioner.yaml
kind:Deployment
apiVersion:extensions/v1beta1
metadata:
name:nfs-client-provisioner
namespace:default
spec:
replicas:1
strategy:
type:Recreate
template:
metadata:
labels:
app:nfs-client-provisioner
spec:
serviceAccountName:nfs-client-provisioner
containers:
-name:nfs-client-provisioner
image:quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
-name:nfs-client-root
mountPath:/persistentvolumes
env:
-name:PROVISIONER_NAME
value:fuseim.pri/ifs
-name:NFS_SERVER
value:172.31.243.224#这里写nfs服务器地址
-name:NFS_PATH
value:/home/k8s/data#nfs共享目录
volumes:
-name:nfs-client-root
nfs:
server:172.31.243.224#这里写nfs服务器地址
path:/home/k8s/data#nfs共享目录
至此动态存储卷创建好了,开始部署mysql集群
StatefulSet文件
(base)[root nlp-test-server-no~]#cat mysql.yaml
apiVersion:apps/v1
kind:StatefulSet
metadata:
name:mysql
namespace:default
spec:
selector:
matchLabels:
app:mysql
serviceName:mysql
replicas:3
template:
metadata:
labels:
app:mysql
spec:
initContainers:
-name:init-mysql
image:mysql:5.7
command:
-bash
-"-c"
-|
set-ex
#Generate mysql server-id from pod ordinal index.
[[`hostname`=~-([0-9]+)$]]||exit 1
ordinal=${BASH_REMATCH[1]}
echo[mysqld]>/mnt/conf.d/server-id.cnf
#Add an offset to avoid reserved server-id=0 value.
echo server-id=$((100+$ordinal))>>/mnt/conf.d/server-id.cnf
#Copy appropriate conf.d files from config-map to emptyDir.
if[[$ordinal-eq 0]];then
cp/mnt/config-map/master.cnf/mnt/conf.d/
else
cp/mnt/config-map/slave.cnf/mnt/conf.d/
fi
volumeMounts:
-name:conf
mountPath:/mnt/conf.d
-name:config-map
mountPath:/mnt/config-map
-name:clone-mysql
image:ist0ne/xtrabackup:1.0
command:
-bash
-"-c"
-|
set-ex
#Skip the clone if data already exists.
[[-d/var/lib/mysql/mysql]]&&exit 0
#Skip the clone on master(ordinal index 0).
[[`hostname`=~-([0-9]+)$]]||exit 1
ordinal=${BASH_REMATCH[1]}
[[$ordinal-eq 0]]&&exit 0
#Clone data from previous peer.
ncat--recv-only mysql-$(($ordinal-1)).mysql 3307|xbstream-x-C/var/lib/mysql
#Prepare the backup.
xtrabackup--prepare--target-dir=/var/lib/mysql
volumeMounts:
-name:data
mountPath:/var/lib/mysql
subPath:mysql
-name:conf
mountPath:/etc/mysql/conf.d
containers:
-name:mysql
image:mysql:5.7
env:
-name:MYSQL_ALLOW_EMPTY_PASSWORD
value:"1"
ports:
-name:mysql
containerPort:3306
volumeMounts:
-name:data
mountPath:/var/lib/mysql
subPath:mysql
-name:conf
mountPath:/etc/mysql/conf.d
resources:
requests:
cpu:500m
memory:1Gi
livenessProbe:
exec:
command:["mysqladmin","ping"]
initialDelaySeconds:30
periodSeconds:10
timeoutSeconds:5
readinessProbe:
exec:
#Check we can execute queries over TCP(skip-networking is off).
command:["mysql","-h","127.0.0.1","-e","SELECT 1"]
initialDelaySeconds:5
periodSeconds:2
timeoutSeconds:1
-name:xtrabackup
image:ist0ne/xtrabackup:1.0
ports:
-name:xtrabackup
containerPort:3307
command:
-bash
-"-c"
-|
set-ex
cd/var/lib/mysql
#Determine binlog position of cloned data,if any.
if[[-f xtrabackup_slave_info&&"x$(<xtrabackup_slave_info)"!="x"]];then
#XtraBackup already generated a partial"CHANGE MASTER TO"query
#because we're cloning from an existing slave.(Need to remove the tailing semicolon!)
cat xtrabackup_slave_info|sed-E's/;$//g'>change_master_to.sql.in
#Ignore xtrabackup_binlog_info in this case(it's useless).
rm-f xtrabackup_slave_info xtrabackup_binlog_info
elif[[-f xtrabackup_binlog_info]];then
#We're cloning directly from master.Parse binlog position.
[[`cat xtrabackup_binlog_info`=~^(.*?)[[:space:]]+(.*?)$]]||exit 1
rm-f xtrabackup_binlog_info xtrabackup_slave_info
echo"CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',
MASTER_LOG_POS=${BASH_REMATCH[2]}">change_master_to.sql.in
fi
#Check if we need to complete a clone by starting replication.
if[[-f change_master_to.sql.in]];then
echo"Waiting for mysqld to be ready(accepting connections)"
until mysql-h 127.0.0.1-e"SELECT 1";do sleep 1;done
echo"Initializing replication from clone position"
mysql-h 127.0.0.1
-e"$(<change_master_to.sql.in),
MASTER_HOST='mysql-0.mysql',
MASTER_USER='root',
MASTER_PASSWORD='',
MASTER_CONNECT_RETRY=10;
START SLAVE;"||exit 1
#In case of container restart,attempt this at-most-once.
mv change_master_to.sql.in change_master_to.sql.orig
fi
#Start a server to send backups when requested by peers.
exec ncat--listen--keep-open--send-3307-c
"xtrabackup--backup--slave-info--stream=xbstream--host=127.0.0.1--user=root"
volumeMounts:
-name:data
mountPath:/var/lib/mysql
subPath:mysql
-name:conf
mountPath:/etc/mysql/conf.d
resources:
requests:
cpu:100m
memory:100Mi
volumes:
-name:conf
emptyDir:{}
-name:config-map
configMap:
name:mysql
volumeClaimTemplates:
-metadata:
name:data
namespace:default
annotations:
volume.beta.kubernetes.io/storage-class:"course-nfs-storage"
spec:
accessModes:["ReadWriteOnce"]
resources:
requests:
storage:1Gi
server文件
(base)[root nlp-test-server-no~]#cat mysql_server.yaml
#Headless service for stable DNS entries of StatefulSet members.
apiVersion:v1
kind:Service
metadata:
name:mysql
namespace:default
labels:
app:mysql
spec:
ports:
-name:mysql
port:3306
clusterIP:None
selector:
app:mysql
---
#Client service for connecting to any MySQL instance for reads.
#For writes,you must instead connect to the master:mysql-0.mysql.
apiVersion:v1
kind:Service
metadata:
name:mysql-read
namespace:default
labels:
app:mysql
spec:
ports:
-name:mysql
port:3306
selector:
app:mysql
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)