
Изд. № 29
.pdf
Шаг 5: Развертывание Microservices Sock Shop
Далее начинается развертывание демонстрационного приложения microservices в вашем кластере Kubernetes.
Сначала на уровне управления клонируем git-репозиторий microservices sock shop:
git clone https://github.com/microservices-demo/microservices- demo.git
Необходимо перейти в папку microservices-demo/deploy/kubernetes:
cd microservices-demo/deploy/kubernetes
Затем применим демонстрацию к вашему кластеру Kubernetes:
kubectl apply -f complete-demo.yaml
Появится следующий результат:
deployment "carts-db" created service "carts-db" created deployment "carts" created service "carts" created deployment "catalogue-db" created service "catalogue-db" created deployment "catalogue" created service "catalogue" created deployment "front-end" created service "front-end" created deployment "orders-db" created service "orders-db" created deployment "orders" created service "orders" created deployment "payment" created service "payment" created
deployment "queue-Control Plane" created service "queue-Control Plane" created deployment "rabbitmq" created
service "rabbitmq" created deployment "shipping" created service "shipping" created deployment "user-db" created service "user-db" created deployment "user" created service "user" created
70

Далее важно убедиться в том, что все ваши модули запущены:
watch kubectl get pods --namespace sock-shop
Ctrl-C для выхода.
Когда все модули будут готовы и будут иметь статус “Запущены”, появится следующий результат:
NAMESPACE |
NAME |
READY |
STATUS |
|
RESTARTS |
AGE |
|
|
|
sock-shop |
carts-74f4558cb8-h9924 |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
carts-db-7fcddfbc79-v64fw |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
catalogue-676d4b9f7c-55n4g |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
catalogue-db-5c67cdc8cd-hvk96 |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
front-end-977bfd86-hq9x9 |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
orders-787bf5b89f-xfdl6 |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
orders-db-775655b675-gv456 |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
payment-75f75b467f-4zzqs |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
queue-Control Plane-5c86964795-t8sjg |
1/1 |
||
Running |
0 |
11m |
|
|
sock-shop |
rabbitmq-96d887875-lf46w |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
shipping-5bd69fb4cc-vprmp |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
user-5bd9b9c468-4rms8 |
1/1 |
Running |
|
0 |
11m |
|
|
|
sock-shop |
user-db-5f9d89bbbb-r69pd |
1/1 |
Running |
|
0 |
11m |
|
|
|
|
|
|
|
|
Затем войти в приложение SockShop, нажав на вкладку с указанным названием в левом верхнем углу.
Практическая работа успешно завершена [3].
71
Содержание отчета
1.Титульный лист.
2.Цель работы.
4.Задание из практической работы.
5.Скриншоты пройденного тестирования.
6.Скриншоты выполнения практической работы.
7.Краткий ответ на пять контрольных вопросов.
Контрольные вопросы
1.Что такое Kubernetes?
2.На каком этапе разработки ПО применяют Kubernetes?
3.Что такое сluster в Kubernetes?
4.Чем является pod в Kubernetes?
5.Том в Kubernetes - это?
72

5.3.Создание Kubernetes приложения (практическая работа № 2)
Вэтой практической работе вы узнаете о том, как создать приложение
вKubernetes. Вы научитесь разрабатывать, упаковывать и развертывать приложение в кластере Kubernetes, используя контейнеризацию с помощью
Docker.
Цель
Изучение процесса создания приложения в Kubernetes, создания изображения контейнеров, а также последующий запуск приложения на
Kubernetes
Задание
1.Выбрать второй курс (Build a Kubernetes Application | Course 2) и начать выполнение https://kubecampus.io/kubernetes/courses/build-kubernetes- application/lessons/build-a-kubernetes-application/.
2.Пройти тестирование.
3.Выполнить практическую работу.
4.Ответить на контрольные вопросы.
Методические указания
Класс хранилища предоставляет администраторам возможность описать "классы" хранилища, которые они предлагают. Различные классы могут соответствовать уровням качества обслуживания или политикам резервного копирования, или произвольным политикам, определенным администраторами кластера. Kubernetes не имеет четкого представления о том, что представляют классы. В других системах хранения эту концепцию иногда называют "профилями" [5].
Шаг 1 - проверить текущие классы хранения, созданные в кластере:
kubectl get storageclasses
Постоянные тома
Постоянный объем может быть смонтирован на хосте любым способом, поддерживаемым поставщиком ресурсов.
У поставщиков имеются разные возможности, и режимы доступа каждого PV настроены на конкретные режимы, поддерживаемые этим конкретным томом.
73

