![](/img/trans.png)
[英]how to expose an simple web application on internet using minikube?
[英]How to expose minikube ingress to internet
我在我的 linux 笔记本电脑(计算机 A)上安装了一个 minikube
并在其上部署一些服务:
$ minikube service list
命名空间 | 名称 | 目标端口 | URL |
---|---|---|---|
证书管理器 | 证书管理器 | 无节点端口 | |
证书管理器 | 证书管理器 webhook | 无节点端口 | |
默认 | aws | 5000 | http://192.168.49.2:30728 |
默认 | azure | 5000 | http://192.168.49.2:31794 |
默认 | 云端 | 5000 | http://192.168.49.2:32367 |
默认 | 高频 | 5000 | http://192.168.49.2:30970 |
默认 | 高铁 | 5000 | http://192.168.49.2:30612 |
默认 | kube.netes | 无节点端口 | |
默认 | 打开 | 5000 | http://192.168.49.2:31547 |
入口-nginx | 入口-nginx-控制器 | http/80 | http://192.168.49.2:31053 |
https/443 | http://192.168.49.2:30302 | ||
入口-nginx | 入口-nginx-控制器-准入 | 无节点端口 | |
kube系统 | kube-dns | 无节点端口 | |
kube.netes-仪表板 | 仪表板指标刮板 | 无节点端口 | |
kube.netes-仪表板 | kube.netes-仪表板 | 无节点端口 |
如您所见,有 6 个使用 fastAPI 创建的服务位于入口后面。 我已将入口设置为主机galigator.fun
。 Cert-manager 已准备好启动,但目前 TLS 在入口处发表评论。 galigator.fun
是我拥有的 DNS 名称。
$ minikube addons enable ingress
$ kubectl describe ingress
Name: multiplex-applications
Namespace: default
Address: 192.168.49.2
Default backend: default-http-backend:80 ()
Rules:
Host Path Backends
---- ---- --------
galigator.fun
/v1/aws/(.+) aws:5000 (172.17.0.11:5000)
/v1/azure/(.+) azure:5000 (172.17.0.14:5000)
/v1/gcloud/(.+) gcloud:5000 (172.17.0.13:5000)
/v1/deepml/best/(.+) hftf:5000 (172.17.0.10:5000)
/v1/deepml/edge/(.+) hft:5000 (172.17.0.3:5000)
/v1/deepml/razor/(.+) open:5000 (172.17.0.8:5000)
Annotations: cert-manager.io/issue-temporary-certificate: true
cert-manager.io/issuer: letsencrypt-staging
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 52m (x3 over 53m) nginx-ingress-controller Scheduled for sync
默认后端的错误似乎与我的问题无关......
如果使用minikube ip
和galigator.fun
向/etc/hosts
添加一个条目,那么我可以毫无问题地运行我的服务。 但是计算机 B 不是计算机 C。
如何从计算机B和计算机C访问我的服务?
我不想更改计算机 B 和 C 中的任何配置。
据我了解, minikube ip
在我的 Inte.net Box 中是未知的; 它不是物理设备。 我的 minikube 从我的 kubuntu-21.04 运行,并以minikube start --ports=80,443
或只是minikube start
,但我无法观察到差异。
另一件事看起来不起作用。
$ kubectl port-forward --address 0.0.0.0 deployment/ingress-nginx-controller 80:80 --namespace ingress-nginx
Unable to listen on port 80: Listeners failed to create with the following errors: [unable to create listener: Error listen tcp4 0.0.0.0:80: bind: permission denied]
error: unable to listen on any of the requested ports: [{80 80}]
我已经使用 Apache 正确测试了端口 80 和 443 的 Inte.net 和计算机 A 之间的连接。因为我已经删除了该服务器。
首先,正如文档解释的那样,我尝试使用minikube
启动选项。
minikube start --listen-address='0.0.0.0' --ports=80,443
但正如我们所见,它并没有改变任何东西:
$ docker container ls |grep minikube
0aafb00fd97d gcr.io/k8s-minikube/kicbase:v0.0.25 "/usr/local/bin/entr…" 3 weeks ago Up 22 minutes 127.0.0.1:49172->22/tcp, 127.0.0.1:49171->2376/tcp, 127.0.0.1:49170->5000/tcp, 127.0.0.1:49169->8443/tcp, 127.0.0.1:49168->32443/tcp minikube
因此,如果我们更深入地调查命令错误:
kubectl port-forward -n ingress-nginx --address 0.0.0.0 service/ingress-nginx-controller 80:80 443:443
我们可以发现绑定到端口80
和443
但它们低于1000
并且需要额外的权限/root。 出于商品原因, kubectl
不是根进程。
所以一个丑陋的解决方案可能是做这样的事情:
kubectl port-forward -n ingress-nginx --address 0.0.0.0 service/ingress-nginx-controller 50000:80 50001:443
然后更改 Inte.netBox 中的 NAT 规则。 但我不喜欢它,因为minikube
是一个不应影响其他硬件的实现细节。
所以一个不那么可怕的解决方案是让 kubectl 写入绑定到低端口号......
$ man 7 capabilities | grep -A 1 CAP_NET_BIND_SERVICE
CAP_NET_BIND_SERVICE
Bind a socket to Internet domain privileged ports (port numbers less than 1024).
所以命令应该是:
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/kubectl
然后
kubectl port-forward -n ingress-nginx --address 0.0.0.0 service/ingress-nginx-controller 80:80 443:443
它适用于...
但是这里有一个主要问题,我们必须在每次启动时重做最后一个命令,并且在每次升级时重做最后两个...
如果有人有一个好的答案,那也可以用于LAN
上的后台服务器,我会喜欢的。
仅在执行来自证书管理器的质询期间才需要端口80
。 因此,可以接近它的解决方案也可能很有趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.