• kubernetes-v1.23.3 部署 MySQL-5.7.31


    部署 MySQL

    配置 mysql configmap

    ---
    apiVersion: v1
    data:
      mysqld.cnf: |-
        [mysqld]
        pid-file        = /var/run/mysqld/mysqld.pid
        socket          = /var/run/mysqld/mysqld.sock
        datadir         = /var/lib/mysql
        bind-address   = 0.0.0.0
        server_id = 1918
        default-time-zone='+08:00'
    
        # Disabling symbolic-links is recommended to prevent assorted security risks
        symbolic-links=0
        max_connections=1024
        default_storage_engine=innodb
        skip_external_locking
        lower_case_table_names=1
        skip_host_cache
        skip_name_resolve
        character_set_server=utf8mb4
        max_allowed_packet = 12M
        sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
        
        # ---------- binlog & errorlog & slowlog ---------- #
        log_bin = mysql-bin
        binlog_format = ROW
        max_binlog_size = 100m
        binlog_cache_size = 4m
        max_binlog_cache_size = 512m
        expire_logs_days = 7
        log-error      = /var/lib/mysql/error.log
        slow-query-log = on
        slow_query_log_file = /var/lib/mysql/slow.log
        long_query_time = 1
    
        [client]
        default-character-set=utf8mb4
    kind: ConfigMap
    metadata:
      annotations:
      labels:
        app: mysql
      name: mysql-cm
      namespace: bigdata
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    配置 mysql svc

    ---
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
      labels:
        app: mysql
      name: mysql-svc
      namespace: bigdata
    spec:
      ports:
      - name: mysql
        port: 3306
        protocol: TCP
        targetPort: 3306
      selector:
        app: mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    配置 mysql deployment

    mysql 的数据目录使用的 hostpath 的方式,通过亲和性来绑定节点,需要提前给对应的节点打上 mysql= 这样的标签

    kubectl label node <nodename> mysql=
    
    • 1
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
      labels:
        app: mysql
      name: mysql
      namespace: bigdata
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: mysql
                    operator: Exists
          containers:
          - name: mysql
            env:
              - name: APP_NAME
                value: mysql
              - name: NODE_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: spec.nodeName
              - name: POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: MYSQL_ROOT_USER
                value: root
              - name: MYSQL_ROOT_PASSWORD
                value: YWJjMTIzCg==
              - name: TZ
                value: Asia/Shanghai
              - name: LANG
                value: en_US.UTF-8
            image: mysql:5.7.31
            imagePullPolicy: IfNotPresent
            livenessProbe:
              exec:
                command:
                - /bin/bash
                - -c
                - mysql -u${MYSQL_ROOT_USER} -p${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'
              initialDelaySeconds: 30
              periodSeconds: 30
              timeoutSeconds: 10
            ports:
            - containerPort: 3306
              name: mysql
              protocol: TCP
            readinessProbe:
              exec:
                command:
                - /bin/bash
                - -c
                - mysql -u${MYSQL_ROOT_USER} -p${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'
              initialDelaySeconds: 30
              periodSeconds: 30
              timeoutSeconds: 10
            volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysql-data-dir
            - mountPath: /etc/mysql/conf.d/
              name: mysql-config
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          securityContext: {}
          terminationGracePeriodSeconds: 10
          volumes:
          - name: mysql-data-dir
            hostPath:
              path: /data/k8s_data/mysql
              type: DirectoryOrCreate
          - name: mysql-config
            configMap:
              name: mysql-cm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    配置 mysql cronjob

    • 和 deployment 的一样,需要给节点打上 mysql-back= 的标签
    • 注意 schedule 的时间是和 controller-manager 组件的时区一样的,如果是 kubeadm 部署的,就要注意容器内的时间是不是和本地相差八小时
    ---
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: mysql-backup
      namespace: bigdata
    spec:
      schedule: "0 1 * * *"
      successfulJobsHistoryLimit: 3
      failedJobsHistoryLimit: 3
      jobTemplate:
        spec:
          template:
            spec:
              affinity:
                nodeAffinity:
                  requiredDuringSchedulingIgnoredDuringExecution:
                    nodeSelectorTerms:
                    - matchExpressions:
                      - key: mysql-back
                        operator: Exists
              containers:
              - name: mysql-backup
                imagePullPolicy: IfNotPresent
                image: mysql:5.7.31
                env:
                  - name: MYSQL_ROOT_USER
                    value: root
                  - name: MYSQL_ROOT_PASSWORD
                    value: YWJjMTIzCg==
                  - name: MYSQL_HOST
                    value: mysql-svc.bigdata.svc.cluster.local
                  - name: TZ
                    value: Asia/Shanghai
                  - name: LANG
                    value: en_US.UTF-8
                command:
                - /bin/sh
                - -c
                - |
                  set -ex
                  mysqldump --host=${MYSQL_HOST} --user=${MYSQL_ROOT_USER} \
                            --password=${MYSQL_ROOT_PASSWORD} \
                            --routines --all-databases --single-transaction \
                            > /mysql-backup/mysql-$(date +"%Y%m%dT%H_%M_%S").sql && find /mysql-backup/ -type f -mtime +3 -exec rm -rf {} \;
                volumeMounts:
                - name: mysql-backup
                  mountPath: /mysql-backup
              restartPolicy: OnFailure
              volumes:
              - name: mysql-backup
                hostPath:
                  path: /data/k8s_data/mysql-back
                  type: DirectoryOrCreate
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    配置 mysql-web

    配置 mysql-web svc

    • 如果有 ingress,可以配置成 clusterip 的模式
    • 如果没有 ingress,可以配置成 nodeport 的模式
    • 下面两个都配置了,可以各取所需
      • 下面的 nodeport 配置了 30003 端口,需要检查一下自己本地有没有被占用,也可以自己随意修改,端口范围值一般是 30000-32767,具体要看 apiserver 的配置
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: bigdata
      name: phpmyadmin
      labels:
        app: phpmyadmin
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
        name: http
      selector:
        app: phpmyadmin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: bigdata
      name: phpmyadmin-np
      labels:
        app: phpmyadmin
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
        name: http-np
        nodePort: 30003
      selector:
        app: phpmyadmin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    配置 mysql-web deployment

    • 下面的 PMA_HOST 需要替换成自己的 mysql 地址
    • 下面的 PMA_PORT 需要替换成自己的 mysql 端口
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
      labels:
        app: phpmyadmin
      name: phpmyadmin
      namespace: bigdata
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: phpmyadmin
      template:
        metadata:
          annotations:
          labels:
            app: phpmyadmin
        spec:
          containers:
          - name: phpmyadmin
            image: phpmyadmin/phpmyadmin:latest
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
            env:
            - name: PMA_HOST
              value: mysql-svc.bigdata.svc.cluster.local
            - name: PMA_PORT
              value: "3306"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    pod 变成 running 之后,就可以通过 ip 加 nodeport 的方式来访问了,使用 mysql 数据库内的用户名和密码登录,可以自己先提前在 mysql 数据库里面创建好

  • 相关阅读:
    自知则知之做做做做做做做做做做做做做
    Tomcat - 初始化流程分析
    ES 客户端 RestHighLevelClient Connection reset by peer 亲测有效 2022-11-05
    毕业设计 基于单片机的地震探测器系统 - stm32 物联网 嵌入式
    vs2022+resharper创建模板——实现在新建文件的时候自动生成防卫式声明和自定义语句
    【UE5 Cesium】18-Cesium for Unreal 建立飞行跟踪器(3)
    企业微信怎么统计客户数量
    路径规划之规划节点和连接节点中规划节点的序号代码
    K8S:容器隔离
    计算机毕业设计Java陕菜食谱网站(源码+系统+mysql数据库+lw文档)
  • 原文地址:https://blog.csdn.net/u010383467/article/details/133518673