Kubernetes 应用发布与监控联动

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 随着小步快跑、快速迭代的开发模式被越来越多的企业认同和采用,应用的发布、升级频率变得越来越频繁。进入云原生时代后,越来越多的应用被容器化,如何方便地对容器类应用进行平稳的发布和升级受到了广泛关注。

前言

随着小步快跑、快速迭代的开发模式被越来越多的企业认同和采用,应用的发布、升级频率变得越来越频繁。进入云原生时代后,越来越多的应用被容器化,如何方便地对容器类应用进行平稳的发布和升级受到了广泛关注。

使用 Kubernetes 的 RollingUpdate 可以方便地实现滚动发布,但这种方式只会检查 pod 本身的状态,缺乏对服务整体 SLA 的感知。一种更科学的方式是将发布与监控指标联动起来。当指标出现异常时,能及时地停止发布或进行回滚。本文将以运行在 kubernetes 中的微服务应用 podinfo 为例介绍如何实现发布与监控的联动。

podinfo

监控方法简介

现代系统中,我们面对的监控数据呈现出了爆炸性的增长趋势。从监控维度上看,包括宿主机、编排工具、容器、应用等。同时,每个维度又包含成百上千个可监控的指标。面对如此丰富的数据,如何及时地发现问题,如何快速地定位系统的性能瓶颈,变得越来越困难。本章介绍的 USE 方法和 RED 方法将为系统的可观测性提供良好的指导。

USE 方法

USE 方法以系统使用的资源作为观测对象,提出了一套快速定位系统性能瓶颈的方法论。对于每一类资源,它建议关注如下指标:

  • Utilization - 资源的使用情况,通常以一个时间段的百分比表示,如最近一分钟内存的平均使用率是 90%。很高的使用率往往是系统性能瓶颈的标志。
  • Saturation - 资源的超载程度,得不到资源的任务通常会被放入队列,因此可用队列长度或排队时间来度量,如 CPUs 的运行时队列长度平均是 4。
  • Errors - 错误事件的个数,如网卡在数据包传输过程发生了 50 次冲突。当错误持续发生从而导致性能下降时需要特别关注。

基于上述指标并结合 USE 提供的策略,我们能快速定位常见的性能问题。

RED 方法

RED 方法是 Weaveworks 的工程师基于 Google 的“四个黄金指标”并结合自己的实践经验,提出了一套适合于微服务场景的应用监控方法论。它从更上层、以更贴近终端用户的视角对系统进行观测。它为每个微服务定义了如下三个关键的度量指标:

  • (Request) Rate - 每秒处理的请求数量。
  • (Request) Errors - 每秒失败的请求数量。
  • (Request) Duration - 请求处理时间的分布。

上述指标能让我们清楚地感知微服务应用的运行状况,并能帮助衡量终端用户的体验问题。

小结

RED 方法和 USE 方法包含了最基本、最有用的监控指标,帮助我们从两方面理解一个系统 - 工作负载的外部视图,以及系统资源对工作负载的反应。这些指标共同构成了系统可观测性的基础。

监控指标分析

根据上一章的理论,这里将监控对象按逻辑划分成资源和应用两大类,下面分别介绍如何采集和计算它们的关键监控指标。

资源指标

由于应用运行在容器中,这里重点关注容器级别的资源状况,包括 CPU、内存等。Kubelet 内置的 cAdvisor 采集了当前主机上容器级别的监控指标,结合 Prometheus 的服务发现功能可以轻松获取集群中所有容器的监控信息。下面以 CPU 和内存为例,介绍如何计算 USE 方法中提到的某些指标。

CPU Utilization

sum(
  rate(
    container_cpu_usage_seconds_total{
      container_name="podinfo",
      pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
    }[1m]
  )
) / 
sum(
  container_spec_cpu_quota{
    container_name="podinfo",
    pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
  }/100000
)

CPU Saturation

