Рубрики
Без рубрики

Azure Functions работает на Kubernetes с использованием KEDA

Вы когда-нибудь слышали о KEDA? Нет? SOOOO, просто возьми кофе или как вы хотите, и следуйте за мной … Теги от Кубернаны, кеда, питона, лазурного.

Вы когда-нибудь слышали о KEDA?

Нет? SOOOO, просто возьми кофе или все, что вы хотите, и следуйте за мной товары!

Что такое кеда?

Кеда является автоскалером, ориентированным на событие, основанное на Кубейнетах. Был разработан Microsoft и Red Hat, и теперь это облачный нативный вычислительный фонд (CNCF) Sandbox Project. С KEDA вы можете просто масштабировать приложение любого контейнера в Kubernetes на основе количества событий. Это означает, что вы можете создать любое приложение, которое представляет собой привод событий и получить его, когда что-то прибывает и достаньте его, когда он там ничего. Это делает стоимость вашей приложения ниже при запуске в облачном провайдере как AWS, Azure или GCP. Вы можете использовать KEDA для шкалы на базе в очереди на rabbitmq, Azure Service Bus, Kafka. Используя использование CPU, как CRON, на запросах MongoDB и многое другое

Удивительно, не так ли? 🤓

Отлично, но как это работает?

Я упадут здесь мой образец на Github Отказ В этом руководстве я покажу вам, насколько просто создается функция Azure, используя Python ❤️ и развернуть его на AX. Я также покажу конвейер, который будет развернуть эту функцию автоматически к вашим аквам.

Хорошо, разговор дешево и давайте код!

До реквизиты

Для запуска наших функций Python нам нужна пара вещей.

  1. Прежде всего, нам нужен Azure подписка создать наши AKS и Azure ServiceBus. Бесплатная пробная пробное, что он просто отлично подходит для его создания.
  2. Мы собираемся использовать Функции Azure Основные инструменты Для создания, начните и запустить наши функции.
  3. Установить Докер и а Dockerhub Учетная запись необходима.
  4. Kubectl смотреть красоту детей вставать.
  5. Репозиторий на Github, Gitlab, Azure DEVOPS REPOS, …
  6. Это не должно. Но если вы хотите развернуть его с помощью трубопровода Azure из примера, вам необходимо войти в систему Azure DEVOPS и запустить трубопровод. Но если у вас есть другой трубопровод CI/CD или хотите развернуть по-другому, это тоже достаточно честно.

Давайте начнем!!

Прежде всего, мы должны создать начать проект на Azure DEVOPS REPOS, GitHub или Gitlab. Вам просто нужно настроить ваш Azure DEVOPS для подключения к вашему репозитории для запуска трубопровода при желании. После создания клонируйте ваш проект на вашу машину.

Отсюда я предполагаю, что у вас уже есть Акс Кластер, созданный с KEDA 2.1 установлены, a ServiceBus с очередью и соединительной строкой.

1. Начать функцию

С помощью инструментов функций Azure довольно легко запустить функции. Нам просто нужно бежать

func init . --docker

И это все люди! Спасибо за прочтение… Просто шучу 🤣

После этой команды вы увидите в своем терминале что-то вроде

Select a number for worker runtime:
1. dotnet
2. node
3. python
4. powershell
5. custom
Choose option:

Прямо здесь вы выберете опцию 3. После этого наш проект будет запущен с DockerFile, который готов к запуску функции Python. Но это еще не сделано. Нам нужно создать нашу функцию.

2. Создание функции

На шаге 1 мы только что начали наш проект. Теперь мы создадим нашу функцию, запущенную команду

func new

И теперь мы выберем, какой шаблон нам нужен для этой функции. Для этого учебника вы должны выбрать опцию 11.

Select a number for template:
1. Azure Blob Storage trigger
2. Azure Cosmos DB trigger
3. Durable Functions activity
4. Durable Functions HTTP starter
5. Durable Functions orchestrator
6. Azure Event Grid trigger
7. Azure Event Hub trigger
8. HTTP trigger
9. Azure Queue Storage trigger
10. RabbitMQ trigger
11. Azure Service Bus Queue trigger
12. Azure Service Bus Topic trigger
13. Timer trigger
Choose option: 

