zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

kubernetes之HPA

2023-02-18 15:49:41 时间

1.什么是HPA?
在Kubernetes中,HorizontalPodAutoscaler自动更新工作负载资源(例如 Deployment或者 StatefulSet),目的是自动扩缩工作负载以满足需求。

水平扩缩意味着对增加的负载的响应是部署更多的Pods。 这与"垂直(Vertical")扩缩不同,对于 Kubernetes,垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的Pod。

如果负载减少,并且 Pod 的数量高于配置的最小值,HorizontalPodAutoscaler会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减。

水平Pod自动扩缩不适用于无法扩缩的对象(例如: DaemonSet.)

HorizontalPodAutoscaler被实现为Kubernetes API资源和控制器。

资源决定了控制器的行为,在Kubernetes控制平面内运行的水平Pod自动扩缩控制器会定期调整其目标(例如:Deployment)的所需规模,以匹配观察到的指标,例如,平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标。

官方是这样给出的。
2.下载Metrics-Server,因为kubectl autoscale自动控制在K8s集群中运行的Pod数量,(水平自动伸缩),需要提前设置Pod范围及触发条件。
K8s从1.1版本开始增加了名称为HPA(Horizontal Pod AutoScaler)的控制器,用于实现基于Pod中资源(CPU/Memory)利用率进行对Pod的自动扩缩容功能的实现,早期的版本只能基于Heapster组件实现对CPU利用率作为触发条件,但是在K8s1.11版本开始使用Metrics Server完成数据采集,然后将采集的数据通过API(Aggregated API,汇总API)例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io然后再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对Pod进行扩缩容的目的。
GitHUB地址
https://github.com/kubernetes-sigs/metrics-server
3.(注意:使用HPA前我们要确保K8s集群的DNS服务和Metrics服务是正常运行的,并且我们所创建的服务需要配置指标分配)
Pod运行正常。


# 选择标签查看Pod
root@kubernetes-master01:~# kubectl get pods -l version=v0.3.6 -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-6595f875d6-hdkpb   2/2     Running    5         15d

然后测试也是没有问题。Metrics-Server正常工作。

root@kubernetes-master01:~# kubectl top node
NAME                  CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
kubernetes-master01   183m         4%     1279Mi          21%       
kubernetes-node01     49m          1%     1111Mi          18%       
kubernetes-node02     39m          0%     369Mi            6% 

4.创建测试应用

root@kubernetes-master01:~# cat web.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web-nginx-hpa
  name: web-deployment-nginx-test
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-nginx-hpa
  template:
    metadata:
      labels:
        app: web-nginx-hpa
    spec:
      containers:
      - image: nginx
        name: web-deployment-nginx-test
        resources:  # 注意Resources必须要配置,否则无法探测到
          limits:
            cpu: "50m"  # 限制单个Pod最多可以使用0.05核CPU和20Mi内存
            memory: 20Mi
          requests: # 默认可以只配置Requests,但根据生产中的经验,建议把limits资源限制也加上,因为对kubernetes来说,只有这两个都配置了且配置的值都要一样,这个pod资源的优先级才是最高的,在node资源不够的情况下,首先是把没有任何资源分配配置的pod资源给干掉,其次是只配置了requests的,最后才是两个都配置的情况,根据QOS服务质量。
            cpu: "50m"
            memory: 20Mi
root@kubernetes-master01:~# kubectl apply -f  web.yaml

5.创建Serivce,这一步可以为前端提供一个访问入口。方便我们测试使用。

root@kubernetes-master01:~# cat service-hpa.yaml 
apiVersion: v1
kind: Service
metadata:
  name: hpa-service
spec:
  selector:
    app: web-nginx-hpa
  ports:
  - name: http
    port: 80
    targetPort: 80
root@kubernetes-master01:~# kubectl apply -f  service-hpa.yaml

6.创建HPA资源

root@kubernetes-master01:~# cat web.hpa.yaml 
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: web-deployment-nginx-test 
spec:
  scaleTargetRef:
    apiVersion: apps/v1   # API的版本
    kind: Deployment       # 资源类型
    name: web-deployment-nginx-test  # Deployment的具体名称
  minReplicas: 2   # 最小Pod数量
  maxReplicas: 10  # 最大Pod数量
  targetCPUUtilizationPercentage: 30  # CPU到百分之30使用扩缩容。

root@kubernetes-master01:~# kubectl apply -f web.hpa.yaml

7.创建完毕后测试。

root@kubernetes-master01:~# while :;do wget -q -O- http://nginx-hpa;done 

8.随着不断访问,流量渐渐上来了。会触发扩缩容。

root@kubernetes-master01:~# kubectl get hpa -w
NAME                        REFERENCE                              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
web-deployment-nginx-test   Deployment/web-deployment-nginx-test   0%/30%    2         10        2          90m
web-deployment-nginx-test   Deployment/web-deployment-nginx-test   76%/30%   2         10        2          90m
web-deployment-nginx-test   Deployment/web-deployment-nginx-test   76%/30%   2         10        4          91m
web-deployment-nginx-test   Deployment/web-deployment-nginx-test   55%/30%   2         10        6          91m
web-deployment-nginx-test   Deployment/web-deployment-nginx-test   50%/30%   2         10        6          91m

9.停止压测。因为默认情况下,每30s检测一次指标,只要检测到了配置HPA的目标值,则会计算出预期的工作负载的副本数,再进行扩缩容操作。同时,为了避免过于频繁的扩缩容,默认在5min内没有重新扩缩容的情况下,才会触发扩缩容。 不过,HPA本身的算法相对比较保守,可能并不适用于很多场景。例如,一个快速的流量突发场景,如果正处在5min内的HPA稳定期,这个时候根据HPA的策略,会导致无法扩容。 另外,在一些Serverless场景下,有缩容到0然后冷启动的需求,但HPA默认不支持。

root@kubernetes-master01:~# kubectl get pod -w
web-deployment-nginx-test-54f8c5b657-c2wc4   1/1     Running             0          44m
web-deployment-nginx-test-54f8c5b657-c54w4   0/1     ContainerCreating   0          1s
web-deployment-nginx-test-54f8c5b657-cgf74   0/1     ContainerCreating   0          16s
web-deployment-nginx-test-54f8c5b657-k4mpc   0/1     ContainerCreating   0          1s
web-deployment-nginx-test-54f8c5b657-qv9f2   1/1     Running             0          16s
web-deployment-nginx-test-54f8c5b657-v5zfr   1/1     Running             0          3m4s
web-deployment-nginx-test-54f8c5b657-cgf74   1/1     Running             0          27s