Приклад: Розгортання 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
- Дізнайтеся більше про Переадресацію портів
- Дізнайтеся, як Отримати доступ до оболонки командного рядка в контейнері