Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes

RedDeveloper
26.03.2023 08:05
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes

Предварительные условия:

  • Основы машинного обучения
  • Основы Angular
  • Основы Flask
  • Основы Docker
  • Настольное приложение Docker
  • Как докеризировать ваше приложение - сквозная реализация (Angular & Flask) - Ссылка

Что такое Kubernetes?

  • Kubernetes, также известный как K8s, - это система оркестровки контейнеров с открытым исходным кодом. Она может использоваться для автоматизации оперативных задач управления контейнерами. По сути, она упрощает управление приложениями, предлагая ряд решений для удовлетворения ваших потребностей.
  • Первоначально он был разработан компанией Google в 2014 году, но сейчас его поддерживает Cloud Native Computing Foundation ( CNCF ).

Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая облегчает как декларативное конфигурирование, так и автоматизацию. Она имеет большую, быстро развивающуюся экосистему. Услуги, поддержка и инструменты 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 показан ниже:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-server-v3
spec:
  selector:
    matchLabels:
      app: flask-server-v3
  replicas: 2
  template:
    metadata:
      labels:
        app: flask-server-v3
    spec:
      containers:
      - name: flask-server-v3
        image: flask-server:3.0
        ports:
        - containerPort: 5011
  • Из кода видно, что мы создали две реплики с ограничениями на использование ресурсов. Приложение запускается на порту 80 контейнера.
  • Выполните развертывание, используя приведенный ниже код, и приложение Flask будет успешно развернуто.
kubectl apply -f server.deploy.yml

Развертывание Kubernetes для приложения Angular

  • Необходимо создать файл для развертывания Angular Kubernetes. Здесь он называется client.deploy.yaml. Код для развертывания приложения Angular показан ниже:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: client-service-v4
spec:
  selector:
    matchLabels:
      app: client-service-v4
  replicas: 2
  template:
    metadata:
      labels:
        app: client-service-v4
    spec:
      containers:
      - name: client-service-v4
        image: client:10.0
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
  • Из кода видно, что мы создали две реплики без ограничений на ресурсы. Приложение запускается на порту 5011 контейнера.
  • Выполните развертывание с помощью приведенного ниже кода, и приложение Angular будет успешно развернуто.
kubectl apply -f client.deploy.yml
  • После успешного развертывания приложений Flask и Angular при выполнении команды kubectl get deployments должны появиться записи, соответствующие заданным именам, как показано на скриншоте ниже.
Типы служб 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 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 показан ниже:
apiVersion: v1
kind: Service
metadata:
  name: flask-server-v3
spec:
  type: LoadBalancer
  selector:
    app: flask-server-v3
  ports:
  - port: 5011
    targetPort: 5011
  • Из кода видно, что создан сервис типа load balancer с пробросом порта с публичного порта 8096 на контейнерный порт 80.
  • Выполните службу с помощью приведенного ниже кода, и приложение Angular будет успешно развернуто.
kubectl apply -f server.service.yml

Служба Kubernetes для приложения Angular

  • Необходимо создать файл для Angular Kubernetes Service. Здесь он называется client.service.yaml. Код для Kubernetes Service приложения Angular показан ниже:
apiVersion: v1
kind: Service
metadata:
  name: client-service-v4
spec:
  type: LoadBalancer
  selector:
    app: client-service-v4
  ports:
  - port: 8096
    targetPort: 80
  • Из кода видно, что создан сервис типа load balancer с пробросом порта с публичного порта 5011 на контейнерный порт 5011.
  • Выполните развертывание с помощью приведенного ниже кода, и приложение Angular будет успешно развернуто.
kubectl apply -f server.service.yml
  • При успешном выполнении служб приложений Flask и Angular, при выполнении команды "kubectl get services" должны появиться записи, соответствующие заданным именам. Не учитывайте службу Kubernetes, которая используется для внутреннего пользования Kubernetes.
Типы служб Kubernetes

Тестирование

  • После выполнения вышеупомянутых шагов мы должны увидеть результат http://localhost:8096/ .
  • Скриншот запущенного ангулярного приложения:
Типы служб Kubernetes
  • Скриншот возвращаемого значения пароля с сервера Flask на основе данных, полученных из Angular:
Типы служб Kubernetes

Заключение

  • Таким образом, мы успешно использовали Kubernetes для оркестровки контейнеров для решения задачи End to End. Мы успешно создали две копии для фронтенда (Angular) и бэкенда (Flask) и соединили их с помощью конфигурации типа балансировщика нагрузки. Связь между двумя приложениями была успешно установлена с помощью механизма перенаправления портов.

Ссылки:

  • https://kubernetes.io/docs/concepts/
  • https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/
  • https://www.capitalone.com/tech/software-engineering/create-and-deploy-kubernetes-clusters/
  • https://eng.zemosolabs.com/kubernetes-what-is-it-what-problems-does-it-solve-how-does-it-compare-with-its-alternatives-937fe80b754f
  • https://www.armosec.io/blog/setting-up-kubernetes-cluster/
  • https://www.armosec.io/blog/kubernetes-deployment-and-service/
  • https://www.vmware.com/topics/glossary/content/kubernetes-deployment.html#:~:text=A%20Kubernetes%20Deployment%20tells%20Kubernetes, earlier%20deployment%20version%20if%20necessary
  • https://codefresh.io/learn/software-deployment/kubernetes-deployment-yaml/
  • https://medium.com/@zwhitchcox/matchlabels-labels-and-selectors-explained-in-detail-for-beginners-d421bdd05362
  • https://www.goglides.dev/bkpandey/matchlabels-labels-and-selectors-in-deployment-5fk1
  • https://sysdig.com/blog/kubernetes-limits-requests/
  • https://medium.com/@deepeshtripathi/all-about-kubernetes-port-types-nodeport-targetport-port-containerport-e9f447330b19
  • https://cloud.google.com/learn/what-is-kubernetes#:~:text=Kubernetes%20automates%20operational%20tasks%20of,it%20easier%20to%20manage%20applications.
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.