Приклад: Розгортання WordPress та MySQL з постійними томами
У цьому посібнику ви дізнаєтеся, як розгорнути сайт WordPress та базу даних MySQL за допомогою Minikube. Обидва застосунки використовують PersistentVolumes та PersistentVolumeClaims для зберігання даних.
Постійні томи (PersistentVolume (PV)) — це частина системи зберігання в кластері, яку адміністратор вручну надав або яку Kubernetes автоматично надав за допомогою StorageClass. Запити на постійні томи (PersistentVolumeClaim (PVC)) — це запит на зберігання, який користувач може отримати через PV. PersistentVolumes та PersistentVolumeClaims незалежні від життєвого циклу Podʼів і зберігають дані під час перезапуску, перепланування та навіть видалення Podʼів.
Попередження:
Це розгортання не підходить для використання в операційній діяльності, оскільки використовує Podʼи з одним екземпляром WordPress та MySQL. Розгляньте використання WordPress Helm Chart, щоб розгорнути WordPress для промислової експлуатації.Примітка:
Файли, наведені в цьому посібнику, використовують API-інтерфейси Deployment GA та є специфічними для версії Kubernetes 1.9 і пізніших. Якщо ви хочете скористатися цим посібником з ранньою версією Kubernetes, оновіть, будь ласка, відповідно версію API або звертайтеся до раніших версій цього посібника.Цілі
- Створення PersistentVolumeClaims and PersistentVolumes
- Створення
kustomization.yamlз- генератором Secret
- конфігураціями ресурсів MySQL
- конфігураціями ресурсів WordPress
- Застосування теки kustomization за допомогою
kubectl apply -k ./ - Очищення
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Для перевірки версії введіть kubectl version.
Наведений на цій сторінці приклад працює з kubectl версії 1.27 і вище.
Завантажте наступні конфігураційні файли:
Створення запитів на постійні томи та постійних томів
Для зберігання даних MySQL та Wordpress кожному потрібен постійний том (PersistentVolume). Їх запити на постійні томи (PersistentVolumeClaim) будуть створені на етапі розгортання.
У багатьох середовищах кластера встановлено типовий StorageClass. Якщо StorageClass не вказано у запиті на постійний том (PersistentVolumeClaim), то використовується типовий StorageClass кластера.
Коли створюється запит на постійний том (PersistentVolumeClaim), постійний том (PersistentVolume) динамічно надається на основі конфігурації StorageClass.
Попередження:
У локальних кластерах типовий StorageClass використовує провізорhostPath. Томи hostPath підходять лише для розробки та тестування. З томами hostPath, ваші дані зберігаються в /tmp на вузлі, на який заплановано Pod, і не переміщуються між вузлами. Якщо Pod перестає існувати та переплановується на інший вузол в кластері або вузол перезавантажується, дані втрачаються.Примітка:
Якщо ви запускаєте кластер, який потребує використання провізораhostPath, прапорець --enable-hostpath-provisioner повинен бути встановлений в компоненті controller-manager.Примітка:
Якщо у вас є кластер Kubernetes, що працює на Google Kubernetes Engine, будь ласка, дотримуйтесь рекомендацій цього посібника.Створення файлу kustomization.yaml
Додавання генератора Secret
Secret — це обʼєкт, який зберігає чутливі дані, такі як паролі або ключі. Починаючи з версії 1.14, kubectl підтримує керування обʼєктами Kubernetes за допомогою файлу kustomization. Ви можете створити Secret за допомогою генераторів у файлі kustomization.yaml.
Додайте генератор Secret у файл kustomization.yaml за допомогою наступної команди. Вам потрібно буде замінити YOUR_PASSWORD на пароль, який ви хочете використовувати.
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=YOUR_PASSWORD
EOF
Додавання конфігурації ресурсів для MySQL та WordPress
Наступний маніфест описує Deployment одного екземпляра MySQL. Контейнер MySQL монтує PersistentVolume у /var/lib/mysql. Змінна оточення MYSQL_ROOT_PASSWORD встановлює пароль бази даних з Secret.
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
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:8.0
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
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
Наступний маніфест описує Deployment одного екземпляра WordPress. Контейнер WordPress монтує PersistentVolume у /var/www/html для файлів даних вебсайту. Змінна оточення WORDPRESS_DB_HOST встановлює імʼя служби MySQL, визначеної вище, і WordPress буде звертатися до бази даних через службу. Змінна оточення WORDPRESS_DB_PASSWORD встановлює пароль бази даних згенерованого kustomize Secret.
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
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:6.2.1-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_USER
value: wordpress
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
Завантажте файл конфігурації розгортання MySQL.
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yamlЗавантажте файл конфігурації розгортання WordPress.
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yamlДодайте їх до файлу
kustomization.yaml.cat <<EOF >>./kustomization.yaml resources: - mysql-deployment.yaml - wordpress-deployment.yaml EOF
Застосування та перевірка
Файл kustomization.yaml містить всі ресурси для розгортання сайту WordPress та бази даних MySQL. Ви можете застосувати цю теку командою
kubectl apply -k ./
Тепер перевірте, що всі обʼєкти існують.
Перевірте, що Secret існує, виконавши наступну команду:
kubectl get secretsВідповідь має бути подібною до цієї:
NAME TYPE DATA AGE mysql-pass-c57bb4t7mf Opaque 1 9sПеревірте, що PersistentVolume був динамічно наданий.
kubectl get pvcПримітка:
Процес надання PV може зайняти кілька хвилин.Відповідь має бути подібною до цієї:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77sПеревірте, що Pod працює, виконавши наступну команду:
kubectl get podsПримітка:
Статус Pod може бутиRUNNINGчерез кілька хвилин.Відповідь має бути подібною до цієї:
NAME READY STATUS RESTARTS AGE wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40sПеревірте, що Service працює, виконавши наступну команду:
kubectl get services wordpressВідповідь має бути подібною до цієї:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress LoadBalancer 10.0.0.89 <pending> 80:32406/TCP 4mПримітка:
Minikube може використовувати лишеNodePortдля викладання служб. Зовнішня IP-адреса завжди знаходиться в стані очікування.Виконайте наступну команду, щоб отримати IP-адресу для Service WordPress:
minikube service wordpress --urlВідповідь має бути подібною до цієї:
http://1.2.3.4:32406Скопіюйте IP-адресу та завантажте сторінку у своєму оглядачі, щоб переглянути ваш сайт.
Ви повинні побачити сторінку налаштування WordPress, схожу на знімок екрана нижче.

Попередження:
Не залишайте вашу установку WordPress на цій сторінці. Якщо інший користувач знайде її, вони можуть налаштувати вебсайт на вашому екземплярі та використовувати його для обслуговування шкідливого вмісту.
Або встановіть WordPress, створивши імʼя користувача та пароль, або видаліть свій екземпляр.
Очищення
Виконайте наступну команду, щоб видалити ваш Secret, Deployments, Services та PersistentVolumeClaims:
kubectl delete -k ./
Що далі
- Дізнайтеся більше про Інтроспекцію та Налагодження
- Дізнайтеся більше про Job
- Дізнайтеся більше про Переадресацію портів
- Дізнайтеся, як Отримати доступ до оболонки командного рядка в контейнері