Дружеское знакомство с Kubernetes

druzheskoe znakomstvo s kubernetes

Kubernetes – одна из самых интересных технологий в мире DevOps сегодня. За последние несколько лет он привлек большое внимание. Причина его мгновенной славы – могущественная контейнеры.

Компания Docker Inc. рассказала о контейнерах благодаря безупречному маркетингу удивительного продукта. Docker заложил основу широкого использования контейнеров, хотя контейнерные технологии устарели. Однако благодаря Docker использование контейнеров Linux стало более распространенным, что закрепило основу механизмов оркестрирования контейнеров.

Войдите в Kubernetes – разработанный Google с использованием многолетнего опыта управления инфраструктурой мирового класса на миллиардах контейнеров. Kubernetes стал мгновенным хитом и начиная с этого года Docker Inc. упаковал Kubernetes как дополнительный механизм оркестрования вместе с Docker Swarm.

Теперь Kubernetes будет частью сообщества Docker и Docker Enterprise Edition. Звучит довольно круто, да? Лучший из обоих миров упакован вместе как единый двоичный файл.

Обзор с высоты птичьего полета

Kubernetes, k8s или kube – это платформа с открытым кодом, автоматизирующая операции с контейнерами. Это устраняет большинство существующих ручных процессов, предусматривающих развертывание, масштабирование и управление контейнерными приложениями. Фу! это много работы.

С помощью Kubernetes можно объединить группы хостов, которые запускают контейнеры. Kubernetes помогает управлять этими кластерами. Эти кластеры могут охватывать публичные, частные и гибридные облака — и кто знает когда-то вселенную Звездной войны.

Kubernetes был разработан и разработан командой инженеров Google. Google уже давно является участником контейнерной технологии. Кроме того, что Kubernetes говорит об использовании контейнерных технологий, Kubernetes является технологией, стоящей за предложениями облачных сервисов Google.

Google разворачивает более 2 миллиардов контейнеров в неделю. Все это работает на внутренней платформе под названием Borg (больше похоже на некоего военачальника орков из Мордора, но нет). Borg был предшественником Kubernetes. Уроки, извлеченные Google, работая с Borg на протяжении многих лет, стали ведущей силой Kubernetes.

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

Кроме того, Kubernetes может увеличивать или уменьшать услуги в зависимости от использования, гарантируя, что вы используете только то, что вам нужно, когда вам нужно, где это нужно. Как и контейнеры, Kubernetes позволяет нам управлять кластерами, что позволяет контролировать версии и реплицировать настройки.

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

Как работает Kubernetes?

ZZ4KONLpSBCx5nzqsEcfr8FEiAb3bOBBhko6
Ссылки: https://kubernetes.io/docs/concepts/architecture/cloud-controller/

Kubernetes представляет собой очень сложную систему по сравнению с решением для оркестрования Docker, Docker Swarm. Чтобы понять, как работает Kubernetes, нам нужно понять его основные концепции и принципы.

Желательное состояние

Желательное состояние является одной из основных концепций Kubernetes. Вы можете определить состояние выполнения контейнеров внутри Pods. Если из-за сбоя контейнер перестает работать, Kubernetes воспроизводит Pod на основе строк нужного состояния.

Kubernetes строго гарантирует, что все контейнеры, работающие в кластере, всегда находятся в нужном состоянии. Это обеспечивается Kubernetes Master, который является частью плана управления Kubernetes. Вы можете использовать kubectl который напрямую взаимодействует с кластером, чтобы установить или изменить нужное состояние через Kubernetes API.

Объекты Kubernetes

Как указано в документации Kubernetes:

Объект Kubernetes – это «запись намерений» – как только вы создадите объект, система Kubernetes будет постоянно работать, чтобы убедиться, что объект существует. Создавая объект, вы эффективно сообщаете системе Kubernetes, как вы хотите, чтобы рабочая нагрузка вашего кластера выглядела; это желаемое состояние вашего кластера.

