教學課程:建立及使用Apache Kafka服務進行開發
本文內容
Azure Container Apps 可讓您連線到開發和生產等級的服務,為您的應用程式提供各種不同的功能。
在本教學課程中,您將瞭解如何建立和使用開發 Apache Kafka 服務。
本教學課程中有 Azure CLI 命令和 Bicep 範本片段的功能。 如果您使用 Bicep,您可以將所有片段新增至單一 Bicep 檔案,並 一次 部署範本。
建立 Container Apps 環境以部署您的服務和容器應用程式
建立 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
不同於容器應用程式環境名稱。 在此內容中, AZURE_ENV_NAME
azd
中的 是範本中的所有資源。 這些資源包含未與容器應用程式相關聯的資源。 您會為 Container Apps 環境建立不同的名稱。
接下來,建立 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
}
}
}
}
使用 bicep 模組 所使用的azd
範本。
建立名為 ./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-cli-app
結至 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"
將下列內容新增至值 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 Developer 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