Thanks Radoslaw. I'm not really set on using host names, I just want a reliable way to start the framework. For the meantime I have gone with a solution similar to what you suggested. We use /etc/default/mesos file to configure mesos, and it has the ip defined, so I just mounted that in the container and read the ip.
I would like to avoid having a dependency on the file system of the agents though. I'm not sure why I can't have the docket executor set the LIBPROCESS_IP variable in the same way the command executor does. Thanks Eli > On 6 Jun 2016, at 21:44, Radoslaw Gruchalski <[email protected]> wrote: > > Out of curiosity. Why are you insisting on using host names? > Say you have 1 master and 2 agents with these IPs: > > - mesos-master-0: 10.100.1.10 > - mesos-agent-0: 10.100.1.11 > - mesos-agent-1: 10.100.1.12 > > Your problem is that you have no way to obtain an IP address of the agent in > the container. Correct? > One way to overcome this problem is to create a shell file, say in > /etc/mesos-agent.sh, with contents like: > > ... > AGENT_IP=10.100.1.11 > … > > If you’re using Marathon, you can copy that file to the sandbox using docker > volumes: > > { > "containerPath": “/etc/mesos-agent.sh", > "hostPath": "/etc/mesos-agent.sh", > "mode": "RO" > } > > You can now source that in the container to set the LIBPROCESS_ADVERTISE_IP. > Other applications simply use the mesos-agent-X host name. That’s without > mesos-dns. > Things are easier with mesos-dns or consul service catalog (I prefer the > latter). > – > Best regards, > > Radek Gruchalski > > [email protected] > de.linkedin.com/in/radgruchalski > > Confidentiality: > This communication is intended for the above-named person and may be > confidential and/or legally privileged. > If it has come to you in error you must take no action based on it, nor must > you copy or show it to anyone; please delete/destroy and inform the sender > immediately. > >> On June 6, 2016 at 1:16:07 PM, Eli Jordan ([email protected]) wrote: >> >> The issue refers to LIBPROCESS_IP not LIBPROCESS_HOST. I haven’t been able >> to find the LIBPROCESS_HOST variable documented anywhere. >> >> My understanding is that the scheduler uses LIBPROCESS_IP to determine which >> network interface to bind to, and also which ip to advertise to the master, >> so that the master can send offers. There is also another variable >> LIBPROCESS_ADVERTISE_IP. If this is defined then LIBPROCESS_IP is used to >> determine which network interface to bind to, and LIBPROCESS_ADVERTISE_IP is >> used to determine which ip to advertise to the master. >> >> It would be great if there was a LIBPROCESS_ADVERTISE_HOST variable, then I >> could just use the $HOST variable to define this. >> >>> On 5 Jun 2016, at 10:41 pm, Sivaram Kannan <[email protected]> wrote: >>> >>> >>> I have been using this way from 0.23.0 to the 0.28.0. This has been surely >>> working (although for a different framework). Inside the docker container >>> can you see the $HOST variable defined?? >>> >>> The ticket you referred says that the apps definition needs to define >>> LIBPROCESS_HOST=$HOST to be make the framework take the proper IP - you are >>> describing a different problem. >>> >>> Thanks, >>> ./Siva. >>> >>>> On Sun, Jun 5, 2016 at 4:30 AM, Eli Jordan <[email protected]> >>>> wrote: >>>> I found this issue on the mesos jira that describes the exact issue I am >>>> hitting. >>>> >>>> https://issues.apache.org/jira/browse/MESOS-3740 >>>> >>>> It doesn't appear to be resolved. >>>> >>>> Thanks >>>> Eli >>>> >>>> On 5 Jun 2016, at 16:46, Eli Jordan <[email protected]> wrote: >>>> >>>>> Hmmm… that doesn’t seem to work for me. What version of mesos does this >>>>> work in? I am running 0.27.1. >>>>> >>>>> When using this approach, I still get the following error when the kafka >>>>> mess framework is starting up. >>>>> >>>>> "Scheduler driver bound to loopback interface! Cannot communicate with >>>>> remote master(s). You might want to set 'LIBPROCESS_IP' environment >>>>> variable to use a routable IP address.” >>>>> >>>>> I tried setting LIBPROCESS_IP to ‘0.0.0.0’ and >>>>> LIBPROCESS_ADVERTISE_IP=‘the public ip’ and this works. But the host >>>>> variations don’t seem to work. (i.e. set LIBPROCESS_IP=0.0.0.0 and >>>>> LIBPROCESS_ADVERTISE_HOST=$HOST) >>>>> >>>>> It seems lib process doesn’t support using host names. >>>>> >>>>> I think I might have to run the framework outside of docker, but I would >>>>> really like to avoid this. >>>>> >>>>> This problem would be solved if the docker executor was able to set the >>>>> same environment variables as the command executor. Is there a way to >>>>> make this happen? >>>>> >>>>> I saw that mesos can be extended with a Hook ‘module’ to set extra >>>>> environment variables in docker containers. This might be a solution, but >>>>> seems over wrought for a simple problem. >>>>> >>>>> >>>>>> On 5 Jun 2016, at 12:50 am, Sivaram Kannan <[email protected]> wrote: >>>>>> >>>>>> >>>>>> Hi, >>>>>> >>>>>> Can you try adding && after the LIBPROCESS_HOST variable and the actual >>>>>> command. We have been using this for sometime now. >>>>>> >>>>>> "cmd": "LIBPROCESS_HOST=$HOST && ./kafka-mesos.sh .. >>>>>> >>>>>> Thanks, >>>>>> ./Siva. >>>>>> >>>>>> >>>>>>> On Sat, Jun 4, 2016 at 8:34 AM, Eli Jordan <[email protected]> >>>>>>> wrote: >>>>>>> Hi @haosdent >>>>>>> >>>>>>> Based on my testing, this is not the case. >>>>>>> >>>>>>> I ran a task (from marathon) without using a docker container that just >>>>>>> printed out all environment variables. i.e. while [ true ]; do env; >>>>>>> sleep 2; done >>>>>>> >>>>>>> I then run a task that executed the same command inside an alpine >>>>>>> docker image. >>>>>>> >>>>>>> When running without a docker image LIBPROCESS_IP was defined along >>>>>>> with many other variables. >>>>>>> >>>>>>> Sample output when running without docker (note LIBPROCESS_IP) is >>>>>>> defined >>>>>>> >>>>>>> Registered executor on mesos-slave0 >>>>>>> Starting task plain-test.5e5b00cc-2645-11e6-a3dd-080027aa149e >>>>>>> sh -c 'while [ true ]; do env; sleep 2; done' >>>>>>> Forked command at 16571 >>>>>>> LIBPROCESS_IP=192.168.3.16 >>>>>>> MESOS_AGENT_ENDPOINT=192.168.3.16:5051 >>>>>>> MESOS_EXECUTOR_REGISTRATION_TIMEOUT=5mins >>>>>>> HOST=mesos-slave0 >>>>>>> SHELL=/bin/sh >>>>>>> MESOS_DIRECTORY=/var/mesos/slaves/7ad17efe-0f9e-4703-9d2e-7fb9ee03f64c-S0/frameworks/aae929c7-24a5-4463-9ae0-bc7b044973c5-0000/executors/plain-test.5e5b00cc-2645-11e6-a3dd-080027aa149e/runs/c9b6ef86-b37d-4e3c-b1ca-bd680aed779f >>>>>>> PORT0=31082 >>>>>>> PORT_10001=31082 >>>>>>> LC_ALL=en_US.UTF-8 >>>>>>> … more >>>>>>> >>>>>>> >>>>>>> Sample output when running with docker (note LIBPROCESS_IP is not >>>>>>> defined) >>>>>>> >>>>>>> --container="mesos-7ad17efe-0f9e-4703-9d2e-7fb9ee03f64c-S0.f3a94ab4-dfff-4e97-b806-f1cc501ecf42" >>>>>>> --docker="docker" --docker_socket="/var/run/docker.sock" >>>>>>> --help="false" --initialize_driver_logging="true" >>>>>>> --launcher_dir="/usr/libexec/mesos" --logbufsecs="0" >>>>>>> --logging_level="INFO" --mapped_directory="/mnt/mesos/sandbox" >>>>>>> --quiet="false" >>>>>>> --sandbox_directory="/var/mesos/slaves/7ad17efe-0f9e-4703-9d2e-7fb9ee03f64c-S0/frameworks/aae929c7-24a5-4463-9ae0-bc7b044973c5-0000/executors/alpine-test.77d5a3d9-2644-11e6-a3dd-080027aa149e/runs/f3a94ab4-dfff-4e97-b806-f1cc501ecf42" >>>>>>> --stop_timeout="0ns" >>>>>>> --container="mesos-7ad17efe-0f9e-4703-9d2e-7fb9ee03f64c-S0.f3a94ab4-dfff-4e97-b806-f1cc501ecf42" >>>>>>> --docker="docker" --docker_socket="/var/run/docker.sock" >>>>>>> --help="false" --initialize_driver_logging="true" >>>>>>> --launcher_dir="/usr/libexec/mesos" --logbufsecs="0" >>>>>>> --logging_level="INFO" --mapped_directory="/mnt/mesos/sandbox" >>>>>>> --quiet="false" >>>>>>> --sandbox_directory="/var/mesos/slaves/7ad17efe-0f9e-4703-9d2e-7fb9ee03f64c-S0/frameworks/aae929c7-24a5-4463-9ae0-bc7b044973c5-0000/executors/alpine-test.77d5a3d9-2644-11e6-a3dd-080027aa149e/runs/f3a94ab4-dfff-4e97-b806-f1cc501ecf42" >>>>>>> --stop_timeout="0ns" >>>>>>> Registered docker executor on mesos-slave0 >>>>>>> Starting task alpine-test.77d5a3d9-2644-11e6-a3dd-080027aa149e >>>>>>> HOSTNAME=984809b0b720 >>>>>>> SHLVL=1 >>>>>>> HOME=/root >>>>>>> PORT=31295 >>>>>>> MESOS_CONTAINER_NAME=mesos-7ad17efe-0f9e-4703-9d2e-7fb9ee03f64c-S0.f3a94ab4-dfff-4e97-b806-f1cc501ecf42 >>>>>>> MARATHON_APP_ID=/alpine-test >>>>>>> PORTS=31295 >>>>>>> PORT0=31295 >>>>>>> MARATHON_APP_DOCKER_IMAGE=alpine >>>>>>> PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin >>>>>>> MESOS_SANDBOX=/mnt/mesos/sandbox >>>>>>> MARATHON_APP_RESOURCE_DISK=0.0 >>>>>>> MARATHON_APP_RESOURCE_MEM=128.0 >>>>>>> HOST=mesos-slave0 >>>>>>> PORT_10000=31295 >>>>>>> MARATHON_APP_VERSION=2016-05-30T08:56:59.065Z >>>>>>> MARATHON_APP_LABELS= >>>>>>> PWD=/ >>>>>>> MESOS_TASK_ID=alpine-test.77d5a3d9-2644-11e6-a3dd-080027aa149e >>>>>>> MARATHON_APP_RESOURCE_CPUS=1.0 >>>>>>> >>>>>>> Is there some other config I need to do for the docker containerizer? >>>>>>> Any help greatly appreciated. >>>>>>> >>>>>>>> On 4 Jun 2016, at 7:28 pm, haosdent <[email protected]> wrote: >>>>>>>> >>>>>>>> Hi, @Jordan. I think not matter you use MesosContainerizer or >>>>>>>> DockerContainerizer, LIBPROCESS_IP always would be set if you launch >>>>>>>> you Agent with `--ip` flag. >>>>>>>> >>>>>>>>> On Fri, Jun 3, 2016 at 8:23 PM, Eli Jordan <[email protected]> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> The reason I need to set LIBPROCESS_IP is because the slaves have 2 >>>>>>>>> network interfaces, and the docker container is running in host >>>>>>>>> networking mode. So libmesos doesn’t know which IP to advertise. The >>>>>>>>> hostnames of the slaves are all resolvable. >>>>>>>>> >>>>>>>>> I have noticed that if I run a marathon app that doesn’t use docker, >>>>>>>>> e.g. while [ true ]; do env; sleep 2; done, that LIBPROCESS_IP is >>>>>>>>> defined in the environment. However, when running a docker image this >>>>>>>>> variable is not defined. >>>>>>>>> >>>>>>>>> Is there a way to have marathon pass along all environment variables >>>>>>>>> defined by mesos? >>>>>>>>> Thanks >>>>>>>>> Eli >>>>>>>>> >>>>>>>>> On 4 Apr 2016, at 14:12, Eli Jordan <[email protected]> wrote: >>>>>>>>> >>>>>>>>>> @haosdent I’m not sure how this works internally, but it seems the >>>>>>>>>> mess master needs to send requests to the framework for resource >>>>>>>>>> offers, and therefore needs to know the external IP (i.e. the host >>>>>>>>>> IP) >>>>>>>>>> >>>>>>>>>> @craig w >>>>>>>>>> Would I need to do this in the cmd portion of the marathon JSON? I >>>>>>>>>> currently have the config below >>>>>>>>>> { >>>>>>>>>> "container": ..., >>>>>>>>>> "id":"kafka-mesos-scheduler", >>>>>>>>>> "cpus": 0.5, >>>>>>>>>> "mem": 256, >>>>>>>>>> "ports": [9999], >>>>>>>>>> "cmd": "./kafka-mesos.sh scheduler --master=mesos-master:5050 >>>>>>>>>> --zk=mesos-master:2181 --api=http://mesos-slave0:9999 >>>>>>>>>> --storage=zk:/kafka-mesos", >>>>>>>>>> "instances": 1, >>>>>>>>>> "constraints": [["hostname", "LIKE", "mesos-slave0"]], >>>>>>>>>> "env": { >>>>>>>>>> "LIBPROCESS_IP": "192.168.3.16" >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> @Chris Baker Currently we don’t have mess-dns setup but if this >>>>>>>>>> works it would seem to be a nice solution. However, I did try >>>>>>>>>> setting LIBPROCESS_IP to the slave hostname and it seems to produce >>>>>>>>>> a parse error. So I think it needs to be an actual IP address. >>>>>>>>>> >>>>>>>>>> I was hoping there would be a configuration for the slave that would >>>>>>>>>> automatically populate this env variable when starting the docker >>>>>>>>>> container. So I don’t need to complicate the marathon file, and can >>>>>>>>>> reuse it in different clusters. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> On 4 Apr 2016, at 11:25 am, Chris Baker <[email protected]> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> Alternatively, because the $HOST username is indirect, which would >>>>>>>>>>> require a runtime element to "export $LIBPROCESS_IP=$HOST", another >>>>>>>>>>> alternative is to fallback on Mesos-DNS, if that's part of the >>>>>>>>>>> cluster deployment, setting $LIBPROCESS_IP to the (a priori) >>>>>>>>>>> Mesos-DNS entry corresponding to the service. >>>>>>>>>>> >>>>>>>>>>>> On Sun, Apr 3, 2016 at 5:06 PM craig w <[email protected]> wrote: >>>>>>>>>>>> Hi, marathon sets the HOST env var. If it's not the ip address you >>>>>>>>>>>> can use getent with the value from HOST to figure it out. >>>>>>>>>>>> >>>>>>>>>>>> >However, in order for the frameworks to receive resource offers I >>>>>>>>>>>> >need to set the LIBPROCESS_IP environment variable to the hosts >>>>>>>>>>>> >IP address for the docker container running the frameworks. >>>>>>>>>>>> >>>>>>>>>>>> Hi, @Gmail. Could you provide more details about this? >>>>>>>>>>>> >>>>>>>>>>>>> On Sun, Apr 3, 2016 at 10:40 PM, Rad Gruchalski >>>>>>>>>>>>> <[email protected]> wrote: >>>>>>>>>>>>> Hi Gmail, >>>>>>>>>>>>> >>>>>>>>>>>>> AFAIK not. The only way to do so is setting up the env variable >>>>>>>>>>>>> as you do now. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Kind regards, >>>>>>>>>>>>> >>>>>>>>>>>>> Radek Gruchalski >>>>>>>>>>>>> >>>>>>>>>>>>> [email protected] >>>>>>>>>>>>> >>>>>>>>>>>>> de.linkedin.com/in/radgruchalski/ >>>>>>>>>>>>> >>>>>>>>>>>>> Confidentiality: >>>>>>>>>>>>> This communication is intended for the above-named person and may >>>>>>>>>>>>> be confidential and/or legally privileged. >>>>>>>>>>>>> If it has come to you in error you must take no action based on >>>>>>>>>>>>> it, nor must you copy or show it to anyone; please delete/destroy >>>>>>>>>>>>> and inform the sender immediately. >>>>>>>>>>>>>> On Sunday, 3 April 2016 at 16:09, Gmail wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'm pretty new to mesos and marathon, and I'm running a couple >>>>>>>>>>>>>> of frameworks with marathon (Kafka and elastic search). However, >>>>>>>>>>>>>> in order for the frameworks to receive resource offers I need to >>>>>>>>>>>>>> set the LIBPROCESS_IP environment variable to the hosts IP >>>>>>>>>>>>>> address for the docker container running the frameworks. >>>>>>>>>>>>>> Currently I am working around me this by using a constraint to >>>>>>>>>>>>>> hard wire the slave that the framework gets launched on, so then >>>>>>>>>>>>>> I can put the slaves ip in the marathon json file. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Obviously this is not ideal. Is there a better way to define the >>>>>>>>>>>>>> host ip Inside the docker container? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Sent from my iPad >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Best Regards, >>>>>>>>>>>> Haosdent Huang >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Best Regards, >>>>>>>> Haosdent Huang >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> ever tried. ever failed. no matter. >>>>>> try again. fail again. fail better. >>>>>> -- Samuel Beckett >>> >>> >>> >>> -- >>> ever tried. ever failed. no matter. >>> try again. fail again. fail better. >>> -- Samuel Beckett

