如何实现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%的时候,会自动调用扩容触发器进行容器的扩容。

相关文章
|
8月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1150 108
|
6月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
715 51
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
9月前
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
565 59
|
7月前
|
前端开发 JavaScript 应用服务中间件
在Docker部署的前端应用中使用动态环境变量
以上步骤展示了如何在 Docker 配置过程中处理并注入环墨遁形成可执行操作流程,并确保最终用户能够无缝地与之交互而无须关心背后复杂性。
369 13
|
12月前
|
监控 Java Go
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
本文将介绍一种基于 Docker 多阶段构建的无侵入 Golang 应用观测方法,通过此方法用户无需对 Golang 应用源代码或者编译指令做任何改造,即可零成本为 Golang 应用注入可观测能力。
533 85
|
9月前
|
缓存 Java Docker
如何对应用代码进行优化以提高在Docker容器中的性能?
如何对应用代码进行优化以提高在Docker容器中的性能?
407 1
|
8月前
|
运维 Cloud Native Docker
Docker:重塑现代应用交付的基石
Docker:重塑现代应用交付的基石
|
10月前
|
安全 Java Docker
Docker 部署 Java 应用实战指南与长尾优化方案
本文详细介绍了Docker容器化部署Java应用的最佳实践。首先阐述了采用多阶段构建和精简JRE的镜像优化技术,可将镜像体积减少60%。其次讲解了资源配置、健康检查、启动优化等容器化关键配置,并演示了Spring Boot微服务的多模块构建与Docker Compose编排方案。最后深入探讨了Kubernetes生产部署、监控日志集成、灰度发布策略以及性能调优和安全加固措施,为Java应用的容器化部署提供了完整的解决方案指南。文章还包含大量可落地的代码示例,涵盖从基础到高级的生产环境实践。
582 4
|
12月前
|
Linux 数据库 虚拟化
Docker的常见应用部署技巧
以上就是一些Docker的常见应用部署技巧。使用Docker,你可以更容易地部署和管理你的应用,而不需要关心底层的硬件和操作系统。只要你掌握了这些技巧,你就可以更有效地使用Docker来部署你的应用。
215 25
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
397 19