k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用

简介: k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用

@TOC


前言

有任何疑问或不懂的地方均可评论或私信,欢迎交流

HPA简介

简单理解

HAP,全称 Horizontal Pod Autoscaler

简单来说就是根据指标来对pod副本数量进行自动控制
比如说cpu和内存使用率

HPA 定期检查内存和 CPU
使用率高就会自动创建多个副本(上限取决于自定义的数量)
使用率低就会关闭多个副本(下限取决于自定义的数量)

实际生产中,广泛使用这四类指标:
1、Resource metrics - CPU和内存利用率指标
2、Pod metrics - 例如网络利用率和流量
3、Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
4、Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容


详细解释

在 Kubernetes (k8s) 中,HPA 指的是 Horizontal Pod Autoscaler(水平 Pod 自动伸缩)。这是 Kubernetes 中用于自动调整 Pod 副本数量的机制,以应对负载的变化,确保应用程序的高可用性和资源的有效利用。


HPA 的工作原理

监控指标
HPA 通过 Kubernetes Metrics Server 或者其他自定义的指标(如 Prometheus),定期获取当前的负载情况。常见的指标包括 CPU 使用率、内存使用率、自定义指标(例如 QPS,查询每秒)等。

调整策略
根据定义的策略,HPA 会判断是否需要增加或减少 Pod 的数量。例如,如果 CPU 使用率超过预设的阈值,HPA 会增加 Pod 的数量;如果 CPU 使用率低于预设的阈值,HPA 会减少 Pod 的数量。


监控系统

HPA 依赖于监控系统提供的指标数据,常见的监控系统包括:

Kubernetes Metrics Server
提供基础的 CPU 和内存使用率数据。

Prometheus
一个更强大的监控系统,可以自定义多种指标,并与 Kubernetes 集成。

Datadog、New Relic 等第三方监控工具
可以提供更详细的应用监控数据。


负载模式

根据应用的负载模式配置 HPA 的策略:

周期性负载
如果应用负载有明显的周期性变化(如电商网站的流量在白天和晚上波动),可以根据历史数据调整 HPA 策略。

突发负载
对于突发性负载(如新闻网站在重大事件发生时流量激增),需要配置更灵活的伸缩策略,以快速响应负载变化。

持续增长负载
对于持续增长的负载(如新产品发布后的用户增长),需要确保 HPA 能够持续扩展并保持应用性能。

HPA 的优势

自动化伸缩
根据负载自动调整 Pod 数量,确保应用在高负载下能够提供足够的计算资源,而在低负载下又不浪费资源。

高可用性
通过及时增加 Pod 数量,防止应用因为资源不足而出现性能问题。

节约成本
通过在低负载时减少 Pod 数量,节省资源和成本。


使用 HPA 的注意事项

监控数据源
确保 Metrics Server 或者其他指标数据源的稳定性和准确性,否则 HPA 的调整可能不准确。

冷启动时间
在负载激增时,新增的 Pod 可能需要一些时间启动,应用需要考虑这一点,避免在短时间内出现资源不足的情况。

阈值设置
合理设置指标阈值,避免频繁的伸缩操作,造成系统的不稳定。


应用类型

HPA 适用于以下类型的应用:

Web 应用
具有高并发请求特点的应用,可以通过 HPA 在流量高峰时增加 Pod 数量,保证响应速度。

后台处理服务
如数据处理、消息队列消费者等,根据任务队列的长度或处理速度进行伸缩。

微服务架构
每个服务可以独立伸缩,HPA 可以根据每个服务的负载情况动态调整 Pod 数量

应用

虚拟机

环境

Ip 主机名 cpu 内存 硬盘
192.168.10.11 master01 2cpu双核 4G 100G
192.168.10.12 worker01 2cpu双核 4G 100G
192.168.10.13 worker02 2cpu双核 4G 100G

版本 centos7.9
已部署k8s-1.27

1.metircs-server部署

master上操作

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml

kubelet 证书需要由集群证书颁发机构签名

(或者通过向 Metrics Server 传递参数 --kubelet-insecure-tls 来禁用证书验证)。

更改文件

vim high-availability-1.21+.yaml

149行添加
image.png

解释
因为是虚拟机环境,这条命令是允许 kubelet 使用不安全的 TLS 连接,生产环境不建议使用,这里是便于快速部署和测试已看到效果。

kubectl apply -f high-availability-1.21+.yaml 
watch kubectl get pods -n kube-system

耐心等待,如果一直起不来就先删除pod再重启个节点docker。
image.png

kubectl top nodes

image.png

kubectl top pods -n kube-system

image.png

这里就部署好了,让我们来演示一下

2.HPA演示示例

(1)部署一个服务

mkdir hpa
cd hpa/
vim 01-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 100Mi
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
kubectl apply -f 01-nginx.yaml 
kubectl get pods

如果没有镜像可能会慢点,耐心等待即可
image.png

这是不是报错,是再重新拉取镜像,再耐心等待一下即可

好了
image.png

(2)创建HPA对象

这是一个 HorizontalPodAutoscaler (HPA) 对象的配置,它将控制 Deployment "nginx" 的副本数量。当 CPU 使用率超过 50% 时,HPA 将自动增加 Pod 的副本数量,最高不超过 10 个。

vim 02-nginx-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
kubectl apply -f 02-nginx-hpa.yaml 
kubectl get hpa

image.png

(3)执行压测

下载工具,查看服务ip

 yum -y install httpd-tools
  kubectl get svc

image.png

ab -c 1000 -n 100000000000 http://192.168.10.11:32435/

打开另一个终端查看
可以看到正在增加

kubectl get hpa

image.png

image.png

可以看到再不断变多

kubectl get hpa

指标会越来越小
image.png

image.png

10个是因为最高设置的10个

压力测试停止一段时间后查看

kubectl get pods

pod会越来越少
直到设置的最小数量
image.png

kubectl get hpa

image.png

大约5分钟以后

kubectl get hpa
kubectl get pods

image.png

image.png

可以看到pod数量已经到设置最小数量

至此
完成

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
9天前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
100 10
|
14天前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
53 13
|
13天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
27天前
|
Kubernetes Cloud Native API
深入理解Kubernetes——容器编排的王者之道
深入理解Kubernetes——容器编排的王者之道
41 1
|
1月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
1天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
14 2
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
72 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
143 17