Compartilhar via


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

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

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

Os comandos da CLI do Azure e os fragmentos de modelo do 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 serviço e aplicativo de contêiner
  • Criar um serviço do Apache Kafka
  • Configure um aplicativo de linha de comando para usar o serviço de desenvolvimento do Apache Kafka
  • Implante um aplicativo kafka-ui para exibir os dados do aplicativo
  • Compile um modelo bicep final para implantar todos os recursos usando uma implantação de modelo consistente e previsível
  • Use um modelo azd para implantar um comando de todos os recursos

Pré-requisitos

Observação

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

Configuração

  1. Defina 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. Fazer logon 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. Adicione a extensão 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 dos Aplicativos de Contêiner

  1. Crie um grupo de recursos.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Criar um ambiente dos Aplicativos de Contêiner.

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

Criar um serviço do Apache Kafka

  1. Crie um serviço do Apache Kafka.

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

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

    Use o comando logs para exibir as mensagens de 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.sh e kafka-console-consumer.sh para se conectar à instância do Kafka.

  1. Crie um kafka-cli-app aplicativo que se associe 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 exec da CLI para se conectar ao aplicativo de teste.

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

    Ao usar --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 comando env.

    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 arquivo do 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
    

    Criar um tópico do evento quickstart-events.

    /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 gravar 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
    

    Observação

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

  5. Use kafka-console-consumer.sh para ler os 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 kafka 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 da conexão são carregadas.

Primeiro, crie as variáveis de ambiente a seguir.

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 o Bicep), você pode atualizar o aplicativo para adicionar --bind $KAFKA_SVC e usar o serviço de desenvolvimento.

Associação ao serviço de desenvolvimento

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

Consulte o Bicep ou o exemplo azd.

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 você 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 arquivo kafka-dev.bicep com este 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 implantá-lo no 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

CLI do Desenvolvedor do Azure

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

Limpar os recursos

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

Cuidado

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