Azure Kubernetes Service'te (AKS) Strimzi ve Kafka bileşenlerini yapılandırma ve dağıtma

Bu makalede, Azure Kubernetes Service'te (AKS) Strimzi Küme operatörü ve yüksek oranda kullanılabilir bir Kafka kümesi dağıtacaksınız.

Uyarı

Bu dağıtım için gerekli altyapıyı oluşturmadıysanız, kurulumu yapmak için Azure Kubernetes Service'te (AKS) Kafka dağıtımı için altyapıyı hazırlama başlığındaki adımları izleyin ve sonra bu makaleye dönebilirsiniz.

Strimzi dağıtımı

Strimzi Küme operatörü kendi ad alanında strimzi-operatordağıtılır ve Kafka küme bileşenlerinin kafka dağıtıldığı ad alanını izleyecek şekilde yapılandırılır. Yüksek kullanılabilirlik için operatör şunları kullanır:

  • Lider seçimiyle birden çok çoğaltma: Bir çoğaltma, dağıtılan kaynakları yöneten çalışan lider görevini görürken, diğerleri beklemede kalır. Lider başarısız olursa, yedek kopya devralır.
  • Bölgesel dağıtım: Üç kopya (her kullanılabilirlik alanında birer tane), bölge kesintilerine karşı dayanıklılık sağlar. Pod anti-bağımlılık kuralları, aynı bölgede birden çok çoğaltmanın zamanlanmasını engeller.
  • Pod Kesintisi Bütçesi: Operatör dağıtımı tarafından otomatik olarak oluşturulan bu bütçe, gönüllü kesintiler sırasında en az bir kopyanın kullanılabilir durumda kalmasını sağlar.

Bu mimari, altyapı bakımı veya kısmi kesintiler sırasında bile Strimzi Cluster Operator'ın yüksek oranda kullanılabilir kalmasını sağlar.

Helm kullanarak Strimzi Cluster Operator'ı yükleme

  1. komutunu kullanarak kubectl create namespace Strimzi Cluster Operator ve Kafka kümesi için ad alanlarını oluşturun.

    kubectl create namespace strimzi-operator  
    kubectl create namespace kafka  
    
  2. Aşağıdaki betiği kullanarak Helm grafiği için belirli yapılandırmalar sağlamak üzere bir values.yaml dosya oluşturun:

    cat <<EOF > values.yaml  
    replicas: 3  
    watchNamespaces: 
      - kafka  
    leaderElection:  
      enabled: true  
    podDisruptionBudget:  
      enabled: true  
    affinity:  
      podAntiAffinity:  
        requiredDuringSchedulingIgnoredDuringExecution:  
          - labelSelector:  
              matchExpressions:  
                - key: name  
                  operator: In  
                  values:  
                    - strimzi-cluster-operator  
            topologyKey: topology.kubernetes.io/zone  
    EOF  
    
  3. komutunu kullanarak Strimzi Küme İşleci'ni helm install yükleyin.

    helm install strimzi-cluster-operator oci://quay.io/strimzi-helm/strimzi-kafka-operator \
    --namespace strimzi-operator \
    --values values.yaml
    
  4. Komutunu kullanarak kubectl get Strimzi Cluster Operator'ın başarıyla dağıtıldığından ve tüm podların çalışır durumda olduğundan emin olun.

    kubectl get pods -n strimzi-operator  
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    NAME                                        READY   STATUS    RESTARTS      AGE  
    strimzi-cluster-operator-6f7588bb79-bvfdp   1/1     Running   0             1d22h  
    strimzi-cluster-operator-6f7588bb79-lfcp6   1/1     Running   0             1d22h  
    strimzi-cluster-operator-6f7588bb79-qdlm8   1/1     Running   0             1d22h  
    

Helm kullanarak Strimzi Drain Cleaner'ı yükleme

Strimzi Drain Cleaner, broker podları için boşaltma isteklerini keserek sorunsuz Kubernetes düğüm boşaltması sağlar. Bu sayede Kafka bölüm çoğaltmalarının eksik çoğaltılmasını önler ve küme sağlığını ve güvenilirliğini korur.

