MicroK8s Узел-Работник Windows – Ingress возвращает ошибку 504 Gateway Time-out

Вопрос или проблема

Я прошел последовательность учебников, чтобы настроить кластер MicroK8s, состоящий из 1 контроллера на Linux и 1 рабочей ноды на Windows:

Я развернул пример приложения на ноде с Linux, и оно работало очень хорошо, но на ноде с Windows я получаю ответ “504 Gateway Time-out” от nginx. Под также недоступен с его хостинговой ноды.

Вот журналы и ресурсы, которые, как мне кажется, имеют отношение к делу.

Журналы контроллера Nginx Ingress:

2024/09/23 06:56:57 [error] 26#26: *2868 upstream timed out (110: Operation timed out) while connecting to upstream, client: 10.0.19.30, server: diva.impact.dev.groupe.lacour, request: "GET / HTTP/1.1", upstream: "http://10.50.175.86:80/", host: "diva.impact.dev.groupe.lacour"
2024/09/23 06:57:02 [error] 26#26: *2868 upstream timed out (110: Operation timed out) while connecting to upstream, client: 10.0.19.30, server: diva.impact.dev.groupe.lacour, request: "GET / HTTP/1.1", upstream: "http://10.50.175.86:80/", host: "diva.impact.dev.groupe.lacour"
2024/09/23 06:57:07 [error] 26#26: *2868 upstream timed out (110: Operation timed out) while connecting to upstream, client: 10.0.19.30, server: diva.impact.dev.groupe.lacour, request: "GET / HTTP/1.1", upstream: "http://10.50.175.86:80/", host: "diva.impact.dev.groupe.lacour"
10.0.19.30 - - [23/Sep/2024:06:57:07 +0000] "GET / HTTP/1.1" 504 160 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0" 448 15.003 [lacour-development-impact-diva-80] [] 10.50.175.86:80, 10.50.175.86:80, 10.50.175.86:80 0, 0, 0 5.001, 5.001, 5.000 504, 504, 504 d2ea2b5178aa0080a80603235b6ca38c

Ресурс ingerss:

$ kubectl describe ingress impact-diva -n lacour-development
Name:             impact-diva
Labels:           io.portainer.kubernetes.ingress.owner=vguillemette
Namespace:        lacour-development
Address:          127.0.0.1
Ingress Class:    public
Default backend:  <default>
Rules:
  Host                           Path  Backends
  ----                           ----  --------
  diva.impact.dev.groupe.lacour
                                 /   impact-diva:80 (10.50.175.86:80)
Annotations:                     <none>
Events:                          <none>

Ресурс сервиса:

$ kubectl describe service impact-diva -n lacour-development
Name:                     impact-diva
Namespace:                lacour-development
Labels:                   io.portainer.kubernetes.application.name=impact-diva
                          io.portainer.kubernetes.application.owner=vguillemette
                          io.portainer.kubernetes.application.stack=impact
Annotations:              <none>
Selector:                 app=impact-diva
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.152.183.126
IPs:                      10.152.183.126
Port:                     port-0  80/TCP
TargetPort:               80/TCP
Endpoints:                10.50.175.86:80
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>

Ресурс деплоя:

$ kubectl describe deployment impact-diva -n lacour-development
Name:                   impact-diva
Namespace:              lacour-development
CreationTimestamp:      Fri, 20 Sep 2024 10:07:58 +0200
Labels:                 io.portainer.kubernetes.application.name=impact-diva
                        io.portainer.kubernetes.application.owner=vguillemette
                        io.portainer.kubernetes.application.stack=impact
Annotations:            deployment.kubernetes.io/revision: 2
                        io.portainer.kubernetes.application.note:
