k8s-HPA

前提条件

安装有**Metrics Server**,HPA的运行监控指标需要由Metrics Server 提供

文档:https://github.com/kubernetes-sigs/metrics-server?tab=readme-ov-file#readme

  • 快速自动缩放,每15秒收集一次指标(可配置)。

    资源效率,为集群中的每个节点使用1 milli核心CPU和2 MB内存。

    可扩展支持多达5000个节点群集。

需要替换成国内的阿里云镜像::

image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.4

在yaml文件中的 增加 :–kubelet-insecure-tls 跳过TLS(生产环境不建议使用次参数

生产中建议:启用TLS Bootstrap 证书签发

containers:
      - args:
        ...
        - --kubelet-insecure-tls

工作流程

HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。PAH属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数。

HorizontalPodAutoscaler 控制器访问支持扩缩的相应工作负载资源(例如:Deployment 和 StatefulSet)。 这些资源每个都有一个名为 scale 的子资源,该接口允许你动态设置副本的数量并检查它们的每个当前状态。 有关 Kubernetes API 子资源的一般信息

k8s-HPA_第1张图片

缩扩容算法:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/

#ceil函数表示返回大于或者等于指定表达式的最小整数
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]

支持指标:

resource: 核心指标,包含**cpumemory**两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)

object: k8s内置对象的特定指标(需自己实现适配器)

pods: 应用被弹性伸缩的pod对象的特定指标(例如,每个pod每秒处理的事务数)(需自己实现适配器)

external: 非k8s内置对象的自定义指标(需自己实现适配器)

部署测试

1.部署一个测试服务

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php

2.创建一个PHA

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
  namespace: default
spec:
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 10
        type: Utilization
  - type: Resource
    resource:
      name: memory
      target:
        averageValue : 200Mi
        type: AverageValue
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache

######或者通过 创建HPA
kubectl autoscale     --cpu-percent=50 --min=1 --max=10
#例子:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
#表示按照资源的百分比
metrics:
  - resource:
      name: cpu
      target:
        averageUtilization: 10
        type: Utilization
#如果是想采用绝对值采用
metrics:
  - resource:
      name: cpu
      target:
        averageValue : 10
        type: AverageValue

3.压力测试

#启动一个容器循环调用后台服务,模拟压测 http://10.233.26.224 改为后端svc地址
kubectl run -i --tty load-generator2 --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://10.233.26.224; done"

4.观察deployment 的pod的变化以及PHA的变化

#观察pha
kubectl get pha --watch 
#观察pod
kubectl get po 

你可能感兴趣的:(k8s,kubernetes,容器,云原生)