准备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地址直接对外暴露”的章节。

- 本文部署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)配置文件。
yaml文件下载链接:https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/database/scripts/mysql_deployment.yaml
下面yaml文件编辑内容和上面链接中下载的一致,为了方便可以直接通过链接下载。
1 | vim mysql_deployment.yaml
|
编辑内容如下:
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 | 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"的标签。
1
kubectl get nodes
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端口。