如何将 minikube 集群的 API server 暴露给公网(LAN)?

ano*_*ode 3 kubernetes minikube

有没有办法将在minikube公共网络接口上创建的 Kubernetes 集群的 API 服务器暴露给 LAN?

minikube start --help 谈论这个选项(和两个类似的):

  --apiserver-ips ipSlice \
    A set of apiserver IP Addresses which are used in the generated \
    certificate for localkube/kubernetes. This can be used if you \
    want to make the apiserver available from outside the machine (default [])
Run Code Online (Sandbox Code Playgroud)

所以这似乎是可能的。但我无法弄清楚如何或找到任何进一步的信息。

我天真地尝试:

minikube start --apiserver-ips <ip-address-of-my-lan-interface>
Run Code Online (Sandbox Code Playgroud)

但这只会产生一个完全功能失调的 minikube 集群,我什至无法从本地主机访问它。


按照下面一个答案中的建议,我向 Kubernetes 添加了端口转发,如下所示:

vboxmanage controlvm "minikube" natpf1 "minikube-api-service,tcp,,8443,,8443"
Run Code Online (Sandbox Code Playgroud)

然后我实际上可以从网络上的不同主机访问 API 服务器:

curl --insecure https://<ip-address-of-host-running-minikube>:8443
Run Code Online (Sandbox Code Playgroud)

但回应是:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {

  },
  "code": 403
}
Run Code Online (Sandbox Code Playgroud)

这有两个问题:

  1. 我必须--insecure用于curl调用,否则我会收到 SSL 验证错误。
  2. 我收到了回复,但回复只是告诉我我不允许使用 API...

Sam*_*ber 5

您头疼的一大原因是 minikube 运行在具有自己 IP 地址的 VM 中(通常)。为了安全起见,它会生成一些自签名证书并配置 api 命令行工具 kubectl 来使用它们。证书使用 VM IP 作为证书的主机名进行自签名。

如果您使用kubectl config view. 这是我的:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/sam/.minikube/ca.crt
    server: https://192.168.39.226:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /home/sam/.minikube/client.crt
    client-key: /home/sam/.minikube/client.key
Run Code Online (Sandbox Code Playgroud)

让我们打开它。

server: https://192.168.39.226:8443- 这会告诉 kubectl 服务器在哪里。在香草 minikube 设置中,它是https://<ip-of-the-vm>:8443. 请注意,它的 https.

certificate-authority: /home/sam/.minikube/ca.crt- 此行告诉工具使用哪个证书颁发机构文件来验证 TLS 证书。因为它是自签名证书,即使在 vanilla 设置中,您也必须通知 curl 有关证书颁发机构文件或使用--insecure.

- name: minikube
  user:
    client-certificate: /home/sam/.minikube/client.crt
    client-key: /home/sam/.minikube/client.key
Run Code Online (Sandbox Code Playgroud)

此块指定在发出命令时要验证的用户 - 这就是为什么即使在使用后您也会收到未经授权的消息--insecure

因此,要使用来自不同 IP 的 minikube 集群,您需要:1) 使用--apiserver-ips <target-ip-here>(因此 minikube 生成的证书用于您将要访问的正确 IP) 2) 将 minikube vm 的 8443 端口转发到在<target-ip-here>:8443 3) 发布或以其他方式提供引用的证书文件kubectl config view 4) 设置您的 kubectl 配置以模仿您的本地 kubectl 配置,使用新 ip 并引用已发布的证书文件。


Ant*_*nko 2

您需要将 LAN 接口上的某些端口转发到运行 Kubernetes 的虚拟机。这适用于 Minikube 内的任何服务,而不仅仅是 Kubernetes 本身。

简而言之,如果您使用 VirtualBox 作为 VM 驱动程序,您应该:

  1. 在虚拟机上找到您的服务绑定的端口。命令kubectl describe <servicename>应该minikube service <servicename> --url对你有帮助。
  2. 使用工具将端口转发到虚拟机vboxmanage

    vboxmanage controlvm "minikube" natpf1 "http,tcp,,12345,,80"
    
    Run Code Online (Sandbox Code Playgroud)

其中minikube- VM 的名称,natfp1- VM 的虚拟接口,12345- VM 的端口,80- 本地端口。