其他分享
首页 > 其他分享> > 【云原生】K8s pod 动态弹性扩缩容 HAP(metrics-server)

【云原生】K8s pod 动态弹性扩缩容 HAP(metrics-server)

作者:互联网

目录

一、概述

Horizontal Pod AutoscalerHPAPod水平自动伸缩),根据平均 CPU 利用率平均内存利用率或你指定的任何其他自定义指标自动调整 DeploymentReplicaSetStatefulSet 或其他类似资源,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适用于无法缩放的对象,例如DaemonSet

官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/

实际生产中,一般使用这四类指标:

  1. Resource metrics——CPU核 和 内存利用率指标。

  2. Pod metrics——例如网络利用率和流量。

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

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

二、安装 metrics-server

1)HAP 前提条件

默认情况下,Horizontal Pod Autoscaler 控制器会从一系列的 API 中检索度量值。 集群管理员需要确保下述条件,以保证 HPA 控制器能够访问这些 API:

Kubernetes Metrics Server:

2)开启 API Aggregator

# 添加这行
# --enable-aggregator-routing=true
### 修改每个 API Server 的 kube-apiserver.yaml 配置开启 Aggregator Routing:修改 manifests 配置后 API Server 会自动重启生效。
cat /etc/kubernetes/manifests/kube-apiserver.yaml

在这里插入图片描述

3)开始安装 metrics-server

GitHub地址:https://github.com/kubernetes-sigs/metrics-server/releases
下载

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/metrics-server-helm-chart-3.8.2/components.yaml

修改

...
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --kubelet-insecure-tls                    #   加上该启动参数,不加可能会报错
        image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1   # 镜像地址根据情况修改
        imagePullPolicy: IfNotPresent
...

metrics-server pod无法启动,出现日志unable to fully collect metrics: ... x509: cannot validate certificate for because ... it doesn't contain any IP SANs ...
解决方法:在metrics-server中添加--kubelet-insecure-tls参数跳过证书校验

在这里插入图片描述

开始安装

kubectl apply -f components.yaml
kubectl get pod -n kube-system | grep metrics-server
# 查看
kubectl get pod -n kube-system | grep metrics-server
# 查看node和pod资源使用情况
kubectl top nodes
kubectl top pods

在这里插入图片描述

三、Horizontal Pod Autoscaler 工作原理

1)原理架构图

在这里插入图片描述

2)HPA扩缩容算法

从最基本的角度来看,Pod 水平自动扩缩控制器根据当前指标和期望指标来计算扩缩比例。

期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]

1、扩容

2、缩容

3、特殊处理

3)HPA 对象定义

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  behavior:
  scaleDown:
    policies:
    - type: Pods
      value: 4
      periodSeconds: 60
    - type: Percent
      value: 10
      periodSeconds: 60
    stabilizationWindowSeconds: 300
  
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

HPA对象默认行为

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
  scaleUp:
    stabilizationWindowSeconds: 0
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
    - type: Pods
      value: 4
      periodSeconds: 15
    selectPolicy: Max

四、示例演示

1)编排yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hap-nginx
spec:
  maxReplicas: 10 # 最大扩容到10个节点(pod)
  minReplicas: 1 # 最小扩容1个节点(pod)
  metrics:
  - resource:
      name: cpu
      target:
        averageUtilization: 40 # CPU 平局资源使用率达到40%就开始扩容,低于40%就是缩容
        # 设置内存
        # AverageValue:40
        type: Utilization
    type: Resource
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hap-nginx
---
apiVersion: v1
kind: Service
metadata:
  name: hap-nginx
spec:
  type: NodePort
  ports:
    - name: "http"
      port: 80
      targetPort: 80
      nodePort: 30080
  selector:
    service: hap-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hap-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      service: hap-nginx
  template:
    metadata:
      labels:
        service: hap-nginx
    spec:
      containers:
        - name: hap-nginx
          image: nginx:latest
          resources:
            requests:
              cpu: 100m
              memory: 100Mi
            limits:
              cpu: 200m
              memory: 200Mi

主要参数解释如下:

执行

kubectl apply -f test.yaml

2)使用 ab 工具进行压测

进入apache官网 http://httpd.apache.org/ 下载apache即可,或者直接通过yum安装apache都行,这里选择最简单的方式yum安装

yum install httpd -y

开始压测

ab -n 100000 -c 800 http://local-168-182-112:30080/

#-c:并发数
#-n:总请求数

在这里插入图片描述
在这里插入图片描述
从上图发现已经实现了根据CPU 动态扩容了,关于更多 HAP相关的知识点,可以先查看官方文档,后面会在实战项目里使用,请小伙伴耐心等待;有疑问的小伙伴,欢迎给我留言,后续会持续分享【云原生和大数据】相关的文章,请小伙伴耐心等待哦~

标签:指标,扩缩容,server,metrics,API,Pod,pod
来源: https://www.cnblogs.com/liugp/p/16654341.html