(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-adapter1. 安裝 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 分鐘)對應的容器會自動縮容到一個執行個體: