Dela via


Självstudie: Skapa och använda en Apache Kafka-tjänst för utveckling

Med Azure Container Apps kan du ansluta till tjänster i utvecklings- och produktionsklass för att tillhandahålla en mängd olika funktioner till dina program.

I den här självstudien lär du dig att skapa och använda en Apache Kafka-tjänst för utveckling.

Azure CLI-kommandon och Bicep-mallfragment finns med i den här självstudien. Om du använder Bicep kan du lägga till alla fragment i en enda Bicep-fil och distribuera mallen samtidigt.

  • Skapa en Container Apps-miljö för att distribuera tjänsten och containerappen
  • Skapa en Apache Kafka-tjänst
  • Konfigurera en kommandoradsapp för att använda dev Apache Kafka-tjänsten
  • Distribuera en kafka-ui-app för att visa programdata
  • Kompilera en slutlig bicep-mall för att distribuera alla resurser med hjälp av en konsekvent och förutsägbar malldistribution
  • Använda en azd mall för en kommandodistribution av alla resurser

Förutsättningar

Kommentar

För en distribution med ett kommando går du vidare till det sista azdmallsteget.

Ställ in

  1. Definiera variabler för vanliga värden.

    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. Logga in på Azure.

    az login
    
  3. Uppgradera CLI till den senaste versionen.

    az upgrade
    
  4. Uppgradera Bicep till den senaste versionen.

    az bicep upgrade
    
  5. Lägg till det här containerapp tillägget.

    az extension add --name containerapp --upgrade
    
  6. Registrera nödvändiga namnområden.

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

Skapa en Container Apps-miljö

  1. Skapa en resursgrupp.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Skapa en Container Apps-miljö.

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

Skapa en Apache Kafka-tjänst

  1. Skapa en Apache Kafka-tjänst.

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

        az containerapp add-on kafka create \
        --name "$KAFKA_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  3. Visa loggutdata från Kafka-instansen

    logs Använd kommandot för att visa loggmeddelanden.

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

    Skärmbild av kafka-tjänstloggar för containerappen.

Skapa en app för att testa tjänsten

När du skapar appen konfigurerar du den så att den använder ./kafka-topics.sh, ./kafka-console-producer.shoch kafka-console-consumer.sh ansluter till Kafka-instansen.

  1. Skapa en kafka-cli-app app som binder till Kafka-tjänsten.

    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. Kör CLI-kommandot exec för att ansluta till testappen.

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

    När du använder --bind eller serviceBinds i testappen matas anslutningsinformationen in i programmiljön. När du ansluter till testcontainern kan du kontrollera värdena med hjälp av env kommandot .

    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. Använd kafka-topics.sh för att skapa ett händelseämne.

    Skapa en kafka.props-fil.

    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
    

    Skapa ett quickstart-events händelseämne.

    /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. Använd kafka-console-producer.sh för att skriva händelser till ämnet.

    /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
    

    Kommentar

    Kommandot ./kafka-console-producer.sh uppmanar dig att skriva händelser med >. Skriv några händelser som visas och tryck CTRL-C sedan på för att avsluta.

  5. Använd kafka-console-consumer.sh för att läsa händelser från ämnet.

    /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
    

Skärmbild av kafka CLI-utdataloggar för containerappen.

Använda en utvecklingstjänst med en befintlig app

Om du redan har en app som använder Apache Kafka kan du ändra hur anslutningsinformation läses in.

Skapa först följande miljövariabler.

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

Med hjälp av CLI (eller Bicep) kan du uppdatera appen att lägga --bind $KAFKA_SVC till för att använda dev-tjänsten.

Bindning till utvecklingstjänsten

Distribuera kafka-ui för att visa och hantera Kafka-instansen.

Se Bicep eller azd exempel.

Skärmbild av pgweb Container App som ansluter till Kafka-tjänsten.

Distribuera alla resurser

Använd följande exempel om du vill distribuera alla resurser samtidigt.

Bicep

Följande Bicep-mall innehåller alla resurser i den här självstudien.

Du kan skapa en kafka-dev.bicep fil med det här innehållet.

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'

Använd Azure CLI för att distribuera mallen.

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

En slutlig mall finns på GitHub.

Använd azd up för att distribuera mallen.

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

Rensa resurser

När du är klar kör du följande kommando för att ta bort resursgruppen som innehåller dina Container Apps-resurser.

Varning

Följande kommando tar bort den angivna resursgruppen och alla resurser som ingår i den. Om det finns resurser utanför omfånget för den här självstudien i den angivna resursgruppen tas de också bort.

az group delete \
    --resource-group $RESOURCE_GROUP