Kubectl访问Rancher管理的K8s集群时遭遇x509证书未知颁发机构错误
Kubectl访问Rancher管理的K8s集群时遭遇x509证书未知颁发机构错误
问题描述
我搭建了一套K8s集群环境:
- 基于Proxmox VE集群部署,包含3个Master节点和3个Worker节点
- 使用Rancher 2.8.3进行集群管理
- 在OPNsense上部署了HA Proxy,用于访问内部所有K8s服务;同时配置了反向代理,用来访问Rancher Web UI
- 在OPNsense上生成了自签根CA,并基于该CA签发了Rancher的TLS证书,OpenSSL验证证书有效,且Rancher Web UI能正常访问
但当我执行kubectl get pods等命令时,遇到了证书验证错误:
E0628 13:03:34.849568 422 memcache.go:265] couldn't get current server API group list: Get "https://rancher.xxxxxxxx.local/k8s/clusters/local/api?timeout=32s": tls: failed to verify certificate: x509: certificate signed by unknown authority
更新1:
大家好!
我还在继续排查这个问题。根据我的理解,kubectl会验证证书是否与Rancher的证书一致,以此确保连接安全,这是为了防范中间人攻击...
解决方案
这个问题的核心很明确:你的kubectl客户端并没有信任你在OPNsense上生成的自签根CA。浏览器能正常访问是因为你大概率已经把根CA导入了浏览器的信任列表,但kubectl用的是系统(或独立)的证书存储,需要单独配置信任。
下面给你几个靠谱的解决办法:
1. 将自签根CA导入客户端的信任证书库(推荐生产环境使用)
这是最安全的方案,能从根本上解决证书信任问题:
- 先导出OPNsense上的根CA证书(保存为PEM格式)
- Linux系统:
- 将CA证书复制到
/usr/local/share/ca-certificates/目录,并重命名为.crt后缀(比如opnsense-root-ca.crt) - 执行
sudo update-ca-certificates命令更新系统证书缓存
- 将CA证书复制到
- Windows系统:
- 双击CA证书文件,选择“安装证书”,存储位置选“本地计算机”,然后选择“将所有证书放入下列存储”,浏览到“受信任的根证书颁发机构”完成导入
- Mac系统:
- 双击CA证书文件,在钥匙串访问中选择“系统”钥匙串,右键点击证书选择“显示简介”,把信任设置改成“始终信任”
- 导入完成后,重新测试
kubectl命令,证书验证应该就能正常通过了
2. 在kubeconfig中直接指定信任的CA证书
如果不想修改系统级的证书库,可以直接在kubeconfig里配置使用你的自签CA:
- 找到你的kubeconfig文件(默认路径是
~/.kube/config) - 找到对应集群的配置块,添加
certificate-authority字段,指定CA证书的本地文件路径;或者用certificate-authority-data字段,填入根CA证书的Base64编码内容:
clusters: - cluster: certificate-authority: /path/to/your/opnsense-root-ca.pem server: https://rancher.xxxxxxxx.local/k8s/clusters/local name: local
- 保存kubeconfig后,执行
kubectl get pods测试即可
3. 临时跳过证书验证(仅用于测试,禁止生产环境)
如果只是临时调试,可以关闭kubectl的证书验证,但这会完全暴露中间人攻击风险,生产环境绝对不能用:
修改kubeconfig中的集群配置,添加insecure-skip-tls-verify: true:
clusters: - cluster: insecure-skip-tls-verify: true server: https://rancher.xxxxxxxx.local/k8s/clusters/local name: local
备注:内容来源于stack exchange,提问作者Foreman21
相关产品推荐
相关产品推荐

