我已经按照文档中提到的方式设置了 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
。
请记住,
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
我意识到这有点旧了,所以希望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"
这将防止证书管理器创建冲突的第二个入口资源!