Це багатосторінковий друкований вигляд цього розділу. Натисність щоб друкувати.
Застосунки зі станом
1 - Приклад: Розгортання WordPress та MySQL з постійними томами
У цьому посібнику ви дізнаєтеся, як розгорнути сайт WordPress та базу даних MySQL за допомогою Minikube. Обидва застосунки використовують PersistentVolumes та PersistentVolumeClaims для зберігання даних.
PersistentVolume (PV) — це частина сховища в кластері, яку вручну надав адміністратор або динамічно надав Kubernetes за допомогою StorageClass. PersistentVolumeClaim (PVC) — це запит користувача на сховище, який може бути задоволений за допомогою PV. PersistentVolume і PersistentVolumeClaim не залежать від життєвого циклу Podʼів і зберігають дані під час перезапуску, перепланування та навіть видалення Podʼів.
Увага
Це розгортання не підходить для промислового використання, оскільки використовує одноекземплярні Podʼи WordPress і MySQL. Для розгортання WordPress у промисловому середовищі розгляньте використання WordPress Helm Chart.Примітка
Файли, наведені в цьому посібнику, використовують GA API Deployment і призначені для Kubernetes версії 1.9 і новіших. Якщо ви хочете скористатися цим посібником з ранішою версією Kubernetes, відповідно оновіть версію API або зверніться до попередніх версій цього посібника.Цілі
- Створення PersistentVolumeClaim і PersistentVolume
- Створення
kustomization.yamlз- генератором Secret
- конфігураціями ресурсів MySQL
- конфігураціями ресурсів WordPress
- Застосування теки kustomization за допомогою
kubectl apply -k ./ - Очищення
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Для перевірки версії введіть kubectl version.
Наведений на цій сторінці приклад працює з kubectl версії 1.27 і вище.
Завантажте такі файли конфігурації:
Створення PersistentVolumeClaim і PersistentVolume
Кожному з MySQL і Wordpress потрібен PersistentVolume для зберігання даних. Їхні PersistentVolumeClaim буде створено на етапі розгортання.
У багатьох кластерних середовищах встановлено стандартний StorageClass. Якщо StorageClass не вказано в PersistentVolumeClaim, натомість використовується стандартний StorageClass кластера.
Коли створюється PersistentVolumeClaim, PersistentVolume динамічно надається на основі конфігурації StorageClass.
Увага
У локальних кластерах стандартний StorageClass використовує provisionerhostPath. Томи hostPath підходять лише для розробки та тестування. З томами hostPath ваші дані зберігаються в /tmp на вузлі, на який заплановано Pod, і не переміщуються між вузлами. Якщо Pod припиняє існування й переплановується на інший вузол кластера або вузол перезавантажується, дані втрачаються.Примітка
Якщо ви запускаєте кластер, якому потрібен provisionerhostPath, у компоненті controller-manager має бути встановлено прапорець --enable-hostpath-provisioner.Примітка
Якщо у вас є кластер 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 задає імʼя Service MySQL, визначеного вище, і WordPress звертатиметься до бази даних через цей Service. Змінна середовища WORDPRESS_DB_PASSWORD задає пароль бази даних із Secret, згенерованого kustomize.
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
Завантажте файл конфігурації Deployment 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 може відкривати доступ до Service лише черезNodePort. EXTERNAL-IP завжди перебуває в стані pending.Виконайте цю команду, щоб отримати IP-адресу Service WordPress:
minikube service wordpress --urlВідповідь має бути подібною до цієї:
http://1.2.3.4:32406Скопіюйте IP-адресу та відкрийте сторінку в браузері, щоб переглянути свій сайт.
Ви повинні побачити сторінку налаштування WordPress, схожу на знімок екрана нижче.

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