我在云提供商的cloud-init中运行以下脚本。它从网络上的另一个主机上抓取一个容器,启动它,然后尝试将主机上的端口转发到该容器:
lxc init ...
lxc remote add gateway 10.132.98.1:8099 --accept-certificate --password securpwd
lxc copy gateway:build-slave build-slave
lxc start build-slave
CONTAINER_IP=$(lxc list "build-slave" -c 4 | awk '!/IPV4/{ if ( $2 != "" ) print $2}')
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 2200 -j DNAT --to ${CONTAINER_IP}
唯一的问题是lxc start
返回与IPV4
信息可用之间存在任意延迟。我当前的解决方案是在sleep 5s
命令后添加lxc start
,但是我担心如果服务器处于负载状态,则实际上可能要花5秒钟以上的时间才能初始化容器。
有没有不依赖于任意等待时间的更好的解决方案?
答案 0 :(得分:0)
如劳伦斯在评论中指出,LXD提供了可以在容器上设置的“代理” device
。这样,我不必知道容器的IP地址即可设置正确的IPTABLES条目。当指定的容器启动时,LXD会为我设置代理规则。
我这样配置:
DROPLET_PUB_IP=$(ip -f inet addr show ens3 | sed -En -e 's/.*inet ([0-9.]+).*/\1/p')
lxc config device add build-slave ssh-slave proxy listen=tcp:${DROPLET_PUB_IP}:2200 connect=tcp:localhost:22