我正在研究新的 Kubernetes 集群设置。此设置将在 25 个不同的 Pod 中托管大约 25 个微服务。这些将通过 25 个不同的 NodePort 服务公开。为了从外部访问它们,我尝试将 nginx 入口与 NLB 集成(注意:所有这些设置都托管在 AWS EKS 中) 现在,微服务使用 swagger,这意味着 URL 中有重定向。
例如:https://example.com/customerservice -> https://example.com/swagger/index.html(客户服务 svc->pod) https://example.com/orderservice -> https://example.com/swagger/index.html(orderservice svc->pod)
其余 23 项服务依此类推
如果我输入如下所示的整个 URL,这些服务适用于信息或健康点:
如果我手动输入整个 URL,上述端点可以正常工作。但是,用户期望仅输入 https://example.com/customerservice,并且应该重定向到相应的 swagger 页面,如下所示 https://example.com/swagger/index.html
下面是我的入口 YAML 文件,它适用于 v3/info 或 healthcheck 等整个 URL,但无法正确执行重定向。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
labels:
app: trial-ingress
name: trial-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- backend:
service:
name: customerservice-svc
port:
number: 80
path: /customerservice(/|$)(.*)
pathType: Prefix
- backend:
service:
name: orderservice-svc
port:
number: 80
path: /orderservice(/|$)(.*)
pathType: Prefix
如果我使用上述入口并尝试加载 https://example.com/customerservice 那么它会将我重定向到 https://example.com/swagger/ 这意味着它正在尝试重定向方向正确,但只接受 一个参数/单词(招摇) 并删除字符串的其余部分,然后给出 404 错误
预期结果:当用户尝试加载https://example.com/customerservice时,它应该重定向到https://example.com/swagger/index.html页面的
customerservice
pod 以及所有其他服务类似
要使用 Swagger 处理托管微服务的 Kubernetes 集群的 nginx 入口中的重定向,您需要设置 入口规则 以将请求正确重定向到相应的 Swagger 文档 URL。
rewrite-target
注释 以重定向到 swagger index.html
。nginx.ingress.kubernetes.io/configuration-snippet
注释 完成,它将自定义配置添加到位置配置块(如此处提到)。
您的 Ingress YAML 将是:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /swagger/index.html
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^(/customerservice)$ $1/ redirect;
rewrite ^(/orderservice)$ $1/ redirect;
# Add similar rewrite rules for other services
labels:
app: trial-ingress
name: trial-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- backend:
service:
name: customerservice-svc
port:
number: 80
path: /customerservice(/|$)(.*)
pathType: Prefix
- backend:
service:
name: orderservice-svc
port:
number: 80
path: /orderservice(/|$)(.*)
pathType: Prefix
# Add paths for other services
你会得到:
┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐
│ │ │ │ │ │
│ User │──────►│ NLB │──────►│ NGINX Ingress │
│ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────────────┘
│
│
▼
┌───────────────────────────────────────────────────────────────────┐
│ Microservices in Pods │
│ │
│ /customerservice ────────────► (Customer Service Pod Swagger) │
│ │
│ /orderservice ────────────► (Order Service Pod Swagger) │
│ │
│ (Other Services) │
└───────────────────────────────────────────────────────────────────┘
(在将其部署到生产环境之前,首先要在临时环境中进行测试!)