教學課程:建立並使用 Apache Kafka 服務進行開發
本文內容
Azure 容器應用程式可讓您連線到開發和生產等級的服務,為您的應用程式提供各種不同的功能。
在本教學課程中,您將了解如何建立和使用開發 Apache Kafka 服務。
本教學課程中包含 Azure CLI 命令和 Bicep 範本片段。 如果您使用 Bicep,則可以將所有片段新增至單一 Bicep 檔案,並一次部署範本 。
建立容器應用程式環境以部署服務和容器應用程式
建立 Apache Kafka 服務
設定命令列應用程式以使用開發 Apache Kafka 服務
部署 kafka-ui 應用程式以檢視應用程式資料
編譯最終的 bicep 範本,以使用一致且可預測的範本部署來部署所有資源
針對所有資源的單一命令部署使用 azd
範本
必要條件
注意
針對單一命令部署,請跳至最後一個azd
範本步驟 。
設定
定義一般值的變數。
RESOURCE_GROUP="kafka-dev"
LOCATION="northcentralus"
ENVIRONMENT="aca-env"
KAFKA_SVC="kafka01"
KAFKA_CLI_APP="kafka-cli-app"
KAFKA_UI_APP="kafka-ui-app"
下列變數可讓您使用 CLI 來部署 Bicep 範本。
RESOURCE_GROUP="kafka-dev"
LOCATION="northcentralus"
針對 Bicep,從建立名為 kafka-dev.bicep
的檔案開始,然後新增具有下列預設值的參數。
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'
當您在任何階段部署 bicep 範本時,可以使用 az deployment group create
命令。
az deployment group create -g $RESOURCE_GROUP \
--query 'properties.outputs.*.value' \
--template-file kafka-dev.bicep
定義初始變數。
AZURE_ENV_NAME="azd-kafka-dev"
LOCATION="northcentralus"
使用值來初始化最小 azd
範本。
azd init \
--environment "$AZURE_ENV_NAME" \
--location "$LOCATION" \
--no-prompt
注意
AZURE_ENV_NAME
不同於容器應用程式環境名稱。 在此內容中,azd
中的 AZURE_ENV_NAME
是範本中的所有資源。 這些資源包含未與容器應用程式相關聯的資源。 您會為容器應用程式環境建立不同的名稱。
接下來,建立 infra/main.bicep
並定義參數以供稍後使用。
param appEnvironmentName string = 'aca-env'
param kafkaSvcName string = 'kafka01'
param kafkaCliAppName string = 'kafka-cli-app'
param kafkaUiAppName string = 'kafka-ui'
登入 Azure。
az login
將 CLI 升級至最新版本。
az upgrade
將 Bicep 升級至最新版本。
az bicep upgrade
新增 containerapp
延伸模組。
az extension add --name containerapp --upgrade
註冊必要的命名空間。
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
建立容器應用程式環境
建立資源群組。
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION"
在中 azd
管理資源群組不需要特殊設定。 azd
命令會從 AZURE_ENV_NAME
/--environment
值取得資源群組。
您可以使用 up
命令來測試最小範本。
azd up
執行此命令會建立空的資源群組。
建立容器應用程式環境。
az containerapp env create \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION"
在 kafka-dev.bicep
檔案中新增下列值。
resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
name: appEnvironmentName
location: location
properties: {
appLogsConfiguration: {
destination: 'azure-monitor'
}
}
}
Azure CLI 會自動為每個環境建立 Log Analytics 工作區。 若要使用 Bicep 範本產生工作區,請明確宣告環境,並在範本中連結到該工作區。 此步驟可讓您的部署更加穩定,即使會因此變得稍微瑣碎。
將下列值新增至您的環境。
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
}
}
}
}
azd
使用的範本會使用 bicep 模組 。
建立名為 ./infra/core/host
的資料夾,然後使用下列內容建立 ./infra/core/host/container-apps-environment.bicep
模組。
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
在 ./infra/main.bicep
檔案中,使用下列值載入模組。
module appEnvironment './core/host/container-apps-environment.bicep' = {
name: 'appEnvironment'
scope: rg
params: {
name: appEnvironmentName
location: location
tags: tags
}
}
執行 azd up
可部署範本。
建立 Apache Kafka 服務
建立 Apache Kafka 服務。
ENVIRONMENT_ID=$(az containerapp env show \
--name "$ENVIRONMENT" \
--resource-group "$RESOURCE_GROUP" \
--output tsv \
--query id)
將下列值新增至 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'
使用下列內容建立 ./infra/core/host/container-app-service.bicep
模組檔案。
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
然後使用下列宣告更新 ./infra/main.bicep
模組檔案。
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'
}
}
部署範本。
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
提示
輸出 kafkaLogs
會輸出 CLI 命令,以協助您在部署完成之後檢視 kafka 的記錄。 您可以執行命令來檢視新 Kafka 服務的初始化記錄。
檢視 Kafka 執行個體的記錄輸出
使用 logs
命令來檢視記錄訊息。
az containerapp logs show \
--name $KAFKA_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
先前的 Bicep 範例包含命令的輸出,用於檢視記錄。
例如:
[
"az containerapp logs show -n kafka01 -g kafka-dev --follow --tail 30"
]
如果您沒有命令,則可以使用服務名稱來檢視使用 CLI 的記錄。
az containerapp logs show \
--name $KAFKA_SVC \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
使用 logs
命令來檢視記錄訊息。
az containerapp logs show \
--name kafka01 \
--resource-group $RESOURCE_GROUP \
--follow --tail 30
建立應用程式以測試服務
當您建立應用程式時,您會將其設定為使用 ./kafka-topics.sh
、./kafka-console-producer.sh
和 kafka-console-consumer.sh
來連線到 Kafka 執行個體。
建立繫結至 Kafka 服務的 kafka-cli-app
應用程式。
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"
將下列內容新增至值 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'
提示
輸出 kafkaCliExec
會輸出您可以執行的 CLI 命令,以確認應用程式已正確部署。
在 ./infra/core/host/container-app.bicep
底下建立模組,並新增下列值。
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
}
}
}
}
現在,藉由新增下列值,在 ./infra/main.bicep
中使用模組。
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' ]
}
}
使用 azd up
部署範本。
azd up
執行 CLI exec
命令以連線到測試應用程式。
az containerapp exec \
--name $KAFKA_CLI_APP \
--resource-group $RESOURCE_GROUP \
--command /bin/bash
先前的 Bicep 範例包含輸出,示範如何執行應用程式。
例如:
[
"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"
]
如果您沒有 命令,則可以使用應用程式名稱,以使用 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
當您在測試應用程式上使用 --bind
或 serviceBinds
時,連線資訊會插入應用程式環境。 連線到測試容器之後,您可以使用 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
使用 kafka-topics.sh
建立事件主題。
建立 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
建立 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
使用 kafka-console-producer.sh
將事件寫入主題。
/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
注意
./kafka-console-producer.sh
命令會提示您使用 >
撰寫事件。 如所示撰寫一些事件,然後叫用 CTRL-C
以結束。
使用 kafka-console-consumer.sh
從主題讀取事件。
/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
搭配現有應用程式使用開發服務
如果您已有使用 Apache Kafka 的應用程式,則可以變更連線資訊的載入方式。
首先,設定下列環境變數。
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
可以使用 CLI (或 Bicep) 更新應用程式以新增 --bind $KAFKA_SVC
來使用開發服務。
繫結至開發服務
部署 kafka-ui 以檢視和管理Kafka執行個體。
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 命令會傳回 URL。 將此 URL 複製到瀏覽器,以造訪已部署的網站。
使用下列值更新 ./infra/main.bicep
。
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
}
}
使用 azd up
部署範本。
azd up
部署所有資源
如果您想要一次部署所有資源,請使用下列範例。
Bicep
下列 Bicep 範本包含本教學課程中的所有資源。
您可以建立包含此內容的 kafka-dev.bicep
檔案。
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'
使用 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 開發人員 CLI
您可以在 GitHub 上取得最終範本 。
使用 azd up
來部署範本。
git clone https://github.com/Azure-Samples/aca-dev-service-kafka-azd
cd aca-dev-service-kafka-azd
azd up
清除資源
完成後,請執行下列命令來刪除包含您容器應用程式資源的資源群組。
警告
下列命令會刪除指定的資源群組和其中包含的所有資源。 如果本教學課程範圍以外的資源存在於指定的資源群組中,則也會一併刪除。
az group delete \
--resource-group $RESOURCE_GROUP