Tutorial: Criar e usar um serviço Apache Kafka para desenvolvimento

Os Aplicativos de Contêiner do Azure permitem que você se conecte a serviços de desenvolvimento e nível de produção para fornecer uma ampla variedade de funcionalidades para seus aplicativos.

Neste tutorial, você aprende a criar e usar um serviço de desenvolvimento Apache Kafka.

Os comandos da CLI do Azure e os fragmentos de modelo Bicep são apresentados neste tutorial. Se você usar o Bicep, poderá adicionar todos os fragmentos a um único arquivo Bicep e implantar o modelo de uma só vez.

  • Crie um ambiente de Aplicativos de Contêiner para implantar seu aplicativo de serviço e contêiner
  • Criar um serviço Apache Kafka
  • Configurar um aplicativo de linha de comando para usar o serviço dev Apache Kafka
  • Implantar um aplicativo kafka-ui para exibir dados do aplicativo
  • Compile um modelo de bíceps final para implantar todos os recursos usando uma implantação de modelo consistente e previsível
  • Usar um azd modelo para uma implantação de um comando de todos os recursos

Pré-requisitos

  • Instale a CLI do Azure.
  • Opcional: CLI do Desenvolvedor do Azure para seguir as instruções do AZD.

Nota

Para uma implantação de um comando, pule para a última azd etapa do modelo.

Configurar

  1. Definir variáveis para valores comuns.

    RESOURCE_GROUP="kafka-dev"
    LOCATION="northcentralus"
    ENVIRONMENT="aca-env"
    KAFKA_SVC="kafka01"
    KAFKA_CLI_APP="kafka-cli-app"
    KAFKA_UI_APP="kafka-ui-app"
    
  2. Iniciar sessão no Azure.

    az login
    
  3. Atualize a CLI para a versão mais recente.

    az upgrade
    
  4. Atualize o Bicep para a versão mais recente.

    az bicep upgrade
    
  5. Adicionar extensão th containerapp .

    az extension add --name containerapp --upgrade
    
  6. Registre os namespaces necessários.

    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

Criar um ambiente de aplicativos de contêiner

  1. Crie um grupo de recursos.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Crie um ambiente de aplicativos de contêiner.

    az containerapp env create \
      --name "$ENVIRONMENT" \
      --resource-group "$RESOURCE_GROUP" \
      --location "$LOCATION"
    

Criar um serviço Apache Kafka

  1. Crie um serviço Apache Kafka.

    ENVIRONMENT_ID=$(az containerapp env show \
      --name "$ENVIRONMENT" \
      --resource-group "$RESOURCE_GROUP" \
      --output tsv \
      --query id)
    
  2. Implemente o modelo.

        az containerapp add-on kafka create \
        --name "$KAFKA_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  3. Exibir saída de log da instância de Kafka

    Use o comando para exibir mensagens de logs log.

    az containerapp logs show \
        --name $KAFKA_SVC \
        --resource-group $RESOURCE_GROUP \
        --follow --tail 30
    

    Captura de tela dos logs de serviço kafka do aplicativo de contêiner.

Criar um aplicativo para testar o serviço

