Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описана подготовка инфраструктуры для развертывания кластера Kafka в Службе Azure Kubernetes (AKS).
Обзор архитектуры
Целевая архитектура AKS для развертывания Kafka ориентируется на высокий уровень доступности с помощью комплексного зоно-избыточного дизайна. Для проектирования требуется три пула узлов (по одному на зону доступности) для поддержания распределения рабочей нагрузки и выравнивания хранилища. Эта зональная конфигурация важна, так как постоянные тома в этой архитектуре имеют зональное сходство. Все новые узлы, создаваемые автомасштабировщиком кластера, должны быть размещены в соответствующей зоне. Без этой зональной специфики модули pod с постоянными томами, привязанными к зонам, останутся в состоянии ожидания. Несколько реплик оператора кластера Strimzi и экземпляров брокера Kafka определяются и распределяются по зонам, что обеспечивает устойчивость к сбоям как узла, так и всей зоны в выбранном регионе. Чтобы предотвратить состязание ресурсов и обеспечить прогнозируемую производительность, настоятельно рекомендуется использовать пулы выделенных узлов для рабочих нагрузок Kafka.
Предпосылки
- Если вы еще не сделали этого, ознакомьтесь с обзором развертывания Kafka в службе Azure Kubernetes (AKS) с помощью Strimzi.
- Terraform версии 1.3.0 или более поздней.
- Azure CLI установлен и прошел проверку подлинности.
- Достаточные разрешения на создание ресурсов инфраструктуры и назначение RBAC управляемым удостоверениям: Участник сети, Участник службы Azure Kubernetes и Администратор управления доступом на основе ролей.
Развертывание инфраструктуры
Ниже приведены инструкции по развертыванию кластера AKS и поддержке инфраструктуры, необходимой для развертывания Kafka.
Подсказка
Если у вас есть существующий кластер AKS или существующую поддержку инфраструктуры: можно пропустить полные шаги развертывания или внести изменения в код, но убедитесь, что инфраструктура и кластер AKS соответствуют следующим требованиям:
- Виртуальная сеть с подсетью для узлов.
- В кластере AKS по умолчанию включен драйвер CSI для дисков Azure.
- Пул узлов для каждой зоны доступности (1, 2 и 3).
- Пулы выделенных узлов для Kafka с соответствующими размерами виртуальных машин на основе требований рабочей нагрузки.
- Azure Managed Prometheus и Azure Managed Grafana настроены.
Настройка переменных среды
Перед выполнением команд CLI задайте следующие переменные среды для использования в этом руководстве со значениями, соответствующими вашим требованиям:
export RESOURCE_GROUP_NAME="rg-kafka" export LOCATION="canadacentral" export VNET_NAME="vnet-aks-kafka" export SUBNET_NAME="node-subnet" export AKS_CLUSTER_NAME="aks-kafka-cluster" export AKS_TIER=standard export NAT_GATEWAY_NAME="nat-kafka" export ADDRESS_SPACE="10.31.0.0/20" export SUBNET_PREFIX="10.31.0.0/21" export SYSTEM_NODE_COUNT_MIN=3 export SYSTEM_NODE_COUNT_MAX=6 export SYSTEM_NODE_VM_SIZE="Standard_D4ds_v5" export KAFKA_NODE_COUNT_MIN=1 export KAFKA_NODE_COUNT_MAX=3 export KAFKA_NODE_COUNT=1 export KAFKA_NODE_VM_SIZE="Standard_D16ds_v5" export LOG_ANALYTICS_WORKSPACE_NAME="law-monitoring" export DIAGNOSTIC_SETTINGS_NAME="aks-diagnostic-settings" export ACR_NAME="aksacr123" export ACR_SKU="Premium" export USER_ASSIGNED_IDENTITY_NAME="uami-aks" export KUBERNETES_VERSION="1.30.0" export AAD_ADMIN_GROUP_OBJECT_IDS="<your-admin-group-object-id>" export AAD_TENANT_ID="<your-tenant-id>" export GRAFANA_NAME="grafana-kafka-aks" export PROMETHEUS_WORKSPACE_NAME="prometheus-aks"
Развертывания предкластерной сети
Перед развертыванием кластера AKS для Kafka разверните необходимые сетевые ресурсы, поддерживающие развертывание кластера AKS.
Создайте группу ресурсов с помощью команды
az group create.az group create --name $RESOURCE_GROUP_NAME --location $LOCATIONСоздайте виртуальную сеть с помощью
az network vnet createкоманды.az network vnet create \ --resource-group $RESOURCE_GROUP_NAME \ --name $VNET_NAME \ --address-prefix $ADDRESS_SPACE \ --location $LOCATIONСоздайте подсеть с помощью
az network vnet subnet createкоманды.az network vnet subnet create \ --resource-group $RESOURCE_GROUP_NAME \ --vnet-name $VNET_NAME \ --name $SUBNET_NAME \ --address-prefix $SUBNET_PREFIXСоздайте общедоступный IP-адрес для шлюза NAT с помощью
az network public-ip createкоманды.az network public-ip create \ --resource-group $RESOURCE_GROUP_NAME \ --name ${NAT_GATEWAY_NAME}-public-ip \ --sku Standard \ --location $LOCATIONСоздайте шлюз NAT с помощью
az network nat gateway createкоманды.az network nat gateway create \ --resource-group $RESOURCE_GROUP_NAME \ --name $NAT_GATEWAY_NAME \ --public-ip-addresses ${NAT_GATEWAY_NAME}-public-ip \ --location $LOCATIONСвяжите шлюз NAT с подсетью узла с помощью
az network vnet subnet updateкоманды.az network vnet subnet update \ --resource-group $RESOURCE_GROUP_NAME \ --vnet-name $VNET_NAME \ --name $SUBNET_NAME \ --nat-gateway $NAT_GATEWAY_NAME
Мониторинг и развертывание управления для преднастроенного кластера.
Перед развертыванием кластера AKS для Kafka разверните необходимые ресурсы мониторинга и управления, которые поддерживают развертывание кластера AKS.
Создайте рабочую область Log Analytics с помощью
az monitor log-analytics workspace createкоманды.az monitor log-analytics workspace create \ --resource-group $RESOURCE_GROUP_NAME \ --workspace-name $LOG_ANALYTICS_WORKSPACE_NAME \ --location $LOCATIONСоздайте рабочую область Azure Monitor для Prometheus с помощью
az monitor account createкоманды.az monitor account create \ --resource-group $RESOURCE_GROUP_NAME \ --name $PROMETHEUS_WORKSPACE_NAME \ --location $LOCATIONСоздайте управляемый экземпляр Grafana Azure с помощью
az grafana createкоманды.az grafana create \ --resource-group $RESOURCE_GROUP_NAME \ --name $GRAFANA_NAME \ --location $LOCATION \ --api-key Enabled \ --deterministic-outbound-ip Enabled \ --public-network-access Enabled \ --grafana-major-version 11Примечание.
Azure Managed Grafana имеет зональную избыточность, доступную в избранных регионах. Если ваш целевой регион имеет избыточность зоны, используйте аргумент
--zone-redundancy Enabled.Создайте реестр контейнеров Azure с помощью
az acr createкоманды.az acr create \ --resource-group $RESOURCE_GROUP_NAME \ --name $ACR_NAME \ --sku $ACR_SKU \ --location $LOCATION \ --admin-enabled false \ --zone-redundancy EnabledСоздайте пользовательское управляемое удостоверение с помощью команды
az identity create.az identity create \ --resource-group $RESOURCE_GROUP_NAME \ --name $USER_ASSIGNED_IDENTITY_NAME \ --location $LOCATIONНазначьте разрешения RBAC управляемой идентичности Grafana с помощью команды
az role assignment create.az role assignment create \ --assignee $(az grafana show --resource-group $RESOURCE_GROUP_NAME --name $GRAFANA_NAME --query identity.principalId -o tsv) \ --role "Monitoring Reader" --scope $(az group show --name $RESOURCE_GROUP_NAME --query id -o tsv)
Развертывание кластера AKS
Разверните кластер AKS с выделенными пулами узлов для зоны доступности Kafka с помощью Azure CLI.
Назначьте роль вкладчика сети управляемому удостоверению, назначенному пользователем, для AKS с помощью команды
az role assignment create.az role assignment create \ --assignee $(az identity show --resource-group $RESOURCE_GROUP_NAME --name $USER_ASSIGNED_IDENTITY_NAME --query principalId -o tsv) \ --role "Network Contributor" \ --scope $(az group show --name $RESOURCE_GROUP_NAME --query id -o tsv)Создайте кластер AKS с помощью команды
az aks create.az aks create \ --name $AKS_CLUSTER_NAME \ --aad-admin-group-object-ids $AAD_ADMIN_GROUP_OBJECT_IDS \ --aad-tenant-id $AAD_TENANT_ID \ --assign-identity $(az identity show --resource-group $RESOURCE_GROUP_NAME --name $USER_ASSIGNED_IDENTITY_NAME --query id -o tsv) \ --attach-acr $(az acr show --resource-group $RESOURCE_GROUP_NAME --name $ACR_NAME --query id -o tsv) \ --auto-upgrade-channel patch \ --enable-aad \ --enable-addons monitoring \ --enable-azure-monitor-metrics \ --enable-cluster-autoscaler \ --enable-managed-identity \ --enable-oidc-issuer \ --enable-workload-identity \ --kubernetes-version $KUBERNETES_VERSION \ --load-balancer-sku standard \ --location $LOCATION \ --max-count $SYSTEM_NODE_COUNT_MAX \ --max-pods 110 \ --min-count $SYSTEM_NODE_COUNT_MIN \ --network-dataplane cilium \ --network-plugin azure \ --network-plugin-mode overlay \ --network-policy cilium \ --node-osdisk-type Ephemeral \ --node-os-upgrade-channel NodeImage \ --node-vm-size $SYSTEM_NODE_VM_SIZE \ --nodepool-labels "role=system" \ --nodepool-name systempool \ --nodepool-tags "env=production" \ --os-sku AzureLinux \ --outbound-type userAssignedNATGateway \ --pod-cidr 10.244.0.0/16 \ --resource-group $RESOURCE_GROUP_NAME \ --tags "env=production" \ --tier $AKS_TIER \ --vnet-subnet-id $(az network vnet subnet show --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME --query id -o tsv) \ --workspace-resource-id $(az monitor log-analytics workspace show --resource-group $RESOURCE_GROUP_NAME --workspace-name $LOG_ANALYTICS_WORKSPACE_NAME --query id -o tsv) \ --zones 1 2 3Создайте дополнительный пул узлов для каждой зоны доступности с использованием цикла for и команды
az aks nodepool add.for zone in 1 2 3; do az aks nodepool add \ --cluster-name $AKS_CLUSTER_NAME \ --enable-cluster-autoscaler \ --labels app=kafka \ --max-count $KAFKA_NODE_COUNT_MAX \ --max-surge 10% \ --min-count $KAFKA_NODE_COUNT_MIN \ --node-count $KAFKA_NODE_COUNT \ --mode User \ --name "kafka$zone" \ --node-osdisk-type Ephemeral \ --node-vm-size $KAFKA_NODE_VM_SIZE \ --os-sku AzureLinux \ --resource-group $RESOURCE_GROUP_NAME \ --vnet-subnet-id $(az network vnet subnet show --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME --query id -o tsv) \ --zones $zone doneВключите интеграцию Azure Managed Prometheus и Grafana, используя команду
az aks update.az aks update \ --name $AKS_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --enable-azure-monitor-metrics \ --azure-monitor-workspace-resource-id $(az monitor account show --resource-group $RESOURCE_GROUP_NAME --name $PROMETHEUS_WORKSPACE_NAME --query id -o tsv) \ --grafana-resource-id $(az grafana show --resource-group $RESOURCE_GROUP_NAME --name $GRAFANA_NAME --query id -o tsv)Необязательно. Настройка параметра диагностики для кластера AKS с помощью
az monitor diagnostic-settings createкоманды.az monitor diagnostic-settings create \ --resource $(az aks show --resource-group $RESOURCE_GROUP_NAME --name $AKS_CLUSTER_NAME --query id -o tsv) \ --name $DIAGNOSTIC_SETTINGS_NAME \ --workspace $(az monitor log-analytics workspace show --resource-group $RESOURCE_GROUP_NAME --workspace-name $LOG_ANALYTICS_WORKSPACE_NAME --query id -o tsv) \ --logs '[{"category": "kube-apiserver", "enabled": true}, {"category": "kube-audit", "enabled": true}, {"category": "kube-audit-admin", "enabled": true}, {"category": "kube-controller-manager", "enabled": true}, {"category": "kube-scheduler", "enabled": true}, {"category": "cluster-autoscaler", "enabled": true}, {"category": "cloud-controller-manager", "enabled": true}, {"category": "guard", "enabled": true}, {"category": "csi-azuredisk-controller", "enabled": true}, {"category": "csi-azurefile-controller", "enabled": true}, {"category": "csi-snapshot-controller", "enabled": true}]' \ --metrics '[{"category": "AllMetrics", "enabled": true}]'
В этом разделе описано, как развернуть кластер AKS и вспомогательные ресурсы инфраструктуры с помощью Terraform:
- Частный кластер AKS с пулом узлов для каждой зоны доступности с помощью проверенного модуля Azure (AVM).
- Конфигурации виртуальной сети и подсети.
- Шлюз NAT для исходящего подключения.
- Реестр контейнеров Azure с частной конечной точкой.
- Управляемое удостоверение, назначаемое пользователем для AKS.
- Рабочая область Azure Monitor для метрик Prometheus.
- Панель мониторинга Azure Managed Grafana с интеграцией Prometheus.
- Пулы выделенных узлов для рабочих нагрузок Kafka с соответствующими метками.
- Драйвер Azure Disk CSI для постоянных томов (включен по умолчанию).
Примечание.
Это развертывание Terraform использует проверенный модуль Azure для рабочего кластера AKS. В результате кластер развертывается в качестве частного кластера и с предвзятыми конфигурациями. Для выполнения последующих команд kubectl необходимо установить соответствующее подключение.
Чтобы настроить конфигурацию модуля в соответствии с вашими потребностями, форкните или клонируйте репозиторий и обновите ссылку на источник модуля.
Скопируйте
variables.tfв ваш каталог Terraform.variable "azure_subscription_id" { type = string description = "The Azure subscription ID to use for the resources." } variable "enable_telemetry" { type = bool default = true description = "This variable controls whether or not telemetry is enabled for the module." } variable "kubernetes_cluster_name" { type = string default = "kafka-cluster" description = "The name of the Kubernetes cluster." } variable "kubernetes_version" { type = string default = "1.30" description = "The version of Kubernetes to use for the cluster." } variable "resource_group_name" { type = string description = "The name of the resource group in which to create the resources." } variable "rbac_aad_admin_group_object_ids" { type = list(string) description = "The object IDs of the Azure AD groups that should be granted admin access to the Kubernetes cluster." } variable "location" { type = string description = "The location in which to create the resources." }Просмотрите переменные и создайте
kafka.tfvarsпо мере необходимости. Обновите значения, соответствующие вашим требованиям:# Replace placeholder values with your actual configuration azure_subscription_id = "00000000-0000-0000-0000-000000000000" # Replace with your actual subscription ID location = "Canada Central" enable_telemetry = true kubernetes_cluster_name = "kafka-aks-cluster" kubernetes_version = "1.30" resource_group_name = "rg-kafka-prod" rbac_aad_admin_group_object_ids = [ "0000-0000-0000-0000", # Add additional admin group object IDs as needed ]Скопируйте
main.tfв ваш каталог Terraform.terraform { required_version = ">= 1.3.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 4, <5" } } } provider "azurerm" { features { resource_group { prevent_deletion_if_contains_resources = false } } subscription_id = var.azure_subscription_id } module "naming" { source = "Azure/naming/azurerm" version = ">= 0.3.0" } resource "azurerm_user_assigned_identity" "this" { location = var.location name = "uami-${var.kubernetes_cluster_name}" resource_group_name = var.resource_group_name } data "azurerm_client_config" "current" {} module "avm-ptn-aks-production" { source = "github.com/Azure/terraform-azurerm-avm-ptn-aks-production" kubernetes_version = "1.30" enable_telemetry = var.enable_telemetry name = var.kubernetes_cluster_name resource_group_name = var.resource_group_name location = var.location default_node_pool_vm_sku = "Standard_D8ds_v5" network = { name = module.avm_res_network_virtualnetwork.name resource_group_name = var.resource_group_name node_subnet_id = module.avm_res_network_virtualnetwork.subnets["subnet"].resource_id pod_cidr = "192.168.0.0/16" } acr = { name = module.naming.container_registry.name_unique subnet_resource_id = module.avm_res_network_virtualnetwork.subnets["private_link_subnet"].resource_id private_dns_zone_resource_ids = [azurerm_private_dns_zone.this.id] } managed_identities = { user_assigned_resource_ids = [ azurerm_user_assigned_identity.this.id ] } rbac_aad_tenant_id = data.azurerm_client_config.current.tenant_id rbac_aad_admin_group_object_ids = var.rbac_aad_admin_group_object_ids rbac_aad_azure_rbac_enabled = true node_pools = { kafka = { name = "kafka" vm_size = "Standard_D16ds_v5" orchestrator_version = "1.30" max_count = 3 min_count = 1 os_sku = "AzureLinux" mode = "User" os_disk_size_gb = 128 labels = { "app" = "kafka" } } } } resource "azurerm_private_dns_zone" "this" { name = "privatelink.azurecr.io" resource_group_name = var.resource_group_name } resource "azurerm_nat_gateway" "this" { location = var.location name = module.naming.nat_gateway.name_unique resource_group_name = var.resource_group_name } resource "azurerm_public_ip" "this" { name = module.naming.public_ip.name_unique location = var.location resource_group_name = var.resource_group_name allocation_method = "Static" sku = "Standard" } resource "azurerm_nat_gateway_public_ip_association" "this" { nat_gateway_id = azurerm_nat_gateway.this.id public_ip_address_id = azurerm_public_ip.this.id } module "avm_res_network_virtualnetwork" { source = "Azure/avm-res-network-virtualnetwork/azurerm" version = "0.7.1" address_space = ["10.31.0.0/16"] location = var.location name = "vnet-aks-lab" resource_group_name = var.resource_group_name subnets = { "subnet" = { name = "nodecidr" address_prefixes = ["10.31.0.0/17"] nat_gateway = { id = azurerm_nat_gateway.this.id } private_link_service_network_policies_enabled = false } "private_link_subnet" = { name = "private_link_subnet" address_prefixes = ["10.31.129.0/24"] } } } resource "azurerm_monitor_workspace" "this" { name = "prometheus-aks" location = var.location resource_group_name = var.resource_group_name } resource "azurerm_monitor_data_collection_endpoint" "dataCollectionEndpoint" { name = "prom-aks-endpoint" location = var.location resource_group_name = var.resource_group_name kind = "Linux" } resource "azurerm_monitor_data_collection_rule" "dataCollectionRule" { name = "prom-aks-dcr" location = var.location resource_group_name = var.resource_group_name data_collection_endpoint_id = azurerm_monitor_data_collection_endpoint.dataCollectionEndpoint.id kind = "Linux" description = "DCR for Azure Monitor Metrics Profile (Managed Prometheus)" destinations { monitor_account { monitor_account_id = azurerm_monitor_workspace.this.id name = "PrometheusAzMonitorAccount" } } data_flow { streams = ["Microsoft-PrometheusMetrics"] destinations = ["PrometheusAzMonitorAccount"] } data_sources { prometheus_forwarder { streams = ["Microsoft-PrometheusMetrics"] name = "PrometheusDataSource" } } } resource "azurerm_monitor_data_collection_rule_association" "dataCollectionRuleAssociation" { name = "prom-aks-dcra" target_resource_id = module.avm-ptn-aks-production.resource_id data_collection_rule_id = azurerm_monitor_data_collection_rule.dataCollectionRule.id description = "Association of data collection rule. Deleting this association will break the data collection for this AKS Cluster." } resource "azurerm_dashboard_grafana" "this" { name = "grafana-kafka-aks" location = var.location resource_group_name = var.resource_group_name api_key_enabled = true deterministic_outbound_ip_enabled = true public_network_access_enabled = true grafana_major_version = 11 azure_monitor_workspace_integrations { resource_id = azurerm_monitor_workspace.this.id } identity { type = "SystemAssigned" } } data "azurerm_resource_group" "current" { name = var.resource_group_name depends_on = [azurerm_dashboard_grafana.this] } resource "azurerm_role_assignment" "grafana_monitoring_reader" { scope = data.azurerm_resource_group.current.id role_definition_name = "Monitoring Reader" principal_id = azurerm_dashboard_grafana.this.identity[0].principal_id skip_service_principal_aad_check = true } resource "azurerm_kubernetes_cluster_extension" "container_storage" { name = "microsoft-azurecontainerstorage" cluster_id = module.avm-ptn-aks-production.resource_id extension_type = "microsoft.azurecontainerstorage" configuration_settings = { "enable-azure-container-storage" : "azureDisk", } }Инициализировать Terraform с помощью
terraform initкоманды.terraform initСоздайте план развертывания с помощью
terraform planкоманды.terraform plan -var-file="kafka.tfvars"Примените конфигурацию с помощью
terraform applyкоманды.terraform apply -var-file="kafka.tfvars"
Проверка развертывания и подключение к кластеру
После развертывания кластера AKS выполните следующие действия, чтобы проверить развертывание и подключиться к серверу API AKS.
Проверьте развертывание кластера AKS с помощью
az aks showкоманды.az aks show --resource-group $RESOURCE_GROUP_NAME --name $AKS_CLUSTER_NAME --output tableПосле проверки развертывания с помощью команды
az aks get-credentialsподключитесь к кластеру AKS.az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $AKS_CLUSTER_NAMEПроверьте подключение путем перечисления узлов с помощью
kubectl getкоманды.kubectl get nodes
Создание класса хранилища для Kafka
Создайте класс хранилища для дисков SSD уровня "Премиум" версии 2 с помощью
kubectl applyкоманды.kubectl apply -f - <<EOF --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: kafka-premium-ssd-v2 provisioner: disk.csi.azure.com parameters: skuName: PremiumV2_LRS diskIOPSReadWrite: "5000" diskMBpsReadWrite: "200" reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true EOFЭто важно
Указанная выше конфигурация хранилища представляет начальную точку. Для рабочих развертываний настройте
diskIOPSReadWriteиdiskMBpsReadWriteзначения на основе ожидаемых размеров кластера Kafka и требований к рабочей нагрузке.
Следующий шаг
Соавторы
Корпорация Майкрософт поддерживает эту статью. Первоначальная версия была написана следующими участниками:
- Серхио Навар | Старший инженер клиента
- Эрин Шаффер | Разработчик содержимого 2