【从入门到放弃-Kubernetes】Kubernetes进阶-pod水平自动伸缩(hpa)

简介:

前言

前面 Kubernetes入门 系列,我们学习了k8s的基础知识和简单用法,今天开始我们继续进一步学习,了解一些复杂和高级用法。本文我们学习pod水平自动扩缩容即hpa。
hpa全称是Horizontal Pod Autoscaler,可以基于CPU的利用率或其它指标自动伸缩replication controller、deployment和 replica set 中的 pod 数量。
我们可以根据标准应用系统的CPU等指标的周期性变化情况,通过HPA进行动态扩缩容以此来提高集群的资源利用率。

准备

hpa通过metrics-server,监控集群运行指标触发扩缩容的,使用前需要先确保metrics-server是可用状态。

minikube addons list

观察metrics-server是否是可用状态,如果是disabled。则需要执行以下命令开启。

minikube addons enable metrics-server

此时执行kubectl top命令即可查看pod、node的cpu、memory的使用消耗情况。

如果想禁用metrics-server,disable即可

minikube addons disable metrics-server

启动应用并暴露服务

我们参考官方demo,使用PHP提供http服务,进行CPU密集型计算。观察CPU和pod自动扩缩容情况。

准备镜像

这里创建一个CPU密集型PHP脚本,并打成镜像。

也可以直接用我打好的镜像 registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0,跳过这一步,直接看Deployment。

文件及源码地址见:AloofJr

# Dockerfile
FROM php:7.4.6-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php
// index.php
<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-hpa-deployment
  labels:
    app: php-hpa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-hpa
  template:
    metadata:
      labels:
        app: php-hpa
    spec:
      containers:
      - name: php-hpa
        image: registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 200m

Service 暴露服务

apiVersion: v1
kind: Service
metadata:
  name: php-hpa-service
spec:
  type: ClusterIP
  selector:
    app: php-hpa
  ports:
    - port: 80

HPA

创建HPA

创建hpa设置pod扩缩最多和最少的数量以及执行扩缩容的条件。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-hpa-deployment
  minReplicas: 1 #pod最小数量
  maxReplicas: 10 #pod最大数量
  targetCPUUtilizationPercentage: 10 #cpu使用率超过10%进行扩容,小于10%缩容

观察HPA运行情况

kubectl get hpa

可以看到以下指标
TARGETS:目前CPU使用率是0%,10%是我们设置的扩缩容阙值。
MINPODS:pod最小数量
MAXPODS:pod最大数量
REPLICAS:当前副本数,因为我们的cpu使用率是0%,当前副本数是1。

增加负载

我们使用busybox,不断的对php-hpa-service发起http调用,增加服务端压力。

# 使用busybox并进入容器
kubectl run  -i --rm  --tty load-generator --image=busybox /bin/sh

# 不断发起http请求
while true; do wget -q -O- http://php-hpa-service; done

查看hpa情况

cpu利用率143%了,此时REPLICAS还是1,再等一会儿

可以看到REPLICAS已经扩到了10个pod,cpu负载平均到了35%,虽然比我们配置的10%高,但是扩到了最多MAXPODS 10个,所以不会继续扩容了

降低负载

停掉load-generator发压,等几分钟(可以通过--horizontal-pod-autoscaler-downscale-stabilization设置缩容冷却时间,默认五分钟)。

可以看到REPLICAS缩到了1个pod。

总结

上面介绍了根据CPU利用率进行HPA的操作,其实在实际工作中,HPA是一个非常复杂的课题,因为影响应用运行状态的不单单是CPU,会和内存、ERROR数、线程数等多项指标相关。

在扩容时,还要考虑资源额度、数据库连接数等。

在缩容时则需要更小心了,要时刻关注应用的运行状态,是很容易引发容量故障的。

更复杂的还有,应用系统是否非标、是CPU密集型还是内存密集型应用、系统的流量变化周期、如何应对突发流量等等。

欢迎感兴趣或有实战经验的大神们来交流探讨。

文件用到的yaml配置可以在AloofJr找到。

更多文章

见我的博客:https://nc2era.com

written by AloofJr,转载请注明出处

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
110 2
|
3月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
95 5
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
2月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
78 1
|
2月前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
139 3
|
2月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
57 3
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。

热门文章

最新文章