azure nginx_Microsoft Azure上的Docker服务发现–通过Nginx或Apache HTTP,Mongo副本集和Hazelcast群集平衡Docker Java应用程序负载...

azure nginx

该项目涵盖Docker应用程序部署中的三个服务发现用例-包括Nginx和Apache HTTP Server负载平衡Mongo副本集Hazelcast集群 。 DCHQ中的服务发现框架提供了事件驱动的生命周期阶段,该阶段执行自定义脚本以重新配置应用程序组件。 在向外扩展可能需要为其重新配置负载平衡器或可能需要重新平衡副本集的群集时,这至关重要。

DCHQ中的服务发现框架绝不替代专用于服务发现的工具。 其中包括: ConsuletcdZooKeeper等 。 实际上,本文包含一个示例,该示例使用Consul&Registrator使用DCHQ部署多层Java应用程序。

本文探讨了为什么在Docker应用程序部署中需要进​​行服务发现,以及解决服务发现挑战的常用方法。

要在15个以上不同的云和虚拟化平台(包括vSphere,OpenStack,AWS,Rackspace,Microsoft Azure,Google Compute Engine,DigitalOcean,IBM SoftLayer等)上运行和管理该项目中的5个应用程序模板,请确保您:

626749_orig

背景

为了释放Docker容器对跨多个服务器(甚至区域)的分布式应用程序部署的强大功能,一定不限于预先定义将哪种服务分配给哪个服务器。 关键环境(如生产环境)中的动态可伸缩性(或自动伸缩)要求不仅适用于新的微服务体系结构,而且还适用于典型的整体应用程序部署。 如果将这些服务绑定到可能面临资源受限或完全不可用的特定服务器,则自动扩展服务充其量将非常困难。

为了能够“发现”我们的服务,我们需要以下内容。

  • 服务注册以存储运行该服务的主机和端口。
  • 服务发现能够“发现”我们在注册过程中存储的信息。

需要这些高级要求来解决服务发现的实际用例。 其中包括:

  • 如果服务停止运行,我们如何注销该服务?
  • 我们如何在“发现的”服务之间平衡负载
  • 如果在典型的横向扩展或纵向扩展期间添加或删除服务,会发生什么?

大多数典型的服务发现工具都具有某种高度可用的分布式键/值存储。 您可以查看此博客 ,以详细比较可用的各种工具。

这些工具的主要缺点是它们依赖于第三方工具以及它们本身在容器上运行的事实。 例如,为了使用Consul,用户需要在应用程序中同时运行Consul和Registrator容器,这最终将增加用户通常必须管理的容器数量。

另一方面,DCHQ使用代理来协调注册和服务发现—信息存储在基础DCHQ数据库中。 这意味着不需要其他容器。 此外,服务发现框架允许用户自定义在某些事件中需要执行的脚本,同时不仅利用应用程序中其他容器的IP和主机名信息,还利用部署时使用的环境变量值,从而提供了更大的灵活性。 。

这并不意味着DCHQ的服务发现框架的使用应替代所使用的其他工具。 使用正确的工具完成工作可获得最佳结果。

在此博客中,我们将介绍Docker应用程序部署中的三个服务发现用例-包括Nginx和Apache HTTP Server负载平衡Mongo副本集Hazelcast集群

我们将介绍:

  • 构建基于YAML的应用程序模板,该模板可在任何可在任何地方运行的Linux主机上重复使用
  • 在任何云上配置和自动扩展基础架构(本博客中的示例为Microsoft Azure)
  • 在Microsoft Azure群集上部署分布式,高可用性应用程序
  • 监视正在运行的容器的CPU,内存和I / O
  • 向外扩展Tomcat应用服务器集群
  • 扩展Mongo副本集群集
  • 扩展Hazelcast群集

构建基于YAML的应用程序模板,该模板可在任何可在任何地方运行的Linux主机上重复使用

登录到DCHQ(托管的DCHQ.io或内部部署版本)后,用户可以导航至“ 管理” >“ 应用程序/计算机” ,然后单击+按钮创建新的Docker Compose模板。

我们使用Docker Hub官方映像创建了5个应用程序模板
模板包括以下应用程序堆栈的示例:

  • 具有Nginx,Tomcat,Solr和Mongo的多层Java应用程序 -使用Consul和Registrator进行服务发现
  • 带有Nginx,Tomcat,Solr和Mongo的多层Java应用程序 -使用DCHQ的服务发现框架
  • 带有Apache HTTP Server,Tomcat,Solr和Cassandra的多层Java应用程序) -使用DCHQ的服务发现框架
  • Mongo副本集 -使用DCHQ的服务发现框架
  • Hazelcast群集 -使用DCHQ的服务发现框架

有关DCHQ中Docker应用程序建模的更多信息,请查看DCHQ上有关Docker Compose模板的详细文档: http ://dchq.co/docker-compose.html

用于在

