PathPrefixStrip не перенаправляет на сервер, как ожидалось - PullRequest
0 голосов
/ 24 ноября 2018

Проблема

Недавно я решил перейти из Swarm в Kubernetes и пытался настроить Traefik для маршрутизации моих запросов к ожидаемым внутренним службам на основе Path.

После прочтения документации и некоторых других тем, даже здесь, в StackOverflow, я пришел к выводу, что подходящим вариантом для этого было использование PathPrefixStrip , например:

Использовать* Strip matcher, если ваш бэкэнд прослушивает корневой путь (/), но должен быть маршрутизируемым с определенным префиксом.Например, PathPrefixStrip: / products будет соответствовать / products, а также / products / shoes и / products / shirts.Так как путь перед пересылкой удаляется, ожидается, что ваш бэкэнд прослушивает / .

Но, очевидно, я все еще что-то упустил.

Что вы ожидали увидеть?

Запросы на http://192.168.1.230/blog перенаправляются на бэкэнд-сервис "где бы он ни был" на /

Что вы виделивместо этого?

Вместо этого я получаю 404's http://192.168.1.230/blog или http://192.168.1.230 или что-нибудь еще.

Версия Я пробовал Traefik 1.7 и Kubernetes v1.12,2

Файлы конфигурации

traefik-internal.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik
        name: traefik-ingress-lb
        imagePullPolicy: IfNotPresent
        ports:
         - name: http
           containerPort: 80
         - name: https
           containerPort: 443
         - name: admin
           containerPort: 8080
        args:
        - --configfile=/etc/traefik/traefik.toml
        livenessProbe:
          httpGet:
            path: /ping
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 3
          timeoutSeconds: 1
        volumeMounts:
        - name: config
          mountPath: /etc/traefik/traefik.toml
      volumes:
      - name: config
        hostPath:
          path: /nas/home-stack/3-traefik/traefik-internal.toml
          type: File
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: role
                  operator: In
                  values:
                  - boss
              topologyKey: kubernetes.io/hostname
---
apiVersion: v1
kind: Service
metadata:
  name: traefik-ingress-service
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  selector:
    k8s-app: traefik-ingress-lb
  externalTrafficPolicy: Local
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 443
      name: https
    - protocol: TCP
      port: 8080
      name: admin
  type: LoadBalancer
  loadBalancerIP: 192.168.1.230

traefik-internal.toml

defaultEntryPoints = ["http","https"]
debug = false
logLevel = "INFO"

# Do not verify backend certificates (use https backends)
InsecureSkipVerify = true

[entryPoints]
  [entryPoints.http]
  address = ":80"
  compress = true
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

[api]
  [api.statistics]
    recentErrors = 10
    debug = true

[kubernetes]
  labelselector = "traffic-type=internal"

[metrics]
  [metrics.prometheus]
  buckets=[0.1,0.3,1.2,5.0]
  entryPoint = "traefik"

[ping]
entryPoint = "http"

ghost.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: blog-controller
  labels:
    app: blog
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: blog
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        app: blog
    spec:
      containers:
      - name: ghost
        image: allandequeiroz/ghost-the-shell:arm
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 2368
        volumeMounts:
        - name: ghost-database
          mountPath: /var/www/ghost/content/data
        - name: ghost-configuration
          mountPath: /var/www/ghost/config.production.json
      restartPolicy: Always
      volumes:
      - name: ghost-database
        hostPath:
          path: /nas/ghost
      - name: ghost-configuration
        hostPath:
          path: /nas/home-stack/6-ghost/conf/config.production.json
          type: File
---
apiVersion: v1
kind: Service
metadata:
  name: blog
spec:
  selector:
    k8s-app: traefik-ingress-lb
    app: blog
  ports:
    - port: 80
      targetPort: 2368
  type: NodePort
#  type: LoadBalancer
#  loadBalancerIP: 192.168.1.232
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: blog
  labels:
    traffic-type: internal
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: PathPrefixStrip
spec:
  rules:
  - host: allandequeiroz.com
    http:
      paths:
      - path: /blog
        backend:
          serviceName: blog
          servicePort: 80

Обратите внимание на ghost.yaml , если я приму услугу как LoadBalanderIPэто работает, я могу нажать ghost, просто указывая на http://192.168.1.232, но вместо этого я хотел бы разделить внутренние и внешние службы и охватить их с помощью внутренней (192.168.1.230) и внешней (192.168.1.230) балансировщиков нагрузки.

Спасибо, ребята, и извините, если я что-то упустил и задаю глупый вопрос.

...