使用registrator自动将CoreOS上的Docker容器服务信息注册到etcd

简述

使用名为registrator的服务检测、注册和删除专用容器,在CoreOS上启动Docker服务(如rails、redis、elasticsearch等将端口暴露到外部的服务),并自动将它们注册到etcd上。

注册服务的选择

当在考虑在多主机环境下使用Docker时,会遇到服务发现的问题。例如,当想要将Web应用程序容器注册到负载均衡器时,需要以某种方式告知应用程序容器在哪个主机的哪个端口上启动。

作为服务发现中间件,可以使用Consul或etcd等。在这些中间件中注册以Docker容器形式运行的服务有三种选择(可能还有其他选择)。

起動するサービス自身が登録する: Webhook やサービスディスカバリへの登録機能をもったサービス自身が起動時に自分を etcd や consul に登録する (self-registering という)

起動するサービスに並行して起動する登録専用プロセスが登録する: 起動するサービスと別にサービス登録用のプロセスを走らせ etcd や consul に登録する(coprocess や sidekick という)

起動するサービスと切り離されたプロセスが自動登録する: サービスを起動すると予め起動していた別のプロセスがそれを検知しサービス登録する

自我注册和协处理器方法各有问题。

自助注册的问题

    • Webhook やサービス登録といったことをサポートしていないアプリケーションやミドルウェアでは利用出来ない

 

    利用するサービスディスカバリの仕組みを理解していないとサービスを起動できない

启动服务时必须关注服务发现。

协处理器的问题 (Xié chǔ lǐ qì de tí)

    • 設定が複雑になること(利用するサービスディスカバリの仕組みを理解していないとサービスを起動できない)

あるサービスを起動する際に必ずサービス登録用プロセスを走らせる設定を予めしておかないといけない

启动服务时必须考虑服务发现的问题。

Coprocess 的示例:使用舰队部署服务。

在这个例子中,启动Web容器时,通过systemd绑定了一个专门用于向ELB注册Web容器已启动的服务注册容器。
与上面所写的一样,除了为Web容器准备unit文件外,还需要准备一个用于服务注册的unit文件,并且需要知道这一点。另外,如果有多个要启动的服务,管理进程的复杂度也会倍增,所以会很麻烦呢…

考虑到Self-Registering和Coprocess的问题,registrator可以让我们无需担心服务发现,能够启动服务。

使用注册器自动将Docker服务注册到etcd中。

registrator是专门用于检测、注册和删除Docker服务的服务。它提供了Docker镜像,并在启动时自动将服务信息注册到Consul或etcd中。

通过使用注册机

    • logspout で CoreOS 上の Docker コンテナのログを集約・ルーティングする

 

    Datadog で CoreOS をモニタリングする

同样重要的是,尽量减少主机端的设置,并采用符合”Docker方式”的容器化方法来处理所有事务。

启动注册器。在启动时使用etcd作为选择(还可以使用consul)。

core@core-01 ~ $ docker run -d --name registrator -h $HOSTNAME -v /var/run/docker.sock:/tmp/docker.sock progrium/registrator -ip=172.17.8.101 etcd://172.17.8.101:4001/services

查看注册器的日志,可以看到有关服务注册和删除的日志。

core@core-01 ~ $ docker logs -f registrator
2014/09/12 14:08:10 registrator: Forcing host IP to 172.17.8.101
2014/09/12 14:08:10 registrator: Using etcd registry backend at etcd://172.17.8.101:4001/services
2014/09/12 14:08:10 registrator: ignored: f47e0e26cfbc no published ports
2014/09/12 14:08:10 registrator: ignored: 2a0f5ea6785b no published ports
2014/09/12 14:08:10 registrator: added: 06aedc6bf57d core-01:logspout:8000
2014/09/12 14:08:10 registrator: added: f5745a0d97e5 core-01:registry:5000
2014/09/12 14:08:10 registrator: Listening for Docker events...

redis コンテナを 2 個立てる。 etcd にサービス情報が登録されるので固定のポートを利用する必要はなくなる。 -P を使ってホスト側ポートは自動選択する。

core@core-01 ~ $ docker run -d --name redis.1 -h $HOSTNAME -P dockerfile/redis
core@core-01 ~ $ docker run -d --name redis.2 -h $HOSTNAME -P dockerfile/redis

然后registrator检测到了两个服务,并将它们注册到etcd中。

core@core-01 ~ $ docker logs -f registrator
...
2014/09/12 14:12:40 registrator: added: cab889269f0e core-01:redis.1:6379
2014/09/12 14:13:31 registrator: added: eac456c594c0 core-01:redis.2:6379

从etcd中获取信息

core@core-01 ~ $ curl -L http://127.0.0.1:4001/v2/keys/services/redis | jq .

获悉redis服务有两个节点,并能够获取到每个节点的IP地址和端口号。

{
  "node": {
    "createdIndex": 556,
    "modifiedIndex": 556,
    "nodes": [
      {
        "createdIndex": 556,
        "modifiedIndex": 556,
        "value": "172.17.8.101:49153",
        "key": "/services/redis/core-01:redis.1:6379"
      },
      {
        "createdIndex": 593,
        "modifiedIndex": 593,
        "value": "172.17.8.101:49154",
        "key": "/services/redis/core-01:redis.2:6379"
      }
    ],
    "dir": true,
    "key": "/services/redis"
  },
  "action": "get"
}

由于在etcd中注册,因此集群中的其他机器也可以获取此信息。

core@core-02 ~ $ curl -L http://127.0.0.1:4001/v2/keys/services/redis

停止 redis.1

core@core-01 ~ $ docker stop redis.1
redis.1
2014/09/12 14:18:05 registrator: removed: cab889269f0e core-01:redis.1:6379

registrator でというログが出て、redis サービスのノードが 1 に減った

core@core-02 ~ $ curl -L http://127.0.0.1:4001/v2/keys/services/redis
{
  "node": {
    "createdIndex": 556,
    "modifiedIndex": 556,
    "nodes": [
      {
        "createdIndex": 593,
        "modifiedIndex": 593,
        "value": "172.17.8.101:49154",
        "key": "/services/redis/core-01:redis.2:6379"
      }
    ],
    "dir": true,
    "key": "/services/redis"
  },
  "action": "get"
}

Cloud-Config で registrator を起動する

coreos:
  units:
    - name: registrator.service
      command: start
      content: |     
        [Unit]
        Description=Registrator
        After=docker.service
        Requires=docker.service

        [Service]
        TimeoutStartSec=0
        ExecStartPre=-/usr/bin/docker kill registrator
        ExecStartPre=-/usr/bin/docker rm registrator
        ExecStartPre=/usr/bin/docker pull progrium/registrator:latest
        ExecStart=/usr/bin/docker run --name registrator -h %H -v /var/run/docker.sock:/tmp/docker.sock progrium/registrator:latest -ip=$private_ipv4 etcd://$private_ipv4:4001/services
        ExecStop=/usr/bin/docker stop registrator

        [Install]
        WantedBy=multi-user.target

笔记和感想

考虑并实现将在etcd中注册的服务信息传递给ELB的部分。

请用中文来转述以下内容,只需要给出一种选项:

《参考》

    • progrium/registrator

 

    • Automatic Docker Service Announcement with Registrator

 

    • Deploying a Service Using fleet

 

    • Automated docker ambassadors with CoreOS + registrator + ambassadord

 

    CoreOS 上の Docker コンテナのサービス情報を registrator を使って SkyDNS2 に自動登録する
bannerAds