Например, NFS может поддерживать несколько клиентов для чтения/записи, но определенный PV NFS может быть экспортирован на сервер как доступный только для чтения.
Каждый PV получает свой собственный набор режимов доступа, описывающих возможности этого конкретного PV.
Режимами доступа являются:
ReadWriteOnce - том может быть подключен как для чтения, так и для записи одним узлом;
ReadOnlyMany - том может быть подключен только для чтения многими узлами;
ReadWriteMany - том может быть подключен как доступный для чтения и записи многими узлами.
Необходимо создать PersistentVolume размером в 10 Гб, называемый
"myvolume".
Сделать так, чтобы у объема был режим доступа 'ReadWriteOnce' и
'ReadWriteMany', storageClassName 'local-path', установленный на пути к хосту '/etc/foo'.
hostPath PersistentVolume создать каталог на узле для эмуляции подключения к сети хранилища.
Шаг 2 – создать каталог
Для создания каталога необходимо ввести следующий код [5]:
mkdir /etc/foo
Далее создать PV:
cat<<'EOF' > pv.yaml kind: PersistentVolume apiVersion: v1 metadata:
name: myvolume spec:
storageClassName: local-path capacity:
storage: 10Gi accessModes:
-ReadWriteOnce
-ReadWriteMany hostPath:
path: /etc/foo
EOF
74

Для создания ресурсов в Kubernetes из файлов спецификации YAML использовать команду kubectl apply:
kubectl apply -f pv.yaml
Показать постоянные тома, существующие в кластере:
kubectl get pv
Требования к постоянному объему
Модули не могут напрямую обращаться к постоянным томам, для этого нужно запросить емкость хранилища для наших приложений, привязав запрос на емкость к PVs с помощью PersistentVolumeClaims.
Создание PersistentVolumeClaim, называемого "mypvc", с запросом 4G i
и режимом доступа ReadWriteOnce:
cat<<'EOF' > pvc.yaml
kind: PersistentVolumeClaim apiVersion: v1
metadata: name: mypvc
spec:
storageClassName: local-path accessModes:
- ReadWriteOnce resources:
requests: storage: 4Gi
EOF
Создать PVC:
kubectl apply -f pvc.yaml
Показать сохраняющийся объем требований кластера:
kubectl get pvc
Обратите внимание, что заявка будет оставаться в состоянии ожидания до тех пор, пока она не будет использована приложением. Это связано с тем, что режим привязки тома установлен на WaitForFirstConsumer в классе хранилища 'local-path', используемом PVC.
75

Шаг 3 – создать и поработать с узлом
Далее необходимо создать узел:
cat<<'EOF'> busybox-one.yaml apiVersion: v1
kind: Pod metadata: labels:
run: busybox-one name: busybox-one
spec:
volumes:
-name: my-vol # has to match volumeMounts.name persistentVolumeClaim:
claimName: mypvc
containers:
-args:
-/bin/sh
--c
-sleep 3600 image: busybox name: busybox-one
volumeMounts:
-name: my-vol # has to match volumes.name mountPath: /etc/foo
EOF
Создайте узел:
kubectl apply -f busybox-one.yaml
Затем подключитесь к узлу и скопируйте данные команды '/etc/passwd'
в '/etc/foo/passwd':
kubectl exec busybox-one -it -- cp /etc/passwd /etc/foo/passwd
Поскольку '/etc/foo' смонтирован на томе, который создан ранее, его жизненный цикл не зависит от жизненного цикла модуля. Можно присоединить том к другому модулю, и должна быть возможность получить доступ и прочитать файл, который скопирован на предыдущем шаге.
76

