Маршрутизация входящего трафика контроллера на основе пути к файлу

Можно ли направить входящий трафик контроллера к различным службам / развертываниям в зависимости от типа файла в пути? Например, если путь был:

domain.com/directory/hello.html -> (Frontend Service)
domain.com/directory/hello.php -> (Backend Service)

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

Это выглядит подходящим и возможно ли это, или есть лучший способ добиться этого?

Мой входной контроллер выглядит так:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: vote-ingress
  namespace: default
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/vote-ingress
  uid: 597158e6-a0ce-11e9-b3b1-00155d599803
  resourceVersion: '268064'
  generation: 1
  creationTimestamp: '2019-07-07T15:46:13Z'
spec:
  rules:
    - host: localhost
      http:
        paths:
          - path: /*.php
            backend:
              serviceName: website-backend
              servicePort: 80
          - path: /
            backend:
              serviceName: website-frontend
              servicePort: 80
status:
  loadBalancer:
    ingress:
      - hostname: localhost

person Matt Davis    schedule 08.07.2019    source источник


Ответы (2)


Можно ли направить входящий трафик контроллера к различным службам / развертываниям в зависимости от типа файла в пути?

Нет в этом смысле. Вам нужно будет направить свой запрос на NGINX, который отправит запрос на *.php на PHP_FPM. Вы можете иметь это как отдельные контейнеры внутри одного модуля или как службы. Пример службы красиво объяснен в Как развернуть приложение PHP с Kubernetes в Ubuntu 16.04

В этом примере у вас будет два контейнера NIGNX и PHP_FPM, работающих на модуле. PHP-FPM будет обрабатывать динамическую обработку PHP, а NGINX будет действовать как веб-сервер.

Вам нужно будет использовать пользовательскую конфигурацию nginx.conf, и, на мой взгляд, проще всего будет использовать ConfigMap.

Ваша ConfigMap может выглядеть следующим образом:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  config : |
    server {
      index index.php index.html;
      error_log  /var/log/nginx/error.log;
      access_log /var/log/nginx/access.log;
      root /;

      location / {
          try_files $uri $uri/ /index.php?$query_string;
      }

      location ~ \.php$ {
          try_files $uri =404;
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }

Nginx перехватит и отправит все *.php запросы через localhost: 9000 в контейнер PHP-FPM.

Вы можете включить ConfigMap в свой POD, используя следующее:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx-container
      image: nginx:1.7.9
      volumeMounts:
      - name: config-volume
        mountPath: /etc/nginx/nginx.conf
        subPath: nginx.conf
  volumes:
    - name: config-volume
      configMap:
        name: nginx-config
  restartPolicy: Never
person Crou    schedule 16.07.2019

Вы можете направлять трафик на другой сервис по расширению файла (с помощью Regex). У меня есть рабочая диаграмма Helm с такой же конфигурацией. Частичный пример:

kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    http:
      paths:
      - path: '/(.*)'
        backend:
          serviceName: website-backend
          servicePort: 80
      - path: '/(.+\.(jpg|svg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm|ttf|woff|woff2))'
        backend:
          serviceName: website-static
          servicePort: 80
person daltin    schedule 16.01.2020