Networking

Marathon 啟動(docker 容器)服務實例的 Mesos 從 IP

  • July 15, 2016

我有一個 docker 映像,我想通過 Mesos/Marathon 啟動幾個實例。

我在 docker 中使用 BRIDGE 網路,我想通過 env 將正在啟動容器的 mesos slave / docker 主機的“公共”(即不是容器的 docker0 網路)地址傳遞給啟動容器var 或 param,所以我可以在應用程序響應中宣傳這個 ip(應用程序是一個 Cassandra 節點,我將broadcast_address在 cassandra.yaml 中填充這個地址)

我的理解是,我可以讓 Mesos 將此地址上的任何特定埠(在配置範圍內)轉發回我正在執行的容器的 docker0 地址。如果這是真的,並且我可以確保應用程序實例(Cassandra 節點)不會從該從屬設備中移出,但有一些限制,我可以擁有一個 mesos 調度的 Cassandra 集群。

我的問題是:如何在啟動 Marathon 應用程序實例時獲取從屬(docker 主機)IP 地址?

在 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.2HOSTLIBPROCESS_IPENV 變數都將設置為主機地址。對於 Mesosphere 包:

echo "192.168.1.2" > /etc/mesos-slave/ip

並重新啟動奴隸。

另一種選擇是在 Docker 容器中解析代理的 IP:

AGENT_IP=$(getent hosts ${HOST} | awk '{ print $1 }')

引用自:https://serverfault.com/questions/740946