内容目录
关键点
- 可扩展性应用无状态,配置HPA和VPA和资源Request和Limit,同时要有Metric-Server类的监控
- HA方面: 自动化监控,自动化伸缩,故障恢复,容量规划和性能优化
- 可观测性方面: 日志采集(ELK,EFK,云上服务),监控和告警(Promethus, Grafana),分布式跟踪和k8s事件和审计日志
1.1 可扩展性方面:
-
microservice最好是无状态的,这样可以对我们的microservice进行任意扩展。
-
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。 -
关于VPA, k8s会动态调整Pod的CPU和内存资源, VPA不是一个built-in功能而是一个独立的项目。
1.2 High availability方面
首先,高可用是个系统工程。高可用应该一直能够对外提供服务,无论遇到什么情况。基于这个愿景,我想基于k8s我们应该做到以下几点:
- 自动化监控, k8s 提供了自动化探针(startup, readines和liveness)来对应用健康进行监控;k8s提供了metric-server或者三方的监控工具来监控pod的资源利用率。
- 故障转移和容错。k8s根据探针或者其他方面的监控如果发现Pod已经处于不健康的状态,那么它会自动启动一个新的Pod来替换不健康的Pod。
- 容量规划和性能优化
- 自动化扩容和弹性伸缩: Pod在资源超过request的threshold后会触发自动化扩容,在Pod资源低于threshold后会进行自动化缩容以释放资源。当扩容当最大Pod依然处于不健康的状态,那么k8s会自动重启Pod。
1.3 Observability方面
- 日志管理: 使用工具聚集和分析日志。例如:使用ELK或者Fluented
- 监控和报警:使用Prometheus和Grafana进行性能监控和告警
- 分布式跟踪:使用Jaeger或者Zipin或者自定义分布式跟踪ID来跟踪微服务之间的调用
- k8s事件和设计日志:记录和监视集群操作和状态变化