rancher导入集群时证书报错

现象

导入集群时,cattle-cluster-agent报错如下:

time="2022-06-28T08:00:28Z" level=error msg="Issuer of last certificate found in chain (CN=xmh-k8s-ca,OU=systemGroup,O=k8s,L=HD,ST=BJ,C=CN) does not match with CA certificate Issuer (CN=dynamiclistener-ca,O=dynamiclistener-org). Please check if the configured server certificate contains all needed intermediate certificates and make sure they are in the correct order (server certificate first, intermediates after)"
time="2022-06-28T08:00:28Z" level=fatal msg="Certificate chain is not complete, please check if all needed intermediate certificates are included in the server certificate (in the correct order) and if the cacerts setting in Rancher either contains the correct CA certificate (in the case of using self signed certificates) or is empty (in the case of using a certificate signed by a recognized CA). Certificate information is displayed above. error: Get \"https://rch.72.xmh\": x509: certificate signed by unknown authority"

背景

最开始用kubeadm搭建了v1.21.2的k8s,后来又搭建了v1.22.6版本的k8s(也是用kubeadm),为了方便说明,下文以k8s21k8s22指代。

在搭建k8s22时用的是已有的tls证书,搭建之后还用同样的ca证书部署了cert-manager(v1.7.1),并用同样的ca证书创建了ClusterIssuer,然后部署rancher(2.6.4)的时候,让cert-managerrancheringress颁发了证书。

报错

背景交代完了,当我突发奇想,想把k8s21统一让k8s22管理时,问题出现了。

首先是把搭建k8s22时的ca证书安装到k8s21的每个node上,然后在k8s21的管理节点上执行rancher页面上提示的命令成功,接下来就但是了——cattle-cluster-agent出现了本文最开始的报错。

排障

当时第一反应是ca证书只安装给node是不够的的,还得安装到需要它的pod,于是一顿操作把ca证书挂载到了pod的/etc/ssl/certs/xmh-k8s-ca.crt路径下。具体步骤如下:

先把ca证书保存到configMap中

kubectl -n cattle-system create cm xmh-k8s-ca.pem --from-file=xmh-k8s-ca.crt

再把configMap挂载到deployment

# 有删减
apiVersion: apps/v1
kind: Deployment
metadata:name: cattle-cluster-agentnamespace: cattle-system
spec:template:spec:containers:volumeMounts:- mountPath: /etc/ssl/certs/xmh-k8s-ca.crtname: xmh-k8s-casubPath: xmh-k8s-ca.crtvolumes:- configMap:name: xmh-k8s-ca.crtname: xmh-k8s-ca

等pod起来之后看看状态,你猜怎么着我的老baby,这事要是这么简单就完了你就看不到这篇记录了,报错依旧,继续排查。

回想当时给ca证书安装到node时,执行了update-ca-trust命令,那么安装到pod是不是挂载之后也需要执行呢?结果是update-ca-trust命令不存在,但是有update-ca-certificates,但是也报错了:p11-kit: couldn't remove file: /var/lib/ca-certificates/pem/xmh-k8s-ca.crt: Device or resource busy

这里执行的命令是kubectl -n cattle-system logs -f cattle-cluster-agent-5fd7b889f6-w4zzr -c init-ca,因为cluster-register这个容器无处下手,想在初始化容器中调通了再想办法替换证书。

注意这个报错说的是/var/lib/ca-certificates/pem/xmh-k8s-ca.crt,而我挂载的路径是/etc/ssl/certs/xmh-k8s-ca.crt,说明ca证书是生效了的,那又是怎么回事呢?

在研究怎么给cluster-register开刀的过程中,发现它镜像的entryPointrun.sh,然后就看了一下run.sh干了啥,你猜怎么着我的老baby,破案了啊!

run.sh的最后有这么一段:

mkdir -p /etc/kubernetes/ssl/certs
mv $temp /etc/kubernetes/ssl/certs/serverca
chmod 755 /etc/kubernetes/ssl
chmod 700 /etc/kubernetes/ssl/certs
chmod 600 /etc/kubernetes/ssl/certs/serverca
mkdir -p /etc/docker/certs.d/$CATTLE_SERVER_HOSTNAME_WITH_PORT
cp /etc/kubernetes/ssl/certs/serverca /etc/docker/certs.d/$CATTLE_SERVER_HOSTNAME_WITH_PORT/ca.crt

发现新大陆了啊,/etc/kubernetes/ssl/certs这个路径才是有用的啊,于是一顿操作又把ca证书的挂载点干到了这个路径下,你猜怎么着我的老baby,那个粘人的小报错还在屏幕上看着我……

所以说要克制不要激动,静下来仔细看看这个run.sh,还有这么一段:

curl --insecure -s -fL $CATTLE_SERVER/v3/settings/cacerts | jq -r '.value | select(length > 0)' > $temp

原来这个$temp是从rancher接口拿过来的啊,于是我想起了rancher全局配置的那个cert,在页面上看到这么句话:

让我删除?众所周知我是个谨慎的有点过头的人,删除是不可能删除的,哑巴治成聋子了可咋整,于是备份之后在api页面打算修改一下,于是看到了这样的response:

readOnly?逗我玩呢?前面说删了,后面说只读?有那么点“大夫说很严重,专家说没事”那味……

我觉得这个是rancher的锅了,于是去官方群艾特官方来解答,你猜怎么着我的老baby,在我尽可能详细的描述完问题并把官方的人艾特一遍之后,果然等到了来自路人甲的一图表情……

