暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K8s部署MySQL集群

DevOps架构实战 2022-05-18
2201

NFS持久化存储mysql数据略过,请查看往期文章

MySQL 部署包含 ConfigMapService 、StatefulSet

[root@master ~]#more  mysql-configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: mysql

  labels:

    app: mysql

data:

  master.cnf: |

    [mysqld]

    log-bin    

  slave.cnf: |

    [mysqld]

super-read-only


[root@master ~]#more mysql-services.yaml

apiVersion: v1

kind: Service

metadata:

  name: mysql

  labels:

    app: mysql

spec:

  ports:

  - name: mysql

    port: 3306

  clusterIP: None

  selector:

    app: mysql

---

apiVersion: v1

kind: Service

metadata:

  name: mysql-read

  labels:

    app: mysql

spec:

  ports:

  - name: mysql

    port: 3306

  selector:

app: mysql


[root@master ~]#moremysql-statefulset.yaml 

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

          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1

          ordinal=${BASH_REMATCH[1]}

          echo [mysqld] > mnt/conf.d/server-id.cnf

             echo server-id=$((100 + $ordinal)) >> mnt/conf.d/server-id.cnf

                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: data/xtrabackup:1.0

        command:

        - bash

        - "-c"

        - |

          set -ex

          [[ -d /var/lib/mysql/mysql ]] && exit 0

          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1

          ordinal=${BASH_REMATCH[1]}

          [[ $ordinal -eq 0 ]] && exit 0

          ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql

          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:

          command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]

          initialDelaySeconds: 5

          periodSeconds: 2

          timeoutSeconds: 1

      - name: xtrabackup

        image: data/xtrabackup:1.0

        ports:

        - name: xtrabackup

          containerPort: 3307

        command:

        - bash

        - "-c"

        - |

          set -ex

          cd /var/lib/mysql

          if [[ -f xtrabackup_slave_info && "x$(<xtrabackup_slave_info)" != "x" ]]; then

            cat xtrabackup_slave_info | sed -E 's/;$//g' > change_master_to.sql.in

            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

                     mv change_master_to.sql.in change_master_to.sql.orig

          fi

          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: 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:

      storageClassName: "managed-nfs-storage"

      accessModes: ["ReadWriteOnce"]

      resources:

        requests:

          storage: 10Gi


[root@master ~]# kubectl apply -f .

configmap/mysql create

service/mysql create

service/mysql-read create

statefulset.apps/mysql create

查看Pod的状态:

[root@master ~]# kubectl get pods -l app=mysql --watch

NAME      READY   STATUS    RESTARTS   AGE

mysql-0   2/2     Running   0          9m7s

mysql-1   2/2     Running   0          9m7s

mysql-2   2/2     Running   0          9m7s


如果本文对你有帮助的话,欢迎点赞&在看&转发,这对我继续分享&创作优质文章非常重要。感谢🙏🏻

----------------------end---------------------

1、k8s快速启动grafana

2、微服务-Eureka实战部署

3、带你搞懂K8s部署Mysql8.0

4、Kubernetes集群Prometheus监控JVM

5、测试环境快速部署K8s集群实战

如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。
随手在看、转发是最大的支持!
文章转载自DevOps架构实战,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论