使用 Nginx Ingress Controller 获取所有主机都被其他资源占用

问题描述 投票:0回答:2

我已经按照文档中提到的方式设置了 Nginx 控制器 https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/。我已经使用以下配置设置了 Ingress

入口班级

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
  # annotations:
  #   ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: nginx.org/ingress-controller

入口

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hn-service-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: hostnameservice.classpath.com
    http:
      paths:
      - path: /test
        backend:
          serviceName: hostname-service
          servicePort: 80

以下是运行

describe
命令时的错误。我越来越
All hosts are taken by other resources

kubectl describe ingress hn-service-ingress
Name:             hn-service-ingress
Namespace:        pradeep
Address:
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host                           Path  Backends
  ----                           ----  --------
  hostnameservice.classpath.com
                                 /test    hostname-service:80 (100.96.1.12:8111,100.96.1.13:8111,100.96.2.13:8111)
Annotations:                     <none>
Events:
  Type     Reason    Age   From                      Message
  ----     ------    ----  ----                      -------
  Warning  Rejected  5s    nginx-ingress-controller  All hosts are taken by other resources

当我检查

cafe
示例时,它工作正常。我哪里错了?

注意:我已配置 AWS 负载均衡器,并使用 dnslookup 将

/etc/hosts
设置为指向 AWS 中的
ELB

kubernetes-ingress nginx-ingress
2个回答
5
投票

请记住,

Nginx
有 3 种类型。
Open Source Nginx Ingress Controller
Nginx Incorporaton
(nginx 公司)和
Nginx Incorporaton Plus

正如我在评论中提到的,问题是由使用相同

host
的资源引起的。这称为主机冲突

当多个资源配置同一主机时,会发生主机冲突。

Ingress Controller
支持两种处理主机冲突的选项:

  • 选择获胜者

如果多个资源争夺同一主机,Ingress Controller 将根据资源的创建时间戳来选择获胜者:最旧的资源将获胜。如果有多个最旧的资源(它们的创建时间戳相同),Ingress Controller 将选择字典顺序最小的 uid 的资源。

  • 合并同一主机的配置

可以合并同一主机的多个 Ingress 资源的配置。这种方法的一个常见用例是跨多个命名空间分配资源。

OP 确认,这个问题已通过对另一个

Ingress
中的另一个
namespace
资源进行更改来解决。

我能够解决这个问题。另一个命名空间中又多了一个 Ingress


0
投票

我意识到这有点旧了,所以希望OP能够找到解决方案!我发布这个答案是因为我相信导致这种情况的最常见方法之一是当您使用证书管理器时。我确信很多人都遇到过这个错误,您可以很好地创建非 SSL 入口资源,但是一旦您使用 cert-manager 入口垫片创建基于 TLS 的入口资源,就会遇到此错误!

这是证书管理器将在尝试 HTTP 质询时为您创建额外的入口资源。这样做是因为证书颁发机构必须有一种方法来访问 cert-manager 创建的文件来验证您是否拥有该域,但 SSL 尚未工作,因此它会在您的默认端口上创建一个入口。

这是我遇到完全相同的事情的一个例子:

NAME                        CLASS   HOSTS            ADDRESS   PORTS     AGE
cm-acme-http-solver-6m9qm   nginx   isaacgentz.com             80        2s
isaac-site-ssl              nginx   isaacgentz.com             80, 443   4s

您可以看到主机是相同的,这就是 nginx-ingress 所抱怨的。

解决办法是什么

确保您的入口资源上有以下注释:

acme.cert-manager.io/http01-edit-in-place: "true"

这将防止证书管理器创建冲突的第二个入口资源!

© www.soinside.com 2019 - 2024. All rights reserved.