资源调度-HPA:基于负载指标自动水平扩容缩容Pod

简介: 资源调度-HPA:基于负载指标自动水平扩容缩容Pod

Pod 自动扩容:可以根据 CPU 使用率或自定义指标(metrics)自动对 Pod 进行扩/缩容。

控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况

  • 支持三种metrics类型
  • 预定义metrics(比如Pod的CPU)以利用率的方式计算
  • 自定义的Pod metrics,以原始值(raw value)的方式计算
  • 自定义的object metrics
  • 支持两种metrics查询方式:Heapster和自定义的REST API
  • 支持多metrics

通常用于 Deployment,不适用于无法扩/缩容的对象,如 DaemonSet

实现 cpu 或内存的监控,首先有个前提条件是该对象必须配置了 resources.requests.cpu 或 resources.requests.memory 才可以,可以配置当 cpu/memory 达到上述配置的百分比后进行扩容或缩容

1.创建一个 HPA:

#修改配置文件 #加入资源限制
[root@k8s-master deployments]# vi nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
  namespace: default
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx-deploy
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
      - image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        name: nginx
        #加入资源限制
        resources:
          limits:
            cpu: 200m
            memory: 128Mi
          requests:
            cpu: 10m
            memory: 128Mi   
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
# 更新操作
[root@k8s-master deployments]# kubectl replace -f nginx-deploy.yaml
deployment.apps/nginx-deploy replaced
# 查看 只有一个副本
[root@k8s-master deployments]# kubectl get deploy nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           18h

创建一个 HPA:

  1. 先准备一个好一个有做资源限制的 deployment
  2. 执行命令 kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5
  3. 通过 kubectl get hpa 可以获取 HPA 信息
[root@k8s-master deployments]#  kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5
horizontalpodautoscaler.autoscaling/nginx-deploy autoscaled
#现在再次查看 副本自动扩容到了2个
[root@k8s-master deployments]#  kubectl get deploy nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           18h

未安装 Metrics Server 查看 pod 内存、CPU 将报错

[root@k8s ~]# kubectl top pods --all-namespaces
error: Metrics API not available

Pod 的水平自动缩放(前提需要安装插件metrics-server )

2.Metrics Server安装

一、使用阿里云的components.yaml配置文件

aliyun-components.yaml

[root@k8s-master ~]# rz
[root@k8s-master ~]# ls
aliyun-components.yaml  anaconda-ks.cfg
#查看文件
[root@k8s-master ~]# cat aliyun-components.yaml

二、执行安装命令

[root@k8s-master ~]# kubectl apply -f aliyun-components.yaml

执行完输出内容:

serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

三、查看效果,验证是否安装成功

[root@k8s-master ~]# kubectl get svc metrics-server -n kube-system
NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
metrics-server   ClusterIP   10.105.89.80   <none>        443/TCP   152m
# 使用kubectl top node 查看资源使用情况
[root@k8s-master ~]# kubectl top node
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master   91m          4%     912Mi           24%       
k8s-node1    31m          1%     756Mi           20%       
[root@k8s-master ~]# kubectl top pods --all-namespaces
NAMESPACE      NAME                                 CPU(cores)   MEMORY(bytes)   
kube-flannel   kube-flannel-ds-8fxmx                3m           18Mi            
kube-flannel   kube-flannel-ds-xfmpr                4m           20Mi            
kube-system    coredns-65c54cc984-7vd4t             1m           17Mi            
kube-system    coredns-65c54cc984-qqv8m             1m           16Mi            
kube-system    etcd-k8s-master                      9m           67Mi            
kube-system    kube-apiserver-k8s-master            34m          228Mi           
kube-system    kube-controller-manager-k8s-master   12m          49Mi            
kube-system    kube-proxy-l99bw                     1m           17Mi            
kube-system    kube-proxy-x8tdf                     1m           16Mi            
kube-system    kube-scheduler-k8s-master            2m           20Mi            
kube-system    metrics-server-b9f7b695f-bljhg       3m           20Mi     

至此,metrics-server安装完成

[root@k8s-master deployments]# kubectl top pods
NAME                           CPU(cores)   MEMORY(bytes)               
nginx-deploy-56696fbb5-4ksdj   0m           1Mi             
nginx-deploy-56696fbb5-wtjtq   0m           1Mi                

3.创建一个servie

[root@k8s-master deployments]# kubectl create -f nginx-svc.yaml
service/nginx-svc created
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels: 
    app: nginx
