如何在Kubernetes上部署主从MySQL

在现代应用程序中,数据库是不可或缺的一部分。MySQL作为一个流行的关系型数据库,可以通过Kubernetes(K8s)来实现高可用性和易于管理的部署。本文将带领大家实现“K8s部署主从MySQL”的过程。

部署流程

步骤 描述
步骤1 准备MySQL Docker镜像
步骤2 创建ConfigMap和Secret
步骤3 创建主数据库的Deployment和Service
步骤4 创建从数据库的Deployment和Service
步骤5 测试主从数据库的连接

详细步骤

步骤1:准备MySQL Docker镜像

我们需要使用MySQL的Docker镜像。可以使用以下命令下载MySQL镜像:

docker pull mysql:5.7
# 使用MySQL 5.7版本的镜像

步骤2:创建ConfigMap和Secret

使用ConfigMap和Secret来配置MySQL数据库。这包括数据库名称、用户名和密码等信息。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  MYSQL_DATABASE: "mydb"
  MYSQL_ROOT_PASSWORD: "rootpassword"
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_USER: bXl1c2Vy # base64 encode of 'myuser'
  MYSQL_PASSWORD: bXlwYXNzd29yZA== # base64 encode of 'mypassword'

步骤3:创建主数据库的Deployment和Service

我们现在需要创建MySQL主节点的部署和服务。以下YAML文件定义了MySQL主节点。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-master
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      role: master
  template:
    metadata:
      labels:
        app: mysql
        role: master
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
          - name: MYSQL_DATABASE
            valueFrom:
              configMapKeyRef:
                name: mysql-config
                key: MYSQL_DATABASE
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              configMapKeyRef:
                name: mysql-config
                key: MYSQL_ROOT_PASSWORD
          - name: MYSQL_USER
            valueFrom:
              secretKeyRef:
                name: mysql-secret
                key: MYSQL_USER
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-secret
                key: MYSQL_PASSWORD
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-master
spec:
  type: ClusterIP
  ports:
    - port: 3306
  selector:
    app: mysql
    role: master

步骤4:创建从数据库的Deployment和Service

接下来,创建MySQL从节点的定义。可以使用类似的方式,仅修改角色和配置。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-slave
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      role: slave
  template:
    metadata:
      labels:
        app: mysql
        role: slave
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
          - name: MYSQL_DATABASE
            valueFrom:
              configMapKeyRef:
                name: mysql-config
                key: MYSQL_DATABASE
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              configMapKeyRef:
                name: mysql-config
                key: MYSQL_ROOT_PASSWORD
          - name: MYSQL_USER
            valueFrom:
              secretKeyRef:
                name: mysql-secret
                key: MYSQL_USER
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-secret
                key: MYSQL_PASSWORD
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave
spec:
  type: ClusterIP
  ports:
    - port: 3306
  selector:
    app: mysql
    role: slave

步骤5:测试主从数据库的连接

在完成上述步骤后,可以通过连接主数据库和从数据库来验证配置的正确性。

# 连接主节点
kubectl exec -it <mysql-master-pod-name> -- mysql -u myuser -p
# 在提示时输入 'mypassword'

# 连接从节点
kubectl exec -it <mysql-slave-pod-name> -- mysql -u myuser -p
# 同样在提示时输入 'mypassword'

序列图

下面是一个Kubernetes中MySQL主从复制的序列图示:

sequenceDiagram
    participant Master as MySQL Master
    participant Slave as MySQL Slave
    participant App as Application
    
    App->>Master: 向主节点发送写请求
    Master-->>App: 处理请求,发送响应
    Master->>Slave: 复制数据
    Slave-->>Master: 确认接收数据

饼状图

下面是Kubernetes中MySQL实例的角色分布饼图示:

pie
    title MySQL实例角色分布
    "Master": 50
    "Slave": 50

结尾

通过上述步骤,你应该能够在Kubernetes上成功部署主从MySQL数据库体系。这个简单的架构不仅能提高数据库的可用性,还能实现负载均衡和数据冗余,希望你能在实际项目中熟练运用!