Kurz: Vytvoření a použití služby Apache Kafka pro vývoj

Azure Container Apps umožňuje připojit se k vývojovým a produkčním službám, abyste svým aplikacím poskytli širokou škálu funkcí.

V tomto kurzu se naučíte vytvářet a používat vývojovou službu Apache Kafka.

V tomto kurzu jsou doporučené příkazy Azure CLI a fragmenty šablon Bicep. Pokud použijete Bicep, můžete všechny fragmenty přidat do jednoho souboru Bicep a nasadit šablonu najednou.

  • Vytvoření prostředí Container Apps pro nasazení služby a aplikace typu kontejner
  • Vytvoření služby Apache Kafka
  • Nastavení aplikace příkazového řádku tak, aby používala službu Apache Kafka pro vývoj
  • Nasazení aplikace kafka-ui pro zobrazení dat aplikací
  • Kompilace konečné šablony bicep pro nasazení všech prostředků pomocí konzistentního a předvídatelného nasazení šablony
  • azd Použití šablony pro jedno nasazení všech prostředků pomocí jednoho příkazu

Požadavky

Poznámka:

V případě nasazení jednoho příkazu přejděte k poslednímu azdkroku šablony.

Nastavení

  1. Definujte proměnné pro běžné hodnoty.

    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. Přihlásí se k Azure.

    az login
    
  3. Upgradujte rozhraní příkazového řádku na nejnovější verzi.

    az upgrade
    
  4. Upgradujte Bicep na nejnovější verzi.

    az bicep upgrade
    
  5. Přidejte th containerapp extension.

    az extension add --name containerapp --upgrade
    
  6. Zaregistrujte požadované obory názvů.

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

Vytvoření prostředí Container Apps

  1. Vytvořte skupinu prostředků.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Vytvořte prostředí Container Apps.

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

Vytvoření služby Apache Kafka

  1. Vytvořte službu Apache Kafka.

    ENVIRONMENT_ID=$(az containerapp env show \
      --name "$ENVIRONMENT" \
      --resource-group "$RESOURCE_GROUP" \
      --output tsv \
      --query id)
    
  2. Nasazení šablony

        az containerapp add-on kafka create \
        --name "$KAFKA_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  3. Zobrazení výstupu protokolu z instance Kafka

    logs K zobrazení zpráv protokolu použijte příkaz.

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

    Snímek obrazovky s protokoly služby Kafka pro kontejnery

Vytvoření aplikace pro otestování služby

Když vytvoříte aplikaci, nastavíte ji tak, aby používala ./kafka-topics.sh./kafka-console-producer.sh, a kafka-console-consumer.sh aby se připojila k instanci Kafka.

  1. Vytvořte kafka-cli-app aplikaci, která je svázaná se službou 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. Spuštěním příkazu rozhraní příkazového řádku exec se připojte k testovací aplikaci.

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

    Při použití --bind nebo serviceBinds v testovací aplikaci se informace o připojení vloží do aplikačního prostředí. Jakmile se připojíte k testovacímu kontejneru, můžete zkontrolovat hodnoty pomocí env příkazu.

    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. Slouží kafka-topics.sh k vytvoření tématu události.

    Vytvořte soubor 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
    

    Vytvořte quickstart-events téma události.

    /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. Slouží kafka-console-producer.sh k zápisu událostí do tématu.

    /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
    

    Poznámka:

    Příkaz ./kafka-console-producer.sh vás vyzve k zápisu událostí pomocí >příkazu . Napište některé události, jak je znázorněno, a pak se stisknutím klávesy CTRL-C ukončete.

  5. Slouží kafka-console-consumer.sh ke čtení událostí z tématu.

    /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
    

Snímek obrazovky s výstupními protokoly rozhraní příkazového řádku kafka aplikace kontejneru

Použití služby pro vývoj s existující aplikací

Pokud už máte aplikaci, která používá Apache Kafka, můžete změnit způsob načtení informací o připojení.

Nejprve vytvořte následující proměnné prostředí.

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

Pomocí rozhraní příkazového řádku (nebo Bicep) můžete aplikaci aktualizovat a přidat --bind $KAFKA_SVC tak, aby používala službu pro vývoj.

Vazba na službu pro vývoj

Nasaďte kafka-ui pro zobrazení a správu instance Kafka.

Viz bicep nebo azd příklad.

Snímek obrazovky aplikace pgweb Container App, která se připojuje ke službě Kafka

Nasazení všech prostředků

Pokud chcete nasadit všechny prostředky najednou, použijte následující příklady.

Bicep

Následující šablona Bicep obsahuje všechny prostředky v tomto kurzu.

Soubor s tímto obsahem kafka-dev.bicep můžete vytvořit.

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'

K nasazení šablony použijte Azure CLI.

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

Konečná šablona je k dispozici na GitHubu.

Slouží azd up k nasazení šablony.

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

Vyčištění prostředků

Jakmile budete hotovi, spuštěním následujícího příkazu odstraňte skupinu prostředků, která obsahuje vaše prostředky Container Apps.

Upozornění

Následující příkaz odstraní zadanou skupinu prostředků a všechny prostředky obsažené v ní. Pokud prostředky mimo rozsah tohoto kurzu existují v zadané skupině prostředků, odstraní se také.

az group delete \
    --resource-group $RESOURCE_GROUP