Далее создайте второй узел, который подключается к тому же PV:
cat<<'EOF'> busybox-two.yaml apiVersion: v1
kind: Pod metadata: labels:
run: busybox-two name: busybox-two
spec:
volumes:
-name: my-vol persistentVolumeClaim:
claimName: mypvc
containers:
-args:
-/bin/sh
--c
-sleep 3600 image: busybox name: busybox-two
volumeMounts:
-name: my-vol mountPath: /etc/foo
EOF
Создайте узел:
kubectl apply -f busybox-two.yaml
Подключитесь к нему и подтвердите, что '/etc/foo' содержит файл
'passwd':
kubectl exec busybox-two -- ls /etc/foo
Запуск приложения с отслеживанием состояния с помощью MySQL
Spring PetClinic - это пример приложения, предназначенного для демонстрации того, как стек Spring можно использовать для создания простых, но мощных приложений, ориентированных на базы данных.
Официальная версия Pet Clinic демонстрирует использование Spring
Boot с Spring MVC и Spring Data JPA.
77

Необходимо развернуть стек на Kubernetes, который включает в себя следующие сервисы:
сервер обнаружения;
сервер конфигурации;
интерфейс AngularJS (API-шлюз);
клиенты, ветеринары и службы посещений.
Приложение использует MySQL в качестве серверного хранилища данных.
Клонируйте репозиторий, содержащий файлы объектных ресурсов Kubernetes, из которых состоит наше приложение [5]:
git clone https://github.com/ahmedgabers/petclinic-kubernetes cd petclinic-kubernetes
Создайте переменную окружения REPOSITORY_PREFIX, которая имеет имя репозитория, в котором хранятся образы Docker для служб
PetClinic:
export REPOSITORY_PREFIX=ahmedgabercod
Создайте пространство имен spring-petclinic, содержащее все ресурсы, развертываемые для PetClinic:
kubectl apply -f k8s/init-namespace/
Микросервисы PetClinic взаимодействуют друг с другом посредством сети, предоставляемой службами Kubernetes, которые будут использоваться в наших развертываниях. Введите следующую команду, чтобы создать службы в пространстве имен spring-petclinic:
kubectl apply -f k8s/init-services
Прикладным сервисам нужна реляционная база данных для хранения информации о клиентах, ветеринарах и посещениях. Итак, для настройки серверной части MySQL для каждой службы используется Helm:
Добавить репозиторий bitnami и обновить Helm:
helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update
78

Установить экземпляр базы данных для службы ветеринаров:
helm install vets-db-mysql bitnami/mysql --namespace springpetclinic --version 9.1.4 --set auth.database=service_instance_db
Установить экземпляр базы данных для службы посещений:
helm install visits-db-mysql bitnami/mysql --namespace springpetclinic --version 9.1.4 --set auth.database=service_instance_db
Установить экземпляр базы данных для службы поддержки клиентов:
helm install customers-db-mysql bitnami/mysql --namespace springpetclinic --version 9.1.4 --set auth.database=service_instance_db
В Yaml-файле развертывания есть заполнитель под названием REPOSITORY_PREFIX, поэтому можно развернуть изображения из нашего репозитория, запустив сценарий оболочки [5]:
./scripts/deployToKubernetes.sh
Убедиться, что узлы развернуты:
watch kubectl get pods -n spring-petclinic
Как только все модули будут запущены и готовы на 1/1, необходимо зайти в приложение на вкладке в левом верхнем углу и ознакомиться с интерфейсом.
Ввыпадающем списке "Владельцы" выбрать "Зарегистрироваться" и ввести информацию для регистрации нового клиента.
Убедиться, что поле "Телефон" содержит не более 10 числовых значений без знака "+". Например, (7908645213).
Враскрывающемся списке "Владельцы" выбрать "Все", чтобы подтвердить, что клиент был добавлен.
Проверить данные, сохраненные в базе данных MySQL, можно, запустив временный контейнер с изображением mysql:8.0 и запустив двоичный файл mysql для выполнения запроса [5]:
export MYSQL_PASSWORD=$(kubectl get secret customers-db-mysql -n spring-petclinic -o jsonpath='{.data.mysql-root-password}' | base64 - d)
79