Состояние сущностей в системе в любой момент времени представлено объектами Kubernetes. Объекты Kubernetes также действуют как дополнительный абстракционный слой над интерфейсом контейнера. Теперь вы можете напрямую взаимодействовать с экземплярами объектов Kubernetes вместо взаимодействия с контейнерами. Основные объекты Kubernetes таковы:

  • Под является самым маленьким развернутым блоком на узле. Это группа контейнеров, которые должны работать вместе. Довольно часто, но не обязательно, стручок обычно содержит один контейнер.
  • Обслуживание используется для определения логического набора Pods и соответствующие политики, используемые для доступа к ним.
  • Объем по сути это каталог, доступный для всех контейнеров, работающих в Pod.
  • Пространства имен являются виртуальными кластерами, поддерживаемыми физическим кластером.

Существует ряд контроллеров, предоставленных Kubernetes. Эти контроллеры созданы на основе базовых объектов Kubernetes и предоставляют дополнительные функции. Контроллеры Kubernetes включают:

  • ReplicaSet обеспечивает выполнение определенного количества реплик Pod в любой момент времени.
  • Развертывание используется для изменения текущего состояния на нужное.
  • StatefulSet используется для обеспечения контроля за заказом развертывания и доступа к томам и т.п.
  • DaemonSet используется для запуска копии Pod на всех узлах кластера или на определенных узлах.
  • Работа используется для выполнения определенных задач и выхода после успешного завершения работы или через определенный период времени.

План управления Kubernetes

The План управления Kubernetes работает, чтобы текущее состояние кластера соответствовало желаемому состоянию. Для этого Kubernetes автоматически выполняет различные задачи, например запускает или перезапускает контейнеры, масштабирует количество реплик определенной программы и многое другое.

Как указано в документации Kubernetes:

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

Площина управления Kubernetes выполняет задачи по поддержанию нужного состояния по всему кластеру. Он записывает состояние объекта и непрерывно запускает цикл управления, чтобы проверить, соответствует ли текущее состояние объекта желаемому состоянию. Вы можете думать об этом как о правительстве, управляющем государством.

Мастер Kubernetes

Как часть Kubernetes Control Plane мастер Kubernetes работает над непрерывной поддержкой желаемого состояния во всем кластере. The kubectl Команда – это интерфейс для связи с главной частью Kubernetes кластера через Kubernetes API. Подумайте об этом как о полиции, ответственной за поддержание правопорядка.

Как указано в документации Kubernetes:

«Главный» относится к совокупности процессов, управляющих состоянием кластера. Обычно все эти процессы выполняются на одном узле в кластере и этот узел также называют главным. Мастер можно реплицировать для доступности и резервирования.

The Мастер Kubernetes контролирует и координирует все узлы в кластере с помощью трех процессов, выполняемых на одном или нескольких главных узлах в кластере. Каждый мастер Kubernetes в вашем кластере запускает эти три процесса:

  1. kube-apiserver: единственная точка управления для всего кластера. Сервер API реализует интерфейс RESTful для общения с инструментами и библиотеками. The kubectl Команда напрямую взаимодействует с сервером API.
  2. kube-контролер-менеджер: регулирует состояние кластера, управляя разными видами контроллеров.
  3. kube-планировщик: планирует рабочие погрузки на доступные узлы в кластере.

Узлы Kubernetes

Узлы Kubernetes – это, в основном, рабочие машины (ВМ, физические, голые серверы и т.п.) в кластере, на котором выполняются ваши рабочие нагрузки. Узлы контролируются мастером Kubernetes и постоянно контролируются для поддержания желаемого состояния программы. Раньше они были известны как миньоны (а не крошечная веселая желтая верная армия Игру). Подобно главному, каждый узел Kubernetes в вашем кластере запускает два процесса:

  1. кубелет является коммуникационным интерфейсом между узлом и Kubernetes Master.
  2. kube-прокси является сетевым прокси, отображающим услуги, определенные в Kubernetes API на каждом узле. Он также может выполнять простую переадресацию потоков TCP и UDP.

Приложение для голосования

Давайте повысим скорость, запустив приложение на Kubernetes. Но прежде чем вы сможете шагнуть дальше в удивительном мире Kubernetes, сначала вам нужно будет установить и запустить Kubernetes локально. Итак, начнем с этого. Пропустите это, если у вас установлен Kubernetes и MiniKube.

