【问题标题】:kubectl unable to connect to server: x509: certificate signed by unknown authoritykubectl 无法连接到服务器:x509:证书由未知机构签名
【发布时间】:2018-02-24 08:01:52
【问题描述】:

在一台机器(windows)运行 kubectl 时出现错误

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:证书由未知机构签名

【问题讨论】:

    标签: ssl kubernetes kubectl


    【解决方案1】:

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

    我的场景:

    • 使用 Windows 10
    • Kubernetes 通过 Docker Desktop 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

    【讨论】:

    • no_proxy=${no_proxy},.docker.internal 也在 MacOS 上工作过
    • 就我而言,我还需要export NO_PROXY=${no_proxy},.docker.internal
    • 是的,我也必须使用大写的 NO_PROXY。版本:k8s:v1.18.8;码头工人:19.03.13 MacOS Catalina 10.15.7
    • *.docker.internal 附加到我的 no_proxy 环境工作!
    【解决方案2】:

    运行:

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

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

    【讨论】:

    • 还将standard-cluster-1 替换为您的集群名称,将us-central1-a 替换为您的区域(尽管我只是省略了--zone 选项)。但这对我有帮助,谢谢!
    • ops 不在 gcloud 上运行
    • 这为我解决了问题。我需要为我的每个项目运行它。
    • 如果只创建了集群并且出现上述错误,那么:gcloud container clusters get-credentials cluster-1 --zone us-central1-c
    • gcloud 是否适用于我的 rke 设置?
    【解决方案3】:

    所以 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 与配置文件放在同一文件夹中) 如果您正确制作了证书,它将信任集群(尝试重命名文件并且之后不再信任)。 我希望我知道证书颁发机构数据使用什么编码,但经过几个小时的谷歌搜索后,我采用了这个解决方案,回想起来我认为它更优雅。

    【讨论】:

    • 谢谢你,你很有见地。根据我的经验,您可以通过 echo certificate-authority-data-string | base64 --decode 查看 certificate-authority-data 中的内容,它只显示 -----BEGIN CERTIFICATE----- xx -----END CERTIFICATE----- (即 PEM X.509 证书),所以这里绝对不会有任何意外。
    【解决方案4】:

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

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

    【讨论】:

    • 最好把它添加到 ~/.bashrc 中?
    • 是的,您可以将环境变量添加到~/.bashrc,这样您就可以让它在所有 bash 会话中保持不变。
    • 非常感谢老兄
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        对不起,我之前没能提供这个,我才意识到原因:

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

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

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

        我现在可以做

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

            • 完全相同的问题。做了你提到的(这没有意义)和我的结果:Unable to connect to the server: dial tcp 127.0.0.1:6443: connectex: No connection could be made because the target machine actively refused it.
            • 我不确定您是否理解我的评论。我将 kubeconfig 文件从集群的主节点复制到我的 Windows 10 计算机。当 kubeconfig 文件位于主节点上时,它可以工作,因为它正在侦听 6443 上服务器的本地主机。现在我试图连接到该服务器,我需要将 kubeconfig 中的 IP 地址更改为网络 IP 地址主节点。
            【解决方案10】:

            在 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 上的部署

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

                这是一个老问题,但如果这也有助于其他人,这是另一个可能的原因。

                假设您已经使用用户 x 部署了 Kubernetes。如果 .kube 目录在 /home/x 用户下,并且您使用 root 或 y 用户连接到节点,则会出现此错误。

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

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

                希望这会有所帮助。

                【讨论】:

                  【解决方案13】:

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

                  【讨论】:

                    猜你喜欢
                    • 2021-09-23
                    • 1970-01-01
                    • 2018-11-11
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-02-01
                    • 2019-10-02
                    • 2022-10-19
                    • 2017-12-23
                    相关资源
                    最近更新 更多