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/23 10:00:49 [INFO] 2019/01/23 10:00:49 http: TLS handshake error from 192.168.51.201:56744: remote error: tls: bad certificate
2019/01/23 10:00:59 [INFO] 2019/01/23 10:00:59 http: TLS handshake error from 192.168.51.200:52786: remote error: tls: bad certificate
2019/01/23 10:00:59 [INFO] 2019/01/23 10:00:59 http: TLS handshake error from 192.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所在服务器,并在服务器上安装配套的命令。
  • 获取生成agent资源的脚本
      访问如下链接,复制其中的脚本,单节点运行rancher-server的使用get_agents_yaml_single.sh脚本,以集群形式运行rancher-server的 使用get_agents_yaml_ha.sh脚本。https://gist.github.com/superseb/d59f26102f0a8671672f8035811b2184

  • 获取生成kubeconfig的脚本
      使用如下命令下载,下载得到get_kubeconfig_custom_cluster_rancher2.sh脚本。

wget https://gist.githubusercontent.com/superseb/f6cd637a7ad556124132ca39961789a4/raw/c2bb60a51fa4dafef2964589ce0bc9d923653aa1/get_kubeconfig_custom_cluster_rancher2.sh 
  • 安装jq命令
      如果系统中没有jq命令,则可通过如下方式安装。
      通常系统自带的repo仓库中没有jq相关的rpm包,直接从jq官方下载的源码包也无法正常编译通过,因此可以添加包含jq软件的repo仓库,之后通过yum方式直接安装。安装方式如下:
# 下载包含jq的repo仓库源,其实就是epel的yum源
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# 安装repo仓库
rpm -ivh epel-release-latest-7.noarch.rpm
# 查看已经安装的repo仓库
yum repolist
# 安装jq
yum install jq
  1. 获取agent资源的配置文件
      登录运行rancher-server的主机,上传相关的脚本,我的环境是单节点运行rancher-server的,因此我使用的脚本是get_agents_yaml_single.sh。我的k8s集群的名称是“myk8s”。
    脚本的使用语法是:./get_agents_yaml_single.sh k8s-cluster-name
      执行脚本,将会自动生成myk8s集群对应的agent资源配置文件,我这里生成的文件是“rancher-agents-myk8s.yml”。
./get_agents_yaml_single.sh myk8s
  1. 获取原k8s集群的kubeconfig
    上传相关的脚本get_kubeconfig_custom_cluster_rancher2.sh。
    脚本的使用语法是:./get_kubeconfig_custom_cluster_rancher2.sh k8s-cluster-name
      执行脚本,将会自动生成myk8s集群对应的kubeconfig配置文件,我这里生成的文件是“kubeconfig”。
./get_kubeconfig_custom_cluster_rancher2.sh myk8s
  1. 重新部署agent
      执行kubectl命令部署相关的agent资源,之后在rancher-server的管理台中,可以看到myk8s集群已经可以被管理了,且之前运行的所有服务业都在。
kubectl --kubeconfig=kubeconfig apply -f rancher-agents-myk8s.yml

故障处理流程的参考链接:https://gist.github.com/superseb/d59f26102f0a8671672f8035811b2184

你可能感兴趣的:(Rancher与托管k8s集群之间无法通讯)