K8s应用运维管理最佳实践

本文介绍部署在K8s集群上的应用在不同阶段需要注意的事项,以及如何实现在第一时间获得EDAS的发布动态。

应用开发

您可以使用不同的开发者工具来开发应用,帮助您提升开发和部署效率。

应用部署与联调

  • Cloud Toolkit

    Cloud Toolkit是阿里云为开发者在IDEA中提供的一款插件,用于帮助开发者提升开发效率,并将应用部署到EDAS中。相关文档,请参见Cloud Toolkit概述

  • toolkit-maven-plugin

    toolkit-maven-plugin插件可以帮助应用实现自动化部署。相关文档,请参见toolkit-maven-plugin概述

持续集成与部署

  • Jenkins

    Jenkins是一个开源工具,帮助开发者持续、自动的构建和测试软件项目、监控外部任务的运行。相关文档,请参见Jenkins概述

  • 云效

    阿里云云效支持公共云、专有云和混合云多种部署形态,提供了灵活易用的持续集成、持续验证和持续发布功能,能够帮助开发者快速将应用部署至EDAS。相关文档,请参见概述

搭建云基础环境

  • Terraform

    Terraform是一个开源工具,帮助开发者在阿里云安全高效地预配和管理云基础结构。相关文档,请参见Terraform概述

应用部署

此处仅介绍应用部署中需要注意的事项。如需了解应用部署的更多信息,请参见创建和部署应用概述

应用基本信息

如果选择镜像部署方式,建议使用容器镜像服务企业版(ACR EE)管理镜像。

容器镜像服务企业版相对于个人版有以下优势:

  • 提升应用镜像的分发效率。

  • 支持镜像安全扫描及多维度漏洞报告,保障存储及内容安全。

  • 提供应用镜像的网络访问控制,保障应用镜像访问安全。

更多关于容器镜像服务的信息,请参见什么是容器镜像服务ACR

关于如何制作应用镜像并上传到容器镜服务,请参见制作应用镜像

应用配置信息

  • 建议为应用配置2个及以上Pod实例。

    配置多个Pod实例,可有效避免单个Pod实例故障而导致的应用无法使用。

  • 建议为应用配置合理的CPU资源预留(Request)和Mem资源限制(Limit)。

    配置合理的资源配额,为应用的Pod配置QoS Class。

    说明

    对于Java应用,配置的Mem资源限制(Limit)不应低于JVM配置的内存使用上限,否则会在Pod层面出现内存不足(OOM),导致Pod重启。

应用高级配置信息

  • 配置调度规则。

    建议为应用设置尽量多可用区部署尽量多节点部署类型的调度规则。部署应用时,Pod实例会利用反亲和性,尽可能打散Pod实例并部署到多可用区和不同节点,可有效避免单个Pod实例故障而导致的应用无法使用。相关文档。请参见配置调度规则

  • 建议为应用设置合理的日志滚动策略,及时清理。

    Pod实例内打印过多日志将侵占节点的磁盘空间,导致节点进入DiskPressure状态,并引发Pod驱逐。

  • 合理配置应用生命周期的探针。

    • 为了便于故障自愈和优雅上下线,Liveness存活探针的各参数配置应当保证应用可以正常启动,若应用正常启动时间较长,可以配置更长的首次启动延迟时间(InitialDelaySeconds)。相关文档,请参见配置应用生命周期的钩子和探针

    • 如果部署的是非微服务应用,且通过Service实现的服务暴露,Readiness就绪探针的各参数配置应当保证能准确的反映应用健康状况,以免非健康Pod提供服务(即未被Service摘除)。相关文档,请参见配置应用生命周期的钩子和探针添加服务Service

  • 配置日志收集规则。

    将Pod实例日志持久化保存到SLS日志服务,便于问题排查。由于Pod实例本身是无状态的,会因为各种调度而重新创建和删除,因此需要将Pod实例的日志进行集中化收集并持久化存储。相关文档,请参见配置日志收集

应用运行

此处介绍应用运行阶段需要注意的事项,当需要开展促销活动时,还需要提前进行应用压测、弹性伸缩等配置。

