【问题标题】:Invalid x509 certificate for kubernetes masterkubernetes master 的 x509 证书无效
【发布时间】:2018-03-03 18:37:29
【问题描述】:

我正在尝试从我的工作站访问我的 k8s 主机。我可以从 LAN 很好地访问主服务器,但不能从我的工作站访问。错误信息是:

% kubectl --context=employee-context get pods
Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 10.161.233.80, not 114.215.201.87

如何将 114.215.201.87 添加到证书中?我是否需要删除我的旧集群 ca.crt,重新创建它,重新启动整个集群,然后重新签署客户端证书?我已经使用 kubeadm 部署了我的集群,但我不确定如何手动执行这些步骤。

【问题讨论】:

    标签: kubernetes kubeadm


    【解决方案1】:

    一种选择是告诉kubectl,您不希望验证证书。显然这会带来安全问题,但我猜你只是在测试,所以你去吧:

    kubectl --insecure-skip-tls-verify --context=employee-context get pods
    

    更好的选择是修复证书。最简单的方法是通过在包括主节点在内的所有节点上运行 kubeadm reset 然后重新初始化集群

    kubeadm init --apiserver-cert-extra-sans=114.215.201.87
    

    也可以在不擦除所有内容的情况下修复该证书,但这有点棘手。以 root 身份在 master 上执行类似的操作:

    rm /etc/kubernetes/pki/apiserver.*
    kubeadm init phase certs all --apiserver-advertise-address=0.0.0.0 --apiserver-cert-extra-sans=10.161.233.80,114.215.201.87
    docker rm `docker ps -q -f 'name=k8s_kube-apiserver*'`
    systemctl restart kubelet
    

    【讨论】:

    • 我认为这不再是一个合法的答案,因为这个alpha 子命令不可用anymore
    • 对于 kubeadm 1.15,只需运行命令 kubeadm alpha certs renew all
    • 因为kubeadm alpha子命令已经不可用了,可以用下面的命令kubeadm init phase certs all --apiserver-advertise-address=0.0.0.0 --apiserver-cert-extra-sans=10.161.233.80,114.215.201.87替换
    【解决方案2】:

    此命令适用于新的 kubernetes >=1.8:

    rm /etc/kubernetes/pki/apiserver.*
    kubeadm alpha phase certs all --apiserver-advertise-address=0.0.0.0 --apiserver-cert-extra-sans=10.161.233.80,114.215.201.87
    docker rm -f `docker ps -q -f 'name=k8s_kube-apiserver*'`
    systemctl restart kubelet
    

    另外最好将dns名称添加到--apiserver-cert-extra-sans以避免下次出现此类问题。

    【讨论】:

    • 你是神!!
    • 我收到了Error: unknown flag: --apiserver-advertise-address。我认为从那时起这个 alpha 子命令发生了很大变化。
    • 谢谢。对于任何有问题的人。 Alpha 只是任何实验性命令的命令。当他们不再处于实验阶段时,他们将毕业并从alpha 中删除。 kubeadm init phase certs all 对我来说效果很好。
    【解决方案3】:

    对于 kubeadm v1.13.3

    rm /etc/kubernetes/pki/apiserver.*
    kubeadm init phase certs all --apiserver-advertise-address=0.0.0.0 --apiserver-cert-extra-sans=114.215.201.87
    docker rm -f `docker ps -q -f 'name=k8s_kube-apiserver*'`
    systemctl restart kubelet
    

    【讨论】:

    • 也可以很好地与 v1.14.3 配合使用。我可能会添加一件事:看起来私有 IP 会自动添加到 --apiserver-cert-extra-sans,因此您只需在那里添加额外的公共 IP
    • 在 v1.17.2 中也能很好地工作。我需要 --apiserver-cert-extra-sans=aaa,bbb,ccc,ddd,eee。
    【解决方案4】:

    如果您使用 kubespray 配置集群,则需要添加“浮动 ip”(在您的情况下为“114.215.201.87”)。此变量在group_vars/k8s-cluster/k8s-cluster.yml 文件中称为supplementary_addresses_in_ssl_keys。更新后,只需重新运行您的ansible-playbook -b -v -i inventory/<WHATEVER-YOU-NAMED-IT>/hosts.ini cluster.yml

    注意:在运行之前,您仍然必须从每个主节点中删除所有 apiserver 证书 (rm /etc/kubernetes/pki/apiserver.*)!

    【讨论】:

      【解决方案5】:

      问题原因: 您在 $HOME/.kube/ 的配置与您的旧 IP 地址一起存在。

      尝试跑步,

      rm $HOME/.kube/* -rf
      cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      chown $(id -u):$(id -g) $HOME/.kube/config
      

      【讨论】:

      • 这与 .kube 目录无关。有可能是IP不匹配,但不代表我们需要删除。
      【解决方案6】:

      对于 Kubernetes 1.12.2/CentOS 7.4,顺序如下:

      rm /etc/kubernetes/pki/apiserver.*
      kubeadm alpha phase certs all --apiserver-advertise-address=0.0.0.0 --apiserver-cert-extra-sans=51.158.75.136
      docker rm -f `docker ps -q -f 'name=k8s_kube-apiserver*'`
      systemctl restart kubelet
      

      【讨论】:

        【解决方案7】:

        使用以下命令:

        kubeadm init phase certs all
        

        【讨论】:

          【解决方案8】:

          以下对我有帮助:

          1. rm -rf ~/.minikube
          2. minikube delete
          3. minikube start

          可能第 2 和第 3 项就足够了

          【讨论】:

            【解决方案9】:

            当我尝试通过 root 访问时(在 sudo -i 之后)我得到了错误。 我很兴奋,并且对于普通用户来说它正在工作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-06-26
              • 2016-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-28
              相关资源
              最近更新 更多