Проблема с использованием traefik в качестве балансировщика нагрузки в Kubernetes - PullRequest
0 голосов
/ 17 апреля 2020

Ситуация такова, что у меня есть две службы k8s, которые связаны между собой. Оба являются flask серверами. Связь между ними следующая: если кто-то делает POST с первым, он получает текстовый ввод и передает его на второй сервер, который добавляет еще текст к исходному тексту, опубликованному пользователем, и, наконец, два текста вместе возвращаются на первый сервер, и он возвращает окончательный текст пользователю.

Чтобы разрешить эту связь между моими службами k8s (называемыми master и slave, которые matchlabels app-master и app-slave), у меня есть следующая networkPolicy:

kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
  name: master-to-slave
  namespace: innovation
spec:
  podSelector:
    matchLabels:
      app: app-slave
  ingress:
    - ports:
      - port: 5000
        protocol: TCP
      - port: 5001
        protocol: TCP
    - from:
      - namespaceSelector:
          matchLabels:
            app: app-master

Чтобы сделать завиток из за пределами арендатора я должен использовать traefik, потому что я работаю в арендаторе, у которого уже есть traefik как NodePort, поэтому я НЕ могу выставить свой основной сервис как nodePort или преобразовать его в вид LoadBalancer. Вход у меня для этого приложения следующий

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: ingress-innovation
  namespace: innovation
  annotations:
    traefik.frontend.rule.type: PathPrefixStrip
spec:  
  rules:
  - http:
      paths:
      - path: /master
        backend:
          serviceName: master
          servicePort: 5000
      - path: /slave
        backend:
          serviceName: slave
          servicePort: 5001

У меня также есть DNS, который позволяет мне делать запрос к адресу (https://name_in_the_DNS) вместо выполнения запросов к IP моего арендатора. Проблема в том, что когда я пытаюсь сделать следующий запрос:

curl https://name_in_the_DNS/master -X POST -d texto

выдает мне ошибку (Gateway Timeout). Хотя, если я использую «kubectl port-forward», приложение работает как положено. Есть идеи, как решить эту проблему? Я предполагаю, что это как-то связано с networkPolicy, потому что у меня есть другие приложения внутри арендатора, и запросы curl работают для них.

Заранее спасибо!


Для просмотра сервисов и развертывания yamls: Могут ли две кластерные IP-службы быть подключены в Kubernetes?

1 Ответ

0 голосов
/ 05 мая 2020

Проблема уже решена. Дело в том, что у нас есть traefik в другом пространстве имен, поэтому отсутствует другая сетевая политика, которая обеспечивает связь между любым пространством имен. Ямл, который исправил проблему, выглядит следующим образом.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: all-to-all
  namespace: innovation
spec:
  podSelector: {} #all pods in the namespace (innovation)
  ingress:
    - from:
      - namespaceSelector: {} #from all namespaces, including the one in which traefik ingress is located
  policyTypes:
  - Ingress
...