/ Docker

Kubernetes

Контейнеры проникают везде. Когда контейнеров много, ими нужно уметь управлять, иначе такая система будет хрупкой и сыпаться от лёгкого прикосновения. В настоящее время мне известно 2 основные системы оркестрации контейнеров: Docker swarm и Kubernetes. Я не работа не со swarm, не с kubernetes прежде. Поэтому здесь буду делать некоторые заметки. Больше шума, как мне кажется, вокруг kubernetes. Первое что меня привлекло, это хорошая документация и туториалы. На сколько реально хорошая документация не известно, но пока мне нравится.

Kubernetes basics

https://kubernetes.io/docs/tutorials/kubernetes-basics/ - интерактивный туториал, выглядит не плохой штукой. Весь туториал проходит с minikube, всё настроено и доступно через веб-браузер.

1. Создаём кластер

Дальше фактически идут шаги туториала, лучше обратиться к нему.

minikube version - проверим

minikube start - стартуем Node.

kubectl version - проверяем клиент, через него и будем дальше работать

kubectl cluster-info - UI для информации о кластере

kubectl get nodes - показать все ноды.

2. Deployment

Создание и управление деплойментом осуществляется через kubectl.

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

kubectl run - создаёт новый деплоймент

kubectl get deployments - вернёт список деплойментов

пример запуска

kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080

kubectl run <название деплоймента> --image=<Докер образ вместе с название репозитория:тег> --port=<порт>

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

По умолчанию приложения будут доступны только внутри kubernetes кластера.

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

kubectl proxy

Приложение запускается внутри Pod, его нужно импортировать в переменную среды POD_NAME

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')


echo Name of the Pod: $POD_NAME

проверить работу можно с curl:

curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/

3. Expose

Kubernetes Pods - Следующий ключевой термин, представляет собой одно или больше приложений и общие ресурсы:

  • хранилище
  • сеть, как уникальный IP кластера
  • информация о том, как запускать каждый контейнер, а также образ контейнера или определённый порт

Что есть что, лучше посмотреть в туториале, там все расписано очень подробно.

Каждый нод, имеет как минимум запущенный процесс Kubelet ответственный за коммуникации между мастером и нодами и что-то для запуска контейнеров (Docker или rkt).

Источник рисунка

Наиболее важные команды при поиске неисправностей:

kubectl get - список ресурсов

kubectl describe - показывает подробную информацию о ресурсе

kubectl logs - выводит логи из контейнера в pod-e

kubectl exec - запускает команду в контейнере в определённом pod


Проверим pods

kubectl get pods

Запустим команду

kubectl exec $POD_NAME env

4. публичный Expose приложения

У pods есть свои собственные IP. Поскольку pods могут меняться, удаляться нужно обеспечить, чтобы они находили друг друга. Для этого в kubernetes вводится ещё одна абстракция: Services, этот слой определяет логический набор pods, которые включают внешний трафик, балансировку нагрузки и обнаружение их pods.

Если вы собираетесь открыть сервис наружу кластера, есть несколько опций:

  • LoadBalancer - предоставляет публичный IP. (который мог бы использоваться когда вы запускаете Kubernetes на GCP или AWS)
  • NodePort - предоставляет сервис на тот же порт для каждого узла кластера используя NAT (доступно на всех Kubernetes кластерах и Minikube)

Ещё один термин: Labels. Это пары ключ/значение, которые добавляются к объектам. Это подобно хештегам в соц. сетях.

Они используются чтобы организовать связанные объекты, например:

  • Production environment (production, test, dev)
  • Application version (beta, v1.3)
  • Type of service/server (frontend, backend, database)

Метки можно добавить и изменить в любое время.

kubectl get services - вернёт список сервисов, по умолчанию доступен kubernetes, он создаётся при запуске minikube.

для создания нового сервиса нужно запустить:

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

minikube поддерживает только NodePort пока.

вывод на экран будет примерно следующим:

NAME                  CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE                             
kubernetes            10.0.0.1     <none>        443/TCP          4m                              
kubernetes-bootcamp   10.0.0.63    <nodes>       8080:30710/TCP   15s    

Запустив команду:

kubectl describe services/kubernetes-bootcamp

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

для удобства можно создать переменную среды:

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')


echo NODE_PORT=$NODE_PORT

теперь можно:

curl host01:$NODE_PORT

теперь про labels

Так можно получить все pods с заданной меткой:

kubectl get pods -l run=<метка>

аналогичным образом для сервисов.

чтобы добавить метку:

kubectl label pod $POD_NAME app=v1

проверить

kubectl describe pods $POD_NAME

Для удаление сервиса нужна команда:

kubectl delete service -l run=<имя метки>

Масштабирование приложения

Масштабирование осуществляется изменением числа реплик в деплойменте.

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

kubectl scale deployments/<имя деплоймента> --replicas=4

результат будет виден после запуска команды:

kubectl get deployments  

также

kubectl get pods -o wide

должна вывести 4-ре pods.

По умолчанию сервис будет балансировать нагрузку между pods.

Для уменьшения количества реплик:

kubectl scale deployments/kubernetes-bootcamp --replicas=2

6. Обновление приложения

Kubernetes позволяет выполнять выполнять rolling-обновления. Таким образом приложение будет обновлено без остановки. В Kubernetes каждое обновление версионированно, и позволяет выполнить откат.

Rolling обновления позволяют следующие действия:

  • переместить приложение с одной среды на другую (через обновления образов контейнеров)
  • Откат к предыдущим версиям
  • CI и CD приложения с нулевым временем остановки

Для обновления нужно только установить нужную версию:

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

Будут созданы новые pods и уничтожены старые, можно наблюдать с помощью kubectl get pods

Для проверки статуса:

kubectl rollout status deployments/kubernetes-bootcamp

для отката

kubectl rollout undo deployments/kubernetes-bootcamp

Заключение

На этом заканчивается официальный туториал для начинающих. Советую его и проходить. Информация здесь больше как шпаргалки.

Kubernetes
Share this

Subscribe to Yet another blog