Приклад: Розгортання PHP застосунку гостьової книги з Redis
Цей посібник показує, як створити та розгорнути простий (але не готовий до промислового використання) багатошаровий вебзастосунок, використовуючи Kubernetes та Docker. Цей приклад складається з наступних компонентів:
- Одно-екземплярний Redis для зберігання записів у гостьовій книзі
- Кілька веб-фронтендів
Цілі
- Запустити Redis-лідер.
- Запустити двох Redis-фолловерів.
- Запустити фронтенд гостьової книги.
- Опублікувати та переглянути Frontend Service.
- Виконати очищення.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Версія вашого Kubernetes сервера має бути не старішою ніж v1.14. Для перевірки версії введітьkubectl version
.Запуск бази даних Redis
Застосунок гостьової книги використовує Redis для зберігання своїх даних.
Створення Deployment Redis
Файл маніфесту, наведений нижче, визначає контролер Deployment, який запускає одну репліку Redis Pod.
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: leader
tier: backend
spec:
containers:
- name: leader
image: "docker.io/redis:6.0.5"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
Відкрийте вікно термінала в теці, куди ви завантажили файли маніфестів.
Застосуйте Deployment Redis з файлу
redis-leader-deployment.yaml
:kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
Перевірте список Podʼів, щоб переконатися, що Pod Redis запущений:
kubectl get pods
Відповідь повинна бути схожою на цю:
NAME READY STATUS RESTARTS AGE redis-leader-fb76b4755-xjr2n 1/1 Running 0 13s
Виконайте наступну команду, щоб переглянути лог з Podʼа Redis лідера:
kubectl logs -f deployment/redis-leader
Створення Service Redis-лідера
Застосунок гостьової книги потребує звʼязку з Redis для запису своїх даних. Вам потрібно застосувати Service, щоб спрямовувати трафік до Pod Redis. Service визначає політику доступу до Podʼів.
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: leader
tier: backend
Застосуйте Service Redis з файлу
redis-leader-service.yaml
:kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
Перевірте список Serviceʼів, щоб переконатися, що Service Redis запущений:
kubectl get service
Відповідь повинна бути схожою на цю:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1m redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 16s
Примітка:
Цей файл маніфесту створює Service з іменемredis-leader
з набором міток, які відповідають раніше визначеним міткам, тому Service спрямовує мережевий трафік до Pod Redis.Налаштування Redis-фолловерів
Хоча Redis-лідер є одним Pod, ви можете зробити його високо доступним і задовольняти потреби в трафіку, додавши кілька фолловерів Redis або реплік.
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
replicas: 2
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: follower
tier: backend
spec:
containers:
- name: follower
image: us-docker.pkg.dev/google-samples/containers/gke/gb-redis-follower:v2
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
Застосуйте Deployment Redis з файлу
redis-follower-deployment.yaml
:kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
Перевірте, що дві репліки Redis-фолловерів запущені, виконавши запит списку Podʼів:
kubectl get pods
Відповідь повинна бути схожою на цю:
NAME READY STATUS RESTARTS AGE redis-follower-dddfbdcc9-82sfr 1/1 Running 0 37s redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 38s redis-leader-fb76b4755-xjr2n 1/1 Running 0 11m
Створення Service Redis-фолловера
Застосунок гостьової книги потребує зʼязку з фолловерами Redis для читання даних. Щоб зробити фолловерів Redis доступними, потрібно налаштувати інший Service.
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
ports:
# порт на якому повинен працювати цей Service
- port: 6379
selector:
app: redis
role: follower
tier: backend
Застосуйте сервіс Redis з файлу
redis-follower-service.yaml
:kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
Перевірте список Serviceʼів, щоб переконатися, що Service Redis запущений:
kubectl get service
Відповідь повинна бути схожою на цю:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h redis-follower ClusterIP 10.110.162.42 <none> 6379/TCP 9s redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 6m10s
Примітка:
Цей файл маніфесту створює Service з іменемredis-follower
з набором міток, які відповідають раніше визначеним міткам, тому сервіс спрямовує мережевий трафік до Pod Redis.Налаштування та експонування фронтенда гостьової книги
Тепер, коли ви запустили сховище Redis для своєї гостьової книги, запустіть вебсервери фронтенду. Як і фолловери Redis, фронтенд розгортається за допомогою контролера Deployment Kubernetes.
Застосунок гостьової книги використовує PHP фронтенд. Він налаштований для звʼязку з Serviceʼами фолловера або лідера Redis, залежно від того, чи є запит читанням або записом. Фронтенд відкриває інтерфейс JSON та забезпечує UX на основі jQuery-Ajax.
Створення Deployment фронтенду гостьової книги
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tier: frontend
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
env:
- name: GET_HOSTS_FROM
value: "dns"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 80
Застосуйте розгортання фронтенду з файлу
frontend-deployment.yaml
:kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
Перевірте список Podʼів, щоб переконатися, що три репліки фронтенду запущені:
kubectl get pods -l app=guestbook -l tier=frontend
Відповідь повинна бути схожою на цю:
NAME READY STATUS RESTARTS AGE frontend-85595f5bf9-5tqhb 1/1 Running 0 47s frontend-85595f5bf9-qbzwm 1/1 Running 0 47s frontend-85595f5bf9-zchwc 1/1 Running 0 47s
Створення Service для Фронтенду
Serviceʼи Redis
, які ви створили, доступні тільки всередині кластера Kubernetes, оскільки типовий тип для Service — ClusterIP. ClusterIP
надає одну IP-адресу для набору Podʼів, на які вказує Service. Ця IP-адреса доступна тільки всередині кластера.
Якщо ви хочете, щоб гості могли отримати доступ до вашої гостьової книги, ви повинні налаштувати Service фронтенду таким чином, щоб він був видимий зовні, щоб клієнт міг запитувати Service ззовні кластера Kubernetes. Проте користувачі Kubernetes можуть скористатися командою kubectl port-forward
, щоб отримати доступ до Service, навіть якщо він використовує ClusterIP
.
Примітка:
Деякі хмарні провайдери, такі як Google Compute Engine або Google Kubernetes Engine, підтримують зовнішні балансувальники навантаження. Якщо ваш хмарний провайдер підтримує балансувальники навантаження і ви хочете його використовувати, розкоментуйтеtype: LoadBalancer
.# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# якщо ваш кластер підтримує це, розкоментуйте наступне, щоб автоматично створити
# зовнішню IP-адресу з балансуванням навантаження для служби frontend.
# type: LoadBalancer
#type: LoadBalancer
ports:
# порт на якому має працювати цей Service
- port: 80
selector:
app: guestbook
tier: frontend
Застосуйте Service фронтенду з файлу
frontend-service.yaml
:kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
Виконайте запит для отримання списку Service, щоб переконатися, що Service фронтенду запущений:
kubectl get services
Відповідь повинна бути схожою на цю:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend ClusterIP 10.97.28.230 <none> 80/TCP 19s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h redis-follower ClusterIP 10.110.162.42 <none> 6379/TCP 5m48s redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 11m
Перегляд Service Фронтенду через kubectl port-forward
Виконайте наступну команду, щоб перенаправити порт
8080
на вашій локальній машині на порт80
на сервісі.kubectl port-forward svc/frontend 8080:80
Відповідь повинна бути схожою на цю:
Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80
Завантажте сторінку http://localhost:8080 у вашому оглядачі, щоб переглянути вашу гостьову книгу.
Перегляд Service Фронтенду через LoadBalancer
Якщо ви розгорнули маніфест frontend-service.yaml
з типом LoadBalancer
, вам потрібно знайти IP-адресу, щоб переглянути вашу гостьову книгу.
Виконайте наступну команду, щоб отримати IP-адресу для Service фронтенду.
kubectl get service frontend
Відповідь повинна бути схожою на цю:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend LoadBalancer 10.51.242.136 109.197.92.229 80:32372/TCP 1m
Скопіюйте зовнішню IP-адресу та завантажте сторінку у вашому оглядачі, щоб переглянути вашу гостьову книгу.
Примітка:
Спробуйте додати кілька записів у гостьову книгу, ввівши повідомлення та натиснувши "Submit". Повідомлення, яке ви ввели, зʼявиться на фронтенді. Це повідомлення свідчить про те, що дані успішно додані до Redis через Serviceʼи, які ви створили раніше.Масштабування Веб-Фронтенду
Ви можете збільшувати або зменшувати кількість реплік за потребою, оскільки ваші сервери визначені як Service, що використовує контролер Deployment.
Виконайте наступну команду, щоб збільшити кількість Podʼів фронтенду:
kubectl scale deployment frontend --replicas=5
Виконайте запит для отримання списку Podʼів, щоб перевірити кількість запущених Podʼів фронтенду:
kubectl get pods
Відповідь повинна виглядати приблизно так:
NAME READY STATUS RESTARTS AGE frontend-85595f5bf9-5df5m 1/1 Running 0 83s frontend-85595f5bf9-7zmg5 1/1 Running 0 83s frontend-85595f5bf9-cpskg 1/1 Running 0 15m frontend-85595f5bf9-l2l54 1/1 Running 0 14m frontend-85595f5bf9-l9c8z 1/1 Running 0 14m redis-follower-dddfbdcc9-82sfr 1/1 Running 0 97m redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 97m redis-leader-fb76b4755-xjr2n 1/1 Running 0 108m
Виконайте наступну команду, щоб зменшити кількість Pods фронтенду:
kubectl scale deployment frontend --replicas=2
Виконайте запит для отримання списку Podʼів, щоб перевірити кількість запущених Podʼів фронтенду:
kubectl get pods
Відповідь повинна виглядати приблизно так:
NAME READY STATUS RESTARTS AGE frontend-85595f5bf9-cpskg 1/1 Running 0 16m frontend-85595f5bf9-l9c8z 1/1 Running 0 15m redis-follower-dddfbdcc9-82sfr 1/1 Running 0 98m redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 98m redis-leader-fb76b4755-xjr2n 1/1 Running 0 109m
Очищення
Видалення Deployment та Serviceʼів також видаляє всі запущені Podʼи. Використовуйте мітки для видалення кількох ресурсів однією командою.
Виконайте наступні команди, щоб видалити всі Pods, Deployment і Serviceʼи.
kubectl delete deployment -l app=redis kubectl delete service -l app=redis kubectl delete deployment frontend kubectl delete service frontend
Відповідь повинна виглядати приблизно так:
deployment.apps "redis-follower" deleted deployment.apps "redis-leader" deleted deployment.apps "frontend" deleted service "frontend" deleted
Виконайте запит списку Podʼів, щоб переконатися, що жоден Pod не працює:
kubectl get pods
Відповідь повинна виглядати приблизно так:
No resources found in default namespace.
Що далі
- Пройдіть інтерактивні навчальні посібники Основи Kubernetes
- Використовуйте Kubernetes для створення блогу з використанням постійних томів для MySQL і WordPress
- Дізнайтеся більше про Підключення застосунків за допомогою Service
- Дізнайтеся більше про ефективне використання міток