(1)HPA基本概念
kubectl autoscale 命令 --> 需要'自己注册'到api-server'才有'这个命令,才能'调用对应的api接口'
(2)如何做到自动弹性伸缩
要收集'自定义监控指标'必须要部署一个'custom-metrics-apiserver'的pod -->'promethus就是'
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 '阈值'