Linux on Power ( ppc64le ) 에서 Kafka 데이터 저장소 생성하기

Kafka 운영자를 설치하고 데이터 저장소를 설정하십시오.

시작하기 전에

외부 저장소에서 이미지를 가져오기 위해 온라인 및 오프라인 호스트를 준비했는지 확인하십시오. 또한 올바른 Helm 저장소가 추가되었는지 확인하십시오.

자세한 내용은 ‘데이터 스토어 설치 준비’를 참조하십시오.

Strimzi( 0.46.0 )에서 Kafka 버전( 3.8.0 및 3.8.1 ), ZooKeeper-based ( Apache Kafka ) 클러스터, 그리고 KRaft 마이그레이션에 대한 지원이 중단되었습니다. Strimzi( 0.45.0 ) 또는 그 이전 버전을 사용 중이라면, Strimzi( 0.46.0 )로 업그레이드하기 전에 먼저 KRaft로 마이그레이션해야 합니다.

Z ookeeper 기반 클러스터에서 KRaft 클러스터로 데이터를 마이그레이션하는 방법에 대한 자세한 내용은 온라인 문서의 ‘ Kafka 용 Zookeeper에서 KRaft로의 마이그레이션’을 참조하십시오.

Kafka 배포용 운영체제 버전 및 이미지 태그

고정된 Helm 차트 또는 운영자 버전에는 다음 이미지가 필요합니다.

표 1. Kafka 연산자 버전 및 이미지 태그
플랫폼 오퍼레이터 버전 Helm 차트 버전 태그가 있는 이미지
Linux® on Power® (ppc64le) 0.51.0 0.51.0

artifact-public.instana.io/self-hosted-images/3rd-party/operator/strimzi: 0.51.0_v0.32.0

artifact-public.instana.io/self-hosted-images/3rd-party/datastore/kafka: 0.51.0-kafka-4.1.1_v0.32.0

Kafka 온라인 설치

Kafka 데이터 저장소를 설치하려면 다음 단계를 완료하십시오.

  1. instana-kafka 네임스페이스를 만듭니다.

    kubectl create namespace instana-kafka
     
  2. Kafka 연산자와 이미지에 대한 이미지 풀 시크릿을 만들고 다운로드 키로 <download_key> 값을 업데이트합니다.

     kubectl create secret docker-registry instana-registry \
     --namespace=instana-kafka \
     --docker-username=_ \
     --docker-password=<download_key> \
     --docker-server=artifact-public.instana.io
     
  3. 스트림지 연산자를 설치합니다.

    helm install strimzi-kafka-operator instana/strimzi-kafka-operator --version 0.51.0 -n instana-kafka --set image.registry=artifact-public.instana.io --set image.repository=self-hosted-images/3rd-party/operator --set image.name=strimzi --set image.tag=0.51.0_v0.32.0 --set image.imagePullSecrets[0].name="instana-registry" --set kafka.image.registry=artifact-public.instana.io --set kafka.image.repository=self-hosted-images/3rd-party/datastore --set kafka.image.name=kafka --set kafka.image.tag=0.51.0-kafka-4.1.1_v0.32.0
                   
  4. 브로커용 ` YAML ` 파일을 생성합니다. 예를 들어, 브로커 kafka-broker.yaml 구성의 경우.

    apiVersion: kafka.strimzi.io/v1
    kind: KafkaNodePool
    metadata:
      name: kafka
      labels:
        strimzi.io/cluster: instana
    spec:
      replicas: 3
      roles:
         - broker
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 50Gi
            deleteClaim: true
      template:
        pod:
          tmpDirSizeLimit: 500Mi
     
  5. 브로커를 배포합니다.

    kubectl apply -f kafka-broker.yaml -n instana-kafka
     
  6. 컨트롤러용 ` YAML ` 파일을 생성합니다. 예를 들어, 컨트롤러 kafka-controller.yaml 구성의 경우.

    apiVersion: kafka.strimzi.io/v1
    kind: KafkaNodePool
    metadata:
      name: controller
      labels:
        strimzi.io/cluster: instana
    spec:
      replicas: 3
      roles:
        - controller
      storage:
        type: persistent-claim
        size: 50Gi
        deleteClaim: true
      template:
        pod:
          tmpDirSizeLimit: 500Mi
     
  7. 컨트롤러 배포.

    kubectl apply -f kafka-controller.yaml -n instana-kafka
     
  8. YAML 파일을 작성하십시오. 예를 들어, ` kafka.yamlKafka ` 구성을 사용할 경우.

    apiVersion: kafka.strimzi.io/v1
    kind: Kafka
    metadata:
      name: instana
      labels:
        strimzi.io/cluster: instana
      annotations:
        strimzi.io/node-pools: enabled
        strimzi.io/kraft:  enabled
    spec:
      kafka:
        version: 4.1.1
        listeners:
          - name: scram
            port: 9092
            type: internal
            tls: false
            authentication:
              type: scram-sha-512
            configuration:
              useServiceDnsDomain: true
        authorization:
          type: simple
          superUsers:
            - strimzi-kafka-user
        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
          max.message.bytes: 52428800
          replica.fetch.max.bytes: 52428800
        template:
          pod:
            tmpDirSizeLimit: 100Mi
      entityOperator:
        template:
          pod:
            tmpDirSizeLimit: 100Mi
        userOperator:
          image: artifact-public.instana.io/self-hosted-images/3rd-party/operator/strimzi:0.51.0_v0.32.0
                   
  9. Kafka (온라인 및 오프라인)의 단계를 완료하십시오.

