我正在尝试让入口控制器在 Minikube 中工作,并按照此处的 K8s 文档中的步骤进行操作,但看到的结果不同,因为入口控制器的 IP 地址与 Minikube 的 IP 地址不同(示例似乎表明它们应该是相同的):
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
example-ingress hello-world.info 10.0.2.15 80 12m
$ minikube ip
192.168.99.101
当我尝试连接到 Minikube IP 地址(直接使用该地址而不是将其添加到我的本地主机文件)时,我收到来自 NGINX 的"未找到"响应:
$ curl http://`minikube ip`/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.15.8.1</center>
</body>
</html>
当我尝试连接到与入口控制器关联的 IP 地址时,它只是挂起。
我应该期望地址与 K8s 文档指示的地址相同吗?
一些附加信息:
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready master 2d23h v1.16.0 10.0.2.15 <none> Buildroot 2018.05.3 4.15.0 docker://18.9.9
$ kubectl get ingresses example-ingress -o yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/$1"},"name":"example-ingress","namespace":"default"},"spec":{"rules":[{"host":"hello-world.info","http":{"paths":[{"backend":{"serviceName":"web","servicePort":8080},"path":"/"}]}}]}}
nginx.ingress.kubernetes.io/rewrite-target: /$1
creationTimestamp: "2019-10-28T15:36:57Z"
generation: 1
name: example-ingress
namespace: default
resourceVersion: "25609"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/example-ingress
uid: 5e96c378-fbb1-4e8f-9738-3693cbce7d9b
spec:
rules:
- host: hello-world.info
http:
paths:
- backend:
serviceName: web
servicePort: 8080
path: /
status:
loadBalancer:
ingress:
- ip: 10.0.2.15
以下是对我有用的方法:
-
迷你库贝开始
-
Minikube 插件启用入口
-
Minikube 插件启用入口 DNS
-
等到你看到入口-nginx-controller-XXXX已启动并运行使用
Kubectl get pods -n ingress-nginx
-
使用 K8s 示例 yaml 文件创建入口
-
更新服务部分以指向已创建的节点端口服务
-
附加
127.0.0.1 hello-world.info
到 MacOS 上的/etc/hosts 文件(注意: 不要使用迷你库贝 IP) -
运行
minikube tunnel
( 保持窗口打开。输入密码后,将不再有消息,光标只是闪烁) -
在浏览器中点击
hello-world.info
(或您在yaml文件中配置的任何主机),它应该可以工作
我已经在 Linux 环境(在 GCP 上)重现了您的场景,并且我还有不同的 IP:
user@bf:~$ minikube ip
192.168.39.144
user@bf:~$ kubectl get ingresses
NAME HOSTS ADDRESS PORTS AGE
example-ingress * 192.168.122.173 80 30m
您的问题与您拥有不同的IP无关。该指南指示我们使用以下规则创建入口:
spec:
rules:
- host: hello-world.info
此规则告知入口服务需要具有hello-world.info
名称的 DNS 记录。 如果您进一步遵循该指南,它会指示您在主机文件上创建一个指向入口 IP 或 Minikube IP 的条目。
注意:如果您在本地运行 Minikube,请使用
minikube ip
获取外部 IP。入口列表中显示的 IP 地址 将是内部 IP.
来源:使用 NGINX 入口控制器在 Minikube 上设置入口
(如果要卷曲 IP 而不是 DNS 名称,则需要从入口中删除主机规则)
它应该看起来像这样:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: web
servicePort: 8080
应用更改:
user@bf:~$ kubectl apply -f example-ingress.yaml
并使用 -Lk 选项卷曲 IP,以克服与安全连接相关的问题。
user@bf:~$ curl -Lk 192.168.39.144
Hello, world!
Version: 1.0.0
Hostname: web-9bbd7b488-l5gc9
除了接受的答案之外,minikube
现在还有一个tunnel
命令,允许您为服务生成外部 IP 地址,可以直接在主机上访问这些地址,而无需使用通用minikube ip
。
在单独的终端中运行minikube tunnel
。这将作为守护程序在前台运行。 在不同的终端中,执行kubectl apply -f <file_name>
命令以部署所需的服务。它应为你生成一个 IP 地址,该地址直接路由到你的服务,并在该地址上的端口 80 上可用。
有关minikube文档的更多信息:https://minikube.sigs.k8s.io/docs/tasks/loadbalancer/
我在Windows 11上得到了Minikube为我工作
minikube start --vm-driver=hyperv
安装迷你库贝入口控制器
minikube addons enable ingress
minikube addons enable ingress-dns
部署掌舵图
helm install ...
获取 Kubernetes IP 地址
nslookup <host-found-in-ingress> $(minikube ip)
添加到等/主机
<minikube-ip> <domain-url>
住!
curl <domain-url>
你的问题来自你如何开始 minkube。如果您只使用"minikube start",它将使用您的本地 docker 桌面。这适用于大多数方案,但对于入口,由于某种原因,将不允许公开入口的外部 IP。
实现此目的的正确方法是使用 hyberv 驱动程序启动 minikube。有两个步骤:
-
在管理模式下启动Windows powershell*重要,并运行commnad:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
-
如果尚未激活,则需要重新启动。您也可以从 Windows 功能手动配置它。
-
使用驱动程序 hyperv 启动 minikube。还需要在管理员中使用Powershell。如果您没有管理员权限,则可能无法执行此操作
minikube start --driver=hyperv
-
将 kyperv 设置为默认值:
minikube config set driver hyperv
-
最后一步需要使用删除重新启动群集,并且该步骤是可选的。
有关如何使用 hyperv 设置 minikube 的完整文档: https://minikube.sigs.k8s.io/docs/drivers/hyperv/
示例如何设置入口: https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
对于 Docker 桌面驱动程序(默认)
您应该使用以下命令创建到集群的隧道:
米尼库贝隧道
您必须确定正在运行的"docker 模式"。它可以是"docker desktop"或"docker engine":
-
检查码头工人模式:
docker version | grep "Docker Engine"
客户: 码头工人引擎 - 社区
docker version | grep "Docker Engine"
客户: 码头工人引擎 - 社区
服务器:码头工人引擎 - 社区
如果您没有看到服务器,则您正在使用 Docker Desktop 运行 docker 最好的解决方案是将其关闭。
当您运行minikube start
如果您使用的是 Docker 桌面,您将收到警告
❗ 为了改善体验,建议使用 Docker 引擎而不是 Docker Desktop。 码头工人引擎安装说明:https://docs.docker.com/engine/install/#server
-
在迷你立方体中启用入口并加载所有准备数据。我将使用 https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/作为基础:
minikube addons enable ingress kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0 kubectl expose deployment web --type=NodePort --port=8080 kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml kubectl get ingress
-
在 minikube 集群内外进行测试 3.1 内部:
minikube ssh curl -H "Host: hello-world.info" 127.0.0.1 #its work
3.2 外部码头工人引擎
curl -H "Host: hello-world.info" $(minikube ip) # only for docker engine
3.3 外部码头工人桌面
ping $(minikube ip) # you won't see a response if it's docker desktop ssh -i $(minikube ssh-key) -p "$(docker port minikube 22/tcp | awk -F ':' '{print $2}')" docker@$(docker port minikube 22/tcp | awk -F ':' '{print $1}') #its work
制作 SSH 隧道
ssh -i $(minikube ssh-key) -p "$(docker port minikube 22/tcp | awk -F ':' '{print $2}')" docker@$(docker port minikube 22/tcp | awk -F ':' '{print $1}') -L 8008:localhost:80 curl -H "Host: hello-world.info" 127.0.0.1:8008 #its work