Kubernetes Ingress 不转发路由

Kubernetes Ingress not forwarding routes

我是 Kubernetes 的新手,刚刚将我的第一个集群部署到 IBM Cloud。当我创建集群时,我得到了一个专用的入口子域,我将在 post 的范围内将其称为 <long-k8subdomain>.cloud。现在,这个子域适用于我的应用程序。例如:<long-k8subdomain>.cloud/ping 从我的 browser/curl 工作得很好——我得到了预期的 JSON 响应。但是,如果我将此子域添加到域提供商的 DNS 设置中的 CNAME 记录(我使用了 BluehostIBM 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/ 以正确路由。我也阅读了一些关于默认后端的内容,但我还没有深入了解它。任何帮助将不胜感激,因为我花了多个小时试图解决这个问题。

我使用的一些来源:

注意:我有第二个注释的原因是因为某些原因,没有 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

你不需要第二个注释就可以工作。

如果您希望两个主机都工作,那么您可以添加第二条规则而不是替换现有规则中的主机。