Yüksek kullanılabilirlik için, kullanılabilirlik bölgeleri arasında birden fazla kopya ile Drain Cleaner'ı dağıtın ve bölge kesintileri veya küme güncellemeleri sırasında işlevsel kalmasını sağlamak için pod kesinti bütçeleriyle yapılandırın.

Strimzi Drain Cleaner kurulumu için bir Helm grafiği mevcuttur:

  1. komutunu kullanarak Drain Cleaner için ad alanını kubectl create namespace oluşturun.

    kubectl create namespace strimzi-drain-cleaner  
    
  2. Aşağıdaki betiği kullanarak Helm grafiği için belirli yapılandırmaları geçersiz kılmak için bir values.yaml dosya oluşturun:

    cat <<EOF > values.yaml  
    replicaCount: 3  
    namespace:  
      create: false  
    podDisruptionBudget:  
      create: true  
    affinity:  
      podAntiAffinity:  
        requiredDuringSchedulingIgnoredDuringExecution:  
          - labelSelector:  
              matchExpressions:  
                - key: app  
                  operator: In  
                  values:  
                    - strimzi-drain-cleaner  
            topologyKey: topology.kubernetes.io/zone  
    EOF  
    
  3. komutunu kullanarak Strimzi Drain Cleaner'ı helm install yükleyin.

    helm install strimzi-drain-cleaner oci://quay.io/strimzi-helm/strimzi-drain-cleaner \
    --namespace strimzi-drain-cleaner \
    --values values.yaml
    
  4. Strimzi Drain Cleaner'ın başarıyla dağıtıldığını ve komutunu kullanarak kubectl get tüm podların çalışır durumda olduğunu doğrulayın.

    kubectl get pods -n strimzi-drain-cleaner  
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    NAME                                     READY   STATUS    RESTARTS   AGE  
    strimzi-drain-cleaner-6d694bd55b-dshkp   1/1     Running   0          1d22h  
    strimzi-drain-cleaner-6d694bd55b-l8cbf   1/1     Running   0          1d22h  
    strimzi-drain-cleaner-6d694bd55b-wj6xx   1/1     Running   0          1d22h  
    

Kafka kümesi mimarisi ve dikkat edilmesi gerekenler

Strimzi Küme Operatörü, özel kaynak tanımlarını kullanarak AKS'de bildirim temelli Kafka dağıtımını etkinleştirir. Strimzi 0.46'dan başlayarak Kafka kümeleri ZooKeeper yerine Kafka içinde KRaft kullanır.

Strimzi, her bir havuza KafkaNodePool tanımlanmış bir rol (broker, denetleyici veya her ikisi) atandığı özel kaynağı kullanır.

  • Kafka aracıları iletilerin işlenmesini ve depolanmasını işler.
  • Kafka denetleyicileri , Raft konsensüs protokolunu kullanarak Kafka meta verilerini yönetir.

Yüksek kullanılabilirlik için hedef mimari şu şekilde tanımlanır:

  • Aracılar ve denetleyiciler için, her birinin üçer çoğaltması olan ayrı KafkaNodePools.
  • Podları kullanılabilirlik alanları ve düğümler arasında dağıtan Topoloji Yayma Kısıtlamaları.
  • Belirli düğüm havuzlarıyla kaynak kullanımını en iyi duruma getiren düğüm bağıntısı kuralları.
  • Aracı iletileri ve meta veriler için ayrı birimlere sahip Azure Disk CSI sürücüsünden kalıcı birimler.

Bu mimari ölçeklenebilirliği ve hataya dayanıklılığı artırırken, aracıların ve denetleyicilerin iş yükü gereksinimlerini karşılayacak şekilde bağımsız olarak ölçeklendirilmesine olanak sağlar.

Üretim Kafka kümeleri için JVM yapılandırması

Java Sanal Makinesi'nin (JVM) ayarlanması, özellikle üretim ortamlarında en iyi Kafka aracısı ve denetleyici performansı için kritik öneme sahiptir. Düzgün yapılandırılmış JVM ayarları, her bir aracının ağır yük altında kararlılığını sağlamaya, verimliliği en üst düzeye çıkarmaya ve gecikme süresini en aza indirmeye yardımcı olur.

