我有一个 docker 镜像,我想通过 Mesos/Marathon 启动几个实例。
我在 docker 中使用 BRIDGE 网络,我想通过 env var 或 param 将启动容器的 mesos 从属/docker 主机的“公共”(即不是容器的 docker0 net)地址传递给启动容器,这样我可以在应用程序响应中宣传这个 ip(该应用程序是一个 Cassandra 节点,我将用broadcast_address
这个地址填充 cassandra.yaml)
我的理解是,我可以让 Mesos 将此地址上的任何特定端口(在配置的范围内)转发回我正在运行的容器的 docker0 地址。如果这是真的,并且我可以确保应用程序实例(Cassandra 节点)不会从此从属节点移出,那么在几个约束条件下,我可以拥有一个 mesos-scheduled Cassandra 集群。
我的问题是:在启动 Marathon 应用程序实例时,如何将从属(docker 主机)ip 地址获取到其中?
答案1
在 Marathon 找到适合该任务的主机之前,您不知道 IP 地址。但是,在 Mesos 从属节点启动任务时,一些属性存储在 ENV 变量中:
...
ULIMIT=-n 8192
HOST=slave01.example.com
MESOS_SLAVE_PID=slave(1)@192.168.1.2:5051
MARATHON_APP_RESOURCE_CPUS=0.1
MESOS_TASK_ID=dummy.eb6e1d9a-c2f0-11e5-a58b-00259057db2f
如果您对主机名满意,则可以使用HOST
变量或从中提取 IP 地址MESOS_SLAVE_PID
。
如果mesos-slave
以开头--ip=192.168.1.2
,则HOST
和LIBPROCESS_IP
ENV 变量都将设置为主机的地址。对于 Mesosphere 包:
echo "192.168.1.2" > /etc/mesos-slave/ip
并重新启动从站。
另一个选择是解析 Docker 容器内的代理 IP:
AGENT_IP=$(getent hosts ${HOST} | awk '{ print $1 }')