Ao criar o aplicativo, você o configurará para usar ./kafka-topics.sh, ./kafka-console-producer.she kafka-console-consumer.sh para se conectar à instância de Kafka.

  1. Crie um kafka-cli-app aplicativo que se vincule ao serviço Kafka.

    az containerapp create \
        --name "$KAFKA_CLI_APP" \
        --image mcr.microsoft.com/k8se/services/kafka:3.4 \
        --bind "$KAFKA_SVC" \
        --environment "$ENVIRONMENT" \
        --resource-group "$RESOURCE_GROUP" \
        --min-replicas 1 \
        --max-replicas 1 \
        --command "/bin/sleep" "infinity"
    
  2. Execute o comando CLI exec para se conectar ao aplicativo de teste.

    az containerapp exec \
        --name $KAFKA_CLI_APP \
        --resource-group $RESOURCE_GROUP \
        --command /bin/bash
    

    Quando você usa --bind ou serviceBinds no aplicativo de teste, as informações de conexão são injetadas no ambiente do aplicativo. Depois de se conectar ao contêiner de teste, você pode inspecionar os valores usando o env comando.

    env | grep "^KAFKA_"
    
    KAFKA_SECURITYPROTOCOL=SASL_PLAINTEXT
    KAFKA_BOOTSTRAPSERVER=kafka01:9092
    KAFKA_HOME=/opt/kafka
    KAFKA_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user" password="7dw..." user_kafka-user="7dw..." ;
    KAFKA_BOOTSTRAP_SERVERS=kafka01:9092
    KAFKA_SASLUSERNAME=kafka-user
    KAFKA_SASL_USER=kafka-user
    KAFKA_VERSION=3.4.0
    KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT
    KAFKA_SASL_PASSWORD=7dw...
    KAFKA_SASLPASSWORD=7dw...
    KAFKA_SASL_MECHANISM=PLAIN
    KAFKA_SASLMECHANISM=PLAIN
    
  3. Use kafka-topics.sh para criar um tópico de evento.

    Crie um ficheiro kafka.props.

    echo "security.protocol=$KAFKA_SECURITY_PROTOCOL" >> kafka.props && \
    echo "sasl.mechanism=$KAFKA_SASL_MECHANISM" >> kafka.props && \
    echo "sasl.jaas.config=$KAFKA_PROPERTIES_SASL_JAAS_CONFIG" >> kafka.props
    

    Crie um tópico de quickstart-events evento.

    /opt/kafka/bin/kafka-topics.sh \
        --create --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --command-config kafka.props
    # Created topic quickstart-events.
    
    /opt/kafka/bin/kafka-topics.sh \
        --describe --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --command-config kafka.props
    # Topic: quickstart-events	TopicId: lCkTKmvZSgSUCHozhhvz1Q	PartitionCount: 1	ReplicationFactor: 1	Configs: segment.bytes=1073741824
    # Topic: quickstart-events	Partition: 0	Leader: 1	Replicas: 1	Isr: 1
    
  4. Use kafka-console-producer.sh para escrever eventos no tópico.

    /opt/kafka/bin/kafka-console-producer.sh \
        --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --producer.config kafka.props
    
    > this is my first event
    > this is my second event
    > this is my third event
    > CTRL-C
    

    Nota

    O ./kafka-console-producer.sh comando solicita que você escreva eventos com >. Escreva alguns eventos conforme mostrado e, em seguida, pressione CTRL-C para sair.

  5. Use kafka-console-consumer.sh para ler eventos do tópico.

    /opt/kafka/bin/kafka-console-consumer.sh \
         --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --from-beginning \
        --consumer.config kafka.props
    
    # this is my first event
    # this is my second event
    # this is my third event
    

Captura de tela dos logs de saída da CLI do aplicativo de contêiner.

Usando um serviço de desenvolvimento com um aplicativo existente

Se você já tiver um aplicativo que usa o Apache Kafka, poderá alterar a forma como as informações de conexão são carregadas.

Primeiro, crie as seguintes variáveis de ambiente.

KAFKA_HOME=/opt/kafka
KAFKA_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user" password="7dw..." user_kafka-user="7dw..." ;
KAFKA_BOOTSTRAP_SERVERS=kafka01:9092
KAFKA_SASL_USER=kafka-user
KAFKA_VERSION=3.4.0
KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT
KAFKA_SASL_PASSWORD=7dw...
KAFKA_SASL_MECHANISM=PLAIN

Usando a CLI (ou Bicep), você pode atualizar o aplicativo a ser adicionado --bind $KAFKA_SVC para usar o serviço de desenvolvimento.

Vinculação ao serviço de desenvolvimento

Implante o kafka-ui para exibir e gerenciar a instância do Kafka.

Veja Bicep ou azd exemplo.

Captura de tela do aplicativo de contêiner pgweb conectando-se ao serviço Kafka.

Implantar todos os recursos

Use os exemplos a seguir para se quiser implantar todos os recursos de uma só vez.