一般运行时态

  • 谨慎使用编辑应用的YAML文件功能。

    对于EDAS部署时可修改的配置项,建议在EDAS侧完成相关配置,不建议通过编辑YAML文件功能来修改配置项,直接编辑资源会导致应用重启。如果一定需要修改YAML文件,修改前需要熟悉Deployment资源的配置方法。

    例如:通过编辑YAML文件修改Deployment的原生发布策略UpdateStrategy权限,有且仅会生效一次。当再次部署应用时,仍会使用EDAS的升级策略(单批发布、分批发布和金丝雀发布策略)。所以对于EDAS部署时可修改的配置项,都建议直接在EDAS侧完成相关配置。

  • 禁止从负载均衡控制台直接修改SLB实例的监听配置。

    如果需要为应用关联负载均衡SLB,必须在EDAS控制台完成关联SLB实例的监听配置管理。相关文档,请参见添加负载均衡CLB

    重要

    禁止从负载均衡控制台直接修改SLB实例的监听配置(含监听+证书),可能导致SLB控制台修改的配置回退,引发应用入口相关的故障。

  • 请勿配置私网SLB进行集群内部服务的访问。

    Pod实例之间无法直接访问私网SLB地址,私网SLB只是用来提供VPC内非同一K8s集群的访问。当需要在集群内部访问服务时,请创建Service并使用Service地址进行访问。相关文档,请参见添加服务Service

  • 建议为集群配置合理的监控报警。

    一般都需要为集群配置监控报警,如Prometheus监控。以免底层资源不稳定等情况引发业务问题。如需了解更多的集群监控信息,请参见集群监控

高并发时态

  • 在高并发前,做好应用压测。

    建议用性能测试PTS对应用做全链路压测,根据压测水位提前预估好所需Pod和Node数量,在高并发前完成扩容;还需要评估存储和网络带宽,提升存储空间和负载均衡的规格或网络带宽;如果还需要用到应用路由,请注意查看Ingress Controller的监控指标,确认负载情况并设置合理的Pod副本数。

    • 承压的应用Pod尽量分布在同一个可用区,以避免跨可用访问的时延问题。

      如果避免不了Pod分布在不同的可用区,您可以为服务提供者配置同可用区优先调用,从而解决跨可用区调用带来的网络延时。相关文档,请参见配置同可用区优先路由

    • 承压的集群Node节点使用相同的规格,保证Pod的处理性能基本一致。

      如果ECS实例规格差异较大,会容易导致Pod性能表现不一致,业务负载不均。

      需要提前准备好目标规格的Node,如果对应规格的Node无法下单购买,请联系解决方案架构师协调ECS备货。

    • 建议为应用开启弹性伸缩。

      建议直接使用EDAS提供的基于应用指标触发或定时触发的弹性伸缩规则;不建议在K8s层单独开启Deployment的HPA(Horizontal Pod Autoscaling)弹性伸缩,以免影响EDAS应用的正常部署行为。如何使用EDAS提供的基于应用指标触发或定时触发的弹性伸缩规则,请参见自动弹性扩缩容

    • 建议为应用关联多个负载均衡SLB。

      建议从DNS侧配置多个SLB的解析记录,以便分摊负载,消除单个SLB的性能瓶颈。为应用关联SLB,请参见添加负载均衡CLB

      说明

      当前最大规格的负载均衡SLB实例(超强型slb.s3.large)的带宽上限为5 G。

  • 在高并发过程中,做好应用监控和代码封网。

    • 时刻关注相关的应用监控和集群监控,及早发现并解决可能存在的异常问题。相关文档,请参见应用监控概述

    • 高并发过程中,应用处于承压状态,要严格控制应用代码上传,避免出现应用部署更新。

应用变更

此处仅介绍在应用变更阶段的一些注意事项。您可以通过应用监控、应用报警判断应用变更是否正常,如果变更失败可以通过事件和失败分析进行应用诊断。

  • 应用变更前,预留集群资源。

    注意为集群预留资源,避免在部署过程因为资源不足而进展缓慢,甚至部署失败的情况出现。部署失败的相关原因,请参见查看部署失败的执行结果

  • 应用变更中,查看变更详情和应用相关指标。

    • 及时查看应用变更记录,查看变更事件和失败分析。相关文档,请参见查看应用变更

    • 注意查看应用指标变化、发布诊断报告以及进行业务验证,防止应用版本不符合预期。

      如果发布不符合预期应及时回滚,使应用恢复到稳定状态,处理好异常后再进行下一次发布。请勿在不符合预期时仍继续发布,将导致无法回滚到上一个稳定状态。回滚应用,请参见使用控制台回滚应用(K8s)

应用排障

此处介绍常见的应用排障相关事项。

  • 在Java类型应用中,如果出现故障Pod实例,可以借助Arthas诊断,排查Pod故障点。相关文档,请参见Arthas诊断

  • 如果应用无法正常启动,可以将启动命令修改为sleep,再通过kubectl exec手动启动进程,观察输出并分析原因。相关文档,请参见配置启动命令

如何获得EDAS发布动态

您可以在EDAS相关钉钉交流群中,添加EDAS的发版公告机器人,以便在第一时间知晓EDAS的发布动态。相关文档,请参见自助在钉钉群中添加钉钉机器人“EDAS产品小助手”