1. 程式人生 > >如何實現Docker應用的自定義彈性伸縮

如何實現Docker應用的自定義彈性伸縮

簡介

現在有很多客戶很關心應用的自動彈性伸縮,有些客戶也有自己的監控框架,並希望能跟阿里雲容器服務進行整合。阿里雲容器服務提供了服務彈性伸縮觸發器,並能夠跟監控框架整合來實現自定義的服務自動彈性伸縮。
阿里雲容器服務會自動採集容器的監控資料,並可以通過整合將監控資料傳送到三方的監控框架中。有了監控資料,我們可以在監控框架中定義自己的報警規則,當指標發生報警的時候呼叫阿里雲容器服務提供的觸發器來進行容器的擴容或者縮容。 下面用Influxdb,Kapacitor來介紹怎樣通過觸發器跟監控框架整合實現自定義彈性伸縮。

生成服務的Scaling觸發器

  • 在阿里雲容器服務的應用列表中,點選要進行自動擴容控制的應用,進入後點擊“建立觸發器”

    screenshot

  • 然後選擇“資源伸縮”,並選擇要伸縮的服務名
    screenshot

  • 生成的觸發器如下:
    screenshot

呼叫sale out的時候需要新增引數&type=scale_out&step=2.

部署Influxdb及監控

包括監控時序資料庫Influxdb, 監控報警框架Kapacitor,及介面展現Grafana. 我們可以用一個模板來部署:

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

模板中通過標籤“ aliyun.monitoring.addon.influxdb”來指定將阿里雲容器服務中的監控資料傳送到Influxdb.

在阿里雲容器服務中增加一個模板,並通過模板建立應用:

screenshot

部署好的應用:

screenshot

配置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=YzM5NmRiNDg                                                                                                               
yYWRhODQwMDJhNjRmNWVhZjcxZjU1ZTllfG5naW54LWRlZmF1bHR8cmVkZXBsb3l8MThtZHFxbXJkNXJ                                                                                                               
kaHw=&secret=xxx&&type=scale_out&step=1')                                                                                                                
        .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%的時候,會自動呼叫擴容觸發器進行容器的擴容。

掃我,和雲棲線上交流

【雲棲快訊】首屆阿里巴巴線上技術峰會,將於7月19日-21日20:00-21:30線上舉辦。峰會邀請到阿里集團9位技術大V,分享電商架構、安全、資料處理、資料庫、多應用部署、互動技術、Docker持續交付與微服務等一線實戰經驗,解讀最新技術在阿里集團的應用實踐。  詳情請點選