HPA控制器

HPA控制器:

此控制器用于自动弹性伸缩
支持核心资源和非核心资源。核心资源的cpu可以压缩,但内存不能压缩,非核心资源中的内存可以压缩
需要依赖metric-server数据采集,根据给定的数据指标伸缩
默认15s查询一次metric采集的数据,可通过 -horizontal-pod-autoscaler-sync-period修改

工作方式:
请求api-server发起自动扩容,api-server调用controller manager,通过控制器管理员调用HPA控制器, hpa通过查询metric数据,达到定义的期望值

metrics-server

部署

注意:不要按照官方文档所说的那样直接安装,会不可用的

wget -O metrics-server.yml https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
sed -i '/metric-resolution/a\        - --kubelet-insecure-tls' metrics-server.yml
kubectl apply -f metrics-server.yml

配置语法:

kubectl explain hpa.spec

spec:
    behavior: <Object>        #配置缩容、扩容时的行为。默认使用HPAScalingRules策略扩容
      scaleDown:    #缩容策略
  maxReplicas: int        #必需,最大副本
  minReplicas: int        #必需。它默认为 1个Pod。如果启用了Alpha特性门控HPAScaleToZero并且配置了至少一个Object或External度量指标,则允许为0
  metrics: <[]Object>        #计算指标
      containerResource:    #容器资源
          container: 容器名
          name: 资源名称
          target:         #期望目标值
              type: 类型
                  #Utilization,利用率
                  #Value,值
                  #AverageValue,平均值
              averageUtilization
              averageValue
              value
        pods        #应用被弹性伸缩的pod对象的特定指标
      resource: <Object>    #pod的cpu、内存资源
          name: 名称
          target: <Object> -required-
              averageUtilization    #所有pod平均利用率
              averageValue        #所有pod平均值
                  type: 类型
            #Utilization,利用率
            #Value,值
            #AverageValue,平均值
          value
    type: 监控资源类型
        #ContainerResource,只有在启用HPAContainerMetrics特性后才能使用
      #External
      #Object
      #Pods
      #Resource
      external            #用于集群外的全局指标
          metric:     #通过名称和选择算符识别目标指标
              name: 指标名称
              selector: 指标选择器
          target:        #期望目标值
                type:
         averageUtilization    #平均利用率
         averageValue        #平均值
         value            #固定值
         object        #应用描述集群中某单一对象的特定指标,如Ingress对象上的hits-per-second
          describedObject:    #控制器描述信息
              kind
              name 
              apiVersion
          metric:
              name 
              selector 
              target 
  scaleTargetRef: <Object>    #必须。监控指定的控制器的资源使用
    apiVersion: 版本        #要写上,不然找不到控制器
    kind: 控制器            #必需
    name: 控制器名称        #必需

命令行创建:

kubectl autoscale 控制器 名称 --min=最小 --max=最大 --cpu-percent=利用率

案例:

例1:动态扩展pod,用命令行创建hpa

只能扩容控制器创建的pod

1)创建pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "50m"
              memory: "50Mi"
            limits:
              cpu: "50m"
              memory: "50Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: ngx-svc
spec:
  ports:
    - name: 80-80
      port: 80
      targetPort: 80
      nodePort: 31001
  selector:
    app: nginx
  type: NodePort

2)创建hpa控制器

kubectl autoscale deployment nginx-dep --min=1 --max=4 --cpu-percent=50

3)ab压测

yum install -y httpd-tools
ab -c 100 -n 50000 2.2.2.13:31001/index.html

#此时能发现自动增加了pod
watch -n0.1 'kubectl top pod'
kubectl describe hpa nginx-dep

image20220819150053913

例2: 配置清单创建hpa,扩容pod

1)创建ngx的pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ngx-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ngx
  template:
    metadata:
      labels:
        app: ngx
    spec:
      containers:
        - name: ngx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "50m"
              memory: "50Mi"
            limits:
              cpu: "50m"
              memory: "50Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: ngx-svc
spec:
  ports:
    - name: 80-80
      port: 80
      targetPort: 80
      nodePort: 31002
  selector:
    app: ngx
  type: NodePort

2)创建hpa控制器

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: ngx-hpa
spec:
  scaleTargetRef:
    kind: Deployment
    name: ngx-dep
    apiVersion: apps/v1
  minReplicas: 2
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

3)压测并监控

ab -c 100 -n 50000 2.2.2.10:31002/index.html

watch -n0.1 "kubectl top po"

image20220819151321715

posted @ 2022-09-02 16:02  suyanhj  阅读(106)  评论(0编辑  收藏  举报