spec:
  selector:
    app: nginx-deploy
  ports:
  - port: 80
    targetPort: 80
    name: web
  type: NodePort

[root@k8s-master deployments]# kubectl get svc 
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-svc       NodePort    10.100.220.235   <none>        80:31590/TCP   55s

[root@k8s-master deployments]# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
nginx-deploy-56696fbb5-4ksdj   1/1     Running   0          37m     10.244.1.46   k8s-node1   <none>           <none>
nginx-deploy-56696fbb5-wtjtq   1/1     Running   0          40m     10.244.1.45   k8s-node1   <none>           <none>

4.测试

找到对应服务的 service,编写循环测试脚本提升内存与 cpu 负载

[root@k8s-node1 ~]# while true; do wget -q -O- http://10.100.220.235  > /dev/null ; done


[root@k8s-master deployments]# kubectl top pods
NAME                           CPU(cores)   MEMORY(bytes)           
nginx-deploy-56696fbb5-4ksdj   0m           1Mi             
nginx-deploy-56696fbb5-bdkx2   2m           1Mi             
nginx-deploy-56696fbb5-wtjtq   0m           1Mi             
nginx-deploy-56696fbb5-zrdb7   0m           1Mi             

#400%/20%
[root@k8s-master deployments]# kubectl get hpa
NAME           REFERENCE                 TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
nginx-deploy   Deployment/nginx-deploy   400%/20%   2         5         2          67m

#查看已经扩容到5个副本了
[root@k8s-master deployments]# kubectl get deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   5/5     5            5           19h



#暂停之前死循环的命令 等一会再次查看  
[root@k8s-master deployments]# kubectl get hpa
NAME           REFERENCE                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-deploy   Deployment/nginx-deploy   0%/20%    2         5         5          69m
#pod变化  
[root@k8s-master deployments]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
nginx-deploy-c4986b7f-8tplt   1/1     Running   0          6m24s
nginx-deploy-c4986b7f-qltv6   1/1     Running   0          7m2s
#deployment变化
[root@k8s-master deployments]#  kubectl get deploy nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           19h

#发现已经自动完整了扩容缩容


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
数据采集 人工智能 文字识别
PDF 转 Markdown 神器:MinerU 2.5 (1.2B) 部署全攻略
MinerU是由OpenDataLab推出的开源PDF解析工具,支持精准布局分析、公式识别与表格提取。本文详解其2.5-2509-1.2B版本在Linux下的部署流程,涵盖环境搭建、模型下载、核心配置及实战应用,助你高效处理复杂PDF文档,提升AI数据清洗效率。
2787 3
|
2月前
|
人工智能 安全 JavaScript
# 本地离线可用!Windows OpenClaw AI 数字员工安装全攻略
本教程详解Windows 10/11下零代码、图形化部署OpenClaw本地AI数字员工,全程离线运行、隐私安全,10分钟一键安装,支持文件整理、自动化办公等任务,小白友好、无踩坑。
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
840 0
|
8月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
671 5
|
运维 Kubernetes 监控
Log/Trace/Metric 完成 APIServer 可观测覆盖
12 月 11 日,OpenAI 出现了全球范围的故障,影响了 ChatGPT/API/Sora/Playground/Labs 等服务,持续时间超过四个小时。究其背后原因,主要是新部署的服务产生大量的对 K8s APIServer 的请求,导致 APIServer 负载升高,最终导致 DNS 解析不能工作,影响了数据面业务的功能。面对 APIServer 这类公用基础组件,如何通过 Log/Trace/Metric 完成一套立体的覆盖体系,快速预警、定位根因,降低不可用时间变得非常重要。
559 107
Log/Trace/Metric 完成 APIServer 可观测覆盖
|
Prometheus Kubernetes 监控
在K8S中,当Pod业务量比较大时候,如何实现水平伸缩和扩容?
在K8S中,当Pod业务量比较大时候,如何实现水平伸缩和扩容?
|
Kubernetes 应用服务中间件 nginx
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)(上)
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)
53374 30
|
人工智能 网络性能优化 调度
Koordinator v1.6: 支持AI/ML场景的异构资源调度能力
如何高效管理和调度这些资源成为了行业关注的核心问题。在这一背景下,Koordinator积极响应社区诉求,持续深耕异构设备调度能力,并在最新的v1.6版本中推出了一系列创新功能,帮助客户解决异构资源调度难题。
|
Kubernetes 监控 API
在K8S中,如何使用HPA实现自动扩缩容?
在K8S中,如何使用HPA实现自动扩缩容?