sum(
  container_cpu_load_average_10s{
      container_name="podinfo",
    pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
  }
) / 
sum(
  container_spec_cpu_quota{
    container_name="podinfo",
    pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
  }
)

Memory Utilization

sum(
  rate(
    container_memory_rss{
      container_name="podinfo",
      pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
    }[1m]
  )
) /
sum(
  container_spec_memory_limit_bytes{
    container_name="podinfo",
    pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
  }
)

Memory Errors

rate(
  container_memory_failures_total{
    container_name="podinfo",
    pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
  }[1m]
)

应用指标

将 NGINX Ingress Controller 的开关controller.metrics.enabled打开,便可以通过 Promtheus 轻松地获取服务请求相关的各类指标。

helm upgrade -i nginx-ingress stable/nginx-ingress \
--namespace ingress-nginx \
--set controller.stats.enabled=true \
--set controller.metrics.enabled=true

下面介绍如何计算 RED 方法中提到的三个关键指标。

Rate

sum(
  rate(
    nginx_ingress_controller_requests{
      namespace="...",
      ingress="podinfo"
    }[1m]
  )
)

Errors

sum(
  rate(
    nginx_ingress_controller_requests{
      namespace="...",
      ingress="podinfo",
      status=~"5.*"
    }[1m]
  )
) 

Duration

histogram_quantile(0.99,
  sum(
    rate(
      nginx_ingress_controller_request_duration_seconds_bucket{
        namespace="...",
        ingress="podinfo"
      }[1m]
    )
  ) by (le)
)

发布与监控联动

监控指标准备好后,下一步就是如何利用这些指标来影响发布过程,实现更科学和安全的发布。

Flagger 简介

Flagger 是一款开源的,用于自动执行金丝雀发布、蓝绿发布、A/B 测试的工具。它实现了一个控制循环,利用 IstioLinkerdApp MeshNGINXGloo 等产品的路由功能,调整发往不同版本间的流量。更重要的是,它能基于 Prometheus 中的监控指标进行金丝雀分析,并根据结果终止或继续金丝雀发布,实现了发布与监控指标的联动。

NGINX 金丝雀发布

本文开头提到的微服务应用 podinfo 使用 NGINX Ingress Controller 作为流量入口,这里将介绍如何通过 Flagger 实现自动金丝雀发布。

配置步骤

Flagger 的安装非常简单,具体步骤可参考文档 Flagger Install on Kubernetes。Flagger 安装好后,需要为 podinfo 的金丝雀发布创建一个自定义资源对象 Canary,如下:

...
kind: Canary
spec:
  provider: nginx
  # deployment reference
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  # ingress reference
  ingressRef:
    apiVersion: extensions/v1beta1
    kind: Ingress
    name: podinfo
  # the maximum time in seconds for the canary deployment
  # to make progress before it is rollback (default 600s)
  progressDeadlineSeconds: 60
  service:
    # container port
    port: 9898
  canaryAnalysis:
    # schedule interval (default 60s)
    interval: 10s
    # max number of failed metric checks before rollback
    threshold: 10
    # max traffic percentage routed to canary
    # percentage (0-100)
    maxWeight: 50
    # canary increment step
    # percentage (0-100)
    stepWeight: 5
    # NGINX Prometheus checks
    metrics:
    # Error
    - name: request-success-rate
      # minimum req success rate (non 5xx responses)
      # percentage (0-100)
      threshold: 99
      interval: 1m
    # Duration
    - name: "latency"
      threshold: 0.5
      query: |
        histogram_quantile(0.99,
          sum(
            rate(
              http_request_duration_seconds_bucket{
                kubernetes_namespace="test",
                kubernetes_pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
              }[1m]
            )
          ) by (le)
        )
    # CPU Utilization
    - name: "cpu-utilization"
      threshold: 0.8
      query: |
        sum(
          rate(
            container_cpu_usage_seconds_total{
              container_name="podinfo",
              pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
            }[1m]
          )
        ) / 
        sum(
          container_spec_cpu_quota{
            container_name="podinfo",
            pod_name=~"podinfo-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"
          }/100000
        )
