容器服务&&AHAS Sentinel 弹性 Demo

应用高可用服务 AHAS(Application High Availability Service)是一款阿里云应用高可用服务相关产品。只要容器服务中的 Java 应用接入了 AHAS 应用流控组件后,用户的应用实例就可以自动根据 AHAS Sentinel 收集的指标(如 QPS、平均响应时间等)进行弹性伸缩,使得系统可以自动根据实时的流量情况进行扩缩容,保证系统的可用性。

0. 安装 alibaba-cloud-metrics-adapter

可以直接在容器服务控制台 应用目录 中安装 alibaba-cloud-metrics-adapter。

容器服务&&AHAS Sentinel 弹性 Demo

相关 repo:https://github.com/AliyunContainerService/alibaba-cloud-metrics-adapter

1. 安装 AHAS Sentinel Pilot

AHAS Sentinel 应用流控 pilot 插件可以自动将 AHAS Sentinel 注入到用户的 Java 应用中,用户无需修改任何代码,就能借助 AHAS 对 Java 应用进行全方位进行系统防护,方便针对系统进行流量管控、服务降级等操作。为了方便演示,我们首先安装 AHAS 应用流控组件 ack-ahas-sentinel-pilot。

登录容器服务 Kubernetes 版控制台,在左侧导航栏选择 市场 > 应用目录,在右侧选中 ack-ahas-sentinel-pilot。在应用目录 - ack-ahas-sentinel-pilot 页面上,在右侧的创建面板中选择前提条件中创建的集群和命名空间,并单击创建。

容器服务&&AHAS Sentinel 弹性 Demo

2. 启动 Java 应用

安装好 ack-ahas-sentinel-pilot 以后,我们可以拉起一个 Java 应用示例,对应的 ConfigMap/Deployment/Service 如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-service-cm-pilot
data:
  application.yaml: |
    spring:
      application:
        name: foo-service
    server:
      port: 8700
    eureka:
      instance:
        preferIpAddress: true
      client:
        enabled: false
    logging:
      file: /foo-service/logs/application.log
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: agent-foo-on-pilot
  labels:
    name: agent-foo-on-pilot
spec:
  replicas: 1
  selector:
    matchLabels:
      name: agent-foo-on-pilot
  template:
    metadata:
      labels:
        name: agent-foo-on-pilot
      annotations:
        ahasAppName: "foo-service-on-pilot"
        ahasNamespace: "default"
    spec:
      containers:
        - name: master
          image: registry.cn-hangzhou.aliyuncs.com/sentinel-docker-repo/foo-service:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8700
          volumeMounts:
            - name: foo-service-logs
              mountPath: /foo-service/logs
            - name: foo-service-config
              mountPath: /foo-service/config
          resources:
            limits:
              cpu: "0.5"
              memory: 500Mi
            requests:
              cpu: "0.5"
              memory: 500Mi
      volumes:
        - name: foo-service-logs
          emptyDir: {}
        - name: foo-service-config
          configMap:
            name: foo-service-cm-pilot
            items:
              - key: application.yaml
                path: application.yml
---
apiVersion: v1
kind: Service
metadata:
  name: foo-service
  labels:
    name: foo-service
spec:
  ports:
  - port: 80
    targetPort: 8700
  selector:
    name: foo-service
  type: LoadBalancer
  externalTrafficPolicy: Local

我们在对应的 Deployment 的 template > metadata > annotation 中配置了 AHAS 应用名称(ahasAppName)和命名空间(ahasNamespace),部署后该应用会显示在 AHAS 流控降级控制台 对应 region 的应用列表中:

容器服务&&AHAS Sentinel 弹性 Demo

我们可以通过 SLB 对外暴露的 external IP 来访问该 Web 服务。可以在 容器服务控制台 - 服务 中拿到该 Service 对应的 external IP(或者通过 kubectl get services):

容器服务&&AHAS Sentinel 弹性 Demo

该示例外部应用提供一个 /foo/time API,返回当前时间戳。我们可以访问该 API 来调用该服务,比如 http://121.196.243.208/foo/time

3. 创建 HPA 配置

接下来我们针对我们的 demo Java 应用来手动创建 HPA,通过 kubectl 命令实现容器自动伸缩配置。

AHAS Sentinel 目前支持四种 metric 判断指标:

  • ahas_sentinel_total_qps:应用的总 QPS(pass+block,平均到每台机器)
  • ahas_sentinel_pass_qps:应用的通过 QPS(平均到每台机器)
  • ahas_sentinel_block_qps:应用的拒绝 QPS(平均到每台机器)
  • ahas_sentinel_avg_rt:应用的平均响应时间

示例 HPA:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: ahas-sentinel-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta2
    kind: Deployment
    name: agent-foo-on-pilot
  minReplicas: 1
  maxReplicas: 3
  metrics:
    - type: External
      external:
        metric:
          name: ahas_sentinel_total_qps
          selector:
            matchLabels:
            # If you're using AHAS Sentinel pilot, then the appName and namespace
            # can be retrieved from the annotation of target Deployment automatically.
            # ahas.sentinel.app: "foo-service-on-pilot"
            # ahas.sentinel.namespace: "default"
        target:
          type: Value
          # ahas_sentinel_total_qps > 30
          value: 30

上述的配置针对 agent-foo-on-pilot Deployment 对应的应用进行自动弹性伸缩,判断的指标是 AHAS Sentinel 中统计的应用 QPS(平均到每台机器),超过 30 就进行扩容,最大扩容副本数为 3。

将以上配置保存成 ahas-sentinel-hpa.yml,我们可以执行 kubectl apply -f ahas-sentinel-hpa.yml 来创建 HPA 配置。

4. 发起压测流量,观察弹性效果

我们提供了发送压测流量的 image,方便测试弹性效果。以下是压测流量 runner 的 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flow-runner
  labels:
    name: flow-runner
spec:
  replicas: 1
  selector:
    matchLabels:
      name: flow-runner
  template:
    metadata:
      labels:
        name: flow-runner
    spec:
      containers:
        - name: runner
          image: registry.cn-hangzhou.aliyuncs.com/sentinel-docker-repo/flow-runner:0.1.0
          imagePullPolicy: Always
          env:
            # 在此处更新为实际的地址
            - name: TARGET_URL
              value: "http://112.124.154.227/foo/time"
            # 每次请求的时间间隔(s),比如 0.1 就代表 QPS 为 10
            - name: SLEEP_TIME
              value: "0.1"

我们可以控制该 runner 的副本数来控制压测的 QPS,比如上述示例中调整 replica = 3 即对应 30 QPS。

我们可以在 容器服务控制台 - 无状态 页面将 replica 数目调成 4,使得 QPS 超过临界值,触发扩容:

容器服务&&AHAS Sentinel 弹性 Demo

一段时间后,可以看到对应的应用容器数目自动扩容成了 2:

容器服务&&AHAS Sentinel 弹性 Demo

AHAS 控制台 - 应用流控 - 机器列表页面也可以看到增加的实例:

容器服务&&AHAS Sentinel 弹性 Demo

然后我们再把 flow-runner 的副本数调成 1,一段时间后(约 5 分钟)对应的容器会自动缩容到一个实例:

容器服务&&AHAS Sentinel 弹性 Demo

容器服务&&AHAS Sentinel 弹性 Demo

上一篇:ASP.NET MVC必知必会知识点总结(二)


下一篇:Gym 100952A&&2015 HIAST Collegiate Programming Contest A. Who is the winner?【字符串,暴力】