如何获取在一台机器上启动的单元的 IP 地址并在另一个带有 fleet 的单元中使用它?
How can I get the IP address of a unit started on a machine and use it in another unit with fleet?
我是 CoreOS 和 Docker 的新手,我遇到了队列问题。
我有一个启动 POSTGRES 容器的标准单元,我想知道启动这个单元的机器的 IP 地址。
我实际上有一个由 3 台机器组成的集群,并且 POSTGRES 单元 并不总是在同一台机器上启动 (这意味着 IP 不是静态的)。
当我启动另一个需要 POSTGRES 的单元(见下文)时需要它。
我目前正在使用名为 BindsTo 的单元参数:
[Unit]
Description=Test
After=docker.service
After=postgres@1.service
Requires=docker.service
Requires=postgres@1.service
BindsTo=postgres@1.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill test%i
ExecStartPre=-/usr/bin/docker rm test%i
ExecStart=/usr/bin/docker run -rm --name test%i -e HOST="HereThePostgresIP" sryther/test
ExecStop=/usr/bin/docker stop test%i
N.B。 : 这个单元不需要与POSTGRES单元在同一台机器上启动。
我尝试使用 %H 变量,但它 returns 主机名而不是机器的 IP 地址。
我的集群中也使用了 Flannel。
谢谢!
我找到了解决方法:
[Unit]
Description=Test
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill test%i
ExecStartPre=-/usr/bin/docker rm test%i
ExecStart=/usr/bin/docker run -rm --name test%i --link postgres1:postgres sryther/test
ExecStop=/usr/bin/docker stop test%i
并且IP地址在容器环境中设置为POSTGRES_PORT_5432_TCP_ADDR.
我正在使用 registrator 在我的舰队环境中进行发现。当我启动我的 fleet 时,我修改了 cloud-config 文件以还包括 registrator(以及 etcd、flannel、fleet 等)。注册商驻扎在 docker 并识别新容器何时 started/killed/stop。 Registrator 管理一个已发现容器的数据库,它以多种形式(如 consul、skydns)进行管理。我在 skydns 模式下将我的设置为 运行。所以,这是我用一个单元文件启动我的 postgres 服务器的一个例子,我不知道它会落在哪里:
[Unit]
Description=Postgres
After=docker.service
Requires=flanneld.service docker.service etcd.service
[Service]
Restart=always
ExecStartPre=-/usr/bin/env docker kill postgresql
ExecStartPre=-/usr/bin/env docker rm postgresql
ExecStartPre=/usr/bin/env docker pull sameersbn/postgresql:9.4
ExecStart=/usr/bin/docker run --name postgresql sameersbn/postgresql:9.4
ExecStop=-/usr/bin/docker stop postgresql
当 postgres 启动时,我使用 postgres 条目更新了 etcd:
/skydns/net/tacodata/postgresql/aup1:postgresql:5432
如果我拿到那个,我';;查看ip和端口:
$ etcdctl get /skydns/net/tacodata/postgresql/aup1:postgresql:5432
{"host":"10.1.43.5","port":5432}
您可以修改您的应用程序来做到这一点。或者,您可以 运行 容器 skydns 自动为您更新 dns,因此您有一个 SRV 记录和一个 A 记录。在我的安装中,我使用了一个名为 tacodata.net 的测试域,因此,在 postgresql 出现后,我有 dns 记录!
root@f7e403be967a:/# host -t srv postgresql.tacodata.net 10.1.45.1
Using domain server:
Name: 10.1.45.1
Address: 10.1.45.1#53
Aliases:
postgresql.tacodata.net has SRV record 10 100 5432
aup1:postgresql:5432.postgresql.tacodata.net.
当我启动我的依赖应用程序时,我让它们需要 postgresql.service,我只是使用 postgresql 将 ip 地址引用到应用程序。tacodata.net。
-g
根据 Greg 的说法,我使用了 SkyDNS 和注册器:
I am using registrator for discovery in my fleet environment. When I start up my fleet I modify the cloud-config file to also include registrator (along with etcd, flannel, fleet, etc). Registrator camps on docker and recognizes when new containers are started/killed/stop. Registrator manages a database of discovered containers, it does so in several flavors (like consul, skydns). I configure mine to run in skydns mode.
您可以在下面找到我的工作云配置,请记住我使用的是 CoreOS 607 并且我的测试是在 VMware 上执行的。我的目标是设置 3 台机器以在每台机器上创建一个带有一个 etcd 运行 的小型集群,例如 this.
我设法找到了这个解决方案,感谢 Greg 在这个主题上和 this cloud-config file used with Vagrant。
希望对您有所帮助:)
#cloud-config
coreos:
etcd:
discovery: https://discovery.etcd.io/4c8c3f9a67048e76e9075c97d9d63c0c
addr: 192.168.1.13:4001
peer-addr: 192.168.1.13:7001
fleet:
public-ip: 192.168.1.13
units:
- name: etcd.service
command: start
- name: flanneld.service
drop-ins:
- name: 50-network-config.conf
content: |
[Service]
ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "172.16.0.0/16" }'
command: start
- name: fleet.service
command: start
- name: skydns.service
enable: false
content: |
[Unit]
Description=Skydns
After=docker.service
After=fleet.service
[Service]
ExecStartPre=/usr/bin/docker pull skynetservices/skydns
ExecStart=/usr/bin/env bash -c '/usr/bin/docker run -p 53:53 --name skydns -e ETCD_MACHINES="http://$(ifconfig docker0 | awk \'/\<inet\>/ { print }\'):4001" skynetservices/skydns -nameservers="8.8.8.8:53" --addr="0.0.0.0:53"'
ExecStop=/usr/bin/docker stop skydns
Restart=always
[X-Fleet]
Global=true
[Install]
WantedBy=multi-user.target
- name: registrator.service
enable: false
content: |
[Unit]
Description=Registrator
After=docker.service
After=fleet.service
[Service]
ExecStartPre=/usr/bin/docker pull gliderlabs/registrator
ExecStart=/usr/bin/env bash -c '/usr/bin/docker run --net=host -p 8080:8080 -p 8443:8443 -v /var/run/docker.sock:/tmp/docker.sock --name registrator gliderlabs/registrator skydns2://$(ifconfig docker0 | awk \'/\<inet\>/ { print }\'):4001/skydns.local'
ExecStop=/usr/bin/docker stop registrator
Restart=always
[X-Fleet]
Global=true
- name: primordial.service
command: start
content: |
[Unit]
Description=Load and start fleet services
After=fleet.service
Requires=fleet.service
After=etcd.service
Requires=etcd.service
After=flanneld.service
Requires=flanneld.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/bin/systemctl stop docker.service
ExecStartPre=/usr/bin/ifconfig docker0 down
ExecStartPre=/usr/bin/brctl delbr docker0
ExecStartPre=/usr/bin/systemctl start docker.service
ExecStart=/usr/bin/fleetctl start /etc/systemd/system/skydns.service
ExecStart=/usr/bin/fleetctl start /etc/systemd/system/registrator.service
ssh_authorized_keys:
- ssh-rsa AAAA....
我是 CoreOS 和 Docker 的新手,我遇到了队列问题。
我有一个启动 POSTGRES 容器的标准单元,我想知道启动这个单元的机器的 IP 地址。 我实际上有一个由 3 台机器组成的集群,并且 POSTGRES 单元 并不总是在同一台机器上启动 (这意味着 IP 不是静态的)。
当我启动另一个需要 POSTGRES 的单元(见下文)时需要它。
我目前正在使用名为 BindsTo 的单元参数:
[Unit]
Description=Test
After=docker.service
After=postgres@1.service
Requires=docker.service
Requires=postgres@1.service
BindsTo=postgres@1.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill test%i
ExecStartPre=-/usr/bin/docker rm test%i
ExecStart=/usr/bin/docker run -rm --name test%i -e HOST="HereThePostgresIP" sryther/test
ExecStop=/usr/bin/docker stop test%i
N.B。 : 这个单元不需要与POSTGRES单元在同一台机器上启动。
我尝试使用 %H 变量,但它 returns 主机名而不是机器的 IP 地址。
我的集群中也使用了 Flannel。
谢谢!
我找到了解决方法:
[Unit]
Description=Test
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill test%i
ExecStartPre=-/usr/bin/docker rm test%i
ExecStart=/usr/bin/docker run -rm --name test%i --link postgres1:postgres sryther/test
ExecStop=/usr/bin/docker stop test%i
并且IP地址在容器环境中设置为POSTGRES_PORT_5432_TCP_ADDR.
我正在使用 registrator 在我的舰队环境中进行发现。当我启动我的 fleet 时,我修改了 cloud-config 文件以还包括 registrator(以及 etcd、flannel、fleet 等)。注册商驻扎在 docker 并识别新容器何时 started/killed/stop。 Registrator 管理一个已发现容器的数据库,它以多种形式(如 consul、skydns)进行管理。我在 skydns 模式下将我的设置为 运行。所以,这是我用一个单元文件启动我的 postgres 服务器的一个例子,我不知道它会落在哪里:
[Unit]
Description=Postgres
After=docker.service
Requires=flanneld.service docker.service etcd.service
[Service]
Restart=always
ExecStartPre=-/usr/bin/env docker kill postgresql
ExecStartPre=-/usr/bin/env docker rm postgresql
ExecStartPre=/usr/bin/env docker pull sameersbn/postgresql:9.4
ExecStart=/usr/bin/docker run --name postgresql sameersbn/postgresql:9.4
ExecStop=-/usr/bin/docker stop postgresql
当 postgres 启动时,我使用 postgres 条目更新了 etcd:
/skydns/net/tacodata/postgresql/aup1:postgresql:5432
如果我拿到那个,我';;查看ip和端口:
$ etcdctl get /skydns/net/tacodata/postgresql/aup1:postgresql:5432
{"host":"10.1.43.5","port":5432}
您可以修改您的应用程序来做到这一点。或者,您可以 运行 容器 skydns 自动为您更新 dns,因此您有一个 SRV 记录和一个 A 记录。在我的安装中,我使用了一个名为 tacodata.net 的测试域,因此,在 postgresql 出现后,我有 dns 记录!
root@f7e403be967a:/# host -t srv postgresql.tacodata.net 10.1.45.1
Using domain server:
Name: 10.1.45.1
Address: 10.1.45.1#53
Aliases:
postgresql.tacodata.net has SRV record 10 100 5432
aup1:postgresql:5432.postgresql.tacodata.net.
当我启动我的依赖应用程序时,我让它们需要 postgresql.service,我只是使用 postgresql 将 ip 地址引用到应用程序。tacodata.net。
-g
根据 Greg 的说法,我使用了 SkyDNS 和注册器:
I am using registrator for discovery in my fleet environment. When I start up my fleet I modify the cloud-config file to also include registrator (along with etcd, flannel, fleet, etc). Registrator camps on docker and recognizes when new containers are started/killed/stop. Registrator manages a database of discovered containers, it does so in several flavors (like consul, skydns). I configure mine to run in skydns mode.
您可以在下面找到我的工作云配置,请记住我使用的是 CoreOS 607 并且我的测试是在 VMware 上执行的。我的目标是设置 3 台机器以在每台机器上创建一个带有一个 etcd 运行 的小型集群,例如 this.
我设法找到了这个解决方案,感谢 Greg 在这个主题上和 this cloud-config file used with Vagrant。
希望对您有所帮助:)
#cloud-config
coreos:
etcd:
discovery: https://discovery.etcd.io/4c8c3f9a67048e76e9075c97d9d63c0c
addr: 192.168.1.13:4001
peer-addr: 192.168.1.13:7001
fleet:
public-ip: 192.168.1.13
units:
- name: etcd.service
command: start
- name: flanneld.service
drop-ins:
- name: 50-network-config.conf
content: |
[Service]
ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "172.16.0.0/16" }'
command: start
- name: fleet.service
command: start
- name: skydns.service
enable: false
content: |
[Unit]
Description=Skydns
After=docker.service
After=fleet.service
[Service]
ExecStartPre=/usr/bin/docker pull skynetservices/skydns
ExecStart=/usr/bin/env bash -c '/usr/bin/docker run -p 53:53 --name skydns -e ETCD_MACHINES="http://$(ifconfig docker0 | awk \'/\<inet\>/ { print }\'):4001" skynetservices/skydns -nameservers="8.8.8.8:53" --addr="0.0.0.0:53"'
ExecStop=/usr/bin/docker stop skydns
Restart=always
[X-Fleet]
Global=true
[Install]
WantedBy=multi-user.target
- name: registrator.service
enable: false
content: |
[Unit]
Description=Registrator
After=docker.service
After=fleet.service
[Service]
ExecStartPre=/usr/bin/docker pull gliderlabs/registrator
ExecStart=/usr/bin/env bash -c '/usr/bin/docker run --net=host -p 8080:8080 -p 8443:8443 -v /var/run/docker.sock:/tmp/docker.sock --name registrator gliderlabs/registrator skydns2://$(ifconfig docker0 | awk \'/\<inet\>/ { print }\'):4001/skydns.local'
ExecStop=/usr/bin/docker stop registrator
Restart=always
[X-Fleet]
Global=true
- name: primordial.service
command: start
content: |
[Unit]
Description=Load and start fleet services
After=fleet.service
Requires=fleet.service
After=etcd.service
Requires=etcd.service
After=flanneld.service
Requires=flanneld.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/bin/systemctl stop docker.service
ExecStartPre=/usr/bin/ifconfig docker0 down
ExecStartPre=/usr/bin/brctl delbr docker0
ExecStartPre=/usr/bin/systemctl start docker.service
ExecStart=/usr/bin/fleetctl start /etc/systemd/system/skydns.service
ExecStart=/usr/bin/fleetctl start /etc/systemd/system/registrator.service
ssh_authorized_keys:
- ssh-rsa AAAA....