1. Введение
Управление веб-сайтами и приложениями — сложная задача.
Проблемы возникают тогда, когда их быть не должно: серверы выходят из строя, увеличение спроса приводит к использованию дополнительных ресурсов, а внесение изменений без простоев становится сложным и стрессовым процессом.
Представьте себе инструмент, который мог бы помочь вам во всем этом и даже позволить автоматизировать процесс! С GKE все это не только возможно, но и легко! В этом практическом задании вы берете на себя роль разработчика, управляющего интернет-магазином вымышленной компании — Fancy Store. Из-за проблем с масштабированием и сбоями вам поручено развернуть ваше приложение в GKE!
Упражнения расположены в порядке, отражающем типичный опыт разработчика облачных решений:
- Создайте кластер GKE.
- Создайте контейнер Docker.
- Разверните контейнер в GKE.
- Предоставьте доступ к контейнеру через сервис.
- Масштабируйте контейнер до нескольких копий.
- Внесите изменения в веб-сайт.
- Внедрите новую версию без простоев.
Архитектурная схема

Что вы узнаете
- Как создать кластер GKE
- Как создать образ Docker
- Как развернуть образы Docker в Kubernetes
- Как масштабировать приложение в Kubernetes
- Как выполнить поэтапное обновление в Kubernetes
Предварительные требования
- A Google Account with administrative access to create projects or a project with a project-owner role
- Базовое понимание Docker и Kubernetes (если у вас нет базового понимания, пожалуйста, повторите Docker и Kubernetes прямо сейчас).
2. Настройка среды
Настройка среды для самостоятельного обучения
Если у вас еще нет учетной записи Google, вам необходимо ее создать . Войдите в консоль Google Cloud и создайте новый проект.


Помните, что идентификатор проекта — это уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем он будет обозначаться как PROJECT_ID .
Далее вам потребуется включить оплату в консоли Cloud, чтобы использовать ресурсы Google Cloud. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов . Если вы не новый пользователь, не беспокойтесь, поскольку выполнение задания в рамках практического курса не должно стоить вам больше нескольких долларов. Однако выполнение задания может обойтись вам дороже, если вы используете больше ресурсов или оставляете их запущенными (см. раздел «Очистка» в конце). Для получения дополнительной информации см. раздел «Цены» .
Облачная оболочка
Хотя вы можете удаленно управлять Google Cloud и GKE с помощью своего ноутбука, для выполнения практического задания вы будете использовать Cloud Shell — среду командной строки, работающую в облаке.
Эта виртуальная машина на базе Debian содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Это означает, что для выполнения этого практического задания вам понадобится только браузер (да, он работает и на Chromebook).
- Для активации Cloud Shell из консоли Cloud Console просто нажмите «Активировать Cloud Shell».
(На подготовку и подключение к среде должно уйти всего несколько минут).
После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и проект уже настроен на ваш PROJECT_ID .
gcloud auth list
вывод команды
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
вывод команды
[core] project = <PROJECT_ID>
Если по какой-либо причине проект не создан, просто выполните следующую команду:
gcloud config set project <PROJECT_ID>
Ищете свой PROJECT_ID ? Проверьте, какой ID вы использовали на этапах настройки, или найдите его на панели управления Cloud Console:
Cloud Shell также по умолчанию устанавливает некоторые переменные среды, которые могут быть полезны при выполнении будущих команд.
echo $GOOGLE_CLOUD_PROJECT
вывод команды
<PROJECT_ID>
- Наконец, установите зону по умолчанию и конфигурацию проекта.
gcloud config set compute/zone us-central1-f
Вы можете выбрать различные зоны. Для получения дополнительной информации см. раздел «Регионы и зоны» .
3. Создайте кластер GKE.
Теперь, когда у вас есть рабочая среда разработки, вам нужен кластер GKE для развертывания вашего веб-сайта! Прежде чем создавать кластер, необходимо убедиться, что включены соответствующие API. Выполните следующую команду, чтобы включить API контейнеров:
gcloud services enable container.googleapis.com
Теперь вы можете создать свой кластер! Следуйте приведенным ниже инструкциям, чтобы создать кластер с именем fancy-cluster , состоящий из 3 узлов:
gcloud container clusters create fancy-cluster --num-nodes 3
Создание кластера может занять несколько минут. После этого выполните следующую команду и увидите три экземпляра виртуальных машин (ВМ) кластера:
gcloud compute instances list
Выход:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS gke-fancy-cluster-default-pool-ad92506d-1ng3 us-east4-a n1-standard-1 10.150.0.7 XX.XX.XX.XX RUNNING gke-fancy-cluster-default-pool-ad92506d-4fvq us-east4-a n1-standard-1 10.150.0.5 XX.XX.XX.XX RUNNING gke-fancy-cluster-default-pool-ad92506d-4zs3 us-east4-a n1-standard-1 10.150.0.6 XX.XX.XX.XX RUNNING
Вы также можете просмотреть информацию о своем кластере и связанные с ним данные в Cloud Console. Нажмите кнопку меню в верхнем левом углу, прокрутите вниз до Kubernetes Engine и нажмите «Кластеры». Вы должны увидеть свой кластер с именем fancy-cluster .


