K8S配置MySQL主从自动水平扩展

news2024/11/24 15:28:40

前提环境

操作系统Ubuntu 22.04
K8S 1.28.2集群(1个master+2个node)
MySQL 5.7.44部署在K8S的主从集群
metrics-server v0.6.4

概念简介

在K8s中扩缩容分为两种
Node层面:对K8s物理节点扩容和缩容,根据业务规模实现物理节点自动扩缩容
Pod层面:一般会使用Deployment中的Replicas参数,设置多个副本集来保证服务的高可用,但是这是一个固定的值,比如设置10个副本,就会启10个pod同时Running来提供服务。如果这个服务平时流量很少的时候,也是10个Pod同时在Running,而流量突然暴增时,又可能出现10个Pod不够用的情况,针对这种情况就要使用自动扩容和缩容

HPA(Horizontal Pod Autoscaling)

Pod水平自动伸缩,HPA可以根据CPU利用率自动伸缩一个Replication
Controller、Deployment或者Replica Set 中的Pod 数量
(1)HPA基于Master上的kube-controller-manager服务启动参数horizontal-pod-autoscaler-sync-period定义的时长(默认为30秒),周期性的检测Pod的CPU使用率
(2)HPA与之前的RC、Deployment一样,也属于一种Kubernetes资源对象。通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理
(3)metrics-server也需要部署到集群中, 它可以通过resource metrics API对外提供度量数据
HPA是kubernetes中实现自动扩缩容Pod副本数量的机制,它允许集群中的工作负载根据实际的负载情况自动调整pod的数量,以此来优化资源的使用和提高服务的响应能力

核心概念

●水平扩展(Horizontal Scaling):增加Pod的数量来分摊负载,与垂直扩展(增加单个Pod的资源)相对
●Pod副本(Pod Replicas):运行应用程序的容器实例,通常是在Deployment或ReplicaSet等控制器下管理的
●指标(Metrics):用于触发HPA扩缩容的度量值,如CPU使用率、内存使用量、自定义的应用程序指标等 HPA的关键参数
●ScaleTargetRef:指定HPA将要作用的资源对象,如 Deployment、Replica Set或RC的名称
●MinReplicas:最小副本数,即使在负载很低时也不会低于这个数量
●MaxReplicas:最大副本数,即使在负载很高时也不会超过这个数量
●Metrics:定义用于触发伸缩的度量标准和目标值。例如,可以设置CPU的利用率目标,当实际利用率超过这个目标值时,HPA会增加副本数量;当利用率低于目标值时,HPA会减少副本数量

安装metrics-server

简介

Kubernetes Metrics Server是Cluster核心监控数据的聚合器,kubeadm默认是不部署的。Metrics
Server供dashboard等其他组件使用,是一个扩展的APIServer,依赖于API Aggregator Metrics
API只可查询当前的度量数据,不保存历史数据,Metrics API
URI为/apis/metrics.k8s.io/,在k8s.io/metrics下维护。必须部署metrics-server才能使用该API,metrics-server通过调用kubelet
Summary API获取数据 Metrics Server从Kubelet收集资源指标,并通过Metrics
API将它们暴露在Kubernetes apiserver中,供水平Pod Autoscaler和垂直Pod
Autoscaler使用。kubectl top还可以访问Metrics API,这使得调试自动伸缩变得更容易。Metrics
Server不用于非自动伸缩,例如不要将其指标转发给监视解决方案,或作为监视解决方案指标的来源

下载地址

https://github.com/kubernetes-sigs/metrics-server/releases
$ wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.4/components.yaml

修改metrics-server启动参数
metrics-server会请求每台节点的kubelet接口来获取监控数据,但节点的kubelet使用的是自签证书,若metrics-server直接请求kubelet接口,将产生证书校验失败的错误,因此需要在components.yaml文件中加上–kubelet-insecure-tls启动参数。 由于metrics-server官方镜像仓库存储在k8s.gcr.io,如果无法拉取,可以使用阿里云仓库registry.aliyuncs.com/google_containers/metrics-server:v0.6.4

$ vim components.yaml

将文件按照截图中修改
在这里插入图片描述

$ kubectl apply -f components.yaml
$ kubectl get pods -n kube-system -l k8s-app=metrics-server

在这里插入图片描述

$ kubectl top nodes

在这里插入图片描述

$ kubectl top pods -n mysql-ns

在这里插入图片描述
在k8s-master节点上安装压测工具sysbench

$ sudo apt -y install sysbench

在mysql的master上创建测试数据库

$ kubectl exec -it mysql-0 -c mysql -n mysql-ns -c mysql -- bash -c "mysql -uroot -p'' -e 'create database sbtest;'"

注意:这里创建的sbtest测试库名,是lua脚本默认的库名,如果创建其他库名,需要改lua脚本 导入测试数据

