---
title: 准备K8s部署MySQL的YAML文件
description: "本文部署以概述中图1组网方式为例，3个MySQL Pod分别部署在3个计算节点上，外部client访问K8s集群内部的3个MySQL Pod有2种方式："
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmysqlmgr_03_0021.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmysqlmgr_03_0021.html
indexId: cc1bffd4c9566ab7a1245e4bcdd7e097bc010498c10aa5e359a9cfef70d71cd772
---
# 准备K8s部署MySQL的YAML文件

本文部署以概述中图1组网方式为例，3个MySQL Pod分别部署在3个计算节点上，外部client访问K8s集群内部的3个MySQL Pod有2种方式：

- 方式1：
  通过YAML文件中3个kind: Service中dbport的nodePort使得MySQL Pod被外部client访问，即外部client可以通过主节点间接访问mysql Pod，外部client访问3个MySQL时用的IP地址为主节点IP地址（192.168.200.10），端口分别为30001、30002、30003（例如YAML文件中kind: Service，name: dbport，nodePort: 30001）。


- 方式2：
  将mysql Pod的Pod IP地址网段（10.99.0.0/16）路由到主节点的IP地址（192.168.200.10），主节点也有10.99.0.0/16网段的IP地址，所以外部client可以通过主节点直接访问MySQL Pod的Pod IP地址，外部client访问3个MySQL时用的IP地址为3个MySQL Pod的Pod IP地址，端口都是3306（YAML文件中kind: Service，name: dbport，port: 3306）。具体操作就是在gateway上配置静态路由，例如"route add -net 10.99.0.0/16 gw 192.168.200.10"，详细可见《Kube-OVN组件 用户指南》中“Pod IP地址直接对外暴露(https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/Kubernetes/kunpengkubeovn_06_0028.html)”的章节。


- 本文部署Kube-OVN绑定使用enp3s0的网口名（10GE网卡）以提升网络带宽（避免使用默认网关的板载网卡），为实现该绑网口方式部署Kube-OVN，需要在安装Kube-OVN前修改install.sh的参数，指定IFACE参数为"enp3s0"，详细可见  安装Kube-OVN 1.2.1
中install.sh文件的IFACE参数。
- 由于不使用网络存储服务，选择使用物理机本地存储MySQL的数据及配置文件，所以要求MySQL Pod必须部署在指定的物理机上，避免MySQL Pod被K8s自动调度到没有数据和配置文件的其他计算节点上。


本文以部署3个MySQL Pod为例，在K8s的主节点物理机上编写部署yaml（例如文件名称为mysql_deployment.yaml(https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/database/scripts/mysql_deployment.yaml)）配置文件。

下面YAML文件编辑内容和上面链接中下载的一致，为了方便可以直接通过链接下载。

```
vim mysql_deployment.yaml
```

编辑内容如下：

