配置K8s Nginx入口以将流量路由到两个单独的Angular SPA站点

时间:2019-08-19 10:06:02

标签: angular nginx kubernetes kubernetes-ingress azure-aks

我的AKS群集中有两个SPA dotnetcore / Angular站点正在运行,并且正在尝试配置入口服务以将流量路由到每个站点。当前,这两个应用程序都位于单独的群集IP服务之后,并且肯定正在运行。我还测试了它们在Docker容器中运行的情况,并且知道在配置的端口上均可访问它们。如果我将其中一个应用程序配置为可通过根子路径/?(.*)进行路由,则站点将正确加载。

但是,通过任何其他子路径/another/?(.*)路由的另一个应用程序无法加载任何静态(JS,CSS等)文件-请求似乎返回index.html。

来自ingress-controller.yaml

...
 annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
    - http:
        paths:
          - path: /?(.*)
            backend:
              serviceName: cluster-ip-app-1
              servicePort: 5001
          - path: /app2/?(.*)
            backend:
              serviceName: cluster-ip-app-2
              servicePort: 5003

Cluster-ip-app-1被配置为像基础应用程序一样侦听端口5001。对于app-2(在端口5003上)也可以这么说。

我也尝试过添加各种服务器代码片段/配置代码片段(例如不必同时),但无济于事。

nginx.ingress.kubernetes.io/server-snippet (or configuration-snippet): |
      root   /path/to/dist;
      index  index.html index.htm;
      location / {
        if (!-e $request_filename){
            rewrite ^(.*)$ /index.html break;
        }
      }
      location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
          expires max;
          log_not_found off;
      }
      try_files $uri $uri/ /index.html?$args =404;
      try_files $uri /index.html =404;
      include  /etc/nginx/mime.types;
      rewrite /path/to/dist/([^.]+)$ /app/ClientApp/dist break;  
      rewrite /app2/?(.*) / break;

在上述配置中,通过https访问PIP时,app-1会正确加载。但是,当尝试访问https:/// app2 /时,某些静态文件请求失败,而其他静态文件请求似乎正在返回索引页,而不是文件本身。

static resources index returning instead of resource

如果这是解决此问题的唯一方法,应该有可能为PIP设置一些别名记录。

最近,有没有针对新手的良好Nginx配置教程(如果它更适合于nginx入口,则是额外的奖励)? ?

感谢您对高级的帮助!

1 个答案:

答案 0 :(得分:1)

您应该做的是,首先在注释中添加一行:

nginx.ingress.kubernetes.io/use-regex: "true"

尝试将位置规则更改为:- path: /app2(/|$)(.*),并将重写注释更改为:nginx.ingress.kubernetes.io/rewrite-target: /$2。它将类似于以下内容:

...
 annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - http:
        paths:
          - path: /?(.*)
            backend:
              serviceName: cluster-ip-app-1
              servicePort: 5001
          - path: /app2(/|$)(.*)
            backend:
              serviceName: cluster-ip-app-2
              servicePort: 5003

您要根据请求URL进入app1或app2。另外,请查找有关映射each path to different services的文档。

如果您仍在寻找有趣的Nginx Ingress配置教程,我将为您推荐这两个:

希望对您有帮助。