Kubernetes

Общие сведения

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

Kubernetes по сути является не просто системой оркестрации. Технически оркестрация это про выполнение определенного рабочего процесса: сначала сделай A, затем B, затем C. Kubernetes же устраняет прямую необходимость в этом. В нем есть процессы управления, по факту независимые и компонуемые. Главная задача процессов управления – перевести текущее состояние к нужному состоянию. В этом случае неважно какой будет маршрут от А до С, что исключает централизованный контроль. Благодаря этому Система теперь проще в использовании, мощная, надежная, а также устойчивая и расширяемая.

Контейнеры позволяют поделить приложения на более мелкие части с четким разделением задач. Уровень абстракции, предоставляемый для отдельного образа контейнера, позволяет понять, как строятся распределенные приложения. Такой модульный подход дает возможность быстрее осуществлять разработку с помощью небольших и более целенаправленных групп, каждая из которых отвечает за определенные контейнеры. Это также позволяет изолировать зависимости и шире использовать компоненты меньшего размера. Сделать это только с помощью контейнеров не получится. А вот в Kubernetes это можно достичь с помощью Pods (подов). Pod (под) – это группа из одного или более контейнеров с общим хранилищем/сетевыми ресурсами и спецификацией запуска контейнеров или отдельный инстанс (экземпляр объекта) приложения. Размещая контейнеры таким образом, Kubernetes устраняет соблазн втиснуть слишком много функций в один образ контейнера. Концепция Service (Сервисы) в Kubernetes используется для группирования нескольких подов, которые выполняют те же функции. Сервисы легко настраиваются для таких целей, как обнаружение, горизонтальное масштабирование и балансировка нагрузки. Kubernetes согласно официальной документации так же сможет предоставить:

  • Используя имя DNS или собственный IP-адрес мониторинг сервисов и распределение нагрузки, Kubernetes может обнаружить контейнер. При высоком трафике в нем Kubernetes сбалансирует нагрузку и распределит сетевой трафик так, что развертывание будет стабильным.
  • Система хранения по выбору (например, локальное хранилище, провайдеры общедоступного облака и многое другое) может быть автоматически смонтирована с помощью оркестрации хранилища Kubernetes.
  • Автоматическое развертывание и откаты. Kubernetes через описание желаемого состояния развернутых контейнеров (манифесты, которые пишутся на YAML) может изменить фактическое состояние на желаемое. То есть создание новых контейнеров для развертывания, удаления существующих контейнеров и распределения всех их ресурсов в новый контейнер в Kubernetes можно автоматизировать.
  • Автоматическое распределение нагрузки. Kubernetes сам размещает контейнеры на узлах так, чтобы наиболее эффективно использовать ресурсы. Администратору остается только указать сколько ЦП и ОЗУ требуется каждому контейнеру и предоставить кластер узлов, на котором будут запущены контейнеры.
  • Самоконтроль. Если в работе контейнеров что-то пошло не так, то Kubernetes сам перезапускает, заменяет и завершает работу контейнеров, которые не проходят проверку работоспособности.
  • Управление конфиденциальной информацией и конфигурацией. Пароли, OAuth-токены и ключи SSH могут храниться и управляться Kubernetes без изменений образов контейнеров и без раскрытия конфиденциальной информации в конфигурации стека.

Установка kubernates master-node

Установка kubernates master-node проводится следующим образом:

  1. установка всех зависимостей kubernates:
dnf install -y kubelet kubeadm kubectl docker
  1. запуск и добавление в автозагрузку сервисов:
systemctl enable docker.service
systemctl enable containerd.service
systemctl start docker.service
systemctl start containerd.service
systemctl enable kubelet
systemctl start kubelet
  1. добавление узлов в hosts (master, worker):
hostnamectl set-hostname master-node
vi /etc/hosts
10.45.4.58 master-node
10.45.4.59 worker-node
  1. отключение swap:
#sed -i '/swap/d' /etc/fstab
#swapoff -a
  1. инициализация kubernates:
#kubeadm init
  1. выдача установщиком токена подключения к master node:
kubeadm join 10.45.4.58:6443 --token ncb63c.pugf9xehkjakptqp --discovery-token-ca-cert-hash sha256:73cb40755a49b40f2a724984392f32fd7ff607a437da524619d4aba43a2c31b6
  1. создание каталогов, необходимых для kubernates:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export kubever=$(kubectl version | base64 | tr -d '\n'
  1. добавление сети для работоспособности kubernates:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
  1. перезагрузка kubernates:
systemctl restart kubelet

Установка kubernates worker-nodes (pods-контейнеры)

Установка kubernates worker-nodes выполняется следующими шагами:

  1. установка docker:
dnf install docker
  1. запуск и добавление в автозагрузку сервисов docker:
systemctl start docker
systemctl enable docker
  1. установка всех зависимостей kubernates:
dnf install -y kubelet kubeadm kubectl
  1. добавление автозагрузку kubernates:
systemctl enable kubelet
  1. изменение имени виртуального узла:
hostnamectl set-hostname worker-node
  1. добавление узлов в hosts:
vi /etc/hosts
10.45.4.58 master-node
10.45.4.59 worker-node
  1. отключение swap:
#sed -i '/swap/d' /etc/fstab
#swapoff -a
  1. присоединение worker-node к master (токен – из предыдущего этапа):
kubeadm join 10.45.4.58:6443 --token ncb63c.pugf9xehkjakptqp --discovery-token-ca-cert-hash sha256:73cb40755a49b40f2a724984392f32fd7ff607a437da524619d4aba43a2c31b6
  1. перезапуск сервиса:
systemctl restart kubelet.service
  1. создание deployment-плана:
vi deploy.yml
apiVersion : apps/v1 #версия api
kind: Deployment #Принципал deployment
metadata: #Метаданные
name: my-web-deployment
labels:
app : my-k8s-application
spec: #Описание контейнера
selector:
matchLabels:
project: kgb #Проект
template: #Шаблон для контейнера
metadata:
labels:
project: kgb
spec:
containers: #Контейнер
- name : kgb-web #Имя контейнера
image: Debian #Имидж на котором будет основываться контейнер
ports: #Порт который нужно пробросить в хост машину
- containerPort: 80
  1. применение deployment плана:
#kubectl apply –f deploy.yml