Эксплуатация Kubernetes
Руководство по 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 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