带有 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。
我正在尝试使用静态 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。