在所有这些应用程序模板中,您会注意到某些容器在请求时正在调用BASH脚本插件以配置容器。 这些插件也可以在置备后执行。

可以通过导航到Manage> Plug-ins来创建这些插件 。 提供BASH脚本后,DCHQ代理将在容器内执行此脚本。 用户可以指定可以在请求时和供应后覆盖的参数。 $之前的任何内容均被视为参数-例如, $ file_url可以是允许开发人员为WAR文件指定下载URL的参数。 例如,当用户想要刷新正在运行的容器上的Java WAR文件时,可以在请求时间和后置资源中重写此方法。

定义基于YAML的应用程序模板时,需要提供插件ID。 例如,要为Nginx调用BASH脚本插件,我们将引用插件ID,如下所示:

Nginx:
  image: nginx:latest
  publish_all: true
  mem_min: 50m
  host: host1
  plugins:
    - !plugin
      id: 0H1Nk
      restart: true
      lifecycle: on_create, post_scale_out:AppServer, post_scale_in:AppServer, post_stop:AppServer, post_start:AppServer
      arguments:
        # Use container_private_ip if you're using Docker networking
        - servers=server {{AppServer | container_private_ip}}:8080;
        # Use container_hostname if you're using Weave networking
        #- servers=server {{AppServer | container_hostname}}:8080;

您会注意到在以下不同阶段或事件中正在执行相同的Nginx插件:

  • 创建Nginx容器后 ,在这种情况下,应用程序服务器的容器IP将注入默认配置文件中,以促进对正确服务的负载平衡
  • 在扩展或扩展应用程序服务器群集时 -在这种情况下,应用程序服务器的更新后的容器IP将注入默认配置文件中,以促进对正确服务的负载平衡
  • 当应用程序服务器停止或启动时 -在这种情况下,应用程序服务器的更新后的容器IP将注入默认配置文件中,以促进对正确服务的负载平衡

因此,这里的服务发现框架既要进行服务注册 (通过跟踪容器IP和环境变量值), 也要进行服务发现 (通过在某些事件或阶段执行正确的脚本)。

具有插件生命周期阶段的

插件中的生命周期参数使您可以指定执行插件的确切阶段或事件。 如果未指定生命周期,则默认情况下,该插件将执行on_create 。 以下是受支持的生命周期阶段:

  • on_create —创建容器时执行插件
  • on_start-在容器启动后执行插件
  • on_stop-在容器停止之前执行插件
  • on_destroy-在销毁容器之前执行插件
  • post_create —在容器创建并运行后执行插件
  • post_start [:Node] -在另一个容器启动后执行插件
  • post_stop [:Node] -在另一个容器停止后执行插件
  • post_destroy [:Node] -在另一个容器销毁后执行插件
  • post_scale_out [:Node] -在扩展另一个容器集群后执行插件
  • post_scale_in [:Node] -在扩展另一个容器集群后执行插件

要使用EULA许可访问Nginx,Apache HTTP Server(httpd),Mongo副本集和Hazelcast Cluster插件,请确保您执行以下任一操作:

用于跨多个主机进行HA部署的

您会注意到, cluster_size参数允许您指定要启动的容器数量(具有相同的应用程序依赖性)。

host参数允许您指定要用于容器部署的主机。 如果在创建集群时选择了“ 编织”作为网络层,则可以这样做。 这样,您可以确保跨不同主机(或区域)的应用程序服务器群集的高可用性,并且可以遵守关联性规则,以确保例如在单独的主机上运行数据库。 以下是host参数支持的值:

  • host1,host2,host3等–在数据中心(或集群)中随机选择一个主机进行容器部署
  • IP地址1,IP地址2等 -允许用户指定用于容器部署的实际IP地址
  • 主机名1,主机名2等 -允许用户指定用于容器部署的实际主机名
  • 通配符 (例如“ db- ”或“ app-srv- ”)–指定要在主机名中使用的通配符

跨图像的环境变量绑定

此外,用户可以通过引用另一个图像的环境变量来创建跨图像环境变量绑定。 在这种情况下,我们进行了几个绑定-包括mongo_url = {{Mongo | container_private_ip}}:27017 / dchq-其中数据库容器名称在请求时动态解析,并用于确保应用程序服务器可以建立连接与数据库。

以下是受支持的环境变量值的列表:

  • {{字母数字| 8}} –创建一个随机的8个字符的字母数字字符串。 这对于创建随机密码最有用。
  • {{图片名称| ip}} –允许您输入容器的主机IP地址作为环境变量的值。 这对于允许中间件层与数据库建立连接非常有用。
  • {{图片名称| container_ip}} –允许您输入容器的名称作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
  • {{图片名称| container_private_ip}} –允许您输入容器的内部IP作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
  • {{图片名称| port_Port Number}} –允许您输入容器的端口号作为环境变量的值。 这对于允许中间件层与数据库建立连接非常有用。 在这种情况下,指定的端口号必须是内部端口号,即不是分配给容器的外部端口。 例如,{{PostgreSQL | port_5432}}将转换为实际的外部端口,该端口将允许中间件层与数据库建立连接。
  • {{图片名称| 环境变量名称}} –允许您将一个图像的环境变量的值输入另一个图像的环境变量。 这里的用例是无止境的-因为大多数多层应用程序将具有跨映像依赖关系。

