混合云K8s容器化应用弹性伸缩实战

简介: 混合云K8s容器化应用弹性伸缩实战

 

image.png

 

1. 前提条件

本最佳实践的软件环境要求如下:
应用环境:
①容器服务ACK基于专有云V3.10.0版本。
②公共云云企业网服务CEN。
③公共云弹性伸缩组服务ESS。
配置条件:
1)使用专有云的容器服务或者在ECS上手动部署敏捷PaaS。
2)开通云专线,打通容器服务所在VPC与公共云上的VPC。
3)开通公共云弹性伸缩组服务(ESS)。

2. 背景信息

本实践基于K8s的业务集群运行在专有云上,对测试业务进行压力测试,主要基于以下三种产品和能力:
①利用阿里云的云企业网专线打通专有云和公共云,实现两朵云上VPC网络互通。
②利用K8s(Kubernetes)的HPA能力,实现容器的水平伸缩。
③利用K8s的Cluster Autoscaler和阿里云弹性伸缩组ESS能力实现节点的自动伸缩。

HPA(Horizontal Pod Autoscaler)是K8s的一种资源对象,能够根据CPU、内存等指标对statefulset、deployment等对象中的pod数量进行动态伸缩,使运行在上面的服务对指标的变化有一定的自适应能力。

当被测试业务指标达到上限时,触发HPA自动扩容业务pod;当业务集群无法承载更多pod时,触发公共云的ESS服务,在公共云内扩容出ECS并自动添加到专有云的K8s集群。

 

1.jpg
图 1:架构原理图

 

3. 配置HPA

本示例创建了一个支持HPA的nginx应用,创建成功后,当Pod的利用率超过本例中设置的20%利用率时,则会进行水平扩容,低于20%的时候会进行缩容。

1.若使用自建K8s集群,则通过yaml文件配置HPA

1)创建一个nginx应用,必须为应用设置request值,否则HPA不会生效。

apiVersion:
app/v1beta2
kind: Deployment
spec:template:metadata:creationTimestamp: nulllabels:app: hpa-testspec:dnsPolicy: ClusterFirst     terminationGracePeriodSeconds:30         containers:image: '192.168.**.***:5000/admin/hpa-example:v1'imagePullPolicy: IfNotPresentterminationMessagePolicy:FileterminationMessagePath:/dev/termination-logname: hpa-testresources:requests:cpu: //必须设置request值securityContext: {}restartPolicy:AlwaysschedulerName:default-schedulerreplicas: 1selector: matchLabels:app: hpa-testrevisionHistoryLimit: 10strategy: type: RollingUpdaterollingUpdate:maxSurge: 25%maxUnavailable: 25%progressDeadlineSeconds: 600

2)创建HPA。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:annotations:autoscaling.alpha.kubernetes.io/conditions:'[{"type":"AbleToScale","status":"True","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"ScaleDownStabilized","message":"recentrecommendations were higher than current one, applying the highest recentrecommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"ValidMetricFound","message":"theHPAwas able to successfully calculate a replica count from cpu resourceutilization(percentage ofrequest)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"DesiredWithinRange","message":"thedesiredcount is within the acceptable range"}]'autoscaling.alpha.kubernetes.io/currentmetrics:'[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'creationTimestamp: 2020-04-29T06:57:13Z
name: hpa-test
namespace: default
resourceVersion: "3092268"
selfLink:
/apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/hpa01
uid: a770ca26-89e6-11ea-a7d7-00163e0106e9
spec:maxReplicas: //设置pod数量 minReplicas: 1scaleTargetRef:apiVersion: apps/v1beta2kind: Deploymentname: centos targetCPUUtilizationPercentage://设置CPU阈值

2.若使用阿里云容器服务,需要在部署应用时选择配置HPA

 

2.jpg
图2:访问设置

 

4. 配置Cluster Autoscaler

资源请求(Request)的正确、合理设置,是弹性伸缩的前提条件。节点自动伸缩组件基于K8s资源调度的分配情况进行伸缩判断,节点中资源的分配通过资源请(Request)进行计算。

当Pod由于资源请求(Request)无法满足并进入等待(Pending)状态时,节点自动伸缩组件会根据弹性伸缩组配置信息中的资源规格以及约束配置,计算所需的节点数目。

如果可以满足伸缩条件,则会触发伸缩组的节点加入。而当一个节点在弹性伸缩组中且节点上Pod的资源请求低于阈值时,节点自动伸缩组件会将节点进行缩容。

1.配置弹性伸缩组ESS

