AHAS+ACK流量防护最佳实践

简介: AHAS应用防护以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保障业务的稳定性,提供更专业稳定的流量防护手段、秒级的流量水位分布分析功能,是阿里巴巴双十一技术体系中的核心组件,同时也是开源框架Sentinel的商业化产品。本文通过流量防护最佳实践介绍打开方式。

Demo 结构

这个 demo 主要分为部分:Ingress 流量入口以及一个 Java 示例应用。

demo.png

Demo 应用是一个 Java Web 应用(Spring Boot + MyBatis),会有一些 Web 接口,里面会有一些服务调用及 DB 调用操作;同时应用也有一些模拟的自动触发的调用流量。几个 API:

  • /hello?name=xxx: 可以带一个 URL 参数 name,返回值为 Hello, ${name}
  • /time: 返回当前时间
  • /exception: 随机模拟请求异常,异常的请求会返回 500
  • /products: 商品服务,返回当前所有商品;这个 API 会随机产生调用时长(50ms-500ms),可用于模拟慢调用
  • /getProduct?id=xxx: 商品服务,根据 id 返回商品信息

准备工作

  1. 在 ACK 集群中安装 ack-ahas-sentinel-pilot

pilot.png

  1. 在 ACK 集群中部署 demo(也可以使用自己的 Java 应用),示例 YAML:
kind: Deployment
metadata:
  name: ahas-sentinel-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ahas-sentinel-demo
  template:
    metadata:
      annotations:
        ahasPilotAutoEnable: "on"
        ahasAppName: "ahas-sentinel-demo"
      labels:
        app: ahas-sentinel-demo
    spec:
      containers:
        - name: ahas-sentinel-demo
          image: registry.cn-hangzhou.aliyuncs.com/sentinel-docker-repo/ahas-token-client-test:0.2.1
          imagePullPolicy: Always
          resources:
            limits:
              cpu: '2'
              memory: 4Gi
            requests:
              cpu: '1'
              memory: 4Gi
---
# 这个 ClusterIP 类型的 Service 会通过 Ingress 来透出
apiVersion: v1
kind: Service
metadata:
  name: ahas-sentinel-demo-service
spec:
  ports:
    - name: http
      port: 8088
      protocol: TCP
      targetPort: 8088
  selector:
    app: ahas-sentinel-demo
  type: ClusterIP

如何接入 AHAS 流量防护:将以下 annotations 添加到 spec > template > metadata 层级下。其中 ahasAppName 代表应用名称,会展示在 AHAS 控制台上。

  ahasPilotAutoEnable: "on"
  ahasAppName: "ahas-sentinel-demo"

配置后,应用正常拉起,同时进入 AHAS 控制台,切到对应的 region,可以看到指定应用。

  1. 集群中安装 Ingress,并进行相应的配置(配置管理>配置项)。在 kube-system 命名空间下,找到 nginx-configuration 这个 ConfigMap,在里面新增两个配置:
  • key: use-sentinel, value: true,代表开启 AHAS Ingress 防护插件。
  • key: sentinel-params, value: --app=ahas-sentinel-ingress-demo,为接入的 Ingress 网关指定网关名称,会展示在 AHAS Nginx/Ingress 防护控制台

新增配置并保存后,Ingress 会自动接入到 AHAS 流量防护中。在 AHAS Nginx/Ingress 防护控制台 可以看到对应的网关。

  1. 配置 Ingress 路由

Demo 应用是一个 Java Web 应用,后端服务接口为 8080。我们创建一条路由,通过 Ingress 将 Web 服务暴露出来,便于我们访问。

ingress.png

