资讯专栏INFORMATION COLUMN

使用Rancher-Gen动态更新配置文件

lykops / 776人阅读

摘要:在这些部署工作完成之后,的配置需要更改为指向新的后端容器。这允许用户为现有的并基于这些变化的服务生成配置文件。下面的教程会介绍如何自动生成运行博客平台后端服务的配置文件。第步部署服务为简单起见,我们打算使用中的官方镜像。

Docker和Rancher让大家能更轻易地部署和管理基于微服务的应用程序。然而,如果有些服务是依赖于其他动态服务的,那该如何管理它们的配置?你是否时常觉得,要是有方法能自动检测后端服务的变化,并实现配置文件的动态更新就好了?本文给你答案。

前言

Docker和Rancher让大家能更轻易地部署和管理基于微服务的应用程序。然而,有一个关键的挑战是,如果有些服务是依赖于其他动态服务的,那该如何管理它们的配置?

试想以下情形:您有多个运行Web应用程序的后端容器,和一些将所有的请求都代理到这些后端容器的nginx容器。现在,你必须要部署一个新版本的Web应用程序,这意味着你需要构建和部署新版本的后端容器。在这些部署工作完成之后,nginx的配置需要更改为指向新的后端容器。那么,你该怎样处理nginx呢?改变其配置,构建一个新的容器并部署它?此刻的你是不是会觉得,要是有方法能自动检测后端服务的变化,并实现nginx的动态更新就好了?

这就是Rancher-Gen要闪亮登场的时刻!

Rancher-Gen是一个Python的工具,它能监听的Rancher服务的变化,并呈现一个用户指定的Jinja2模板。这允许用户为现有的、并基于这些变化的服务生成配置文件。另外,Rancher-Gen提供了一种机制,在模板呈现之后会运行通知命令。下面的教程会介绍如何自动生成运行ghost博客平台后端服务的nginx配置文件 。

教程

下面介绍的所有配置文件都可以在Rancher-Gen库中的演示目录下找到。

第1步 – 部署Ghost服务

为简单起见,我们打算使用Docker hub中的官方ghost镜像。因此,创建一个docker-compose.yml 文件,并添加以下的ghost服务:

ghost:
  image: ghost
  expose:
    - "2368"

现在,用Rancher Compose部署ghost服务:

$ rancher-compose -p demo up -d ghost

第2步 – 用Rancher-Gen创建nginx镜像

下面是用以搭建nginx镜像的Dockerfile:

FROM phusion/baseimage:0.9.17
MAINTAINER pitrho

