Självstudie: Skapa och använda en Apache Kafka-tjänst för utveckling
Artikel 03/21/2024
5 deltagare
Feedback
I den här artikeln
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 azd
mallsteget .
Ställ in
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"
Med följande variabler kan du använda CLI för att distribuera Bicep-mallen.
RESOURCE_GROUP="kafka-dev"
LOCATION="northcentralus"
För Bicep börjar du med att skapa en fil med namnet kafka-dev.bicep
och lägger sedan till parametrar med följande standardvärden.
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'
När du distribuerar bicep-mallen i alla steg kan du använda az deployment group create
kommandot .
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file kafka-dev.bicep
Definiera dina inledande variabler.
AZURE_ENV_NAME="azd-kafka-dev"
LOCATION="northcentralus"
Använd värdena för att initiera en minimal azd
mall.
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
Kommentar
AZURE_ENV_NAME
skiljer sig från containerappens miljönamn. I det här sammanhanget AZURE_ENV_NAME
gäller in azd
för alla resurser i en mall. Dessa resurser omfattar resurser som inte är associerade med Container Apps. Du skapar ett annat namn för Container Apps-miljön.
infra/main.bicep
Skapa och definiera sedan parametrar för senare användning.
param appEnvironmentName string = 'aca-env'
param kafkaSvcName string = 'kafka01'
param kafkaCliAppName string = 'kafka-cli-app'
param kafkaUiAppName string = 'kafka-ui'
Logga in på Azure.
az login
Uppgradera CLI till den senaste versionen.
az upgrade
Uppgradera Bicep till den senaste versionen.
az bicep upgrade
Lägg till det här containerapp
tillägget.
az extension add --name containerapp --upgrade
Registrera nödvändiga namnområden.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Skapa en Container Apps-miljö
Skapa en resursgrupp.
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
Ingen särskild konfiguration krävs för att hantera resursgrupper i azd
. Kommandot azd
hämtar resursgruppen från värdet/AZURE_ENV_NAME
--environment
.
Du kan testa den minimala mallen up
med kommandot .
azd up
När du kör det här kommandot skapas en tom resursgrupp.
Skapa en Container Apps-miljö.
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
Lägg till följande värden i kafka-dev.bicep
filen.
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
Azure CLI skapar automatiskt en Log Analytics-arbetsyta för varje miljö. Om du vill generera en arbetsyta med hjälp av en Bicep-mall deklarerar du uttryckligen miljön och länkar till den i mallen. Det här steget gör distributionen stabilare, även om den är lite utförlig.
Lägg till följande värden i din miljö.
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
}
}
}
}
De mallar som används av azd
bicep-moduler .
Skapa en mapp med namnet ./infra/core/host
och skapa sedan en ./infra/core/host/container-apps-environment.bicep
modul med följande innehåll.
param name string
param location string = resourceGroup().location
param tags object = {}
resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
name: '${name}-log-analytics'
location: location
tags: tags
properties: {
sku: {
name: 'PerGB2018'
}
}
}
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: name
location: location
tags: tags
properties: {
appLogsConfiguration: {
destination: 'log-analytics'
logAnalyticsConfiguration: {
customerId: logAnalytics.properties.customerId
sharedKey: logAnalytics.listKeys().primarySharedKey
}
}
}
}
output appEnvironmentId string = appEnvironment.id
Läs in modulen ./infra/main.bicep
i filen med hjälp av följande värden.
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
Distribuera mallen genom att köra azd up
.
Skapa en Apache Kafka-tjänst
Skapa en Apache Kafka-tjänst.
ENVIRONMENT_ID=$(az containerapp env show \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--output tsv \
--query id)
Lägg till följande värden i kafka-dev.bicep
.
resource kafka 'Microsoft.App/containerApps@2023-04-01-preview' = {
name: kafkaSvcName
location: location
properties: {
environmentId: appEnvironment.id
configuration: {
service: {
type: 'kafka'
}
}
}
}
output kafkaLogs string = 'az containerapp logs show -n ${kafka.name} -g ${resourceGroup().name} --follow --tail 30'
Skapa en ./infra/core/host/container-app-service.bicep
modulfil med följande innehåll.
param name string
param location string = resourceGroup().location
param tags object = {}
param environmentId string
param serviceType string
resource service 'Microsoft.App/containerApps@2023-04-01-preview' = {
name: name
location: location
tags: tags
properties: {
environmentId: environmentId
configuration: {
service: {
type: serviceType
}
}
}
}
output serviceId string = service.id
Uppdatera ./infra/main.bicep
sedan modulfilen med följande deklaration.
module kafka './core/host/container-app-service.bicep' = {
name: 'kafka'
scope: rg
params: {
name: kafkaSvcName
location: location
tags: tags
environmentId: appEnvironment.outputs.appEnvironmentId
serviceType: 'kafka'
}
}
Distribuera mallen.
az containerapp add-on kafka create \
--name "$KAFKA_SVC" \
--resource-group "$RESOURCE_GROUP" \
--environment "$ENVIRONMENT"
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file kafka-dev.bicep
Dricks
Utdata kafkaLogs
matar ut ett CLI-kommando som hjälper dig att visa loggarna för kafka när distributionen är klar. Du kan köra kommandot för att visa initieringsloggarna för den nya Kafka-tjänsten.
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
Föregående Bicep-exempel innehåller utdata för ett kommando för att visa loggarna.
Till exempel:
[
"az containerapp logs show -n kafka01 -g kafka-dev --follow --tail 30"
]
Om du inte har kommandot kan du använda tjänstnamnet för att visa loggarna med hjälp av CLI.
az containerapp logs show \
--name $KAFKA_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
logs
Använd kommandot för att visa loggmeddelanden.
az containerapp logs show \
--name kafka01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
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.sh
och kafka-console-consumer.sh
ansluter till Kafka-instansen.
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"
Lägg till följande i värden kafka-dev.bicep
.
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
}
}
}
}
output kafkaCliExec string = 'az containerapp exec -n ${kafkaCli.name} -g ${resourceGroup().name} --command /bin/bash'
Dricks
Utdata matar kafkaCliExec
ut ett CLI-kommando som du kan köra för att kontrollera att programmet har distribuerats korrekt.
Skapa en modul under ./infra/core/host/container-app.bicep
och lägg till följande värden.
param name string
param location string = resourceGroup().location
param tags object = {}
param environmentId string
param serviceId string = ''
param containerName string
param containerImage string
param containerCommands array = []
param containerArgs array = []
param minReplicas int
param maxReplicas int
param targetPort int = 0
param externalIngress bool = false
resource app 'Microsoft.App/containerApps@2023-04-01-preview' = {
name: name
location: location
tags: tags
properties: {
environmentId: environmentId
configuration: {
ingress: targetPort > 0 ? {
targetPort: targetPort
external: externalIngress
} : null
}
template: {
serviceBinds: !empty(serviceId) ? [
{
serviceId: serviceId
}
] : null
containers: [
{
name: containerName
image: containerImage
command: !empty(containerCommands) ? containerCommands : null
args: !empty(containerArgs) ? containerArgs : null
}
]
scale: {
minReplicas: minReplicas
maxReplicas: maxReplicas
}
}
}
}
Använd nu modulen i ./infra/main.bicep
genom att lägga till följande värden.
module kafkaCli './core/host/container-app.bicep' = {
name: 'kafkaCli'
scope: rg
params: {
name: kafkaCliAppName
location: location
tags: tags
environmentId: appEnvironment.outputs.appEnvironmentId
serviceId: kafka.outputs.serviceId
containerImage: 'mcr.microsoft.com/k8se/services/kafka:3.4'
containerName: 'kafka-cli'
maxReplicas: 1
minReplicas: 1
containerCommands: [ '/bin/sleep', 'infinity' ]
}
}
Distribuera mallen med azd up
.
azd up
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
Föregående Bicep-exempel innehåller utdata som visar hur du kör appen.
Till exempel:
[
"az containerapp logs show -n kafka01 -g kafka-dev --follow --tail 30",
"az containerapp exec -n kafka-cli-app -g kafka-dev --command /bin/bash"
]
Om du inte har kommandot kan du använda appnamnet för att köra programmet med kommandot exec
.
az containerapp exec \
--name $KAFKA_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
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
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
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.
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
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.
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}'
Bicep-kommandot returnerar en URL. Kopiera den här URL:en till webbläsaren för att besöka den distribuerade webbplatsen.
Uppdatera ./infra/main.bicep
med följande värden.
module kafkaUi './core/host/container-app.bicep' = {
name: 'kafka-ui'
scope: rg
params: {
name: kafkaUiAppName
location: location
tags: tags
environmentId: appEnvironment.outputs.appEnvironmentId
serviceId: kafka.outputs.serviceId
containerImage: 'docker.io/provectuslabs/kafka-ui:latest'
containerName: 'kafka-ui'
maxReplicas: 1
minReplicas: 1
containerCommands: [ '/bin/sh' ]
containerArgs: [
'-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'''
]
targetPort: 8080
externalIngress: true
}
}
Distribuera mallen med azd up
.
azd up
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