HPA:Pod水平自动伸缩(pod副本伸缩)  动态增加或减少 Pod 的副本数量

VPA:Pod垂直自动伸缩(pod资源伸缩)  动态调整 Pod 的资源请求和限制

一、Kubernetes Pod水平自动伸缩 HPA

官方网址:Pod 水平自动扩缩 | Kubernetes

  1. HPA简介

HPA,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩

ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。

Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。

Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。

控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

HPA 定期检查内存和 CPU 等指标,自动调整 Deployment 中的副本数;

实际生产中,广泛使用这四类指标:

1、Resource metrics - CPU内存利用率指标

2、Pod metrics - 例如网络利用率和流量

3、Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器

4、Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容

实验环境:

k8s-master01:192.168.10.11

k8s-worker01:192.168.10.12

k8s-worker02:192.168.10.13

  1. metircs-server部署

[root@master01 ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml

也可以离线部署:

  1. 复制high-availability-1.21+.yaml到master01主机

  1. 复制metrics-server.tar镜像备份文件到所有node节点,并导入镜像库

[root@worker0x ~]# docker load -i metrics-server.tar

  1. 禁用证书验证

kubelet 证书需要由集群证书颁发机构签名或者通过向 Metrics Server 传递参数 --kubelet-insecure-tls 来禁用证书验证

[root@master01 ~]# vim high-availability-1.21+.yaml

......

143       containers:

144       - args:

145         - --cert-dir=/tmp

146         - --secure-port=4443

147         - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname

148         - --kubelet-use-node-status-port

149         - --metric-resolution=15s

150         - --kubelet-insecure-tls[华王1]     #添加此行内容

151         image: registry.k8s.io/metrics-server/metrics-server:v0.6.4

......

[root@master01 ~]# kubectl apply -f high-availability-1.21+.yaml

[root@master01 ~]# kubectl get pods -n kube-system

动态显示节点进程信息

[root@master01 ~]# kubectl top nodes[华王2] 

查看 kube-system 命名空间中所有 Pod 的资源使用情况(CPU 和内存)

[root@master01 ~]# kubectl top pods -n kube-system

  1. HPA演示示例
  1. 部署一个服务

[root@master01 ~]# mkdir hpa

[root@master01 ~]# cd hpa

[root@master01 hpa]# vim 01-nginx.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  labels:

    app: nginx

  name: nginx

  namespace: default

spec:

  replicas: 2

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:1.20

        imagePullPolicy: IfNotPresent

        resources:

          requests:

            cpu: 200m

            memory: 100Mi

---

apiVersion: v1

kind: Service

metadata:

  name: nginx

  namespace: default

spec:

  type: NodePort

  ports:

  - port: 80

    targetPort: 80

  selector:

    app: nginx

[root@master01 hpa]# kubectl apply -f 01-nginx.yaml

[root@master01 hpa]# kubectl get pods

  1. 创建HPA对象

这是一个 HorizontalPodAutoscaler (HPA) 对象的配置,它将控制Deployment "nginx" 的副本数量。当 CPU 使用率超过 50% 时,HPA 将自动增加 Pod 的副本数量,最高不超过 10 个。

[root@master01 hpa]# vim 02-nginx-hpa.yaml

apiVersion: autoscaling/v2

kind: HorizontalPodAutoscaler

metadata:

  name: nginx-hpa

  namespace: default

spec:

  scaleTargetRef:

    apiVersion: apps/v1

    kind: Deployment

    name: nginx

  minReplicas: 1

  maxReplicas: 10

  metrics:

  - type: Resource

    resource:

      name: cpu

      target:

        type: Utilization

        averageUtilization: 50

命令行解释:

spec:

  scaleTargetRef:                    # 指向我们要自动伸缩的目标资源

    apiVersion: apps/v1             # 目标资源的 API 版本

    kind: Deployment           # 目标资源的类型

    name: nginx                    # 目标资源的名字

  minReplicas: 1                    # Pod 的最小副本数

  maxReplicas: 10                  # Pod 的最大副本数

  metrics:                     # 定义用于触发自动伸缩操作的指标

  - type: Resource                # 度量类型为资源度量

    resource:

      name: cpu                    # 度量 CPU 使用率

      target:                # 设置目标值以触发自动伸缩

        type: Utilization             # 目标类型是利用率

        averageUtilization: 50        # 各Pod CPU平均利用率达到或超过50%

[root@master01 hpa]# kubectl apply -f 02-nginx-hpa.yaml

查看资源状态

[root@master01 hpa]# kubectl get hpa

  1. 执行压测

[root@master01 hpa]# yum -y install httpd-tools

[root@master01 hpa]# kubectl get svc

[root@master01 hpa]# ab -c 1000 -n 100000000  http://192.168.10.11:32562/

打开另一个终端查看

[root@master01 ~]# kubectl get pods

查看资源状态

[root@master01 ~]# kubectl get hpa

终止压力测试查看(等一会看,耐心等待。。。

[root@master01 hpa]# kubectl get hpa

[root@master01 ~]# kubectl get pods

CPU 利用率已经降到 0,所以 HPA 将自动缩减副本数量至 1。

因为在创建HPA时,指定了副本数范围,这里是minReplicas: 1,maxReplicas: 10。


 [华王1]禁用证书验证:当设置 --kubelet-insecure-tls 时,metrics-server 或其他组件不会验证 kubelet 提供的证书是否有效。这在某些情况下(例如测试环境或证书配置不完整时)可能会有用

  1.  [华王2]NAME:
    • 表示节点的名称。
    • 在这个例子中,有三个节点:master01、worker01 和 worker02。
  2. CPU(cores):
    • 表示节点当前使用的 CPU 资源总量(以核心为单位)。
    • master01 使用了 506m(即 0.506 核心)。
    • worker01 使用了 292m(即 0.292 核心)。
    • worker02 使用了 290m(即 0.290 核心)。
  3. CPU%:
    • 表示节点的 CPU 使用率(相对于节点的总 CPU 资源)。
    • master01 的 CPU 使用率为 12%。
    • worker01 和 worker02 的 CPU 使用率均为 7%。
  4. MEMORY(bytes):
    • 表示节点当前使用的内存总量(以字节为单位)。
    • master01 使用了 1668Mi(即 1668 MiB)。
    • worker01 使用了 1467Mi。
    • worker02 使用了 1352Mi。
  5. MEMORY%:
    • 表示节点的内存使用率(相对于节点的总内存资源)。
    • master01 的内存使用率为 61%。
    • worker01 的内存使用率为 53%。
    • worker02 的内存使用率为 49%。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