K8S 中部署 MySQL 时通过 ConfigMap 设置自定义配置

添加一个 ConfigMap 并添加一个名为 my.cnf 的 Key :

apiVersion: v1
data:
  my.cnf: |
    [client]
    default-character-set=utf8mb4

    [mysql]
    default-character-set=utf8mb4

    [mysqld]
    character-set-server=utf8mb4
    default-time-zone='+08:00'
kind: ConfigMap
metadata:
  labels:
    app: jiajia-mysql
  name: jiajia-mysql-test
  namespace: jiajia-test
  

在部署清单文件中,在 spec.volumes 中定义一个 configMap 类型的 volume ,然后在 containers.volumeMounts 将这个 volume 挂载到 MySQL 自定义配置文件的目录(/etc/mysql/conf.d/)。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: jiajia-mysql
  name: jiajia-mysql
  namespace: jiajia-test
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  selector:
    matchLabels:
      app: jiajia-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: jiajia-mysql
    spec:
      affinity:
        nodeAffinity: {}
      containers:
      - env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql-root-password
              name: jiajia-mysql
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql-password
              name: jiajia-mysql
              optional: true
        - name: MYSQL_USER
        - name: MYSQL_DATABASE
        image: mysql:5.7.30
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: data
        - mountPath: /etc/mysql/conf.d/
          name: my-conf-volume
          readOnly: true
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: jiajia-mysql
      - configMap:
          defaultMode: 420
          items:
          - key: my.cnf
            path: my.cnf
          name: jiajia-mysql-test
        name: my-conf-volume
  

完整的 yaml 文件

apiVersion: v1
data:
my.cnf: |-
    [mysqld]
    character-set-server=utf8
run.sh: ""
kind: ConfigMap
  
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: jiajia-mysql
  name: jiajia-mysql
  namespace: jiajia-test
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  selector:
    matchLabels:
      app: jiajia-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: jiajia-mysql
    spec:
      affinity:
        nodeAffinity: {}
      containers:
      - env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql-root-password
              name: jiajia-mysql
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql-password
              name: jiajia-mysql
              optional: true
        - name: MYSQL_USER
        - name: MYSQL_DATABASE
        image: mysql:5.7.30
        imagePullPolicy: IfNotPresent
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        name: jiajia-mysql
        ports:
        - containerPort: 3306
          name: mysql
          protocol: TCP
        readinessProbe:
          exec:
            command:
            - sh
            - -c
            - mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          requests:
            cpu: 100m
            memory: 256Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: data
        - mountPath: /etc/mysql/conf.d/
          name: my-conf-volume
          readOnly: true
      dnsPolicy: ClusterFirst
      initContainers:
      - command:
        - rm
        - -fr
        - /var/lib/mysql/lost+found
        image: busybox:1.32
        imagePullPolicy: IfNotPresent
        name: remove-lost-found
        resources:
          requests:
            cpu: 10m
            memory: 10Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: data
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: default
      serviceAccountName: default
      terminationGracePeriodSeconds: 30
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: jiajia-mysql
      - configMap:
          defaultMode: 420
          items:
          - key: my.cnf
            path: my.cnf
          name: jiajia-mysql-test
        name: my-conf-volume