Kafka 오프라인 설치

설치 준비시 외부 레지스트리에서 ClickHouse 이미지를 아직 가져오지 않은 경우 지금 가져올 수 있습니다. bastion 호스트에서 다음 명령을 실행하십시오. 그런 다음, 해당 이미지를 에어갭 환경에 있는 Instana 호스트로 복사하십시오.

docker pull artifact-public.instana.io/self-hosted-images/3rd-party/operator/strimzi:0.51.0_v0.32.0
docker pull artifact-public.instana.io/self-hosted-images/3rd-party/datastore/kafka:0.51.0-kafka-4.1.1_v0.32.0
         

Instana 호스트에서 다음 단계를 수행하십시오.

  1. 이미지를 내부 이미지 레지스트리에 다시 태그 지정하십시오.

    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/strimzi/operator:0.51.0_v0.32.0 <internal-image-registry>/self-hosted-images/3rd-party/strimzi/operator:0.51.0_v0.32.0
    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/datastore/kafka:0.51.0-kafka-4.1.1_v0.32.0<internal-image-registry>/self-hosted-images/3rd-party/strimzi/kafka:0.51.0-kafka-4.1.1_v0.32.0
                   
  2. 배스천 호스트의 내부 이미지 레지스트리에 이미지를 푸시하십시오.

    docker push <internal-image-registry>/self-hosted-images/3rd-party/strimzi/operator:0.51.0_v0.32.0
    docker push <internal-image-registry>/self-hosted-images/3rd-party/strimzi/kafka:0.51.0-kafka-4.1.1_v0.32.0
                   
  3. instana-kafka 네임스페이스를 만듭니다:

    kubectl create namespace instana-kafka
     
  4. 선택 사항입니다: 내부 이미지 레지스트리에 인증이 필요한 경우 이미지 풀 시크릿을 생성합니다.

    kubectl create secret docker-registry <secret_name> --namespace instana-kafka \
    --docker-username=<registry_username> \
    --docker-password=<registry_password> \
    --docker-server=<internal-image-registry>:<internal-image-registry-port> \
    --docker-email=<registry_email>
     
  5. 스트림지 오퍼레이터를 설치합니다. 이전 단계에서 이미지 풀 시크릿을 만든 경우 다음 명령에 --set image.imagePullSecrets[0].name="<internal-image-registry-pull-secret>"을 추가합니다.

    helm install strimzi-kafka-operator strimzi-kafka-operator-0.51.0.tgz --version 0.51.0 -n instana-kafka --set image.registry=<internal-image-registry> --set image.repository=self-hosted-images/3rd-party/strimzi --set image.name=operator --set image.tag=0.51.0_v0.32.0 --set kafka.image.registry=<internal-image-registry> --set kafka.image.repository=self-hosted-images/3rd-party/strimzi --set kafka.image.name=kafka --set kafka.image.tag=0.51.0-kafka-4.1.1_v0.32.0
                   
  6. 브로커용 ` YAML ` 파일을 생성합니다. 예를 들어, 브로커 kafka-broker.yaml 구성의 경우.

    apiVersion: kafka.strimzi.io/v1
    kind: KafkaNodePool
    metadata:
      name: kafka
      labels:
        strimzi.io/cluster: instana
    spec:
      replicas: 3
      roles:
         - broker
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 50Gi
            deleteClaim: true
      template:
        pod:
          tmpDirSizeLimit: 500Mi
     
  7. 브로커를 배포합니다.

    kubectl apply -f kafka-broker.yaml -n instana-kafka
     
  8. 컨트롤러용 ` YAML ` 파일을 생성합니다. 예를 들어, 컨트롤러 kafka-controller.yaml 구성의 경우.

    apiVersion: kafka.strimzi.io/v1
    kind: KafkaNodePool
    metadata:
      name: controller
      labels:
        strimzi.io/cluster: instana
    spec:
      replicas: 3
      roles:
        - controller
      storage:
        type: persistent-claim
        size: 50Gi
        deleteClaim: true
      template:
        pod:
          tmpDirSizeLimit: 500Mi
     
  9. 컨트롤러 배포.

    kubectl apply -f kafka-controller.yaml -n instana-kafka
     
  10. 예를 kafka.yaml들어, Kafka 구성을 포함하는 ` YAML ` 파일을 생성합니다.

    apiVersion: kafka.strimzi.io/v1
    kind: Kafka
    metadata:
      name: instana
      labels:
        strimzi.io/cluster: instana
      annotations:
        strimzi.io/node-pools: enabled
        strimzi.io/kraft:  enabled
    spec:
      kafka:
        version: 4.1.1
        listeners:
          - name: scram
            port: 9092
            type: internal
            tls: false
            authentication:
              type: scram-sha-512
            configuration:
              useServiceDnsDomain: true
        authorization:
          type: simple
          superUsers:
            - strimzi-kafka-user
        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
          max.message.bytes: 52428800
          replica.fetch.max.bytes: 52428800
        template:
          pod:
            tmpDirSizeLimit: 100Mi
      entityOperator:
        template:
          pod:
            tmpDirSizeLimit: 100Mi
        userOperator:
          image: <internal-image-registry>/self-hosted-images/3rd-party/strimzi/operator:0.51.0_v0.32.0
                   
  11. Kafka (온라인 및 오프라인)의 단계를 완료하십시오.

