1. Введение
Запускать веб-сайты и приложения сложно.
Дела идут не так, как надо, серверы выходят из строя, рост спроса приводит к использованию большего количества ресурсов, а внесение изменений без простоев становится сложным и напряженным.
Представьте себе инструмент, который мог бы помочь вам сделать все это и даже автоматизировать это! С GKE все это не только возможно, но и просто! В этой лаборатории кода вы берете на себя роль разработчика, управляющего веб-сайтом электронной коммерции для вымышленной компании Fancy Store. Из-за проблем с масштабированием и сбоями вам поручено развернуть приложение в GKE!
Упражнения упорядочены так, чтобы отразить общий опыт разработчиков облачных технологий:
- Создайте кластер GKE.
- Создайте Docker-контейнер.
- Разверните контейнер в GKE.
- Откройте доступ к контейнеру через службу.
- Масштабируйте контейнер до нескольких реплик.
- Измените сайт.
- Выпустите новую версию без простоев.
Схема архитектуры
Что вы узнаете
- Как создать кластер GKE
- Как создать образ Docker
- Как развернуть образы Docker в Kubernetes
- Как масштабировать приложение в Kubernetes
- Как выполнить скользящее обновление в Kubernetes
Предварительные условия
- Аккаунт Google с административным доступом для создания проектов или проект с ролью владельца проекта.
- Базовое понимание Docker и Kubernetes (если вам не хватает базового понимания, ознакомьтесь с Docker и Kubernetes прямо сейчас.)
2. Настройка среды
Самостоятельная настройка среды
Если у вас еще нет учетной записи Google, вам необходимо ее создать . Войдите в Google Cloud Console и создайте новый проект.
Помните, что идентификатор проекта — это уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже он будет называться PROJECT_ID
.
Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США . Если вы не новый пользователь, не волнуйтесь, потому что лаборатория кода не должна стоить вам больше нескольких долларов. Однако лаборатория кода может стоить вам больше денег, если вы используете больше ресурсов или оставляете их включенными (см. раздел «Очистка» в конце). Дополнительную информацию см. в разделе Цены .
Облачная оболочка
Хотя вы можете удаленно управлять Google Cloud и GKE со своего ноутбука, для лаборатории кода вы будете использовать Cloud Shell — среду командной строки, работающую в облаке.
Эта виртуальная машина на базе Debian оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Это означает, что все, что вам понадобится для этой лаборатории кода, — это браузер (да, он работает на 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
? Узнайте, какой идентификатор вы использовали на этапах настройки, или найдите его на панели управления 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.
Теперь, когда ваши исходные файлы готовы к работе, пришло время Dockerize ваше приложение!
Обычно вам придется использовать двухэтапный подход, который влечет за собой создание контейнера Docker и отправку его в реестр для хранения образа, из которого извлекается GKE. Однако вы можете облегчить жизнь, используя Cloud Build, чтобы создать контейнер Docker и поместить образ в реестр контейнеров с помощью одной команды! (Чтобы просмотреть ручной процесс создания файла Docker и его отправки, см. Краткое руководство по реестру контейнеров .)
Cloud Build сжимает файлы из каталога и перемещает их в корзину Cloud Storage. Затем процесс сборки берет файлы из корзины и использует Dockerfile для запуска процесса сборки Docker. Поскольку вы указали флаг --tag
с хостом gcr.io
для образа Docker, полученный образ Docker будет отправлен в реестр контейнеров.
Сначала вам необходимо включить Cloud Build API, выполнив следующую команду:
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
Чтобы просмотреть историю сборки или наблюдать за процессом в режиме реального времени, вы можете перейти в Cloud Console. Нажмите кнопку меню в верхнем левом углу, прокрутите вниз до Ci/CD, затем нажмите Cloud Build и, наконец, нажмите «История». Там вы можете увидеть список ваших предыдущих сборок, но там должна быть только та, которую вы создали.
Если вы нажмете «Идентификатор сборки», вы увидите все подробности этой сборки, включая выходные данные журнала.
На странице сведений о сборке вы можете просмотреть созданный образ контейнера, щелкнув имя образа в разделе информации о сборке.
6. Разверните контейнер в GKE.
Теперь, когда вы контейнеризировали свой веб-сайт и поместили контейнер в реестр контейнеров, вы можете развернуть его в Kubernetes!
Для развертывания приложений и управления ими в кластере GKE вам необходимо взаимодействовать с системой управления кластером Kubernetes. Обычно это делается с помощью инструмента командной строки kubectl .
Kubernetes представляет приложения как Pods — модули, представляющие контейнер (или группу тесно связанных контейнеров). Pod — это самая маленькая развертываемая единица в Kubernetes. Здесь каждый под содержит только ваш монолитный контейнер.
Чтобы развернуть приложение, вам необходимо создать Deployment . Развертывание управляет несколькими копиями вашего приложения, называемыми репликами, и планирует их запуск на отдельных узлах вашего кластера. В этом случае при развертывании будет запущен только один модуль вашего приложения. Развертывания гарантируют это путем создания ReplicaSet . ReplicaSet отвечает за то, чтобы указанное количество реплик всегда работало.
Команда kubectl create deployment
заставляет Kubernetes создать в вашем кластере развертывание под названием monolith с одной репликой.
Запустите следующую команду, чтобы развернуть приложение:
kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0
Проверка развертывания
Чтобы убедиться, что развертывание было успешно создано, выполните следующую команду (преобразование статуса модуля в «Выполняется» может занять несколько секунд):
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
Этот вывод показывает вам несколько вещей. Вы можете увидеть свое текущее развертывание; ваш ReplicaSet с желаемым количеством модулей, равным одному; и ваш Pod, который работает. Похоже, вы успешно все создали!
Чтобы индивидуально просмотреть ваши ресурсы, вы можете запустить следующие команды:
# 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-адресов. Вы должны явно предоставить своему приложению доступ к трафику из Интернета через ресурс службы . Служба обеспечивает поддержку сети и IP для модулей вашего приложения. GKE создает внешний IP-адрес и балансировщик нагрузки ( при условии оплаты ) для вашего приложения.
Запустите следующую команду, чтобы открыть доступ к вашему веб-сайту из Интернета:
kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080
Выход:
service/monolith exposed
Доступ к услуге
GKE назначает внешний IP-адрес ресурсу службы, а не развертыванию. Если вы хотите найти внешний IP-адрес, предоставленный GKE для вашего приложения, вы можете проверить Службу с помощью команды 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, и скопируйте его в общедоступный каталог монолита:
cd ~/monolith-to-microservices/react-app npm run build:monolith
Теперь, когда ваш код обновлен, вам необходимо перестроить контейнер Docker и опубликовать его в реестре контейнеров. Вы можете использовать ту же команду, что и раньше, за исключением того, что на этот раз вы обновите метку версии!
Выполните следующую команду, чтобы запустить новую облачную сборку с обновленным образом версии 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!