Kubernetes(十四)HPA

(1)HPA基本概念

kubectl autoscale 命令 --> 需要'自己注册'到api-server'才有'这个命令,才能'调用对应的api接口'

 

(2)如何做到自动弹性伸缩

要收集'自定义监控指标'必须要部署一个'custom-metrics-apiserver'的pod -->'promethus就是'

(3)Metric Service

Kubernetes从'1.8版本开始',CPU、内存等资源的metrics信息可以通过 Metrics API来获取,用户可以'直接获取'这些metrics信息

                                    ++++++++++++++++++++'注意'++++++++++++++++++++

1)通过Metrics API我们可以获取到'指定node或者pod'的'当前(current)资源使用情况',API'本身不存储'任何信息,所以我们'不可能'通过API来获取'资源的历史使用'情况

2)Metrics API的'获取路径'位于:/apis/metrics.k8s.io/v1beta1/

3)metrics-server(原声)'只能收集'k8s的'核心监控指标'-->如:pod和node的'CPU和内存'的使用率

++++++++++++++++++++++++ '典型用法' ++++++++++++++++++++++++ 

1)获取'所有Node'资源状态

curl -k https://192.168.1.15:6443/apis/metrics.k8s.io/v1beta1/nodes

2)获取'default命名空间'所有pods资源状态

https://192.168.1.15:6443/apis/metrics.k8s.io/v1beta1/namespaces/default/pods

3)获取'某个Node'节点资源

https://192.168.1.15:6443/apis/metrics.k8s.io/v1beta1/nodes/${node_name}

4)获取'default命名空间'下Pod资源

https://192.168.1.15:6443/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/tomcat-t6q74

备注: 如果在pod内换成'集群api-server的内网ip'即可

拓扑结构

更形象点

(4)理解聚合 API

(5)启动聚合器

master'静态pod路径': /etc/kubernetes/manifests/

查看api-server中聚合器相关的配置

二进制证书的生成方式

(6)安装Metrics Server

注意: 保证Aggregator 聚合层'启动完成后',可以来'安装' Metrics Server -->二者'对接'才可以使用

官方仓库地址 

须知: 每次'k8s版本更新',都会导致'文档内容有变化'

环境: k8s'1.19.3'

这里用最新的版本 

注意: 不要直接'apply',有些参数'不适用',先'下载到本地'

wget  https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.0/components.yaml

kubectl apply -f  components.yaml

修改参数

hostNetwork: true                       '使用hostNetwork模式' --> 暂时'不理解这个的含义'-->不使用'宿主机的网络'也是可以的

image: cnych/metrics-server:v0.4.0      '修改镜像-->或者科学上网' -->根据配置文件选择'对应的版本'

尝试安装

报错

查看日志

kubelet相对于metrics-server即使'客户端又是服务端'

作为客户端: watch api-server的请求

作为服务端: api-server需要去请求kubelt做'证书校验'

原因: kuelet在'安装的时候'没有做'相应的证书校验'

启动成功

日志也ok

其它验证

备注: 属于'ns'下面的资源

(7)实验

1)用 Deployment 来创建一个 'Nginx Pod',然后'利用 HPA' 来进行'自动扩缩容'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-demo
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

默认使用的是'v1',其它都处于'测试阶段'

你可以使用 'autoscaling/v2beta2 API' 为 Horizontal Pod Autoscaler 指定'用户自定义指标' -->后续使用'Promethues'

查看'版本支持与否':kubectl get hpa.v2beta2.autoscaling -o yaml

2)创建一个 HPA 资源对象,可以使用kubectl autoscale命令来'创建HPA'并'关联资源'

备注: 资源清单创建有一个'版本的问题'

++++++++++++++++++  '理解'  ++++++++++++++++++

kubectl 'autoscale' deployment hpa-demo --cpu-percent=10 --min=1 --max=10

备注1: deployment hpa-demo --> 'hpa关联的资源'

备注2: hpa'默认'是针对cpu

备注3: 根据设置'临界值-->cpu-percent-->cpu的使用率',动态扩缩'pod'-->区间'[1,10]'
注意: 'autoscale'对应的版本是'v1'-->'只支持cpu'

 

解读信息

报错提示

观察结果: 我们可以看到上面的事件信息里面出现了 'failed to get cpu utilization: missing request for cpu' 这样的错误信息

原因:  这是因为我们上面创建的 Pod 对象'没有添加 request 资源声明',这样导致 HPA '读取不到 CPU 指标信息,所以如果要'想让 HPA 生效',对应的 'Pod 资源必须添加' requests 资源声明