1)创建ESS弹性伸缩组,记录最小实例数和最大实例数。

 

3-1.jpg
图3:修改伸缩组

 

2)创建伸缩配置,记录伸缩配置的id。

 

5.jpg
图4:伸缩配置

 

#!/bin/sh
yum install -y ntpdate && ntpdate -u ntp1.aliyun.com && curl http:// example.com/public/hybrid/attach_local_node_aliyun.sh | bash -s -- --docker-version 17.06.2-ce-3 --token
9s92co.y2gkocbumal4fz1z --endpoint 192.168.**.***:6443 --cluster-dns 10.254.**.**
--region cn-huhehaote
echo "{" > /etc/docker/daemon.json
echo "\"registry-mirrors\": [" >>
/etc/docker/daemon.json
echo "\"https://registry-vpc.cn-huhehaote.aliyuncs.com\"" >> /etc/docker/daemon.json
echo "]," >> /etc/docker/daemon.json
echo "\"insecure-registries\": [\"https://192.168.**.***:5000\"]" >> /etc/docker/daemon.json
echo "}" >> /etc/docker/daemon.json
systemctl restart docker 

2.K8s集群部署autoscaler

kubectl apply -f ca.yml

参考ca.yml创建autoscaler,注意修改如下配置与实际环境相对应。

access-key-id: "TFRBSWlCSFJyeHd2QXZ6****"
access-key-secret: "bGIyQ3NuejFQOWM0WjFUNjR4WTVQZzVPRXND****"
region-id: "Y24taHVoZWhh****"

ca.yal代码如下:

---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-addon: cluster-autoscaler.addons.k8s.iok8s-app: cluster-autoscalername: cluster-autoscalernamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: cluster-autoscalerlabels:k8s-addon: cluster-autoscaler.addons.k8s.iok8s-app: cluster-autoscaler
rules:
- apiGroups: [""]resources: ["events","endpoints"]verbs: ["create", "patch"]
- apiGroups: [""]resources: ["pods/eviction"]verbs: ["create"]
- apiGroups: [""]resources: ["pods/status"]verbs: ["update"]
- apiGroups: [""]resources: ["endpoints"]resourceNames: ["cluster-autoscaler"]verbs: ["get","update"]
- apiGroups: [""]resources: ["nodes"]verbs: ["watch","list","get","update"]
- apiGroups: [""]resources: ["pods","services","replicationcontrollers","persistentvolumeclaims","persistentvolumes"]verbs: ["watch","list","get"]
- apiGroups: ["extensions"]resources: ["replicasets","daemonsets"]verbs: ["watch","list","get"]
- apiGroups: ["policy"]resources: ["poddisruptionbudgets"]verbs: ["watch","list"]
- apiGroups: ["apps"]resources: ["statefulsets"]verbs: ["watch","list","get"]
- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["watch","list","get"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: cluster-autoscalernamespace: kube-systemlabels:k8s-addon: cluster-autoscaler.addons.k8s.iok8s-app: cluster-autoscaler
rules:
- apiGroups: [""]resources: ["configmaps"]verbs: ["create","list","watch"]
- apiGroups: [""]resources: ["configmaps"]resourceNames: ["cluster-autoscaler-status", "cluster-autoscaler-priority-expander"]verbs: ["delete","get","update","watch"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: cluster-autoscalerlabels:k8s-addon: cluster-autoscaler.addons.k8s.iok8s-app: cluster-autoscaler
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-autoscaler
subjects:- kind: ServiceAccountname: cluster-autoscalernamespace: kube-system---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: cluster-autoscalernamespace: kube-systemlabels:k8s-addon: cluster-autoscaler.addons.k8s.iok8s-app: cluster-autoscaler
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: cluster-autoscaler
subjects:- kind: ServiceAccountname: cluster-autoscalernamespace: kube-system
---
apiVersion: v1
kind: Secret
metadata:name: cloud-confignamespace: kube-system
type: Opaque
data:access-key-id: "TFRBSWlCSFJyeHd2********"access-key-secret: "bGIyQ3NuejFQOWM0WjFUNjR4WTVQZzVP*********"region-id: "Y24taHVoZW********"---
apiVersion: apps/v1
kind: Deployment
metadata:name: cluster-autoscalernamespace: kube-systemlabels:app: cluster-autoscaler
spec:replicas: 1selector:matchLabels:app: cluster-autoscalertemplate:metadata:labels:app: cluster-autoscalerspec:dnsConfig:nameservers:- 100.XXX.XXX.XXX- 100.XXX.XXX.XXXnodeSelector:ca-key: ca-valuepriorityClassName: system-cluster-criticalserviceAccountName: admincontainers:- image: 192.XXX.XXX.XXX:XX/admin/autoscaler:v1.3.1-7369cf1name: cluster-autoscalerresources:limits:cpu: 100mmemory: 300Mirequests:cpu: 100mmemory: 300Micommand:- ./cluster-autoscaler- '--v=5'- '--stderrthreshold=info'- '--cloud-provider=alicloud'- '--scan-interval=30s'- '--scale-down-delay-after-add=8m'- '--scale-down-delay-after-failure=1m'- '--scale-down-unready-time=1m'- '--ok-total-unready-count=1000'- '--max-empty-bulk-delete=50'- '--expander=least-waste'- '--leader-elect=false'- '--scale-down-unneeded-time=8m'- '--scale-down-utilization-threshold=0.2'- '--scale-down-gpu-utilization-threshold=0.3'- '--skip-nodes-with-local-storage=false'- '--nodes=0:5:asg-hp3fbu2zeu9bg3clraqj'imagePullPolicy: "Always"env:- name: ACCESS_KEY_IDvalueFrom:secretKeyRef:name: cloud-configkey: access-key-id- name: ACCESS_KEY_SECRETvalueFrom:secretKeyRef:name: cloud-configkey: access-key-secret- name: REGION_IDvalueFrom:secretKeyRef:name: cloud-configkey: region-id

5. 执行结果

模拟业务访问:

启动busybox镜像,在pod内执行如下命令访问以上应用的service,可以同时启动多个pod增加业务负载。while true;do wget -q -O- http://hpa-test/index.html;done

观察HPA:

加压前

 

6.jpg
图 5:加压前

 

加压后
当CPU值达到阈值后,会触发pod的水平扩容。

 

7.jpg
图 6:加压后1
8.jpg
图 7:加压后2

 

观察Pod:

当集群资源不足时,新扩容出的pod处于pending状态,此时将触发cluster autoscaler,自动扩容节点。

 

9.jpg
图8:伸缩活动

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lodop打印不显示页码_Excel|13个Excel打印技巧汇总,打印技巧大全

打印技巧是工作必备,无需理由!很多时候大家得不到想要的打印效果,偶尔打印一两张表格,会出现各种状况:标题行不见了?打印范围错了?页眉页脚不对?打印一个内容,总得弄出一…

关于写好文章的3个心法和5点技巧

简介: 技术类文章最需要的是扎实的经验累积、深度思考和精益求精的精神,这些技巧,希望能够锦上添花。 作者 | 双宏 来源 | 阿里技术公众号 我是双宏,负责阿里巴巴内部技术人社区的内容运营,包括每天头条热文专题推荐、…

工商银行分布式服务 C10K 场景解决方案

简介: Dubbo 是一款轻量级的开源 Java 服务框架,是众多企业在建设分布式服务架构时的首选。中国工商银行自 2014 年开始探索分布式架构转型工作,基于开源 Dubbo 自主研发了分布式服务平台。 作者 | 颜高飞 来源 | 阿里巴巴云原生公众号 Dubb…

matlab cell转数组_MATLAB批量修改文件名

评论区旁友建议使用narsort排序而不是直接修改文件名。我觉得相关条件下也可以,所以原文末尾加上了narsot排序法。以下是原文2019-05-09最近实验室小可爱帮忙做实验和记录实验数据,不过新手总有些错误操作,比方说因为忘记修改存储路径导致图片…

Spring Cloud Bus 消息总线介绍

简介: 本文配套可交互教程已登录阿里云知行动手实验室,PC 端登录 start.aliyun.com 在浏览器中立即体验。 作者 | 洛夜 来源 | 阿里巴巴云原生公众号 本文配套可交互教程已登录阿里云知行动手实验室,PC 端登录 start.aliyun.com 在浏览器中立…

更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性

简介: 在正文开始之前,我们先回顾一下单元化部署的概念和设计理念。在边缘计算场景下,计算节点具有很明显的地域分布属性,相同的应用可能需要部署在不同地域下的计算节点上。 作者 | 张杰(冰羽) 来源 | 阿里…

Gartner:2022年全球IT支出将超4万亿美元,软件增速最高

编辑 | 宋慧 供稿 | Gartner 根据Gartner的最新预测,2022年全球IT支出预计将达到4.5万亿美元,相比2021年增长5.5%。 Gartner杰出研究副总裁John-David Lovelock表示:“越来越多的企业将构建新技术和软件,而不是购买和部署它们&am…

Flink 实时计算在微博的应用

简介: 微博通过将 Flink 实时流计算框架跟业务场景相结合,在平台化、服务化方面做了很大的工作,在开发效率、稳定性方面也做了很多优化。我们通过模块化设计和平台化开发,提高开发效率。 微博机器学习研发中心数据计算负责人&…

移动云帮我养出了一片致富鱼塘

“通过U鱼智慧管理平台,水产养殖由‘人治’转变为‘智治’,养得舒心、卖得放心、吃得安心。”广东省渔业种质保护中心相关负责人表示。准确研究,提升科学养殖水平广东省渔业种质保护中心坐落于广州市南沙区东涌镇,占地580亩&#…

sketch里的ios控件_使用Sketch建立Design System

一、 有关Design System之前的文章《使用Adobe XD建立Design System》中介绍了什么是Design System,它有什么用,在设计的哪个阶段使用以及如何用Adobe XD来搭建。这篇文章主要侧重在UI风格已确定的设计后期,用Sketch工具来搭建一个Design Sys…

论好文章和烂文章

简介: 我们为何写作?对于许多技术同学来说,写作是一件比写代码困难许多的事情,和电脑相顾无言数小时,发现自己写不出什么像样的东西来,着实不是一种很好的体验。 作者 | 许晓斌 来源 | 阿里巴巴云原生公众号…

好代码实践:基于Redis的轻量级分布式均衡消费队列

简介: 好代码,给人第一个印象的感觉,就像一篇好文章一样,读起来朗朗上口。不同的文章有不同的风格体裁,不同的代码也有不同的编程风格要求。Python有严格的缩进,像诗歌一样工整对仗;C语言面向过…

浅析低功耗广域网及在智慧城市中的应用

作者 | 沈建华、冷咏雪根据知名物联网分析机构IoT Analytics预测,到2025年,物联网连接数将达到非物联网连接数的3倍。低功耗广域网(LPWAN)作为物联网连接的核心基础设施,其业务特点是发送数据极小,并且为了维持电池供电设备的长时…

rocketmq怎么保证数据不会重复_RocketMQ保证信息有序性和防止重复

分布式开放消息系统(RocketMQ)的原理与实践分布式消息系统做为实现分布式系统可扩展、可伸缩性的关键组件,须要具备高吞吐量、高可用等特色。而谈到消息系统的设计,就回避不了两个问题:java消息的顺序问题消息的重复问题RocketMQ做为阿里开源…

云效Codeup代码评审中的代码协同

简介: 云效 Codeup 汇集了阿里巴巴最新的代码托管、代码协同技术,希望能够造福更多中国和世界的开发者。 大神说:“Show me the code”,于是就有了代码评审。 “Talk is cheap. Show me the code.” ——Linus Torvalds, founder …

代码安全无忧—云效Codeup代码加密技术发展之路

简介: 从代码服务及代码安全角度出发,看看云效代码加密技术如何解决这一问题 代码数据存在云端,如何保障它的安全? 部分企业管理者对于云端代码托管存在一丝担心:我的代码存在云端服务器,会不会被泄露&…

杀死 Oculus ,Facebook 改名 Meta ,是押注元宇宙还是“金蝉脱壳”?

整理 | 祝涛出品 | CSDN(ID:CSDNnews)美东时间10月28日周四,在名为Facebook Connect的年度大会上,Facebook宣布,Facebook将公司名称更改为“Meta”,这个新名字反映了该公司在社交媒体之外的雄心…

java sdp_[java,SDP] java 7 SDP 技术/Socket Direct Protocol 2

With Java 7 and Sockets Direct Protocol , Java Now does RDMA ( Remote Direct Memory Access)有了 SDP 技术支持之后的 Java 7 已经开始逐步实现 RDMA 技术 (远程内存直接访问)RDMA is Remote Dynamic Memory Accesss -- which is a way of moving application buffers bet…

百信银行基于 Apache Hudi 实时数据湖演进方案

简介: 本文介绍了百信银行实时计算平台的建设情况,实时数据湖构建在 Hudi 上的方案和实践方法,以及实时计算平台集成 Hudi 和使用 Hudi 的方式。 本文介绍了百信银行实时计算平台的建设情况,实时数据湖构建在 Hudi 上的方案和实践…

如何做一场高质量的分享

简介: 每个人在分享前都应该先问自己这么一个问题,我为什么要分享?我觉得分享就一个最纯粹的原因,就是“我有一些知识,是别人不知道的,但对他人会有所帮助,所以我想分享给大家”。 作者 | 阿相 …