应用高可用服务 AHAS(Application High Availability Service)是一款阿里云应用高可用服务相关产品。只要容器服务中的 Java 应用接入了 AHAS 应用流控组件后,用户的应用实例就可以自动根据 AHAS Sentinel 收集的指标(如 QPS、平均响应时间等)进行弹性伸缩,使得系统可以自动根据实时的流量情况进行扩缩容,保证系统的可用性。
0. 安装 alibaba-cloud-metrics-adapter
可以直接在容器服务控制台 应用目录 中安装 alibaba-cloud-metrics-adapter。
相关 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 页面上,在右侧的创建面板中选择前提条件中创建的集群和命名空间,并单击创建。
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 的应用列表中:
我们可以通过 SLB 对外暴露的 external IP 来访问该 Web 服务。可以在 容器服务控制台 - 服务 中拿到该 Service 对应的 external IP(或者通过 kubectl get services
):
该示例外部应用提供一个 /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 超过临界值,触发扩容:
一段时间后,可以看到对应的应用容器数目自动扩容成了 2:
AHAS 控制台 - 应用流控 - 机器列表页面也可以看到增加的实例:
然后我们再把 flow-runner 的副本数调成 1,一段时间后(约 5 分钟)对应的容器会自动缩容到一个实例: