kubernetes使用StatefulSet部署mysql一主多从

来源:这里教程网 时间:2026-03-01 15:28:50 作者:

  有状态服务一般数据需要永久保存,先创建动态存储卷(这里存储使用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

相关推荐