Цей посібник показує, як створити та розгорнути простий (але не готовий до промислового використання) багатошаровий вебзастосунок, використовуючи Kubernetes та Docker. Цей приклад складається з наступних компонентів:
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Версія вашого Kubernetes сервера має бути не старішою ніж v1.14.Для перевірки версії введіть kubectl version.
Застосунок гостьової книги використовує 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: "registry.k8s.io/redis@sha256:cb111d1bd870a6a471385a4a69ad17469d326e9dd91e0e455350cacf36e1b3ee"
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
Застосунок гостьової книги потребує звʼязку з 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
redis-leader з набором міток, які відповідають раніше визначеним міткам, тому Service спрямовує мережевий трафік до Pod 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
Застосунок гостьової книги потребує зʼязку з фолловерами 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
redis-follower з набором міток, які відповідають раніше визначеним міткам, тому сервіс спрямовує мережевий трафік до Pod Redis.Тепер, коли ви запустили сховище Redis для своєї гостьової книги, запустіть вебсервери фронтенду. Як і фолловери Redis, фронтенд розгортається за допомогою контролера Deployment Kubernetes.
Застосунок гостьової книги використовує PHP фронтенд. Він налаштований для звʼязку з Serviceʼами фолловера або лідера Redis, залежно від того, чи є запит читанням або записом. Фронтенд відкриває інтерфейс JSON та забезпечує UX на основі jQuery-Ajax.
# 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ʼи Redis, які ви створили, доступні тільки всередині кластера Kubernetes, оскільки типовий тип для Service — ClusterIP. ClusterIP надає одну IP-адресу для набору Podʼів, на які вказує Service. Ця IP-адреса доступна тільки всередині кластера.
Якщо ви хочете, щоб гості могли отримати доступ до вашої гостьової книги, ви повинні налаштувати Service фронтенду таким чином, щоб він був видимий зовні, щоб клієнт міг запитувати Service ззовні кластера Kubernetes. Проте користувачі Kubernetes можуть скористатися командою kubectl port-forward, щоб отримати доступ до Service, навіть якщо він використовує ClusterIP.
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
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 у вашому оглядачі, щоб переглянути вашу гостьову книгу.
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-адресу та завантажте сторінку у вашому оглядачі, щоб переглянути вашу гостьову книгу.
Ви можете збільшувати або зменшувати кількість реплік за потребою, оскільки ваші сервери визначені як 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.