如何使用大使模式动态地配置服务上CoreOS

介绍

Docker链接功能可以动态地配置容器,被称为大使图案之间的网络连接的方法。 大使模式推广提供者使用者之间的容器服务的可移植性。 在CoreOS, etcd可以利用来实现跨集群中的多台机器分布大使格局。

在本教程中,我们将演示部署是与注册的的Apache HTTP容器etcd Apache容器将代表我们的提供程序容器,我们将使用HAProxy作为我们的消费者容器。 我们将使用Docker图片来自此CoreOS大使演示我们的大使容器,我们将从头开始创建我们自己的Apache和HAProxy的Docker图像。

先决条件

您必须在DigitalOcean上拥有一个由至少三台计算机组成的CoreOS集群。 下面是关于如何设置了一个教程: 如何创建并在CoreOS群集上运行服务

您必须具有使用CoreOS,etcdctl,fleetctl,设置服务和运行Docker容器的基本知识。 这些主题涵盖了入门CoreOS系列教程

您必须有一个Docker Hub帐户或一个私人Docker注册表。 这是盖在创建Docker容器的部分如何创建并运行一个集群CoreOS教程服务

有关大使模式是如何工作的全部细节,检查出的通过容器大使链接从Docker的文章。 此外,检查出这篇文章发布在博客CoreOS: 动态Docker与搭载ETCD大使链接

我们的目标

在本教程结束时,我们将在两台机器上运行六个容器。 本节将简要描述每一个,以及如何将它们组合在一起。 这个确切的设置对大多数人没有用,但它可以适应于允许为您自己的服务发现动态服务。

机器A

机器A将运行提供程序容器,即Apache Web服务器,以及一些其他支持它的容器。

  • Apache网络服务器 :Apache的基本容器,我们将从头开始创建,类似于中描述的一个如何创建并运行一个集群CoreOS服务教程。 这是我们的制片
  • polvi /Docker寄存器 :一个注册的容器 ,将通过APIDocker读的Apache的IP地址和端口号并将它写入etcd
  • polvi /简单-AMB:一个简单的形象大使的容器,将流量转发到指定的位置。 在这种情况下,我们将流量转发到etcd并将其链接到docker-register容器提供到该容器的访问etcd 在CoreOS,由于位置etcd是静态的,这可能是,如果除去docker-register被修改,以访问etcd直接

机器B.

机器B是将运行消费者容器(即HAProxy)和主大使容器的CoreOS机器。

  • HAProxy的反向代理 :基本HAProxy的容器中,我们将从头开始创建,这将代表我们的消费 这将用于表明大使设置工作
  • polvi /动态ETCD-AMB:主要大使容器。 动态代理的手表指定etcd对供应商的容器,并将所有流量提供者容器的IP地址和端口号键。 可以更新密钥的值,代理将自行更新
  • polvi /简单AMB:在另一台机器上使用的相同的容器,而是用于连接dynamic-etcd-ambetcd

创建Apache Docker镜像

SSH到您的一台CoreOS计算机,并传递您的SSH代理(在公共IP地址中替换):

ssh -A core@coreos-1_public_IP

然后登录Docker:

docker login

提示时输入你的USER_NAME,密码和电子邮件地址。

接下来,创建一个新目录以将Apache Dockerfile写入:

mkdir -p ambassador/apache

现在切换到该目录,并打开Dockerfile编辑:

cd ambassador/apache
vi Dockerfile

基于来自Apache的容器设置如何创建并运行一个集群CoreOS服务 ,我们可以创建以下Dockerfile(替代user_name用自己的Docker的用户名):

FROM ubuntu:14.04
MAINTAINER user_name

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 && \
    echo "<h1>Running from Docker on CoreOS</h1>" > /var/www/html/index.html

EXPOSE 80

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

保存并退出。

现在我们有一个Dockerfile安装Apache并用一个基本消息替换index.html,使用以下命令(替换自己的用户名)创建你的Docker镜像并命名为“apache”:

docker build --tag="user_name/apache" .

现在,为了使图像提供给您的其他CoreOS机, push它与下面的命令的Docker注册表:

docker push user_name/apache

现在您的Apache镜像已经可以使用了。 让我们继续创建HAProxy图像。

