Эксплуатация Kubernetes

Материал из Rosalab Wiki
Перейти к: навигация, поиск

Руководство по Kubernetes

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

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

Давайте вспомним что такое контейнеры.

Контейнеры упаковывают сервисы, составляющие приложение, и делают их переносимыми в различные вычислительные среды как для разработки и тестирования, так и для производственного использования. С помощью контейнеров легко быстро наращивать количество экземпляров приложений, чтобы соответствовать пиковому спросу. А поскольку контейнеры используют ресурсы ОС хоста, они намного легче виртуальных машин. Это означает, что контейнеры очень эффективно используют базовую серверную инфраструктуру. Все было бы отлично, но есть одно но - container runtime API (API среды запуска контейнера) хорошо подходит для управления отдельными контейнерами, но совершенно не подходит для управления приложениями на сотне контейнеров и на большом количестве хостов. Контейнерам надо подключаться к внешнему миру и быть управляемыми для балансировки нагрузки, распределения и планирования. Вот для такого и нужен 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 без изменений образов контейнеров и не раскрывая конфиденциальную информацию в конфигурации стека. Как видим на рисунке, это наглядная демонстрация того что есть внутри Kubernetes на примере одной мастер ноды (Master node) и одной воркер ноды (Worker node).

На Master node находится Kubernetes Control Plane (kube-scheduler, kube-controller-manager, kube-apiserver, etcd), с помощью которой происходит управление всем кластером Kubernetes. На Worker node находятся container runtime (среда запуска контейнера), kubelet и kube-proxy. Сontainer runtime это то на чем будет запущен ваш Под (например Docker, Container D, Rocket и т.д.). Kubelet это основной «агент узла», который работает на каждой ноде. Гарантирует, что контейнеры в Pod(поде)работают и исправны. Не управляет контейнерами, которые не были созданы Kubernetes. Kube-proxy это демон на каждой ноде, управляет правилами iptable на хосте для достижения балансировки нагрузки службы (одна из реализаций) и следит за изменениями Service и Endpoint. Также вы сможете получить ответы на такие вопросы как организовано сетевое взаимодействие в Kubernetes, как опубликовать приложение и как работает DNS в Kubernetes. Ну и как же без такого важного вопроса как хранение данных, мониторинг и Kubernetes secrets Hashicorp Vault.

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

1. Установка всех зависимостей kubernates

# dnf install -y kubelet kubeadm kubectl docker

2. Запуск и добавление в автозагрузку сервисов

# systemctl enable docker.service
# systemctl enable containerd.service
# systemctl start docker.service
# systemctl start containerd.service
# systemctl enable kubelet
# systemctl start kubelet

3.Добавляем узлы в hosts (master,worker)

# hostnamectl set-hostname master-node
# vi /etc/hosts
10.45.4.58 master-node
10.45.4.59 worker-node

4.Отключаем swap

#sed -i '/swap/d' /etc/fstab
#swapoff -a

6.Инициализация kubernates

#kubeadm init

7.Установщик даст токен подключения к master node, у вас будет свой токен подключения

kubeadm join 10.45.4.58:6443 --token ncb63c.pugf9xehkjakptqp --discovery-token-ca-cert-hash sha256:73cb40755a49b40f2a724984392f32fd7ff607a437da524619d4aba43a2c31b6

8.Создаем каталоги нужные для 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'

9.Добавляем сеть для работоспособности kubernates

# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

10.Перезагружаем kubernates

# systemctl restart kubelet

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

1.Устанавливаем docker

# dnf install docker

2. Запуск и добавление в автозагрузку сервисов docker

# systemctl start docker
# systemctl enable docker

3. Установка всех зависимостей kubernates

# yum install -y kubelet kubeadm kubectl

4. Добавляем в автозагрузку kubernates

# systemctl enable kubelet

5.Измененяем имя виртуального узла

# hostnamectl set-hostname worker-node

6.Добавляем узлы в hosts

# vi /etc/hosts
10.45.4.58 master-node
10.45.4.59 worker-node

7.Отключаем swap

#sed -i '/swap/d' /etc/fstab
#swapoff -a

8. Присоединяем worker-node к master, токен берем из предыдущего этапа установка master nodes, пункт 7:

# kubeadm join 10.45.4.58:6443 --token ncb63c.pugf9xehkjakptqp --discovery-token-ca-cert-hash sha256:73cb40755a49b40f2a724984392f32fd7ff607a437da524619d4aba43a2c31b6

9.Перезапуск сервиса

# systemctl restart kubelet.service

10.Проверка работоспособности

Создание 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

11.Применение deployment плана

#kubectl apply –f deploy.yml