В то время как контейнерные технологии существовали годами, Docker действительно взял их в свои руки. Многие компании и разработчики сейчас используют контейнеры для доставки своих приложений. Docker предоставляет простой в использовании интерфейс для работы с контейнерами.
Однако для любого нетривиального приложения вы будете развертывать не «один контейнер», а группу контейнеров на нескольких хостах. В этой статье мы рассмотрим Kubernetes , систему с открытым исходным кодом для автоматизации развертывания, масштабирования и управления контейнерными приложениями.
Предварительные условия : эта статья предполагает некоторое знакомство с Docker. Если вам нужен переподготовка, ознакомьтесь с разделом «Общие сведения о Docker, контейнерах и безопасной доставке программного обеспечения» .
Какую проблему решает Kubernetes?
С Docker у вас есть простые команды, такие как Docker docker run
или Docker docker stop
чтобы запустить / остановить контейнер соответственно. В отличие от этих простых команд, которые позволяют вам выполнять операции с одним контейнером, нет команды docker deploy
для передачи новых образов группе хостов.
В последнее время появилось много инструментов для решения этой проблемы «оркестровки контейнеров»; популярными являются Mesos , Docker Swarm (теперь часть движка Docker), Nomad и Kubernetes. Все они приходят со своими плюсами и минусами, но, пожалуй, у Kubernetes больше всего пробега на данный момент.
Kubernetes (также называемый «k8s») предоставляет мощные абстракции, которые полностью отделяют операции приложения, такие как развертывание и масштабирование, от операций базовой инфраструктуры. Таким образом, с Kubernetes вы не работаете с отдельными хостами или виртуальными машинами, на которых вы выполняете свой код, а скорее Kubernetes рассматривает базовую инфраструктуру как море вычислений, на котором можно разместить контейнеры.
Kubernetes Concepts
Kubernetes имеет клиент-серверную архитектуру. Сервер Kubernetes работает на вашем кластере (группе хостов), на котором вы будете развертывать свое приложение. И вы обычно взаимодействуете с кластером с помощью клиента, такого как CLI kubectl
.
Бобы
Стручок — это основная единица, с которой имеет дело Kubernetes, группа контейнеров. Если есть два или более контейнера, которые всегда должны работать вместе и должны быть на одной машине, сделайте их pod
. Модуль — это полезная абстракция, и было даже предложение сделать их первоклассным объектом докера.
Узел
Узел — это физическая или виртуальная машина, на которой запущен Kubernetes, на который можно планировать модули.
метка
Метка — это пара ключ / значение, которая используется для идентификации ресурса. Например, вы можете пометить все ваши pods
обслуживающие производственный трафик, как «роль = производство».
селектор
Выбор позволяет искать / фильтровать ресурсы по меткам. Следуя предыдущему примеру, чтобы получить все производственные модули, ваш селектор будет «роль = производство».
обслуживание
Служба определяет набор модулей (обычно выбираемых «селектором») и средства, с помощью которых они могут получить к ним доступ, такие как один стабильный IP-адрес и соответствующее имя DNS.
Разверните приложение Node.js в GKE, используя Kubernetes
Теперь, когда нам известны основные концепции Kubernetes, давайте посмотрим на это в действии, развернув приложение Node.js в Google Container Engine (называемом GKE). Для этого вам потребуется аккаунт Google Cloud Platform (Google предоставляет бесплатную пробную версию с кредитом в размере 300 долларов США ).
1. Установите Google Cloud SDK и клиент Kubernetes
kubectl
— это интерфейс командной строки для запуска команд в кластерах Kubernetes. Вы можете установить его как часть Google Cloud SDK . После установки Google Cloud SDK выполните следующую команду для установки kubectl
:
$ gcloud components install kubectl
или brew install kubectl
если вы работаете на Mac. Для проверки установки запустите kubectl version
.
Вам также необходимо настроить облачный SDK Google с учетными данными для своего облачного аккаунта Google. Просто запустите gcloud init
и следуйте инструкциям.
2. Создайте проект GCP
Все ресурсы Google Cloud Platform создаются в рамках проекта, поэтому создайте его из веб-интерфейса .
Установите идентификатор проекта по умолчанию при работе с CLI, выполнив:
gcloud config set project {PROJECT_ID}
3. Создайте Docker Image вашего приложения
Вот приложение, с которым мы будем работать: express-hello-world . В Dockerfile вы можете видеть, что мы используем существующий образ Node.js из dockerhub . Теперь мы создадим образ нашего приложения, выполнив:
$ docker build -t hello-world-image .
Запустите приложение локально, запустив:
docker run --name hello-world -p 3000:3000 hello-world-image
Если вы посетите localhost:3000
вы должны получить ответ.
4. Создайте кластер
Теперь мы создадим кластер с тремя экземплярами (виртуальными машинами), на котором мы развернем наше приложение. Вы можете сделать это из довольно интуитивно понятного веб-интерфейса, перейдя на страницу механизма контейнеров или выполнив следующую команду:
$ gcloud container clusters create {NAME} --zone {ZONE}
Давайте создадим кластер с именем hello-world-cluster
в us-east1-b
, выполнив
$ gcloud container clusters create hello-world-cluster --zone us-east1-b --machine-type f1-micro
Это запускает кластер с тремя узлами. Мы используем f1-micro в качестве машинного типа, потому что это самый маленький из доступных, чтобы гарантировать минимальные затраты.
Подключите ваш клиент kubectl
к вашему кластеру, выполнив:
gcloud container clusters get-credentials hello-world-cluster --zone us-east1-b
Итак, теперь у нас есть образ докера и кластер. Мы хотим развернуть этот образ в нашем кластере и запустить контейнеры, которые будут обслуживать запросы.
5. Загрузите изображение Docker в реестр изображений Google Container
Реестр изображений контейнеров Google представляет собой облачный реестр, в который вы можете помещать свои изображения, и эти изображения автоматически становятся доступными для вашего кластера движков контейнеров. Чтобы нажать на изображение, вы должны создать его с правильным именем.
Чтобы создать образ контейнера этого приложения и пометить его для загрузки, выполните следующую команду:
$ docker build -t gcr.io/{PROJECT_ID}/hello-world-image:v1 .
v1
является тегом изображения.
Следующий шаг — загрузить изображение, которое мы только что создали:
$ gcloud docker -- push gcr.io/{PROJECT_ID}/hello-world-image:v1
6. Первое развертывание
Теперь у нас есть кластер и изображение в облаке. Давайте развернем этот образ в нашем кластере с Kubernetes. Мы сделаем это, создав файл спецификации deployment
. Развертывания являются ресурсом kubernetes, и все ресурсы kubernetes могут быть декларативно определены в файле спецификации. Этот файл спецификаций определяет желаемое состояние этого ресурса, а Kubernetes выясняет, как перейти из текущего состояния в желаемое.
Давайте создадим один для нашего первого развертывания:
deployment.yml
apiVersion: apps/v1beta1 kind: Deployment metadata: name: hello-world-deployment spec: replicas: 2 template: metadata: labels: # labels to select/identify the deployment app: hello-world spec: # pod spec containers: - name: hello-world image: hello-world-image:v1 # image we pushed ports: - containerPort: 3000
Этот файл спецификаций гласит: запустите два модуля, где каждый модуль определен данной спецификацией модуля. В каждом модуле должен быть один контейнер, содержащий hello-world-image:v1
мы нажали.
Теперь запустите:
$ kubectl create -f deployment.yml --save-config
Вы можете увидеть состояние вашего развертывания, запустив kubectl get deployments
. Чтобы просмотреть модуль, созданный при развертывании, выполните kubectl get pods
команду: kubectl get pods
. Вы должны увидеть бегущие модули:
$ kubectl get pods NAME READY STATUS RESTARTS AGE hello-world-deployment-629197995-ndmrf 1/1 Running 0 27s hello-world-deployment-629197995-tlx41 1/1 Running 0 27s
Обратите внимание, что у нас работает два модуля, потому что мы установили для реплик значение 2 в файле deploy.yml.
Чтобы убедиться, что сервер запущен, проверьте журналы, выполнив:
$ kubectl logs {pod-name} # kubectl logs hello-world-deployment-629197995-ndmrf
7. Выставить Сервис в Интернет
Чтобы предоставить сервис Интернету, вы должны поместить свои виртуальные машины в балансировщик нагрузки. Для этого мы создаем Service
Kubernetes.
$ kubectl expose deployment hello-world-deployment --type="LoadBalancer"
За кулисами создается объект service
(служба — это ресурс Kubernetes, такой как Deployment), а также создается балансировщик нагрузки Google Cloud.
Запустите kubectl get services
чтобы увидеть общедоступный IP-адрес вашего сервиса. Вывод консоли должен выглядеть следующим образом:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-world-deployment 10.103.254.137 35.185.127.224 3000:30877/TCP 9m kubernetes 10.103.240.1 <none> 443/TCP 17d
Посетите http://<EXTERNAL-IP>:<PORT>
чтобы получить доступ к услуге. Вы также можете купить собственное доменное имя и указать его на этом IP.
8. Масштабирование вашего сервиса
Допустим, ваш сервис начинает получать больше трафика, и вам нужно увеличить количество экземпляров приложения. Чтобы увеличить масштаб в таком случае, просто отредактируйте свой файл kubectl apply -f deployment.yml
и измените количество replicas
, скажем, на 3, а затем запустите kubectl apply -f deployment.yml
и у вас будет три запущенных kubectl apply -f deployment.yml
за одно время. Также возможно настроить автоматическое масштабирование, но это выходит за рамки этого руководства.
9. Очистить
Не забудьте очистить ресурсы, как только вы закончите, иначе они продолжат поглощать ваши кредиты Google!
$ kubectl delete service/hello-world-deployment $ kubectl delete deployment/hello-world-deployment $ gcloud container clusters delete hello-world-cluster --zone us-east1-b
Завершение
В этом уроке мы рассмотрели много вопросов, но что касается Kubernetes, это едва царапает поверхность. Вы можете сделать гораздо больше, например, масштабировать свои службы на большее количество модулей с помощью одной команды или монтировать secret
на модулях для таких вещей, как учетные данные AWS и т. Д. Однако этого должно быть достаточно для начала работы. Зайдите на kubernetes.io, чтобы узнать больше!
Эта статья была рецензирована Грэмом Коксом . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!