Эксплуатация Kubernetes — различия между версиями
Строка 1: | Строка 1: | ||
− | |||
− | |||
Руководство по Kubernetes | Руководство по Kubernetes | ||
Строка 119: | Строка 117: | ||
11.Применение deployment плана | 11.Применение deployment плана | ||
#kubectl apply –f deploy.yml | #kubectl apply –f deploy.yml | ||
+ | |||
+ | [[Категория:ROSA Server|ROSA Server]] |
Версия 12:40, 27 августа 2021
Руководство по 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
# yum install -y kubelet kubeadm kubectl docker docker-containerd
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
# yum install docker docker-containerd
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