Сбой шлюза готовности GKE NEG из-за контейнеров Windows и проверки готовности

У меня проблема:

Получение проверки работоспособности для успешного выполнения .Net-приложения, запущенного в контейнере IIS, при попытке использовать собственную балансировку нагрузки контейнера (CNLB).

У меня есть группа конечных точек сети (NEG), созданная определением ресурса Ingress в GKE с собственным кластером VPC.

Когда я обхожу CNLB, либо открывая NodePort, либо создавая службу типа LoadBalancer, сайт разрешается без проблем.

Все условия пакета из описания выглядят хорошо: готовность модуля

Конечные точки сети отображаются при запуске describe endpoints: готовых адресов

Это проверка работоспособности, которая создается балансировщиком нагрузки: Проверка работоспособности GCP

При обращении к этим конечным точкам из других контейнеров или виртуальных машин в том же VPC, /health.htm отвечает 200. Здесь из контейнера в том же пространстве имен, хотя я воспроизвел это с помощью виртуальной машины Linux, не в кластере, а в том же VPC: конечная точка отвечает

Но, несмотря на все это, проверка работоспособности сообщает о том, что модули в моем NEG неработоспособны: Нездоровые конечные точки < / а>

Журналы stackdriver подтверждают, что время ожидания запросов истекло, но я не уверен, почему, когда конечные точки отвечают другим экземплярам, ​​но не LB: Журнал проверки работоспособности Stackdriver

И я подтвердил, что GKE создал то, что выглядит как правильное правило брандмауэра, которое должно разрешать трафик от LB к модулям: брандмауэр

Вот YAML, с которым я работаю:

Развертывание:

apiVersion: apps/v1                                                  
kind: Deployment                                                     
metadata:                                                            
  labels:                                                            
    app: subdomain.domain.tld                                       
  name: subdomain-domain-tld                                       
  namespace: subdomain-domain-tld
spec:                                                                
  replicas: 3                                                        
  selector:                                                          
    matchLabels:                                                     
      app: subdomain.domain.tld                                     
  template:                                                          
    metadata:                                                        
      labels:                                                        
        app: subdomain.domain.tld
    spec:                                                            
      containers:                                                    
      - image: gcr.io/ourrepo/ourimage
        name: subdomain-domain-tld
        ports:                                                       
        - containerPort: 80                                          
        readinessProbe:                                              
          httpGet:                                                   
            path: /health.htm                                        
            port: 80                                                 
          initialDelaySeconds: 60                                    
          periodSeconds: 60                                          
          timeoutSeconds: 10                                         
        volumeMounts:                                                
        - mountPath: C:\some-secrets                                      
          name: some-secrets
      nodeSelector:                                                  
        kubernetes.io/os: windows                                    
      volumes:                                                       
      - name: some-secrets                                    
        secret:                                                      
          secretName: some-secrets

Услуга:

apiVersion: v1                                                       
kind: Service                                                        
metadata:                                                            
  labels:                                                            
    app: subdomain.domain.tld                                     
  name: subdomain-domain-tld-service
  namespace: subdomain-domain-tld
spec:                                                                
  ports:                                                             
  - port: 80                                                         
    targetPort: 80                                                   
  selector:                                                          
    app: subdomain.domain.tld                                       
  type: NodePort                 

Ingress чрезвычайно прост, поскольку у нас нет реальной необходимости в нескольких маршрутах на этом сайте, однако я подозреваю, что любые проблемы, которые у нас возникают, здесь.

apiVersion: extensions/v1beta1                                       
kind: Ingress                                                        
metadata:                                                            
  annotations:                                                       
    kubernetes.io/ingress.class: gce
  labels:                                                            
    app: subdomain.domain.tld                                       
  name: subdomain-domain-tld-ingress
  namespace: subdomain-domain-tld
spec:                                                                
  backend:                                                           
    serviceName: subdomain-domain-tld-service
    servicePort: 80

Последняя важная деталь: я попробовал шаги, представленные в этой документации, и они сработали, но они не идентичны моей ситуации, поскольку не используются ни контейнеры Windows, ни тесты готовности: https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#using-pod-readiness-feedback.

Любые предложения будут ценны. Я два дня зацикливался на этом, и я уверен, что это очевидно, но я просто не вижу проблемы.


person 210rain    schedule 14.07.2020    source источник
comment
можно ли перейти на контейнер linux? Если да, мы можем предложить вам решение   -  person Abdennour TOUMI    schedule 15.07.2020
comment
Вы разрешаете вход / выход везде? Все брандмауэры и сетевые политики Kubernetes? Также разрешено использование как в кластере, так и в / из балансировщика нагрузки?   -  person Rico    schedule 15.07.2020
comment
К сожалению, я не могу переключиться на контейнер linux, так как приложение, которое мы запускаем, - это asp.net, а не ядро ​​.net, и мы не можем перенести его на ядро ​​.net @AbdennourTOUMI   -  person 210rain    schedule 15.07.2020
comment
@Rico Да, кластер, в котором он находится, используется исключительно для изучения возможности запуска наших сайтов asp.net в GKE, поэтому я не настраивал никаких сетевых политик. Я разрешил весь трафик на всех портах для любого экземпляра в моем VPC из 35.191.0.0/16 и 130.211.0.0/22, которые являются диапазонами IP-адресов, из которых балансировщики нагрузки Google отправляют трафик, согласно документации на этой странице: cloud.google.com/load-balancing/docs/health-checks Я также могу подтвердить нет других правил брандмауэра, которые принимали бы приоритет и запрещали трафик.   -  person 210rain    schedule 15.07.2020
comment
Где-то должно быть какое-то правило брандмауэра. Вы всегда можете уточнить у поддержки GKE.   -  person Rico    schedule 15.07.2020


Ответы (2)


Очевидно, это не задокументировано, но эта функция не работает с контейнерами Windows на момент написания. Мне удалось связаться с инженером GCP, и они предоставили следующее:

После дальнейшего исследования я обнаружил, что контейнеры Windows, использующие службу LoadBalancer, работают, но контейнеры Windows, использующие Ingress с NEGS, являются ограничением, поэтому я открыл внутреннее дело для обновления общедоступной документации [1].

Поскольку Ingress + NEG не будет работать (в соответствии с ограничением), я предлагаю вам использовать любой из упомянутых вами вариантов либо для раскрытия NodePort, либо для создания службы типа LoadBalancer.

person 210rain    schedule 28.07.2020

Когда вы создаете Ingress, сгенерированные зонды HC по умолчанию будут выполнять HealthCheck на том же порте обслуживания и пути, что и приложение. в этом случае порт 80 на пути /

Похоже, ваше приложение сообщает, что проверка работоспособности выполняется через порт 80, но по пути /health.htm.

Вам нужно будет добавить настраиваемую проверку работоспособности через BackendConfig CRD. Взгляните на эту ссылку [1]. Вы можете найти на той же странице, как связать BackendConfig с Ingress.

На какой версии GKE вы работаете? Судя по используемому вами Ingress API, похоже на старую версию.

[1] https://cloud.google.com/kubernetes-engine/docs/how-to/ingress-features#direct_health

person boredabdel    schedule 15.06.2021