好吧自己动手丰衣足食,再来研究研究这个run.sh,这次还真给我发现了点东西,在找rancher接口要证书之前,有这么一个判断:

if [ -n "$CATTLE_CA_CHECKSUM" ]; then

cattle-cluster-agent的环境变量中还真有这么一段:

- name: CATTLE_CA_CHECKSUMvalue: 3e5c48a1953664eb7a9f5b452178684d71dd1569f881c8326adfeeb252f2a823

而且run.sh中给/etc/kubernetes/ssl和里面的文件做了一堆chmod,说明这里面应该是有用的,那干脆直接点,把ca证书挂到/etc/kubernetes/ssl/certs/serverca这个文件上。

于是修改了挂载点,并注释掉CATTLE_CA_CHECKSUM这个环境变量,等待pod重启之后,你猜怎么着我的老baby……

收工!

rancher导入集群时证书报错相关推荐

  1. 记录go-redis使用集群时,报错:CROSSSLOT Keys in request don‘t hash to the same slot

    问题描述 需求:从一个变化的列表list中取出第一条数据,list 10s更新一次,10s内不能一直取第一条,需要均衡: bug代码: // lua脚本 var copyIndexScript str ...

  2. k8s入坑之报错(9)k8s node节点加入到集群时卡住 “[preflight] Running pre-flight checks”...

    参考文档k8s node节点加入到集群时卡住 "[preflight] Running pre-flight checks"报错: k8s node节点加入到集群时卡住 " ...

  3. vSphere Web Client 添加主机进VSAN集群时“SAN 主机移至目标群集: vSAN 群集的 UUID 不匹配”报错

    vSphere Web Client 添加主机进VSAN集群时,报"无法将 vSAN 主机移至目标群集: vSAN 群集的 UUID 不匹配 (主机: 5223a6c9-cf94-f978- ...

  4. redis集群添加节点报错Either the node already knows other nodes (check with CLUSTER NODES) or contains some k

    [README] redis集群添加节点报错 [ERR] Node 192.168.163.202:6380 is not empty. Either the node already knows o ...

  5. redis集群关闭 启动报错_使用虚拟机搭建 Redis 集群,实现数据库的负载均衡功能。...

    实操题目:使用虚拟机搭建 Redis 集群,实现数据库的负载均衡功能.并使用图文描述整个过程.先创建集群: ①创建集群需要使用ruby脚本,所以要先安装ruby环境 安装ruby环境:yum inst ...

  6. 搭建pxc集群时需要先安装mysql么_完美起航-高可用MySQL数据库之PXC集群

    高可用MySQL数据库之PXC集群 前言 在上一篇文章介绍了时下流行的几种数据库产品后(公众号发送"NewSQL"查看),有不少小伙伴表示对自动集群的数据库感兴趣,特别是Cockr ...

  7. 【Hadoop篇】启动hdfs集群时,提示: ERROR: Cannot set priority of zkfc process 5668

    [问题描述] 启动hdfs集群时,遇到如下错误 [dylan@hadoop102 hadoop]$ start-dfs.sh Starting namenodes on [hadoop102] Sta ...

  8. web集群时session同步的3种方法

    web集群时session同步的3种方法 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话 ...

  9. [转载]web集群时利用memcache来同步session

    web集群时session同步的3种方法 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话 ...

最新文章

  1. R语言保存加载工作空间或者工作空间数据对象实战(Save Load RData Workspace)
  2. Centos 6安装python3.5
  3. oracle的schema的基本概念及与User的区别
  4. linux下dns设置详解
  5. 周志华《机器学习》课后习题解析(第二章)模型评估与选择
  6. 6.24AppCan移动开发者大会价值30万的展示机会归了谁?
  7. java importgeopoint_如何在地图上显示更多点(GeoPoint)?
  8. :批量制作档案表,要从excel表格中将每个人的数据导入到docx档案
  9. 组策略中分类别禁用设备驱动程序安装,可以用来禁用USB设备
  10. 电脑护眼设置_解锁办公新技能 海信护眼平板Q5玩转工作无负担-科技频道
  11. java json 修改字段_我们如何使用Java中的Jackson来更改JSON中的字段名称?
  12. 为什么我们没有选择Rust?
  13. matlab 子函数句柄,matlab-函数句柄程序.ppt
  14. Graph-Bert:没有我Attention解决不了的
  15. RabbitMQ学习——整合Spring AMQP、SpringBoot以及Spring Cloud Stream
  16. phpmyadmin 安装mysql5.6
  17. AXURE-手把手教你做汉化
  18. 汇编1-地址总线、数据总线与控制总线详解
  19. 微信支付商户平台扫码登录说明
  20. 如何在没有安装安卓环境的mac os上装adb环境.

热门文章

  1. python判断奇数和偶数_从Python中的给定列表中提取偶数和奇数
  2. LeetCode(Python实现)——Easy部分【Day2】
  3. MFC基于对话框上插入MENU菜单栏并点击菜单弹出新窗口
  4. MATLAB路面裂缝检测识别算法仿真
  5. git reset命令详解
  6. html 穿越星空效果,html5 canvas绚丽3d星空飞行穿梭动画特效
  7. 期末前端web大作业:用DIV+CSS技术设计的动漫网站
  8. PHP优雅的输出数组
  9. 固态硬盘属于计算机的什么设备,怎么区分电脑里面的c\d\e盘是机械硬盘还是固态硬盘...
  10. 数据库到底是什么?举例MySQL给你讲明白