Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 工作笔记

  • K8S

    • kubectl常用命令
    • Kubernetes核心概念详解:Namespace、Pod、Deployment、PV和PVC
    • Kubernetes之yaml文件详解
    • k8s部署MySQL
    • Kubernetes (k8s) 相关名词详解
    • PV、PVC、StorageClass的区别和联系
  • Systemd

  • Nginx

  • Supervisord

  • OpenLdap

  • OpenVPN

  • GitLab

  • Sshd

  • WebDev

  • Docker

  • Prometheus

  • Rclone

  • Iptables

  • Firewalld

  • Linux笔记
  • K8S
Carry の Blog
2022-03-29

k8s部署MySQL原创

在Kubernetes中部署MySQL可以使用官方提供的Docker镜像,也可以使用第三方的MySQL镜像。下面我们以官方MySQL镜像为例,介绍如何在Kubernetes中部署MySQL。

  1. 创建Persistent Volume(持久化存储):

    MySQL需要持久化存储来保存数据。在Kubernetes中,可以使用Persistent Volume来提供持久化存储。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  hostPath:
    path: /mnt/data/mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14

上面的示例定义了一个名为 mysql-pv 的Persistent Volume,它使用 hostPath 指定了持久化存储的路径。请注意,这种方式只适用于单节点Kubernetes集群。在多节点Kubernetes集群中,应该使用网络存储(例如NFS或GlusterFS)来提供持久化存储。

  1. 创建Persistent Volume Claim(持久化存储声明):

    在使用Persistent Volume之前,需要先创建一个Persistent Volume Claim来声明所需的存储空间。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage

1
2
3
4
5
6
7
8
9
10
11
12

上面的示例定义了一个名为 mysql-pvc 的Persistent Volume Claim,它声明了需要1GB的持久化存储空间。

  1. 创建ConfigMap:

    在Kubernetes中,可以使用ConfigMap来管理应用程序的配置信息。可以将MySQL的配置信息保存在ConfigMap中,然后在Pod中使用环境变量的方式来引用ConfigMap中的配置信息。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  my.cnf: |-
    [mysqld]
    bind-address=0.0.0.0
    max_connections=1000
    innodb_buffer_pool_size=256M
    ...

1
2
3
4
5
6
7
8
9
10
11
12

上面的示例定义了一个名为 mysql-config 的ConfigMap,它保存了MySQL的配置信息。

  1. 创建Secret: MySQL需要一个root密码来访问数据库。在Kubernetes中,可以使用Secret来保存敏感数据(例如密码)。
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  password: cGFzc3dvcmQ=

1
2
3
4
5
6
7
8

上面的示例定义了一个名为 mysql-secret 的Secret,它保存了MySQL的root密码(base64编码后的字符串)。

  1. 创建Deployment: Deployment是Kubernetes中的一种资源对象,用于创建并管理Pod的副本集。可以使用它来确保应用程序在Kubernetes集群中始终运行所需数量的Pod副本。

    因此,定义一个名为mysql-deployment的Deployment资源对象意味着您正在创建一个用于管理MySQL数据库Pod副本的资源对象。这个Deployment可以指定要运行的Pod副本数、要使用的镜像、要使用的存储卷、要使用的环境变量、要使用的服务等。

    在Kubernetes中,可以使用Deployment来创建和管理Pod。可以将MySQL的Docker镜像、持久化存储、ConfigMap和Secret等信息都保存在Deployment中。

    在Kubernetes集群中,可以使用kubectl create命令和YAML文件来创建此类型的资源对象。例如,下面是一个创建名为mysql-deployment的Deployment资源对象的示例YAML文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:latest
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

上面的YAML文件指定了一个名为mysql-deployment的Deployment资源对象,其中有3个Pod副本。它使用了MySQL的最新镜像,指定了MySQL的root密码,并将持久存储卷挂载到Pod的/var/lib/mysql路径下。此外,它还指定了一个名为mysql-pvc的持久卷声明。

  1. 创建Service:

    可以使用Service资源对象来公开应用程序中运行的Pod的网络服务。Service提供了一个固定的IP地址和端口号,以便其他应用程序可以连接到应用程序的Pod。因此,您可以使用Service来公开MySQL数据库Pod的网络服务,以便其他应用程序可以连接到它。

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - name: mysql-port
      protocol: TCP
      port: 3306
      targetPort: 3306
  type: ClusterIP

1
2
3
4
5
6
7
8
9
10
11
12
13
14

上面的YAML文件指定了一个名为mysql-service的Service资源对象,它使用了app: mysql标签选择与mysql-deployment相同的Pod。它公开了MySQL的TCP端口3306,并将该端口映射到Pod中的TCP端口3306。最后,它使用ClusterIP类型将服务公开到集群内部网络,以便其他应用程序可以通过mysql-service名称和端口号3306连接到MySQL数据库。

可以使用kubectl create命令和上面的YAML文件来创建名为mysql-service的Service资源对象:

kubectl create -f mysql-service.yaml

1
2
  1. 部署MySQL: 将上面的所有YAML文件保存为单独的文件,然后使用 kubectl apply 命令将它们部署到Kubernetes中。
$ kubectl apply -f mysql-pv.yaml
$ kubectl apply -f mysql-pvc.yaml
$ kubectl apply -f mysql-config.yaml
$ kubectl apply -f mysql-secret.yaml
$ kubectl apply -f mysql-deployment.yaml
$ kubectl apply -f mysql-service.yaml


1
2
3
4
5
6
7
8

部署完成后,可以使用以下命令检查MySQL的状态:

$ kubectl get pods
$ kubectl logs mysql-deployment-<pod-id>
$ kubectl exec -it mysql-deployment-<pod-id> -- mysql -uroot -p

1
2
3
4
上次更新: 4/24/2025

← Kubernetes之yaml文件详解 Kubernetes (k8s) 相关名词详解→

最近更新
01
tidb fast ddl
04-04
02
TiDB配置文件调优 原创
04-03
03
如何移除TiDB中的表分区 原创
04-03
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式