# Step 1 - Install nginx and python
ENV DEBIAN_FRONTEND noninteractive
RUN 
 apt-add-repository -y ppa:nginx/stable && 
 apt-get update && 
 apt-get install -y python-software-properties 
   wget 
   nginx 
   python-dev 
   python-pip 
   libev4 
   libev-dev 
   expect-dev && 
 rm -rf /var/lib/apt/lists/* && 
 chown -R www-data:www-data /var/lib/nginx && 
apt-get clean

# Step 2 - Install rancher-gen
ENV RANCHER_GEN_VERSION 0.1.2
RUN pip install rancher-gen==$RANCHER_GEN_VERSION

# Step 3 - Define services
RUN mkdir /etc/service/nginx /etc/service/rancher_gen /nginxconf
COPY nginx_run /etc/service/nginx/run
COPY rancher-gen_run /etc/service/rancher_gen/run
COPY default.j2 /nginxconf

# Step 4 - Use baseimage-docker"s init system.
CMD ["/sbin/my_init"]

# Step 5 - Expose ports.
EXPOSE 80
EXPOSE 443

让我们来一步一步拆解Dockerfile。步骤1和2不言自明:只需安装nginx、Python和Rancher-Gen。

第3步要设置镜像启动时运行的服务。第一个服务是nginx,它用/etc/servce/nginx文件运行。该文件的内容是:

#!/bin/bash
 rancher-gen --host $RANCHER_GEN_HOST 
 --port $RANCHER_GEN_PORT 
 --access-key $RANCHER_GEN_ACCESS_KEY 
 --secret-key $RANCHER_GEN_SECRET_KEY 
 --project-id $RANCHER_GEN_PROJECT_ID 
 $RANCHER_GEN_OPTIONS 
 --notify "service nginx reload" /nginxconf/default.j2 /etc/nginx/sites-available/default

注意一下在通知步骤之后,我们是怎样通过名为 /nginxconf/default.j2 和/etc/nginx/sites-available/default 的这两个路径的。前者是Jinjia2模板,后者是渲染模板的输出位置。以下是在default.j2文件的内容:

upstream ghost.backend {
{% for container in containers %}
  {% if container["state"] == "running" %}
    server {{container["primaryIpAddress"]}}:2368;
  {% endif %}
  {% endfor %}
}

server {
  listen 80;
  server_name ghost_demo;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header HOST $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://ghost.backend;
    proxy_redirect off;
  }
}

Dockerfile的第4步和第5步在镜像中设置了运行命令“/sbin/my_init”并暴露端口80和443。

现在是时候构建镜像了:

$ docker build -t="pitrho/nginx-rancher-gen-demo" .

第3步 – 创建并部署nginx服务

现在我们已有了nginx镜像,就可以开始向我们在第1步中创建的docker-compose.yml文件中添加nginx服务了。

ghost:
 image: ghost
 expose:
 - "2368"

nginx:
 image: pitrho/nginx-rancher-gen-demo:latest
 ports:
 - 80:80
 links:
 - ghost
 environment:
 NGINX_RUN_TYPE: rancher-gen
 RANCHER_GEN_HOST: $RANCHER_HOST
 RANCHER_GEN_PORT: $RANCHER_PORT
 RANCHER_GEN_ACCESS_KEY: $RANCHER_ACCESS_KEY
 RANCHER_GEN_SECRET_KEY: $RANCHER_SECRET_KEY
 RANCHER_GEN_PROJECT_ID: $RANCHER_GEN_PROJECT_ID
 RANCHER_GEN_OPTIONS: --stack demo --service ghost

上述可变的RANCHER_GEN_OPTIONS环境是用于向Rancher-Gen传递附加命令行选项的 。你可以在Rancher-Gen文档中查看这些选项的说明。

现在运行rancher-compose来启动nginx服务:

$ rancher-compose -p demo up -d nginx

此时,ghost和nginx服务都启动并运行了:

而且,将浏览器指向运行中的nginx容器中主机的IP地址,你就可以访问ghost了:

如果你使用shell来检查nginx容器,并打开渲染的文件 /etc/nginx/sites-enabled/default,你将会看到以下的输出:

upstream ghost.backend {
   server 10.42.136.216:2368;
 }

server {
     listen 80;
     server_name ghost_demo;

     location / {
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header HOST $http_host;
         proxy_set_header X-NginX-Proxy true;
         proxy_pass http://ghost.backend;
         proxy_redirect off;
     }
  }

正如预期的那样,这是在运行rancher-gen命令时的基于指定模板的渲染输出。此时,如果你要升级ghost服务,并再次查看渲染文件,你会发现上游部分下的IP地址已经改变了。

结论

总结来说,Rancher-Gen是一个自动化工具,可用于生成文件,并运行通知命令。借助Jinja2的模板表现力,及其整洁的命令行界面,Rancher-Gen可用于生成大多数配置文件,并自动解决那些对大多数系统管理员和软件工程师而言繁琐和重复的工作。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28015.html

相关文章

  • 基于 Nginx 的动态代理

    摘要:目前最常用的软件反向代理服务器有和。基于实现动态代理为了实现动态代理方案,需要在反向代理服务器中增加定制的功能。同时,由于反向代理服务器需要处理大量的代理请求,因此会频繁的读取反向代理配置数据。 基于 Nginx 的动态代理 作者:赵波日期:2016 年 8 月 4 日 在实际应用中,遇到了这样一个场景: 已有一个手机 APP 客户端,需要在该 APP 客户端中实现通过 Web 的形式...

    wean 评论0 收藏0
  • 基于 Nginx 的动态代理

    摘要:目前最常用的软件反向代理服务器有和。基于实现动态代理为了实现动态代理方案,需要在反向代理服务器中增加定制的功能。同时,由于反向代理服务器需要处理大量的代理请求,因此会频繁的读取反向代理配置数据。 基于 Nginx 的动态代理 作者:赵波日期:2016 年 8 月 4 日 在实际应用中,遇到了这样一个场景: 已有一个手机 APP 客户端,需要在该 APP 客户端中实现通过 Web 的形式...

    thursday 评论0 收藏0
  • 解决js动态加载、缓存、更新

    摘要:即在内添加版本号的解决方案这样的做法的确可以达到清缓存的目的。重新渲染而代理又缓存了的,如果在更新的话就只能继续改版本号。 最近项目中出现修改js,线上并没有实时更新而是使用的缓存中的js。 当然如果你的页面是单页面应用的话,解决方案就很简单了,修改index.js后面的版本号就好了。 mudel.export = { //html文件名 不能重名-。- a:{ ...

    mikyou 评论0 收藏0
  • 基于weex的有赞无线开发框架

    摘要:出于对开发效率和动态化的要求,无线端的开发框架也一直在更新,从结构化,再到现在正在大受关注的。最近,有赞移动选择了作为无线开发框架,搭建了从开发构建发布数据一个闭环的流程。年月日,阿里巴巴宣布将移动开源项目捐赠给基金会开始孵化。 出于对开发效率和动态化的要求,无线端的开发框架也一直在更新,从 Hybrid、结构化 Native View、React Native、Weex,再到现在正在...

    cloud 评论0 收藏0
  • 基于weex的有赞无线开发框架

    摘要:出于对开发效率和动态化的要求,无线端的开发框架也一直在更新,从结构化,再到现在正在大受关注的。最近,有赞移动选择了作为无线开发框架,搭建了从开发构建发布数据一个闭环的流程。年月日,阿里巴巴宣布将移动开源项目捐赠给基金会开始孵化。 出于对开发效率和动态化的要求,无线端的开发框架也一直在更新,从 Hybrid、结构化 Native View、React Native、Weex,再到现在正在...

    suosuopuo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<