Поздравляем! Вы создали свой первый кластер!
4. Клонируйте репозиторий исходного кода.
Поскольку это уже существующий веб-сайт, вам нужно лишь клонировать исходный код из репозитория, чтобы вы могли сосредоточиться на создании образов Docker и развертывании в GKE.
Выполните следующие команды, чтобы клонировать репозиторий исходного кода в ваш экземпляр Cloud Shell и перейти в соответствующую директорию. Вам также потребуется установить зависимости Node.js, чтобы протестировать ваше приложение перед его развертыванием.
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices ./setup.sh
Эта команда клонирует репозиторий, меняет каталог и устанавливает зависимости, необходимые для локального запуска вашего приложения. Выполнение этого скрипта может занять несколько минут.
Проведите тщательное исследование и протестируйте ваше приложение. Выполните следующую команду, чтобы запустить веб-сервер:
cd ~/monolith-to-microservices/monolith npm start
Выход:
Monolith listening on port 8080!
Предварительный просмотр приложения можно осуществить, щелкнув значок предварительного просмотра веб-страницы в меню Cloud Shell и выбрав «Предварительный просмотр на порту 8080».

После этого должно открыться новое окно, где вы сможете увидеть свой магазин Fancy Store в действии!

После просмотра веб-сайта вы можете закрыть это окно. Нажмите Control+C (Windows или Mac) в окне терминала, чтобы остановить процесс веб-сервера.
5. Создайте контейнер Docker с помощью Cloud Build.
Теперь, когда ваши исходные файлы готовы, пришло время контейнеризировать ваше приложение с помощью Docker!
Обычно для этого требуется двухэтапный подход, включающий создание контейнера Docker и его отправку в реестр для хранения образа, который будет использоваться GKE. Однако вы можете упростить себе задачу, используя Cloud Build для создания контейнера Docker и размещения образа в реестре контейнеров одной командой! (Чтобы ознакомиться с процессом создания файла Docker и его отправки вручную, см. раздел «Быстрый старт для реестра контейнеров» .)
Cloud Build сжимает файлы из каталога и перемещает их в хранилище Cloud Storage. Затем процесс сборки берет файлы из хранилища и использует Dockerfile для запуска процесса сборки Docker. Поскольку вы указали флаг --tag с хостом gcr.io для образа Docker, полученный образ Docker отправляется в реестр контейнеров.
Для начала необходимо включить API Cloud Build, выполнив следующую команду:
gcloud services enable cloudbuild.googleapis.com
После включения API выполните следующую команду в Cloud Shell, чтобы запустить процесс сборки:
cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .
Этот процесс занимает несколько минут, но после его завершения в терминале вы увидите следующий вывод:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 1ae295d9-63cb-482c-959b-bc52e9644d53 2019-08-29T01:56:35+00:00 33S gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz gcr.io/<PROJECT_ID>/monolith:1.0.0 SUCCESS
Чтобы просмотреть историю сборок или наблюдать за процессом в режиме реального времени, перейдите в облачную консоль. Нажмите кнопку меню в верхнем левом углу, прокрутите вниз до раздела Ci/CD, затем нажмите Cloud Build и, наконец, History. Там вы увидите список ваших предыдущих сборок, но там должна быть только та, которую вы создали.

