写在最前

根据你自身的需求选择任意一种部署方式,如果是新人可以先看之前的篇章来完成基础环境的安装与配置。

1. 前置要求

  1. 二进制部署任意版本docker

2. docker 部署

https://hub.docker.com/_/mysq

mkdir -p /data/mysql8/conf /data/mysql8/data

docker run -d \
  --privileged=true \
  --name mysql8 \
  --restart=always \
  -p 3306:3306 \
  -v /data/mysql8/conf:/etc/mysql/conf.d \
  -v /data/mysql8/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=test-db \
  mysql:8.0.20 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_bin

2.1 错误1

如果出现 --initialize specified but the data directory has files in it. Aborting. 异常,请尝试加上 --privileged=true 以超级权限运行。

2.2 错误2

最新的MySQL模块并未完全支持MySQL 8.0的caching_sha2_password加密方式,而MySQL 8.0中默认仍然是caching_sha2_password加密方式,因此用户认证不通过了。

图片-kzki.png

注意,我是为了个人开发便捷将root设置为允许远程连接,生产禁止此操作。

# 1. 进入容器
docker exec -it mysql8 /bin/bash
# 2. 登录mysql
mysql -u root -p
# 3. 更新root密码规则为 mysql_native_password ,允许root远程连接,并且设密码为123456
alter user 'root'@'%' identified with mysql_native_password by '123456';
# 4. 刷新权限
flush privileges;

3. Kubernetes 部署

namespace 我统一设置为 basic ,自行修改存储类相关配置

3.1 secret

MYSQL_ROOT_PASSWORD 值是123456

apiVersion: v1
kind: Secret
metadata:
  namespace: basic
  labels: {}
  name: mysql-secret
type: Opaque
spec:
  template:
    metadata:
      labels: {}
data:
  MYSQL_ROOT_PASSWORD: MTIzNDU2

3.2 configmap

修改全局字符集

kind: ConfigMap
apiVersion: v1
metadata:
  name: mysql8-conf
  namespace: basic
  annotations:
    kubesphere.io/creator: admin
data:
  my.cnf: |
    [client]
    default-character-set=utf8mb4

    [mysql]
    default-character-set=utf8mb4

    [mysqld]
    init_connect='SET collation_connection = utf8mb4_bin'
    init_connect='SET NAMES utf8mb4'
    character_set_server = utf8mb4
    collation_server = utf8mb4_bin
    skip-character-set-client-handshake
    skip-name-resolve

3.3 deployment

kind: Deployment
apiVersion: apps/v1
metadata:
  name: mysql8
  namespace: basic
  labels:
    app: mysql8
  annotations:
    deployment.kubernetes.io/revision: '6'
    kubesphere.io/creator: admin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql8
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mysql8
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/imagepullsecrets: '{}'
        kubesphere.io/restartedAt: '2024-09-18T07:33:09.888Z'
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
        - name: mysql8-data
          persistentVolumeClaim:
            claimName: mysql8-data
        - name: mysql8-conf
          configMap:
            name: mysql8-conf
            defaultMode: 420
      containers:
        - name: container-6m2r7f
          image: 'mysql:8.0.20'
          ports:
            - name: http-3306
              containerPort: 3306
              protocol: TCP
            - name: http-33060
              containerPort: 33060
              protocol: TCP
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: MYSQL_ROOT_PASSWORD
          resources: {}
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
            - name: mysql8-data
              mountPath: /var/lib/mysql
            - name: mysql8-conf
              readOnly: true
              mountPath: /etc/mysql/conf.d
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

3.4 service

使用nodeport方式连接

kind: Service
apiVersion: v1
metadata:
  name: mysql8
  namespace: basic
  labels:
    app: mysql8
  annotations:
    kubesphere.io/creator: admin
spec:
  ports:
    - name: http-3306
      protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 31205
  selector:
    app: mysql8
  type: NodePort
  sessionAffinity: None
  externalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  internalTrafficPolicy: Cluster

4. 操作总结

部署5.x很简单,但是为啥部署8.x会那么复杂多坑,可能是他的镜像做的有问题吧启动起来还不能直接使用晕死了。