kubectl无法连接到服务器:x509:由未知权限签名的证书

bhe*_*o39 11 ssl kubernetes kubectl

我在运行kubectl一台机器时遇到错误(windows)

k8s集群正在CentOs 7 kubernetes集群1.7 master,worker上运行

这是我的.kube\config

  
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://10.10.12.7:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: system:node:localhost.localdomain
  name: system:node:localhost.localdomain@kubernetes
current-context: system:node:localhost.localdomain@kubernetes
kind: Config
preferences: {}
users:
- name: system:node:localhost.localdomain
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
  

使用kubeadm和pki目录中的默认证书构建集群

kubectl无法连接到服务器:x509:由未知权限签名的证书

Mit*_*was 22

就我而言,它的工作原理很简单 ,只需--insecure-skip-tls-verify 在命令末尾添加kubectl一次即可。

  • 从一般意义上来说,这确实是一个糟糕的建议。虽然这在您的客户端可以连接到服务器的意义上“有效”,但这也意味着您可能通过受损的连接(例如中间人代理)发送敏感数据。 (6认同)
  • 谢谢你。尽管这不是解决方案,但它是一种解决方法。 (2认同)

sap*_*ish 21

另一种解决方案,以防它对任何人有帮助:

我的场景:

  • 使用 Windows 10
  • 通过 Docker Desktop ui 2.1.0.1 安装的 Kubernetes
  • 安装程序在以下位置创建了配置文件 ~/.kube/config
  • ~/.kube/configfor 中的值serverhttps://kubernetes.docker.internal:6443
  • 使用代理

问题: kubectl此端点的命令正在通过代理,我在运行后发现kubectl --insecure-skip-tls-verify cluster-info dump它显示了代理 html 错误页面。

修复:只需确保此 URL 不通过代理,就我使用的 bash 而言export no_proxy=$no_proxy,*.docker.internal

  • `no_proxy=${no_proxy},.docker.internal` 也适用于 MacOS (2认同)

小智 17

跑:

gcloud container clusters get-credentials standard-cluster-1 --zone us-central1-a --project devops1-218400
Run Code Online (Sandbox Code Playgroud)

devops1-218400是我的项目名称。将其替换为您的项目名称。

  • 还将 `standard-cluster-1` 替换为您的集群名称,将 `us-central1-a` 替换为您的区域(尽管我刚刚省略了 --zone 选项)。但这对我有帮助,谢谢! (3认同)
  • ops 不在 gcloud 上运行 (2认同)

Luk*_*ski 12

我在$ kubectl get nodes以 root 用户身份运行时遇到了同样的错误。我通过导出kubelet.conf到环境变量来修复它。

$ export KUBECONFIG=/etc/kubernetes/kubelet.conf
$ kubectl get nodes
Run Code Online (Sandbox Code Playgroud)


小智 9

发生这种情况是因为我公司的网络不允许通过其网络进行自签名证书。尝试切换到不同的网络


Tud*_*dor 7

所以 kubectl 不信任集群,因为无论出于何种原因,配置都搞砸了(包括我的)。要解决此问题,您可以使用 openssl 从集群中提取证书

openssl.exe s_client -showcerts -connect IP:PORT
Run Code Online (Sandbox Code Playgroud)

IP:PORT 应该是您配置中的内容 server:

将从-----BEGIN CERTIFICATE-----to开始的粘贴内容-----END CERTIFICATE-----(包括这些行)复制到一个新的文本文件中,例如... myCert.crt 如果有多个条目,则复制所有条目。

现在转到 .kube\config 而不是

certificate-authority-data: <wrongEncodedPublicKey>`
Run Code Online (Sandbox Code Playgroud)

certificate-authority: myCert.crt
Run Code Online (Sandbox Code Playgroud)

(它假设您将 myCert.crt 与配置文件放在同一文件夹中)如果您正确制作了证书,它将信任集群(尝试重命名文件,之后不再信任)。我希望我知道证书颁发机构数据使用什么编码,但经过几个小时的谷歌搜索后,我求助于这个解决方案,回顾过去,我认为无论如何它更优雅。

  • 谢谢你,你很有见地。根据我的经验,您可以使用以下命令查看证书颁发机构数据中的内容:`echo 证书颁发机构数据字符串 | base64 --decode` 它只显示 `-----BEGIN CERTIFICATE----- xx -----END CERTIFICATE----- ` (换句话说,PEM X.509 证书),所以绝对这里没有什么惊喜。 (4认同)

bhe*_*o39 6

我只是想分享,抱歉我没能早点提供这个,因为我刚刚意识到这是造成的

所以在主节点上我们运行了一个 kubectl 代理

kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
Run Code Online (Sandbox Code Playgroud)

我停止了这个,瞧错误消失了。

我现在可以做

    kubectl 获取节点
姓名 状态 年龄 版本
centos-k8s2 Ready 3d v1.7.5
localhost.localdomain Ready 3d v1.7.5

我希望这可以帮助那些偶然发现这种情况的人


小智 6

我的情况我解决了这个问题,将 kubelet 配置复制到我的家庭 kube 配置

cat /etc/kubernetes/kubelet.conf > ~/.kube/config


AJR*_*rer 5

对于那些像我一样迟到的人,这些答案都不适合你,我可能有解决方案:

当我将 .kube/config 文件复制到我的 Windows 10 计算机(安装了 kubectl)时,我没有将 IP 地址从 127.0.0.1:6443 更改为主服务器的 IP 地址 192.168.xx(运行连接的 Windows 10 计算机)到同一网络上的树莓派集群)。确保你这样做,它可能会像解决我的问题一样解决你的问题。


小智 5

我删除/注释掉了这一行 certificate-authority-data:并且它起作用了。