Kubernetes Ingress 不转发路由
Kubernetes Ingress not forwarding routes
我是 Kubernetes
的新手,刚刚将我的第一个集群部署到 IBM Cloud
。当我创建集群时,我得到了一个专用的入口子域,我将在 post 的范围内将其称为 <long-k8subdomain>.cloud
。现在,这个子域适用于我的应用程序。例如:<long-k8subdomain>.cloud/ping
从我的 browser/curl 工作得很好——我得到了预期的 JSON 响应。但是,如果我将此子域添加到域提供商的 DNS 设置中的 CNAME 记录(我使用了 Bluehost
和 IBM Cloud's Internet Services
),我会从所有路由收到 404
响应。然而,此响应是默认的 nginx
404 响应(它在“404 Not Found”下显示“nginx”)。我相信这意味着这意味着正在到达入口负载平衡器,但请求没有正确路由。我正在使用 Kubernetes version 1.20.12_1561 on VPC gen 2
,这是我的 ingress-config.yaml 文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress-resource
annotations:
kubernetes.io/ingress.class: "public-iks-k8s-nginx"
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Host: <long-k8subdomain>.cloud";
spec:
rules:
- host: <long-k8subdomain>.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service-name
port:
number: 80
我很确定这个问题是由于注释引起的。也许我用错了或者我没有足够的。理想情况下,我想要这样的东西: api..com/ 以正确路由。我也阅读了一些关于默认后端的内容,但我还没有深入了解它。任何帮助将不胜感激,因为我花了多个小时试图解决这个问题。
我使用的一些来源:
- https://cloud.ibm.com/docs/containers?topic=containers-cs_network_planning
- https://cloud.ibm.com/docs/containers?topic=containers-ingress-types
- https://cloud.ibm.com/docs/containers?topic=containers-comm-ingress-annotations#annotations
注意:我有第二个注释的原因是因为某些原因,没有 header 的请求没有被直接路由。所以那是我调试过程的一部分,我最终离开了它,因为我不确定该注释是否解决了这个问题,所以我暂时离开了它。
为了让 NGINX 入口控制器将对您自己域的 CNAME 记录的请求路由到服务而不是 IBM Cloud 服务,您需要在入口中有一个规则,其中 host
标识您的域。
例如,如果您域的 DNS 条目是 api.example.com
,则将资源 YAML 更改为:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress-resource
annotations:
kubernetes.io/ingress.class: "public-iks-k8s-nginx"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service-name
port:
number: 80
你不需要第二个注释就可以工作。
如果您希望两个主机都工作,那么您可以添加第二条规则而不是替换现有规则中的主机。
我是 Kubernetes
的新手,刚刚将我的第一个集群部署到 IBM Cloud
。当我创建集群时,我得到了一个专用的入口子域,我将在 post 的范围内将其称为 <long-k8subdomain>.cloud
。现在,这个子域适用于我的应用程序。例如:<long-k8subdomain>.cloud/ping
从我的 browser/curl 工作得很好——我得到了预期的 JSON 响应。但是,如果我将此子域添加到域提供商的 DNS 设置中的 CNAME 记录(我使用了 Bluehost
和 IBM Cloud's Internet Services
),我会从所有路由收到 404
响应。然而,此响应是默认的 nginx
404 响应(它在“404 Not Found”下显示“nginx”)。我相信这意味着这意味着正在到达入口负载平衡器,但请求没有正确路由。我正在使用 Kubernetes version 1.20.12_1561 on VPC gen 2
,这是我的 ingress-config.yaml 文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress-resource
annotations:
kubernetes.io/ingress.class: "public-iks-k8s-nginx"
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Host: <long-k8subdomain>.cloud";
spec:
rules:
- host: <long-k8subdomain>.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service-name
port:
number: 80
我很确定这个问题是由于注释引起的。也许我用错了或者我没有足够的。理想情况下,我想要这样的东西: api..com/ 以正确路由。我也阅读了一些关于默认后端的内容,但我还没有深入了解它。任何帮助将不胜感激,因为我花了多个小时试图解决这个问题。
我使用的一些来源:
- https://cloud.ibm.com/docs/containers?topic=containers-cs_network_planning
- https://cloud.ibm.com/docs/containers?topic=containers-ingress-types
- https://cloud.ibm.com/docs/containers?topic=containers-comm-ingress-annotations#annotations
注意:我有第二个注释的原因是因为某些原因,没有 header 的请求没有被直接路由。所以那是我调试过程的一部分,我最终离开了它,因为我不确定该注释是否解决了这个问题,所以我暂时离开了它。
为了让 NGINX 入口控制器将对您自己域的 CNAME 记录的请求路由到服务而不是 IBM Cloud 服务,您需要在入口中有一个规则,其中 host
标识您的域。
例如,如果您域的 DNS 条目是 api.example.com
,则将资源 YAML 更改为:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress-resource
annotations:
kubernetes.io/ingress.class: "public-iks-k8s-nginx"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service-name
port:
number: 80
你不需要第二个注释就可以工作。
如果您希望两个主机都工作,那么您可以添加第二条规则而不是替换现有规则中的主机。