k8s 部署 MySQL 并修改配置文件

在 Kubernetes (k8s) 环境中部署 MySQL 数据库是一种常见的需求。本文将详细介绍如何在 k8s 中部署 MySQL,并展示如何修改其配置文件以满足特定需求。

流程图

首先,让我们通过一个流程图来概述整个部署过程:

flowchart TD
    A[开始] --> B[创建 MySQL 镜像]
    B --> C[创建 Kubernetes 部署文件]
    C --> D[创建 Kubernetes 服务文件]
    D --> E[部署 MySQL 实例]
    E --> F[修改 MySQL 配置文件]
    F --> G[完成]

旅行图

接下来,我们将通过旅行图来展示每个步骤的详细过程:

journey
    title k8s 部署 MySQL 并修改配置文件
    section 创建 MySQL 镜像
      step1: 定义 MySQL Dockerfile
      step2: 构建 MySQL 镜像
    section 创建 Kubernetes 部署文件
      step3: 定义 MySQL Deployment YAML
      step4: 定义 MySQL Service YAML
    section 部署 MySQL 实例
      step5: 创建 Deployment 和 Service
    section 修改 MySQL 配置文件
      step6: 挂载 ConfigMap 到 Pod
      step7: 应用新的配置文件
    section 完成
      step8: 验证 MySQL 实例

步骤详解

1. 创建 MySQL 镜像

首先,我们需要创建一个包含所需配置的 MySQL 镜像。这可以通过编写一个 Dockerfile 来实现。

FROM mysql:5.7

# 复制自定义配置文件
COPY my.cnf /etc/mysql/my.cnf

然后,构建镜像:

docker build -t my-mysql:5.7 .

2. 创建 Kubernetes 部署文件

接下来,我们需要创建一个 Kubernetes 部署文件来定义 MySQL 实例。以下是一个示例 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: my-mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        emptyDir: {}

3. 创建 Kubernetes 服务文件

为了使 MySQL 实例可访问,我们需要创建一个 Kubernetes 服务文件:

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

4. 部署 MySQL 实例

现在,我们可以使用以下命令部署 MySQL 实例:

kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml

5. 修改 MySQL 配置文件

为了修改 MySQL 配置文件,我们可以创建一个 ConfigMap 并将其挂载到 Pod 中:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  my.cnf: |
    [mysqld]
    max_connections = 500

然后,更新 Deployment YAML 文件以挂载 ConfigMap:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: my-mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/my.cnf
          subPath: my.cnf
      volumes:
      - name: mysql-storage
        emptyDir: {}
      - name: mysql-config
        configMap:
          name: mysql-config

最后,重新部署 MySQL 实例:

kubectl apply -f mysql-deployment.yaml

6. 完成