Kafka 배포 및 검증 (온라인 및 오프라인)

Kafka 인스턴스를 배치하고 데이터 저장소를 작성하려면 다음 단계를 완료하십시오.

  1. Kafka를 배치하십시오.

    kubectl apply -f kafka.yaml -n instana-kafka
    kubectl wait kafka/instana --for=condition=Ready --timeout=300s -n instana-kafka
     
  2. SSL/SCRAM을 사용하여 Kafka 클러스터로 인증할 수 있는 Kafka 사용자를 작성하십시오.

    1. YAML 파일을 생성합니다. 예를 들어 strimzi-kafka-user.yaml, Kafka 사용자 사양을 포함하도록 합니다.

      apiVersion: kafka.strimzi.io/v1
      kind: KafkaUser
      metadata:
        name: strimzi-kafka-user
        labels:
          strimzi.io/cluster: instana
      spec:
        authentication:
          type: scram-sha-512
        authorization:
          type: simple
          acls:
            - resource:
                type: topic
                name: '*'
                patternType: literal
              operation: All
              host: "*"
            - resource:
                type: group
                name: '*'
                patternType: literal
              operation: All
              host: "*"
       
    2. strimzi-kafka-user 사용자를 작성하십시오.

      kubectl apply -f strimzi-kafka-user.yaml -n instana-kafka
      kubectl wait kafkauser/strimzi-kafka-user --for=condition=Ready --timeout=60s -n instana-kafka
       
    3. strimzi-kafka-user의 비밀번호를 검색하십시오.

      kubectl get secret strimzi-kafka-user -n instana-kafka --template='{{index .data.password | base64decode}}' && echo
       
    4. 검색된 비밀번호를 config.yaml 파일에 저장하십시오. <RETRIEVED_FROM_SECRET> 값을 이전 단계에서 얻은 비밀번호로 대체하십시오.

      datastoreConfigs:
        ...
        kafkaConfig:
          adminUser: strimzi-kafka-user
          adminPassword: <RETRIEVED_FROM_SECRET>
          consumerUser: strimzi-kafka-user
          consumerPassword: <RETRIEVED_FROM_SECRET>
          producerUser: strimzi-kafka-user
          producerPassword: <RETRIEVED_FROM_SECRET>
        ...
       
  3. Instana ( Kafka ) 설치 상태를 확인하십시오.

    kubectl get all -n instana-kafka
     

    출력은 다음 예제와 같을 수 있습니다.

    NAME                                           READY   STATUS    RESTARTS   AGE
    pod/instana-entity-operator-8564975588-mrz2f   3/3     Running   0          15m
    pod/instana-kafka-0                            1/1     Running   0          16m
    pod/instana-kafka-1                            1/1     Running   0          16m
    pod/instana-kafka-2                            1/1     Running   0          16m
    pod/instana-controller-0                        1/1     Running   0          17m
    pod/instana-controller-1                        1/1     Running   0          17m
    pod/instana-controller-2                        1/1     Running   0          17m
    pod/strimzi-cluster-operator-cf49c75d8-qm8jq   1/1     Running   0          34m
    
    NAME                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    service/instana-kafka-bootstrap    ClusterIP   192.168.1.239   <none>        9091/TCP,9092/TCP            16m
    service/instana-kafka-brokers      ClusterIP   None            <none>        9090/TCP,9091/TCP,9092/TCP   16m
    
    NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/instana-entity-operator    1/1     1            1           15m
    deployment.apps/strimzi-cluster-operator   1/1     1            1           34m
    
    NAME                                                 DESIRED   CURRENT   READY   AGE
    replicaset.apps/instana-entity-operator-8564975588   1         1         1       15m
    replicaset.apps/strimzi-cluster-operator-cf49c75d8   1         1         1       34m
     

