Rancher与托管k8s集之间⽆法通讯
最近在使⽤rancher管理k8s集的过程中,遇到了rancher server⽆法和rancher agent因TLS认证错误⽆法通讯的问题,经查询后,可以通过重新部署agent的⽅式来解决,在此记录问题的处理过程,希望对各位读者也能有所帮助。
环境说明
  四台Linux虚拟机,其中⼀台以docker形式运⾏rancher-server,其他三台运⾏通过rancher-server创建的k8s集,集名称
为“myk8s”。
  以下为环境中相关软件的版本说明。
软件版本说明
操作系统CentOS 7.5 64位
rancher 主机的docker升级前docker-ce17.03,升级后docker-ce18.06
k8s主机的docker docker-ce17.03
rancher rancher2.1.5
故障现象
  针对rancher-server所在的服务器的docker-ce版本进⾏了升级,从17.03升级到了18.06,升级之后rancher-server的容器启动也正常,但是在rancher-server的管理台页⾯看到所管理的myk8s集⽆法连接了,⼀直处于“Provisioning”状态,下⽅提⽰等待agent 连接,⽆法通过rancher server的web页⾯管理myk8s集。
  查询rancher-server容器的⽇志,发现有⼤量的提⽰TLS握⼿错误,原因是认证证书有问题,导致rancher-server和rancher-agent 进⾏通讯,因此rancher-server⽆法通过安装在k8s集中的rancher-agent对k8s集进⾏管理了。
2019/01/2310:00:49[INFO]2019/01/2310:00:49 http:TLS handshake error from192.168.51.201:56744: remote error: tls: bad certificate
2019/01/2310:00:59[INFO]2019/01/2310:00:59 http:TLS handshake error from192.168.51.200:52786: remote error: tls: bad certificate
2019/01/2310:00:59[INFO]2019/01/2310:00:59 http:TLS handshake error from192.168.51.202:43754: remote error: tls: bad certificate
故障原因
  ⽬前并未到确切的故障原因。
  由于仅仅是对rancher-server所在的服务器的docker-ce的版本进⾏了升级,升级之前也没有关闭正在运⾏的容器,升级过程中docker服务重启了,所有的容器也都被重启了。猜想是由于docker版本的升级导致rancher中的证书出现了变化(按理说不会出现变化),或者是rancher-server容器重启导致的(按理说重启容器不会对数据造成改变才对)。
  后来通过rancher-server创建了新的集,并重启rancher-server,并未出现相同的故障。
  所以猜测可能是docker版本升级导致的【该猜测待验证】。
故障处理
  要想恢复rancher-server管理对应k8s集的功能,必须让rancher-server和rancher-agent能够正常通讯才⾏,通过在官⽅查询发现,只要重新部署⼀次rancher-agent即可恢复正常的管理。
  rancher-agent在k8s集中是以两种资源形式运⾏的,⼀个是以deployment资源运⾏的cluster-agent,⼀个是以daemonset资源运⾏的node-agent,因此需要重新部署这两种资源,让其与rancher-server能够正常通讯。
1. 准备⼯作
  Rancher官⽅提供了⽣成agent资源以及获取k8s集的kubeconfig⽂件的脚本,脚本中⽤到了jq(命令⾏json处理⼯具)等命令。因此需要事先准备相关的脚本并上传到rancher-server所在服务器,并在服务器上安装配套的命令。
获取⽣成kubeconfig的脚本
  使⽤如下命令下载,下载得到get_kubeconfig_custom_cluster_rancher2.sh脚本。
wget gist.githubusercontent/superseb/f6cd637a7ad556124132ca39961789a4/raw/c2bb60a51fa4dafef2964589ce0bc9d923653aa1/get_kubeco nfig_custom_cluster_rancher2.sh
安装jq命令
  如果系统中没有jq命令,则可通过如下⽅式安装。
  通常系统⾃带的repo仓库中没有jq相关的rpm包,直接从jq官⽅下载的源码包也⽆法正常编译通过,因此可以添加包含jq软件的repo仓库,之后通过yum⽅式直接安装。安装⽅式如下:
# 下载包含jq的repo仓库源,其实就是epel的yum源
wget /pub/arch.rpm
# 安装repo仓库
rpm -arch.rpm
# 查看已经安装的repo仓库
yum repolist
# 安装jq
yum install jq
2. 获取agent资源的配置⽂件
  登录运⾏rancher-server的主机,上传相关的脚本,我的环境是单节点运⾏rancher-server的,因此我使⽤的脚本是
get_agents_yaml_single.sh。我的k8s集的名称是“myk8s”。
脚本的使⽤语法是:./get_agents_yaml_single.sh k8s-cluster-name
  执⾏脚本,将会⾃动⽣成myk8s集对应的agent资源配置⽂件,我这⾥⽣成的⽂件是“l”。
./get_agents_yaml_single.sh myk8s
3. 获取原k8s集的kubeconfig
上传相关的脚本get_kubeconfig_custom_cluster_rancher2.sh。docker重启容器命令
脚本的使⽤语法是:./get_kubeconfig_custom_cluster_rancher2.sh k8s-cluster-name
  执⾏脚本,将会⾃动⽣成myk8s集对应的kubeconfig配置⽂件,我这⾥⽣成的⽂件是“kubeconfig”。
./get_kubeconfig_custom_cluster_rancher2.sh myk8s
4. 重新部署agent
  执⾏kubectl命令部署相关的agent资源,之后在rancher-server的管理台中,可以看到myk8s集已经可以被管理了,且之前运⾏的所有服务业都在。
kubectl --kubeconfig=kubeconfig apply -l

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。