Автор оригинала: Sheena.
Вступление
Привет и добро пожаловать назад. Это вторая часть три части серии. В Часть 1 Мы познакомились с Docker, создавая изображение для простого веб-приложения, а затем запустить это изображение. Мы до сих пор работаем с Это репо Отказ
В этой части мы будем принимать докер изображения от части 1 и получать его, чтобы запустить кластер Kurbenetes, который мы настроим на Google Cloud.
В части 3 мы будем использовать Drone.io, чтобы настроить простой CI/CD-трубопровод. Он проверит наше приложение и разворачивает какие-либо изменения, которые мы делаем в главной отрасли нашего репо.
Так что же для kubernetes (K8S)?
Так что такое эта контейнер-оркестровка? Давайте Revisit Webflix для этого. Скажем, Webflix понизил путь микросервисов (для своей организации, это довольно хороший ход действий), и они выделили несколько аспектов их большего применения в отдельных службах. Каждый из этих служб затем создан в виде изображений и необходимо развернуть в виде живых контейнеров.
Диаграмма здесь показывает просто небольшую часть приложения 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.1443/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»