为Consul构建Nginx Docker映像

可以在这里找到用于构建Consul的Nginx Docker镜像的Dockerfile和配置文件: https : //github.com/dchqinc/nginx-consul

登录到DCHQ(托管的DCHQ.io或内部部署版本)后,用户可以导航到“ 管理” >“ 映像构建” ,然后单击+按钮创建新的Dockerfile(Git / GitHub / BitBucket)映像构建。

提供所需的值,如下所示:

  • Git URLhttps://github.com/dchqinc/nginx-consul.git
  • Git分支 -该字段是可选的-但用户可以从GitHub项目中指定一个分支。 默认分支是master。
  • Git凭证 –用户可以在DCHQ中将凭证安全地存储到私有GitHub存储库中。 可以通过导航到“ 管理” >“ 云提供商和存储库”并单击“ +”以选择凭据来完成此操作。
  • 集群 –通过DCHQ代理协调Docker映像的构建。 结果,用户需要选择一个集群,在该集群上将使用代理执行Docker映像的构建。 如果尚未创建群集,请参考本以注册已运行的主机或自动进行新虚拟基础架构的配置。
  • 推送到注册表 –用户可以将新创建​​的映像推送到 Docker Hub或Quay上的公共或私有存储库中。 要注册Docker Hub或Quay帐户,用户应导航至Manage > Cloud Providers ,然后单击+以选择Docker Registries。
  • 资源库 –这是将在其上推送映像的资源库的名称。 例如,我们的图像被推送到dchq / nginx-consul:latest
  • 标签 -这是您要为新图像指定的标签名称。 DCHQ中支持的标签名称包括:
    • {{date}} -格式化日期
  • Cron表达式 –用户可以使用开箱即用的cron表达式安排Docker映像的构建。 这方便了用户的每日和每晚构建。

完成必填字段后,用户可以点击保存 。 然后,用户可以单击“ 播放”按钮以按需构建Docker映像。

5352819_orig

多层Java(Consul-Nginx-Tomcat-Solr-Mongo)

626749_orig

Nginx:
  image: dchq/nginx-consul:latest
  publish_all: true
  mem_min: 50m
  host: host1
  plugins:
    - !plugin
      id: GINmu
      restart: true
      lifecycle: on_create
      arguments:
        - APPSERVER_IP={{AppServer | container_private_ip}}
        - SERVICE_NAME={{AppServer | SERVICE_NAME}}
        - SERVICE_TAGS={{AppServer | SERVICE_TAGS}}
        - CONSUL_IP={{Consul | container_private_ip}}

AppServer:
  image: tomcat:8.0.21-jre8
  mem_min: 600m
  host: host1
  cluster_size: 1
  environment:
    - mongo_url={{Mongo|container_private_ip}}:27017/dchq
    - solr_host={{Solr|container_private_ip}}
    - solr_port=8983
    - SERVICE_NAME=app
    - SERVICE_TAGS=production
  plugins:
    - !plugin
      id: oncXN
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/dbconnect.war
        - dir=/usr/local/tomcat/webapps/ROOT.war
        - delete_dir=/usr/local/tomcat/webapps/ROOT
Consul:
  image: progrium/consul:latest
  host: host1
  ports:
    - "8300:8300"
    - "8400:8400"
    - "8500:8500"
    - "8600:53/udp"  
  command: -server -bootstrap -advertise 10.0.2.15

Registrator:
  image: gliderlabs/registrator:latest
  host: host1
  command: consul://<HOST_IP>:8500
  volumes:
    - "/var/run/docker.sock:/tmp/docker.sock"

Solr:
  image: solr:latest
  mem_min: 300m
  host: host1
  publish_all: false
  plugins:
    - !plugin
      id: doX8s
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/names.zip
Mongo:
  image: mongo:latest
  host: host1
  mem_min: 400m

多层Java(ApacheLB-Tomcat-Solr-Mongo)

626749_orig

HTTP-LB:
  image: httpd:latest
  publish_all: true
  mem_min: 50m
  host: host1
  plugins:
    - !plugin
      id: uazUi
      restart: true
      lifecycle: on_create, post_scale_out:AppServer, post_scale_in:AppServer
      arguments:
        # Use container_private_ip if you're using Docker networking
        - BalancerMembers=BalancerMember http://{{AppServer | container_private_ip}}:8080
        # Use container_hostname if you're using Weave networking
        #- BalancerMembers=BalancerMember http://{{AppServer | container_hostname}}:8080