$ sysbench --mysql-host=10.244.169.190 --mysql-port=3306 --mysql-user=root --mysql-password='' /usr/share/sysbench/oltp_common.lua --tables=10  --table_size=10000 prepare
--mysql-host=10.244.169.190 #master主库的pod IP
--mysql-port=3306 #master主库端口
--mysql-user=root #数据库用户名
--mysql-password='' #数据库密码
/usr/share/sysbench/oltp_common.lua#导入数据的lua脚本
--tables=10#创建测试表的数量
--table_size=10000#每张表10000行数据

在这里插入图片描述

实时监控pod中mysql容器的cpu和内存状态

$ watch -n 1 kubectl top pods --containers -n mysql-ns

在这里插入图片描述

开始压测

$ sysbench --threads=4 --time=20 --report-interval=5 --mysql-host=10.244.169.190 --mysql-port=3306 --mysql-user=root --mysql-password='' /usr/share/sysbench/oltp_read_write.lua --tables=10  --table_size=10000 run
--threads=4 #使用的线程数
--time=20 #最大执行时间
--report-interval=5 #间隔5秒统计信息

在这里插入图片描述
在这里插入图片描述

/usr/share/sysbench/oltp_read_write.lua#读写测试脚本,在/usr/share/sysbench/下有很多测试脚本可以使用,同时可以看到mysql主库的资源在发生变化
在这里插入图片描述

修改StatefulSet清单文件mysql-sts.yaml,添加资源限制

$ vim mysql-sts.yaml

在这里插入图片描述

$ kubectl apply -f  mysql-sts.yaml 

注意:由于更新了pod的资源限制,pod会发生重建操作,所以这个资源配额一定要在集群安装的初始时设置
配置HPA清单文件mysql-hpa.yaml

$ vim mysql-hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: mysql-hpa
  namespace: mysql-ns
spec:
  minReplicas: 3
  maxReplicas: 5
  targetCPUUtilizationPercentage: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: StatefulSet
    name: mysql
    
$ kubectl create -f  mysql-hpa.yaml
$ kubectl get hpa -n mysql-ns

测试HPA功能

查看mysql-read这个只读service的IP

$ kubectl get svc -n mysql-ns

压测(读)

$ sysbench --threads=6 --time=30 --report-interval=5 --mysql-host=10.99.87.143 --mysql-port=3306 --mysql-user=root --mysql-password='' /usr/share/sysbench/oltp_read_only.lua --tables=10  --table_size=10000 run

在这里插入图片描述

监控mysql主从集群中各个pod资源占用(读压测开始前就监控)

$ watch -n 1 kubectl top pods --containers  -n mysql-ns

在这里插入图片描述

$ watch -n 1 kubectl get hpa -n mysql-ns -o wide

在这里插入图片描述

$ kubectl get pod -n mysql-ns --watch

在这里插入图片描述

通过以上监控可以发现,当HPA监测到targets的百分比超过了设置值,就会向statefulset请求并新增副本直到低于targets的百分比,或者达到maxReplicas的设定值。例如,原来mysql主从集群中副本数量(master数量+slave数量)共3个,所以HPA控制StatefulSet控制器新建副本,从而维持在targets目标的3%以下
当数据库的读压力降下来之后,HPA控制StatefulSet减少副本数量至minReplicas的值(需要等待一段时间)

$ watch -n 1 kubectl top pods --containers -n mysql-ns

在这里插入图片描述

$ kubectl get pod -n mysql-ns --watch

在这里插入图片描述

$ kubectl get hpa -n mysql-ns -o wide

在这里插入图片描述

$ kubectl get pod -n mysql-ns

在这里插入图片描述
以上为在K8S中配置MySQL主从水平扩展流程,哪里不懂可以在评论中评论~
文档持续更新中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字媒体技术基础:色度子采样(4:4:4、4:2:2 、4:2:0)

在数字视频处理中,色度子采样 Chroma Subsampling可以用于压缩视频文件的大小,同时在大多数情况下保持较高的视觉质量,它的原理基于人类视觉系统对亮度 Luminance比对色度 Chrominance更加敏感这一特点。 一、 采样格式的表示方法 色度子采样…

一个技巧实现在SharePoint中使用Copilot

前几天写了在onedrive中使用copilot对单个文件进行提问汇总分析与对多个文件进行比较汇总提问等: Copilot重磅更新!OneDrive全新功能炸裂 很多小伙伴表示特别受用。 于是他们在纷纷尝试了一段时间后,开始把目光转向SharePoint和teams文件&a…

tkinter库的应用小示例:文本编辑器

tkinter库的应用小示例:文本编辑器 要 求: 创建一个文本编辑器,功能包括,创建、打开、编辑、保存文件。一个Button小组件,命名为btn_open,用于打开要编辑的文件,一个Button小组件,命名为btn_s…

Dockerfile 详解

