Рубрики
Uncategorized

Здравствуйте, развертывание Microvice Part 2: Kubernetes и Google Cloud

Это вторая часть три части серии. В этой части мы будем принимать докер изображения от части 1 и получать его, чтобы запустить кластер Kurbenetes, который мы настроим на Google Cloud.

Автор оригинала: Sheena.

Вступление

Привет и добро пожаловать назад. Это вторая часть три части серии. В Часть 1 Мы познакомились с Docker, создавая изображение для простого веб-приложения, а затем запустить это изображение. Мы до сих пор работаем с Это репо Отказ

В этой части мы будем принимать докер изображения от части 1 и получать его, чтобы запустить кластер Kurbenetes, который мы настроим на Google Cloud.

В части 3 мы будем использовать Drone.io, чтобы настроить простой CI/CD-трубопровод. Он проверит наше приложение и разворачивает какие-либо изменения, которые мы делаем в главной отрасли нашего репо.

Так что же для kubernetes (K8S)?

Так что такое эта контейнер-оркестровка? Давайте Revisit Webflix для этого. Скажем, Webflix понизил путь микросервисов (для своей организации, это довольно хороший ход действий), и они выделили несколько аспектов их большего применения в отдельных службах. Каждый из этих служб затем создан в виде изображений и необходимо развернуть в виде живых контейнеров.

Развертывание-микропресстата - Services.png

Диаграмма здесь показывает просто небольшую часть приложения WebFlix. Давайте предположим, что это пиковое время наблюдения. Маленькие числа рядом с различными услугами являются примерами числа живых контейнеров в пьесе. Теоретически, вы сможете сделать это с помощью использования Docker Run команда.

Теперь, давайте скажем, один из контейнеров Review_Service попадает в необработанную ошибку и падает. Если бы нам удалось это через Docker Run , нам нужно было заметить это и перезапустить оскорбительный контейнер. Или вдруг мы больше не в пиковом времени, и количество контейнеров должно быть масштабировано.

Хотите развернуть новую версию образа REVESE_SERVICE? Тогда существуют и другие проблемы, такие как время запуска контейнера и зонды прозвучательности. Что если у вас есть куча машин, на которых вы хотите запустить свои контейнеры? Вам нужно будет отслеживать, какие ресурсы доступны на каждой машине и какие реплики работают, чтобы вы могли масштабировать и масштабировать, когда вам нужно.

Вот где приходит оркестровка контейнера.

Обратите внимание, что автор этого поста ужасно предвзято и думает, что K8S — это шоссе, так что это то, что мы будем покрывать здесь. Есть альтернативные платформы, которые вы можете захотеть посмотреть, например, Docker Rash и Mesos/Marathon.

Хорошо, вернемся к добрике K8S.

K8s родился и поднял и сразился затвердевал в Google. Google использовал его внутренне, чтобы запустить огромные рабочие нагрузки, а затем открыть ее, потому что они прекрасны люди. Таким образом, K8S является свободно доступной, высокомасштабируемой, расширяемой и вообще твердой платформой. Еще одна вещь, которая действительно полезна, так это то, что Google Cloud имеет поддержку первого класса K8S, поэтому, если у вас есть кластер K8S в облаке Google, есть все виды доступных инструментов, которые облегчают ваше приложение.

Kubernetes позволяет вам запустить свою рабочую нагрузку на кластер машин. Он устанавливает демон (демон — это просто длительный фоновый процесс) на каждой из этих машин, а демоны управляют объектами Kubernetes.

Работа K8S состоит в том, чтобы попытаться сделать конфигурацию объекта представлять собой реальность, например, если вы утвердите, что должны быть три экземпляра контейнера Review_Service: 1.0.1, то K8s создаст эти контейнеры. Если одна из контейнеров умирает (даже если вы вручную убьете его самостоятельно), то K8s снова сделает конфигурацию True, воссоздая убийственную контейнер где-то на кластере.

Существует много разных объектов, определенных в K8S. Я познакомим вас всего за несколько. Это будет очень краткое введение в объекты K8S и их возможности.

POD — это группа одной или нескольких контейнеров

Подумайте о горохе в стручке или стручке китов. Контейнеры в стручке управляются как группа — они развернуты, реплицированы, запущены и остановлены вместе. Мы будем запускать нашу простую услугу в качестве одного контейнера в POD. Для получения дополнительной информации о стручках взгляните на K8S Документация Отказ Это действительно довольно хорошо.

Если вы развертываете POD к кластеру K8S, все контейнеры в этом специфическом POD будут работать на одном узле в кластере. Кроме того, все контейнеры в одном POD могут обращаться друг с другом, как будто они находятся на одном компьютере (они обмениваются IP-адресом и пространством порта). Это означает, что они могут обратиться к друг другу через localhost Отказ И, конечно, их порты не могут перекрывать.

Развертывание — это группа из одного или нескольких стручков

Теперь, скажем, Webflix имеет POD, который запускает свою рекомендационную службу, и они попадают на шипов в трафике. Им нужно будет создать несколько новых стручков для обработки трафика. Обычный подход — использовать развертывание для этого.

Развертывание указывает POD, а также правила, как этот POD реплицируется. Это может сказать, что мы хотим три реплика POD, содержащего Рекомендовать_service: 1.2.0. Он также делает умные вещи, такие как помощь с Rolling Upgrades — если рекомендуется_service: 1.3.0 становится доступным, вы можете проинструктировать K8s снять Pods Review_service и воспитывать новые стручки разумным способом.

Развертывание добавляют много энергии для стручек. Чтобы узнать больше о них, я хотел бы направить вас к Официальная документация Отказ

Сервис определяет правила сети

Контейнеры в стручке могут говорить друг с другом, как будто они находятся на одном хозяине. Но вам часто нужны POD, чтобы поговорить с другими стручками, и вам также нужно будет разоблачить некоторые ваши стручки в большой плохой Интернет, потому что пользователи за пределами вашего кластера, вероятно, понадобится взаимодействуют с вашими приложениями. Это достигается через услуги. Услуги определяют сетевые интерфейсы, выставленные подводами. Опять же, я хотел бы направить вас к Официальная документация Если вам нужна дополнительная информация.

Практично: развертывание вашего приложения в Google Cloud

Теперь мы знаем, почему инструмент, похожий на K8S … Давайте начнем использовать его. Я решил продолжить, используя предложение Google Kubernetes двигателя. Вы можете использовать другой поставщик услуг, если вы хотите, запустить свой собственный кластер или имитировать кластер с помощью Minikube . По большей части учебное пособие будет точно так же, за исключением начальной настройки кластера и окончательной очистки кластера.

Установите наш кластер

Посетите Страница двигателя Kubernetes Отказ Если вы новичок в Google Cloud, вам нужно будет войти в систему с вашей учетной записью Google.

Создайте или выберите проект — их пользовательский интерфейс довольно интуитивно понятен. Вам нужно будет немного подождать, пока API K8S и связанные с ними службы будут активированы.

Теперь посетите Google Cloud Console Отказ В верхней части страницы вы увидите маленькую клеммующую кнопку. Нажмите на него, чтобы активировать оболочку Google Cloud.

Если вы хотите использовать терминал на своем собственном компьютере, вы можете — это просто требует немного более установки. Вам нужно будет установить SDK Google Cloud SDK и компонент KUBECTL и выполнить некоторую дополнительную конфигурацию, которая за пределами объема этого текста. Если вы хотите пойти по этому пути, посмотрите на это Отказ Вы будете взаимодействовать с кластером с помощью использования утилиты командной строки GCloud.

Хорошо, так вернемся к оболочке. Запустите следующую команду, чтобы создать кластер:

gcloud container clusters create hello-codementor --num-nodes=3 --zone=europe-west1-d

Это создаст три кластер узла под названием Hello-Commentor. Это может занять несколько минут. Каждый узел представляет собой вычислительный экземпляр (VM), управляемый Google. Я решил поставить узлы в Западной Европе. Если вы хотите увидеть полный список доступных зон, вы можете использовать команду GCloud Compute Zones List Отказ В качестве альтернативы вы можете обратиться к Этот документ для списка доступных зон.

Как только ваш кластер был создан успешно, вы должны увидеть что-то вроде этого:

WARNING: Currently, node auto repairs are disabled by default. In the future, this will change and they will be enabled by default. Use `--[no-]enable-autorepair` flag  to suppress this warning.
WARNING: Starting in Kubernetes v1.10, new clusters will no longer get compute-rw and storage-ro scopes added to what is specified in --scopes (though the latter will remain included in the default --scopes). To use these scopes, add them
 explicitly to --scopes. To use the new behavior, set container/new_scopes_behavior property (gcloud config set container/new_scopes_behavior true).
Creating cluster hello-codementor...done.
Created [https://container.googleapis.com/v1/projects/codementor-tutorial/zones/europe-west1-d/clusters/hello-codementor].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/europe-west1-d/hello-codementor?project=codementor-tutorial
kubeconfig entry generated for hello-codementor.
NAME          LOCATION        MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION  STATUS
hello-codementor  europe-west1-d  1.8.10-gke.0    35.205.54.147  n1-standard-1  1.8.10-gke.0  3          RUNNING

Чтобы увидеть отдельные узлы:

gcloud compute instances list

Это будет выводить что-то вроде:

NAME                                         ZONE            MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
gke-hello-codementor-default-pool-a471ab46-c0q8  europe-west1-d  n1-standard-1               10.132.0.3   35.205.110.255  RUNNING
gke-hello-codementor-default-pool-a471ab46-jv7n  europe-west1-d  n1-standard-1               10.132.0.4   35.189.247.55   RUNNING
gke-hello-codementor-default-pool-a471ab46-mt54  europe-west1-d  n1-standard-1               10.132.0.2   35.190.195.64   RUNNING

Достижение разблокировано: кластер K8S!

Загрузить свой документ Docker

В Часть 1 Мы покрывали создание образа докера. Теперь нам нужно сделать наше изображение доступным для нашего кластера. Это означает, что нам нужно поставить наше изображение в Реестр контейнера что Google может получить доступ. Google Cloud имеет встроенный реестр контейнера.

Чтобы воспользоваться реестром Google, вам понадобится соответствующим образом ваши изображения. В приведенных ниже командах вы заметите, что наши теги изображения включают eu.gcr.io. . Это потому, что мы используем зону в Европе. Если вы решили поставить свой кластер в другую зону, обратитесь к Этот документ И обновите свои сборки и нажмите команды соответствующим образом.

На оболочке Google Cloud:

## clone your repo since it's not yet available to this shell. Of course if you
## are using a local install of gcloud then you already have this code

git clone https://gitlab.com/sheena.oconnell/tutorial-codementor-deploying-microservices.git
cd tutorial-codementor-deploying-microservices

## get your project id, we'll need it later

export PROJECT_ID="$(gcloud config get-value project -q)"

## configure docker so it can push properly
gcloud auth configure-docker
## just say yes to whatever it asks

## next up, build the image
docker build -t eu.gcr.io/${PROJECT_ID}/codementor-tutorial:v1 .
## notice the funny name. eu.gcr.io refers to google's container registry in
## Europe. If your cluster is not in Europe (eg you chose a US zone when creating
## your cluster) then you must use a different url. Refer to this document for
## details: https://cloud.google.com/container-registry/docs/pushing-and-pulling

## once you are finished building the image, push it
docker push eu.gcr.io/${PROJECT_ID}/codementor-tutorial:v1

Теперь у нас есть наше приложение, построенное в виде изображения, и это изображение доступно для нашего кластера! Следующим шагом является создание развертывания, а затем разоблачить это развертывание на внешний мир в качестве службы.

Получите ваше приложение, чтобы запустить как развертывание

Внутри Google Cloud Shell сделайте следующее:

kubectl run codementor-tutorial --image=eu.gcr.io/${PROJECT_ID}/codementor-tutorial:v1 --port 8080

Вывод должен быть что-то вроде:

deployment "codementor-tutorial" created

Как и в: вы только что создали развертывание K8S!

Теперь давайте посмотрим, что мы сделали. Во-первых, посмотрите на развертывание, которое мы только что создали.

kubectl get deployments

Это даст вам краткое изложение текущих развертываний. Выход будет выглядеть:

NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
codementor-tutorial   1         1         1            1           57s

Теперь развертывание управляет стручками. Итак, давайте посмотрим на те:

kubectl get pods

Это выходы:

NAME                              READY     STATUS    RESTARTS   AGE
codementor-tutorial-99f796786-r92fv   1/1       Running   0          1m

Хорошо! Теперь нам нужно разоблачить наше приложение в Интернет, используя услугу K8S. Это так же легко:

kubectl expose deployment codementor-tutorial --type=LoadBalancer --port 80 --target-port 8080

Это выходы:

service "codementor-tutorial" exposed

Теперь это немного сложнее. Что это делает, это скажу Google, что мы хотим LoadBalancer. LoadsAlancers решит, какие стручки должны получить инцидент трафик. Так что, если у меня есть куча реплик моего подвода, и куча клиентов, пытающихся получить доступ к моей приложению, то Google будет использовать свою инфраструктуру для распространения трафика на мои стручки. Это очень упрощенное объяснение. Есть несколько дополнительных услуг, которые вы можете узнать, если вы на самом деле создаете проект MicroServices.

Помните эту линию от нашего dockerfile?

CMD ["gunicorn", "-b", "0.0.0.0:8080", "main:__hug_wsgi__"]

Наш контейнер ожидает общаться с внешним миром через порт 8080. Это --Таргет-порт Отказ Порт, который мы хотим общаться с собой 80 Отказ Мы просто говорим службу, которую мы хотим связать эти порты вместе.

Давайте посмотрим, как делает наш сервис

kubectl get service -w

Обратите внимание на -w здесь. Услуги занимают немного времени, чтобы пойти, потому что LoadsAlancers нуждается в некотором времени, чтобы проснуться. -w обозначает смотреть . Всякий раз, когда служба обновляется с новой информацией, эта информация будет напечатана на терминал.

Вывод похож на это:

NAME              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes        ClusterIP      10.47.240.1             443/TCP        44m
codementor-tutorial   LoadBalancer   10.47.241.244        80:30262/TCP   40s
## time passes before the next line is printed out
codementor-tutorial   LoadBalancer   10.47.241.244   35.205.44.169   80:30262/TCP   55s

Нажмите Ctrl + C перестать смотреть услуги.

Теперь давайте доступ к приложению с вашего локального компьютера.

## copy the external IP address from the service output above
export EXTERNAL_IP="35.205.44.169"
curl ${EXTERNAL_IP}/index

Это выходы:

{"codementor": "so delicious"}

Потрясающие! У нас есть наш образ, работающий в качестве контейнера в кластере, размещенном на двигателе Google Kubernetes! Я не знаю о тебе, но я нахожу это довольно захватываю. Но мы только начали поцарапать поверхность того, что может сделать K8.

Увеличить масштаб

Допустим, наше приложение оказалось серьезно вкусным, так что многие трафика наступают. Прохладный! Время масштабировать. Нам нужно обновить наш объект развертывания, чтобы он ожидал трех стручков.

## first tell k8s to scale it up
kubectl scale deployment codementor-tutorial --replicas=3

## now take a look at your handiwork
kubectl get deployment codementor-tutorial

Вывод:

NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
codementor-tutorial   3         3         3            3           23m

И посмотрите на стручки:

kubectl get pods

Вывод:

NAME                              READY     STATUS    RESTARTS   AGE
codementor-tutorial-99f796786-2x964   1/1       Running   0          54s
codementor-tutorial-99f796786-r92fv   1/1       Running   0          23m
codementor-tutorial-99f796786-tlnck   1/1       Running   0          54s

Бриллиант! Итак, теперь, когда кто-то обращается к вашему обращению к внешнему IP-адресу обслуживания K8S, трафик будет направлен на LoadBalancer на один из стручков. Мы можем справиться три раза большее количество трафика, которую мы могли бы раньше.

Разверните новую версию вашего приложения

Теперь давайте сделаем новую версию нашего приложения. Вернитесь к вашу облачную оболочку Google и проверьте Версия2 Отделение нашего применения:

git checkout -b version2 origin/version_2

Теперь давайте построим и нажимаю новую версию нашего изображения:

docker build -t eu.gcr.io/${PROJECT_ID}/codementor-tutorial:v2 .
docker push eu.gcr.io/${PROJECT_ID}/codementor-tutorial:v2

Теперь мы говорим развертывание, чтобы запустить наше новое изображение:

kubectl set image deployment/codementor-tutorial codementor-tutorial=eu.gcr.io/${PROJECT_ID}/codementor-tutorial:v2

И посмотреть наши стручки:

kubectl get pods -w

И целое много вещей происходит со временем:

NAME                               READY     STATUS              RESTARTS   AGE
codementor-tutorial-66c6545dd9-2lnlt   0/1       ContainerCreating   0          42s
codementor-tutorial-66c6545dd9-s44xm   0/1       ContainerCreating   0          42s
codementor-tutorial-99f796786-2x964    1/1       Running             0          24m
codementor-tutorial-99f796786-r92fv    1/1       Running             0          47m
codementor-tutorial-66c6545dd9-2lnlt   1/1       Running   0         46s
codementor-tutorial-99f796786-2x964   1/1       Terminating   0         24m
codementor-tutorial-66c6545dd9-h7vfv   0/1       Pending   0         1s
codementor-tutorial-66c6545dd9-h7vfv   0/1       Pending   0         1s
codementor-tutorial-66c6545dd9-h7vfv   0/1       ContainerCreating   0         1s
codementor-tutorial-99f796786-2x964   0/1       Terminating   0         24m
codementor-tutorial-99f796786-2x964   0/1       Terminating   0         24m
codementor-tutorial-66c6545dd9-s44xm   1/1       Running   0         48s
codementor-tutorial-99f796786-r92fv   1/1       Terminating   0         47m
codementor-tutorial-99f796786-r92fv   0/1       Terminating   0         47m
codementor-tutorial-66c6545dd9-h7vfv   1/1       Running   0         4s
codementor-tutorial-99f796786-2x964   0/1       Terminating   0         24m
codementor-tutorial-99f796786-2x964   0/1       Terminating   0         24m
codementor-tutorial-99f796786-r92fv   0/1       Terminating   0         47m
codementor-tutorial-99f796786-r92fv   0/1       Terminating   0         47m

В конце концов, новые вещи перестают происходить. Сейчас Ctrl + C И снова запустите Pods:

kubectl get pods

Это выходы:

NAME                               READY     STATUS    RESTARTS   AGE
codementor-tutorial-66c6545dd9-2lnlt   1/1       Running   0          2m
codementor-tutorial-66c6545dd9-h7vfv   1/1       Running   0          1m
codementor-tutorial-66c6545dd9-s44xm   1/1       Running   0          2m

Так что только что произошло? Мы начали с тремя струями бега Кодаментар-учебник: V1 Отказ Теперь у нас есть три подвода, работающие Кодаментар-учебник: V2 Отказ K8S не просто убивает все бегущие стручки и создает все новые в то же время. Можно сделать это, но это будет означать, что приложение на некоторое время будет ниже.

Вместо этого K8S начнет приносить новые стручки онлайн во время завершения старых и перебалансирующихся трафиком. Это означает, что любой доступ к вашему приложению будет способствовать доступу к нему, когда обновляется обновление. Это, конечно, только часть истории. K8S способен выполнять всевозможные проверки здоровья и готовности по пути, а также можно настроить для разных путей по-разному.

Давайте вернемся к нашему местному терминалу и посмотрим, что делает наше приложение:

curl ${EXTERNAL_IP}/index

Это выходы:

{"codementor": "so delicious", "why": "because we have the experts"}

ВАЖНЫЙ

Клаустеры стоят денег! Вы захотите выключить, когда вы закончите с этим. Мы поговорим об очистке в конце следующей части этой серии. Если вы еще не хотите погружаться в CI/CD, но это совершенно хорошо, чтобы просто перейти к разделу на очистке.

Заключение

Хорошо сделано для получения этого далеко! Серьезно, вы многому научились. В этой части серии мы настроили кластеры K8S в облаке Google, и мы охватываем некоторые основные навыки конфигурации объекта K8S, включая масштабирование и модернизацию стручков на лету. Это много земли, которое мы покрыли! Дайте себе похлопывание на спину.

Последний столб этой серии будет охватывать настройку базового конвейера CI/CD для нашего приложения, а также все важные уборки.

Оригинал: «https://www.codementor.io/@sheena/hello-microservice-deployment-part-2-kubernetes-and-google-cloud-kw9j0oi99»