Установка Kubernetes

Kubernetes теперь поставляется с Docker Community Edition для версии 17.12+. Если у вас не установлен Community Edition, вы можете загрузить его здесь.

Установка MiniKube

Чтобы запустить Kubernetes локально, необходимо установить MiniKube. Он создает локальную виртуальную машину и запускает кластер одного узла. Даже не вздумайте запускать на нем свой производственный кластер. Его лучше всего использовать только для разработки и тестирования.

Кластер с одним узлом

Чтобы запустить кластер одного узла, нам просто нужно запустить файл minikube start команда. Вуал, работает виртуальная машина, кластер и Kubernetes.

$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

Чтобы убедиться, что ваши настройки прошли успешно, запустите kubectl version чтобы проверить, работает ли версия Kubernetes на вашем компьютере.

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-04T20:00:41Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

Приложение для голосования, наконец

Перемотайте вперед в программу Voting сейчас, когда вы установили Kubernetes на локальной машине. Это простое приложение на основе архитектуры микросервисов, состоящее из 5 простых сервисов.

c21Fn5g6pbiinwVWPYSSjqpcAIhckn17Wg0Z
Архитектура программы для голосования [https://github.com/docker/example-voting-app]
  1. Приложение для голосования: Интерфейс программы, написанный на Python, используемый пользователями для голосования.
  2. Redis: база данных в памяти, используемая в качестве промежуточного хранилища.
  3. Рабочий: Служба .Net, используемая для получения голосов из Redis и хранения в базе данных Postgres.
  4. DB: база данных PostgreSQL, используемая в качестве базы данных.
  5. Результат-приложение: Передняя часть программы, написанная на Node.js, отображает результаты голосования.

Git clone и cd в репо программы для голосования.

dockersamples/example-voting-app
example-voting-app – пример программы Docker Composegithub.com

Папка «k8s-specifications» содержит спецификации Kubernetes yaml для служб голосования. Для каждой службы имеется два файла yaml: файл службы и файл развертывания. Файл службы определяет логический набор модулей и политик вокруг них. Ниже приведен полученный сервисный файл из программы голосования.

apiVersion: v1
kind: Service
metadata:
  name: result
spec:
  type: NodePort
  ports:
  - name: "result-service"
    port: 5001
    targetPort: 80
    nodePort: 31001
  selector:
    app: result

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

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: result
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: result
    spec:
      containers:
      - image: dockersamples/examplevotingapp_result:before
        name: result

Время создания объектов сервиса и развертывания – неправда.

$ kubectl create -f k8s-specifications/
deployment "db" created
service "db" created
deployment "redis" created
service "redis" created
deployment "result" created
service "result" created
deployment "vote" created
service "vote" created
deployment "worker" created

Вот так! Ваша программа была успешно развернута в кластере одного узла, и вы можете перечислить запущенные модули и службы.

$ kubectl get pods
NAME                      READY     STATUS    RESTARTS   AGE
db-86b99d968f-s5pv7       1/1       Running   0          1m
redis-659469b86b-hrxqs    1/1       Running   0          1m
result-59f4f867b8-cthvc   1/1       Running   0          1m
vote-54f5f76b95-zgwrm     1/1       Running   0          1m
worker-56578c48f8-h7zvs   1/1       Running   0          1m
$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
db           ClusterIP   10.109.241.59    <none>        5432/TCP         2m
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          23m
redis        ClusterIP   10.102.242.148   <none>        6379/TCP         2m
result       NodePort    10.106.7.255     <none>        5001:31001/TCP   2m
vote         NodePort    10.103.28.96     <none>        5000:31000/TCP   2m

Вот война кошек против собак, в которой кошки всегда побеждают. Коты милы по своему дизайну, а их отношение к IDC – большая победа. Но это обсуждение в другой раз.

Возвращаясь к этому моменту, ваше приложение для голосования открывается на порту 30001, и программа результатов открывается на порту 31001. Вы можете получить доступ к нему с помощью localhost:port или, используя IP-адрес, на котором работает minikube, вы можете получить это с помощью minikube ip команда.

3uE3JBORlH9LiSrlHpVhXZqIPMCpBTBITHfJ
JQ76935N09c4g1KTzbGXH6U5bZPd6luvYbL1

Шпаргалка Kubernetes

Поскольку вы все проявили много терпения, просматривая эти блоки текста, позвольте мне сейчас представить вам шпаргалку Kubernetes (которая сама по себе могла бы быть совершенно новой статьей, но все равно!):

Команда миникубе:

# Start Minikube server
$ minikube start
# Get the Minikube IP
$ minikube ip

Информация о версии:

$ kubectl version             #Get kubectl version
$ kubectl cluster-info        #Get cluster info

Создание объектов:

$ kubectl create -f ./file.yml
$ kubectl create -f ./file1.yml -f ./file2.yaml
$ kubectl create -f ./dir
$ kubectl create -f http://www.fpaste.org/279276/48569091/raw/

Просмотр и поиск ресурсов:

# List all services in the namespace
$ kubectl get services
# List all pods in all namespaces
$ kubectl get pods --all-namespaces
# List all pods in the namespace, with more details   
$ kubectl get pods -o wide
# List a particular replication controller
$ kubectl get rc <rc-name>
# List all pods with a label env=production
$ kubectl get pods -l env=production

Список услуг, отсортированный по названию:

$ kubectl get services --sort-by=.metadata.name

Изменение и удаление ресурсов:

$ kubectl label pods <pod-name> new-label=awesome
$ kubectl annotate pods <pod-name> icon-url=
$ kubectl delete pod pingredis-XXXXX

Масштабирование вверх и вниз:

$ kubectl scale --replicas=3 deployment nginx

Взаимодействие с запущенными Pods:

$ kubectl logs <pod-name>
# Runs a tailf log output
$ kubectl logs -f <pod-name>
# Run pod as interactive shell
$ kubectl run -i --tty busybox --image=busybox -- sh
# Attach to Running Container
$ kubectl attach <podname> -i
# Forward port of Pod to your local machine
$ kubectl port-forward <podname> <local-and-remote-port>
# Forward port to service
$ kubectl port-forward <servicename> <port>               
# Run command in existing pod (1 container case)
$ kubectl exec <pod-name> -- ls /
# Run command in existing pod (multi-container case)
$ kubectl exec <pod-name> -c <container-name> -- ls /

Поиск DNS:

$ kubectl exec busybox -- nslookup kubernetes
$ kubectl exec busybox -- nslookup kubernetes.default
$ kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local

Создайте и придайте развертывание:

$ kubectl run nginx --image=nginx:1.9.12
$ kubectl expose deployment nginx --port=80 --type=LoadBalancer

Резюме

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

Солнечная сторона состоит в том, что Kubernetes легко интегрируется с любым портфолио облаков, будь то общедоступные, частные, гибридные или мультиоблачные. Облачные поставщики, такие как AWS и Google, предоставляют управляемые сервисы Kubernetes, таких как Elastic Container Service for Kubernetes (EKS) и Google Kubernetes Engine (GKE). Темная сторона состоит в том, что Kubernetes гораздо сложнее, чем собственный механизм оркестрирования контейнеров Docker Swarm.

Вся информация здесь была только для того, чтобы намочить ноги. Если вам хочется погрузиться в удивительный океан Kubernetes, вот вам.

ramitsurana/awesome-kubernetes
awesome-kubernetes — Кураторский список для замечательных источников kubernetes :ship::tada:github.com

После того, как вы выйдете из глубокого погружения, вы можете также захотеть получить в руки Kubernetes. Возьмите Kubernetes на прогулку или позвольте ему прокатиться с вами в лабораториях Play with Kubernetes.

Играйте с Kubernetes
Play with Kubernetes – это лабораторный сайт, предоставленный Docker и созданный Tutorius. Играйте с Kubernetes – это игровая площадка…labs.play-with-k8s.com

Надеюсь, эта статья помогла понять Kubernetes. Я хотел бы услышать, как вы используете Kubernetes в своих проектах. Хлопайте если это расширило ваши знания, и помогите им охватить больше людей.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *