ingress- nginx путь возвращается как «Bad Gateway», когда URI имеет параметры («?») или после загрузки - PullRequest
0 голосов
/ 30 марта 2020

Я перемещаю приложение PHP в Kubernetes и запускаю «Bad Gateway» после выполнения некоторых действий.

Я думаю, что ошибка связана с одной из двух вещей:

  • Программа PHP отправляет GET на http://192.168.39.129/admin/a_merge_xls_db.php?tmp_tbl=_imp_companies_20200329_160813
  • Или из самой загрузки

Я сомневаюсь, что это последний, потому что это Файл Excel всего 14kb.

У пользователя есть шаблон Excel для импорта новых учетных записей. Они go на административный портал /admin, выбирают для импорта, он анализирует файл Excel и импортирует в Postgres.

Несмотря на эту ошибку, данные попадают в базу данных. После успешного импорта GET отправляется на a_merge_xls_db.php?tmp_tbl=_imp_companies_20200329_160813. Вот когда через 7 секунд появляется «Плохой шлюз».

Похоже, это может быть проблемой в моих ingress.yaml для ingress-nginx и обработки ?=_ или чего-то еще. Я попробовал несколько вещей, но все еще не смог решить проблему.

Вот что у меня есть в ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/add-base-url: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/proxy-body-size: 500mb
  name: ingress-service
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /?(.*)
            backend:
              serviceName: client-cluster-ip-service-dev
              servicePort: 3000
          - path: /admin/?(.*)
            backend:
              serviceName: admin-cluster-ip-service-dev
              servicePort: 4000
          - path: /api/?(.*)
            backend:
              serviceName: api-cluster-ip-service-dev
              servicePort: 5000

Есть предложения?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ 3/30/20

Я включаю Dockerfile.dev и admin.yaml, поскольку у меня все еще есть проблемы:

# Dockerfile.dev

FROM php:7.3-fpm
EXPOSE 4000
RUN apt-get update \ 
    && apt-get install -y libpq-dev zlib1g-dev libzip-dev \
    && docker-php-ext-install pgsql zip
COPY . /app
WORKDIR /app/src
CMD ["php", "-S", "0.0.0.0:4000"]
# admin.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: admin-deployment-dev
spec:
  replicas: 1
  selector:
    matchLabels:
      component: admin
  template:
    metadata:
      labels:
        component: admin
    spec:
      containers:
        - name: admin
          image: testappacr.azurecr.io/test-app-admin
          ports:
            - containerPort: 4000
          env:
            - name: PGUSER
              valueFrom:
                secretKeyRef:
                  name: test-app-dev-secrets
                  key: PGUSER
            - name: PGHOST
              value: postgres-cluster-ip-service-dev
            - name: PGPORT
              value: "1423"
            - name: PGDATABASE
              valueFrom:
                secretKeyRef:
                  name: test-app-dev-secrets
                  key: PGDATABASE
            - name: PGPASSWORD
              valueFrom:
                secretKeyRef:
                  name: test-app-dev-secrets
                  key: PGPASSWORD
            - name: SECRET_KEY
              valueFrom:
                secretKeyRef:
                  name: test-app-dev-secrets
                  key: SECRET_KEY
            - name: SENDGRID_API_KEY
              valueFrom:
                secretKeyRef:
                  name: test-app-dev-secrets
                  key: SENDGRID_API_KEY
            - name: DOMAIN
              valueFrom:
                secretKeyRef:
                  name: test-app-dev-secrets
                  key: DOMAIN           
            - name: DEBUG
              valueFrom:
                secretKeyRef:
                  name: test-app-dev-secrets
                  key: DEBUG
          volumeMounts:
          - mountPath: "/docs/"
            name: file-storage
      volumes:
        - name: file-storage
          persistentVolumeClaim:
            claimName: file-storage
---
apiVersion: v1
kind: Service
metadata:
  name: admin-cluster-ip-service-dev
spec:
  type: ClusterIP
  selector:
    component: admin
  ports:
    - port: 4000
      targetPort: 4000

Если у меня просто есть - path: /admin, у меня есть проблема, когда активы не обслуживаются. .css и .js возвращаются как 200, но к приложению ничего не применяется. Если я перехожу к URL-адресу ресурса, например, http://192.168.39.129/admin/css/portal.css, он просто показывает страницу, которую вы получаете, когда вы go - /admin.

Эта проблема решается путем возврата обратно к - path: /admin/?(.*) , но потом я сталкиваюсь с проблемой, о которой я поначалу писал.

Большую часть утра я играл с различными регулярными выражениями, но все же получаю те же результаты, когда дело доходит до "Bad Domain".

Скорее всего, я что-то упускаю из виду, изучая Kubernetes. Похоже, что это должно работать с учетом предложения Coderanger, а также этой проблемы, которая повторяет одно и то же:

https://github.com/kubernetes/ingress-nginx/issues/3380

1 Ответ

3 голосов
/ 30 марта 2020

Вам необходимо указать аннотацию nginx.ingress.kubernetes.io/use-regex: "true". Это вызвано тем, что по умолчанию объекты входа Kubernetes ожидают простого совпадения префиксов, а не регулярных выражений. Или, в вашем случае, просто используйте фактический префикс /, /admin и /api.

...