Bicep

O modelo Bicep a seguir contém todos os recursos neste tutorial.

Você pode criar um kafka-dev.bicep arquivo com esse conteúdo.

targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param kafkaSvcName string = 'kafka01'
param kafkaCliAppName string = 'kafka-cli-app'
param kafkaUiAppName string = 'kafka-ui'

resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
  name: '${appEnvironmentName}-log-analytics'
  location: location
  properties: {
    sku: {
      name: 'PerGB2018'
    }
  }
}

resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
  name: appEnvironmentName
  location: location
  properties: {
    appLogsConfiguration: {
      destination: 'log-analytics'
      logAnalyticsConfiguration: {
        customerId: logAnalytics.properties.customerId
        sharedKey: logAnalytics.listKeys().primarySharedKey
      }
    }
  }
}

resource kafka 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: kafkaSvcName
  location: location
  properties: {
    environmentId: appEnvironment.id
    configuration: {
      service: {
          type: 'kafka'
      }
    }
  }
}

resource kafkaCli 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: kafkaCliAppName
  location: location
  properties: {
    environmentId: appEnvironment.id
    template: {
      serviceBinds: [
        {
          serviceId: kafka.id
        }
      ]
      containers: [
        {
          name: 'kafka-cli'
          image: 'mcr.microsoft.com/k8se/services/kafka:3.4'
          command: [ '/bin/sleep', 'infinity' ]
        }
      ]
      scale: {
        minReplicas: 1
        maxReplicas: 1
      }
    }
  }
}

resource kafkaUi 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: kafkaUiAppName
  location: location
  properties: {
    environmentId: appEnvironment.id
    configuration: {
      ingress: {
        external: true
        targetPort: 8080
      }
    }
    template: {
      serviceBinds: [
        {
          serviceId: kafka.id
          name: 'kafka'
        }
      ]
      containers: [
        {
          name: 'kafka-ui'
          image: 'docker.io/provectuslabs/kafka-ui:latest'
          command: [
            '/bin/sh'
          ]
          args: [
            '-c'
            '''export KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS="$KAFKA_BOOTSTRAP_SERVERS" && \
            export KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG="$KAFKA_PROPERTIES_SASL_JAAS_CONFIG" && \
            export KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM="$KAFKA_SASL_MECHANISM" && \
            export KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL="$KAFKA_SECURITY_PROTOCOL" && \
            java $JAVA_OPTS -jar kafka-ui-api.jar'''
          ]
          resources: {
            cpu: json('1.0')
            memory: '2.0Gi'
          }
        }
      ]
    }
  }
}

output kafkaUiUrl string = 'https://${kafkaUi.properties.configuration.ingress.fqdn}'

output kafkaCliExec string = 'az containerapp exec -n ${kafkaCli.name} -g ${resourceGroup().name} --command /bin/bash'

output kafkaLogs string = 'az containerapp logs show -n ${kafka.name} -g ${resourceGroup().name} --follow --tail 30'

Use a CLI do Azure para implantar o modelo.

RESOURCE_GROUP="kafka-dev"
LOCATION="northcentralus"

az group create \
    --name "$RESOURCE_GROUP" \
    --location "$LOCATION"

az deployment group create -g $RESOURCE_GROUP \
    --query 'properties.outputs.*.value' \
    --template-file kafka-dev.bicep

Azure Developer CLI

Um modelo final está disponível no GitHub.

Use azd up para implantar o modelo.

git clone https://github.com/Azure-Samples/aca-dev-service-kafka-azd
cd aca-dev-service-kafka-azd
azd up

Clean up resources (Limpar recursos)

Quando terminar, execute o seguinte comando para excluir o grupo de recursos que contém os recursos dos Aplicativos de Contêiner.

Atenção

O comando a seguir exclui o grupo de recursos especificado e todos os recursos contidos nele. Se existirem recursos fora do escopo deste tutorial no grupo de recursos especificado, eles também serão excluídos.

az group delete \
    --resource-group $RESOURCE_GROUP