```
apiVersion: v1
kind: Namespace
metadata:
   name: ns-mysql-test
   labels:
     name: ns-mysql-test
---
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: ns-mysql-test
spec:
  protocol: IPv4
  cidrBlock: 10.99.0.0/16
  excludeIps:
  - 10.99.0.1..10.99.0.10
  gateway: 10.99.0.1
  namespaces:
  - ns-mysql-test
  private: false
  gatewayType: distributed
  natOutgoing: false
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: mysql-1
  name: mysql-1
  namespace: ns-mysql-test
  annotations:
    ovn.kubernetes.io/ip_address: 10.99.0.15
    ovn.kubernetes.io/mac_address: 00:00:00:53:6B:B6
spec:
  nodeSelector:
    test: "mysql-test-1"
  hostAliases:
  - ip: "10.99.0.15"
    hostnames:
    - "mysql-1"
  - ip: "10.99.0.16"
    hostnames:
    - "mysql-2"
  - ip: "10.99.0.17"
    hostnames:
    - "mysql-3"
  containers:
  - name: mysql-1
    image: mymysql/centos8-mysql-arm:8.0.19
    resources:
      limits:
        cpu: 16
        memory: 64Gi
    ports:
    - name: mysql-port
      containerPort: 3306
    - name: copy-port
      containerPort: 33061
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: test123
    - name: MYSQL_ROOT_HOST
      value: "%"
    volumeMounts:
    - name: mysql-data
      mountPath: "/data/mysql/data"
    - name: mysql-log
      mountPath: "/data/mysql/log"
    - name: mysql-run
      mountPath: "/data/mysql/run"
    - name: mysql-tmp
      mountPath: "/data/mysql/tmp"
    - name: mysql-cnf
      mountPath: "/etc/my.cnf"
  volumes:
  - name: mysql-data
    hostPath:
      path: "/data/mysql/mysql_1/data"
      type: DirectoryOrCreate
  - name: mysql-log
    hostPath:
      path: "/data/mysql/mysql_1/log"
      type: DirectoryOrCreate
  - name: mysql-run
    hostPath:
      path: "/data/mysql/mysql_1/run"
      type: DirectoryOrCreate
  - name: mysql-tmp
    hostPath:
      path: "/data/mysql/mysql_1/tmp"
      type: DirectoryOrCreate
  - name: mysql-cnf
    hostPath:
      path: "/data/mysql/mysql_1/mysql_arm.cnf"
      type: FileOrCreate
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: mysql-2
  name: mysql-2
  namespace: ns-mysql-test
  annotations:
    ovn.kubernetes.io/ip_address: 10.99.0.16
    ovn.kubernetes.io/mac_address: 00:00:00:53:6B:B7
spec:
  nodeSelector:
    test: "mysql-test-2"
  hostAliases:
  - ip: "10.99.0.15"
    hostnames:
    - "mysql-1"
  - ip: "10.99.0.16"
    hostnames:
    - "mysql-2"
  - ip: "10.99.0.17"
    hostnames:
    - "mysql-3"
  containers:
  - name: mysql-2
    image: mymysql/centos8-mysql-arm:8.0.19
    resources:
      limits:
        cpu: 16
        memory: 64Gi
    ports:
    - name: mysql-port
      containerPort: 3306
    - name: copy-port
      containerPort: 33061
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: test123
    - name: MYSQL_ROOT_HOST
      value: "%"
    volumeMounts:
    - name: mysql-data
      mountPath: "/data/mysql/data"
    - name: mysql-log
      mountPath: "/data/mysql/log"
    - name: mysql-run
      mountPath: "/data/mysql/run"
    - name: mysql-tmp
      mountPath: "/data/mysql/tmp"
    - name: mysql-cnf
      mountPath: "/etc/my.cnf"
  volumes:
  - name: mysql-data
    hostPath:
      path: "/data/mysql/mysql_2/data"
      type: DirectoryOrCreate
  - name: mysql-log
    hostPath:
      path: "/data/mysql/mysql_2/log"
      type: DirectoryOrCreate
  - name: mysql-run
    hostPath:
      path: "/data/mysql/mysql_2/run"
      type: DirectoryOrCreate
  - name: mysql-tmp
    hostPath:
      path: "/data/mysql/mysql_2/tmp"
      type: DirectoryOrCreate
  - name: mysql-cnf
    hostPath:
      path: "/data/mysql/mysql_2/mysql_arm.cnf"
      type: FileOrCreate
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: mysql-3
  name: mysql-3
  namespace: ns-mysql-test
  annotations:
    ovn.kubernetes.io/ip_address: 10.99.0.17
    ovn.kubernetes.io/mac_address: 00:00:00:53:6B:B8
spec:
  nodeSelector:
    test: "mysql-test-3"
  hostAliases:
  - ip: "10.99.0.15"
    hostnames:
    - "mysql-1"
  - ip: "10.99.0.16"
    hostnames:
    - "mysql-2"
  - ip: "10.99.0.17"
    hostnames:
    - "mysql-3"
  containers:
  - name: mysql-3
    image: mymysql/centos8-mysql-arm:8.0.19
    resources:
      limits:
        cpu: 16
        memory: 64Gi
    ports:
    - name: mysql-port
      containerPort: 3306
    - name: copy-port
      containerPort: 33061
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: test123
    - name: MYSQL_ROOT_HOST
      value: "%"
    volumeMounts:
    - name: mysql-data
      mountPath: "/data/mysql/data"
    - name: mysql-log
      mountPath: "/data/mysql/log"
    - name: mysql-run
      mountPath: "/data/mysql/run"
    - name: mysql-tmp
      mountPath: "/data/mysql/tmp"
    - name: mysql-cnf
      mountPath: "/etc/my.cnf"
  volumes:
  - name: mysql-data
    hostPath:
      path: "/data/mysql/mysql_3/data"
      type: DirectoryOrCreate
  - name: mysql-log
    hostPath:
      path: "/data/mysql/mysql_3/log"
      type: DirectoryOrCreate
  - name: mysql-run
    hostPath:
      path: "/data/mysql/mysql_3/run"
      type: DirectoryOrCreate
  - name: mysql-tmp
    hostPath:
      path: "/data/mysql/mysql_3/tmp"
      type: DirectoryOrCreate
  - name: mysql-cnf
    hostPath:
      path: "/data/mysql/mysql_3/mysql_arm.cnf"
      type: FileOrCreate
---
apiVersion: v1
kind: Service
metadata: 
  name: mysql-1-service
  namespace: ns-mysql-test
spec:
  type: NodePort
  selector:
    app: mysql-1
  ports:
    - name: dbport
      protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 30001
    - name: cpport
      protocol: TCP
      port: 33061
      targetPort: 33061
      nodePort: 30061
---
apiVersion: v1
kind: Service
metadata: 
  name: mysql-2-service
  namespace: ns-mysql-test
spec:
  type: NodePort
  selector:
    app: mysql-2
  ports:
    - name: dbport
      protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 30002
    - name: cpport
      protocol: TCP
      port: 33061
      targetPort: 33061
      nodePort: 30062
---
apiVersion: v1
kind: Service
metadata: 
  name: mysql-3-service
  namespace: ns-mysql-test
spec:
  type: NodePort
  selector:
    app: mysql-3
  ports:
    - name: dbport
      protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 30003
    - name: cpport
      protocol: TCP
      port: 33061
      targetPort: 33061
      nodePort: 30063
```


