kubectl Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed
·
前言
由于给mac 桌面版的docker 进行了升级 也升级 对应的k8s
目前应该是比较新或者最新的版本
然后使用kubectl 操作k8s 时 直接就报错了
Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority (possibly because of “crypto/rsa: verification error” while trying to verify candidate authority certificate “kubernetes”)
完整报错信息如下
{
"clientVersion": {
"major": "1",
"minor": "29",
"gitVersion": "v1.29.2",
"gitCommit": "4b8e819355d791d96b7e9d9efe4cbafae2311c88",
"gitTreeState": "clean",
"buildDate": "2024-02-14T10:40:49Z",
"goVersion": "go1.21.7",
"compiler": "gc",
"platform": "darwin/amd64"
},
"kustomizeVersion": "v5.0.4-0.20230601165947-6ce0bf390ce3"
}
Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
分析
kubectl 操作k8s 本质上是使用签名验证连接到 k8s的api-server 时 将命令发送给ap-server 然后接收其响应 。
上述错误是由于 kubectl 无法验证 Kubernetes 集群的证书颁发机构导致的。当升级了 Kubernetes 版本后,集群的证书也可能会发生变化。
那解决思路也就来了 我们直接更新~/.kube/config 文件中的证书为最新生成的即可
解决
1. 直接使用ap-server的证书和key 重新生成kubectl 使用的证书 过于复杂
- api-server证书准备
# Kubernetes 集群的 CA 根证书 ca.crt # CA 根证书的私钥 ca.key # API Server 的服务器证书 apiserver.crt # API Server 的服务器证书私钥 apiserver.key - 安装openssl
- 在和以上证书的同目录下执行
# 生成 client.key 私钥和 openssl genrsa -out client.key 2048 # 生成 client.crt 客户端证书 openssl req -new -key client.key -out client.csr # 使用 ca.crt ca.key 以及client.crt 来生成 一个新的客户端证书 openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 - 验证生成的证书
# 验证 client.crt 证书是否由 ca.crt 颁发 # 如果输出包含 OK 字样,说明 client.crt 证书是由 ca.crt 正确签发的。 openssl verify -CAfile ca.crt client.crt # 验证 client.crt 证书对应的私钥是否是 client.key。 # 输出内容相同 则表示 client.crt 证书对应的私钥就是 client.key。 openssl rsa -noout -modulus -in client.key | openssl md5 openssl x509 -noout -modulus -in client.crt | openssl md5 - 新建admin.conf 内容如下 并替换关键内容
apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS... # base64 encoded ca.crt server: https://kubernetes.docker.internal:6443 # API Server 地址, docker desktop默认地址 https://kubernetes.docker.internal:6443 替换为自己的地址 name: docker-desktop contexts: - context: cluster: docker-desktop user: docker-desktop name: docker-desktop current-context: docker-desktop kind: Config preferences: {} users: - name: docker-desktop user: client-certificate-data: LS0tLS... # base64 encoded client.crt client-key-data: LS0tLS... # base64 encoded client.key - 将admin.conf 复制到 env | grep KUBECONFIG 输出对应的目录下
# 例如 # 获取 KUBECONFIG对应的配置路径 默认的路径为 ~/.kube/config > env | grep KUBECONFIG KUBECONFIG=/etc/kubernetes/admin.conf # 复制 cp ./admin.conf /etc/kubernetes/admin.conf # 授权 su chmod 755 /etc/kubernetes/admin.conf - 执行kubectl version 验证 是否生效
2. 重置mac 桌面版docker的 k8s 步骤如下(线上禁用)
- 步骤一 查看配置的 kubeconfig变量
# 步骤一 查看配置的 kubeconfig变量 如果为空默认是 ~/.kube/config
env | grep KUBECONFIG
- 步骤二 删除 用户目录下的kube 目录 ~/.kube
rm -rf ~/.kube
-
步骤三 在mac上的桌面版docker k8s中 重置k8s 集群
路径如下 新版本
旧版本
-
重点 步骤一 如果输出了路径 如果不是 ~/.kube/config 那就先删除 然后在重新复制到此位置一份
# 我的机器上支持输出为 KUBECONFIG=/etc/kubernetes/admin.conf
env | grep KUBECONFIG
# 删除路径的文件
sudo rm -rf /etc/kubernetes/admin.conf
# 重新复制一份
cp ~/.kube/config /etc/kubernetes/admin.conf
# 授予此文件 读写权限 (直接给最高权限 读写 + 执行权限 )
chmod 755 /etc/kubernetes/admin.conf
- 重启shell终端在重新访问即可

good day !!!
更多推荐
所有评论(0)