报错原因:如果要'对一个资源对象做hpa','至少'要添加'request(cpu或者memory)的值'

使用HPA需要在部署文件中'明确指定'资源配置情况 resources,最少需要配置 resources.'requests.cpu'

因上面创建的 Pod 对象'没有添加 request 资源声明',这样导致 'HPA 读取不到 CPU 指标信息',所以如果要'想让 HPA 生效',对应的 Pod 资源'必须添加' requests 资源声明
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-demo
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        resources:  '添加的资源request信息'
          requests:
            cpu: 25m
            memory: 30Mi

继续

保持环境的干净:

[root@master ~]# kubectl 'delete' -f hpa-demo.yml 
deployment.apps "hpa-demo" deleted
[root@master ~]# kubectl 'delete' hpa hpa-demo 
horizontalpodautoscaler.autoscaling "hpa-demo" deleted

-------------- '重新部署'  --------------

[root@master ~]# kubectl apply -f hpa-demo.yml 
deployment.apps/hpa-demo created
[root@master ~]# kubectl autoscale deployment hpa-demo --cpu-percent=10 --min=1 --max=10
horizontalpodautoscaler.autoscaling/hpa-demo autoscaled

此时查看日志

注意:此时的报错和之前是'有区别的',这里的意思是没有任何pods'接受到'metrics api的请求

++++++++++++++++  '做压测就有数据了'  ++++++++++++++++

压测

来'增大负载'进行测试,我们来创建一个 'busybox' 的 Pod,并且'循环访问-->死循环'上面创建的 Pod
kubectl run -it --image busybox test-hpa --restart=Never --rm /bin/sh

'压力测试'  -->'刚刚那个pod的ip'

while true; do wget -q -O- http://10.244.1.100; done

现象

  1)看到已经'自动拉起'了很多新的 Pod,最后定格在了我们上面设置的 10 个 Pod

  2)同时查看资源 hpa-demo 的副本数量,'副本数量'已经从原来的1变成了10个-->'过程省略'

压侧过程查看hpa的过程

注意:当REPLICAS'达到定义的上限时',即使当前'CPU的压力'仍然很大,REPLICAS也'不会再增加了'

取消压测:等待一段时间观察下 HPA 和 Deployment 对象-->副本数量降下来了

'停止压测',当CPU'负载降低时',HPA会'自动减少'POD的数量 -->'有一个缓冲期'

hpa目前'只支持'deployment

(8)缩放间隙

(9)Hpa依据的三种方式

1)基于'CPU、Memory资源'

2)基于'自定义' -->后续补充

3)基于'事件'   -->后续补充

(10)讲解基于内存

要使用基于'内存或者自定义指标'进行扩缩容-->现在的版本都'必须依赖 metrics-server' 这个项目

现在我们'再用' Deployment 来创建一个 Nginx Pod,然后'利用 HPA '来进行'自动扩缩容'
我们将一个名为 increase-mem-config 的 ConfigMap 资源对象'挂载到了容器中',该配置文件是用于后面'增加容器内存占用的脚本'

备注: configmap'先于'容器'创建'
apiVersion: v1
kind: ConfigMap
metadata:
  name: increase-mem-config
data:
  increase-mem.sh: |
    #!/bin/bash  
    mkdir /tmp/memory  
    mount -t tmpfs -o size=40M tmpfs /tmp/memory  
    dd if=/dev/zero of=/tmp/memory/block  
    sleep 60 
    rm /tmp/memory/block  
    umount /tmp/memory  
    rmdir /tmp/memory
由于这里'增加内存的脚本'需要使用到 'mount 命令',这需要声明为'特权模式',所以我们添加了 'securityContext.privileged=true' 这个配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-mem-demo
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
      - name: increase-mem-script
        configMap:
          name: increase-mem-config
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: increase-mem-script
          mountPath: /etc/script          'volume的挂载路径'
        resources:                        '使用hpa,至少有request'
          requests:
            memory: 50Mi
            cpu: 50m
        securityContext:
          privileged: true                '特权容器'

 

创建一个基于内存的 HPA 资源对象

说明:这里使用的 apiVersion 是 'autoscaling/v2beta1',然后 metrics 属性里面指定的是'内存的配置'

apiVersion: autoscaling/v2beta1   '修改地方-->memory从v2的beta1开始支持'
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:                  '目标deployment的引用'
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-mem-demo
  minReplicas: 1                   '最小副本数量'
  maxReplicas: 5                   '最大副本数量'
  metrics:                         '指标'
  - type: Resource                 '资源'
    resource:
      name: memory                 '基于内存'
      targetAverageUtilization: 60  '阈值'

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值