在该配置文件中配置了：

- 1个名称为“ns-mysql-test”的命名空间。
- 1个作用在ns-mysql-test命名空间的子网，子网网段为10.99.0.0/16。
- 3个MySQL的Pod，Pod名称分别为“mysql-1”、“mysql-2”、“mysql-3”，固定Pod IP地址和MAC，Pod IP地址分别为“10.99.0.15”、“10.99.0.16”、“10.99.0.17”。
- 3个MySQL Pod内的默认配置文件路径“/etc/my.cnf”、数据目录“/data/mysql/data”、日志目录“/data/mysql/log”、运行时目录“/data/mysql/run”、临时目录“/data/mysql/tmp”，分别映射到了其所在物理机上对应上述YAML文件中"volumes"所配置的文件目录，需要注意mysql_arm.cnf文件中配置的datadir、log-error、tmpdir、socket、pid-file等文件目录信息要与yaml配置文件中volumeMounts的配置目录一致，否则将无法使mysql的数据信息保存到物理机的存储磁盘上而导致数据丢失。
- 为了防止mysql-1、mysql-2、mysql-3部署在相同物理机上时存储文件发生重叠，所以使用“/data/mysql/mysql_1”、“/data/mysql/mysql_2”、“/data/mysql/mysql_3”分别作为三者的存储目录。
- 3个MySQL都使用自构建的mymysql/centos8-mysql-arm:8.0.19镜像来实例化容器。
- 3个MySQL的root密码，分别通过MYSQL_ROOT_PASSWORD环境变量，都设置为了"test123"。
- 3个MySQL都分别配置了3306的数据库业务端口和预留33061端口用于主从复制。
- mysql-1、mysql-2、mysql-3分别使用nodeSelector来配置其将部署的目标物理机node（需要相应node上配置相应标签），本示例yaml配置文件将3个MySQL Pod分别部署在了test="mysql-test-1"、test="mysql-test-2"、test="mysql-test-3"三个节点上，为达到指定node部署的效果，另外还需要在对应node上分别打上test="mysql-test-1"、test="mysql-test-2"、test="mysql-test-3"的标签。
  先在master节点上查看当前集群内node情况：

  1 kubectl get nodes

  1 2 3 4 5 NAME STATUS ROLES AGE VERSION centos-10 Ready master 42h v1.18.5 node-test-1 Ready <none> 42h v1.18.5 node-test-2 Ready <none> 42h v1.18.5 node-test-3 Ready <none> 42h v1.18.5

  本文以将三个MySQL Pod分别部署到三个node-test-1、node-test-2、node-test-3三个节点为例，使用kubectl label nodes命令分别配置三个节点的标签：

  1 2 3 kubectl label nodes node-test-1 test=mysql-test-1 kubectl label nodes node-test-2 test=mysql-test-2 kubectl label nodes node-test-3 test=mysql-test-3

  应用YAML文件的部署，即可将三个MySQL Pod分别部署到三个不同的node上。

  网络规划中Pod的网络不能与node的网络重叠。 三个MySQL若部署到相同node上时，它们在物理机上的数据保存目录不能重叠。 以上命名空间、子网网段、Pod数据保存目录、IP地址、MAC、部署节点、MySQL root密码、CPU、内存使用限制等信息配置，请以实际需求按规则配置。 需要部署MySQL的节点上，请确保已导入mymysql/centos8-mysql-arm:8.0.19镜像。

- 3个Service服务，类型为NodePort，分别将三个MySQL Pod的3306端口映射到物理机的30001、30002、30003端口，并将三个MySQL Pod的33061端口分别映射到物理机的30061、30062、30063端口。
