如何解决使用 Docker 驱动程序启动 Minikube 并将其绑定到主机网络 Download nginx-ingress YAML 清单修改清单中的 Deployment从清单中删除 Service
我想知道是否可以将我的 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 请求。
谢谢!
解决方法
我还没有找到将带有 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
将所有资源放置在 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
配置的,因为它将在本示例中被模仿。
步骤:
-
Download
nginx-ingress
YAML
清单:- 修改清单中的
Deployment
- 从清单中删除
Service
- 修改清单中的
- 申请并检查
Download
nginx-ingress
YAML
清单
您可以使用以下清单:
-
Kubernetes.github.io: Ingress Nginx: Deploy(例如可以下载
GKE
清单)
修改清单中的 Deployment
正如我之前所说的,运行 minikube addons enable ingress
时发生的事情可能会很有用。部署的资源有一些关于您需要如何修改它的线索。
- 为
hostPort
和HTTP
通信添加HTTPS
:
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
的 LoadBalancer
名称:ingress-nginx
,因为您已经在使用 hostPort
。
完成这些步骤后,您应该能够使用 Ingress
资源并在 VM_IP
:80
/443
上与它们通信。
其他资源:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。