После этого мы должны выбрать имя для нашей функции. Вы можете выбрать имя, которое вы хотите.

Azure Service Bus Queue trigger
Function name: [ServiceBusQueueTrigger] 

После создания нашей функции мы должны изменить файл local.settings.json и включите соединение ServiceBus, как

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsStorage": ""
  }
}

А в папке, которая была создана наши функции, нам нужно также включить имя очереди

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "msg",
      "type": "serviceBusTrigger",
      "direction": "in",
      "queueName": "",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

И пока наша функция готова !! 🎉 🎊

3. Тестирование этого локально

Чтобы запустить нашу функцию, просто запустите

func start

И это начнется. Для тестирования это, я создал сценарий Python, который в моем образец GitHub, который я разместил здесь, но это просто сделать это И я покажу тебе. Нам нужно экспортировать AzurewebjobsStorage и Queue_Name в нашу ОС, как:

export AzureWebJobsStorage=''
export QUEUE_NAME=

Экспорт его, вы можете создавать или использовать сценарий:

import os
import sys
import time
from logger import logger
from azure.servicebus import ServiceBusClient, ServiceBusMessage

connection_string = os.environ['AzureWebJobsStorage']
queue_name = os.environ['QUEUE_NAME']

queue = ServiceBusClient.from_connection_string(conn_str=connection_string, queue_name=queue_name)


def send_a_list_of_messages(sender):
    messages = [ServiceBusMessage("Message in list") for _ in range(100)]
    sender.send_messages(messages)
    logger.info("Sent a list of 100 messages")


with queue:
    sender = queue.get_queue_sender(queue_name=queue_name)
    with sender:
        send_a_list_of_messages(sender)

logger.info("Done sending messages")
logger.info("-----------------------")

Этот скрипт отправит 100 событий в очередь ServiceBus, и ваша функция работает на местном уровне, потребляет все это события.

Хорошо, сейчас мы создали нашу функцию и проверили ее! Теперь нам нужно развернуть его к нашим аквам. Как я записал здесь, я буду использовать Azure-Pipeline.yml для развертывания.

4. Проявляет файлы и развертывание трубопровода

В этом проекте я создал папку под названием проявляется И там у нас есть 2 файла. Развертывание .yml что мы будем использовать, чтобы настроить наш стручок на AKS и SCALEDOBJECT.YML Это файл конфигурации, который KEDA будет использовать, чтобы понять, когда масштабировать приложение. Посмотрим, что на развертывание

apiVersion : apps/v1
kind: Deployment
metadata:
  name: 
  namespace: 
  labels:
    app: 
spec:
  selector:
    matchLabels:
      app: 
  template:
    metadata:
      labels:
        app: 
    spec:
      containers:
        - image: arthuravila/keda-container
          name: keda-container
          ports:
          - containerPort: 80
          resources:
            requests:
              memory: "64Mi"
              cpu: "50m"
            limits:
              memory: "128Mi"
              cpu: "250m"

Это простой файл развертывания, который я использовал для настройки моего POD. В контейнере я использую изображение контейнера из Dockerhub. Не стесняйтесь использовать его или создавать свои собственные, это зависит от вас.

Теперь давайте посмотрим, как SCALEDOBJECT.YML выглядит как

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: 
  namespace: 
spec:
  scaleTargetRef:
    name: 
  minReplicaCount: 0
  maxReplicaCount: 10
  pollingInterval: 1
  triggers:
  - type: azure-servicebus
    metadata:
      queueName: 
      messageCount: '1'
      connectionFromEnv: AzureWebJobsStorage

