记录一次rancher server升级失败后的抢救

记录一次rancher server升级失败后的抢救

故障情况

升级rancher 1.6.13 到 1.6.14

rancher server HA 两个节点, 两台机器的server都停掉, 但是所有client都没有停还继续跑着。之前经验因为rancher架构的优越性,即使server挂一阵也不会影响上面的容器,因此就没有对客户端做处理。

升级B server后正常启动,迁移数据库都正常, 客户端开始拉取1.2.9的agent。过了很久发现host状态都是disconnect, 于是上host上看情况。

发现之前的1.2.8 agent 的状态是dead , 没有被删除掉。


纯干货分享关注 jiangjiang.space
看过之前日志的朋友应该知道,我之前docker的mount参数一直是private,但是后来发现private没法bind本地挂载的glusterfs,因此后来我又修改为shared。 修改为shared后容器删不掉的错误又回来了,但也不是很频繁因此没有当回事。 没想到这次升级agent遇到了这个问题。

这时慌乱中做了傻事, 我又把1.6.14的server停掉, 重新启动1.6.13的server。 这时候host都开始重新拉1.2.8的agent, 但仍然与server失联。

重启了其中一个host的agent开始报accesskey丢失的错误,有点慌神了。
报错如下:

INFO: Reading environment from rancher-agent
Error: No such image or container: rancher-agent
jq: error (at <stdin>:1): Cannot iterate over null (null)
INFO: Running upgrade
INFO: Inspecting host capabilities
INFO: Boot2Docker: false
INFO: Host writable: true
INFO: Token: xxxxxxxx
INFO: Running registration
ERROR:root:Missing CATTLE_REGISTRATION_ACCESS_KEY or CATTLE_REGISTRATION_SECRET_KEY
Traceback (most recent call last):
  File "./register.py", line 10, in <module>
    client = from_env(access_key=os.environ['CATTLE_REGISTRATION_ACCESS_KEY'],
  File "/usr/lib/python2.7/UserDict.py", line 40, in __getitem__
    raise KeyError(key)
KeyError: 'CATTLE_REGISTRATION_ACCESS_KEY'

INFO: Reading environment from rancher-agent
Error: No such image or container: rancher-agent
jq: error (at <stdin>:1): Cannot iterate over null (null)
INFO: Running upgrade
INFO: Inspecting host capabilities
INFO: Boot2Docker: false
INFO: Host writable: true
INFO: Token: xxxxxxxx
INFO: Running registration
ERROR:root:Missing CATTLE_REGISTRATION_ACCESS_KEY or CATTLE_REGISTRATION_SECRET_KEY
Traceback (most recent call last):
  File "./register.py", line 10, in <module>
    client = from_env(access_key=os.environ['CATTLE_REGISTRATION_ACCESS_KEY'],
  File "/usr/lib/python2.7/UserDict.py", line 40, in __getitem__
    raise KeyError(key)
     #纯干货分享关注 jiangjiang.space

故障解决

后来仔细想了想,其实就是1.2.8的agent没干掉,1.2.9的agent就一直等1.2.8的agent被干掉,之前慌忙中切换版本可能造成accesskey等环境变量丢了,大概是这个原因。

于是我停掉所有host上的所有容器, 回到add host 界面,选择custom。重新在所有host上再执行一遍add host脚本, 因为add host脚本里面有access key信息,于是问题解决。

命令如下:

sudo docker run -e CATTLE_AGENT_IP="xxxx"  --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.9 http://xxx.cn/v1/scripts/xxxxxx

host与rancher server恢复通信。 各个服务都重新拉起。问题解决。

经验总结

操作中最大的错误就是来回切换了server的版本,其实一开始就冷静下来观察agent的情况就不会发生后面的事情。

仔细看了看ranhcer agent的启动命令。其实这个部分就是一个shell

也就是这个部分,xxx部分我隐去了
http://xxx.cn/v1/scripts/xxxxxx

这个脚本的内容如下:

#!/bin/sh

export CATTLE_REGISTRATION_ACCESS_KEY="registrationToken"
export CATTLE_REGISTRATION_SECRET_KEY="xxxx这里是key"
export CATTLE_URL="http://xxx.cn/v1"  # 这里是server的域名或者ip
export DETECTED_CATTLE_AGENT_IP="xxxip"   

agent是一个python程序用这些环境变量信息连接并通过认证连接到server,agent和server的连接参数是上面这个shell注入到容器的环境变量中的。

这么看其实一个rancher host 上面就是一些松散的组合, agent和server通讯, metadata 记录容器和服务的各类数据, vxlan提供rancher的overlay网络, 各司其职。 胡乱猜测了这些,毕竟我也没看过rancher 的源码。 问题解决了,睡觉。