Если вы нажмете на идентификатор сборки, то сможете увидеть все подробности этой сборки, включая вывод логов.
На странице сведений о сборке вы можете просмотреть созданный образ контейнера, щелкнув по имени образа в разделе информации о сборке.

6. Разверните контейнер в GKE.
Теперь, когда вы контейнеризировали свой веб-сайт и загрузили контейнер в реестр контейнеров, вы можете развернуть его в Kubernetes!
Для развертывания и управления приложениями в кластере GKE необходимо взаимодействовать с системой управления кластером Kubernetes. Обычно это делается с помощью инструмента командной строки kubectl .
Kubernetes представляет приложения в виде Pod-ов , которые являются единицами, представляющими собой контейнер (или группу тесно связанных контейнеров). Pod — это наименьшая развертываемая единица в Kubernetes. В данном случае каждый Pod содержит только ваш монолитный контейнер.
Для развертывания приложения необходимо создать объект Deployment . Объект Deployment управляет несколькими копиями вашего приложения — так называемыми репликами — и планирует их запуск на отдельных узлах кластера. В данном случае Deployment будет запускать только один Pod вашего приложения. Deployment обеспечивает это путем создания объекта ReplicaSet . ReplicaSet отвечает за то, чтобы указанное количество реплик всегда работало.
Команда kubectl create deployment заставляет Kubernetes создать в вашем кластере развертывание с именем `monolith`, содержащее 1 реплику.
Для развертывания приложения выполните следующую команду:
kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0
Проверка развертывания
Чтобы убедиться в успешном создании развертывания, выполните следующую команду (может потребоваться несколько секунд, чтобы статус пода изменился на "Running"):
kubectl get all
Выход:
NAME READY STATUS RESTARTS AGE pod/monolith-7d8bc7bf68-htm7z 1/1 Running 0 6m21s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.27.240.1 <none> 443/TCP 24h NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/monolith 1 1 1 1 20m NAME DESIRED CURRENT READY AGE replicaset.apps/monolith-7d8bc7bf68 1 1 1 20m
В этом выводе отображается несколько вещей. Вы можете увидеть ваше развертывание (Deployment), которое является текущим; ваш ReplicaSet с желаемым количеством подов, равным одному; и ваш под, который запущен. Похоже, вы успешно создали все!
Для просмотра отдельных ресурсов можно выполнить следующие команды:
# Show pods kubectl get pods # Show deployments kubectl get deployments # Show replica sets kubectl get rs #You can also combine them kubectl get pods,deployments
Чтобы в полной мере оценить преимущества Kubernetes, вы можете смоделировать сбой сервера, удалить под и посмотреть, что произойдет!
Скопируйте имя вашего пода из предыдущей команды и выполните следующую команду, чтобы удалить его:
kubectl delete pod/<POD_NAME>
Если вы достаточно быстры, вы можете снова выполнить предыдущую команду, чтобы увидеть все еще раз, и вы должны увидеть два пода: один завершает работу, а другой создает или запускает:
kubectl get all
Выход:
NAME READY STATUS RESTARTS AGE pod/monolith-7d8bc7bf68-2bxts 1/1 Running 0 4s pod/monolith-7d8bc7bf68-htm7z 1/1 Terminating 0 9m35s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.27.240.1 <none> 443/TCP 24h NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/monolith 1 1 1 1 24m NAME DESIRED CURRENT READY AGE replicaset.apps/monolith-7d8bc7bf68 1 1 1 24m
Почему это произошло? ReplicaSet обнаружил, что под завершает работу, и запустил новый под, чтобы поддерживать необходимое количество реплик. Позже вы узнаете, как масштабировать систему, чтобы обеспечить работу нескольких экземпляров одновременно, и в случае выхода из строя одного из них ваши пользователи не столкнутся с простоями!
7. Предоставить доступ к развертыванию GKE.
Вы развернули свое приложение в GKE, но у вас нет возможности получить к нему доступ извне кластера. По умолчанию контейнеры, запущенные в GKE, недоступны из интернета, поскольку у них нет внешних IP-адресов. Вам необходимо явно предоставить доступ к вашему приложению для интернет-трафика через ресурс Service . Service обеспечивает сетевую и IP-поддержку для подов вашего приложения. GKE создает внешний IP-адрес и балансировщик нагрузки ( в зависимости от тарификации ) для вашего приложения.
Выполните следующую команду, чтобы сделать ваш веб-сайт доступным в интернете:
kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080
Выход:
service/monolith exposed
Доступ к сервису
GKE назначает внешний IP-адрес ресурсу Service, а не Deployment. Чтобы узнать внешний IP-адрес, который GKE выделил для вашего приложения, вы можете проверить Service с помощью команды kubectl get service:
kubectl get service
Выход:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE monolith 10.3.251.122 203.0.113.0 80:30877/TCP 3d
После того, как вы определите внешний IP-адрес вашего приложения, скопируйте его. Перейдите по этому URL-адресу в вашем браузере (например, http://203.0.113.0), чтобы проверить, доступно ли ваше приложение.

Вы должны увидеть тот же веб-сайт, который тестировали ранее! Поздравляем! Ваш веб-сайт полностью работает на Kubernetes!
8. Масштабирование развертывания GKE
Теперь, когда у вас есть работающий экземпляр вашего приложения в GKE и он доступен из интернета, ваш веб-сайт стал невероятно популярным! Вам нужен способ масштабирования приложения до нескольких экземпляров, чтобы справиться с трафиком. Узнайте, как масштабировать приложение до трех реплик.
Выполните следующую команду, чтобы масштабировать развертывание до трех реплик:
kubectl scale deployment monolith --replicas=3
Выход:
deployment.apps/monolith scaled
Проверьте масштабируемое развертывание.
Чтобы убедиться в успешном масштабировании развертывания, выполните следующую команду:
kubectl get all
Выход:
NAME READY STATUS RESTARTS AGE pod/monolith-7d8bc7bf68-2bxts 1/1 Running 0 36m pod/monolith-7d8bc7bf68-7ds7q 1/1 Running 0 45s pod/monolith-7d8bc7bf68-c5kxk 1/1 Running 0 45s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.27.240.1 <none> 443/TCP 25h service/monolith LoadBalancer 10.27.253.64 XX.XX.XX.XX 80:32050/TCP 6m7s NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/monolith 3 3 3 3 61m NAME DESIRED CURRENT READY AGE replicaset.apps/monolith-7d8bc7bf68 3 3 3 61m
Вы должны увидеть три запущенных экземпляра вашего Pod. Также обратите внимание, что теперь количество экземпляров Deployment и ReplicaSet равно желаемому значению — три.
9. Внесите изменения на веб-сайт.
Ваша маркетинговая команда попросила вас изменить главную страницу вашего сайта. Они считают, что она должна быть более информативной, объясняя, чем занимается ваша компания и что вы продаете. В этом разделе вы добавите текст на главную страницу, чтобы порадовать маркетинговую команду! Похоже, один из наших разработчиков уже внес изменения, создав файл с именем index.js.new . Вы можете скопировать этот файл в index.js , и ваши изменения должны отобразиться. Следуйте инструкциям ниже, чтобы внести необходимые изменения.
Выполните следующие команды, скопируйте обновленный файл в папку с правильным именем и распечатайте его содержимое, чтобы проверить изменения:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
В результате код должен выглядеть следующим образом:
/*
Copyright 2019 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
root: {
flexGrow: 1
},
paper: {
width: "800px",
margin: "0 auto",
padding: theme.spacing(3, 2)
}
}));
export default function Home() {
const classes = useStyles();
return (
<div className={classes.root}>
<Paper className={classes.paper}>
<Typography variant="h5">
Fancy Fashion & Style Online
</Typography>
<br />
<Typography variant="body1">
Tired of mainstream fashion ideas, popular trends and societal norms?
This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
Start shopping Fancy items now!
</Typography>
</Paper>
</div>
);
}
Вы обновили компоненты React, но для генерации статических файлов необходимо собрать приложение React. Выполните следующую команду, чтобы собрать приложение React и скопировать его в директорию public монолита:
cd ~/monolith-to-microservices/react-app npm run build:monolith
Теперь, когда ваш код обновлен, вам необходимо пересобрать контейнер Docker и опубликовать его в реестре контейнеров. Вы можете использовать ту же команду, что и раньше, за исключением того, что на этот раз вы обновите метку версии!
Выполните следующую команду, чтобы запустить новую сборку Cloud Build с обновленной версией образа 2.0.0:
cd ~/monolith-to-microservices/monolith
#Feel free to test your application
npm start
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .
Нажмите сочетание Control+C (Windows или Mac) в окне терминала, чтобы остановить процесс веб-сервера.
В следующем разделе вы используете этот образ для обновления вашего приложения без простоя.
10. Обновление веб-сайта без простоев.
Изменения внесены, и команда маркетинга довольна вашими обновлениями! Пришло время обновить сайт без помех для пользователей. Следуйте инструкциям ниже, чтобы обновить свой сайт.
Функция непрерывных обновлений GKE гарантирует, что ваше приложение останется доступным даже тогда, когда система заменит экземпляры старого образа контейнера новым на всех работающих репликах.
Из командной строки вы можете сообщить Kubernetes, что хотите обновить образ для вашего развертывания до новой версии, с помощью следующей команды:
kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0
Выход:
deployment.apps/monolith image updated
Проверка развертывания
Проверить обновление развертывания можно, выполнив следующую команду:
kubectl get pods
Выход:
NAME READY STATUS RESTARTS AGE monolith-584fbc994b-4hj68 1/1 Terminating 0 60m monolith-584fbc994b-fpwdw 1/1 Running 0 60m monolith-584fbc994b-xsk8s 1/1 Terminating 0 60m monolith-75f4cf58d5-24cq8 1/1 Running 0 3s monolith-75f4cf58d5-rfj8r 1/1 Running 0 5s monolith-75f4cf58d5-xm44v 0/1 ContainerCreating 0 1s
Вы видите, как создаются три новых модуля, а ваши старые модули отключаются. По возрасту вы можете определить, какие из них новые, а какие старые. В конце концов, вы снова увидите только три модуля, которые будут вашими тремя обновленными модулями.
Чтобы проверить внесенные изменения, снова перейдите по внешнему IP-адресу балансировщика нагрузки и убедитесь, что ваше приложение обновилось.
Выполните следующую команду, чтобы вывести список служб и просмотреть IP-адрес, если вы его забыли:
kubectl get svc
На вашем сайте должен отображаться текст, который вы добавили в компонент главной страницы!

11. Уборка
Удалить репозиторий Git
cd ~ rm -rf monolith-to-microservices
Удалить образы из реестра контейнеров
ПРИМЕЧАНИЕ: Если вы создали другие версии, вы можете использовать тот же синтаксис для удаления и этих изображений. В этом практическом задании предполагается, что у вас всего два тега.
# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet
# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet
Удалите артефакты Cloud Build из Cloud Storage.
ПРИМЕЧАНИЕ: Если вы использовали Cloud Build для создания артефактов, отличных от данного практического задания, вам потребуется вручную удалить исходный код из хранилища Cloud Storage по адресу gs://<PROJECT_ID>_cloudbuild/source .
# The following command will take all source archives from all builds and delete them from cloud storage
# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'
gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done
Удалить службу GKE
kubectl delete service monolith kubectl delete deployment monolith
Удалить кластер GKE
gcloud container clusters delete fancy-cluster
Примечание: выполнение этой команды может занять некоторое время.
12. Поздравляем!
Вы развернули, масштабировали и обновили свой веб-сайт в GKE. Теперь вы имеете опыт работы с Docker и Kubernetes!