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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 资源调度-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

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


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
Kubernetes 调度 Perl
Pod的自动扩缩容
Pod的自动扩缩容
130 1
|
1月前
|
Prometheus Kubernetes 监控
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
|
3月前
|
资源调度 Kubernetes 调度
玩转Kubernetes集群:掌握节点和Pod自动扩缩容,让你的系统更智能、更高效!
【8月更文挑战第22天】Kubernetes的核心功能之一是自动扩缩容,确保系统稳定与高可用。节点自动扩缩容由调度器和控制器管理器协作完成,依据资源紧张程度动态调整。主要采用HPA、VPA及Cluster Autoscaler实现。Pod自动扩缩容通常通过HPA控制器按需调整副本数量。例如,设置HPA控制器监视特定部署的CPU使用率,在80%阈值上下自动增减副本数。合理利用这些工具可显著提升系统性能。
100 2
|
3月前
|
存储 Kubernetes 调度
在K8S中,影响pod调度的因素有哪些?
在K8S中,影响pod调度的因素有哪些?
|
3月前
|
Kubernetes Cloud Native 应用服务中间件
Kubernetes 自动伸缩策略:优化资源利用率
【8月更文第29天】在现代云原生环境中,应用的流量往往具有不可预测性。为了应对这种变化,Kubernetes 提供了多种自动伸缩机制来动态调整应用实例的数量和每个实例分配的资源。本文将深入探讨两种主要的自动伸缩工具:水平 Pod 自动伸缩器 (HPA) 和垂直 Pod 伸缩器 (VPA),并提供实际的应用示例。
97 0
|
3月前
|
Prometheus Kubernetes 监控
在K8S中,当Pod业务量比较大时候,如何实现水平伸缩和扩容?
在K8S中,当Pod业务量比较大时候,如何实现水平伸缩和扩容?
|
6月前
|
弹性计算 API
弹性伸缩期望实例数
弹性伸缩期望实例数
65 18
|
弹性计算 Kubernetes 应用服务中间件
通过HPA进行Pod水平弹性伸缩
本场景带您体验如何使用阿里云指标完成Pods的自动伸缩。
|
监控 Kubernetes 应用服务中间件
自动化进行Pod的扩缩容-HPA
自动化进行Pod的扩缩容-HPA
191 0