Selector:               app=impact-diva
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  100% max unavailable, 0 max surge
Pod Template:
  Labels:  app=impact-diva
           io.portainer.kubernetes.application.name=impact-diva
  Containers:
   impact-diva:
    Image:      docker-registry.groupe.lacour/common/impact.diva:development
    Port:       <none>
    Host Port:  <none>
    Limits:
      cpu:     300m
      memory:  256M
    Requests:
      cpu:     300m
      memory:  256M
    Environment:
      ASPNETCORE_ENVIRONMENT:                                  <set to the key 'ASPNETCORE_ENVIRONMENT' of config map 'global'>                                  Optional: false
      Databases__Application__MySqlMonSvcs__0__SlaveAffinity:  <set to the key 'Databases__Application__MySqlMonSvcs__0__SlaveAffinity' of config map 'global'>  Optional: false
      Databases__Application__MySqlMonSvcs__0__Url:            <set to the key 'Databases__Application__MySqlMonSvcs__0__Url' of config map 'global'>            Optional: false
      Databases__Application__MySqlMonSvcs__1__SlaveAffinity:  <set to the key 'Databases__Application__MySqlMonSvcs__1__SlaveAffinity' of config map 'global'>  Optional: false
      Databases__Application__MySqlMonSvcs__1__Url:            <set to the key 'Databases__Application__MySqlMonSvcs__1__Url' of config map 'global'>            Optional: false
      Databases__Attachment__MySqlMonSvcs__0__SlaveAffinity:   <set to the key 'Databases__Attachment__MySqlMonSvcs__0__SlaveAffinity' of config map 'global'>   Optional: false
      Databases__Attachment__MySqlMonSvcs__0__Url:             <set to the key 'Databases__Attachment__MySqlMonSvcs__0__Url' of config map 'global'>             Optional: false
      Databases__Attachment__MySqlMonSvcs__1__SlaveAffinity:   <set to the key 'Databases__Attachment__MySqlMonSvcs__1__SlaveAffinity' of config map 'global'>   Optional: false
      Databases__Attachment__MySqlMonSvcs__1__Url:             <set to the key 'Databases__Attachment__MySqlMonSvcs__1__Url' of config map 'global'>             Optional: false
    Mounts:                                                    <none>
  Volumes:                                                     <none>
  Node-Selectors:                                              <none>
  Tolerations:                                                 <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  impact-diva-5c94545874 (0/0 replicas created)
NewReplicaSet:   impact-diva-5d5f99bfcd (1/1 replicas created)
Events:          <none>

Ресурс Pod:

$ kubectl describe pod impact-diva-5d5f99bfcd-v449t -n lacour-development
Name:             impact-diva-5d5f99bfcd-v449t
Namespace:        lacour-development
Priority:         0
Service Account:  default
Node:             devsiteswinb1/10.0.1.228
Start Time:       Mon, 23 Sep 2024 08:10:18 +0200
Labels:           app=impact-diva
                  io.portainer.kubernetes.application.name=impact-diva
                  pod-template-hash=5d5f99bfcd
Annotations:      cni.projectcalico.org/containerID: 5d93d376f54ca2edf6d8812857eb5d1210926a9f7283a294865b5f0893b4f98c
                  cni.projectcalico.org/podIP: 10.50.175.86/32
                  cni.projectcalico.org/podIPs: 10.50.175.86/32
Status:           Running
IP:               10.50.175.86
IPs:
  IP:           10.50.175.86
