天天看點

容器服務&&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