第一篇 | 从节点中心转型 Serverless 化架构的利器
第二篇 | 面对降本增效,如何有效提升装箱率?
第三篇 | 弹性容器实例:基于 Argo Workflows 和 Serverless Kubernetes 搭建精细化用云工作流
近十年来,数字化转型浪潮席卷各行各业,诸如金融、零售、制造、电信、医疗保健、汽车等行业都开始依赖数字服务和数字基建重塑业务、拓展边界。随着越来越多关键行业和关键业务被转移至线上,这些业务是否能随时可用和正常运行,已经关乎企业发展、社会稳定乃至人身安全,例如活动期间应用服务能否安稳应对流量洪峰、金融支付业务是否能始终提供稳定可靠的服务……
根据 Gartner 的调研报告:一次停机会使企业每分钟平均损失 5600 美元,每小时损失 14 万至 54 万美元不等(对于中小企业来说,每分钟的损失在 450 至 1,000 美元之间)。除了金钱和生产力方面的损失,还原数据、应用程序以及调查事件,都需要企业付出巨大的时间和金钱成本。
随着技术的发展和业务需求的驱动,如何在长期运营中保障业务不中断,已经成为企业不可避免的挑战。
火山引擎云原生产品和解决方案,脱胎于字节跳动多年的云原生技术栈经验和最佳实践沉淀。在面对抖音电商大促和春晚活动等百亿级流量大考时,云原生服务多次展现出高弹性、高可用、无感知的能力,为活动顺利开展提供可靠的运维保障。现在,这些实战经验都已经融入火山引擎的产品中。
以容器服务 VKE(Volcengine Kubernetes Engine)为例,它通过深度融合新一代云原生技术,提供以容器为核心的高性能 Kubernetes 容器集群管理服务,支持企业在云端一键构建高可用 Kubernetes 集群,并通过控制面自动恢复和高可用配置、提供全面覆盖的可观测性指标、支持智能化的节点巡检和自愈,充分保障集群的稳定可靠和客户业务的连续可用。
弹性容器实例 VCI 则深度融合 Serverless 技术,结合容器服务 VKE 提供的高可用特性,可提供极致用云、极致开发体验,用户无需购买和管理底层云服务器等基础设施,只为容器实际运行消耗的资源付费。同时,VCI 还支持秒级启动、高并发创建、沙箱容器安全隔离等能力。
随着 VKE/VCI 服务于越来越多的客户,我们发现,客户经常会有如下困惑:
- 如何提升容器集群自身的可用性,保障业务的正常发布与运维
- 如何利用多可用区部署来提升业务的可用性
- 如何最大化保证 Serverless 弹性资源在业务有需求时能快速供给
针对上述疑问,下文将介绍如何利用火山引擎容器服务 VKE、弹性容器 VCI 创建高可用集群、部署高可用业务以及对已有集群进行高可用改造。
容器集群的可用性包括控制面和业务节点,提升可用性的关键是要将控制面和业务容器打散到不同的可用区(AZ)。在火山引擎容器服务 VKE 中,用户可以选择创建高可用集群,将管控和业务都分散到多个可用区:
- 将控制面部署打散到不同的可用区;
- 在业务部署时,把业务 Pod 也打散到不同可用区中。
这样 VKE 的控制面和部署在实例之上的业务就不会因为单个可用区发生了抖动或故障等原因造成业务中断,从而帮助用户将事故影响降到最低。
新建高可用集群
VKE 控制面高可用配置
-
登录容器服务控制台
-
在集群管理页面左侧导航栏,选择集群
-
在集群列表页面单击左上角创建集群,配置所需参数
-
Kubernetes 版本建议选择最新版本
-
控制面子网建议选择分别在 3个不同可用区中创建的虚拟子网,VKE 会在所选可用区下创建 Kubernetes 的托管控制面组件
-
Pod 子网建议选择分别在 3 个及以上的不同可用区中创建的虚拟子网,业务 Pod 可以在所选可用区下进行创建(Pod 子网 IP 数量会限制可运行 VCI Pod 数,需要根据业务情况进行规划)
-
-
创建节点池(可选)。容器服务 VKE 支持有节点形态、Serverless 形态及混合形态,且各形态之间支持相互转换。纯 Serverless 形态的集群可选暂不创建。
- 创建自定义节点池,子网建议选择分别在 3 个不同可用区中创建的虚拟子网,并选择均衡策略。创建的节点会尽量打散到多个可用区/子网
- 选择计算规格时,建议与对接服务人员沟通所需规格在各 AZ 库存情况,以便前一步操作配置的均衡策略能真正生效
VCI 虚拟节点高可用配置
-
选择集群组件
- vci-virtual-kubelet 组件提供了虚拟节点功能,安装该组件后集群就可以创建 VCI Pod。组件部署后,集群会在存在 Pod 可用 subnet 的 AZ 中创建虚拟节点
- 可根据业务需要安装 csi、ingress nginx、日志、监控等组件
-
确定配置并勾选同意服务条款后,确认创建集群。集群创建成功后,在虚拟节点页面可以看到在三个可用区都创建好了虚拟节点,并可针对虚拟节点做配置操作
注:创建集群时更多配置请参考火山引擎容器服务产品帮助文档
已有集群高可用改造
VKE 控制面高可用改造
如果用户已经创建了 VKE 集群,但没有在创建时选择 3 个 AZ 的虚拟子网,控制面资源会无法在 3 个 AZ 进行部署。在这种情况下,为保证集群控制面的 AZ 级别高可用,用户需要在控制台添加不同可用区的控制面子网。添加子网后 API Server 会滚动重启,并将控制面资源在多 AZ 打散部署,提升集群控制面的可用性。
VCI 虚拟节点高可用改造
当 VKE 集群未添加某可用区 Pod 虚拟子网时,在集群中不会在该 AZ 创建虚拟节点。在虚拟节点页面会显示为“待配置 Pod子 网”:
点击“配置虚拟节点”并选择可用区下的子网后点击确定,即可在该可用区安装虚拟节点。
火山引擎弹性容器实例 VCI 在每个 AZ 提供无需提前规划的资源弹性,能够在突发流量下提供弹性资源,保障业务可用性。同时 VCI 允许用户只为实际运行中的业务所占用的计算资源付费,可以帮助用户提升资源利用率,显著降低资源成本。
使用弹性容器实例 VCI 部署业务时,用户可以通过多可用区打散显著提高业务的可用性。不过要实现这一目标,需要满足几个前提条件
- 容器集群需要支持对接多可用区弹性容器实例 VCI 资源;
- VCI 在不同可用区需要支持相同的资源规格,确保同样的业务 Pod 配置在不同可用区均可正常创建;
- 业务 Pod 需要被调度到有足够库存的可用区,保证有足够多的资源可以创建 Pod。
虚拟节点介绍
火山引擎的容器服务 VKE 已经通过虚拟节点的方式,无缝集成了多可用区的弹性容器实例 VCI 资源。用户只需要按照前一章节里介绍的方式,配置多个可用区的虚拟节点,即可实现业务多可用区打散部署的目标。
虚拟节点与普通节点相比,配置有 taint 和特殊的 instance-type:
- taint 配置
vci.vke.volcengine.com/node-type=vci:NoSchedule
- 节点 label
node.kubernetes.io/instance-type
的 value 为virtual-node
当需要将 Pod 调度到虚拟节点时,需要在 Pod metadata.annotation 中配置 vke.volcengine.com/burst-to-vci: enforce
,容器服务 VKE 集群内的 webhook 会将该 annotation 映射成nodeSelector
和toleration
。
同时,用户也可以像使用普通节点一样,给虚拟节点增加业务所需的 label 和 taint,以达到控制 Pod 在不同虚拟节点上调度,形成 AZ 级别高可用部署的目的
通用算力型规格
随着产品持续迭代以及不同时期资源供给的差异,不同可用区的弹性容器实例 VCI 提供的 CPU 资源会有代系和配置差异,这会给业务多可用区部署带来一定的挑战。
为了解决这一问题,火山引擎弹性容器实例 VCI 特别推出了更贴近 Serverless 场景的 通用算力型(u1)规格,可屏蔽后端处理器差异,并提供基于实际后端物理资源水位的控制调度能力,提升了对 CPU 性能和代系不敏感的业务的使用体验。更多 CPU 规格说明请参考帮助文档 VCI 实例规格介绍--容器服务-火山引擎。
- 通过 Pod annotation
vci.vke.volcengine.com/preferred-instance-family
可指定 VCI 规格族,建议使用vci.u1
- 设置 Pod
topologySpreadConstraints.maxSkew
,将 Pod 均衡调度到各个可用区的虚拟节点上
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-vci
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: test-vci
template:
metadata:
annotations:
vci.vke.volcengine.com/preferred-instance-family: vci.u1
vci.volcengine.com/tls-enable: "true"
vke.volcengine.com/burst-to-vci: enforce
labels:
app: test-vci
spec:
containers:
- image: nginx
name: test
topologySpreadConstraints:
- labelSelector:
matchLabels:
app: test-vci
maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
- 通过设置 Pod annotation
vke.volcengine.com/preferred-subnet-ids
指定分布在不同 AZ 中的虚拟子网,将 Pod 尽量均衡地调度到多个 subnet 中。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-vci
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: test-vci
template:
metadata:
annotations:
vci.vke.volcengine.com/preferred-instance-family: vci.u1
vke.volcengine.com/preferred-subnet-ids: subnet-3tispp1nai****,subnet-rrzaekmgwv***,subnet-miongn2m***
vci.volcengine.com/tls-enable: "true"
vke.volcengine.com/burst-to-vci: enforce
labels:
app: test-vci
spec:
containers:
- image: nginx
name: test
除了 CPU 资源外,VCI 同时提供各类型 GPU 资源,更多信息请联系火山引擎支持人员。
库存感知调度
由于不同可用区的资源供给以及售卖情况并不一致,部分资源规格,如部分 GPU 卡以及大规格 CPU(例如 64 核)资源偶尔会有售罄的情况,此时将 Pod 调度到 VCI 上可能会导致 VCI 没有足够的资源拉起 Pod,从而使 Pod 进入 Failed 状态。
针对上述场景,VCI 提供库存感知调度能力,使得 VKE 在调度 Pod 时,能够感知到对应可用区的VCI 的资源库存,选择库存更加充足的可用区(AZ)来调度,从而提升 Pod 创建成功率。
确保集群安装 vci-virtual-kubelet 和 scheduler-plugin 组件,同时在 scheduler-plugin 中开启 VCI 库存感知调度 开关。
此时,VKE 调度器可以感知到 VCI 资源库存。在配置了多可用区 VCI 虚拟节点的情况下,VKE 集群调度器会去查询每个可用区的 VCI 资源库存情况,并将 Pod 调度到有足够库存的虚拟节点上;当所有可用区的VCI 库存都不足时,Pod 暂时处于调度 Pending 状态,等待库存充足后重新调度,与原生 Kubernetes 的调度行为保持一致。
更多虚拟节点使用方式,请参考帮助文档。
结语
由于上云仍是全球范围内的广泛趋势,未来,业务连续性将会是企业需要面对的长期挑战,打磨更标准、更可靠的高可用方案也是火山引擎云原生团队的长期追求。
我们希望能帮助更多企业解决上好云、用好云的难题,让云资源真正为企业业务带来效益。欢迎感兴趣的用户扫码咨询、使用!
- END -
相关链接
[1] 火山引擎: www.volcengine.com
[2] VCI:www.volcengine.com/docs/6460/76908
[3] VKE:www.volcengine.com/product/vke
[4] 弹性容器实例:基于 Argo Workflows 和 Serverless Kubernetes 搭建精细化用云工作流
[5] 弹性容器实例:从节点中心转型 Serverless 化架构的利器
火山引擎云原生团队
火山引擎云原生团队主要负责火山引擎公有云及私有化场景中 PaaS 类产品体系的构建,结合字节跳动多年的云原生技术栈经验和最佳实践沉淀,帮助企业加速数字化转型和创新。产品包括容器服务、镜像仓库、分布式云原生平台、函数服务、服务网格、持续交付、可观测服务等。