kubernetes搭建mysql集群服务
参考链接:https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/
一、创建ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: mysql labels: app: mysql data: master.cnf: | # Apply this config only on the master. [mysqld] log-bin slave.cnf: | # Apply this config only on slaves. [mysqld] super-read-only
在pod初始化时, pod会根据自身标识(master或slave)从configmap中应用指定配置. 被应用配置将覆盖my.cnf中的配置. 目的是使master向slave提供复制日志服务,并设置slave拒绝非复制写入.
二、创建headless service
# Headless service for stable DNS entries of StatefulSet members. apiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql spec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql
三、创建StatefulSet
apiVersion: apps/v1beta1 apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql 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: gcr.io/google-samples/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_ROOT_PASSWORD value: "123", - name: MYSQL_REPLICATION_USER value: "sync", - name: MYSQL_REPLICATION_PASSWORD value: "sync", 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", "-uroot", "-p123", "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", "-uroot", "-p123", "-e", "SELECT 1"] initialDelaySeconds: 5 periodSeconds: 2 timeoutSeconds: 1 - name: xtrabackup image: gcr.io/google-samples/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 ]]; then # XtraBackup already generated a partial "CHANGE MASTER TO" query # because we're cloning from an existing slave. mv xtrabackup_slave_info change_master_to.sql.in # Ignore xtrabackup_binlog_info in this case (it's useless). rm -f 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 xtrabackup_binlog_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 -uroot -p123 -e "SELECT 1"; do sleep 1; done echo "Initializing replication from clone position" # In case of container restart, attempt this at-most-once. mv change_master_to.sql.in change_master_to.sql.orig mysql -h 127.0.0.1 -uroot -p123 <<EOF $(<change_master_to.sql.orig), MASTER_HOST='mysql-0.mysql', MASTER_USER='root', MASTER_PASSWORD='123', MASTER_CONNECT_RETRY=10; START SLAVE; EOF fi # 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 --password=123" 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 spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi
这里使用了两个初始化容器.
第一个初始化容器init-mysql作用包括根据pod名称后缀生成server_id文件, 从configmap中获取指定配置. 这里默认StatefulSet控制的第一个pod即mysql-0为master, 其余为slave.
第二个clone-mysql使用开源工具xtrabackup, 用于当前slave从前一个slave复制数据, 当有新的作为slave的pod加入集群时, 这个pod会从上一个pod(序号小1)的非master的pod复制数据, 因为新pod加入时, 我们必须假定master中的数据是不为空的, 需要进行一次复制操作, 这样在扩容时会避免数据丢失,
而从前一个pod复制数据是因为StatefulSet按顺序启动, 当前一个pod为ready时才启动后一个pod的机制而来.
当init容器执行完成后, 常规容器开始启动并运行. mysql Pods由运行mysqld服务的mysql容器和充当SideCar的xtrabackup容器组成(挎斗模式解析请见http://www.mamicode.com/info-detail-2149700.html)。
四、创建用于访问Service
# 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-access labels: app: mysql spec: ports: - name: mysql port: 3306 selector: app: mysql
五、查看
root@node4:~# kubectl -n admin-d2069c get pvc,pv,statefulset,pod,service,configmap |grep mysql pvc/storage-mysql-0 Bound pvc-bb591208-c2f4-11e8-b599-0050568eef9f 512M RWX managed-nfs-storage 12m pvc/storage-mysql-1 Bound pvc-c4ada169-c2f4-11e8-b599-0050568eef9f 512M RWX managed-nfs-storage 12m pvc/storage-mysql-2 Bound pvc-ce20ad71-c2f4-11e8-b599-0050568eef9f 512M RWX managed-nfs-storage 11m pv/pvc-bb591208-c2f4-11e8-b599-0050568eef9f 512M RWX Delete Bound admin-d2069c/storage-mysql-0 managed-nfs-storage 12m pv/pvc-c4ada169-c2f4-11e8-b599-0050568eef9f 512M RWX Delete Bound admin-d2069c/storage-mysql-1 managed-nfs-storage 12m pv/pvc-ce20ad71-c2f4-11e8-b599-0050568eef9f 512M RWX Delete Bound admin-d2069c/storage-mysql-2 managed-nfs-storage 11m statefulsets/mysql 3 3 12m po/mysql-0 2/2 Running 0 12m po/mysql-1 2/2 Running 0 12m po/mysql-2 2/2 Running 0 11m svc/mysql ClusterIP None <none> 3306/TCP 12m svc/mysql-access ClusterIP 10.68.8.223 <none> 3306/TCP 12m cm/mysql 2 12m
六、测试集群
登录mysql-0, 执行
kubectl -n admin-d2069c exec -it mysql-0 /bin/bash
进入mysql-0后连接mysql:
mysql -p123
创建database, 并以同样方式登录mysql-1或mysql-2, 发现其下已经将新创建的database同步则为验证成功.

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
kubernetes 搭建单节点mysql服务
参考链接:https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/ 一、创建service apiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql namespace: admin-d2069c spec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql 二、创建StatefulSet apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: mysql namespace: admin-d2069c spec: serviceName: mysql replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql namespac...
- 下一篇
虚拟化篇之前后端驱动分析
前后端驱动是虚拟化的重要组成部分,在我们平时的排查过程中,经常会涉及到这部分的数据,特别是与性能相关的问题类型。举个例子,我们经常会碰到网络抖动的问题,此时我们会在实例内部和后端vif口抓包,如果发现两者之间存在延迟,经常我们就会怀疑到前后端的问题。因此我们需要对其工作原理和排查方法需要有一个全面的了解,其中也涉及到一些调试技巧,如为了确定问题是否与前后端队列有关,需要在实例系统的core dump内解析出内存中的队列数据。 何为前后端: 说到前后端就要提到virtIO,virtIO是IBM提出的实现虚拟机内部和宿主机之前数据交换的一种方式,与之前所谓全虚拟化方式比较即通过qemu在模拟设备的方式,性能有了较大的提升。我们在本文中仅局限于网卡设备,这也是因为在实例案例中网络部分占了主导地位。简单来讲,在virtIO体系中分为前端驱动和
相关文章
文章评论
共有0条评论来说两句吧...