配置好以后,我们可以用对应的域名或 IP 访问 /hello 这个路径(如 http://demo.c515327a9cb3440748abe27e9d3af47d5.cn-hangzhou.alicontainer.com/hello 这种),有成功返回则代表 ready。

Ingress 防护

将 Ingress 接入到 AHAS 流量防护后,我们进入 AHAS Nginx/Ingress 防护控制台 对应网关应用内,可以看到实时的流量访问(默认会有心跳流量)。默认 AHAS 会按 host 维度采集流量并展示监控。

in-console.png

我们下面来演示一下,如何自定义一组请求分组,并对这个请求分组进行监控和流控。首先我们进入“请求分组管理”页面,新建一个请求分组。这里我们给请求分组起个名,会作为资源名展示监控,规则配置也针对这个名称;同时我们配置 URL 匹配模式为“精确”,匹配串为 hello,这个代表所有 URL path 为 /hello 的请求(严格匹配),都会计入这个请求分组,如 http://xxx.com/hello。如果需要根据前缀来区分服务(如 /user/xxx 代表用户服务),可以考虑前缀匹配或正则匹配模式。

undefined

我们下面来演示一下,如何自定义一组请求分组,并对这个请求分组进行监控和流控。首先我们进入“请求分组管理”页面,新建一个请求分组。这里我们给请求分组起个名,会作为资源名展示监控,规则配置也针对这个名称;同时我们配置 URL 匹配模式为“精确”,匹配串为 hello,这个代表所有 URL path 为 /hello 的请求(严格匹配),都会计入这个请求分组,如 http://xxx.com/hello。如果需要根据前缀来区分服务(如 /user/xxx 代表用户服务),可以考虑前缀匹配或正则匹配模式。

undefined

配置完毕后,我们再通过 Ingress 请求我们刚才的 /hello API,会发现在监控页面能看到 hello-group 这个请求分组的访问。我们给这个请求分组配置一条 QPS=300 的限流规则:

undefined
可在‘规则管理’窗口查看设置的规则
undefined

然后我们通过PTS控制台 触发请求访问:

1.进入快速压测
undefined

2.设置压测参数
undefined

3.压测中
undefined

4.防护效果
监控页面也可以看到有请求被拒绝:
undefined

Ingress 层限流后默认的行为是返回 429 状态码,目前暂时不支持通过控制台配置返回行为,后续版本会进行支持。

整个 Nginx/Ingress 防护配置的流程:

request-group

主动降级

主动降级的场景比较明确,活动前提前把一些非关键接口降级掉,直接返回特定的内容(相当于 mock 掉)。

针对其中一个 Web API(如 /time)新建主动降级规则,在行为配置页面,选择一个 Web 行为(之前没有配过就新增),然后保存规则:

undefined

undefined

undefined

此时再触发请求,会发现请求会直接返回我们指定的状态码和内容。活动结束后,将规则关闭或删除,该 API 又可以恢复正常服务。

undefined

限流

同样找一个 Web API,在上面配置单机限流规则,并配置防护触发后的返回,然后频繁触发请求即可。比如针对 /exception 这个接口:

undefined

熔断

熔断规则建议在 consumer 侧(RPC 调用端或 SQL 客户端)配置,建议针对弱依赖服务(非核心可降级)进行配置。

  • 异常熔断可以用 /exception 这个 Web 接口
  • 慢调用熔断可以用 com.alibaba.csp.sentinel.demo.service.ProductService:getAllProducts() 这个模拟 RPC 接口调用(由 /products Web API 触发)

示例配置,资源名为 com.alibaba.csp.sentinel.demo.service.ProductService:getAllProducts()

undefined

上面的规则效果:对于这个 RPC 调用,统计维度为 20s 内的量,最小请求数目 5 代表至少这 20s 请求5次才会触发熔断规则;熔断规则的条件是,请求时长超过 100ms 的会被记为慢调用,如果这20s内慢调用的占比超过 60%,则会触发熔断。触发熔断后,该调用会直接被拒绝(默认抛异常),直到过了熔断时长 5s 以后,再来请求时会允许1个请求通过,进行探测;若请求 RT 正常,则认为远端服务已经恢复,此时对该服务的调用会恢复正常;否则会认为未恢复,重置会熔断状态。
undefined

如何决定慢调用 RT:可以通过 RT 监控进行观察,或根据业务需要进行评估

Web 热点参数流控

Web 热点参数流控可以用 /hello?name=xxx 这个 API 做示例。我们在 场景防护-Web 场景规则 中找到 /hello 这个接口(需要之前访问过),然后点右侧的“+”号,新增 Web 参数流控规则。

以下的规则示例,会针对 URL 参数里面的 name 对应的每个参数值,自动统计其中的热点访问,并分别对热点参数限制 QPS 为 1(每秒钟对应参数的请求不超过1次):

undefined

我们用一个脚本循环模拟非常多的请求参数,然后连续刷几次这个脚本(效果就是有一部分请求参数 QPS > 1):

set -e

for i in {1..10000}
do
    # 这里替换成实际的域名或 IP
    curl "localhost:8088/hello?name=foo${i}"
done

可以看到有几波请求被拒绝:

undefined

同时在热点参数 block 监控页面,可以看到被拒绝的 top 参数展示(交互还在优化中):

undefined

undefined

并发控制(隔离规则)

这个可以用 ab 模拟 Web 并发请求进行演示,但关键在于让客户理解以下几点:

  • 并发控制可以防止某个慢调用占满整个线程池,挤占所有正常资源
  • 并发数可近似由 concurrency=RT*QPS 来估算,可适当放大
  • 无论核心与非核心接口都适用,一般建议在 consumer 侧(RPC 调用端或 SQL 客户端)配置
相关文章
|
1月前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
14天前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
14天前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
1月前
|
存储 运维 Kubernetes
K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复
在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。
|
1月前
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
49 1
|
2月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--Traffic Shifting 流量接入
k8s学习--Traffic Shifting 流量接入
|
2月前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
3月前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
4月前
|
Kubernetes 安全 数据安全/隐私保护
Kubernetes 安全性最佳实践
【8月更文第29天】随着容器化和微服务架构的普及,Kubernetes 已成为管理容器化应用的标准平台。然而,随着 Kubernetes 的广泛采用,其安全性问题也日益受到关注。本文将深入探讨 Kubernetes 的安全最佳实践,并通过具体的代码示例来展示如何保护 Kubernetes 集群免受攻击。
237 2
|
4月前
|
Kubernetes jenkins 持续交付
Kubernetes CI/CD 集成:持续交付的最佳实践
【8月更文第29天】随着微服务架构和容器化的普及,Kubernetes 成为了运行容器化应用的事实标准。为了确保应用能够快速迭代并稳定发布,持续集成/持续部署(CI/CD)流程变得至关重要。本文将介绍如何将 Kubernetes 集成到 CI/CD 流程中,并提供一些最佳实践。
342 1

热门文章

最新文章