K3s traefik ingress возвращает тайм-аут шлюза

В настоящее время я играю с кластером k3s на основе rpi и наблюдаю странное явление.

Развернул два приложения. Первый - это nginx, к которому я могу обратиться по URL-адресу http://external-ip/foo на основе следующее правило входа:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo
  namespace: foo
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
    traefik.ingress.kubernetes.io/rewrite-target: "/"
spec:
  rules:
  - http:
      paths:
      - path: /foo
        backend:
          serviceName: foo-service
          servicePort: 8081

А другой - графана, которую я не могу найти по URL-адресу http://external-ip/grafana на основе следующее правило входа:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grafana
  namespace: grafana
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
    traefik.ingress.kubernetes.io/rewrite-target: "/"
spec:
  rules:
  - http:
      paths:
      - path: /grafana
        backend: 
          serviceName: grafana-service
          servicePort: 3000

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

Однако, как только я попытаюсь добраться до него через подпуть, я получу тайм-аут шлюза.

Кто-нибудь догадывается, что мне не хватает?

Вот развертывание и сервис для развертывания графаны:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: grafana
  labels:
    app: grafana
    tier: frontend
    service: monitoring
spec:
  selector:
    matchLabels:
      app: grafana
      tier: frontend
  template:
    metadata:
      labels:
        app: grafana
        tier: frontend
        service: monitoring
    spec:
      containers:
      - image: grafana
        imagePullPolicy: IfNotPresent
        name: grafana
        envFrom:
        - configMapRef:
            name: grafana-config
        ports:
        - name: frontend
          containerPort: 3000
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: grafana-service
  namespace: grafana
  labels:
    app: grafana
    tier: frontend
    service: monitoring
spec:
  selector:
    app: grafana
    tier: frontend
  type: NodePort
  ports:
  - name: frontend
    port: 3000
    protocol: TCP
    targetPort: 3000

Решение

Мне пришлось добавить следующие два параметра в мою конфигурационную карту, чтобы она работала:

GF_SERVER_ROOT_URL=http://localhost:3000/grafana/   
GF_SERVER_FROM_SUB_PATH=true

person tehemaroo    schedule 02.06.2020    source источник
comment
Ваш nginx, вероятно, слушает /, и вы переписываете каждый путь на нем, чтобы он работал. Вопрос в том, слушать ли графана на /? Какой у вас корневой URL-адрес конфигурации grafana.ini? Взгляните на этот комментарий на github.   -  person Jakub    schedule 03.06.2020
comment
@ jt97 thx, это привело меня к правильному пути, мне пришлось установить sub_path в значение true. Отредактирую свой вопрос. еще одна полезная ссылка была следующей: grafana.com/tutorials/run-grafana -behind-a-proxy / # 1.   -  person tehemaroo    schedule 03.06.2020


Ответы (1)


Как я уже упоминал в комментариях, графана не слушает /, как nginx по умолчанию.

Существует связанная с этим проблема с github, и если вы хотите, чтобы она работала, вам следует укажите root_url

grafana.ini:
  server:
    root_url: https://subdomain.example.com/grafana

В частности, обратите внимание на this и этот комментарий.


@tehemaroo добавляет свое собственное решение, которое включает изменение корневого URL-адреса и sub_path в configmap

Мне пришлось добавить следующие два параметра в мою конфигурационную карту, чтобы она работала:

GF_SERVER_ROOT_URL=http://localhost:3000/grafana/   
GF_SERVER_FROM_SUB_PATH=true

И связанная с этим документация об этом

Чтобы служить Grafana за второстепенным путем:

Включите дополнительный путь в конец root_url.

Установите для serve_from_sub_path значение true.

[server]
domain = example.com
root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
serve_from_sub_path = true
person Jakub    schedule 03.06.2020