带有入口示例的 Minikube 不起作用

Sha*_*wnC 6 kubernetes minikube kubernetes-ingress

我试图让一个入口控制器在 Minikube 中工作,并按照 K8s 文档here中的步骤操作,但我看到不同的结果,入口控制器的 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
Run Code Online (Sandbox Code Playgroud)

当我尝试连接到 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>
Run Code Online (Sandbox Code Playgroud)

当我尝试连接到与入口控制器关联的 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
Run Code Online (Sandbox Code Playgroud)

Mah*_*oud 52

Here\xe2\x80\x99s 对我有用:

\n
    \n
  1. minikube 启动

    \n
  2. \n
  3. minikube 插件启用入口

    \n
  4. \n
  5. minikube 插件启用 ingress-dns

    \n
  6. \n
  7. 等到您看到 ingress-nginx-controller-XXXX 已启动并正在运行Kubectl get pods -n ingress-nginx

    \n
  8. \n
  9. 使用 K8s示例 yaml 文件创建入口

    \n
  10. \n
  11. 更新服务部分以指向您已创建的 NodePort 服务

    \n
  12. \n
  13. 附加\n 127.0.0.1 hello-world.info\n到 MacOS 上的 /etc/hosts 文件(注意:\n不要使用 Minikube IP

    \n
  14. \n
  15. 运行minikube tunnel(保持窗口打开。输入密码后,不会再有任何消息,光标只是闪烁)

    \n
  16. \n
  17. 在浏览器中点击hello-world.info(或您在 yaml 文件中配置的任何主机),它应该可以工作

    \n
  18. \n
\n

  • 对于带有 docker 驱动程序的 m1 设备,请在 /etc/hosts 中使用 127.0.0.1 &lt;您的虚拟域&gt;。我的问题:我使用的是 192.168.49.2 &lt;mydomain.com&gt;,这给我带来了困难。 (9认同)
  • 使用 127.0.01 而不是 Minikube IP 正是我错过的一点!谢谢你! (4认同)
  • 有效,但仍然好奇为什么它不能直接工作。 (2认同)

Mar*_*ney 10

我已经在 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
Run Code Online (Sandbox Code Playgroud)

您的问题与您拥有不同 IP 的事实无关。该指南指示我们使用以下规则创建入口:

spec:
  rules:
  - host: hello-world.info
Run Code Online (Sandbox Code Playgroud)

此规则告诉入口服务需要带有hello-world.info名称的 DNS 记录。如果您进一步遵循该指南,它会指示您在主机文件中创建一个条目,指向您的入口 IP 或 Minikube IP。

注意:如果您在本地运行 Minikube,请使用minikube ip获取外部 IP。入口列表中显示的 IP 地址将是内部 IP。来源:使用 NGINX Ingress Controller 在 Minikube 上设置 Ingress

如果要卷曲 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
Run Code Online (Sandbox Code Playgroud)

应用您的更改:

user@bf:~$ kubectl apply -f example-ingress.yaml
Run Code Online (Sandbox Code Playgroud)

并使用 -Lk 选项卷曲 IP 以解决与安全连接相关的问题。

user@bf:~$ curl -Lk 192.168.39.144
Hello, world!
Version: 1.0.0
Hostname: web-9bbd7b488-l5gc9
Run Code Online (Sandbox Code Playgroud)


Sam*_*NET 7

除了已接受的答案之外,minikube现在还有一个tunnel命令,允许您为服务生成外部 IP 地址,这些地址可以直接在主机上访问,而无需使用常规minikube ip.

minikube tunnel在单独的终端中运行。它作为守护进程在前台运行。在不同的终端中,执行kubectl apply -f <file_name>命令来部署所需的服务。它应该为您生成一个 IP 地址,该地址直接路由到您的服务,并可在该地址的端口 80 上使用。

有关 minikube 文档的更多信息:https://minikube.sigs.k8s.io/docs/tasks/loadbalancer/


小智 5

我在 Windows 11 上安装了 Minikube 来为我工作

minikube start --vm-driver=hyperv
Run Code Online (Sandbox Code Playgroud)

安装 minikube 入口控制器

minikube addons enable ingress
minikube addons enable ingress-dns
Run Code Online (Sandbox Code Playgroud)

部署 Helm Chart

helm install ...
Run Code Online (Sandbox Code Playgroud)

获取 Kubernetes IP 地址

nslookup <host-found-in-ingress> $(minikube ip)
Run Code Online (Sandbox Code Playgroud)

添加到etc/host

<minikube-ip> <domain-url>
Run Code Online (Sandbox Code Playgroud)

居住!

curl <domain-url>
Run Code Online (Sandbox Code Playgroud)