Docker(三):利用Kubernetes实现容器的弹性伸缩
一、前言
前两章有的介绍docker与Kubernetes。docker是项目运行的容器,Kubernetes则是随着微服务架构的演变docker容器增多而进行其编排的重要工具。Kubernetes不仅可以对容器进行检测状态,还能对其自动扩容缩容。下面就来介绍介绍Kubernetes是如何自动的扩容缩容的。
二、Kubernetes弹性伸缩简介
手动的扩缩容是通过kubectl scale命令或者修改deployment的replicas数量来控制Pod的扩缩容。当然前一章有说过可以自己开发客户端发送请求到APIServer中。但是这稍微会麻烦点。而Kubernetes自带的功能使得其从两个维度上支持自动的弹性伸缩:
Cluster AutoScale:处理Kubernetes集群中Node节点伸缩,缺点在于严重依赖Iaas厂商提供的云主机服务和资源监控服务。
HPA:处理Pod副本集的自动弹性伸缩,使用的是监控服务采集到的资源监控指标数据。
三、HPA简介
HPA是通过周期性检查Deployment(可以理解为微服务架构中的一个服务。是在Master节点中的对象。下面可以控制多个Pod)控制的目标Pod的相关监控指标的变化情况来确定是否需要针对性地调整目标Pod的副本数。通常应用的扩缩容都是由CPU或内存的使用率实现的。
HPA可以通过Kubernetes自带的监控系统heapster来获取到CPU的使用率。但是从Kubernetes1.8开始,资源使用指标改为通过metrics api获取,所以需要注意自己的Kubernetes版本。而从1.8开始,Kubernetes也将资源分为了下面两种
core metrics(核心指标):采集每个节点上kubelet公开的summary api中的指标信息,通常只包含CPU,内存使用率信息
custom metrics(自定义指标):允许用户从外部的监控系统当中采集自定义的指标,如应用的QPS等指标。
四、直接使用HPA进行自动扩缩容(Kubernetes版本<1.8)
可直接定义HPA对象
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
namespace: default
spec:
maxReplicas: 10
minReplicas: 4
scaleTargetRef:
kind: Deployment
name: nginx-demo
targetCPUUtilizationPercentage: 90
从上面配置可以看出HPA控制了一个nginx-demo的Deployment里的4个Pod副本,当这个Pod的CPUUtilizationPercentage也就是Pod自身的CPU利用率为90%就会进行扩容,最大不超过10个,最小值不会低于4个
注:CPUUtilizationPercentage 是一个计算平均值,即目标 Pod 所有副本自身的 CPU 利用率的平均值。一个 Pod 自身的 CPU 利用率是该Pod当前的 CPU 的使用量除以它的 Pod Request 的值,比如定义一个 Pod 的 Pod Request 为0.4,而当前的 Pod 的CPU 使用量为 0.2,则它的 CPU 使用率为 50%。所以如果目标Pod没有定义Pod Request的值,是无法使用CPUUtilizationPercentage来进行扩缩容的。
当然使用简单的命令也可以直接创建等价的HPA对象
kubectl autoscale deployment php-apache --cpu-percent=90 --min=4 --max=10
五、通过metrics-server来实现扩缩容
1、安装metrics-server
metrics-server代码仓库地址: https://github.com/kubernetes-incubator/metrics-server。下载并且安装后
# 配置command 编辑metrics-server-deployment.yaml,配置如下内容:
...
containers:
- name: metrics-server
image: hub.dz11.com/library/metrics-server-amd64:v0.3.6
command:
- /metrics-server
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
imagePullPolicy: Always
...
kubectl apply -f ./
在metrics-server-deployment.yaml中添加一个command,需要加入两个kubelet配置项,使得metrics-server能够通过kubelet采集数据指标。上述操作会在kube-system中启动一个名称前缀为metrics-server的pods以提供实时数据采集。
通过如下命令验证安装是否成功
# 在apiservice中可以看到多了一个接口
kubectl get apiservice
...
v1beta1.metrics.k8s.io 2020-02-09T03:14:46Z
... # 通过访问metrics.k8s.io接口,如能正常访问代表安装成功 kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq .
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "metrics.k8s.io/v1beta1",
"resources": [
{
"name": "nodes",
"singularName": "",
"namespaced": false,
"kind": "NodeMetrics",
"verbs": [
"get",
"list"
]
},
{
"name": "pods",
"singularName": "",
"namespaced": true,
"kind": "PodMetrics",
"verbs": [
"get",
"list"
]
}
]
}
然后再运行下面两条命令:
#获取node的指标
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq .
#获取pod的指标
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | jq .
确保当前两个命令能正确获得指标
2、创建HPA对象
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: Java
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: serviceA
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 90
- type: Resource
resource:
name: memory
targetAverageValue: 200Mi
当serviceA的所有副本的CPU使用率值超过request限制的90%或者memory的使用率超过200Mi时会触发自动动态扩容行为。而Pod数在2-10之间浮动。
六、总结
通过手工执行 kubectl scale 命令或者通过修改deployment的replicas数量,可以实现 Pod 扩容或缩容从而间接实现我们docker的扩容缩容。但如果仅止于此,显然不符合 Google 对 Kubernetes 的定位目标 —— 自动化、智能化。在 Google 看来,分布式系统要能够根据当前负载的变化情况自动触发水平扩展或缩容的行为。所以HPA就是这样诞生了。而HPA也给我们提供了动态的扩缩容,让我们服务更加具有弹性。
Docker(三):利用Kubernetes实现容器的弹性伸缩的更多相关文章
- Docker应用:Kubernetes(容器集群)
阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ...
- Win10上的Docker应用:Kubernetes(容器集群)
阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ...
- 在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩
在 TKE 上利用 HPA 实现业务的弹性伸缩 概述 Kubernetes Pod 水平自动扩缩(Horizontal Pod Autoscaler,以下简称 HPA)可以基于 CPU 利用率.内存利 ...
- 【Docker】利用数据卷容器来备份、恢复、迁移数据卷
利用数据卷容器来备份.恢复.迁移数据卷 可以利用数据卷对其中的数据进行进行备份.恢复和迁移. 备份 首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载 ...
- Kubernetes使用Keda进行弹性伸缩,更合理利用资源
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 Kubernetes自带的HPA是只支持CPU/MEM的,很多时候我们并不根据这两项指标来进行伸缩资源.比如消费 ...
- 在阿里云上进行Docker集群的自动弹性伸缩
摘要: 在刚刚结束的云栖大会上,阿里云容器服务演示了容器的自动弹性伸缩,能够从容应对互联网应用的峰值流量.阿里云容器服务不仅支持容器级别的自动弹性伸缩,也支持集群节点级别的自动弹性伸缩.从而真正做到从 ...
- 三小时学会Kubernetes:容器编排详细指南
三小时学会Kubernetes:容器编排详细指南 如果谁都可以在三个小时内学会Kubernetes,银行为何要为这么简单的东西付一大笔钱? 如果你心存疑虑,我建议你不妨跟着我试一试!在完成本文的学习后 ...
- 通过重新构建Kubernetes来实现更具弹性的容器编排系统
通过重新构建Kubernetes来实现更具弹性的容器编排系统 译自:rearchitecting-kubernetes-for-the-edge 摘要 近年来,kubernetes已经发展为容器编排的 ...
- [5.19 线下活动]Docker Meetup杭州站—拥抱Kubernetes,容器深度实践
对本次线下活动感兴趣的朋友,欢迎点击此处报名,领取免费票. 今年3月,Docker刚刚过完5岁生日,五年期间,Docker也逐渐在技术和实践方面趋于成熟,更是在去年年底主动拥抱Kubernetes. ...
随机推荐
- @程序员,你们还在用网上乱找的方法导入导出Excel么,我们给你造了个轮子!!!!!
程序员的显著特点 有一天跟一位同事跟我闲聊,讨论起过去若干年软件行业的感受,他问了个问题:你觉得一个好的软件工程师最显著的特点是什么? 我想了一会,说:大概是坐得住吧. 某种意义上来说,在互联网技术飞 ...
- $HNOI2012\ $ 集合选数 状压$dp$
\(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...
- 百度DMA+小度App的蓝牙语音解决方案展示
前记 跟着百度也有一段时间了,经过一年多的努力,我们也做出了一些基于百度的语音助手的产品方案.下面就给大家秀一下我们做的产品.有类似需求的朋友可以多多交流.我们的合作方式十分灵活,可以卖芯片你自己 ...
- TemplateMethodPattern(模板方法模式)-----Java/.Net
一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式
- 「Luogu P3866」[TJOI2009]战争游戏 解题报告
题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...
- 1071 小赌怡情 (15分)C语言
常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩家猜对了,则 ...
- 1033 旧键盘打字 (20 分)C语言
题目描述 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入描述: 输入在2行中分别给出坏掉的那些键.以及应 ...
- BitSet 的使用
BitSet 的简单介绍 BitSet,即位图,是位操作的对象,值只有 0 或 1(即 false 或 true). Java 的 BitSet 内部维护着一个 long 数组,默认初始化时数组的长度 ...
- TCP 协议详解
TCP 协议是 更靠近应用层,因此在应用程序中具有更强可操作性,一些重要 socket 选项都和 TCP 协议相关. TCP 头部信息:TCP 头部信息出现在每个 TCP 报文段中,用于指定通信的源端 ...
- map文件分析
1.MAP文件基本概念 段(section):描述映像文件的代码和数据块 RO:Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码) RW:Read-Write的缩写,主要 ...