容器技术
ubuntu使用APT安装docker并指定版本
Helm部署与使用
Helm常用命令
从Helm仓库创建应用流程示例
Helm部署与使用
K8S中部署mysql-ha高可用集群
helm启动mysql-ha
helm几个常用仓库
Kubernetes使用helm部署Mysql-Ha
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
k8s之yaml文件详解
将 MySQL 通过 bitpoke/mysql-operator 部署到 k8s 内部
k8s pvc扩容:pvc创建后扩容
K8S性能分析
部署Metrics Server
Kubernetes集群搭建
kubespray 部署常见问题和优化汇总
kubernetes-sigs/kubespray at release-2.15
K8S-pod配置文件详解
KubeSphere知识库
在 Kubernetes 上最小化安装 KubeSphere
卸载 KubeSphere 和 Kubernetes
KubeSphere 应用商店
修改pod中容器的时区
k8s之Pod安全策略
Harbor 登陆失败,用户名或者密码不正确。405 Not Allowed
Docker-leanote_n1
kubesphere/kubekey
Kubernetes Static Pod (静态Pod)
kubernets kube-proxy的代理 iptables和ipvs - 30岁再次出发 - 博客园
k8s生产实践之获取客户端真实IP - SSgeek - 博客园
kube-proxy ip-tables故障解决
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
prometheus operator 监控redis-exporter
Helm3 安装 ElasticSearch & Kibana 7.x 版本
kubernete强力删除namespace_redis删除namespace命令
EFK (Elasticsearch + Fluentd + Kibana) 日志分析系统
k8s日志收集实战(无坑)
fluentd收集k8s集群pod日志
Elasticsearch+Fluentd+Kibana 日志收集系统的搭建
TKE/EKS之configmap,secret只读挂载
K8s基于Reloader的ConfigMap/Secret热更新
使用 Reloader 实现热部署_k8s reloader
k8s使用Reloader实现更新configmap后自动重启pod
在 Kubernetes 上对 gRPC 服务器进行健康检查 | Kubernetes
Kubernetes ( k8s ) gRPC服务 健康检查 ( livenessProbe ) 与 就绪检查 ( readinessProbe )
排查kubernetes中高磁盘占用pod
helm 安装 MongoDB 集群
helm 安装 Redis 1 主 2 从 3哨兵
【k8s】使用 Reloader 实现热部署
k8s证书过期,更新后kubelet启动失败
kubeadm证书/etcd证书过期处理
三种监控 Kubernetes 集群证书过期方案
K8s 集群(kubeadm) CA 证书过期解决方案
k8s调度、污点、容忍、不可调度、排水、数据卷挂载
5分钟搞懂K8S的污点和容忍度(理论+实战)
Kubernetes进阶-8基于Istio实现微服务治理
macvlan案例配置
快速解决Dockerhub镜像站无法访问问题
info_scan开源漏洞扫描主系统部署
本文档使用 MrDoc 发布
-
+
首页
helm启动mysql-ha
> 1)本文使用 helm 启动 mysql-ha > 2)生产高可用集群: [《helm 启动 mysql-ha》](https://blog.csdn.net/xingzuo_1840/article/details/119678627) > 3)其他部署方式:[《docker-compose 启动 mysql》](https://blog.csdn.net/xingzuo_1840/article/details/119699576)、[《helm 启动单节点 mysql》](https://blog.csdn.net/xingzuo_1840/article/details/119680019) > 4))web 管理工具推荐 :[《k8s 启动 phpmyadmin》](https://blog.csdn.net/xingzuo_1840/article/details/119674505) ## 1\. 下载 cart 包 ```shell NAME CHART VERSION APP VERSION DESCRIPTION aliyuncs/mysql 6.8.0 8.0.19 Chart to create a Highly available MySQL cluster aliyuncs/mysqldump 2.6.0 2.4.1 A Helm chart to help backup MySQL databases usi... aliyuncs/mysqlha 1.0.0 5.7.13 MySQL cluster with a single master and zero or ... ``` 说明: aliyuncs/mysql 这个是单机的, aliyuncs/mysqlha 这个是 HA 的 说明:加了两个参数,不下载 tar 包,直接是目录。 ## 2\. 修改配置文件 按需求修改 `values.yaml` 即可。 ## 2.1 修改镜像(离线部署需要) 如果不能连接公网,将镜像下载后上传私有仓库,在配置文件中修改如下两处为私有仓库镜像。 ```yml mysqlImage: harbocto.xxx.com.cn/public/mysql:5.7.13 xtraBackupImage: harbocto.xxx.com.cn/public/gcr-xtrabackup:1.0 ``` ## 2.2 用户名密码 本次只修改了 root 密码,其他见下文说明 ```yaml mysqlha: replicaCount: 3 mysqlRootPassword: Bxx888888 mysqlReplicationUser: repl ``` 说明:上边配置文件可见 - root 密码: mysqlRootPassword: - 普通用户: mysqlUser: - 普通用户密码: mysqlPassword - 新建数据库:mysqlDatabase: ## 2.3 修改存储大小 默认 10g,此处修改为 300g ```yaml persistence: enabled: true accessModes: - ReadWriteOnce size: 300Gi ``` 说明:因为我的 k8s 集群设定了默认 storageclass,所以此处不用指定 ## 3\. 创建 msyql 集群 ## 3.1 创建 ```shell [root@DoM01 mysqlha] [root@DoM01 mysqlha] [root@DoM01 mysqlha] ``` ## 3.2 输出说明 > 创建完成输出如下: ```shell NAME: mysqlha LAST DEPLOYED: Mon Aug 16 17:16:16 2021 NAMESPACE: mysql STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The MySQL cluster is comprised of 3 MySQL pods: 1 master and 2 slaves. Each instance is accessible within the cluster through: <pod-name>.mysqlha `mysqlha-0.mysqlha` is designated as the master and where all writes should be executed against. Read queries can be executed against the `mysqlha-readonly` service which distributes connections across all MySQL pods. To connect to your database: 1. Obtain the root password: kubectl get secret --namespace mysql mysqlha -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo 2. Run a pod to use as a client: kubectl run mysql-client --image=harbocto.boe.com.cn/public/mysql:5.7.13 -it --rm --restart='Never' --namespace mysql -- /bin/sh 3. To connect to Master service (read/write): mysql -h mysqlha-0.mysqlha -u root -p 4. To connect to slave service (read-only): mysql -h mysqlha-readonly -u root -p ``` 从输出我么可以看到如下几点: ```shell kubectl get secret --namespace mysql mysqlha -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo ``` - **写连接 `mysqlha-0.mysqlha`** 从“3.2 查看”中,我们可以知道这是一个 Handless 的 service 因此 `"pod_name"."service_name"` 可以直接访问到后端的指定 pod 我们这里的 mysql-ha-mysqlha-0 即是我们的主库(写库) - **读连接 `mysqlha-readonly`** ## 3.3 查看 ```shell [root@DoM01 ~] NAME READY STATUS RESTARTS AGE mysqlha-0 2/2 Running 0 81m mysqlha-1 2/2 Running 0 80m mysqlha-2 2/2 Running 0 80m ``` > 从 3.2 的输出可以看到,mysqlha0 是我们的 master,其它两个是 slave。 ```shell [root@DoM01 ~] NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysqlha ClusterIP None <none> 3306/TCP 81m mysqlha-readonly NodePort 10.1.61.20 <none> 3306/TCP 81m ``` > - mysqlha-readonly: 连接读库,一会儿我们可以修改成 nodeport 让它对外提供服务。 > - mysqlha: > 经测试,如果直接连接,会随机分给后边的任何一个 pod(一会儿 master 一会 slave) > - 连接写库: > 同 namespace 中的服务,连接 `mysqlha-0.mysqlha:3306`, > 如果是其它 namespace 中的服务,需要访问 `mysqlha-0.mysqlha.mysql:3306` > 如果是集群外部要用,我们将在后文 4.2 中创建一个写库的 service。 ``` [root@DoM01 mysqlha]# kubectl get pvc -n mysql NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-mysqlha-0 Bound pvc-1b5b3e8d-3106-4f87-a33e-18c36342f2ef 300Gi RWO nfs-client 89m data-mysqlha-1 Bound pvc-5ab9d655-0f20-4d17-80df-b25e0b58aabd 300Gi RWO nfs-client 88m data-mysqlha-2 Bound pvc-002914c3-d55c-42fd-bde7-a5aed1da3417 300Gi RWO nfs-client 88m ``` ## 4\. 修改端口 > 如果一开始你在 value.yaml 里修改了,这里就不用修改了。 ## 4.1 修改只读端口 用 edit 命令修改即可 ``` [root@DoM01 ~]# kubectl get service -n mysql NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysqlha ClusterIP None <none> 3306/TCP 81m mysqlha-readonly NodePort 10.1.61.20 <none> 3306:30006/TCP 81m ``` ## 4.2 映射读写实例端口 - **为什么自己写一个 service** mysql-ha-mysqlha 是一个 Headless 类型的 service, 在 k8s 集群内部,我们可以通过它直接找到只读实例或者读写实例, 但是外部不可以访问,且它是不可以修改成 nodeport 类型的。所以我们自己写一个 service。 - **为 service 选择 pod 的标签** 从安装时的输出信息(本文 3.2 )可知,`mysqlha-0` 这个 pod 是我们的读写库,因此我们 service 的 `selector` 唯一指向是它即可 用 edit 命令我们可以看下 `mysqlha-0` ```yml metadata: creationTimestamp: "2021-08-16T09:16:16Z" generateName: mysqlha- labels: app: mysqlha controller-revision-hash: mysqlha-86f767d8bd statefulset.kubernetes.io/pod-name: mysqlha-0 ``` 分析三个 label,只有 `statefulset.kubernetes.io/pod-name: mysqlha-0` 可以唯一指向读写库,且不发生变化。 - **写 service 的 yml 文件** 我们使用刚才找到的标签 ```yml apiVersion: v1 kind: Service metadata: labels: app: mysqlha-m name: mysqlha-m namespace: mysql spec: ports: - name: mysql-ha-mysqlha-m nodePort: 31009 port: 3306 protocol: TCP targetPort: 3306 selector: statefulset.kubernetes.io/pod-name: mysqlha-0 type: NodePort ``` ```shell [root@DoM01 mysql] NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysqlha ClusterIP None <none> 3306/TCP 21h mysqlha-m NodePort 10.1.105.237 <none> 3306:30007/TCP 22m mysqlha-readonly NodePort 10.1.61.20 <none> 3306:30006/TCP 21h ``` > 30007 即时我们的读写端口。
adouk
2023年1月13日 09:37
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码