AppServer:
  image: tomcat:8.0.21-jre8
  mem_min: 600m
  host: host1
  cluster_size: 1
  environment:
    - mongo_url={{Mongo|container_private_ip}}:27017/dchq
    - solr_host={{Solr|container_private_ip}}
    - solr_port=8983
  plugins:
    - !plugin
      id: oncXN
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/dbconnect.war
        - dir=/usr/local/tomcat/webapps/ROOT.war
        - delete_dir=/usr/local/tomcat/webapps/ROOT
Solr:
  image: solr:latest
  mem_min: 300m
  host: host1
  publish_all: false
  plugins:
    - !plugin
      id: doX8s
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/names.zip
Mongo:
  image: mongo:latest
  host: host1
  mem_min: 400m

多层Java(Nginx-Tomcat-Solr-MySQL)

626749_orig

Nginx:
  image: nginx:latest
  publish_all: true
  mem_min: 50m
  host: host1
  plugins:
    - !plugin
      id: 0H1Nk
      restart: true
      lifecycle: on_create, post_scale_out:AppServer, post_scale_in:AppServer
      arguments:
        # Use container_private_ip if you're using Docker networking
        - servers=server {{AppServer | container_private_ip}}:8080;
        # Use container_hostname if you're using Weave networking
        #- servers=server {{AppServer | container_hostname}}:8080;
AppServer:
  image: tomcat:8.0.21-jre8
  mem_min: 600m
  host: host1
  cluster_size: 1
  environment:
    - database_driverClassName=com.mysql.jdbc.Driver
    - database_url=jdbc:mysql://{{MySQL|container_hostname}}:3306/{{MySQL|MYSQL_DATABASE}}
    - database_username={{MySQL|MYSQL_USER}}
    - database_password={{MySQL|MYSQL_ROOT_PASSWORD}}
    - solr_host={{Solr|container_private_ip}}
    - solr_port=8983
  plugins:
    - !plugin
      id: oncXN
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/dbconnect.war
        - dir=/usr/local/tomcat/webapps/ROOT.war
        - delete_dir=/usr/local/tomcat/webapps/ROOT
Solr:
  image: solr:latest
  mem_min: 300m
  host: host1
  publish_all: false
  plugins:
    - !plugin
      id: doX8s
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/names.zip
MySQL:
  image: mysql:latest
  host: host1
  mem_min: 400m
  environment:
    - MYSQL_USER=root
    - MYSQL_DATABASE=names
    - MYSQL_ROOT_PASSWORD={{alphanumeric|8}}

Mongo副本集群集

626749_orig

mongo_rs1_srv1:
  image: mongo:latest
  mem_min: 400m
  publish_all: true
  command: --replSet rs1
  environment:
    # inject clustered node ips
    - MONGO_RS1_SRV2_IP={{mongo_rs1_srv2|container_private_ip}}
    # The above mapping will insert comma separated ip list e.g. 10.1.1.1,10.1.12
  plugins:
    - !plugin
      # This plugin initializes the Replica Set
      lifecycle: on_create
      id: QX25F
    - !plugin
      # This plug-in re-balances the Replica Set post scale out
      lifecycle: post_scale_out:mongo_rs1_srv2
      id: sxKM9
    - !plugin
      # This plug-in re-balances the Replica Set post scale in
      lifecycle: post_scale_in:mongo_rs1_srv2
      id: YIALH
# Define this node as clustered
mongo_rs1_srv2:
  image: mongo:latest
  mem_min: 400m
  cpu_shares: 1
  cluster_size: 2
  command: --replSet rs1

淡褐色星团

626749_orig

Hazelcast-Management-Center:
  image: hazelcast/management-center:latest
  # Use this configuration if deploying to a shared VM
  publish_all: true
  # (Recommended) Use this configuration if deploying to a dedicated VM
  #ports:
  #  - 8080:8080
  host: host1
  environment:
    - HAZELCAST_IP={{Hazelcast | container_private_ip}}
Hazelcast:
  image: hazelcast/hazelcast:latest
  # Use this configuration if deploying to a shared VM
  publish_all: true
  # (Recommended) Use this configuration if deploying to a dedicated VM
  #ports:
  #  - 5701:5701
  cluster_size: 1
  host: host1
  plugins:
    - !plugin
      id: Qgp4H
      lifecycle: post_create, post_scale_out:Hazelcast, post_scale_in:Hazelcast
      restart: true
      arguments:
        # Use this configuration if deploying to a shared VM
        - Hazelcast_IP=<member>{{Hazelcast | container_private_ip}}</member>
        # (Recommended) Use this configuration if deplying to a dedicated VM
        #- Hazelcast_IP=<member>{{Hazelcast | ip}}</member>
        - Management_Center_URL=http://{{Hazelcast-Management-Center | ip}}:{{Hazelcast-Management-Center | port_8080}}/mancenter
  environment:
    # Uncomment the line below to specify the heap size
    #- MIN_HEAP_SIZE="1g" 
    # Uncomment the line below to provide your own hazelcast.xml file
    - JAVA_OPTS=-Dhazelcast.config=/opt/hazelcast/hazelcast.xml
  volumes:
    # Uncomment the line below if you plan to use your own hazelcast.xml file
    #- ./configFolder:./configFolder