Kafka 설치 후 수행할 작업 (온라인 및 오프라인)

Kafka 운영자를 성공적으로 설치한 후 필요한 경우 다음 태스크를 완료하십시오.

(선택 사항) 크루즈 컨트롤을 사용하여 클러스터 부하 분산

크루즈 제어는 Kafka 클러스터에서 워크로드의 밸런스를 유지합니다. 자세한 정보는 크루즈 제어를 사용한 클러스터 밸런싱을 참조하십시오.

Kafka 배치에서 크루즈 컨트롤을 사용하려면 다음 단계를 완료하십시오.

  1. 클러스터의 브로커에 메트릭 리포터를 설치하십시오. 자세한 내용은 ‘ Kafka 모니터링’을 참조하십시오.

  2. 크루즈 컨트롤 서버 배포를 생성합니다.

    1. 편집할 Kafka 사용자 정의 자원을 여십시오.

      kubectl edit kafkas.kafka.strimzi.io <your-kafka-cluster-name> -n instana-kafka
       
    2. Kafka 사용자 정의 자원에 다음 구성을 추가하십시오.

      apiVersion: kafka.strimzi.io/v1
      kind: Kafka
      metadata:
        name: instana
      spec:
        # ...
        cruiseControl: {}
       
  3. 구성을 적용하십시오.

    kubectl apply -f kafka.yaml -n instana-kafka
     

    구성을 적용할 때 Kafka 는 모든 기본 크루즈 제어 설정을 사용하여 크루즈 제어 서버를 배치합니다. 새 클러스터를 시작하는 대신 기존 클러스터에 크루즈 제어를 추가하면 모든 Kafka 브로커 팟 (Pod) 이 메트릭 리포터를 설치하기 위해 롤링하는 것을 볼 수 있습니다.

  4. 클러스터에 크루즈 제어가 배치되었는지 확인하십시오.

    kubectl get pods -n instana-kafka
     

    명령 출력은 다음 예제에 표시된 대로 크루즈 제어 팟 (Pod) 을 표시합니다.

    NAME                                          READY   STATUS    RESTARTS   AGE
    instana-cruise-control-6fcbd54b48-ndzrh       2/2     Running   0          8m48s
    instana-entity-operator-78d7995695-8tt2v      3/3     Running   0          12m
    instana-kafka-0                               2/2     Running   0          9m12s
    instana-kafka-1                               2/2     Running   0          10m
    instana-kafka-2                               2/2     Running   0          9m46s
    instana-controller-0                          1/1     Running   0          13m
    instana-controller-1                          1/1     Running   0          13m
    instana-controller-2                          1/1     Running   0          13m
    strimzi-cluster-operator-54565f8c56-rmdb8     1/1     Running   0          14m
     

    크루즈 제어가 배치된 후에는 각 브로커에서 메트릭 기자가 작성하는 토픽에서 메트릭을 가져오기 시작합니다.

최적화 제안 받기

크루즈 제어가 배치된 후 최적화 제안을 생성할 수 있습니다. 이를 수행하려면 KafkaRebalance 사용자 정의 자원을 적용해야 합니다 (이에 대한 정의는 Strimzi를 설치할 때 설치됨). 기본 KafkaRebalance 가 다음 예제에 표시되어 있습니다.

