kubectl 无法连接到服务器:x509:由未知授权机构签署的证书

kubectl unable to connect to server: x509: certificate signed by unknown authority

当 运行 kubectl 一台一台机器 (windows)

时出现错误

k8s 集群 运行 在 CentOs 7 kubernetes 集群 1.7 上 主人,工人

这是我的。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:由未知授权机构签署的证书

抱歉,我之前无法提供此信息,我刚刚意识到原因:

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

kubectl proxy --address 0.0.0.0 --accept-hosts '.*'

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

我现在可以了

    kubectl get nodes
NAME                    STATUS    AGE       VERSION
centos-k8s2             Ready     3d        v1.7.5
localhost.localdomain   Ready     3d        v1.7.5

我希望这对那些偶然发现这种情况的人有所帮助。

如果出现错误,您应该导出所有包含证书的 kubecfg。 kops export kubecfg "your cluster-nameexport KOPS_STATE_STORE=s3://"paste your S3 store" .

现在您应该能够访问和查看集群的资源了。

在 GCP 上

检查:gcloud 版本

-- localMacOS#gcloud 版本

运行: --- localMacOS# gcloud container clusters get-credentials 'clusterName' \ --zone=us-'zoneName'

从您的控制台获取 clusterName 和 zoneName -- 此处:https://console.cloud.google.com/kubernetes/list?

ref: .x509 @market place 在 GCP 上的部署#Kubernetes

运行:

gcloud container clusters get-credentials standard-cluster-1 --zone us-central1-a --project devops1-218400

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

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

$ export KUBECONFIG=/etc/kubernetes/kubelet.conf
$ kubectl get nodes

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

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

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

我的场景:

  • 使用 Windows 10
  • 通过 Docker 桌面安装的 Kubernetes ui 2.1.0.1
  • 安装程序在 ~/.kube/config
  • 创建了配置文件
  • ~/.kube/configserver 的值是 https://kubernetes.docker.internal:6443
  • 使用代理

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

修复: 只是确保这个 URL 不通过代理,在我的例子中 bash 我使用 export no_proxy=$no_proxy,*.docker.internal

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

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

当我将我的 .kube/config 文件复制到我的 windows 10 机器(安装了 kubectl)时,我没有将 IP 地址从 127.0.0.1:6443 更改为主机的 IP 地址这是 192.168.x.x。 (运行 windows 10 台机器连接到同一网络上的 raspberry pi 集群)。确保您这样做,它可能会像解决我的问题一样解决您的问题。

这是一个老问题,但如果这里也能帮助到其他人,则可能是另一个原因。

假设您已经使用用户 x 部署了 Kubernetes。如果 .kube 目录在 /home/x 用户下,并且您使用 root 或 y 用户连接到节点,它将给您这个错误。

您需要切换到用户配置文件,以便 kubernetes 可以从 .kube 目录加载配置。

更新: 当从主节点复制本地 pc 上的 ~/.kube/config 文件内容时,请确保将负载均衡器的主机名替换为有效的 IP。在我的例子中,问题与 dns 查找有关。

希望对您有所帮助。

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

openssl.exe s_client -showcerts -connect IP:PORT

IP:PORT 应该是你配置里写在server:

之后的

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

现在转到 .kube\config 而不是

certificate-authority-data: <wrongEncodedPublicKey>`

certificate-authority: myCert.crt

(假设您将 myCert.crt 放在与配置文件相同的文件夹中) 如果您正确地制作了证书,它将信任该集群(尝试重命名该文件,之后它不再受信任)。 我希望我知道编码 certificate-authority-data 使用什么,但经过几个小时的谷歌搜索后我求助于这个解决方案,回想起来我认为它更优雅。

我收到这个是因为我没有连接到办公室的 VPN

对于我的情况,通过在 kubectl 命令末尾添加 --insecure-skip-tls-verify 一次,它很简单。