所有分类
  • 所有分类
  • 未分类

K8S-安装MySQL8(单机)

简介

本文介绍K8S部署MySQL8(单机)的方法。

本文的目标

1.通过PV和PVC(hostPath方式)存储MySQL的数据
2.通过Deployment、Service部署MySQL8,并通过NodePort暴露给外部
3.使用Navicat进行测试

官网网址

运行一个单实例有状态应用 | Kubernetes

所需的文件

文件下载地址

概述

1.持久化PV存储方式

数据库必须持久化数据,否则节点重启后数据就没了。PV和PVC可以对数据持久化,支持多种方式:
hostPath、NFS、RDB等等。数据要节点共享的,否则如果节点在其他机器上启动了,就无法访问到数据了。所以,生产环境一般采用这些方式:NFS挂载、用云服务器的RDB等。

本文为了简单,只部署一个MySQL节点,使用hostPath方式,不支持节点共享。

2.持久化PV分配方式

本文我直接手动预先创建。生产环境应该通过StorageClass采用Dynamic Provisioning。

3.数据库高可用

数据库一般要配置主从或者集群,实现高可用。一般使用StatefulSet部署,StatefulSet用于管理有状态应用的负载均衡,管理一组Pod的实现、扩容、缩容,并保证它们的顺序和唯一性。

StatefulSets维护的Pod有唯一的、持久的身份和稳定的主机名,不用管它们位于哪个节点上。即使StatefulSet中的Pod发生故障,存储卷与新Pod进行匹配也很容易。

1.创建PV和PVC存储

先创建目录:

mkdir -p /work/devops/k8s/app/mysql/mnt

创建名为 pv.yaml的文件,内容如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  namespace: db
  labels:
    type: db-pv
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/work/devops/k8s/app/mysql/mnt"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: db
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

创建pv:

kubectl apply -f pv.yaml

查看PV

kubectl get pv mysql-pv

 结果:(创建成功)

查看PVC

kubectl get pvc -A

或者

get pvc mysql-pvc -n db

结果 (创建成功,绑定到了mysql-pv)

2.创建MySQL应用

1.创建命名空间

用于数据库相关应用。

创建名为db-namespace.yaml的文件,内容如下:

# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: db
  labels:
    name: db

执行命令创建它:

kubectl apply -f db-namespace.yaml

2.创建MySQL应用

这里用Configmap配置MySQL、用Deployment部署mysql镜像、用Service将MySQL暴露出来。

这里只能用ConfigMap,因为PV不能挂载单个文件,只能挂载目录。ConfigMap可以单独挂载配置文件。(想要挂载单个文件可以用hostPath方式)。

创建名为k8s.yaml的文件,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: db
data:
  my.cnf: |-
    [client]
    default-character-set=utf8mb4
     
    [mysql]
    default-character-set=utf8mb4
     
    [mysqld]
    #服务端口号 默认3306
    port=3306
     
    # 数据路径,默认是/var/lib/mysql/
    #datadir = /app/data/
     
    init_connect='SET NAMES utf8mb4'
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
     
    # 最大连接数
    max_connections=200
     
    # 连接失败的最大次数。防止有人从该主机试图攻击数据库系统
    max_connect_errors=20
 
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  namespace: db
spec:
  replicas: 1
  selector:
    matchLabels:
      name: mysql
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
        - name: mysql8
          image: mysql:8.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3306
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
            - name: MYSQL_USER
              value: admin
            - name: MYSQL_PASSWORD
              value: "222333"
          volumeMounts:
            - name: volume
              mountPath: /var/lib/mysql/
              subPath: data
            - name: volume
              mountPath: /var/log/mysql/
              subPath: log
            - name: config
              mountPath: /etc/mysql/conf.d/my.cnf
              # subPath: my.cnf  #有的镜像必须指定subPath才能成功,比如nacos。
      volumes:
      - name: volume
        persistentVolumeClaim:
          claimName: mysql-pvc
      - name: config
        configMap:
          name: mysql-config
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: db
  labels:
    app: mysql
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 30005
  selector:
    name: mysql

查看结果(已成功启动)

kubectl get pods -A

结果

3.用Navicat测试

用Navicat测试连接:(连接成功)

0

评论1

请先

  1. 创建MYSQL应用报错CreateContainerConfigError咋办?
    zixuegjw 2024-10-05 0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录