前言

由于给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 !!!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