Проблема с вашей конфигурацией - отсутствие служб, которые позволят внешний доступ к вашему WordPress
.
Там много материалов, объясняющих, какие есть варианты и как они строго связаны с инфраструктурой, над которой работает Kubernetes.
Позвольте мне подробно остановиться на 3 из них:
- minikube
- kubeadm
- в облаке (GKE, EKS, AKS)
База конфигурации WordPress
будет одинаковой в каждом случае.
Содержание:
- Работает MySQL
- Секрет
- PersistentVolumeClaim
- Развертывание
- Сервис
- Запуск WordPress
- PersistentVolumeClaim
- Развертывание
- Разрешение внешнего доступа
- minikube
- kubeadm
- с выделенным облаком (GKE)
На сайте Kubernetes есть хорошее руководство: ЗДЕСЬ!
Бег MySQL
Секрет
В качестве официальной документации Kubernetes: объекты
Kubernetes secret
позволяют хранить и управлять конфиденциальной информацией, такой как пароли, токены OAuth и ключи s sh. Поместить эту информацию в secret
безопаснее и гибче, чем дословно поместить ее в определение Pod или в изображение контейнера .
- Секреты Kubernetes
Примером ниже является YAML
определение секрета, используемого для MySQL
пароля:
apiVersion: v1
kind: Secret
metadata:
name: mysql-password
type: Opaque
data:
password: c3VwZXJoYXJkcGFzc3dvcmQK
Взгляните на c посмотрите на:
password: c3VwZXJoYXJkcGFzc3dvcmQK
Этот пароль закодирован в base64 .
Чтобы создать этот пароль, вызовите команду из своего терминала: $ echo "YOUR_PASSWORD" | base64
Вставьте вывод в определение YAML
и примените его с: $ kubectl apply -f FILE_NAME
.
You можно проверить, правильно ли он был создан с помощью: $ kubectl get secret mysql-password -o yaml
PersistentVolumeClaim
MySQL требуется выделенное место для хранения данных. Существует официальная документация, объясняющая это: Постоянные тома
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
Выше YAML
создаст заявку на хранение для MySQL
. Примените его с помощью команды:
$ kubectl apply -f FILE_NAME
.
Развертывание
Создайте YAML
определение развертывания из официального примера и настройте его, если были какие-либо изменения в имена объектов:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
Обратите особое внимание на c часть ниже, которая анализирует secret
пароль для модуля MySQL
:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
Применить это с помощью команды: $ kubectl apply -f FILE_NAME
.
Сервис
В вашей конфигурации отсутствовали сервисные объекты. Этот объект позволяет общаться с другими модулями, внешними трафиками c et c. Посмотрите на приведенный ниже пример:
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
Это определение создаст объект, который будет указывать на модуль MySQL
.
Будет создана запись DNS с именем wordpress-mysql
и IP-адресом модуля.
Он не будет подвергать его внешнему трафику c, так как он не нужен.
Применить его с помощью команды: $ kubectl apply -f FILE_NAME
.
Запуск WordPress
Заявка о постоянном объеме
Как и MySQL
, WordPress
требуется выделенное место для хранения данных. Создайте его на примере ниже:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
Примените его с помощью команды: $ kubectl apply -f FILE_NAME
.
Развертывание
Создайте YAML
определение WordPress
, как показано ниже:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
Обратите особое внимание на c:
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
Эта часть будет анализировать секретное значение для развертывания.
Ниже определение покажет WordPress
, где находится MySQL
:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
Примените его с помощью команды: $ kubectl apply -f FILE_NAME
.
Разрешение внешнего доступа
Существует много разных подходов для настройки внешнего доступа к приложениям.
Minikube
Конфигурация может отличаться для разных гипервизоров.
Например, Minikube
может подвергать WordPress
внешним трафикам c с помощью:
NodePort
apiVersion: v1
kind: Service
metadata:
name: wordpress-nodeport
spec:
type: NodePort
selector:
app: wordpress
tier: frontend
ports:
- name: wordpress-port
protocol: TCP
port: 80
targetPort: 80
После применения этого определения вам нужно будет ввести IP-адрес minikube
с соответствующим портом для веб-браузера.
Этот порт можно найти с помощью команды: $ kubectl get svc wordpress-nodeport
Вывод вышеуказанной команды:
wordpress-nodeport NodePort 10.76.9.15 <none> 80:30173/TCP 8s
В данном случае это 30173
.
LoadBalancer
В этом случае он также создаст NodePort!
apiVersion: v1
kind: Service
metadata:
name: wordpress-loadbalancer
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
Входной ресурс
Пожалуйста, перейдите по этой ссылке: Minikube: create-an-ingress-resource
Также вы можете сослаться на это Пост переполнения стека
Kubeadm
С кластерами Kubernetes kubeadm
NodePort
Процесс настройки такой же, как в minikube
. Единственное отличие состоит в том, что он создаст NodePort
на каждом узле кластера. После этого вы можете ввести IP-адрес любого узла с соответствующим портом. Имейте в виду, что вам необходимо находиться в одной сети без брандмауэра, блокирующего ваш доступ.
LoadBalancer
Вы можете создать LoadBalancer
объект с таким же определением YAML
, как в minikube
. Проблема заключается в том, что при kubeadm
инициализации на голом металлическом кластере LoadBalancer
не получит IP-адрес. Один из вариантов: MetalLB
Входящие
Входящие ресурсы имеют ту же проблему, что и LoadBalancer
в kubeadm
предоставляемой инфраструктуре. Как указано выше, один из вариантов: MetalLB .
Предоставление облака
Существует множество параметров, которые строго связаны с облаком, над которым работает Kubernetes. Ниже приведен пример настройки ресурса Ingress
с контроллером NGINX на GKE:
Примените оба определения YAML
:
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/cloud-generic.yaml
Применить NodePort
определение из minikube
Создать ресурс Ingress:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: wordpress-nodeport
servicePort: wordpress-port
Применить его с помощью команды: $ kubectl apply -f FILE_NAME
.
Проверить, получен ли Ingress
ресурс адрес от облачного провайдера с командой:
$ kubectl get ingress
Вывод должен выглядеть так:
NAME HOSTS ADDRESS PORTS AGE
ingress * XXX.XXX.XXX.X 80 26m
После ввода команды IP-адреса сверху вы должны получить :
Пример с предоставлением облака может использоваться для kubeadm
подготовленных кластеров с настроенным MetalLB
.