# #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. Я думаю, что использовать разные порты намного проще, чем использовать разные пути хоста. Мои приложения хорошо разделены с помощью портов.