如何将minikube集群的API服务器暴露给公共网络(LAN)?

时间:2018-04-18 10:16:26

标签: 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 [])

所以似乎有可能。但我无法弄清楚如何或找到有关此的更多信息。

我天真地试过:

minikube start --apiserver-ips <ip-address-of-my-lan-interface>

但这只会产生一个完全功能失调的迷你集群,我甚至无法从localhost访问。

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

vboxmanage controlvm "minikube" natpf1 "minikube-api-service,tcp,,8443,,8443"

然后我可以通过以下方式从网络上的其他主机访问API服务器:

curl --insecure https://<ip-address-of-host-running-minikube>:8443

但回应是:

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

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

  },
  "code": 403
}

这有两个问题:

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

2 个答案:

答案 0 :(得分:2)

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

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

  1. 找到服务绑定的VM上的端口。命令kubectl describe <servicename>minikube service <servicename> --url可以为您提供帮助。
  2. 使用vboxmanage工具将端口转发到VM:

    vboxmanage controlvm "minikube" natpf1 "http,tcp,,12345,,80"
    
  3. 其中minikube - 虚拟机的名称,natfp1 - 虚拟机的虚拟接口,12345 - 虚拟机的端口,80 - 本地端口。< / p>

答案 1 :(得分:1)

您最头痛的原因是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

让我们打开包装。

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

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

- name: minikube
  user:
    client-certificate: /home/sam/.minikube/client.crt
    client-key: /home/sam/.minikube/client.key

此块指定执行命令时要验证的用户身份-这就是即使使用--insecure后您仍会收到未经授权的消息的原因。

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