Вход Traefik для нескольких портов

#kubernetes #rabbitmq #kubernetes-ingress #traefik #traefik-ingress

Вопрос:

Я развернул кластер rabbitmq в кластере k3s, используя оператор кластера rabbitmq rabbitmq. В результате он создал службу ClusterIP, которая выглядит следующим образом:

 Name:              rabbitmq
Namespace:         rabbits
Labels:            app.kubernetes.io/component=rabbitmq
                   app.kubernetes.io/name=rabbitmq
                   app.kubernetes.io/part-of=rabbitmq
Annotations:       <none>
Selector:          app.kubernetes.io/name=rabbitmq
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.43.48.11
IPs:               10.43.48.11
Port:              amqp  5672/TCP
TargetPort:        5672/TCP
Endpoints:         10.42.2.55:5672,10.42.2.56:5672
Port:              management  15672/TCP
TargetPort:        15672/TCP
Endpoints:         10.42.2.55:15672,10.42.2.56:15672
Port:              mqtt  1883/TCP
TargetPort:        1883/TCP
Endpoints:         10.42.2.55:1883,10.42.2.56:1883
Port:              web-mqtt  15675/TCP
TargetPort:        15675/TCP
Endpoints:         10.42.2.55:15675,10.42.2.56:15675
Port:              stomp  61613/TCP
TargetPort:        61613/TCP
Endpoints:         10.42.2.55:61613,10.42.2.56:61613
Port:              web-stomp  15674/TCP
TargetPort:        15674/TCP
Endpoints:         10.42.2.55:15674,10.42.2.56:15674
Port:              prometheus  15692/TCP
TargetPort:        15692/TCP
Endpoints:         10.42.2.55:15692,10.42.2.56:15692
Session Affinity:  None
Events:            <none>
 

Я хочу открыть порт 15672 для портала администратора и порт 5672 для приложений за пределами кластера kubernetes. Я попробовал следующее, но не получилось:

 apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: rabbitmq-admin-ingress
  annotations:
    kubernetes.io/ingress.class: "traefik"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: rabbitmq
          servicePort: 15672
      - path : /
        backend:
          serviceName: rabbitmq
          servicePort: 5672
 

Кто-нибудь может мне помочь, что я делаю не так?

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

Ответ №1:

Вы не можете иметь оба пути, указывающие на одно и то же место. Кроме того, вы должны установить полное доменное имя для вашего входа.

Попробуйте использовать два входа с разными именами — что будет работать в большинстве случаев:

 ---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: rabbitmq-admin-ingress-one
  annotations:
    kubernetes.io/ingress.class: "traefik"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: rabbitmq
          servicePort: 15672
    host: host1.example.com
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: rabbitmq-admin-ingress-two
  annotations:
    kubernetes.io/ingress.class: "traefik"
spec:
  rules:
  - http:
      paths:
      - path : /
        backend:
          serviceName: rabbitmq
          servicePort: 5672
    host: host2.example.com
 

Или используйте два пути для одного входа — может потребоваться переписывание некоторых дополнительных путей:

 ---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: rabbitmq-admin-ingress
  annotations:
    kubernetes.io/ingress.class: "traefik"
spec:
  rules:
  - http:
      paths:
      - path: /one
        backend:
          serviceName: rabbitmq
          servicePort: 15672
      - path : /two
        backend:
          serviceName: rabbitmq
          servicePort: 5672
    host: host1.example.com
 

Комментарии:

1. Спасибо вам за ответ. О хосте, может ли это быть ip любого узла в кластере k8s?

2. Обычно, в дополнение к полному доменному имени ваших узлов, у вас будет множество полных доменных имен приложений (или запись с подстановочными знаками), указывающих на ваши входные узлы. Выполняя тесты на своей рабочей станции/локально, вы можете отредактировать /etc/hosts отправку этих имен в свою лабораторию