1、2.有 1 个主节点(Master);有多个从节点(Slave);从节点需要能水平扩展;3.所有的写操作,只能在主节点上执行;读操作可以在所有节点上执行。这个主从模式的 MySQL 集群非常典型。我们通过一张图来表示。2、存储如果是自建kubernetes集群,你不懂golang开发的话,很难编写出CSI存储插件,存储类型可能会是你非常头疼的事情,但我们采用AWS EKS,这会让我们非常省心,因为AWS EKS已经帮我们做好了storageClass。采用storageClass,能够自动创建相应的pv和pvc,非常方便。运行有状态应用Mysql,我们需要用到块存储,即AWS EBS。AWS
2、EBS存储类型有:io1,gp2,gp3,sc1,st1。默认值:gp2。通过如下命令,可以查看AWS EKS帮我们做好的storageClass。默认只有gp2类型的,我们可以直接使用。$ kubectl get storageclass #或 $kubectl get sc#会输出如下内容NAME PROVISIONER AGEgp2 (default) kubernetes.io/aws-ebs 37m这个storageClass非常容易实现,它是由gp2-storage-class.yaml这个文件生成的,内容如下:apiVersion: storage.k8s.io/v1kind:
3、StorageClassmetadata: name: gp2annotations: storageclass.kubernetes.io/is-default-class: trueprovisioner: kubernetes.io/aws-ebsparameters: type: fsType: ext4如果,你想用其它类型的StorageClass,可以将配置文件中的type,更改为其它,如gp3。通过如下命令,即可创建。$ kubectl create -f gp2-storage-class.yaml3、命名空间namespace配置文件中,如果没有指定namespace,默认会
4、自动使用default,在生产环境中,最好是单独创建个命名空间,创建方法mysql-ns.yaml v1 Namespace mysql接下来使用如下命令创建namespace$kubectl create -f mysql-ns.yaml记得在secret、statufulset文件中,加上如下一行。metadata namespace:4、密钥Secret我们将数据库的帐号密码存在Secret中。Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码的安全隐患。这个转码操作也很简单,比如:$ echo -n root |base64cm9vdA=123456MTI
5、zNDU2然后使用如下文件如 mysql-secret.yaml Secret prod-db-secrettype: Opaquedata: password: MTIzNDU2 username: cm9vdA=接下来,我们尝试一下创建这个 Secret:$ kubectl create -f mysql-secret.yaml5、配置ConfigMap可能以前我们习惯在Deployment或Statufulset中写配置文件,我建议生产环境中,配置文件采用configmap。做mysql读写分离时,Master 节点和 Slave 节点需要有不同的配置文件。内容如下mysql-confi
6、g.yaml ConfigMap labels: app: f: | mysqld log-bin | mysqld super-read-only relay_log_info_repository=table master_info_repository=table relay_log_recovery = 1接下来,我们尝试一下创建这个 configmap:$ kubectl create -f mysql-configmap.yaml如果你的程序是之前一直是在mysql5.7上运行,你可能会用到如下configMap client default-character-set=utf8m
7、b4 mysql binlog_expire_logs_seconds=2592000 max_connections=10000 binlog_format=MIXED explicit_defaults_for_timestamp=true lower_case_table_names=1 max_allowed_packet=128M innodb-log-file-size=64M default-time-zone=+8:00 default-authentication-plugin=mysql_native_password character-set-client-handsh
8、ake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci secure_file_priv=/var/lib/mysqlsql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION#如果CM配置文件f部分没有relay_log_info_
9、repository=table、master_info_repository=table和relay_log_recovery=1那么最后一个从节点,始终不会正常。6、服务Service6.1集群内部访问我们通过Headless Service来实现集群内部的访问,见配置文件。mysql-service.yaml Servicespec: ports: - name: port: 3306 clusterIP: None selector:- mysql-read6.2集群外部访问如果你想通过navicat等工具,远程连接数据库,可以通过如下两种方法。方法一:通过nodePort,访问方式: nodeIP:30006mysql-service-nodeport.yaml#可读写 mysql-node-rw - po
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1