博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kubernetes基于Metrics Server的HPA
阅读量:6982 次
发布时间:2019-06-27

本文共 3620 字,大约阅读时间需要 12 分钟。

Kubernetes基于Metrics Server的HPA

[TOC]

1. 环境说明和相关介绍

我的kubernetes环境:

  • kubeadm安装的kubernetes1.11

Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据资源利用率或者自定义指标自动调整replication controller、deployment 或 replica set,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适于无法缩放的对象,例如DaemonSet。

Kubernetes从1.8版本开始,CPU、内存等资源的metrics信息可以通过 Metrics API来获取,用户可以直接获取这些metrics信息(例如通过执行kubect top命令),HPA使用这些metics信息来实现动态伸缩。本文介绍Kubernetes集群基于metric server的HPA。在开始之前我们需要了解一下Metrics API和Metrics Server。

Metrics API

  1. 通过Metrics API我们可以获取到指定node或者pod的当前资源使用情况,API本身不存储任何信息,所以我们不可能通过API来获取资源的历史使用情况。
  2. Metrics API的获取路径位于:/apis/metrics.k8s.io/
  3. 获取Metrics API的前提条件是metrics server要在K8S集群中成功部署
  4. 更多的metrics资料请参考:

Metrics server

  1. Metrics server是Kubernetes集群资源使用情况的聚合器
  2. 从1.8版本开始,Metrics server默认可以通过kube-up.sh脚本以deployment的方式进行部署,也可以通过yaml文件的方式进行部署
  3. Metrics server收集所有node节点的metrics信息
  4. Kubernetes从1.7版本,通过 注册Metrics Server在主API server

2. 部署metrics-server

由于官方已经弃用,现作为其替代方案。

当前最新版本为v0.3.1。部署yaml文件链接:

metrics-server-deployment.yaml中,

image可使用:
另还需添加2个参数:

containers:      - name: metrics-server        args:          - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP          - --kubelet-insecure-tls        image: ygqygq2/metrics-server:v0.3.1

部署成功后,达到如下结果,则为正常:

[root@lab1 1.8+]# kubectl top nodesNAME      CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   lab1      777m         2%        16064Mi         50%       lab2      526m         1%        12577Mi         79%       lab3      569m         1%        8819Mi          27%       lab4      56m          5%        4151Mi          53%       lab5      353m         2%        8287Mi          53%       lab6      55m          5%        4021Mi          52%       [root@lab1 1.8+]# kubectl top podsNAME                                CPU(cores)   MEMORY(bytes)   gohttpserver-849d47c88f-pqf7f       0m           4Mi             nginx-cephfs-7777495b9b-5sfvv       0m           1Mi             nginx-cephfs-dy1-7777495b9b-6jvph   0m           1Mi             nginx-cephfs-dy2-86bdbfd977-g278z   0m           1Mi

3. 测试HPA

  1. 创建一个名为nginxtest的deployment;
  2. 创建一个关联资源nginxtest的HPA,最小的pod副本数为1,最大为10。HPA会根据设定的cpu使用率(10%)动态的增加或者减少pod数量,此地方用于测试,所以设定的伸缩阈值会比较小;
  3. 使用curl方式加大、减小nginx的负载;
kubectl run nginxtest --image=nginx:latest --requests=cpu=1m --expose --port=80nginxtest_ip=$(kubectl get svc nginxtest -o=jsonpath="{.spec.clusterIP}")  # 获取svc IP,用于测试kubectl autoscale deployment nginxtest --cpu-percent=10 --min=1 --max=10

我们来创建一个busybox,并且循环访问上面创建的服务。

kubectl run load-generator --image=busyboxbusybox_pod=$(kubectl get pod |grep load-generator|awk '{print $1}')kubectl exec -it ${busybox_pod} -- /bin/sh -c "while true; do curl -s $nginxtest_ip; done" & # 后台跑,负载不够可多条同时执行

查看hpa状态,同时我们查看相关资源nginxtest的副本数量,副本数量在变化。CPU资源利用率也在变化,最后趋于平稳。

$ kubectl get hpa                  NAME        REFERENCE              TARGETS    MINPODS   MAXPODS   REPLICAS   AGEnginxtest   Deployment/nginxtest   100%/10%   1         10        4          24m$ kubectl get deployment nginxtestNAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEnginxtest   4         4         4            4           27m

我们关掉刚才的busbox并等待一段时间。可以看到副本数量变回为1。

$ kubectl get deployment nginxtestNAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEnginxtest   1         1         1            1           36m$ kubectl get hpa                  NAME        REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGEnginxtest   Deployment/nginxtest   0%/10%    1         10        1          33m

4. 小结

HPA能对服务的容器数量做自动伸缩,对于服务的稳定性是一个很好的提升,但在生产中应用较少,原因是因为不太容易衡量业务负载是否正常,影响服务稳定性的因素非常多。

参考资料:

[1]
[2]

转载于:https://blog.51cto.com/ygqygq2/2295972

你可能感兴趣的文章
table设置border没有空隙
查看>>
升级 Vim 7.4 On Ubuntu 13.10, 13.04, 12.04, Linux...
查看>>
Maven的setting.xml 配置详解
查看>>
Pycharm中autopep8设置
查看>>
Python3.7源码在windows(VS2015)下的编译和安装
查看>>
在Java中如何避免“!=null”式的判空语句?
查看>>
手动编译内核
查看>>
openshift client 命令 之 groups
查看>>
vsphere web client 加载不上本地镜像提示加载插件超时
查看>>
db2 之 入门实验
查看>>
开始Jquery的学习生涯
查看>>
手机测试项目时报INSTALL_FAILED_INSUFFICIENT_STORAGE
查看>>
10_css选择符类型1.html
查看>>
修改 liteide 的 godoc 文档样式
查看>>
阿里镜像
查看>>
python 实现脚本上传远程服务并执行脚本
查看>>
Direct2D (39) : 使用 IDWriteTextLayout.Draw() 方法绘制文本
查看>>
突然想起曾经一面试官问我 | 和 || 的区别
查看>>
Struts框架之ActionForm(2)——ActionForm的生命周期
查看>>
GNS3中实现IP访问控制列表配置实验
查看>>