webrouter 是所有 lain app 的入口,包括 layer1 层的 registry 和 console 等。基于 Tengine 实现。
webrouter 可以启多个 instance 来实现 High Avaliable。 由于 webrouter 的特殊身份,无法像普通的 lain app 简单的 scale,而且其在 scale 过程中所有的 web 类型的 lain app 都可能会出现短暂的无法访问。
因 swarm 是动态决定一个 container 部署到哪台机器,而 webrouter 在启动之前是需要配置文件存在的。因此我们需要确保集群的所有 node 上有一份 webrouter 的配置,进而确保 swarm 无论在哪台机器上启动 webrouter ,能都能正常工作。
或者,也可以通过 docker -H swarm.lain:2376 info
查看各个节点的资源使用情况,预测下 webrouter 会被部署到哪个节点上。
具体操作步骤如下:
-
在所有 node 上执行:
cat /etc/rsyncd.secrets | cut -d ':' -f 2 > /tmp/pass && chmod 600 /tmp/pass mkdir -p /data/lain/volumes/webrouter/webrouter.worker.worker/2/ rsync -az --password-file /tmp/pass rsync://lain@BOOTSTRAP_NODE/lain_volume/webrouter/webrouter.worker.worker/1/ /data/lain/volumes/webrouter/webrouter.worker.worker/2/
注: 以上命令中的目录的中的数字,实为 instance number。此处为 2;假如我们扩容到 3 个,则还需要为 3 号实例准备一份同样数据。
-
利用swarm,在所有node上pull webrouter image,确保每个节点上都有webrouter image
docker -H swarm.lain:2376 pull registry.DOMAIN/webrouter:VERSION
-
使用laincli扩充instance数量(在webrouter项目目录下)
lain scale -n NUMBER PHASE worker
所以,webrouter 会的 HA 建议尽可能早做,如果集群的规模扩大,scale 起来也可能会麻烦些。
webrouter 异常时,会导致某些 web 类型的 pod 无法工作。这里我们以 appname 为 demo,procname 为 web 的 app 为例子。
大致的问题排查步骤如下:
-
确保 demo 的 container 内部服务是正常运行的。
# 进入 demo 的 container 内部 docker exec -it DEMO_CONTAIENR_ID # 查看内部的进程运行情况是否正常
-
查看 demo 的 container ip 地址和端口号。
# 把 demo 和 CONTAINERID 换成对应值 docker inspect CONTAINERID
若发现 IP 地址为空, 说明这个 container 没有分配IP地址;可尝试执行
docker stop CONTRAINERID && sleep 5 && docker start CONTAINERID
解决。看是否能让 container 获取 IP。 若始终没有 IP,考虑把 container remove 掉,等2分钟后 deployd 会自动启动一个新的 container,再对其进行检查。 -
检查到 webrouter 的 container 内部,使用
curl
命令看是否可访问 demo。# 进入contaienr内部 docker exec -it WEBROUTER_CONTAINER_ID bash # 尝试请求demo curl IP:PORT
若不能,则是网络出了问题。请排查 networkd
-
若2步中访问正常,查看 Tengine 的配置是否正常。
# 进入 container 内部 docker exec -it WEBROUTER_CONTAINER_ID bash # 查看配置 cat /etc/nginx/upstreams/demo.upstreams
若配置与1步中的配置不同,尝试检查 lainlet 返回的结果是否正常。
curl -s lainlet.lain:9001/v2/webrouter/webprocs?appname=demo | python -m json.tool
在结果中找到 IP 和 PORT 值,看与实际情况是否对应。若不正常,则异常出在了 Lainlet 上。
-
若第3步中正常,查看 webrouter watcher 是否正常。
# 进入 container 内部 docker exec -it WEBROUTER_CONTAINER_ID bash # 查看状态 supervisorctl status # 重启watcher supervisorctl restart watcher