云其它

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > 云其它 > K8s HPA(自动伸缩)

K8s HPA(自动伸缩)解读

作者:大新屋

HPA(HorizontalPodAutoscaler)根据CPU/内存使用率自动调整Pod数量,实现水平扩展,与垂直扩展不同,需安装MetricsServer,支持Deployment、StatefulSet等资源,但不适用于DaemonSet

HPA简介

提示:Kubernetes官方HPA说明文档 https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale

在 Kubernetes 中,HPA(Horizontal Pod Autoscaler)自动伸缩工作负载资源 (例如Deployment、StatefulSet等), 目的是自动伸缩工作负载以满足需求。水平扩展意味着对增加的负载的响应是部署更多的pod。这与垂直扩展不同,垂直扩展对于Kubernetes来说意味着将更多的资源(例如:内存或CPU)分配给已经为工作负载运行的pod。如果负载减少,并且pod的数量高于配置的最小值,则HPA会指示工作负载资源(Deployment、StatefulSet或其他类似资源)缩减。

在新版的Kubernetes中系统资源的采集均使用Metrics Server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率。HPA通过Metrics采集Pod资源的内存、CPU等使用情况,如果发现某个Pod资源硬件资源负载过高或过低,会自动伸缩Pod资源,以达到Pod硬件资源的负载均衡。

一、HPA接口类型

### 查看K8s集群是否已安装部署Metrics Server
root@k8s-master01:~# kubectl get pods -n kube-system -o wide| grep metrics-server
metrics-server-5f9cfc9f9-7kkf4             1/1     Running   2 (4d5h ago)   4d23h   172.30.122.133   k8s-master02   <none>           <none>

### 查看K8s集群所支持的HPA接口类型
root@k8s-master01:~# kubectl api-resources | grep HorizontalPodAutoscaler
horizontalpodautoscalers            hpa          autoscaling/v2                    true         HorizontalPodAutoscaler

二、基于CPU使用率创建HPA

1、Deployment resources参数说明

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-pod
  template:
    metadata:
      name: nginx
      labels:
        run: nginx-pod
    spec:
      containers:
      - name: nginx01
        image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:              # 配置Pod资源请求和资源限制
          requests:             # 配置Pod资源请求
            cpu: 10m            # 配置CPU资源请求10m(毫核),1颗物理CPU等于1000m
            memory: 64Mi        # 配置内存资源请求64M
          limits:               # 配置Pod资源限制
            cpu: 100m           # 配置CPU资源限制100m(毫核) ,1颗物理CPU等于1000m
            memory: 128Mi       # 配置内存资源限制128M

2、创建Deployment

cat > /data/yaml/hpa/deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-pod
  template:
    metadata:
      name: nginx
      labels:
        run: nginx-pod
    spec:
      containers:
      - name: nginx01
        image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 10m
            memory: 64Mi
          limits:
            cpu: 100m
            memory: 128Mi
EOF

kubectl create -f /data/yaml/hpa/deployment.yaml
kubectl get pods -n default -owide
kubectl get deploy -n default

3、创建Service暴露 Nginx服务80端口

### 创建Service
kubectl get deploy -n default
kubectl expose deploy nginx-deploy --port=80
kubectl get service -n default –owide

### 访问Nginx 80端口
curl 10.96.249.147

4、查看当前Pod资源使用率

kubectl top pods -n default

5、HPA参数说明

apiVersion: autoscaling/v2           # 填写API资源版本号,通过kubectl api-resources | grep HorizontalPodAutoscaler命令查询API资源版本号
kind: HorizontalPodAutoscaler       # 指定资源类型,HorizontalPodAutoscaler资源类型是HorizontalPodAutoscaler
metadata:                           # 包含HorizontalPodAutoscaler的元数据
  name: nginx-deploy-hpa            # 自定义HorizontalPodAutoscaler的名称
  namespace: default                # 指定HPA运行的命名空间,与Deployment命名空间相同,默认default
spec:
  scaleTargetRef:                  # 指定HPA要监控的目标,包括API版本、类型(如Deployment)、名称
    apiVersion: apps/v1            # 指定要监控目标的Deployment API资源版本号
    kind: Deployment               # 指定要监控目标的Deployment资源类型
    name: nginx-deploy             # 指定要监控目标Deployment的名称
  minReplicas: 1                   #  Pod副本的最小数量
  maxReplicas: 10                  #  Pod副本的最大数量
  metrics:                         # 定义触发Pod数量调整的指标
  - type: Resource                 # 指标类型,如Resource(资源使用率)或Pods(基于Pods的数量)
    resource:
      name: cpu                    # 资源名称,如cpu或memory
      target:
        type: Utilization          # 目标类型,如Unilization(利用率)或AverageValue(平均值)
        averageUtilization: 50     # 目标利用率百分比(例如 50表示50%)
      # averageValue: 100Mi        # 目标平均值(例如100Mi表示100MB)

6、创建HPA(根据CPU使用率)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

7、创建HPA(根据CPU平均值)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: AverageValue
        averageValue: 50m
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

8、创建HPA(根据Memory使用率)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 50
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

9、创建HPA(根据Memory平均值)

cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deploy-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 6Mi
EOF

kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default

10、模拟压力测试Nginx容器

### 当前只运行了一个Pod
root@k8s-master01:~# kubectl get pod -n default
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-6998946c5b-g2h8c   1/1     Running   0          64m

### 查看Deployment Service
root@k8s-master01:~# kubectl get service -n default | grep nginx-deploy
nginx-deploy   ClusterIP   10.96.249.147   <none>        80/TCP    37m

### 模拟压力测试Nginx容器
while true; do wget -q -O- http://10.96.249.147 > /dev/null; done

### 打开另一个窗口查看Pod CPU资源使用率和自动伸缩
for i in `seq 100`;do  sleep 2;kubectl top pods;kubectl get pods -n default;echo;done

11、使用kubectl autoscale命令创建HPA

--cpu-percent=50   # 指定 Deployment 目标 CPU 使用率百分比
--min=1            # 指定 Deployment 应具有的最小副本数。即使 CPU 利用率很低,水平 Pod 自动缩放器也不会将 Deployment 缩小到此数值以下
--max=5           # 指定 Deployment 应具有的最大副本数。如果 CPU 利用率非常高,水平 Pod 自动缩放器也不会将 Deployment 扩展到此数值以上

kubectl autoscale deploy nginx-deploy --cpu-percent=50 --min=1 --max=5
kubectl get hpa -n default

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文