创建HAProxy Docker镜像

我们将创建一个HAProxy的Docker形象的基础上, HAProxy的Dockerfile可信自动化Docker建立 我们将稍微修改提供haproxy.cfgstart.bash文件。

ambassador目录,使用git克隆HAProxy的存储库:

cd ~/ambassador
git clone https://github.com/dockerfile/haproxy.git

这将创建一个haproxy目录,与Dockerfilehaproxy.cfgstart.bash文件。

Dockerfile基本上安装HAProxy并公开端口80和443,所以我们可以保持原样。

我们将修改haproxy.cfg文件,添加一个frontendbackend 打开haproxy.cfg编辑:

cd haproxy
vi haproxy.cfg

现在找到并删除以下行:

listen stats :80
  stats enable
  stats uri /

然后在文件末尾添加以下行:

frontend www-http
        bind :80
        default_backend www-backend

backend www-backend
        server apache private_ipv4:80 check

这将配置HAProxy的监听端口80和传入流量转发到www-backend ,它由一台服务器。 我们将使用start.bash脚本来替代private_ipv4与CoreOS机的私有IP地址,这个容器将运行时,HAProxy的容器启动时。 我们的动态大使容器,HAProxy将流量转发到Apache容器,将在同一台机器上运行。

打开start.bash文件进行编辑:

vi start.bash

在文件的底部,您将找到一条将在此容器中启动HAProxy进程的行。 它看起来像这样:

haproxy -f /etc/haproxy/haproxy.cfg -p "$PIDFILE"

在此行的正上方,插入以下行:

# Set backend IP address to machine's private IP address
PRIVATE_IPV4=$(curl -sw "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
sed -i -e "s/server apache private_ipv4:80 check/server apache ${PRIVATE_IPV4}:80 check/g" $HAPROXY/$CONFIG

保存并退出。 curl命令将检索该容器将通过DigitalOcean元数据服务上运行的计算机的私有IP地址。 sed命令替换了private_ipv4字符串haproxy.cfg与从元数据检索的实际IP地址。 此脚本从HAProxy容器内部运行,因此将在运行时配置专用IP地址。

现在我们准备好构建HAProxy docker镜像。 构建您的Docker镜像,并使用以下命令将其命名为“haproxy”(用您自己的用户名替换):

docker build --tag="user_name/haproxy" .

现在,为了使图像提供给您的其他CoreOS机, push它与下面的命令的Docker注册表:

docker push user_name/haproxy

您的HAProxy图像可以使用。 我们准备写我们的车队服务单位文件!

Fleet服务单位文件

现在所有需要的Docker镜像都可用于我们的CoreOS集群,让我们开始处理部署我们的容器所需的文件。 因为我们使用的是CoreOS集群,所以我们可以从单个CoreOS机器创建和调度所有的队列服务单元文件。

我们将创造一切在服务文件~/ambassador我们之前创建目录,所以改为现在的目录:

cd ~/ambassador

apache.service

apache.service单位将在主机A上运行。

我们将创建的第一个服务文件是Apache web服务器容器, user_name/apache 打开一个名为apache.service现在编辑:

vi apache.service

添加以下行(在两个地方替换您的Docker用户名):

[Unit]
Description=Apache web server service

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull user_name/apache
ExecStart=/usr/bin/docker run --rm --name %n -p ${COREOS_PRIVATE_IPV4}::80 user_name/apache
ExecStop=/usr/bin/docker stop -t 3 %n

保存并退出。 这是一个相当简单的服务文件,在前台模式下启动Apache。 特别值得注意的是,我们的专用网络接口(在绑定端口80中的容器内,以动态端口-p ${COREOS_PRIVATE_IPV4}::80 )。

etcd-amb-apache.service

etcd-amb-apache.service单位将在主机A上运行。

接下来我们将要创建我们的简单大使容器(服务文件simple-amb ),将允许Apache的注册容器访问etcd 打开一个名为etcd-amb-apache.service现在:

vi etcd-amb-apache.service

添加以下行:

[Unit]
Description=Simple Apache ambassador
After=apache.service
BindsTo=apache.service

[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-ConditionMachineOf=apache.service

保存并退出。

simple-amb容器将其转发接收端口10000在启动时提供的说法,即所有交通172.17.42.1:4001 ,这是etcd在CoreOS的标准位置。

X-ConditionMachineOf=apache.service告诉车队安排此在同一台机器作为Apache容器,因为它使用的是关键的docker-register容器注册Apache是否使用的IP地址和端口etcd

apache-docker-reg.service

apache-docker-reg.service单位将在主机A上运行。

让我们为我们的容器将在注册Apache的IP地址和端口的服务文件etcddocker-register 打开文件名为apache-docker-reg.service现在:

vi apache-docker-reg.service

插入以下行:

[Unit]
Description=Register Apache
After=etcd-amb-apache.service
BindsTo=etcd-amb-apache.service

[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --link etcd-amb-apache.service:etcd -v /var/run/docker.sock:/var/run/docker.sock --rm polvi/docker-register apache.service 80 apache-A

[X-Fleet]
X-ConditionMachineOf=etcd-amb-apache.service

保存并退出。 这里是的显着部分的击穿docker run命令:

  • --link etcd-amb-apache.service:etcd链接这个容器简单的形象大使,这将被用来传递Apache的连接信息, etcd
  • -v /var/run/docker.sock:/var/run/docker.sock允许这种容器来确定Apache是经由它将运行在机器的DockerAPI结合到动态端口。
  • apache.service 80 apache-A通过这些参数传递给容器。 前两个参数指定名称和Docker容器的口来查找,第三个参数指定的名称etcd键写入。 此容器启动后,它会写的动态端口和IP地址apache.service/services/apache-A/apache.service键。

X-ConditionMachineOf=etcd-amb-apache.service告诉车队安排此在同一台计算机的简单形象大使的容器,因为它们与Docker链接链接是至关重要的,提供登记容器办法找到etcd

etcd-amb-apache2.service

etcd-amb-apache2.service单位将主机B上运行。

为我们的第二个简单大使容器(服务文件simple-amb ),将允许动态大使容器访问etcd 打开一个名为etcd-amb-apache2.service现在:

vi etcd-amb-apache2.service

添加以下行:

[Unit]
Description=Simple Apache ambassador 2

[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-Conflicts=apache.service

保存并退出。

这是几乎相同的服务文件etcd-amb-apache.serviceX-Conflicts=apache.service告诉车队安排它在不同的机器比Apache的容器上,它会被用来链接动态驻etcd

apache-dyn-amb.service

apache-dyn-amb.service单位将主机B上运行。

创建我们的动态大使容器(服务文件dynamic-etd-amb ),将允许动态大使容器访问etcd 打开文件名为apache-dyn-amb.service现在:

vi apache-dyn-amb.service

添加以下行:

[Unit]
Description=Dynamic ambassador for Apache
After=etcd-amb-apache2.service
BindsTo=etcd-amb-apache2.service

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull polvi/dynamic-etcd-amb
ExecStart=/usr/bin/docker run --link etcd-amb-apache2.service:etcd --rm --name %n -p ${COREOS_PRIVATE_IPV4}:80:80 polvi/dynamic-etcd-amb apache-A 80
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-ConditionMachineOf=etcd-amb-apache2.service

保存并退出。 这里是的显着部分的击穿docker run命令:

  • --link etcd-amb-apache2.service:etcd链接此容器第二个简单的形象大使,这将被用来检索从Apache的连接信息etcd
  • -p ${COREOS_PRIVATE_IPV4}:80:80暴露在容器和机器的专用网络接口端口80上
  • apache-A 80是指定端口80的流量两个参数(即专用网络接口上的端口80)应该被代理到注册为服务apache-Aetcd

X-ConditionMachineOf=etcd-amb-apache2.service告诉车队安排此在同一台计算机的第二个简单大使容器,因为它们与Docker链接链接是至关重要的,以提供动态大使容器办法找到etcd

haproxy.service

haproxy.service单位将主机B上运行。

为我们HAProxy的容器(一个服务文件haproxy将用于连接到Apache容器,通过动态大使容器)。 打开文件名为haproxy.service现在:

vi haproxy.service

添加以下行(在两个地方替换您的Docker用户名):

[Unit]
Description=HAProxy consumer

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull user_name/haproxy
ExecStart=/usr/bin/docker run --name %n -p ${COREOS_PUBLIC_IPV4}:80:80 user_name/haproxy
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-ConditionMachineOf=apache-dyn-amb.service

保存并退出。 这是一个简单的服务文件,启动HAProxy并公开其主机的公共IP地址上的端口80。 请记住,后端服务器将配置为主机在80端口的私有IP地址,恰好在动态大使正在侦听代理到Apache服务的流量的位置。

X-ConditionMachineOf=apache-dyn-amb.service告诉车队在同一台机器上安排此为动态大使容器,它是重要的,因为动态大使提供了一个路线HAProxy的容器去Apache的容器。

部署与Fleet

现在我们有了所有必要的fleet服务文件,我们可以最终部署我们的大使设置。 在包含所有服务文件的目录中,运行以下命令:

fleetctl start apache.service
fleetctl start etcd-amb-apache.service
fleetctl start apache-docker-reg.service
fleetctl start etcd-amb-apache2.service
fleetctl start apache-dyn-amb.service
fleetctl start haproxy.service

您应该看到消息说,每个服务加载。 要检查您的机队单位的状态,请运行以下命令:

fleetctl list-units

您应该看到类似于以下内容的输出:

UNIT                       MACHINE                      ACTIVE   SUB
apache-docker-reg.service  ceb3ead2.../10.132.233.107   active   running
apache-dyn-amb.service     3ce87ca7.../10.132.233.106   active   running
apache.service             ceb3ead2.../10.132.233.107   active   running
etcd-amb-apache.service    ceb3ead2.../10.132.233.107   active   running
etcd-amb-apache2.service   3ce87ca7.../10.132.233.106   active   running
haproxy.service            3ce87ca7.../10.132.233.106   active   running

所有的状态应该是activerunning 另一个要注意的是,“机器A”单元应该在同一台机器上,“机器B”单元应该在不同的机器上 - 只需查看每个单元的IP地址来确认这一点。

测试您的设置

确保HAProxy可以达到Apache

因为我们没有指定HAProxy容器应该在特定的机器上运行,我们需要找到它在哪里运行。 一个简单的方法来做到这一点是使用fleetctl ssh命令:

fleetctl ssh haproxy.service

这将您连接到正在运行的机器haproxy.service容器。 现在,您可以源/etc/environment文件,以获取运行HAProxy的的CoreOS机器的公网IP地址:

. /etc/environment
echo $COREOS_PUBLIC_IPV4

获取生成的IP地址,并使用Web浏览器转到它。 您将看到以下图像:

从CoreOS上的Docker运行

请注意,您正在访问HAProxy,并且HAProxy正通过动态ambassador代理访问Apache。

现在,您可以退出当前的SSH会话以返回到原始的SSH会话:

exit

测试故障转移

现在你已经证实了大使的设置工作,让我们看看当提供服务(会发生什么apache.service )更改其IP地址和端口。

使用fleetctl连接到正在运行的机器apache.service

fleetctl ssh apache.service

现在重新启动Apache正在运行的机器:

sudo reboot

注意:如果apache.service是您最初通过SSH连接到机器上运行,你将被断开。 如果是这种情况,只需SSH到同一CoreOS集群中的另一台计算机。

现在等待一分钟,检查哪些设备正在运行:

fleetctl list-units

根据你等了多久,你可能会看到三个单位与“主机A”( apache.serviceetcd-amb-apache.serviceapache-docker-reg.service )的重新启动或活动。 最终,他们都应该回到工作状态。 一旦他们这样做,请注意,他们现在在不同的机器上运行比以前。

现在回到您连接到HAProxy的Web浏览器,然后点击刷新。 您应该看到与之前相同的测试页,表明HAProxy仍然能够通过动态大使连接到Apache!

结论

现在您已经设置了自己的大使模式,您应该能够将本教程中介绍的概念适应您自己的服务。 它是在运行时配置您的消费者服务的一种独特方式,它允许您轻松地在机器之间移动您的后端提供程序服务。 在更现实的设置中,您可能会用一个或多个应用程序容器替换Apache服务,您可以使用多个后端服务器(或使用完全不同的使用者服务)配置HAProxy。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