Skip to content

019数据库之单节点MySQL8部署(对比版)

docker版(极度简洁,推荐)

首先,把下面的文本保存为docker-compose.yaml文件

yaml
version: '3'
services:
  mysql:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:8.0  # 原镜像`mysql:8.0`
    container_name: mysql8                                    # 容器名为'mysql8'
    restart: unless-stopped                                               # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
    volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
      - "./mysql/my.cnf:/etc/mysql/my.cnf"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/mysql-files:/var/lib/mysql-files"
    environment: # 设置环境变量,相当于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      MYSQL_ROOT_PASSWORD: root         # 设置root用户密码
      MYSQL_DATABASE: demo              # 初始化的数据库名称
    privileged: true
    user: root
    ports: # 映射端口
      - "13306:3306"

然后,执行脚本即可

shell
mkdir ./mysql/
cat << EOF > ./mysql/my.cnf
[mysqld]
user=mysql                            # MySQL启动用户
default-storage-engine=INNODB         # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4          # 设置mysql服务端默认字符集
collation-server=utf8mb4_general_ci   # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
default-authentication-plugin=mysql_native_password
max_connections=1000    # 允许最大连接数
max_connect_errors=100  # 最大错误连接数
[mysql]
default-character-set=utf8mb4  # 设置mysql服务端默认字符集
[client]
default-character-set=utf8mb4  # 设置mysql客户端默认字符集
EOF
docker-compose -f docker-compose.yaml -p mysql8 up -d

k8s版(极度麻烦,不推荐)

理由:配置特别的麻烦,而且会和应用抢性能。数据库本身就不属于频繁变更的资源,最好是用docker-compose部署,或者直接部署在物理机上。

官方文档

https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/

pv.yaml

yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-share-all # 表示这个是公用的pv
spec:
  capacity:
    storage: 40Gi
  accessModes:
    - ReadWriteMany
    - ReadWriteOnce
    - ReadOnlyMany
  hostPath:
    path: "/mnt/data" # 对应宿主机上的路径,这个目录一定要是空的,如果里面已经有内容了,会导致mysql启动失败

pvc.yaml

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-single-mysql
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

secret.yaml

yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-single-mysql
  labels:
    app: pod-single-mysql
type: Opaque
data:
  # mysql-root-password需经过base64命令行下使用base64 <<< "密码",默认密码123456
  mysql-root-password: "MTIzNDU2"

configmap.yaml

yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: configmap-single-mysql
data:
  my.cnf: |
    [mysqld]
    user=mysql                            # MySQL启动用户
    default-storage-engine=INNODB         # 创建新表时将使用的默认存储引擎
    character-set-server=utf8mb4          # 设置mysql服务端默认字符集
    collation-server=utf8mb4_general_ci   # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
    default-authentication-plugin=mysql_native_password
    max_connections=1000    # 允许最大连接数
    max_connect_errors=100  # 最大错误连接数
    [mysql]
    default-character-set=utf8mb4
    [client]
    default-character-set=utf8mb4  # 设置mysql客户端默认字符集

deployment.yaml

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-single-mysql
spec:
  selector:
    matchLabels:
      app: pod-single-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: pod-single-mysql
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:8.0
          imagePullPolicy: IfNotPresent
          name: pod-single-mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: mysql-root-password
                  name: secret-single-mysql
            - name: TZ
              value: Asia/Shanghai
            - name: LANG
              value: en_US.UTF-8
            - name: MYSQL_DATABASE
              value: demo
          ports:
            - name: svc-mysql-1m0s
              containerPort: 3306
          volumeMounts:
            - name: vod-pv-single-mysql
              mountPath: /var/lib/mysql # mysql data的持久化文件
            - name: vod-cm-single-mysql
              mountPath: /etc/mysql/conf.d/ # mysql的 配置文件
          securityContext:
            privileged: true # 容器提权为拥有特权的容器,可对主机进行任何操作
      volumes:
        - name: vod-pv-single-mysql
          persistentVolumeClaim:
            claimName: pvc-single-mysql
        - name: vod-cm-single-mysql
          configMap:
            name: configmap-single-mysql
            items:
              - key: my.cnf
                path: my.cnf

service.yaml

yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-mysql-1m0s # 不能超过15个字符
  labels:
    app: pod-single-mysql
spec:
  type: NodePort
  ports:
    - port: 3306
      nodePort: 30006 # 范围 30000-32767
  selector:
    app: pod-single-mysql

single-mysql.yaml

yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-share-all # 表示这个是公用的pv
spec:
  capacity:
    storage: 40Gi
  accessModes:
    - ReadWriteMany
    - ReadWriteOnce
    - ReadOnlyMany
  hostPath:
    path: "/mnt/data" # 对应宿主机上的路径,这个目录一定要是空的,如果里面已经有内容了,会导致mysql启动失败
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-single-mysql
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Secret
metadata:
  name: secret-single-mysql
  labels:
    app: pod-single-mysql
type: Opaque
data:
  # mysql-root-password需经过base64命令行下使用base64 <<< "密码",默认密码123456
  mysql-root-password: "MTIzNDU2"
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: configmap-single-mysql
data:
  my.cnf: |
    [mysqld]
    user=mysql                            # MySQL启动用户
    default-storage-engine=INNODB         # 创建新表时将使用的默认存储引擎
    character-set-server=utf8mb4          # 设置mysql服务端默认字符集
    collation-server=utf8mb4_general_ci   # 数据库字符集对应一些排序等规则,注意要和character-set-server对应
    default-authentication-plugin=mysql_native_password
    max_connections=1000    # 允许最大连接数
    max_connect_errors=100  # 最大错误连接数
    [mysql]
    default-character-set=utf8mb4
    [client]
    default-character-set=utf8mb4  # 设置mysql客户端默认字符集
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-single-mysql
spec:
  selector:
    matchLabels:
      app: pod-single-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: pod-single-mysql
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:8.0
          imagePullPolicy: IfNotPresent
          name: pod-single-mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: mysql-root-password
                  name: secret-single-mysql
            - name: TZ
              value: Asia/Shanghai
            - name: LANG
              value: en_US.UTF-8
            - name: MYSQL_DATABASE
              value: demo
          ports:
            - name: svc-mysql-1m0s
              containerPort: 3306
          volumeMounts:
            - name: vod-pv-single-mysql
              mountPath: /var/lib/mysql # mysql data的持久化文件
            - name: vod-cm-single-mysql
              mountPath: /etc/mysql/conf.d/ # mysql的 配置文件
          securityContext:
            privileged: true # 容器提权为拥有特权的容器,可对主机进行任何操作
      volumes:
        - name: vod-pv-single-mysql
          persistentVolumeClaim:
            claimName: pvc-single-mysql
        - name: vod-cm-single-mysql
          configMap:
            name: configmap-single-mysql
            items:
              - key: my.cnf
                path: my.cnf
---
apiVersion: v1
kind: Service
metadata:
  name: svc-mysql-1m0s # 不能超过15个字符
  labels:
    app: pod-single-mysql
spec:
  type: NodePort
  ports:
    - port: 3306
      nodePort: 30006 # 范围 30000-32767
  selector:
    app: pod-single-mysql

执行脚本

shell
kubectl delete -f single-mysql.yaml
kubectl apply -f single-mysql.yaml

执行结果

success1.png

success2.png