Dockerfile是自定义Docker镜像的一套规则,由多条指令构成,每条指令都会对应于Docker镜像中的每一层,因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析: 1. FROM 功能:指定待扩展的父级镜像&#…

JavaScript 访问者模式:打造高扩展性的对象结构

一. 前言 在面向对象编程中,访问者模式(Visitor Pattern)是一种行为设计模式,它允许我们向现有的类结构添加新的操作,而无需修改这些类。这对于需要对类层次结构中的元素进行复杂算法处理的场景非常有用。 本文将详细…

【硬件模块】HC-08蓝牙模块

蓝牙模块型号 HC-08蓝牙模块实物图 HC-08蓝牙模块引脚介绍 STATE:状态输出引脚。未连接时,则为低电平。连接成功时,则为高电平。可以在程序中作指示引脚使用; RXD:串口接收引脚。接单片机的 TX 引脚(如…

多线程(三):线程等待获取线程引用线程休眠线程状态

目录 1、等待一个线程:join 1.1 join() 1.2 join(long millis)——"超时时间" 1.3 join(long millis,int nanos) 2、获取当前线程的引用:currentThread 3、休眠当前进程:sleep 3.1 实际休眠时间 3.2 sleep的特殊…

Canvas:AI协作的新维度

在人工智能的浪潮中,OpenAI的最新力作Canvas,不仅是一款新工具,它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面,让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…

LeetCode 面试经典150题 Z字形变换

题目: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你…

无人机无线电侦测核心技术详解

无人机无线电侦测核心技术主要涉及频谱分析、信号处理、定位技术以及智能化识别等多个方面。以下是对这些核心技术的详细解析: 1. 频谱分析技术 频谱探测技术:通过分析信号在频域上的分布和特性,来识别、测量和定位无线电信号。在无人机侦测…

leetcode 491.非递减子序列

1.题目要求: 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。 …

Python | Leetcode Python题解之第477题汉明距离总和

题目: 题解: class Solution:def totalHammingDistance(self, nums: List[int]) -> int:n len(nums)ans 0for i in range(30):c sum(((val >> i) & 1) for val in nums)ans c * (n - c)return ans

BUUCTF-Business Planning Group1

下载是一张PNG图片, 使用010editor打开发现尾部有隐藏文件 把这段16进制字符串复制到新文件并改名为1.bpg 使用bpgviewer软件查看 Release Simple BPG Image viewer asimba/pybpgviewer GitHub Notes: large images will be scaled to fit screen areabasic s…

[单master节点k8s部署]40.安装harbor

harbor 是私有镜像仓库,用来存储和分发镜像的 。docker 还有一个官方的镜像仓库 docker hub,免费用户只能简单的使用,创建一个私有镜像仓库,存储镜像,付费用户才可以拥有更多权限,默认 docker pull 拉取镜像…

nginx搭建视频下载站

目录 1.前言与介绍 2.atuoindex模块介绍 3.主要的功能 4.下载站基本要求 5.具体配置 6.做完如上的配置重载服务 7.创建密码文件 8.在windows主机上做域名解析 9.查看统计结果 1.前言与介绍 前面的学习中根据nginx的简单的配置实现了根据 IP 端口 和 域名 实现虚…

MySQL-三范式 视图

文章目录 三范式三范式简介第一范式第二范式第三范式 表设计一对一一对多多对多最终的设计 视图 三范式 三范式简介 所谓三范式, 其实是表设计的三大原则, 目的都是为了节省空间, 但是三范式是必须要遵守的吗? 答案是否定的(但是第一范式必须遵守) 因为有时候严格遵守三范式…

AI开发-三方库-Hugging Face-Tokenizer

1 需求 需求1:from transformers import AutoTokenizer 需求2:from transformers import BertTokenizer 2 接口 关键参数 textpaddingtruncationreturn_tensors 3 示例 BertTokenizer.from_pretrained() PreTrainedTokenizer PreTrainedTokenizerBa…

医疗图像之基于Unet++的息肉分割

第一步:准备数据 息肉分割数据,总共有1000张 第二步:搭建模型 UNet,这是一种旨在克服以上限制的新型通用图像分割体系结构。如下图所示,UNet由不同深度的U-Net组成,其解码器通过重新设计的跳接以相同的分…

CountUp.js 实现数字增长动画 Vue

效果&#xff1a; 官网介绍 1. 安装 npm install --save countup.js2. 基本使用 // template <span ref"number1Ref"></span>// script const number1Ref ref<HTMLElement>() onMounted(() > {new CountUp(number1Ref.value!, 9999999).sta…

C语言 | Leetcode C语言题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; int totalHammingDistance(int* nums, int numsSize) {int ans 0;for (int i 0; i < 30; i) {int c 0;for (int j 0; j < numsSize; j) {c (nums[j] >> i) & 1;}ans c * (numsSize - c);}return ans; }