AI智能
改变未来

kubernetes使用StatefulSet部署mysql一主多从


kubernetes使用StatefulSet部署mysql一主多从

有状态服务一般数据需要永久保存,先创建动态存储卷(这里存储使用nfs)

rabc文件

(base) [root@nlp-test-server-no ~]# cat nfs-rbac.yamlapiVersion: v1kind: ServiceAccountmetadata:name: nfs-client-provisionernamespace: default---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: nfs-client-provisioner-runnerrules:- 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: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: run-nfs-client-provisionersubjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: defaultroleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io

StorageClass文件

(base) [root@nlp-test-server-no ~]# cat nfs-storageclass.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: course-nfs-storagenamespace: defaultprovisioner: fuseim.pri/ifs

nfs-provisioner文件

(base) [root@nlp-test-server-no ~]# cat nfs-provisioner.yamlkind: DeploymentapiVersion: extensions/v1beta1metadata:name: nfs-client-provisionernamespace: defaultspec:replicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs- name: NFS_SERVERvalue: 172.31.243.224  # 这里写nfs服务器地址- name: NFS_PATHvalue: /home/k8s/data  # nfs共享目录volumes:- name: nfs-client-rootnfs:server: 172.31.243.224 # 这里写nfs服务器地址path: /home/k8s/data     # nfs共享目录

至此动态存储卷创建好了,开始部署mysql集群
StatefulSet文件

(base) [root@nlp-test-server-no ~]# cat mysql.yamlapiVersion: apps/v1kind: StatefulSetmetadata:name: mysqlnamespace: defaultspec:selector:matchLabels:app: mysqlserviceName: mysqlreplicas: 3template:metadata:labels:app: mysqlspec:initContainers:- name: init-mysqlimage: mysql:5.7command:- bash- \"-c\"- |set -ex# Generate mysql server-id from pod ordinal index.[[ `hostname` =~ -([0-9]+)$ ]] || exit 1ordinal=${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 ]]; thencp /mnt/config-map/master.cnf /mnt/conf.d/elsecp /mnt/config-map/slave.cnf /mnt/conf.d/fivolumeMounts:- name: confmountPath: /mnt/conf.d- name: config-mapmountPath: /mnt/config-map- name: clone-mysqlimage: ist0ne/xtrabackup:1.0command:- 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 1ordinal=${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/mysqlvolumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dcontainers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ALLOW_EMPTY_PASSWORDvalue: \"1\"ports:- name: mysqlcontainerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 500mmemory: 1GilivenessProbe:exec:command: [\"mysqladmin\", \"ping\"]initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5readinessProbe:exec:# Check we can execute queries over TCP (skip-networking is off).command: [\"mysql\", \"-h\", \"127.0.0.1\", \"-e\", \"SELECT 1\"]initialDelaySeconds: 5periodSeconds: 2timeoutSeconds: 1- name: xtrabackupimage: ist0ne/xtrabackup:1.0ports:- name: xtrabackupcontainerPort: 3307command:- bash- \"-c\"- |set -excd /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_infoelif [[ -f xtrabackup_binlog_info ]]; then# We\'re cloning directly from master. Parse binlog position.[[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1rm -f xtrabackup_binlog_info xtrabackup_slave_infoecho \"CHANGE MASTER TO MASTER_LOG_FILE=\'${BASH_REMATCH[1]}\',\\MASTER_LOG_POS=${BASH_REMATCH[2]}\" > change_master_to.sql.infi# Check if we need to complete a clone by starting replication.if [[ -f change_master_to.sql.in ]]; thenecho \"Waiting for mysqld to be ready (accepting connections)\"until mysql -h 127.0.0.1 -e \"SELECT 1\"; do sleep 1; doneecho \"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.origfi# Start a server to send backups when requested by peers.exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \\\"xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root\"volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 100mmemory: 100Mivolumes:- name: confemptyDir: {}- name: config-mapconfigMap:name: mysqlvolumeClaimTemplates:- metadata:name: datanamespace: defaultannotations: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: v1kind: Servicemetadata:name: mysqlnamespace: defaultlabels:app: mysqlspec:ports:- name: mysqlport: 3306clusterIP: Noneselector: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: v1kind: Servicemetadata:name: mysql-readnamespace: defaultlabels:app: mysqlspec:ports:- name: mysqlport: 3306selector:app: mysql
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » kubernetes使用StatefulSet部署mysql一主多从