在Microsoft Azure上配置和自动扩展支持Docker的基础架构

保存应用程序后,用户可以注册一个云提供程序,以在18个不同的云端点(包括VMware vSphere,OpenStack,CloudStack,Amazon Web Services,Rackspace,Microsoft Azure, DigitalOcean,IBM SoftLayer,Google Compute Engine等。

该示例着重于Microsoft Azure,但是这里是一些流行的云和虚拟化平台的示例列表。

在创建云提供商之前,您需要创建一个私钥,然后生成一个证书,该证书需要在Microsoft Azure控制台的“设置”>“管理证书”下上载。

要创建私钥,可以使用以下命令:

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout <key-name>.pem -out <key-name>.pem

然后使用此私钥生成证书:

openssl x509 -inform pem -in <key-name>.pem -outform der -out <cer-name>.cer

在Microsoft Azure控制台的“ 设置”>“管理证书”下上载证书

8271609_orig

然后,您可以导航到“ 管理”>“云提供程序” ,然后单击+按钮以选择Microsoft Azure,从而为Microsoft Azure注册云提供程序。 唯一必需的字段是:订阅ID专用密钥-这是您在上一步中创建的密钥

可选字段允许您强制执行精细的访问控制,并将此提供程序与配额策略相关联。

  • 授权用户 -这些用户被允许使用此Cloud Provider进行基础架构配置。 有资格的用户无权管理或删除此云提供商,并且将无法查看任何凭据。
  • 标题为蓝图 -这些是可与该云提供商一起使用的Machine Compose模板。 例如,如果租户管理员希望限制用户在认证的操作系统上配置4GB计算机,则用户将无法使用该云提供商来配置任何其他计算机。
  • VM限制 -这是可与此云提供商使用的最大虚拟机数量配额策略-这些是用于为VM数量或VM成本设置配额的预定义策略。 可以选择多个配额策略来自定义每个用户或每个用户组的控件。

1361517_orig

跨混合云或本地开发机器的服务器可以与群集关联,这是基础架构的逻辑映射。 用户可以通过导航到“ 管理”>“集群”页面,然后单击+按钮来创建集群。

集群具有高级选项,例如:

  • 租约 –用户可以指定该群集中的服务器何时到期,以便DCHQ可以自动销毁那些服务器。 放置策略–用户可以从多种放置策略中进行选择,例如基于接近度的策略,轮询或默认策略,这是基于容量的放置策略,它将Docker工作负载放置在具有足够计算资源的主机上。
  • 网络 -用户可以选择Docker网络或Weave作为软件定义的网络,以促进跨多个主机的跨容器通信
  • 配额 –用户可以指示此群集是否遵守分配给用户和组的配额配置文件。 例如,在DCHQ.io中,将为所有用户分配8GB的内存配额。
  • 自动扩展策略 –用户可以定义自动扩展策略,以在群集计算资源用尽时自动添加服务器,以满足开发人员对基于容器的新应用程序部署的需求
  • 粒度访问控制 –租户管理员可以定义对群集的访问控制,以指示谁可以通过“ 授权用户”向其部署Docker应用程序。 例如,开发人员可以注册他/她的本地计算机并将其标记为私有。 另一方面,租户管理员可以与特定用户组或所有租户用户共享群集。 另外,集群所有者可以指定哪些应用程序模板可以通过“ 授权蓝图”部署到该集群。 如果群集将在上游环境中使用,则只能在其上部署特定的应用程序模板(或“蓝图”)。

3130034_orig

注册已经运行的虚拟机 -用户可以注册已经运行的Microsoft Azure虚拟机。 可以通过导航到“ 管理”>“计算机” ,然后单击“ +”按钮来完成。 然后,用户可以选择“ VM /裸机”工作流程并填写必填字段。

  • 名称 -您要注册的服务器的名称。 不一定需要是实际的主机名。
  • IP地址 -这是您正在注册的服务器的IP地址。
  • 群集 -新服务器将属于的群集。 确保在注册服务器或配置新服务器之前先创建集群。

4708104_orig

自动配置支持Docker的Microsoft Azure虚拟机 -用户可以通过基于UI的工作流或通过定义简单的基于YAML的计算机组成模板来在新创建的群集上配置Microsoft Azure虚拟机,可以从Self处请求-服务库。 推荐的方法是Machine Compose模板,因为它提供了更多的安全性和标准化。

基于UI的工作流 –用户可以通过导航到“ 管理”>“计算机” ,然后单击+按钮以选择Microsoft Azure来请求Microsoft Azure虚拟机。 选择Cloud Provider后,用户可以选择区域,实例类型和所需的映像。 然后选择一个群集,然后可以指定Microsoft Azure虚拟机的数量。

6785882_orig

然后,用户可以单击Machine Compose按钮以生成基于YAML的Machine Compose模板。 这可用于创建您自己的标准Machine Compose模板,该模板可与具有粒度访问控制的其他用户共享。

基于YAML的计算机组成模板(推荐) –用户可以通过导航到“ 管理”>“应用程序/机器” ,然后单击“ +”按钮选择“计算机组成”,为Microsoft Azure创建计算机组成模板。

这是用于在美国西部地区请求D3 Microsoft Azure虚拟机的模板。

Machine: 
  # Note: Some of the fields are optional based on provider and can be left empty.
  region: West US
  description: This provisions a Docker-enabled Standard D2 virtual machine in West US.
  instanceType: STANDARD_D3
  image: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140416.1-en-us-30GB/West US
  count: 1

Machine Compose模板支持的参数总结如下:

  • 描述 :蓝图/模板的描述
  • 子网 :特定于云提供商的值(例如,AWS的子网ID)
  • dataCenter —特定于云提供商的值(仅当从VM模板而非停止的VM克隆时,vSphere才需要此值)
  • instanceType :云提供商特定值(例如,general1-4)
  • 地区 :云提供商的特定价值(例如IAD)
  • 映像 :强制–完全限定的映像ID /名称(例如IAD / 5ed162cc-b4eb-4371-b24a-a0ae73376c73或vSphere VM模板名称)
  • username :用于连接服务器的用户名
  • 密码 :这可以引用存储在凭据存储中的私钥。 将需要存储在“管理”>“云提供商”页面中的凭据项目的ID。 这是可接受的格式:“ {{凭据| 2c91802a520736224015209a6393098322}}”
  • 网络 :可选–云提供商特定值(例如,默认值)
  • securityGroup :云提供商特定值(例如dchq-security-group)
  • keyPair :云提供商的特定值(例如,私钥名称)
  • openPorts :可选–逗号分隔的端口值
  • count :虚拟机总数,默认为1。

除了这些受支持的参数之外,还可以按以下方式调用插件:

plugins:
    - !plugin
      id: <plugin-id>

可以通过导航到“ 管理”>“插件” ,然后单击“ +”按钮来创建该插件。 插件是一个简单的脚本,可以在正在配置的服务器或Docker容器上运行。 服务器插件可用于多种配置要求:

  • 安装人偶模块,厨师食谱,Ansible Playbook等。
  • 从安全存储中检索私有Docker注册表所需的CA证书,然后将其保存在正确的目录中(例如/etc/docker/certs.d/:5000/ca.crt)

Machine Compose模板具有其他高级选项。

  • 成本配置文件 -这些是可以在管理>成本配置文件下创建的成本配置文件 。 您可以每小时/每周/每月定义每个资源的成本。 您可以将多个成本配置文件附加到单个模板,例如,实例类型,使用的EBS存储等的不同成本配置文件。
  • 授权用户 -这些用户被允许使用此模板来配置虚拟机。 有权使用的用户无权管理或删除此模板,只能使用它。

7220666_orig

保存Machine Compose模板后,用户可以从自助服务库中请求此计算机。 用户可以单击“ 自定义” ,然后选择用于提供这些Microsoft Azure虚拟机的云提供程序群集

7505011_orig

在Microsoft Azure群集上部署分布式,高可用性应用程序

配置虚拟机后,用户可以在新的虚拟机上部署基于Docker的多层应用程序。 可以通过导航到自助服务 ,然后单击“ 自定义”来请求多层应用程序来完成。

用户可以选择环境标签(例如DEV或QE)以及在单击“运行”之前创建的支持Docker的Microsoft Azure群集。

2176036_orig

访问正在运行的容器的浏览器内终端

在Live Apps页面上,容器名称旁边应有一个命令提示符图标。 这允许用户使用安全的通信协议通过代理消息队列进入容器。 租户管理员可以定义命令白名单,以确保用户不会对正在运行的容器进行任何有害更改。

例如,对于Tomcat部署,我们使用命令提示符来确保Java WAR文件已部署在/ usr / local / tomcat / webapps /目录下。

3218740_orig

2329439_orig

监视正在运行的容器的CPU,内存和I / O利用率

一旦应用程序启动并运行,我们的开发人员将监视正在运行的容器的CPU,内存和I / O,以在这些指标超过预定义的阈值时获得警报。 这在我们的开发人员执行功能和负载测试时特别有用。

用户可以执行历史监视分析,并将问题与容器更新或构建部署相关联。 这可以通过单击正在运行的应用程序的“ 统计”菜单来完成。 可以选择一个自定义日期范围来历史查看CPU,内存和I / O。

1305857_orig

向外扩展Tomcat应用服务器集群

如果正在运行的应用程序受到资源限制,则用户可以扩展应用程序以满足不断增加的负载。 此外,例如,用户可以在工作时间安排向外扩展,在周末安排向外扩展。

要将由Apache HTTP Server进行负载平衡的Tomcat服务器群集从1扩展到2,用户可以单击正在运行的应用程序的Actions菜单,然后选择Scale Out 。 然后,用户可以为群集指定新的大小,然后单击“立即运行”

6338469_orig

535679_orig

执行横向扩展时,将使用服务发现框架来更新负载平衡器。 插件将自动在Apache HTTP Server上执行,以更新Apache HTTP Server的httpd.conf文件,以便它知道添加的新应用程序服务器。 这是因为我们已指定post_scale_out:AppServer作为此插件的生命周期事件。

HTTP-LB:
  image: httpd:latest
  publish_all: true
  mem_min: 50m
  host: host1
  plugins:
    - !plugin
      id: uazUi
      restart: true
      lifecycle: on_create, post_scale_out:AppServer, post_scale_in:AppServer
      arguments:
        # Use container_private_ip if you're using Docker networking
        - BalancerMembers=BalancerMember http://{{AppServer | container_private_ip}}:8080
        # Use container_hostname if you're using Weave networking
        #- BalancerMembers=BalancerMember http://{{AppServer | container_hostname}}:8080
AppServer:
  image: tomcat:8.0.21-jre8
  mem_min: 600m
  host: host1
  cluster_size: 1
  environment:
    - mongo_url={{Mongo|container_private_ip}}:27017/dchq
    - solr_host={{Solr|container_private_ip}}
    - solr_port=8983
  plugins:
    - !plugin
      id: oncXN
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/dbconnect.war
        - dir=/usr/local/tomcat/webapps/ROOT.war
        - delete_dir=/usr/local/tomcat/webapps/ROOT
Solr:
  image: solr:latest
  mem_min: 300m
  host: host1
  publish_all: false
  plugins:
    - !plugin
      id: doX8s
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/names.zip
Mongo:
  image: mongo:latest
  host: host1
  mem_min: 400m

同样,可以在由Nginx负载均衡的Tomcat服务器群集上执行横向扩展。 服务发现框架将用于更新负载平衡器。 插件将在Nginx上自动执行,以更新Nginx的default.conf文件,以便它知道添加的新应用程序服务器。 这是因为我们已指定post_scale_out:AppServer作为此插件的生命周期事件。

Nginx:
  image: nginx:latest
  publish_all: true
  mem_min: 50m
  host: host1
  plugins:
    - !plugin
      id: 0H1Nk
      restart: true
      lifecycle: on_create, post_scale_out:AppServer, post_scale_in:AppServer
      arguments:
        # Use container_private_ip if you're using Docker networking
        - servers=server {{AppServer | container_private_ip}}:8080;
        # Use container_hostname if you're using Weave networking
        #- servers=server {{AppServer | container_hostname}}:8080;
AppServer:
  image: tomcat:8.0.21-jre8
  mem_min: 600m
  host: host1
  cluster_size: 1
  environment:
    - database_driverClassName=com.mysql.jdbc.Driver
    - database_url=jdbc:mysql://{{MySQL|container_hostname}}:3306/{{MySQL|MYSQL_DATABASE}}
    - database_username={{MySQL|MYSQL_USER}}
    - database_password={{MySQL|MYSQL_ROOT_PASSWORD}}
    - solr_host={{Solr|container_private_ip}}
    - solr_port=8983
  plugins:
    - !plugin
      id: oncXN
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/dbconnect.war
        - dir=/usr/local/tomcat/webapps/ROOT.war
        - delete_dir=/usr/local/tomcat/webapps/ROOT
Solr:
  image: solr:latest
  mem_min: 300m
  host: host1
  publish_all: false
  plugins:
    - !plugin
      id: doX8s
      restart: true
      arguments:
        - file_url=https://github.com/dchqinc/dchq-docker-java-solr-mongo-cassandra-example/raw/master/names.zip
MySQL:
  image: mysql:latest
  host: host1
  mem_min: 400m
  environment:
    - MYSQL_USER=root
    - MYSQL_DATABASE=names
    - MYSQL_ROOT_PASSWORD={{alphanumeric|8}}

应用程序时间轴可用于跟踪对应用程序进行的每个更改,以进行审核和诊断。 可以从正在运行的应用程序页面底部的可扩展菜单中访问它。 在这种情况下,服务发现框架将在Application Server集群扩展后立即自动执行Apache HTTP Server插件。

2286081_orig

当容器或主机关闭或主机或容器的CPU和内存使用率超过定义的阈值时,警报和通知可用。

扩展Mongo副本集群集

如果正在运行的Mongo副本集受到资源限制,则用户可以扩展它以满足不断增加的负载。 此外,例如,用户可以在工作时间安排向外扩展,在周末安排向外扩展。

要将Mongo副本集从2扩展到3,用户可以单击正在运行的应用程序的“ 操作”菜单,然后选择“ 扩展” 。 然后,用户可以为群集指定新的大小,然后单击“立即运行”

9825028_orig

901523_orig

执行横向扩展时,将使用服务发现框架更新主节点Mongo容器。 插件将在主节点Mongo容器上自动执行,以更新副本集的平衡,以便它知道添加了新的辅助节点Mongo容器。 这是因为我们已指定post_scale_out:mongo_rs1_srv2作为此插件的生命周期事件。

应用程序时间轴可用于跟踪对应用程序进行的每个更改,以进行审核和诊断。 可以从正在运行的应用程序页面底部的可扩展菜单中访问它。 在这种情况下,服务发现框架会在横向扩展Application Server群集后自动执行Mongo Replica Set插件。

9059295_orig

4503703_orig

扩展Hazelcast群集

如果正在运行的Hazelcast群集受到资源限制,则用户可以扩展群集以满足不断增加的负载。 此外,例如,用户可以在工作时间安排向外扩展,在周末安排向外扩展。

要将Hazelcast群集从1扩展到2,用户可以单击正在运行的应用程序的“ 操作”菜单,然后选择“ 扩展” 。 然后,用户可以为群集指定新的大小,然后单击“立即运行”

4179632_orig

1174988_orig

执行向外扩展时,将使用服务发现框架来更新Hazelcast容器。 插件将自动在Hazelcast容器上执行以更新hazelcast.xml文件,以便它知道所添加的新Hazelcast容器。 这是因为我们已指定post_scale_out:Hazelcast作为此插件的生命周期事件。

Hazelcast-Management-Center:
  image: hazelcast/management-center:latest
  # Use this configuration if deploying to a shared VM
  publish_all: true
  # (Recommended) Use this configuration if deploying to a dedicated VM
  #ports:
  #  - 8080:8080
  host: host1
  environment:
    - HAZELCAST_IP={{Hazelcast | container_private_ip}}
Hazelcast:
  image: hazelcast/hazelcast:latest
  # Use this configuration if deploying to a shared VM
  publish_all: true
  # (Recommended) Use this configuration if deploying to a dedicated VM
  #ports:
  #  - 5701:5701
  cluster_size: 1
  host: host1
  plugins:
    - !plugin
      id: Qgp4H
      lifecycle: post_create, post_scale_out:Hazelcast, post_scale_in:Hazelcast
      restart: true
      arguments:
        # Use this configuration if deploying to a shared VM
        - Hazelcast_IP=<member>{{Hazelcast | container_private_ip}}</member>
        # (Recommended) Use this configuration if deplying to a dedicated VM
        #- Hazelcast_IP=<member>{{Hazelcast | ip}}</member>
        - Management_Center_URL=http://{{Hazelcast-Management-Center | ip}}:{{Hazelcast-Management-Center | port_8080}}/mancenter
  environment:
    # Uncomment the line below to specify the heap size
    #- MIN_HEAP_SIZE="1g" 
    # Uncomment the line below to provide your own hazelcast.xml file
    - JAVA_OPTS=-Dhazelcast.config=/opt/hazelcast/hazelcast.xml
  volumes:
    # Uncomment the line below if you plan to use your own hazelcast.xml file
    #- ./configFolder:./configFolder

应用程序时间轴可用于跟踪对应用程序进行的每个更改,以进行审核和诊断。 可以从正在运行的应用程序页面底部的可扩展菜单中访问它。 在这种情况下,服务发现框架将在扩展Hazelcast群集后立即自动执行Hazelcast插件。

8867163_orig

300709_orig

当容器或主机关闭或主机或容器的CPU和内存使用率超过定义的阈值时,警报和通知可用。

结论

容器化企业Java应用程序仍然是一个挑战,主要是因为现有的应用程序组合框架不能解决复杂的依赖关系,服务发现或事后自动扩展工作流。

DCHQ提供托管和内部部署版本,可解决所有这些挑战,并通过高级应用程序组合框架简化企业应用程序的容器化,该框架可促进跨映像环境变量绑定,可在不同位置调用的可扩展BASH脚本插件。服务发现和应用程序集群的生命周期阶段,可跨多个主机或区域实现高可用性,并支持自动扩展。

免费注册在http://DCHQ.io或下载DCHQ内部部署 ,以获得与应用程序生命周期管理功能以及像监控,集装箱更新,规模输入/输出访问外的箱多层企业应用程序模板和持续交付。

翻译自: https://www.javacodegeeks.com/2016/01/docker-service-discovery-on-microsoft-azure-docker-java-app-load-balanced-by-nginx-or-apache-http-mongo-replica-set-and-hazelcast-cluster.html

azure nginx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值