有状态服务一般数据需要永久保存,先创建动态存储卷(这里存储使用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
kubernetes使用StatefulSet部署mysql一主多从
来源:这里教程网
时间:2026-03-01 15:28:50
作者:
编辑推荐:
- kubernetes使用StatefulSet部署mysql一主多从03-01
- vivo 云服务海量数据存储架构演进与实践03-01
- 集成电路小企业ERP管理软件排名如何?03-01
- MYSQL5.7.22 源码安装 主从搭建 + KEEPALIVED高可用03-01
- 如何搭建在线教育平台,在线教育平台搭建需要注意什么03-01
- 什么时候小企业或微型企业要考虑使用erp软件呢?03-01
- 啥是数据库范式03-01
- 产品/项目经理,有效提高效率的11种方法03-01
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- vivo 云服务海量数据存储架构演进与实践
vivo 云服务海量数据存储架构演进与实践
26-03-01 - 集成电路小企业ERP管理软件排名如何?
集成电路小企业ERP管理软件排名如何?
26-03-01 - 如何搭建在线教育平台,在线教育平台搭建需要注意什么
如何搭建在线教育平台,在线教育平台搭建需要注意什么
26-03-01 - 什么时候小企业或微型企业要考虑使用erp软件呢?
什么时候小企业或微型企业要考虑使用erp软件呢?
26-03-01 - 啥是数据库范式
啥是数据库范式
26-03-01 - 产品/项目经理,有效提高效率的11种方法
产品/项目经理,有效提高效率的11种方法
26-03-01 - X侦探所事件薄 | 一次内存溢出之谜
X侦探所事件薄 | 一次内存溢出之谜
26-03-01 - 腾讯大牛教你ClickHouse实时同步MySQL数据
腾讯大牛教你ClickHouse实时同步MySQL数据
26-03-01 - MySQL:存储引擎简介
MySQL:存储引擎简介
26-03-01 - 51学工坊整理|三分钟分清MySQL 和Oracle之间的误区
51学工坊整理|三分钟分清MySQL 和Oracle之间的误区
26-03-01
