Маршрутизация входящих запросов к развертываниям с использованием одного и того же хоста, но разных целевых портов (пример с wordpress и phpmyadmin)

# #kubernetes #docker-compose #google-kubernetes-engine #google-cloud-load-balancer

Вопрос:

Я хочу разместить сайт wordpress, используя ряд сервисов (wordpress, mysql, phpmyadmin, серверный сервис) для полной функциональности. Я уже создал эти сервисы с помощью docker-compose и теперь хочу разместить их с помощью kubernetes, запущенных в Google (gke). На ОДНОМ и ТОМ ЖЕ хосте я хочу связаться с сервисом wordpress и сервисом phpmyadmin, используя разные порты в запросе. Мне это кажется логичным, так как я не хочу иметь второй внешний IP-адрес только для службы phpmyadmin.

Используя docker-compose, это было легко. Все внешние запросы на порт 80 для wordpress и все запросы на порт 8080 для phpmyadmin:

     services:
  # Database
  db:
    image: mysql:5.7
    volumes: 
      - ./database/:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: password
    networks:
      - wpsite
    ports:
      - '3306:3306'
  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - '8080:80'
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: password 
    networks:
      - wpsite
  wordpress:
    container_name: wordpress-wpd
    build:
      dockerfile: Dockerfile
      context: ./xdebug
    depends_on:
      - db
    ports:
      - '8000:80'
    restart: always
    volumes: 
      - ./Wordpress/:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: password
      PHP_EXTENSION_XDEBUG: 1
    networks:
      wpsite:
      mail:
  backend:
    container_name: backend
    build:
      dockerfile: Dockerfile
      context: ./Backend/
    ports:
      - '5555:5555' #prod
      - '6666:6666' #add debug
      - '80:80' #apache debug
    restart: always
    volumes: 
      - ./backend/:/var/www/backend/
    networks:
      wpsite:
networks:
  wpsite:
  mail:
 

Теперь, используя kubernetes, это кажется сложнее. С помощью ingress я могу распределять трафик только с порта 80 на основе пути, а не порта. Я подумал об использовании балансировщика нагрузки для распределения трафика на мой wordpress и phpmyadmin.

балансировщик нагрузки.yaml

 apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  ports:
  - name: wordpress
    #target: wordpress-deployment
    port: 80
    targetPort: 80
  - name: phpmyadmin
    #target: phpmyadmin-deployment
    port: 8080
    targetPort: 80
  selector:
    app: frontend
  type: LoadBalancer
 

phpmyadmin.yaml

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: phpmyadmin-deployment
  labels:
    app: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
        - name: phpmyadmin
          image: phpmyadmin/phpmyadmin
          ports:
            - containerPort: 80
          env:
            - name: PMA_HOST
              value: mysql-service
            - name: PMA_PORT
              value: "3306"
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: MYSQL_ROOT_PASSWORD
 

wordpress.yaml

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deployment
  labels:
    app: frontend
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: home-wordpress 
        image: eu.gcr.io/myproject/home_wordpress:latest
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: /var/www/html
            name: wordpress-persistent-storage
        env:
            - name: WORDPRESS_DB_HOST
              value: mysql-service
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: MYSQL_PASSWORD
            - name: WORDPRESS_DB_USER
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: MYSQL_USER
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wordpress-pv-claim
 

Проблема:
Поскольку оба контейнера (wordpress и phpmyadmin) в конце используют один и тот же порт 80, мне кажется, что интерфейсная служба перенаправляет трафик с порта 80 и с порта 8080 на них обоих. Иногда я вижу, как контейнер wordpress отвечает на запрос, а иногда контейнер phpmyadmin на тот же запрос (хост/порт).

Вопрос: Можно ли это решить с помощью дополнительных сервисов NodePort?

Итак, для wordpress: служба балансировки нагрузки 80:80 —> (дополнительная) служба wordpress NodePort 80:80 —>> развертывание wordpress (80)

Для phpmyadmin: служба 8080 балансировки нагрузки:8080 —> (дополнительная) служба 8080:80 порта phpmyadmin —>> развертывание phpmyadmin (80)

При этом мне нужно будет использовать разные метки/селекторы для балансировщика нагрузки и развертываний, чтобы развертывание phpmyadmin не получало запросы wordpress на порт 80 напрямую от балансировщика нагрузки.

Я не очень хорошо понимал документацию kubernetes по ярлыкам и селекторам, и меня смущает, что существуют различные возможности для их размещения в файле yaml (в соответствии со спецификацией? В разделе метаданные? На каком основании выбирать ключ? На каком основании выбирать значение?).

Или есть более простое решение всего этого? В целом это кажется гораздо более сложным, чем пример с docker-compose…

Комментарии:

1. Обновление: Похоже, что служба балансировки нагрузки не может направлять трафик на службу порта узла. В gke это просто показывает, что нет модулей, подключенных к балансировщику нагрузки, и он не видит nodeport-сервисы..

2. Вам нужно использовать разные порты? Или вы в порядке с внешней балансировкой нагрузки на основе пути хоста?

3. Я думаю, что использовать разные порты намного проще, чем использовать разные пути хоста. Мои приложения хорошо разделены с помощью портов.