apiVersion: kafka.strimzi.io/v1
kind: KafkaRebalance
metadata:
  name: my-rebalance
  labels:
    strimzi.io/cluster: instana
# no goals specified, using the default goals from the Cruise Control configuration
spec: {}
 

다른 자원과 마찬가지로 KafkaRebalance 사용자 정의 자원을 배치할 수 있습니다.

kubectl apply -f kafka-rebalance.yaml -n instana-kafka
 

KafkaRebalance 리소스를 Kafka 클러스터에 적용하면, 클러스터 운영자는 크루즈 컨트롤에 관련 요청을 발행하여 최적화 제안을 가져옵니다. 클러스터 운영자는 크루즈 컨트롤의 KafkaRebalance 상태와 진행률 업데이트를 저장합니다. 다음 명령을 사용하여 업데이트를 확인할 수 있습니다.

kubectl describe kafkarebalance my-rebalance -n instana-kafka
 

결과는 다음 예제와 같을 수 있습니다.

Name:         my-rebalance
Namespace:    instana-kafka
Labels:       strimzi.io/cluster=instana
Annotations:  API Version:  kafka.strimzi.io/v1
Kind:         KafkaRebalance
Metadata:
# ...
Status:
  Conditions:
    Last Transition Time:  2023-04-04T11:13:35.749066535Z
    Status:                ProposalReady
    Type:                  State
  Observed Generation:     1
  Optimization Result:
    Data To Move MB:  0
    Excluded Brokers For Leadership:
    Excluded Brokers For Replica Move:
    Excluded Topics:
    Intra Broker Data To Move MB:         12
    Monitored Partitions Percentage:      100
    Num Intra Broker Replica Movements:   0
    Num Leader Movements:                 24
    Num Replica Movements:                55
                On Demand Balancedness Score After:   84.23162054159118
    On Demand Balancedness Score Before:  80.87946050436929
    Recent Windows:                       5
  Session Id:                             42f7cc24-b295-4406-80c9-c3c7a3625180
 

다음 항목은 KafkaRebalance 요청의 주요 파트입니다.

  • Status.Conditions.Status 필드는 재조정 요청의 진행 상태를 표시합니다. 제안이 아직 준비되지 않은 경우 ProposalPendingStatus로 표시될 수 있습니다.

  • Status.Optimization Result (제안이 준비되면) 는 최적화 제안의 요약을 표시합니다. 이러한 각 값의 의미는 Strimzi 문서에 설명되어 있습니다.

클러스터 재조정 시작

KafkaRebalance 제안이 사용자의 요구사항과 일치하는 경우, approve 어노테이션을 크루즈 제어의 KafkaRebalance 자원에 적용하여 변경사항 적용을 시작할 수 있습니다.

kubectl annotate kafkarebalance my-rebalance strimzi.io/rebalance=approve -n instana-kafka
 

approve 어노테이션을 적용하면, 크루즈 제어가 KafkaRebalance 제안의 변경사항을 업데이트합니다. 클러스터 운영자는 리밸런싱이 진행되는 동안 KafkaRebalance 리소스의 상태를 최신 상태로 유지합니다. 다음 명령을 실행하여 재조정의 진행 상태를 확인할 수 있습니다.

kubectl describe kafkarebalance my-rebalance -n instana-kafka
 

재조정이 진행 중이면 StatusRebalancing가 표시됩니다. 재조정이 완료되면 StatusReady가 표시됩니다.

다음 예를 참조하십시오.

Name:         my-rebalance
Namespace:    instana-kafka
Labels:       strimzi.io/cluster=instana
Annotations:  API Version:  kafka.strimzi.io/v1
Kind:         KafkaRebalance
Metadata:
# ...
Status:
  Conditions:
    Last Transition Time:  2023-04-04T11:16:06.230479824Z
    Status:                Rebalancing
    Type:                  State
# ...
 

클러스터 재조정 중지

재조정은 시간이 오래 걸릴 수 있으며 클러스터의 성능에 영향을 줄 수 있습니다. 따라서 문제가 발생하는 경우 재조정을 중지할 수 있습니다. 진행 중인 재조정을 중지하려면 다음 명령을 사용하여 언제든지 stop 어노테이션을 KafkaRebalance 자원에 적용할 수 있습니다.

kubectl annotate kafkarebalance my-rebalance strimzi.io/rebalance=stop -n instana-kafka