Kafka'nın oluşturucusu LinkedIn, en yoğun kümelerinden birinde Java'da Kafka çalıştırmak için önerilen parametrelerini paylaştı: Apache Kafka Java Yapılandırması. Bu kılavuz, Kafka aracıları için temel olarak bu yapılandırmayı kullanır. Belirli iş yükü gereksinimlerinizi karşılayacak değişiklikler yapabilirsiniz.

jvmOptions:
  # Sets initial and maximum heap size to 6GB - critical for memory-intensive Kafka operations
  # Equal sizing prevents resizing pauses
  "-Xms": "6g"
  "-Xmx": "6g"
  "-XX":
    # Initial metaspace size (class metadata storage area) at 96MB
    "MetaspaceSize": "96m"
    
    # Enables the Garbage-First (G1) garbage collector, optimized for better predictability and lower pause times
    "UseG1GC": "true"
    
    # Targets maximum GC pause time of 20ms - keeps latency predictable
    "MaxGCPauseMillis": "20"
    
    # Starts concurrent GC cycle when heap is 35% full - balances CPU overhead and frequency
    "InitiatingHeapOccupancyPercent": "35"
    
    # Sets G1 heap region size to 16MB - affects collection efficiency and pause times
    "G1HeapRegionSize": "16M"
    
    # Keeps at least 50% free space after metaspace GC - prevents frequent resizing
    "MinMetaspaceFreeRatio": "50"
    
    # Limits expansion to allow up to 80% free space in metaspace after GC
    "MaxMetaspaceFreeRatio": "80"
    
    # Makes explicit System.gc() calls run concurrently instead of stopping all threads
    "ExplicitGCInvokesConcurrent": "true"

Kafka düğüm havuzlarını dağıtın

Bu bölümde, biri aracılar ve diğeri denetleyiciler için olmak üzere iki Kafka düğüm havuzu oluşturacaksınız.

  • komutunu kullanarak iki Kafka düğüm havuzu oluşturmak için YAML bildirimini kubectl apply uygulayın.

    kubectl apply -n kafka -f - <<EOF
    ---
    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: controller
      labels:
        strimzi.io/cluster: kafka-aks-cluster
    spec:
      replicas: 3
      roles:
        - controller
      resources:
        requests:
          memory: 4Gi
        limits:
          memory: 6Gi
      template:
        pod:
          metadata:
            labels:
              kafkaRole: controller
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - kafka
            podAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - weight: 100
                  podAffinityTerm:
                    labelSelector:
                      matchLabels:
                        kafkaRole: broker
                    topologyKey: kubernetes.io/hostname
          topologySpreadConstraints:
            - labelSelector:
                matchLabels:
                  kafkaRole: controller
              maxSkew: 1
              topologyKey: topology.kubernetes.io/zone
              whenUnsatisfiable: ScheduleAnyway
            - labelSelector:
                matchLabels:
                  kafkaRole: controller
              maxSkew: 1
              topologyKey: kubernetes.io/hostname
              whenUnsatisfiable: ScheduleAnyway
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 25Gi
            kraftMetadata: shared
            deleteClaim: false
            class: kafka-premium-ssd-v2
      jvmOptions:
        "-Xms": "3g"
        "-Xmx": "3g"
        "-XX":
          "MetaspaceSize": "96m"
          "UseG1GC": "true"
          "MaxGCPauseMillis": "20"
          "InitiatingHeapOccupancyPercent": "35"
          "G1HeapRegionSize": "16M"
          "MinMetaspaceFreeRatio": "50"
          "MaxMetaspaceFreeRatio": "80"
          "ExplicitGCInvokesConcurrent": "true" 
    ---
    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: broker
      labels:
        strimzi.io/cluster: kafka-aks-cluster
    spec:
      replicas: 3
      roles:
        - broker
      resources:
        requests:
          memory: 8Gi
        limits:
          memory: 10Gi
      template:
        pod:
          metadata:
            labels:
              kafkaRole: broker
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - kafka
            podAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - weight: 100
                  podAffinityTerm:
                    labelSelector:
                      matchLabels:
                        kafkaRole: controller
                    topologyKey: kubernetes.io/hostname
          topologySpreadConstraints:
            - labelSelector:
                matchLabels:
                  kafkaRole: broker
              maxSkew: 1
              topologyKey: topology.kubernetes.io/zone
              whenUnsatisfiable: ScheduleAnyway
            - labelSelector:
                matchLabels:
                  kafkaRole: broker
              maxSkew: 1
              topologyKey: kubernetes.io/hostname
              whenUnsatisfiable: ScheduleAnyway 
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 50Gi
            deleteClaim: false
            class: kafka-premium-ssd-v2
          - id: 1
            type: persistent-claim
            size: 25Gi
            kraftMetadata: shared
            deleteClaim: false
            class: kafka-premium-ssd-v2
      jvmOptions:
        "-Xms": "6g"
        "-Xmx": "6g"
        "-XX":
          "MetaspaceSize": "96m"
          "UseG1GC": "true"
          "MaxGCPauseMillis": "20"
          "InitiatingHeapOccupancyPercent": "35"
          "G1HeapRegionSize": "16M"
          "MinMetaspaceFreeRatio": "50"
          "MaxMetaspaceFreeRatio": "80"
          "ExplicitGCInvokesConcurrent": "true"
    EOF
    

