Как исправить бэкэнд по умолчанию на ingress 404

Я начал использовать Kubernetes несколько месяцев назад и фактически перенес свои микроуслуги в кластер ранчо (RKE). Все работает хорошо, мои развертывания хорошие и сервисы тоже. Я хотел бы использовать вход.

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

Вы можете увидеть мою конфигурацию только для двух путей: один nginx и на графане. Кто-то знает, как я могу это исправить и использовать вход, чтобы сделать мой обратный прокси-сервер?

Спасибо большое за вашу помощь.

Я пытаюсь использовать rewrite-target без результата и add-base-url устарела.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    field.cattle.io/creatorId: user-cg5r7
    field.cattle.io/ingressState: '{"bXktaW5ncmVzcy9kZWZhdWx0L3d3dy5zY29sLWVhLm92aC8vbmdpbngvNDI=":""}'
    field.cattle.io/publicEndpoints: '[{"addresses":["51.68.226.21"],"port":80,"protocol":"HTTP","serviceName":"default:nginx-services","ingressName":"default:my-ingress","hostname":"www.scol-ea.ovh","path":"/nginx","allNodes":true}]'
  creationTimestamp: "2019-08-31T10:54:25Z"
  generation: 2
  labels:
    cattle.io/creator: or antoine
  name: my-ingress
  namespace: default
  resourceVersion: "106239"
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/my-ingress
  uid: b27b7b20-cbdd-11e9-b16b-fa163ea73397
spec:
  rules:
  - host: www.scol-ea.ovh
    http:
      paths:
      - backend:
          serviceName: nginx-sample
          servicePort: 80
        path: /nginx
      - backend:
          serviceName: prometheus-grafana
          servicePort: http
        path : /grafana

------------------------
apiVersion: v1
kind: Service
metadata:
  annotations:
    field.cattle.io/targetWorkloadIds: '["deployment:default:nginx-sample"]'
    workload.cattle.io/targetWorkloadIdNoop: "true"
    workload.cattle.io/workloadPortBased: "true"
  creationTimestamp: "2019-08-31T10:03:47Z"
  labels:
    cattle.io/creator: norman
  name: nginx-sample
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1beta2
    controller: true
    kind: deployment
    name: nginx-sample
    uid: 57af9603-cb2a-11e9-b16b-fa163ea73397
  resourceVersion: "102071"
  selfLink: /api/v1/namespaces/default/services/nginx-sample
  uid: 9fffe98c-cbd6-11e9-b16b-fa163ea73397
spec:
  clusterIP: 10.43.183.187
  ports:
  - name: 80tcp02
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    workload.user.cattle.io/workloadselector: deployment-default-nginx-sample
  sessionAffinity: None
  type: ClusterIP

----------------------------
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2019-08-30T13:44:00Z"
  labels:
    app: prometheus-grafana
    chart: grafana-0.0.31
    heritage: Tiller
    io.cattle.field/appId: prometheus
    release: prometheus
  name: prometheus-grafana
  namespace: default
  resourceVersion: "2536"
  selfLink: /api/v1/namespaces/default/services/prometheus-grafana
  uid: 38ebd878-cb2c-11e9-b16b-fa163ea73397
spec:
  clusterIP: 10.43.142.143
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 3000
  selector:
    app: prometheus-grafana
  sessionAffinity: None
  type: ClusterIP

4 ответа

Если вы используете nginx в качестве прокси-сервера развертывания в кубернетах и ​​столкнулись с проблемой, то приведенная ниже конфигурация может решить проблему перенаправления.

Либо вы можете включить указанные ниже переменные в файл grafan.ini, либо предоставить их как переменные env, как показано ниже,

GF_SERVER_DOMAIN=abc.google.com
GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:/grafana

Таким образом, развертывание Grafana будет выглядеть так, как показано ниже.

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: grafana
          namespace: monitoring
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: grafana
            spec:
              containers:
              - name: grafana
                image: grafana/grafana:latest
                env:
                - name: GF_SERVER_DOMAIN
                  value: "abc.google.com"
                - name: GF_SERVER_ROOT_URL
                  value: "%(protocol)s://%(domain)s:/grafana"

                ports:
                - name: grafana
                  containerPort: 3000
                resources:
                  limits:
                    memory: "2Gi"
                    cpu: "1000m"
                  requests: 
                    memory: "1Gi"
                    cpu: "500m"
                volumeMounts:
                  - mountPath: /var/lib/grafana
                    name: grafana-storage-volume
                  - mountPath: /etc/grafana/provisioning/datasources
                    name: grafana-datasources
                    readOnly: false

И вам нужно обновить блок местоположения сервера nginx, как показано ниже,

       location /grafana {
           proxy_pass http://grafana.monitoring.svc.cluster.local:3000;
           rewrite ^/grafana/(.*) /$1 break;
           proxy_set_header Host $host;
        }

Фактически, Nginx Ingress Controller обрабатывает все запросы, которые не могут достичь целевого местоположения, и отправляет их в серверную часть по умолчанию, в результате чего каждый запросdefault backend - 404 страница.

Поскольку вы решили реализовать сценарий маршрутизации на основе пути, правило перезаписи может помочь с помощью nginx.ingress.kubernetes.io/rewrite-target аннотация:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  labels:
    cattle.io/creator: or antoine
  name: my-ingress
  namespace: default
spec:
  rules:
  - host: www.scol-ea.ovh
    http:
      paths:
      - backend:
          serviceName: nginx-sample
          servicePort: 80
        path: /nginx(/|$)(.*)
      - backend:
          serviceName: prometheus-grafana
          servicePort: http
        path : /grafana(/|$)(.*)

Как только вы подадите заявку выше Ingress manifest, маршрутизация на основе пути может быть предоставлена ​​в следующих примерах перезаписи:

www.scol-ea.ovh/nginx -> www.scol-ea.ovh/

www.scol-ea.ovh/grafana -> www.scol-ea.ovh/

Я бы не рекомендовал делиться какими-либо конфиденциальными данными пользователя в опубликованных манифестах или любых других объектах данных, таких как общедоступная конечная точка в вашем случае.

Я наткнулся на одну вещь: убедитесь, что в ваших правилах спецификации имена серверных служб верны.

Вместо этого:

            - path: /app-ui
        pathType: Prefix
        backend:
          service:
            name: app-ui-service
            port:
              number: 8080

у меня было это:

            - path: /app-ui
        pathType: Prefix
        backend:
          service:
            name: app-ui
            port:
              number: 8080

Еще одна вещь: убедитесь, что если вы используете Nginx Ingress, вы указываете имя входного класса.

      spec:
  ingressClassName: nginx

Я считаю, тебе следует использовать nginx.ingress.kubernetes.io/backend-protocol: HTTPS аннотация в вашем yaml

Другие вопросы по тегам