kubernetes-v1.23.3 部署 MySQL-5.7.31

文章目录

    • @[toc]
    • 部署 MySQL
      • 配置 mysql configmap
      • 配置 mysql svc
      • 配置 mysql deployment
      • 配置 mysql cronjob
    • 配置 mysql-web
      • 配置 mysql-web svc
      • 配置 mysql-web deployment

部署 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

配置 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

配置 mysql deployment

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

kubectl label node <nodename> mysql=
---
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

配置 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

配置 mysql-web

  • phpmyadmin-github
  • phpmyadmin-docker-github
  • 这个是 mysql 的图形化界面

配置 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

配置 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"

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

你可能感兴趣的:(Kubernetes,MySQL,kubernetes,mysql,adb)