Почему моя служба Kubernetes иногда работает только на EKS?

В некоторых случаях у нас есть Услуги, которые не получают ответа при попытке доступа к ним. Например, Chrome показывает ERR_EMPTY_RESPONSE, и иногда мы получаем и другие ошибки, например 408, которые, я уверен, возвращаются из ELB, а не из самого нашего приложения.

После продолжительного исследования, включая ssh'ing в самих узлах, эксперименты с балансировщиками нагрузки и многое другое, мы все еще не уверены, на каком уровне проблема существует: либо в самом Kubernetes, либо в сервисах поддержки от Amazon EKS (ELB или иначе)

  • Кажется, что только порт экземпляра (данных) узла является тем, который имеет проблему. Проблемы, кажется, приходят и уходят периодически, что заставляет нас верить, что это не что-то очевидное в наших манифестах или конфигурациях докеров kubernetes, а скорее что-то другое в базовой инфраструктуре. Иногда служба и пакет будут работать, но возвращайтесь и утром это будет сломано. Это наводит нас на мысль, что проблема связана с перераспределением пакетов в kubernetes, возможно, вызванным чем-то в AWS (изменение балансировщика нагрузки, автоматическое изменение групповых изменений и т. Д.) Или чем-то в самом kubernetes, когда он перераспределяет пакеты по другим причинам.
  • Во всех случаях, которые мы видели, порт проверки работоспособности продолжает работать без проблем, поэтому kubernetes и aws считают, что все в порядке и не сообщают о каких-либо сбоях.
  • Мы видели, что некоторые модули работали на узле, в то время как другие не работали на этом же узле.
  • Мы убедились, что kube-proxy работает, и что вывод iptables-save является "одинаковым" между двумя работающими модулями. (то же самое означает, что все, что не является уникальным, например, IP-адреса и порты, одинаково и соответствует тому, что они должны быть относительно друг друга). (мы использовали эти инструкции, чтобы помочь с этими инструкциями: https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/
  • Из ssh на самом узле, для модуля, который выходит из строя, мы МОЖЕМ получить доступ к модулю (то есть к самому приложению) через все возможные ip/ порты, которые ожидаются.
    • 10. адрес самого узла на порте данных экземпляра.
    • 10. адрес модуля (контейнера Docker) на порте приложения.
    • 172. адрес??? на порте приложения (мы не уверены, что это за ip или как до него доходит маршрут ip, так как это другая подсеть, чем адрес 172 интерфейса docker0).
  • Из ssh на другом узле для сбойного модуля мы не можем получить доступ к сбойному модулю ни на каких портах (ERR_EMPTY_RESPONSE). Похоже, это то же самое поведение, что и балансировка обслуживания / нагрузки.

Что еще может вызвать такое поведение?

1 ответ

После долгих расследований мы столкнулись с рядом проблем: * Наше приложение не всегда ведет себя так, как мы ожидали. Всегда проверяйте это сначала. * В нашем манифесте Kubernetes Service мы указали externalTrafficPolicy: Local, что, вероятно, должно работать, но вызывало у нас проблемы. (Это было с использованием Classic Load Balancer) service.beta.kubernetes.io/aws-load-balancer-type: "clb", Так что, если у вас есть проблемы с CLB, либо удалите externalTrafficPolicy или явно установите его в значение по умолчанию "Cluster".

Итак, наш манифест сейчас: kind: Service apiVersion: v1 metadata: name: apollo-service annotations: service.beta.kubernetes.io/aws-load-balancer-type: "clb" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:REDACTED" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
spec: externalTrafficPolicy: Cluster selector: app: apollo ports: - name: http protocol: TCP port: 80 targetPort: 80 - name: https protocol: TCP port: 443 targetPort: 80 type: LoadBalancer

Добавление

service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"

Исправлено для меня

Другие вопросы по тегам