Этот файл для KEDA версии 2.x. Для версии 1.x это может быть разным. Посмотреть на Документация Отказ Но объясняя этот файл, на ScaletArgetref. Мы устанавливаем минимум реплик, которые я хочу. Я устанавливаю 0, потому что, когда в очереди нет события, я предполагаю, что не нужно, у подпускания POD. И максимум 10 реплик. В триггерах я использую Azure-ServiceBus. Это может измениться, когда вы хотите масштабироваться с другой услуги. Но поскольку этот учебник о ServiceBus, мы должны использовать так. В метаданных мы должны дать название очереди на Queuename Отказ В Messagecount Я устанавливаю 1, потому что, когда прибудет событие, POD поднимается для того, чтобы потреблять его. И, наконец, ConnectionFromenv. Я установил AzurewebjobsStorage Отказ Эта переменная будет использовать строку соединения, которую мы передали в файл local.settings.json. .

Круто, теперь давайте поговорим о трубопроводе. Этот трубопровод вообще довольно прост.

trigger:
- main

resources:
- repo: self

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: 'DockerHub'
  imageRepository: 'arthuravila/keda-container'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'keda-container'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build an image
      inputs:
        command: build
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
    - task: Docker@2
      displayName: Push an image to container registry
      inputs:
        command: push
        repository: $(imageRepository)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
    - upload: manifests
      artifact: manifests

- stage: DeployNONPROD
  displayName: Deploy NONPROD
  dependsOn: 
  - Build
  condition: and(succeeded(),  eq(variables['Build.SourceBranch'], 'refs/heads/main'))

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: ''
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/scaledobject.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

Этот трубопровод будет вызвать при объединении к главной ветви, создать изображение с DockerFile, созданным инструментами Azure Functions, нажимайте это изображение в наш реестр Docker и развертывающую для AKS, используя Развертывание .yml и SCALEDOBJECT.YML файлы. Но мы еще не закончены, мы должны настроить наш Azure DEVOPS, чтобы запустить наш трубопровод.

5. Настройка Azure DEVOPS и развертывание AKS

Чтобы запустить наш трубопровод и развернуть его нашим аквам, мы должны настроить пару вещей в Azure DEVOPS. Прежде всего, мы начинаем настроить Сервисные связи Отказ Здесь мы настраиваем наше соединение Aks, наш репозиторий для триггера при триггере к главной ветке и нашему соединению реестра Docker.

После настройки этих соединений мы должны настроить наши условия. Как вы можете отметить в трубопроводе на сцене Развертывание У нас есть окружающая обстановка . Эта среда мы устанавливаем на трубопроводах. Здесь мы устанавливаем эту среду для развертывания AKS.

В первый раз, когда мы запустим трубопровод в Azure DevOps, мы должны вызвать его вручную. Чтобы сделать это, мы просто идем в Трубопроводы -> Новый трубопровод и выберите репозиторий, в котором проект находится и выберите Azure-Pipelines.yml Файл и запустить трубопровод.

Мы почти закончили, можете ли вы поверить в это?

После того, как ваш трубопровод бежит и развертываете, вы должны увидеть что-то в этом роде Это означает, что ваши функции были развернуты с успехом !! 🎊 🥳

Хорошо, хорошо … Давайте посмотрим, что он работает!

Если вы запустите команду

kubectl get pods -n 

Вы увидите что-то вроде этого, это означает, что ваш POD остановлен, потому что у вас нет никакого события в вашей очереди И не стоит оставаться в трудоустройстве ресурсов.

Чтобы посмотреть, как красиво ваша функция без сервеса встает с KEDA, вы можете запустить тест, который я покажу здесь снова. После запуска этого снова используйте команду, чтобы увидеть ваши стручки

kubectl get pods -n 

И вы увидите, как все стручки встают так

Довольно мило, а? Это только один пример многих других, вы можете попробовать использовать KEDA. Вы можете проверить больше примеров на Github Keda Репозиторий образца

Ну, я заканчиваю здесь … Это было огромное! Если у вас есть какие-либо сомнения или отзывы, не удалось комментировать или связаться со мной на LinkedIn Отказ Это первая статья, которую я когда-либо писал в своей жизни, любые отзывы приветствуются!

Оригинал: “https://dev.to/arthuravila26/azure-functions-running-on-kubernetes-using-keda-2pi5”