带有 Nginx 的 AKS 无法通过 IP 访问,只能通过 DNS 访问

AKS with Nginx not available over IP, only DNS

我正在尝试使用静态 IP 在 AKS 上制作 Web 应用程序,自然而然地找到了一个 Nginx ingress controller in Azure's documentation.

的解决方案

除了带有 dns-label 的部分外,效果很好。我的应用程序仅在 <dns-label>.<region>.cloudapp.azure.com 上可见,这当然有点烦人(无法将我的虚拟主机 DNS 路由到 url)。无论如何,它在我分配给集群的静态 IP 上不可用,我觉得这很奇怪。当我 ping IP 时,它会导致来自 Nginx 的 404。我尝试更改 Ingress 主机,但没有成功。

当我kubectl describe ingress basic-ingress时,一切看起来都很好:

Name:             basic-ingress
Namespace:        default
Address:          XXXXXXXXXX
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
  tls-secret terminates XXXXXXXXXXXXX.XXXXX.cloudapp.azure.com
Rules:
  Host                                    Path  Backends
  ----                                    ----  --------
  platform-dns.eastus.cloudapp.azure.com
                                          /*       smp-frontend:80 (XXXXXXXXX, XXXXXXXX, XXXXXXXXXX)
                                          /api/*   smp-backend:8080 (XXXXXXX, XXXXXXXXX, XXXXXXXX)
Annotations:                              cert-manager.io/cluster-issuer: XXXXXXXXXX
                                          kubernetes.io/ingress.allow-http: true
                                          kubernetes.io/ingress.class: nginx
                                          nginx.ingress.kubernetes.io/rewrite-target: /
Events:
  Type    Reason             Age                From                      Message
  ----    ------             ----               ----                      -------
  Normal  CreateCertificate  84m                cert-manager              Successfully created Certificate "XXXXXXXX"
  Normal  Sync               71m (x4 over 84m)  nginx-ingress-controller  Scheduled for sync
  Normal  Sync               71m (x4 over 84m)  nginx-ingress-controller  Scheduled for sync

入口路由基于主机名的流量(请求中的主机 header;第 7 层)。要仅使用 IP 地址路由流量,您必须将 Ingress 清单配置为侦听通配符。您可以通过删除 HTTP 规则中的“主机”字段来实现:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

如果您只想使用 IP,您还可以考虑从 Ingress 转移到 LoadBalancer service,后者通过 Azure 负载均衡器(第 4 层)直接公开您的工作负载。

关于如何使用静态 IP 的 LoadBalancer 服务的指南可用here