kubectl 返回“无法连接到服务器:x509:证书对于...有效”

JRo*_*erC 2 kubectl minikube

我在远程计算机(k8_host)上启动了一个 minikube 实例。我正在尝试从本地计算机(client_comp)连接到它。我按照此处给出的指示进行设置并移动证书。

看来我可以在 client_comp 上成功使用 kubectl 执行 ping 操作,但收到证书错误:

    $ kubectl get pods
    Unable to connect to the server: x509: certificate is valid for 192.168.49.2, 10.96.0.1, 127.0.0.1, 10.0.0.1, not 192.168.1.69
Run Code Online (Sandbox Code Playgroud)

当我检查 minikube 的 IP 设置时,我得到

$minikube ip
192.168.49.2
Run Code Online (Sandbox Code Playgroud)

k8_host的ip是192.168.1.69。

如果我理解正确的话,似乎当 minikube 启动时,它会自动生成一组证书,这需要一个域。因此,它使用 k8_host 上的 minikube 本地 IP (192.168.49.2) 创建了证书。而且,当我尝试从 client_comp 进行连接时,它将主机设置为 k8_host 的网络 IP (192.168.1.69)。

我需要更新证书吗?我猜测,由于 nginx 设置为仅传递 ssl 证书(使用流),所以我不能只在 nginx 配置中添加正确的主机。

作为将来的参考,我在 minikube 设置过程中是否做错了什么?

以供参考:

~/.kube/config(在 client_comp 上)

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: [redacted]
    server: [redacted]
  name: docker-desktop
- cluster:
    certificate-authority: home_computer/ca.crt
    server: https://192.168.1.69:51999
  name: home_computer
contexts:
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
- context:
    cluster: home_computer
    user: home_computer
  name: home_computer
current-context: home_computer
kind: Config
preferences: {}
users:
- name: docker-desktop
  user:
    client-certificate-data: [redacted]
    client-key-data: [redacted]
- name: home_computer
  user:
    client-certificate: home_computer/client.crt
    client-key: home_computer/client.key
Run Code Online (Sandbox Code Playgroud)

~/.minikube/config (在 k8 主机上)

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/coopers/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Thu, 25 Mar 2021 22:27:27 EDT
        provider: minikube.sigs.k8s.io
        version: v1.18.1
      name: cluster_info
    server: https://192.168.49.2:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Thu, 25 Mar 2021 22:27:27 EDT
        provider: minikube.sigs.k8s.io
        version: v1.18.1
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /home/coopers/.minikube/profiles/minikube/client.crt
    client-key: /home/coopers/.minikube/profiles/minikube/client.key
Run Code Online (Sandbox Code Playgroud)

/etc/nginx/nginx.conf (在 k8 主机上)

stream {
    server {
        listen 192.168.1.69:51999;
        proxy_pass 192.168.49.2:8443;
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到了这个问题,但似乎有不同的根本问题。

感谢您的任何帮助或指导。

JRo*_*erC 5

好吧,我找到了一个方法。这是一种 Deep-6-ish 方法,仅当您可以接受丢失 k8s 集群的状态时才应使用。

首先,我停止了集群,并删除了所有集群定义:

$ minikube stop
$ minikube delete --all
Run Code Online (Sandbox Code Playgroud)

然后我重新启动集群

$ minikube start --apiserver-ips=<k8_host ip>
Run Code Online (Sandbox Code Playgroud)

这重新创建了客户端密钥和证书,但保留了相同的 ca 证书。所以,我只需要将 ~/.minikube/profiles/minikube/client.crt 和 ~/.minikube/profiles/minikube/client.key 从 k8_host 复制到 client_comp 。

希望这对将来的其他人有帮助。