本文主要介绍容器服务稳定性建设中工作负载稳定性优化相关配置和操作建议。
随着容器业务的增长,系统将面临更大的压力和更复杂的挑战。稳定性建设有助于确保系统能够适应增长的需求,支持业务的扩展。容器服务以工作负载与 Kubernetes 集群为核心,在非侵入性改造的前提下,为提升业务稳定性提供参考。
本文主要介绍工作负载稳定性相关内容,更多稳定性优化相关内容,请参见:
在 Kubernetes 中,使用各类工作负载控制器(如 Deployment、StatefulSet、DaemonSet、Job 和 CronJob)来部署应用而非直接使用 Pod,原因如下:
在 Kubernetes 中,避免 Pod 的单点故障是确保高可用性的关键,您可参考如下措施避免单点故障:
Always
。topology.kubernetes.io/zone
。cluster.vke.volcengine.com/machinepool-name
,该标签值为节点池 ID。在 Pod 的节点亲和性调度中,可使用该标签,指定调度 Pod 到特定节点池。Kubernetes 提供了 HPA(Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)实现副本数量的缩放。通过合理配置,HPA 支持监听工作负载的 CPU、内存等指标,根据实际的负载需求动态调整工作负载的副本数,确保应用程序在不同的流量和使用情况下都能保持稳定运行。
集群支持使用云服务器(ECS)调度 Pod,也支持使用弹性容器实例(VCI)或混合使用 VCI、ECS。通过将 Pod 调度到虚拟节点上,并使用 VCI 运行 Pod,可以实现灵活地按需调度 Pod,并且免去容量规划和节点运维。详情请参见 容器服务使用 VCI。
容器服务支持弹性资源优先级调度和 Pod 优先级调度:
两种优先级调度可以共存,协力提升业务稳定性。
在 Kubernetes 中,Pod 的探针(Probes)是用来检查容器是否健康运行的一种机制。探针对于维护集群的稳定性和可靠性起着至关重要的作用。Kubernetes 支持三种主要类型的探针,每种都有其特定的作用和用途:
探针的配置与示例请参见 Kubernetes 官方文档:配置存活、就绪和启动探针。
对于 Pod 所使用的资源,可以配置request
与limit
:
request
表示节点需要为 Pod 提供的最少资源数量。limit
表示 Pod 所能使用的资源数量的限制。如果容器使用了超出limit
的内存,则该容器会因为内存溢出(Out of Memory,OOM)而被重新拉起;如果容器使用了超出limit
的 CPU,则该容器会被进行限速处理。
此外,建议配置临时存储(Ephemeral Storage)限制。在 Kubernetes 中,每个节点都有一定的本地磁盘空间可以用于存储容器的临时数据。临时存储是用来限制容器对这些本地磁盘资源的使用量,以避免容器过度使用本地磁盘资源导致节点磁盘空间不足或资源争用的情况。
说明
如果 Pod Ephemeral Storage 使用超出限额,会导致内存溢出。
Kubernetes 依据 Pod 是否配置了内存/CPU 的request
与limit
,将服务质量等级(QoS)优先级分为了三级:
request
与limit
,且两个值在每个容器的配置中分别相等。request
,且不满足 Guaranteed 等级的要求,即内存/CPU 的值设置的不同。request
与limit
。当 Kubernetes 集群内需要释放 Pod 时,会按照 QoS 优先级进行释放,因此建议将核心工作负载配置为最高优先级的 QoS。为避免因人为因素导致核心工作负载的 QoS 配置遗漏,Kubernetes 提供了 Limit Range 作为准入检查,即如果准入检查未通过则 Pod 将创建失败。Limit Range 的配置,请参见 设置资源限制。
创建或更新工作负载后,容器镜像的拉起速度对业务变更的灰度、观测、回滚都至关重要。为此,火山引擎提供了 P2P 镜像加速 与 容器镜像懒加载 两项能力,助力业务平稳迭代。
在构建业务镜像时,建议使用支持多架构的基础镜像进行构建。这些基础镜像只包含运行应用程序所需的最小组件,减少了攻击面和资源占用量,并提供了在多种架构上的平滑迁移能力。
常用基础镜像如下:
amd64
、arm64
、armv6
、armv7
等。