Controlled By:  ReplicaSet/impact-diva-5d5f99bfcd
Containers:
  impact-diva:
    Container ID:   containerd://906d4296acf0b3b8e52073eaedf7a7511e064e3d204f84639b6cc58a4c58cd1d
    Image:          docker-registry.groupe.lacour/common/impact.diva:development
    Image ID:       docker-registry.groupe.lacour/common/impact.diva@sha256:d2db6aba2030f965a03d0f2deadb5a8893ea68a9efb792f7a96270748603d9a8
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Mon, 23 Sep 2024 08:10:23 +0200
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     300m
      memory:  256M
    Requests:
      cpu:     300m
      memory:  256M
    Environment:
      ASPNETCORE_ENVIRONMENT:                                  <set to the key 'ASPNETCORE_ENVIRONMENT' of config map 'global'>                                  Optional: false
      Databases__Application__MySqlMonSvcs__0__SlaveAffinity:  <set to the key 'Databases__Application__MySqlMonSvcs__0__SlaveAffinity' of config map 'global'>  Optional: false
      Databases__Application__MySqlMonSvcs__0__Url:            <set to the key 'Databases__Application__MySqlMonSvcs__0__Url' of config map 'global'>            Optional: false
      Databases__Application__MySqlMonSvcs__1__SlaveAffinity:  <set to the key 'Databases__Application__MySqlMonSvcs__1__SlaveAffinity' of config map 'global'>  Optional: false
      Databases__Application__MySqlMonSvcs__1__Url:            <set to the key 'Databases__Application__MySqlMonSvcs__1__Url' of config map 'global'>            Optional: false
      Databases__Attachment__MySqlMonSvcs__0__SlaveAffinity:   <set to the key 'Databases__Attachment__MySqlMonSvcs__0__SlaveAffinity' of config map 'global'>   Optional: false
      Databases__Attachment__MySqlMonSvcs__0__Url:             <set to the key 'Databases__Attachment__MySqlMonSvcs__0__Url' of config map 'global'>             Optional: false
      Databases__Attachment__MySqlMonSvcs__1__SlaveAffinity:   <set to the key 'Databases__Attachment__MySqlMonSvcs__1__SlaveAffinity' of config map 'global'>   Optional: false
      Databases__Attachment__MySqlMonSvcs__1__Url:             <set to the key 'Databases__Attachment__MySqlMonSvcs__1__Url' of config map 'global'>             Optional: false
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-q982v (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       True
  ContainersReady             True
  PodScheduled                True
Volumes:
  kube-api-access-q982v:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   Guaranteed
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:                      <none>

Проверка консоли в Pod (ожидается отказ в доступе):

C:\>curl http://localhost -v
*   Trying [::1]:80...
* Connected to localhost (::1) port 80
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/8.4.0
> Accept: */*
> 
< HTTP/1.1 401 Access Denied
< Server: Microsoft-IIS/10.0
< WWW-Authenticate: Basic Realm="Authentification LACOUR Concept"
< X-Powered-By: ASP.NET
< Date: Mon, 23 Sep 2024 07:03:02 GMT
< Content-Length: 17
< 
403 Access Denied* Connection #0 to host localhost left intact

Не могли бы вы помочь мне устранить эту ошибку?

Ответ или решение

Ваша проблема с ошибкой "504 Gateway Time-out" на Windows Worker Node в кластере MicroK8s может быть обусловлена несколькими факторами. Давайте рассмотрим возможности её устранения.

1. Проверка конфигурации Ingress

Ошибка 504 подразумевает, что Nginx Ingress Controller не может подключиться к бэкенду. В данном случае это может быть связано с неправильной конфигурацией вашего Ingress.

Проверьте следующие моменты:

  • Убедитесь, что ваш Ingress настроен на правильный сервис и порт. Судя по вашему описанию, вы имеете:
    diva.impact.dev.groupe.lacour
                           /   impact-diva:80 (10.50.175.86:80)

    Это указывает на то, что Ingress ожидает подключения к сервису impact-diva на порту 80. Убедитесь, что ваш сервис работает на этом порту и доступен.

2. Проверка состояния Pod

Вы упомянули, что Pod запущен и имеет статус "Running", вот основные моменты, на которые стоит обратить внимание:

  • Попробуйте выполнить проверку состояния вашего Pod напрямую через команду kubectl exec. Например:
    kubectl exec -it impact-diva-5d5f99bfcd-v449t -n lacour-development -- curl http://localhost

    Если вы получаете 403 (доступ запрещен), это указывает на проблему с настройкой вашего приложения или его авторизацией.

3. Проблемы с сетевым подключением

Ваш Pod имеет IP-адрес 10.50.175.86. Убедитесь, что у вас настроен сетевой плагин, который поддерживает работу между подами, особенно в Mixed-OS (Linux и Windows) окружениях. Если вы используете Calico, убедитесь, что он правильно настроен и имеет соединение.

  • Проверьте сетевую связь между Nginx Ingress Controller (который, как правило, работает на Linux Node) и вашим Windows Pod. Например:
    kubectl run net-tool --rm -it --image=busybox --restart=Never -- /bin/sh

    Затем внутри этого Pod выполните nslookup или ping к IP-адресу вашего Pod или к DNS-имени сервиса.

4. Логи и мониторинг

Посмотрите логи вашего приложения внутри Pod. Для этого выполните следующую команду:

kubectl logs impact-diva-5d5f99bfcd-v449t -n lacour-development

Это может дать подсказки о том, почему ваше приложение не отвечает.

5. Проверка настроек брандмауэра

Если ваш Windows Worker Node защищен брандмауэром, удостоверьтесь, что он не блокирует трафик со стороны Nginx Ingress Controller или других компонентов кластера. Вы можете временно отключить брандмауэр для тестирования или добавить правила, разрешающие необходимый трафик.

6. Настройки ingress-nginx

Убедитесь, что конфигурация Nginx Ingress подходит для обработки соединений между Linux Control Plane и Windows Worker Node. Можно изменить тайм-ауты или настройки проксирования в конфигурации Nginx, если нужно больше времени для обработки запросов.

Заключение

Попробуйте пройтись по вышеуказанным пунктам. В большинстве случаев проблемы с 504 Gateway Time-out возникают из-за неправильной настройки сетевой маршрутизации, конфигурации Ingress или проблем с самим приложением. Если дальнейшие сложности сохраняются, старайтесь собрать более детальную информацию о ситуации и соответствующих логах, чтобы можно было углубиться в исследование проблемы.

Оцените материал
Добавить комментарий

Капча загружается...