ASP.Net Core 2.2 Kubernetes Ingress: не найдено статическое содержимое для настраиваемого пути

У меня ingress.yml:

apiVersion: extensions/v1beta1
kind: Ingress 
metadata:
  name: ingress 
  namespace: default 
  annotations:
    kubernetes.io/ingress.class: "nginx" 
    nginx.ingress.kubernetes.io/ssl-redirect: "false" 
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  labels: 
    app: ingress 
spec:
  rules:  
    - host: 
      http:   
        paths:
          - path: /apistarter(/|$)(.*)
            backend:
              serviceName: svc-aspnetapistarter
              servicePort: 5000
          - path: //apistarter(/|$)(.*)
            backend:
              serviceName: svc-aspnetapistarter
              servicePort: 5000

После развертывания моего приложения API ASP.Net Core 2.2 и перехода к http://localhost/apistarter/ консоль отладчика браузера показывает ошибки при загрузке статического содержимого и сценариев Javascripts. Кроме того, переход к http://localhost/apistarter/swagger/index.html приводит к

Fetch error Not Found /swagger/v2/swagger.json

Я использую ТО ЖЕ входящий для нескольких микросервисов, используя разные префиксы пути. Он работает в моем локальном кластере Kubernetes с использованием microk8s. Еще нет ни в одном облачном провайдере. Я проверил Как настроить мультисервисное приложение ASP.NET Core и входящие маршруты Azure AKS, чтобы оно не нарушало ресурсы в папке wwwroot и https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1, но ничего из этого не помогает.


person Kok How Teh    schedule 17.06.2019    source источник


Ответы (1)


Выполните следующие действия, чтобы запустить свой код:

  1. ingress: удалите перезапись URL из ingress.yml
apiVersion: extensions/v1beta1
kind: Ingress 
metadata:
  name: ingress 
  namespace: default 
  annotations:
    kubernetes.io/ingress.class: "nginx" 
    nginx.ingress.kubernetes.io/ssl-redirect: "false" 
  labels: 
    app: ingress 
spec:
  rules:  
    - host: 
      http:   
        paths:
          - path: /apistarter # <---
            backend:
              serviceName: svc-aspnetapistarter
              servicePort: 5000
  1. развертывание: передайте переменную среды с базой пути в ingress.yml
apiVersion: apps/v1
kind: Deployment
# ..
spec:
  # ..
  template:
    # ..
    spec:
      # ..
      containers:
        - name: test01
          image: test.io/test:dev
          # ...
          env:
            # define custom Path Base (it should be the same as 'path' in Ingress-service)
            - name: API_PATH_BASE # <---
              value: "apistarter"
  1. программа: разрешите загрузку параметров среды в Program.cs
var builder = new WebHostBuilder()
    .UseContentRoot(Directory.GetCurrentDirectory())
    // ..
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        // ..  
        config.AddEnvironmentVariables(); // <---
        // ..
    })
    // ..
  1. запуск: примените UsePathBaseMiddleware в Startup.cs
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    private readonly IConfiguration _configuration;

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var pathBase = _configuration["API_PATH_BASE"]; // <---

        if (!string.IsNullOrWhiteSpace(pathBase))
        {
            app.UsePathBase($"/{pathBase.TrimStart('/')}");
        }

        app.UseStaticFiles(); // <-- StaticFilesMiddleware must follow UsePathBaseMiddleware

        // ..

        app.UseMvc();
    }

    // ..
}
person vladimir    schedule 26.07.2019
comment
Спасибо за отличные пошаговые инструкции, это решило мою проблему! - person toralux; 15.01.2020
comment
Я боролся с этим и в предыдущем проекте, и там не было подходящего решения. Я не хотел, чтобы в моем новом проекте были такие же проблемы. Это именно то, что мне нужно. Спасибо! - person Thomas Luijken; 22.07.2020
comment
@ThomasLuijken, без проблем, я рад вам помочь. - person vladimir; 22.07.2020