Kubernetes, также известный как K8s, - это система оркестровки контейнеров с открытым исходным кодом. Она может использоваться для автоматизации оперативных задач управления контейнерами. По сути, она упрощает управление приложениями, предлагая ряд решений для удовлетворения ваших потребностей.
Первоначально он был разработан компанией Google в 2014 году, но сейчас его поддерживает Cloud Native Computing Foundation ( CNCF ).
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая облегчает как декларативное конфигурирование, так и автоматизацию. Она имеет большую, быстро развивающуюся экосистему. Услуги, поддержка и инструменты Kubernetes широко доступны. - Документация по Kubernetes
Проблемы, преодолеваемые Kubernetes:
Обнаружение сервисов: Если есть приложение, состоящее из множества микросервисов, которые должны надежно и эффективно взаимодействовать друг с другом, то Kubernetes может взять это на себя.
Балансировка нагрузки: Если трафик приложения высок, Kubernetes может распределить входящий трафик.
Масштабирование: Существует два типа масштабирования. Это горизонтальное масштабирование и вертикальное масштабирование. Горизонтальное масштабирование означает увеличение количества экземпляров. Вертикальное масштабирование означает увеличение ресурсов (памяти, процессора и т.д.) одного экземпляра. Kubernetes способен выполнять оба вида масштабирования
Самовосстановление: Если какая-либо из служб выйдет из строя, Kubernetes автоматически создаст новую копию службы.
Автоматизированное развертывание и откат: Kubernetes может позаботиться об операциях развертывания, таких как развертывание новой версии приложения и откат к предыдущей версии.
Секретность и управление конфигурацией. Kubernetes предоставляет встроенные механизмы для эффективного хранения и управления конфигурацией (например, переменные среды, соединения с базой данных) в различных средах (например, производственная, тестовая, разработка).
Оркестровка хранилищ. Эффективное управление хранилищем может быть достигнуто с помощью Kubernetes. При этом управление хранилищем разделяется на несколько этапов. Выделенное хранилище сначала настраивается, а затем делается запрос на требование, когда приложению в кластере требуется это хранилище. Kubernetes обеспечивает отличную интеграцию с различными решениями для хранения данных, поддерживаемыми облачными провайдерами.
Архитектура Kubernetes
Архитектура Kubernetes включает в себя две основные части, а именно:
Главный узел или плоскость управления
Рабочие узлы
Kubernetes состоит из семи ключевых компонентов, сгруппированных под Master Node и Worker Node. К ним относятся:
Главный узел / Компоненты плоскости управления
Сервер API - используется для раскрытия API Kubernetes. Он действует как фронт-энд для плоскости управления Kubernetes. Основной реализацией API-сервера является kube-apiserver. Он разработан для горизонтального масштабирования, т.е. можно запустить несколько экземпляров kube-apiserver и сбалансировать трафик между этими экземплярами.
Планировщик - следит за вновь созданными Pods без назначенного узла и выбирает узел для их запуска.
Менеджер контроллеров - запускает процессы контроллеров. Логически каждый контроллер является отдельным процессом, но для снижения сложности все они объединены в один двоичный файл и выполняются в одном процессе.
Etcd - это последовательное и высокодоступное хранилище ключевых значений. Оно используется в качестве резервного хранилища Kubernetes для всех данных кластера.
Компоненты рабочего узла
Kubelet - это агент, который запускается на каждом узле кластера. Он следит за тем, чтобы контейнеры были запущены в pod. Он гарантирует, что контейнеры, описанные в PodSpecs, запущены и здоровы.
Kube-proxy - Это сетевой прокси, который запускается на каждом узле вашего кластера. Он отвечает за реализацию сервисной концепции Kubernetes. Kube-proxy, по сути, поддерживает сетевые правила на узлах. Эти сетевые правила позволяют сетевому взаимодействию с вашими подсистемами из сетевых сессий внутри или вне вашего кластера.
Время выполнения контейнеров - это программное обеспечение, которое отвечает за запуск контейнеров. Kubernetes поддерживает множество режимов выполнения контейнеров, таких как Docker, Containerd, CRI-O и т.д. На этой схеме под временем выполнения контейнеров подразумевается Docker.
Схема создания кластера Kubernetes
Создание контейнера Docker
Создание развертывания Kubernetes
Создание службы Kubernetes
Что такое контейнеризация?
Обратитесь к одному из моих предыдущих блогов, в котором подробно рассказывается о контейнеризации - Ссылка .
Что такое развертывание Kubernetes?
Развертывание Kubernetes указывает Kubernetes, как создавать или изменять экземпляры капсул, в которых хранится контейнерное приложение. Развертывание может помочь в масштабировании копий стручков, в контролируемом распространении обновленного кода или в откате к более ранней версии, если это необходимо.
При развертывании Kubernetes мы описываем желаемое состояние. Контроллер развертывания изменяет фактическое состояние на желаемое. Развертывание используется для обеспечения доступности приложений. Для этого он поддерживает желаемое количество работающих стручков и заменяет нездоровые стручки новыми.
Что такое Kubernetes Service?
Из определения развертывания мы можем заметить, что pod имеет IP, который меняется при замене на новый pod, т.е. IP вашего приложения часто меняется. Таким образом, установление стабильной связи между внешним миром и вашим приложением или между вашими приложениями внутри кластера является сложной задачей.
Для решения этой проблемы можно использовать службу Kubernetes. Служба Kubernetes состоит из набора правил таблицы IP-адресов в кластере. Таким образом, служба может открыть развертывание Kubernetes, предложив перед ним статический IP. Таким образом, вместо того чтобы напрямую обращаться к стручкам, мы будем обращаться к сервису, который затем направляет трафик к вашим стручкам.
Типы служб Kubernetes
ClusterIP - Это тип службы по умолчанию, создающий внутреннюю службу перед вашим развертыванием. Эта служба рекомендуется только для установления внутрикластерной связи между приложениями в вашем кластере.
NodePort - этот тип службы можно использовать для публичного предоставления службы без балансировщика нагрузки. Это часто используется для тестирования или в локальном кластере.
Балансировщик нагрузки - этот тип сервиса может решить проблему сбоев узлов, обеспечивая высокую доступность. При этом будет открыт только порт балансировщика нагрузки и отпадет необходимость открывать порты на вашем узле для публичного доступа.
Пример реализации
В этом примере реализации мы будем использовать Angular в качестве фронт-энда и Flask в качестве бэк-энда. Приложение, которое мы пытаемся реализовать здесь, представляет собой базовое приложение для определения надежности пароля на основе ML.
Пожалуйста, ознакомьтесь с этим блогом, чтобы узнать больше о моделировании ML, настройке Angular и Flask для этого приложения. Чтобы понять, как докеризировать приложение Angular и Flask, посмотрите этот блог.
В этом блоге мы больше сосредоточимся на части, связанной с Kubernetes. Кодовая база, используемая для всей этой сквозной установки, находится здесь .
Создание развертывания Kubernetes
Пример кода развертывания с определением:
apiVersion: XXX # Defines which version of Kubernetes API to use
kind: XXX # Represents the REST resource this object represents
metadata: # Defines the data that helps in uniquely identifying the object
name: XXX # Name of the Deployment
spec: # Defines the specification of the desired state
selector: # Used to specify the group of objects for an operation
matchLabels: # Tells what pods the deployment will apply to
app: XXX # Selector will look for pods with the specified app name
replicas: XXX # Specifies how many pods to run
template: # Specifies the pod template details
metadata: # Defines the data that helps in uniquely identifying the template
labels: # Used to specify the labels or name
app: XXX # Defines the name of the pod
spec: # Defines the specifications for the pod template
containers: # Define the containers to be created inside the pods
- name: XXX # Specifies the name of the container to be created
image: XXX # Specifies which container image to run in the pods
resources: # Used to define the constraints for the resource usage
limits: # The limits to be applied for each container. If exceeded, it will be killed
memory: XXX # Each container should not exceed 128 Mi of memory
cpu: XXX # Each container should not exceed 500m (50% of a core) of memory
ports: # Specifies details about the port handling
- containerPort: XXX # Defines the port on which app can be reached inside the container
Развертывание Kubernetes для приложения Flask
Необходимо создать файл для Flask Kubernetes Deployment. Здесь он называется server.deploy.yaml. Код для развертывания приложения Flask показан ниже:
Из кода видно, что мы создали две реплики с ограничениями на использование ресурсов. Приложение запускается на порту 80 контейнера.
Выполните развертывание, используя приведенный ниже код, и приложение Flask будет успешно развернуто.
kubectl apply -f server.deploy.yml
Развертывание Kubernetes для приложения Angular
Необходимо создать файл для развертывания Angular Kubernetes. Здесь он называется client.deploy.yaml. Код для развертывания приложения Angular показан ниже:
Из кода видно, что мы создали две реплики без ограничений на ресурсы. Приложение запускается на порту 5011 контейнера.
Выполните развертывание с помощью приведенного ниже кода, и приложение Angular будет успешно развернуто.
kubectl apply -f client.deploy.yml
После успешного развертывания приложений Flask и Angular при выполнении команды kubectl get deployments должны появиться записи, соответствующие заданным именам, как показано на скриншоте ниже.
Создание службы Kubernetes
Пример кода службы с определениями
apiVersion: XXX # Defines which version of Kubernetes API to use
kind: XXX # Represents the REST resource this object represents
metadata: # Defines the data that helps in uniquely identifying the object
name: XXX # Name of the Service
spec: # Defines the specification of the desired state
type: XXX # Defines the type of service
selector: # Used to specify the group of objects for an operation
app: XXX # Selector will look for pods with the specified app name
ports: # Specifies details about the port handling
- port: XXX # Specifies the public port which the service will be exposed on
targetPort: XXX # Specifies the target port, for forwarding from the public port
Служба Kubernetes для приложения Flask
Необходимо создать файл для Flask Kubernetes Service. Здесь он называется server.service.yaml. Код для Kubernetes Service приложения Flask показан ниже:
Из кода видно, что создан сервис типа load balancer с пробросом порта с публичного порта 8096 на контейнерный порт 80.
Выполните службу с помощью приведенного ниже кода, и приложение Angular будет успешно развернуто.
kubectl apply -f server.service.yml
Служба Kubernetes для приложения Angular
Необходимо создать файл для Angular Kubernetes Service. Здесь он называется client.service.yaml. Код для Kubernetes Service приложения Angular показан ниже:
Из кода видно, что создан сервис типа load balancer с пробросом порта с публичного порта 5011 на контейнерный порт 5011.
Выполните развертывание с помощью приведенного ниже кода, и приложение Angular будет успешно развернуто.
kubectl apply -f server.service.yml
При успешном выполнении служб приложений Flask и Angular, при выполнении команды "kubectl get services" должны появиться записи, соответствующие заданным именам. Не учитывайте службу Kubernetes, которая используется для внутреннего пользования Kubernetes.
Тестирование
После выполнения вышеупомянутых шагов мы должны увидеть результат http://localhost:8096/ .
Скриншот запущенного ангулярного приложения:
Скриншот возвращаемого значения пароля с сервера Flask на основе данных, полученных из Angular:
Заключение
Таким образом, мы успешно использовали Kubernetes для оркестровки контейнеров для решения задачи End to End. Мы успешно создали две копии для фронтенда (Angular) и бэкенда (Flask) и соединили их с помощью конфигурации типа балансировщика нагрузки. Связь между двумя приложениями была успешно установлена с помощью механизма перенаправления портов.
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.