在 Minikube 中使用 ingress 的示例未能正常工作

我试图在 Minikube 中使 ingress 控制器正常工作,并遵循 K8s 文档 here 中的步骤,但看到了与 Minikube 的 IP 地址不同的 ingress 控制器的 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 地址时 (直接使用地址而不是将其添加到我的本地 hosts 文件中),我从 NGINX 中收到了一个 "Not found" 的响应:

$ 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>

当我尝试连接到与 ingress 控制器关联的 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
点赞
用户12153576
用户12153576

我在 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。

来源:在 Minikube 上使用 NGINX 入口控制器设置入口

(如果您想使用 curl IP 而不是 DNS 名称,则需要从入口中删除 host 规则)

它应该看起来像这样:

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 选项 curl IP 以克服与安全连接相关的问题。

user@bf:~$ curl -Lk 192.168.39.144
Hello, world!
Version: 1.0.0
Hostname: web-9bbd7b488-l5gc9
2019-10-29 09:54:06
用户1919397
用户1919397

除了已经接受的回答外,minikube 现在还有一个 tunnel 命令,允许您为您的服务生成外部 IP 地址,直接在主机上访问,而不使用常规的 minikube ip

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

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

2019-12-11 21:16:04
用户6259339
用户6259339

我在 Windows 11 上使用 Minikube 成功了

minikube start --vm-driver=hyperv

安装 minikube Ingress 控制器

minikube addons enable ingress
minikube addons enable ingress-dns

部署 Helm Chart

helm install ...

获取 Kubernetes IP 地址

nslookup <host-found-in-ingress> $(minikube ip)

添加到 etc/host

<minikube-ip> <domain-url>

上线!

curl <domain-url>
2022-07-17 02:41:05
用户9292315
用户9292315

下面是对我有效的步骤:

  1. 运行 minikube start

  2. 运行 minikube addons enable ingress

  3. 运行 minikube addons enable ingress-dns

  4. 等待看到 ingress-nginx-controller-XXXX 已经在运行,可以使用 Kubectl get pods -n ingress-nginx 命令检查

  5. 使用 K8s 示例 YAML 文件 创建一个 ingress

  6. 更新 service 部分,使它指向你已经创建的 NodePort Service

  7. 在 MacOS 的 /etc/hosts 文件中添加 127.0.0.1 hello-world.info (注意,不要使用 Minikube 的 IP)

  8. 运行 minikube tunnel (保持窗口打开。输入密码后不会再出现任何消息,光标会闪烁)

  9. 在浏览器中访问 hello-world.info(或者你在 YAML 文件中配置的任何主机名),应该能够看到效果。

2022-09-15 17:06:21