Horizontal Pod Autoscaler (HPA) Pod动态扩容 电脑版发表于:2020/4/19 12:07  >#Horizontal Pod Autoscaler (HPA) Pod动态扩容 [TOC] <br/> HPA简介 ------------ <br/> >我们都知道通过手工执行 `kubectl scale` 命令可以手工实现**Pod**的扩容于缩容。 >而后谷歌又发布了一个动态扩容与缩容的功能就是(HPA) <br/> 检测方式 ------------ <br/> >- CPUUtilizationPercentage 通过运算**Pod**的平均值来进行动态 >- 通过应用自定义的度量来进行,比如**Service**在每秒内的相应请求数(**TPS**或**QPS**) <br/> HAP define Yaml(v1) ------------ <br/> ```yaml apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: php-apache namespace: default spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: kind: Deployment name: php-apache targetCPUUtilizationPercentage: 90 ``` 等同于 ```bash kubectl autoscale deployment php-apache --cpu-percent=90 --min=1 --max=10 ``` >解释一下 | 名称 | 定义 | | ------------ | ------------ | | scaleTargetRef | 监控目标 | | scaleTargetRef->kind | 监控类型 | | scaleTargetRef->name | 监控名称 | | maxReplicas | 控制**Pod**最大副本数量 | | targetCPUUtilizationPercentage | 当CPU的值超过 **90%** 将自动进行扩容 | >简单一句话:监控名为php-apache的**Deployment**控制器,当控制器中的 **Pod** CPU值超过 **90%** 将进行扩容 **Pod** 的副本数量,扩容数量范围在 **1~10** 之间。 >注意:请提前预装Heapster组件或Metrics Server <br/> Pod简单实现水平扩容方式 ------------ <br/> ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo namespace: netcore labels: name: k8s-demo spec: replicas: 2 selector: matchLabels: name: k8s-demo template: metadata: labels: name: k8s-demo spec: containers: - name: k8s-demo image: aidasi/k8sdemoapi:v2 resources: requests: cpu: 200m memory: 200Mi limits: cpu: 1 memory: 500Mi ports: - containerPort: 80 imagePullPolicy: Always livenessProbe: httpGet: path: /WeatherForecast/1 port: 80 timeoutSeconds: 5 readinessProbe: httpGet: path: /WeatherForecast/1 port: 80 timeoutSeconds: 5 --- kind: Service apiVersion: v1 metadata: name: k8s-demo namespace: netcore spec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: k8s-demo ``` <br/> HAP define Yaml(v2) ------------ <br/> ```yaml apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: php-apache namespace: default spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 ``` | 名称 | 定义 | | ------------ | ------------ | | metrics | 目标指标值。(当系统超过目标值时,自动进行扩缩操作) | | metrics-->type | 指标类型。 <br/> 1. **Resource**:<font style="text-decoration:underline"> 可以设置CPU(Utilization)与内存(AverageValue)(都是通过平均值进行计算)。</font> <br/> 2. **Pods**:<font style="text-decoration:underline">通过**Pod**副本的标志值进行平均值计算 .</font><br/>3. **Object**:<font style="text-decoration:underline">通过应用系统自定义指标值进行运算(如:ingress)</font> <br/> 注意:都需要预先启动 **Metrics Server** 服务 | <br/> >#### Pod类型的用法 <br/> >设置**Pod**的标志名为**packets-per-second** ,在目标 Pod 内存平均值为 1000 时,进行扩缩容操作。 ```yaml metrics: - type: Pods pod: name: packets-per-second target: type: AverageValue averageValue: 1k ``` <br/> >#### Object类型的用法 <br/> >设置标志名为**packets-per-second** ,其值来源于 **Ingress **“**main-route**”,将目标值(value)设置为**2000**,即在 **Ingress** 的每秒请求数量高达 **2000** 个时进行扩缩操作。 ```yaml metrics: - type: Object object: metric: name: requests-per-second describedObject: apiVersion: extensions/v1beta1 kind: Ingress name: main-route target: type: Value averageValue: 2k ``` Example Two: >设置标志名为 `http_requests` ,并且该资源对象具有标签 `verb=GET` ,在指定平均值达到**500**时触发扩缩容操作 ```yaml metrics: - type: Object object: metric: name: 'http_requests' selector: 'verb=GET' target: type: AverageValue averageValue: 500 ```