现在有很多客户很关心应用的自动弹性伸缩,有些客户也有自己的监控框架,并希望能跟阿里云容器服务进行集成。阿里云容器服务提供了资源弹性伸缩触发器,并能够跟监控框架集成来实现自定义的服务自动弹性伸缩。

阿里云容器服务会自动采集容器的监控数据,并可以通过集成将监控数据发送到三方的监控框架中。有了监控数据,我们可以在监控框架中定义自己的报警规则,当指标发生报警的时候调用阿里云容器服务提供的触发器来进行容器的扩容或者缩容。 下面用Influxdb,Kapacitor来介绍怎样通过触发器跟监控框架集成实现自定义弹性伸缩。

前提条件

操作步骤

生成 wordpress 资源伸缩触发器

  1. 登录 容器服务管理控制台
  2. 选择创建好的 wordpress 应用,单击应用名称,进入详情页。


  3. 单击 创建触发器,在弹出的对话框中,选择资源伸缩, 并在 服务 下拉框中选择需要设置资源伸缩触发器的服务。
    说明
    您需要将所对应集群的 Agent 升级到最新版本,才能使用资源伸缩触发器。


  4. 此时生成的触发器地址即为 API 的地址。


    说明
    该 API 支持添加 typestep 两个参数,本示例中,调用 sale out 的时候会添加参数 &type=scale_out&step=5

部署监控应用

我们创建一个监控应用,包括监控时序数据库Influxdb、 监控报警框架 Kapacitor 以及界面展现 Grafana。将 wordpress 资源伸缩触发器写到应用配置文件中,达到根据应用负载,资源自动伸缩的目的。

我们使用一个编排模板来部署:

```yaml
version: '2'
services:
  influxdb:
    image: influxdb:0.13
    ports:
     - "8083:8083"
     - "8086:8086"
    container_name: "influxdb"
    labels:
        aliyun.monitoring.addon.influxdb: "http://influxdb:8086"
  grafana:
    image: grafana/grafana:3.0.3-1463994644
    ports:
      - "3000:3000"
    links:
      - influxdb
  kapacitor:
    image: kapacitor:0.13
    ports:
      - "9092:9092"
    volumes:
            - /etc/acs/:/etc/acs/
    environment:
      - KAPACITOR_INFLUXDB_0_URLS_0=http://influxdb:8086
    command: kapacitord -config /etc/kapacitor/kapacitor.conf
```

创建好的应用,如下图所示。



配置Kapacitor报警规则

创建报警规则文件。

在 Kapacitor 中配置报警规则,并当报警时调用扩容触发器 URL。

通过 Web 远程终端或者 Docker Exec 进入 Kapacitor 容器, 增加报警规则,比如我们对CPU指标设置报警规则,创建/etc/acs/cpu.tick 文件,内容如下。

```
stream                                                                                                                                                                                         
    // Select just the cpu measurement from our example database.                                                                                                                              
    |from()                                                                                                                                                                                    
        .measurement('docker_container_cpu')                                                                                                                                                   
    |groupBy('aliyun.cluster', 'aliyun.service.id')                                                                                                                                            
    |alert()                                                                                                                        
        .crit(lambda:  "aliyun.cluster"=='xxxxx' AND "aliyun.service.id"=='xxxxx' AND "usage_percent" > 70)                                                                                                                                                                                    
        .post('https://cs.console.aliyun.com/hook/trigger?
        triggerUrl=Y2E1Y2UwY2NhOWRhMzQ2ZDY4ZmYyZmYyNGZiYTAyNzdjfHdvcmRwcmVzc3xzY2FsaW5nfDE5dXM1cHZjdjQ4cnN8=&secret=xxx&&type=scale_out&step=5')                                                                                                                
        .log('/tmp/alerts.log')   
```

这里对监控的CPU指标 docker_container_cpu 按集群及服务进行聚合然后判断当 usage_percent>70 的时候进行服务扩容。类似,我们也可以增加一个缩容的报警规则。

定义报警规则并启用

在Kapacitor容器中执行如下命令定义并启用报警规则。

kapacitor define cpu_alert -type stream  -tick cpu_alert.tick -dbrp telegraf.default;
kapacitor enable cpu_alert

这样当CPU的使用率超过 70% 的时候,会自动调用扩容触发器进行容器的扩容。

后续操作

您可以通过三方集成系统进行触发,使用 GET 或者 POST 都可以进行触发,例如使用 curl 命令触发。

调用资源伸缩触发器:

说明
调用资源伸缩触发器时,需要在触发器 URL 中手动添加以下参数:
参数名称 必填 语义 可选值
type 伸缩类型 缩容:scale_in;扩容:scale_out
step 伸缩数量 正整数,1~100

例如,调用下面的触发器会执行扩容五个容器的操作。

curl 'https://cs.console.aliyun.com/hook/trigger?triggerUrl=Y2E1Y2UwY2NhOWRhMzQ2ZDY4ZmYyZmYyNGZiYTAyNzdjfHdvcmRwcmVzc3xzY2FsaW5nfDE5dXM1cHZjdjQ4cnN8=&secret=xxx&&type=scale_out&step=5'