...

其中,spec.canaryAnalysis配置了金丝雀发布的具体策略,包括检查频率、失败阈值、增量步长等。这里需要重点关注spec.canaryAnalysis.metrics部分,它指定了金丝雀分析引用的监控数据,这里包含了 RED 方法中的 Error、Duration,以及 USE 方法中的 CPU Utilization。

流程分析

完成上述配置后,当我们更改下列对象便会触发金丝雀发布。

  1. Deployment 中的 PodTemplateSpec。
  2. 被 Pod 通过环境变量或 volume 引用的 ConfigMap。
  3. 被 Pod 通过环境变量或 volume 引用的 Secrets。

flagger-nginx-overview

主要流程如下:

  1. 为新版本创建一系列的金丝雀对象,包括Ingress/podinfo-canaryService/podinfo-canaryDeployment/podinfo
  2. Ingress/podinfo-canarymetadata.annotations.nginx.ingress.kubernetes.io/canary设置为 true,将metadata.annotations.nginx.ingress.kubernetes.io/canary-weight的初始值设置为spec.canaryAnalysis.stepWeight,让 NGINX Ingress Controller 将一部分流量转发至金丝雀版本。
  3. 分析spec.canaryAnalysis.metrics中指定的监控指标。

    1. 如果各项指标均未达失败阈值,则继续提升metadata.annotations.nginx.ingress.kubernetes.io/canary-weight,让 NGINX Ingress Controller 将更多的流量发往金丝雀版本。
    2. 如果失败次数达到了指定的阈值spec.canaryAnalysis.threshold,或者金丝雀发布时间超过了约定的时间spec.progressDeadlineSeconds,则进行回滚。
  4. 当金丝雀版本的流量达到了约定的比例spec.canaryAnalysis.maxWeight,同时各项指标均未达失败阈值,则对原版本进行升级。
  5. Ingress/podinfo-canarymetadata.annotations.nginx.ingress.kubernetes.io/canary设置为 false,同时将metadata.annotations.nginx.ingress.kubernetes.io/canary-weight设置为 0,让 NGINX Ingress Controller 不再将流量发往金丝雀版本 。
  6. 将金丝雀版本的应用缩容至 0。

总结

本文完整地介绍了 Kubernetes 应用发布与监控指标联动的实现方案。除了监控指标,日志也是反映系统运行状况的重要依据。后面我们将持续关注如何基于日志分析的结果来控制和影响发布过程。

参考资料

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
Prometheus 监控 Kubernetes
如何用 Prometheus Operator 监控 K8s 集群外服务?
如何用 Prometheus Operator 监控 K8s 集群外服务?
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
2月前
|
Prometheus 监控 Kubernetes
监控 Kubernetes 集群证书过期时间的三种方案
监控 Kubernetes 集群证书过期时间的三种方案
|
10天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
13 4
|
10天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
21 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
21天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
15 0
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
27 0
|
1月前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
1月前
|
人工智能 自然语言处理 Kubernetes
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
69 0
|
2月前
|
JavaScript NoSQL Redis
深入浅出:使用 Docker 容器化部署 Node.js 应用
在当今快速发展的软件开发领域,Docker 作为一种开源的容器化技术,已经成为了提高应用部署效率、实现环境一致性和便于维护的关键工具。本文将通过一个简单的 Node.js 应用示例,引导读者从零开始学习如何使用 Docker 容器化技术来部署应用。我们不仅会介绍 Docker 的基本概念和操作,还会探讨如何构建高效的 Docker 镜像,并通过 Docker Compose 管理多容器应用。此外,文章还将涉及到一些最佳实践,帮助读者更好地理解和应用 Docker 在日常开发和部署中的强大功能。
90 0