Направляйте трафик на сервис в другом пространстве имен с помощью Traefik и Kubernetes

Использование Traefik в качестве контроллера входящего трафика (в кластере kube в GCP). Можно ли создать правило входа, которое использует серверную службу из другого пространства имен?

У нас есть пространство имен для каждой из наших «основных» версий кода.

1-service.com -> 1-service.com вход в 1-сервис нс -> 1-сервис в нс

2-service.com -> 2-service.com вход в 2-сервис нс ... и тд

Я также хотел бы иметь другое правило входа в «неверсированное» пространство имен, которое будет направлять трафик в один из основных выпусков.

service.com -> вход service.com в "service" ns -> X-service в пространстве имен X-service

Я хотел бы разделить основные версии в k8s с использованием имен хостов с поддержкой версий (1-service.com и т. Д.), Но все же иметь «последнюю», которая указывает на последний из выпусков.

Я считаю, что voyager может выполнять вход через пространство имен -> svc. может Traefik сделать то же самое ??


person Dan P    schedule 17.11.2017    source источник
comment
какие-нибудь движения по этому поводу? Мне любопытно, как вы в итоге решили эту проблему. В настоящее время я ищу маршрутизацию из пространства имен 'ingress' в несколько дочерних пространств имен с помощью Traefik и не могу понять, как это сделать лучше всего.   -  person Mr.Budris    schedule 05.09.2018


Ответы (2)


Вы можете использовать такой обходной путь:

  1. Создайте службу с типом ExternalName в пространстве имен, если вы хотите создать вход:
apiVersion: v1
kind: Service
metadata:
  name: service-1
  namespace: unversioned
spec:
  type: ExternalName
  externalName: service-1.service-1-ns.svc.cluster.local
  ports:
  - name: http
    port: 8080
    protocol: TCP
  1. Создайте вход, указывающий на эту службу:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: traefik
  name: ingress-to-other-ns
  namespace: service-1-ns
spec:
  rules:
  - host: latest.example.com
    http:
      paths:
      - backend:
          serviceName: service-1
          servicePort: 8080
        path: /
person Grigory Ignatyev    schedule 06.03.2019
comment
Большой! Ваше решение сэкономило мне много времени! Я пытался проделать трюк без создания промежуточной службы, как я читал в документации, было бы достаточно для создания входа со следующей нотацией my-service.my-ns. Но не вышло :( Знаете причину? Большое спасибо! - person Francisco Javier Barrena; 12.05.2021

Только что протестировал на следующем примере на EKS. Traefik развернут в пространстве имен default. Это конфигурация, используемая для сервиса k8s:

---
apiVersion: v1
kind: Service
metadata:
  name: 1-service
  namespace: 1-service
  labels:
    app: 1-service
spec:
  selector:
    app: 1-service
  ports:
    - name: http
      port: 80
      targetPort: 80

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

      services:
        1-service:
          loadBalancer:
            servers:
               - url: http://1-service.1-service.svc.cluster.local:80
               # - url: http://1-service.1-service:80 # This should work perfectly as well, didn't test it explicitly

Как вы, вероятно, уже поняли, вы можете ссылаться на службы из другого пространства имен, используя нотацию SERVICE.NAMESPACE вместо SERVICE, которая автоматически предполагает, что вы ссылаетесь на службу из текущего пространства имен.

person browseman    schedule 31.03.2021