【问题标题】:How to directly access ingress-nginx inside minikube如何在 minikube 中直接访问 ingress-nginx
【发布时间】:2021-09-13 22:53:49
【问题描述】:

我是 K8s 的新手,目前正在学习使用 K8s 的课程。我在本地机器上使用 minikube。我被困在需要直接与 ingress-nginx 通信的部分,而 ingress-nginx 恰好位于单独的命名空间中。

以下是有关我的设置的一些信息。

    ✗ client (main) ✗ kubectl get namespace
    NAME              STATUS   AGE
    default           Active   25d
    ingress-nginx     Active   21d
    kube-node-lease   Active   25d
    kube-public       Active   25d
    kube-system       Active   25d

服务

    ✔︎ client (main) ✗ kubectl get services -n ingress-nginx
    NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx-controller             NodePort    10.105.88.90   <none>        80:30306/TCP,443:31814/TCP   21d
    ingress-nginx-controller-admission   ClusterIP   10.101.75.17   <none>        443/TCP                      21d

我的 ingress-srv.yaml 文件

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-service
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/use-regex: "true"
      labels:
        name: ingress-service
    spec:
      rules:
        - host: ticketing.dev
          http:
            paths:
              - pathType: Prefix
                path: "/api/users/(.*)"
                backend:
                  service:
                    name: auth-srv
                    port:
                      number: 3000
              - pathType: Prefix
                path: /?(.*)
                backend:
                  service:
                    name: client-srv
                    port:
                      number: 3000

我在github 上查找了一些信息,为了进行交叉通信,我需要做的是http://&lt;service&gt;.&lt;namespace&gt;.svc.cluster.local:&lt;port&gt;/。基于这些信息,我想出了 http://ingress-nginx-controller.ingress-nginx.svc.cluster.local 并使用 curl 进行测试。

✔︎ client (main) ✗ curl http://ingress-nginx-controller.ingress-nginx.svc.cluster.local
curl: (6) Could not resolve host: ingress-nginx-controller.ingress-nginx.svc.cluster.local

我正在学习名为 Microservices with Node JS and React 的课程

希望您的回答和见解。 谢谢。

【问题讨论】:

  • 为什么需要向nginx-ingress-controller service 发送电话?它应该在您的应用程序正在运行的域名上监听。或者直接转至app-service
  • 嗨,我正在通过微服务课程学习 k8s,其中提到应该联系 ingress-nginx。他建议使用http://&lt;service&gt;.&lt;namespace&gt;.svc.cluster.local:&lt;port&gt;/my/api/route,以便修复 NextJS 中的错误。这个问题实际上与这个现有问题stackoverflow.com/questions/64707777/… 相关或相似,但我不确定为什么会得到不同的结果。
  • 你在哪里运行了这个 curl 命令?如果您在主机上运行它,您将无法访问internal kubernetes 集群 DNS。您可以通过kubectl run test --image nginx --attach --leave-stdin-open --rm -it -- curl ingress-nginx-controller.ingress-nginx.svc.cluster.local 在集群内测试它的可访问性——这将运行一个带有nginx 图像的pod,然后从集群内部对nginx ingress controller 运行curl。然后ctrl-ckubectl logs test。你会看到答案的。

标签: nginx kubernetes


【解决方案1】:

如果您在 Ingress-nginx 命名空间中使用入口控制器,则它是完美的,或者也可以是任何其他命名空间。

您已经在应用程序运行的命名空间中创建了入口对象,而不管您的控制器在哪里运行。

Ingress 将使用您在 ingress 对象中指定的类自动找到控制器或跨命名空间与其通信。

简单来说

如果您的 app1 在命名空间 application 中运行,只需在 application 命名空间中创建一个 ingress 指向 app1 服务,你就完成了。

apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-service
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/use-regex: "true"
      labels:
        name: ingress-service
    spec:
      rules:
        - host: ticketing.dev
          http:
            paths:
              - pathType: Prefix
                path: "/api/users/(.*)"
                backend:
                  service:
                    name: auth-srv
                    port:
                      number: 3000
              - pathType: Prefix
                path: /?(.*)
                backend:
                  service:
                    name: client-srv
                    port:
                      number: 3000
  • 入口控制器(简单的 Pod/部署以及可用于利用路由和代理的服务。基于 Nginx 示例);
  • Ingress 规则(一个单独的 Kubernetes 资源,具有 kind: Ingress。仅当 Ingress Controller 已存在且 ingress 中提及 class 时才会生效)

Ingress Controller 可以部署在任何命名空间中,通常部署在与您的应用服务分开的命名空间中,就像您在 ingress-nginx 中所做的那样。它可以开箱即用地查看集群中所有命名空间中的 Ingress 规则,并将它们拾取。

但是,Ingress 规则必须位于它们配置的应用所在的命名空间中。

【讨论】:

  • 嗨,我不确定我的回答是否正确,你的意思是我需要将我的 ingress-nginx 的命名空间更改为默认命名空间,因为我所有其他正在运行的应用程序都在默认命名空间下运行.我的问题是访问http://ingress-nginx-controller.ingress-nginx.svc.cluster.local,它将在 API 调用中使用。
猜你喜欢
  • 2020-12-25
  • 2021-01-29
  • 2020-05-24
  • 2021-01-16
  • 2021-11-25
  • 2019-11-02
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多