如何保证部署在kubernetes集群的微服务应用的扩展性和高可用以及可观测性?

内容目录

关键点

  1. 可扩展性应用无状态,配置HPA和VPA和资源Request和Limit,同时要有Metric-Server类的监控
  2. HA方面: 自动化监控,自动化伸缩,故障恢复,容量规划和性能优化
  3. 可观测性方面: 日志采集(ELK,EFK,云上服务),监控和告警(Promethus, Grafana),分布式跟踪和k8s事件和审计日志

1.1 可扩展性方面:

  1. microservice最好是无状态的,这样可以对我们的microservice进行任意扩展。

  2. kubernetes支持HPA和VPA两种auto-scaling模式。
    HPA方面我可以对deployment定义min和max replica和metrics(前提是k8s集群有类似metric-server这类的服务), metrics方面一般是对cpu和memory的utilization, 我们设置limit和request, 然后设置一个percentage, 当all pod的cpu/memory的平均utilization达到了request threshold,那么会触发k8s auto-scaling。

  3. 关于VPA, k8s会动态调整Pod的CPU和内存资源, VPA不是一个built-in功能而是一个独立的项目。

1.2 High availability方面

首先,高可用是个系统工程。高可用应该一直能够对外提供服务,无论遇到什么情况。基于这个愿景,我想基于k8s我们应该做到以下几点:

  1. 自动化监控, k8s 提供了自动化探针(startup, readines和liveness)来对应用健康进行监控;k8s提供了metric-server或者三方的监控工具来监控pod的资源利用率。
  2. 故障转移和容错。k8s根据探针或者其他方面的监控如果发现Pod已经处于不健康的状态,那么它会自动启动一个新的Pod来替换不健康的Pod。
  3. 容量规划和性能优化
  4. 自动化扩容和弹性伸缩: Pod在资源超过request的threshold后会触发自动化扩容,在Pod资源低于threshold后会进行自动化缩容以释放资源。当扩容当最大Pod依然处于不健康的状态,那么k8s会自动重启Pod。

1.3 Observability方面

  1. 日志管理: 使用工具聚集和分析日志。例如:使用ELK或者Fluented
  2. 监控和报警:使用Prometheus和Grafana进行性能监控和告警
  3. 分布式跟踪:使用Jaeger或者Zipin或者自定义分布式跟踪ID来跟踪微服务之间的调用
  4. k8s事件和设计日志:记录和监视集群操作和状态变化

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部