Kafka düğüm havuzlarını oluşturduktan sonra, sonraki adım bu havuzları işleyen bir Kafka ekosistemine bağlayan bir Kafka kümesi özel kaynağı tanımlamaktır. Bu mimari, Kafka düğüm havuzlarının altyapı yönlerini yönetirken, Kafka küme kaynağının uygulama düzeyi yapılandırmalarını ele aldığı bir sorumluluk ayrımı deseni izler.

Kafka kümesini dağıt

  1. Kafka kümesini oluşturmadan önce, kubectl apply komutunu kullanarak JMX Prometheus Exporter yapılandırmasını içeren bir ConfigMap oluşturun. Bu ConfigMap, Kafka'nın iç JMX ölçümlerinin Prometheus biçiminde nasıl dönüştürüldüğünü ve kullanıma sunulduğunı tanımlar ve Kafka ekosisteminizin kapsamlı bir şekilde izlenmesini sağlar. Bu yapılandırmada tanımlanan desenler, JMX ölçüm yollarını uygun tür ve etiketlerle düzgün biçimlendirilmiş Prometheus ölçümleriyle eşler.

    kubectl apply -n kafka -f - <<'EOF'
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kafka-metrics
      labels:
        app: strimzi
    data:
      kafka-metrics-config.yaml: |
        # See https://github.com/prometheus/jmx_exporter for more info about JMX Prometheus Exporter metrics
        lowercaseOutputName: true
        rules:
        # Special cases and very specific rules
        - pattern: kafka.server<type=(.+), name=(.+), clientId=(.+), topic=(.+), partition=(.*)><>Value
          name: kafka_server_$1_$2
          type: GAUGE
          labels:
            clientId: "$3"
            topic: "$4"
            partition: "$5"
        - pattern: kafka.server<type=(.+), name=(.+), clientId=(.+), brokerHost=(.+), brokerPort=(.+)><>Value
          name: kafka_server_$1_$2
          type: GAUGE
          labels:
            clientId: "$3"
            broker: "$4:$5"
        - pattern: kafka.server<type=(.+), cipher=(.+), protocol=(.+), listener=(.+), networkProcessor=(.+)><>connections
          name: kafka_server_$1_connections_tls_info
          type: GAUGE
          labels:
            cipher: "$2"
            protocol: "$3"
            listener: "$4"
            networkProcessor: "$5"
        - pattern: kafka.server<type=(.+), clientSoftwareName=(.+), clientSoftwareVersion=(.+), listener=(.+), networkProcessor=(.+)><>connections
          name: kafka_server_$1_connections_software
          type: GAUGE
          labels:
            clientSoftwareName: "$2"
            clientSoftwareVersion: "$3"
            listener: "$4"
            networkProcessor: "$5"
        - pattern: "kafka.server<type=(.+), listener=(.+), networkProcessor=(.+)><>(.+-total):"
          name: kafka_server_$1_$4
          type: COUNTER
          labels:
            listener: "$2"
            networkProcessor: "$3"
        - pattern: "kafka.server<type=(.+), listener=(.+), networkProcessor=(.+)><>(.+):"
          name: kafka_server_$1_$4
          type: GAUGE
          labels:
            listener: "$2"
            networkProcessor: "$3"
        - pattern: kafka.server<type=(.+), listener=(.+), networkProcessor=(.+)><>(.+-total)
          name: kafka_server_$1_$4
          type: COUNTER
          labels:
            listener: "$2"
            networkProcessor: "$3"
        - pattern: kafka.server<type=(.+), listener=(.+), networkProcessor=(.+)><>(.+)
          name: kafka_server_$1_$4
          type: GAUGE
          labels:
            listener: "$2"
            networkProcessor: "$3"
        # Some percent metrics use MeanRate attribute
        # Ex) kafka.server<type=(KafkaRequestHandlerPool), name=(RequestHandlerAvgIdlePercent)><>MeanRate
        - pattern: kafka.(\w+)<type=(.+), name=(.+)Percent\w*><>MeanRate
          name: kafka_$1_$2_$3_percent
          type: GAUGE
        # Generic gauges for percents
        - pattern: kafka.(\w+)<type=(.+), name=(.+)Percent\w*><>Value
          name: kafka_$1_$2_$3_percent
          type: GAUGE
        - pattern: kafka.(\w+)<type=(.+), name=(.+)Percent\w*, (.+)=(.+)><>Value
          name: kafka_$1_$2_$3_percent
          type: GAUGE
          labels:
            "$4": "$5"
        # Generic per-second counters with 0-2 key/value pairs
        - pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*, (.+)=(.+), (.+)=(.+)><>Count
          name: kafka_$1_$2_$3_total
          type: COUNTER
          labels:
            "$4": "$5"
            "$6": "$7"
        - pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*, (.+)=(.+)><>Count
          name: kafka_$1_$2_$3_total
          type: COUNTER
          labels:
            "$4": "$5"
        - pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*><>Count
          name: kafka_$1_$2_$3_total
          type: COUNTER
        # Generic gauges with 0-2 key/value pairs
        - pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+), (.+)=(.+)><>Value
          name: kafka_$1_$2_$3
          type: GAUGE
          labels:
            "$4": "$5"
            "$6": "$7"
        - pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+)><>Value
          name: kafka_$1_$2_$3
          type: GAUGE
          labels:
            "$4": "$5"
        - pattern: kafka.(\w+)<type=(.+), name=(.+)><>Value
          name: kafka_$1_$2_$3
          type: GAUGE
        # Emulate Prometheus 'Summary' metrics for the exported 'Histogram's.
        # Note that these are missing the '_sum' metric!
        - pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+), (.+)=(.+)><>Count
          name: kafka_$1_$2_$3_count
          type: COUNTER
          labels:
            "$4": "$5"
            "$6": "$7"
        - pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.*), (.+)=(.+)><>(\d+)thPercentile
          name: kafka_$1_$2_$3
          type: GAUGE
          labels:
            "$4": "$5"
            "$6": "$7"
            quantile: "0.$8"
        - pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+)><>Count
          name: kafka_$1_$2_$3_count
          type: COUNTER
          labels:
            "$4": "$5"
        - pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.*)><>(\d+)thPercentile
          name: kafka_$1_$2_$3
          type: GAUGE
          labels:
            "$4": "$5"
            quantile: "0.$6"
        - pattern: kafka.(\w+)<type=(.+), name=(.+)><>Count
          name: kafka_$1_$2_$3_count
          type: COUNTER
        - pattern: kafka.(\w+)<type=(.+), name=(.+)><>(\d+)thPercentile
          name: kafka_$1_$2_$3
          type: GAUGE
          labels:
            quantile: "0.$4"
        # KRaft overall related metrics
        # distinguish between always increasing COUNTER (total and max) and variable GAUGE (all others) metrics
        - pattern: "kafka.server<type=raft-metrics><>(.+-total|.+-max):"
          name: kafka_server_raftmetrics_$1
          type: COUNTER
        - pattern: "kafka.server<type=raft-metrics><>(current-state): (.+)"
          name: kafka_server_raftmetrics_$1
          value: 1
          type: UNTYPED
          labels:
            $1: "$2"
        - pattern: "kafka.server<type=raft-metrics><>(.+):"
          name: kafka_server_raftmetrics_$1
          type: GAUGE
        # KRaft "low level" channels related metrics
        # distinguish between always increasing COUNTER (total and max) and variable GAUGE (all others) metrics
        - pattern: "kafka.server<type=raft-channel-metrics><>(.+-total|.+-max):"
          name: kafka_server_raftchannelmetrics_$1
          type: COUNTER
        - pattern: "kafka.server<type=raft-channel-metrics><>(.+):"
          name: kafka_server_raftchannelmetrics_$1
          type: GAUGE
        # Broker metrics related to fetching metadata topic records in KRaft mode
        - pattern: "kafka.server<type=broker-metadata-metrics><>(.+):"
          name: kafka_server_brokermetadatametrics_$1
          type: GAUGE
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cruise-control-metrics
      labels:
        app: strimzi
    data:
      metrics-config.yaml: |
        # See https://github.com/prometheus/jmx_exporter for more info about JMX Prometheus Exporter metrics
        lowercaseOutputName: true
        rules:
        - pattern: kafka.cruisecontrol<name=(.+)><>(\w+)
          name: kafka_cruisecontrol_$1_$2
          type: GAUGE
    EOF
    
  2. Komutunu kullanarak daha önce oluşturulan düğüm havuzlarını eksiksiz bir Kafka ekosistemine bağlayan Kafka küme kaynağını dağıtın kubectl apply . Bu özel kaynak aşağıdaki kritik bileşenleri yapılandırıyor:

    • Kafka çekirdek yapılandırması: Çoğaltma faktörlerini, dinleyici ayarlarını ve Kafka'ya özgü diğer parametreleri tanımlar.
    • Cruise Control: Otomatik küme dengeleme ve izleme özellikleri sağlar.
    • Varlık İşleci: Kubernetes kaynakları aracılığıyla Kafka konularını ve kullanıcılarını bildirimli olarak yöneten Konu başlığını ve Kullanıcı İşleçlerini dağıtır.
    • JMX ölçümleri: Önceden tanımlanmış ConfigMap'leri kullanarak ölçümlerin açığa çıkarılmasını yapılandırır.
    kubectl apply -n kafka -f - <<EOF
    ---
    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: kafka-aks-cluster
      annotations:
        strimzi.io/node-pools: enabled
        strimzi.io/kraft: enabled
    spec:
      kafka:
        version: 3.9.0
        metadataVersion: 3.9-IV0
        rack:
          topologyKey: topology.kubernetes.io/zone
        template:
          podDisruptionBudget:
            maxUnavailable: 2
        listeners:
          - name: internal
            port: 9092
            type: internal
            tls: true
        config:
          offsets.topic.replication.factor: 3
          transaction.state.log.replication.factor: 3
          transaction.state.log.min.isr: 2
          default.replication.factor: 3
          min.insync.replicas: 2
          log.segment.bytes: 1073741824  
          log.retention.hours: 168  
          log.retention.check.interval.ms: 300000 
        metricsConfig:
          type: jmxPrometheusExporter
          valueFrom:
            configMapKeyRef:
              name: kafka-metrics
              key: kafka-metrics-config.yaml
      cruiseControl:
        metricsConfig:
          type: jmxPrometheusExporter
          valueFrom:
            configMapKeyRef:
              name: cruise-control-metrics
              key: metrics-config.yaml
      entityOperator:
        topicOperator: {}
        userOperator: {}
    EOF
    
  3. Dağıtıldıktan sonra, kubectl get komutunu kullanarak tüm KafkaNodePools, Kafka küme kaynakları ve bunlara karşılık gelen podların oluşturulup oluşturulmadığını ve çalışır durumda olup olmadığını kontrol ederek Kafka dağıtımınızı doğrulayın.

    kubectl get pods,kafkanodepool,kafka -n kafka
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    NAME                                                     READY   STATUS    RESTARTS   AGE
    pod/kafka-aks-cluster-broker-0                           1/1     Running   0          1d22h
    pod/kafka-aks-cluster-broker-1                           1/1     Running   0          1d22h
    pod/kafka-aks-cluster-broker-2                           1/1     Running   0          1d22h
    pod/kafka-aks-cluster-controller-3                       1/1     Running   0          1d22h
    pod/kafka-aks-cluster-controller-4                       1/1     Running   0          1d22h
    pod/kafka-aks-cluster-controller-5                       1/1     Running   0          1d22h
    pod/kafka-aks-cluster-cruise-control-844b69848-87rf6     1/1     Running   0          1d22h
    pod/kafka-aks-cluster-entity-operator-6f949f6774-t8wql   2/2     Running   0          1d22h
    
    NAME                                        DESIRED REPLICAS   ROLES            NODEIDS
    kafkanodepool.kafka.strimzi.io/broker       3                  ["broker"]       [0,1,2]
    kafkanodepool.kafka.strimzi.io/controller   3                  ["controller"]   [3,4,5]
    
    NAME                                       DESIRED KAFKA REPLICAS   DESIRED ZK REPLICAS   READY   METADATA STATE   WARNINGS
    kafka.kafka.strimzi.io/kafka-aks-cluster 
    

