首页 > 解决方案 > 使用 Docker 驱动程序启动 Minikube 并将其绑定到主机网络

问题描述

我想知道是否可以将我的 minikube 网络绑定到我的host网络。

我试过了:

minikube start --memory=10000 --cpus=4 --vm-driver=docker --kubernetes-version=v1.19.6 --mount --mount-string="/usr/local/citizennet/db:/usr/local/citizennet/db" --network="host"

但我收到以下错误:

❗  Unable to create dedicated network, this might result in cluster IP change after restart: un-retryable: create network host 192.168.49.0/24: docker network create --driver=bridge --subnet=192.168.49.0/24 --gateway=192.168.49.1 -o --ip-masq -o --icc -o com.docker.network.driver.mtu=1500 --label=created_by.minikube.sigs.k8s.io=true host: exit status 1
stdout:

stderr:
Error response from daemon: operation is not permitted on predefined host network

我可以通过使用来做到这一点,haproxy但我想知道是否有更清洁的方式来做到这一点。我的 minikube 托管在 EC2 实例上,我想将所有内容直接转发到我的 minikube。或者至少是 HTTP/HTTPS 请求。

谢谢!

标签: kubernetesminikube

解决方案


我还没有找到将minikube实例公开--driver=docker给主机网络的方法(除了$ kubectl port-forward svc/svc-name --address=0.0.0.0 local_port:pod_port在主机上运行)。

它产生与原始海报相同的错误:

Error response from daemon: operation is not permitted on predefined host network

承认以下评论:

问题是我想使用ingress插件,而这个插件不再兼容--driver=none.

--driver=docker可以选择--driver=none将所有资源直接配置在VM. 您将能够直接从其他网络设备查询资源。

目前minikube版本v1.17.1不允许使用ingress插件,--driver=none但我找到了一种可以配置它的方法。我在这个答案的末尾包含了这个例子。请将此视为一种解决方法。

这个问题(无法在 上使用ingress插件--driver=none)已经在 github 上得到解决


从曝光的角度来讲minikube

由于它旨在从外部资源访问,我建议尝试其他解决方案,从主观上讲,这些解决方案可以更轻松地将您的工作负载暴露给外部资源。有许多可用的工具可以生成 Kubernetes 集群,您可以查看最适合您需求的工具。其中一些是:


部署nginx-ingress_minikube --driver=none

如前所述,请将其视为一种解决方法。

旁注!

看看你的NGINX Ingress控制器是如何配置的,minikube addons enable ingress因为它在这个例子中几乎是模仿的。

脚步:

  • Downloadnginx-ingress YAML清单 :
    • 修改Deployment清单中的
    • Service从清单中删除
  • 申请并检查

Downloadnginx-ingress YAML清单_

您可以使用以下清单:

修改Deployment清单中的

正如我之前所说,跑步时发生的事情minikube addons enable ingress可能会很有用。部署的资源有一些关于您需要如何修改它的线索。

  • 添加hostPortforHTTPHTTPS通信:
          ports:
            - name: http
              hostPort: 80 # <-- IMPORTANT, ADD THIS
              containerPort: 80
              protocol: TCP
            - name: https
              hostPort: 443 # <-- IMPORTANT, ADD THIS
              containerPort: 443
              protocol: TCP
            - name: webhook
              containerPort: 8443
              protocol: TCP
  • 删除--publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
          args:
            - /nginx-ingress-controller
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller # <-- DELETE THIS
            - --election-id=ingress-controller-leader
            - --ingress-class=nginx
            - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
            - --validating-webhook=:8443
            - --validating-webhook-certificate=/usr/local/certificates/cert
            - --validating-webhook-key=/usr/local/certificates/key

Service从清单中删除

您将需要从清单中完全删除名为: Service的类型,因为您已经在使用.LoadBalanceringress-nginxhostPort

完成此步骤后,您应该能够使用资源并在: /Ingress上与它们通信。VM_IP80443


其他资源:


推荐阅读