Kafka Kullanıcısı ve Konusu Oluşturma

Kafka kümesi özel kaynağıyla dağıtılan Strimzi Varlık İşleci, Kubernetes özel kaynaklarını (KafkaTopic ve KafkaUser) gerçek Kafka kaynaklarına çevirir. Bu, GitOps iş akışlarını ve tutarlı yapılandırma yönetimini etkinleştirir.

Uyarı

Varlık İşleci'ni kullanarak Kafka Konuları ve Kullanıcıları bildirimli olarak oluşturmak isteğe bağlıdır. Bunları geleneksel Kafka CLI araçlarını veya API'lerini kullanarak da oluşturabilirsiniz. Ancak bildirim temelli yaklaşım, sürüm denetimi, denetim izleri ve ortamlar arasında tutarlı yönetim gibi avantajlar sunar.

  1. komutunu kullanarak kubectl apply Konu İşleci ile bir Kafka Konusu oluşturun.

    kubectl apply -n kafka -f - << EOF  
    apiVersion: kafka.strimzi.io/v1beta2  
    kind: KafkaTopic  
    metadata:  
      name: test-topic  
      labels:  
        strimzi.io/cluster: kafka-aks-cluster 
    spec:  
      replicas: 3  
      partitions: 4  
      config:  
        retention.ms: 7200000  
        segment.bytes: 1073741824  
    EOF  
    
  2. Kafka konusunun başarıyla oluşturulduğunu kubectl get komutunu kullanarak doğrulayın.

    kubectl get kafkatopic -n kafka  
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    NAME         CLUSTER             PARTITIONS   REPLICATION FACTOR   READY  
    test-topic   kafka-aks-cluster   4            3                    True  
    

    Daha fazla bilgi için bkz . Kafka konularını yönetmek için Konu İşleci'ni kullanma.

  3. komutunu kullanarak kubectl apply Kullanıcı İşleci ile bir Kafka Kullanıcısı oluşturun.

    kubectl apply -f - <<EOF  
    apiVersion: kafka.strimzi.io/v1beta2  
    kind: KafkaUser  
    metadata:  
      name: test-user  
      labels:  
        strimzi.io/cluster: kafka-aks-cluster  
    spec:  
      authentication:  
        type: tls  
      authorization:  
        type: simple  
        acls:  
          - resource:  
              type: topic  
              name: test-topic  
              patternType: literal  
            operations:  
              - Describe  
              - Read  
            host: "*"  
          - resource:  
              type: group  
              name: test-group  
              patternType: literal  
            operations:  
              - Read  
            host: "*"  
          - resource:  
              type: topic  
              name: test-topic  
              patternType: literal  
            operations:  
              - Create  
              - Describe  
              - Write  
            host: "*"  
    EOF  
    

    Daha fazla bilgi için bkz. Kafka kullanıcılarını yönetmek için Kullanıcı operatörünü kullanma.

Sonraki adım

Katkıda Bulunanlar

Microsoft bu makaleyi korur. Başlangıçta aşağıdaki katkıda bulunanlar yazdı:

  • Sergio Navar | Kıdemli Müşteri Mühendisi
  • Erin Schaffer | İçerik Geliştirici 2