OpenShift에서 Apache Kafka용 스트림 배포 및 관리


Red Hat Streams for Apache Kafka 2.7

OpenShift Container Platform에서 Apache Kafka 2.7에 대한 Streams 배포 및 관리

초록

Apache Kafka Operator용 Streams를 사용하여 Kafka 구성 요소를 배포합니다. 대규모 메시징 네트워크를 빌드하도록 Kafka 구성 요소를 구성합니다. Kafka 클러스터에 대한 보안 클라이언트 액세스 및 메트릭 및 거부된 추적과 같은 Incoprorate 기능을 설정합니다. 지원되는 최신 Kafka 버전을 포함하여 새로운 기능을 활용하여 업그레이드합니다.

머리말

Red Hat 문서에 관한 피드백 제공

문서 개선을 위한 의견에 감사드립니다.

개선 사항을 제안하려면 Jira 문제를 열고 제안된 변경 사항을 설명합니다. 귀하의 요청을 신속하게 처리할 수 있도록 가능한 한 자세한 정보를 제공하십시오.

사전 요구 사항

  • Red Hat 고객 포털 계정이 있어야 합니다. 이 계정을 사용하면 Red Hat Jira Software 인스턴스에 로그인할 수 있습니다.
    계정이 없는 경우 계정을 생성하라는 메시지가 표시됩니다.

프로세스

  1. 다음: 생성 문제를 클릭합니다.
  2. 요약 텍스트 상자에 문제에 대한 간략한 설명을 입력합니다.
  3. 설명 텍스트 상자에 다음 정보를 입력합니다.

    • 문제를 발견한 페이지의 URL입니다.
    • 문제에 대한 자세한 설명입니다.
      다른 필드에 있는 정보는 기본값에 따라 그대로 둘 수 있습니다.
  4. 보고자 이름을 추가합니다.
  5. 생성 을 클릭하여 Jira 문제를 문서 팀에 제출합니다.

피드백을 제공하기 위해 시간을 내어 주셔서 감사합니다.

1장. 배포 개요

Apache Kafka 스트림은 OpenShift 클러스터에서 Apache Kafka 를 실행하는 프로세스를 간소화합니다.

이 가이드에서는 Apache Kafka용 스트림 배포 및 관리를 위한 지침을 제공합니다. 배포 옵션 및 단계는 Apache Kafka용 Streams에 포함된 설치 파일 예제를 사용하여 다룹니다. 이 가이드에서는 중요한 구성 고려 사항을 강조하지만 사용 가능한 모든 옵션을 다루지는 않습니다. Kafka 구성 요소 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.

이 가이드에서는 배포 지침 외에도 사전 및 배포 후 지침을 제공합니다. Kafka 클러스터에 대한 클라이언트 액세스 설정 및 보안을 설명합니다. 또한 메트릭 통합, 분산 추적 및 Cruise Control과 같은 클러스터 관리 도구 및 Apache Kafka DrainCleaner용 Streams와 같은 추가 배포 옵션을 살펴봅니다. 또한 최적의 성능을 위해 Streams for Apache Kafka 관리 및 Kafka 구성 세부 조정에 대한 권장 사항을 찾을 수 있습니다.

배포를 최신 상태로 유지하는 데 도움이 되도록 Apache Kafka 및 Kafka용 Streams에 대한 업그레이드 지침이 제공됩니다.

Apache Kafka용 스트림은 배포에 관계없이 모든 유형의 OpenShift 클러스터와 호환되도록 설계되었습니다. 배포에 공용 클라우드 또는 프라이빗 클라우드가 포함되었는지, 로컬 개발 환경을 설정하는 경우 이 가이드의 지침을 모든 경우에 적용할 수 있습니다.

1.1. Apache Kafka 사용자 정의 리소스의 스트림

Apache Kafka용 Streams를 사용하여 OpenShift 클러스터에 Kafka 구성 요소를 배포하는 것은 사용자 정의 리소스를 사용하여 구성할 수 있습니다. 이러한 리소스는 OpenShift 리소스를 확장하는 CRD(Custom Resource Definitions)에서 도입한 API 인스턴스로 생성됩니다.

CRD는 OpenShift 클러스터의 사용자 정의 리소스를 설명하는 구성 지침으로 작동하며 배포에 사용되는 각 Kafka 구성 요소와 사용자 및 주제에 대해 Streams for Apache Kafka에 제공됩니다. CRD 및 사용자 정의 리소스는 YAML 파일로 정의됩니다. YAML 파일의 예는 Apache Kafka 배포를 위한 스트림과 함께 제공됩니다.

CRD를 사용하면 Apache Kafka 리소스의 Streams가 CLI 접근성 및 구성 검증과 같은 기본 OpenShift 기능을 활용할 수 있습니다.

1.1.1. Apache Kafka 사용자 정의 리소스 스트림 예

CRD는 Apache Kafka 관련 리소스의 스트림을 인스턴스화하고 관리하는 데 사용되는 스키마를 정의하려면 클러스터에 일회성 설치가 필요합니다.

CRD를 설치하여 새 사용자 정의 리소스 유형을 클러스터에 추가한 후 사양에 따라 리소스의 인스턴스를 생성할 수 있습니다.

클러스터 설정에 따라 설치에는 일반적으로 클러스터 관리자 권한이 필요합니다.

참고

사용자 정의 리소스 관리에 대한 액세스는 Apache Kafka 관리자의 Streams로 제한됩니다. 자세한 내용은 4.6절. “Apache Kafka 관리자용 Streams 지정”의 내용을 참조하십시오.

CRD는 OpenShift 클러스터 내에서 kind:Kafka 와 같은 새로운 유형의 리소스를 정의합니다.

Kubernetes API 서버를 사용하면 유형에 따라 사용자 정의 리소스를 생성할 수 있으며 OpenShift 클러스터에 추가할 때 사용자 정의 리소스를 검증하고 저장하는 방법을 CRD에서 이해할 수 있습니다.

Apache Kafka 관련 사용자 정의 리소스의 각 Streams는 리소스 종류의 CRD에서 정의한 스키마를 준수합니다. Apache Kafka 구성 요소의 Streams에 대한 사용자 정의 리소스에는 spec 에서 정의되는 일반적인 구성 속성이 있습니다.

CRD와 사용자 정의 리소스 간의 관계를 이해하려면 Kafka 주제의 CRD 샘플을 살펴보겠습니다.

Kafka 주제 CRD

apiVersion: kafka.strimzi.io/v1beta2
kind: CustomResourceDefinition
metadata: 
1

  name: kafkatopics.kafka.strimzi.io
  labels:
    app: strimzi
spec: 
2

  group: kafka.strimzi.io
  versions:
    v1beta2
  scope: Namespaced
  names:
    # ...
    singular: kafkatopic
    plural: kafkatopics
    shortNames:
    - kt 
3

  additionalPrinterColumns: 
4

      # ...
  subresources:
    status: {} 
5

  validation: 
6

    openAPIV3Schema:
      properties:
        spec:
          type: object
          properties:
            partitions:
              type: integer
              minimum: 1
            replicas:
              type: integer
              minimum: 1
              maximum: 32767
      # ...

1
CRD를 식별하는 주제 CRD의 메타데이터, 이름 및 레이블입니다.
2
주제의 API에 액세스하는 데 사용되는 그룹(도메인) 이름, 복수 이름 및 지원되는 스키마 버전을 포함하여 이 CRD의 사양입니다. 다른 이름은 CLI에서 인스턴스 리소스를 식별하는 데 사용됩니다. 예를 들어 oc get kafkatopic my-topic 또는 oc get kafkatopics.
3
단축 이름은 CLI 명령에서 사용할 수 있습니다. 예를 들어 oc get ktoc get kafkatopic 대신 약어로 사용할 수 있습니다.
4
사용자 정의 리소스에서 get 명령을 사용할 때 표시되는 정보입니다.
5
리소스의 스키마 참조에 설명된 대로 CRD의 현재 상태입니다.
6
openAPIV3Schema 검증에서는 주제 사용자 정의 리소스 생성에 대한 검증을 제공합니다. 예를 들어 항목에는 하나 이상의 파티션과 복제본이 필요합니다.
참고

파일 이름에 인덱스 번호 뒤에 'Crd'가 포함되어 있으므로 Streams for Apache Kafka 설치 파일과 함께 제공되는 CRD YAML 파일을 식별할 수 있습니다.

다음은 KafkaTopic 사용자 정의 리소스의 해당 예입니다.

Kafka 주제 사용자 정의 리소스

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic 
1

metadata:
  name: my-topic
  labels:
    strimzi.io/cluster: my-cluster 
2

spec: 
3

  partitions: 1
  replicas: 1
  config:
    retention.ms: 7200000
    segment.bytes: 1073741824
status:
  conditions: 
4

    lastTransitionTime: "2019-08-20T11:37:00.706Z"
    status: "True"
    type: Ready
  observedGeneration: 1
  / ...

1
kindapiVersion 은 사용자 정의 리소스가 인스턴스인 CRD를 식별합니다.
2
주제 또는 사용자가 속한 Kafka 클러스터의 이름( Kafka 리소스 이름과 동일)을 정의하는 KafkaTopicKafkaUser 리소스에만 적용되는 레이블입니다.
3
사양은 주제의 파티션 및 복제본 수와 주제 자체의 구성 매개변수를 보여줍니다. 이 예에서는 메시지가 항목에 남아 있고 로그의 세그먼트 파일 크기가 지정됩니다.
4
KafkaTopic 리소스의 상태 상태입니다. 유형 조건이 lastTransitionTime 에서 Ready 로 변경되었습니다.

플랫폼 CLI를 통해 사용자 정의 리소스를 클러스터에 적용할 수 있습니다. 사용자 정의 리소스가 생성되면 Kubernetes API의 기본 제공 리소스와 동일한 검증을 사용합니다.

KafkaTopic 사용자 정의 리소스가 생성되면 Topic Operator에 알림이 표시되고 해당 Kafka 주제는 Apache Kafka용 Streams에서 생성됩니다.

1.1.2. 사용자 정의 리소스에서 oc 작업 수행

oc 명령을 사용하여 Apache Kafka 사용자 정의 리소스의 Streams에서 정보를 검색하고 다른 작업을 수행할 수 있습니다. get,describe,edit 또는 delete 등의 oc 명령을 사용하여 리소스 유형에 대한 작업을 수행합니다. 예를 들어 oc get kafkatopics 는 모든 Kafka 주제 목록을 검색하고 oc get kafkas 는 배포된 모든 Kafka 클러스터를 검색합니다.

리소스 유형을 참조할 때 단일 이름과 복수 이름을 모두 사용할 수 있습니다. oc get kafkasoc get kafka 와 동일한 결과를 가져옵니다.

리소스의 짧은 이름을 사용할 수도 있습니다. 짧은 이름을 학습하면 Apache Kafka의 Streams를 관리할 때 시간을 절약할 수 있습니다. Kafka 의 짧은 이름은 k 이므로 oc get k 를 실행하여 모든 Kafka 클러스터를 나열할 수도 있습니다.

Kafka 클러스터 나열

oc get k

NAME         DESIRED KAFKA REPLICAS   DESIRED ZK REPLICAS
my-cluster   3                        3

Expand
표 1.1. Apache Kafka 리소스의 각 Streams에 대한 긴 이름 및 짧은 이름
Apache Kafka 리소스의 스트림긴 이름짧은 이름

Kafka

kafka

k

Kafka 노드 풀

kafkanodepool

knp

Kafka Topic

kafkatopic

kt

Kafka 사용자

kafkauser

ku

Kafka Connect

kafkaconnect

kc

Kafka 커넥터

kafkaconnector

kctr

Kafka 미러 메이커

kafkamirrormaker

kmm

Kafka 미러 메이커 2

kafkamirrormaker2

kmm2

Kafka Bridge

kafkabridge

kb

Kafka 리밸런스

kafkarebalance

kr

1.1.2.1. 리소스 카테고리

사용자 정의 리소스의 카테고리는 oc 명령에서도 사용할 수 있습니다.

Apache Kafka 사용자 정의 리소스의 모든 Streams는 strimzi 카테고리에 속하므로 strimzi 를 사용하여 하나의 명령으로 Apache Kafka 리소스의 모든 Streams를 가져올 수 있습니다.

예를 들어 oc get strimzi 를 실행하면 지정된 네임스페이스에서 Apache Kafka 사용자 정의 리소스의 모든 Streams가 나열됩니다.

모든 사용자 정의 리소스 나열

oc get strimzi

NAME                                   DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS
kafka.kafka.strimzi.io/my-cluster      3                      3

NAME                                   PARTITIONS REPLICATION FACTOR
kafkatopic.kafka.strimzi.io/kafka-apps 3          3

NAME                                   AUTHENTICATION AUTHORIZATION
kafkauser.kafka.strimzi.io/my-user     tls            simple

oc get strimzi -o name 명령은 모든 리소스 유형 및 리소스 이름을 반환합니다. -o name 옵션은 유형/이름 형식으로 출력을 가져옵니다.

모든 리소스 유형 및 이름 나열

oc get strimzi -o name

kafka.kafka.strimzi.io/my-cluster
kafkatopic.kafka.strimzi.io/kafka-apps
kafkauser.kafka.strimzi.io/my-user

strimzi 명령을 다른 명령과 결합할 수 있습니다. 예를 들어 oc delete 명령에 전달하여 단일 명령의 모든 리소스를 삭제할 수 있습니다.

모든 사용자 정의 리소스 삭제

oc delete $(oc get strimzi -o name)

kafka.kafka.strimzi.io "my-cluster" deleted
kafkatopic.kafka.strimzi.io "kafka-apps" deleted
kafkauser.kafka.strimzi.io "my-user" deleted

예를 들어 Apache Kafka 기능에 대해 새 Streams를 테스트할 때 단일 작업에서 모든 리소스를 삭제하는 것이 유용할 수 있습니다.

1.1.2.2. 하위 리소스의 상태 쿼리

-o 옵션으로 전달할 수 있는 다른 값이 있습니다. 예를 들어 -o yaml 을 사용하면 YAML 형식으로 출력을 얻을 수 있습니다. -o json 을 사용하면 JSON으로 반환됩니다.

oc get --help 에서 모든 옵션을 볼 수 있습니다.

가장 유용한 옵션 중 하나는 JSONPath 지원 이므로 JSONPath 표현식을 전달하여 Kubernetes API를 쿼리할 수 있습니다. JSONPath 표현식은 리소스의 특정 부분을 추출하거나 탐색할 수 있습니다.

예를 들어 JSONPath 표현식 {.status.listeners[?(@.name=="tls")].bootstrapServers} 를 사용하여 Kafka 사용자 정의 리소스의 상태에서 부트스트랩 주소를 가져와서 Kafka 클라이언트에서 사용할 수 있습니다.

여기에서 이 명령은 tls:이라는 리스너의 bootstrapServers 값을 검색합니다.

부트스트랩 주소 검색

oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="tls")].bootstrapServers}{"\n"}'

my-cluster-kafka-bootstrap.myproject.svc:9093

이름 조건을 변경하면 다른 Kafka 리스너의 주소를 가져올 수도 있습니다.

jsonpath 를 사용하여 사용자 정의 리소스에서 다른 속성 또는 속성 그룹을 추출할 수 있습니다.

1.1.3. Apache Kafka 사용자 정의 리소스 상태 정보 스트림

상태 속성은 특정 사용자 정의 리소스에 대한 상태 정보를 제공합니다.

다음 표에는 상태 정보(배포 시) 및 상태 속성을 정의하는 스키마를 제공하는 사용자 지정 리소스가 나열되어 있습니다.

스키마에 대한 자세한 내용은 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.

Expand
표 1.2. 상태 정보를 제공하는 사용자 정의 리소스
Apache Kafka 리소스의 스트림스키마 참조…​에 상태 정보를 게시합니다.

Kafka

KafkaStatus 스키마 참조

Kafka 클러스터, 리스너 및 노드 풀

KafkaNodePool

KafkaNodePoolStatus schema reference

노드 풀, 해당 역할 및 관련 Kafka 클러스터의 노드

KafkaTopic

KafkaTopicStatus schema reference

Kafka 클러스터의 Kafka 주제

KafkaUser

KafkaUserStatus 스키마 참조

Kafka 클러스터의 Kafka 사용자

KafkaConnect

KafkaConnectStatus 스키마 참조

Kafka Connect 클러스터 및 커넥터 플러그인

KafkaConnector

KafkaConnectorStatus 스키마 참조

KafkaConnector 리소스

KafkaMirrorMaker2

KafkaMirrorMaker2Status 스키마 참조

Kafka MirrorMaker 2 클러스터 및 내부 커넥터

KafkaMirrorMaker

KafkaMirrorMakerStatus schema reference

Kafka MirrorMaker 클러스터

KafkaBridge

KafkaBridgeStatus schema reference

Apache Kafka 브리지용 스트림

KafkaRebalance

KafkaRebalance 스키마 참조

리밸런스의 상태 및 결과

StrimziPodSet

StrimziPodSetStatus schema reference

현재 버전 및 준비 상태의 Pod 수

리소스의 status 속성은 리소스 상태에 대한 정보를 제공합니다. status.conditionsstatus.observedGeneration 속성은 모든 리소스에 공통입니다.

status.conditions
상태 조건은 리소스의 현재 상태를 설명합니다. 상태 조건 속성은 사양에 지정된 구성에 정의된 대로 원하는 상태를 달성하는 리소스와 관련된 진행 상황을 추적하는 데 유용합니다. 상태 조건 속성은 리소스 상태가 변경된 시간 및 이유와 Operator가 원하는 상태를 실현하지 못하도록 하는 이벤트 세부 정보를 제공합니다.
status.observedGeneration
마지막으로 관찰된 생성은 Cluster Operator의 리소스의 최신 조정을 나타냅니다. observedGeneration 의 값이 metadata.generation (현재 배포 버전) 값과 다른 경우 Operator에서 리소스에 대한 최신 업데이트를 아직 처리하지 않았습니다. 이러한 값이 동일한 경우 상태 정보는 리소스에 대한 최신 변경 사항을 반영합니다.

상태 속성은 리소스 관련 정보도 제공합니다. 예를 들어 KafkaStatus 는 리스너 주소 및 Kafka 클러스터의 ID에 대한 정보를 제공합니다.

KafkaStatus 는 사용 중인 Apache Kafka 버전의 Kafka 및 Streams에 대한 정보도 제공합니다. operatorLastSuccessfulVersionkafkaVersion 의 값을 확인하여 Apache Kafka 또는 Kafka의 스트림 업그레이드가 완료되었는지 확인할 수 있습니다.

Apache Kafka의 스트림은 사용자 지정 리소스의 상태를 생성 및 유지 관리하고, 사용자 정의 리소스의 현재 상태를 주기적으로 평가하고 그에 따라 상태를 업데이트합니다. oc edit 를 사용하여 사용자 정의 리소스에서 업데이트를 수행할 때 (예: 해당 상태 ) 편집할 수 없습니다. 또한 상태를 변경하면 Kafka 클러스터 구성에 영향을 미치지 않습니다.

여기에서 Kafka 사용자 정의 리소스의 상태 속성이 표시됩니다.

Kafka 사용자 정의 리소스 상태

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
spec:
  # ...
status:
  clusterId: XP9FP2P-RByvEy0W4cOEUA 
1

  conditions: 
2

    - lastTransitionTime: '2023-01-20T17:56:29.396588Z'
      status: 'True'
      type: Ready 
3

  kafkaMetadataState: KRaft 
4

  kafkaVersion: 3.7.0 
5

  kafkaNodePools: 
6

    - name: broker
    - name: controller
  listeners: 
7

    - addresses:
        - host: my-cluster-kafka-bootstrap.prm-project.svc
          port: 9092
      bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9092'
      name: plain
    - addresses:
        - host: my-cluster-kafka-bootstrap.prm-project.svc
          port: 9093
      bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9093'
      certificates:
        - |
          -----BEGIN CERTIFICATE-----

          -----END CERTIFICATE-----
      name: tls
    - addresses:
        - host: >-
            2054284155.us-east-2.elb.amazonaws.com
          port: 9095
      bootstrapServers: >-
        2054284155.us-east-2.elb.amazonaws.com:9095
      certificates:
        - |
          -----BEGIN CERTIFICATE-----

          -----END CERTIFICATE-----
      name: external3
    - addresses:
        - host: ip-10-0-172-202.us-east-2.compute.internal
          port: 31644
      bootstrapServers: 'ip-10-0-172-202.us-east-2.compute.internal:31644'
      certificates:
        - |
          -----BEGIN CERTIFICATE-----

          -----END CERTIFICATE-----
      name: external4
  observedGeneration: 3 
8

  operatorLastSuccessfulVersion: 2.7 
9

1
Kafka 클러스터 ID입니다.
2
상태 조건은 Kafka 클러스터의 현재 상태를 설명합니다.
3
Ready 조건은 Cluster Operator가 트래픽을 처리할 수 있는 Kafka 클러스터를 간주함을 나타냅니다.
4
Kafka 메타데이터 및 조정 작업을 관리하는 데 사용되는 메커니즘(KRaft 또는 Zoo Cryostat)을 표시하는 Kafka 메타데이터 상태입니다.
5
Kafka 클러스터에서 사용하는 Kafka 버전입니다.
6
Kafka 클러스터에 속하는 노드 풀입니다.
7
리스너 는 유형별로 Kafka 부트스트랩 주소를 설명합니다.
8
observedGeneration 값은 Cluster Operator의 Kafka 사용자 정의 리소스의 마지막 조정을 나타냅니다.
9
마지막 조정을 성공적으로 완료한 Operator의 버전입니다.
참고

상태에 나열된 Kafka 부트스트랩 주소는 해당 끝점 또는 Kafka 클러스터가 Ready 상태에 있음을 표시하지 않습니다.

1.1.4. 사용자 정의 리소스의 상태 찾기

oc 를 사용자 정의 리소스의 status 하위 리소스와 함께 사용하여 리소스에 대한 정보를 검색합니다.

사전 요구 사항

  • OpenShift 클러스터입니다.
  • Cluster Operator가 실행 중입니다.

프로세스

  • 사용자 정의 리소스를 지정하고 -o jsonpath 옵션을 사용하여 표준 JSONPath 표현식을 적용하여 status 속성을 선택합니다.

    oc get kafka <kafka_resource_name> -o jsonpath='{.status}' | jq

    이 표현식은 지정된 사용자 정의 리소스에 대한 모든 상태 정보를 반환합니다. status.listeners 또는 status.observedGeneration 과 같은 점 표기법을 사용하여 표시하려는 상태 정보를 미세 조정할 수 있습니다.

    jq 명령줄 JSON 구문 분석 툴 을 사용하면 출력을 더 쉽게 읽을 수 있습니다.

1.2. Apache Kafka Operator용 스트림

Apache Kafka Operator용 스트림은 OpenShift에서 Kafka를 효과적으로 관리하기 위해 전문 운영 지식을 갖추고 있습니다. 각 Operator는 고유한 기능을 수행합니다.

Cluster Operator
Cluster Operator는 OpenShift에서 Apache Kafka 클러스터의 배포 및 관리를 처리합니다. Kafka 브로커 및 기타 Kafka 구성 요소 및 리소스의 설정을 자동화합니다.
주제 Operator
Topic Operator는 Kafka 클러스터 내의 주제 생성, 구성 및 삭제를 관리합니다.
사용자 Operator
User Operator는 Kafka 브로커에 액세스해야 하는 Kafka 사용자를 관리합니다.

Apache Kafka용 Streams를 배포할 때 먼저 Cluster Operator를 배포합니다. 그런 다음 Cluster Operator가 Kafka 배포를 처리할 준비가 되었습니다. Cluster Operator(권장) 또는 독립 실행형 Operator를 사용하여 Topic Operator 및 User Operator를 배포할 수도 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터와 함께 독립 실행형 Operator를 사용합니다.

Topic Operator 및 User Operator는 Entity Operator의 일부입니다. Cluster Operator는 Entity Operator 구성에 따라 Operator를 하나 또는 둘 다 배포할 수 있습니다.

중요

독립 실행형 Operator를 배포하려면 Kafka 클러스터에 연결할 환경 변수를 설정해야 합니다. Cluster Operator에 의해 설정되므로 Operator를 배포하는 경우 이러한 환경 변수를 설정할 필요가 없습니다.

1.2.1. OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 스트림 감시

Operator는 OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 Streams를 감시하고 관리합니다. Cluster Operator는 OpenShift 클러스터의 단일 네임스페이스, 여러 네임스페이스 또는 모든 네임스페이스를 조사할 수 있습니다. Topic Operator 및 User Operator는 단일 네임스페이스를 조사할 수 있습니다.

  • Cluster Operator에서 Kafka 리소스 감시
  • Topic Operator는 KafkaTopic 리소스 감시
  • User Operator는 KafkaUser 리소스 감시

Topic Operator 및 User Operator는 네임스페이스에서 단일 Kafka 클러스터만 조사할 수 있습니다. 또한 단일 Kafka 클러스터에만 연결할 수 있습니다.

여러 Topic Operator가 동일한 네임스페이스를 조사하는 경우 이름 충돌 및 주제 삭제가 발생할 수 있습니다. 이는 각 Kafka 클러스터에서 이름이 동일한 Kafka 주제(예: __consumer_offsets)를 사용하기 때문입니다. 하나의 Topic Operator만 지정된 네임스페이스를 감시하는지 확인합니다.

단일 네임스페이스가 있는 여러 User Operator를 사용하는 경우 지정된 사용자 이름이 있는 사용자가 두 개 이상의 Kafka 클러스터에 존재할 수 있습니다.

Cluster Operator를 사용하여 Topic Operator 및 User Operator를 배포하는 경우 기본적으로 Cluster Operator에서 배포한 Kafka 클러스터를 확인합니다. Operator 구성에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다.

각 Operator의 독립 실행형 배포의 경우 구성에서 조사할 Kafka 클러스터에 대한 네임스페이스 및 연결을 지정합니다.

1.2.2. RBAC 리소스 관리

Cluster Operator는 OpenShift 리소스에 액세스해야 하는 Apache Kafka 구성 요소용 Streams에 대한 RBAC(역할 기반 액세스 제어) 리소스를 생성하고 관리합니다.

Cluster Operator가 작동하려면 KafkaKafkaConnect 와 같은 Kafka 리소스와 상호 작용하기 위해 ConfigMap,Pod,Deployment, Service 와 같은 관리형 리소스와 상호 작용하려면 OpenShift 클러스터 내에서 권한이 필요합니다.

권한은 다음 OpenShift RBAC 리소스를 통해 지정됩니다.

  • ServiceAccount
  • RoleClusterRole
  • RoleBindingClusterRoleBinding
1.2.2.1. Apache Kafka 구성 요소에 대한 Streams에 권한 위임

Cluster Operator는 strimzi-cluster-operator 라는 서비스 계정에서 실행됩니다. Apache Kafka 구성 요소에 대한 Streams에 대한 RBAC 리소스를 생성할 수 있는 권한을 부여하는 클러스터 역할이 할당됩니다. 역할 바인딩은 클러스터 역할을 서비스 계정과 연결합니다.

OpenShift는 하나의 ServiceAccount 에서 작동하는 구성 요소가 ServiceAccount 에 없는 다른 ServiceAccount 권한을 부여하지 못하도록 합니다. Cluster Operator는 관리하는 리소스에 필요한 RoleBindingClusterRoleBinding RBAC 리소스를 생성하므로 동일한 권한을 부여하는 역할이 필요합니다.

다음 섹션에서는 Cluster Operator에 필요한 RBAC 리소스에 대해 설명합니다.

1.2.2.2. ClusterRole 리소스

Cluster Operator는 ClusterRole 리소스를 사용하여 리소스에 필요한 액세스 권한을 제공합니다. OpenShift 클러스터 설정에 따라 클러스터 관리자가 클러스터 역할을 생성해야 할 수 있습니다.

참고

클러스터 관리자 권한은 ClusterRole 리소스 생성에만 필요합니다. Cluster Operator는 클러스터 관리자 계정에서 실행되지 않습니다.

RBAC 리소스는 최소 권한 원칙을 따르고 Kafka 구성 요소의 클러스터를 작동하는 데 Cluster Operator에 필요한 권한만 포함합니다.

권한을 위임하려면 모든 클러스터 역할이 Cluster Operator에 필요합니다.

Expand
표 1.3. ClusterRole 리소스
이름설명

strimzi-cluster-operator-namespaced

피연산자를 배포 및 관리하기 위해 Cluster Operator에서 사용하는 네임스페이스 범위 리소스에 대한 액세스 권한입니다.

strimzi-cluster-operator-global

피연산자를 배포 및 관리하기 위해 Cluster Operator에서 사용하는 클러스터 범위 리소스에 대한 액세스 권한.

strimzi-cluster-operator-leader-election

리더 선택을 위해 Cluster Operator가 사용하는 액세스 권한

strimzi-cluster-operator-watched

Cluster Operator가 Apache Kafka 사용자 정의 리소스에 대한 Streams를 감시하고 관리하는 데 사용하는 액세스 권한.

strimzi-kafka-broker

랙 인식이 사용되는 경우 Kafka 브로커가 OpenShift 작업자 노드에서 토폴로지 레이블을 가져올 수 있도록 허용하는 액세스 권한입니다.

strimzi-entity-operator

Kafka 사용자 및 주제를 관리하기 위해 Topic 및 User Operators에서 사용하는 권한에 액세스합니다.

strimzi-kafka-client

랙 인식이 사용될 때 Kafka Connect,MirrorMaker(1 및 2) 및 Kafka Bridge를 허용하여 OpenShift 작업자 노드에서 토폴로지 레이블을 가져올 수 있는 액세스 권한입니다.

1.2.2.3. ClusterRoleBinding 리소스

Cluster Operator는 ClusterRoleBindingRoleBinding 리소스를 사용하여 ClusterRoleServiceAccount 와 연결합니다. 클러스터 역할 바인딩은 클러스터 범위 리소스가 포함된 클러스터 역할에 필요합니다.

Expand
표 1.4. ClusterRoleBinding 리소스
이름설명

strimzi-cluster-operator

strimzi-cluster-operator-global 클러스터 역할의 권한을 Cluster Operator에 부여합니다.

strimzi-cluster-operator-kafka-broker-delegation

Cluster Operator에 strimzi-entity-operator 클러스터 역할의 권한을 부여합니다.

strimzi-cluster-operator-kafka-client-delegation

strimzi-kafka-client 클러스터 역할의 권한을 Cluster Operator에 부여합니다.

Expand
표 1.5. RoleBinding 리소스
이름설명

strimzi-cluster-operator

strimzi-cluster-operator-namespaced 클러스터 역할의 권한을 Cluster Operator에 부여합니다.

strimzi-cluster-operator-leader-election

Cluster Operator에 strimzi-cluster-operator-leader-election 클러스터 역할의 권한을 부여합니다.

strimzi-cluster-operator-watched

strimzi-cluster-operator-watched 클러스터 역할의 권한을 Cluster Operator에 부여합니다.

strimzi-cluster-operator-entity-operator-delegation

Cluster Operator에 strimzi-cluster-operator-entity-operator-delegation 클러스터 역할의 권한을 부여합니다.

1.2.2.4. ServiceAccount 리소스

Cluster Operator는 strimzi-cluster-operator ServiceAccount 를 사용하여 실행됩니다. 이 서비스 계정은 피연산자를 관리하는 데 필요한 권한을 부여합니다. Cluster Operator는 추가 ClusterRoleBindingRoleBinding 리소스를 생성하여 이러한 RBAC 권한 중 일부를 피연산자에 위임합니다.

각 피연산자는 Cluster Operator가 생성한 자체 서비스 계정을 사용합니다. 이를 통해 Cluster Operator는 최소 권한 원칙을 따르고 피연산자가 실제로 필요한 액세스 권한만 부여할 수 있습니다.

Expand
표 1.6. ServiceAccount 리소스
이름사용자

<cluster_name>-zookeeper

Zookeeper Pod

<cluster_name>-kafka

Kafka 브로커 Pod

<cluster_name>-entity-operator

Entity Operator

<cluster_name>-cruise-control

cruise Control Pod

<cluster_name>-kafka-exporter

Kafka Exporter Pod

<cluster_name>-connect

Kafka Connect Pod

<cluster_name>-mirror-maker

MirrorMaker Pod

<cluster_name>-mirrormaker2

MirrorMaker 2 Pod

<cluster_name>-bridge

Kafka 브리지 Pod

1.2.3. Pod 리소스 관리

StrimziPodSet 사용자 정의 리소스는 Streams for Apache Kafka에서 Kafka, Kafka Connect 및 MirrorMaker 2 Pod를 생성하고 관리하는 데 사용됩니다. Zoo Cryostat를 사용하는 경우, Zoo Cryostat Pod도 StrimziPodSet 리소스를 사용하여 생성 및 관리됩니다.

StrimziPodSet 리소스를 생성, 업데이트 또는 삭제할 수 없습니다. StrimziPodSet 사용자 정의 리소스는 내부적으로 사용되며 리소스는 Cluster Operator에 의해서만 관리됩니다. 결과적으로 Pod를 시작하지 않고 Kafka 클러스터를 사용할 수 없는 가능성을 방지하려면 Cluster Operator가 제대로 실행되고 있어야 합니다.

참고

OpenShift 배포 리소스는 Kafka Bridge, Kafka Exporter, Cruise Control, (precated) MirrorMaker 1, User Operator 및 Topic Operator의 Pod를 생성하고 관리하는 데 사용됩니다.

1.3. Kafka 브리지를 사용하여 Kafka 클러스터 연결

Streams for Apache Kafka Bridge API를 사용하여 소비자를 생성 및 관리하고 기본 Kafka 프로토콜 대신 HTTP를 통해 레코드를 보내고 받을 수 있습니다.

Kafka 브리지를 설정하면 Kafka 클러스터에 대한 HTTP 액세스를 구성합니다. 그런 다음 Kafka Bridge를 사용하여 클러스터에서 메시지를 생성 및 사용하고 REST 인터페이스를 통해 다른 작업을 수행할 수 있습니다.

1.4. Seamless FIPS 지원

연방 정보 처리 표준(FIPS)은 컴퓨터 보안 및 상호 운용성을 위한 표준입니다. FIPS 지원 OpenShift 클러스터에서 Apache Kafka용 Streams를 실행하면 Apache Kafka 컨테이너 이미지의 Streams에 사용된 OpenJDK가 FIPS 모드로 자동 전환됩니다. 버전 2.3에서 Apache Kafka용 Streams는 변경 또는 특수 구성 없이 FIPS 지원 OpenShift 클러스터에서 실행할 수 있습니다. OpenJDK의 FIPS 호환 보안 라이브러리만 사용합니다.

중요

FIPS 지원 OpenShift 클러스터를 사용하는 경우 일반 OpenShift 클러스터에 비해 메모리 사용량이 증가할 수 있습니다. 문제가 발생하지 않도록 하려면 메모리 요청을 512Mi 이상으로 늘리는 것이 좋습니다.

NIST 검증 프로그램 및 검증된 모듈에 대한 자세한 내용은 NIST 웹 사이트의 암호화 모듈 유효성 검사 프로그램을 참조하십시오.

참고

Apache Kafka Proxy 및 Apache Kafka Console용 Streams의 기술 프리뷰와의 호환성은 FIPS 지원과 관련하여 테스트되지 않았습니다. 제대로 작동할 것으로 예상되지만 현재 완전 지원을 보장할 수는 없습니다.

1.4.1. 최소 암호 길이

FIPS 모드에서 실행하는 경우 SCRAM-SHA-512 암호는 32자 이상이어야 합니다. Streams for Apache Kafka 2.3에서 Apache Kafka User Operator의 Streams의 기본 암호 길이도 32자로 설정됩니다. 암호 길이 32자 미만의 사용자 지정 구성이 있는 Kafka 클러스터가 있는 경우 구성을 업데이트해야 합니다. 암호가 32자보다 짧은 사용자가 있는 경우 필요한 길이로 암호를 다시 생성해야 합니다. 예를 들어 사용자 시크릿을 삭제하고 User Operator가 적절한 길이로 새 암호를 생성할 때까지 기다린 후 이를 수행할 수 있습니다.

1.5. 문서 포함

user-replaced 값

교체 가능 값이라고도 하는 사용자 교체 값은 굵은 대괄호(< >)로 표시됩니다. 밑줄( _)은 다중 단어 값에 사용됩니다. 값이 코드 또는 명령을 참조하는 경우 monospace 도 사용됩니다.

예를 들어 다음 코드는 < my_namespace >가 올바른 네임스페이스 이름으로 교체해야 한다는 것을 보여줍니다.

sed -i 's/namespace: .*/namespace: <my_namespace>/' install/cluster-operator/*RoleBinding*.yaml

2장. Apache Kafka 설치 방법용 스트림

다음 두 가지 방법으로 OpenShift 4.12에 Apache Kafka용 Streams를 4.15로 설치할 수 있습니다.

Expand
설치 방법설명

설치 아티팩트(YAML 파일)

Apache Kafka용 Red Hat Streams 2.7 OpenShift 설치 및 예제 파일을 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 다운로드합니다. oc 를 사용하여 YAML 설치 아티팩트를 OpenShift 클러스터에 배포합니다. install/cluster-operator 에서 단일 네임스페이스, 여러 네임스페이스 또는 모든 네임스페이스에 Cluster Operator를 배포하여 시작합니다.

install/ artifacts를 사용하여 다음을 배포할 수도 있습니다.

  • Apache Kafka 관리자 역할의 스트림 (strimzi-admin)
  • 독립 실행형 Topic Operator(topic-operator)
  • 독립 실행형 사용자 Operator(user-operator)
  • Apache Kafka Drain cleaner 스트림 (drain-cleaner)

OperatorHub

OperatorHub에서 Streams for Apache Kafka 를 사용하여 단일 네임스페이스 또는 모든 네임스페이스에 Streams for Apache Kafka를 배포합니다.

가장 큰 유연성을 위해 설치 아티팩트 방법을 선택합니다. OperatorHub 방법은 표준 구성을 제공하고 자동 업데이트를 활용할 수 있습니다.

참고

Helm을 사용하여 Apache Kafka용 스트림 설치는 지원되지 않습니다.

3장. Apache Kafka용 Streams와 함께 배포됨

Apache Kafka 구성 요소는 Apache Kafka 배포를 위한 Streams를 사용하여 OpenShift에 배포하기 위해 제공됩니다. Kafka 구성 요소는 일반적으로 가용성을 위해 클러스터로 실행됩니다.

Kafka 구성 요소를 통합하는 일반적인 배포에는 다음이 포함될 수 있습니다.

  • 브로커 노드의 Kafka 클러스터
  • 복제된 Zoo Cryostat 인스턴스의 Zookeeper 클러스터
  • 외부 데이터 연결을 위한 Kafka Connect 클러스터
  • 보조 클러스터에서 Kafka 클러스터를 미러링하는 Kafka 미러 메이커 클러스터
  • 모니터링을 위한 추가 Kafka 메트릭 데이터를 추출하는 Kafka Exporter
  • Kafka 클러스터에 HTTP 기반 요청을 만드는 Kafka 브리지
  • cruise Control 을 통해 브로커 노드 간에 주제 파티션을 재조정

이러한 구성 요소는 모두 필수는 아니지만 Kafka 및 Zoo Cryostat가 필요합니다. 일부 구성 요소는 MirrorMaker 또는 Kafka Connect와 같은 Kafka 없이 배포할 수 있습니다.

3.1. 배포 순서

OpenShift 클러스터에 필요한 배포 순서는 다음과 같습니다.

  1. Kafka 클러스터를 관리하기 위해 Cluster Operator 배포
  2. Zoo Cryostat 클러스터를 사용하여 Kafka 클러스터를 배포하고 배포에 Topic Operator 및 User Operator를 포함합니다.
  3. 필요한 경우 배포:

    • Kafka 클러스터에 배포하지 않은 경우 Topic Operator 및 User Operator 독립 실행형
    • Kafka Connect
    • Kafka MirrorMaker
    • Kafka Bridge
    • 메트릭 모니터링을 위한 구성 요소

Cluster Operator는 Deployment,ServicePod 리소스와 같은 구성 요소에 대한 OpenShift 리소스를 생성합니다. OpenShift 리소스의 이름은 배포 시 구성 요소에 지정된 이름이 추가됩니다. 예를 들어 my-kafka-cluster 라는 Kafka 클러스터에는 my-kafka-cluster-kafka 라는 서비스가 있습니다.

3.2. (Preview) Apache Kafka 프록시용 스트림 배포

Apache Kafka 프록시용 스트림은 Kafka 기반 시스템을 개선하도록 설계된 Apache Kafka 프로토콜 인식 프록시입니다. 필터 메커니즘을 통해 애플리케이션 또는 Kafka 클러스터 자체를 변경할 필요 없이 Kafka 기반 시스템에 추가 동작을 도입할 수 있습니다.

Apache Kafka 프록시용 Streams에 연결하고 사용하는 방법에 대한 자세한 내용은 Apache Kafka 용 Streams 설명서의 프록시 가이드를 참조하십시오.

참고

Apache Kafka Proxy용 Streams는 현재 기술 프리뷰로 사용할 수 있습니다.

3.3. (Preview) Apache Kafka 콘솔용 스트림 배포

Apache Kafka용 Streams에서 관리하는 Kafka 클러스터를 배포한 후 Apache Kafka Console용 Streams를 배포하고 클러스터를 연결할 수 있습니다. Apache Kafka 콘솔의 Streams for Apache Kafka Console을 사용하면 Kafka 클러스터 관리를 용이하게 하여 사용자 인터페이스에서 각 클러스터를 모니터링, 관리 및 최적화할 수 있습니다.

Apache Kafka Console용 Streams에 연결하고 사용하는 방법에 대한 자세한 내용은 Apache Kafka 용 스트림 설명서의 콘솔 가이드를 참조하십시오.

참고

Apache Kafka Console의 Streams는 현재 기술 프리뷰로 사용할 수 있습니다.

4장. Apache Kafka 배포를 위한 스트림 준비

필요한 사전 배포 작업을 완료하여 Apache Kafka용 Streams 배포를 준비합니다. 다음과 같은 특정 요구 사항에 따라 필요한 준비 단계를 수행합니다.

참고

이 가이드에서 명령을 실행하려면 클러스터 사용자에게 RBAC(역할 기반 액세스 제어) 및 CRD를 관리할 수 있는 권한이 있어야 합니다.

4.1. 배포 사전 요구 사항

Apache Kafka용 Streams를 배포하려면 다음이 필요합니다.

  • OpenShift 4.12에서 4.15 클러스터입니다.

    Apache Kafka의 스트림은 Strimzi 0.40.x를 기반으로 합니다.

  • 실행 중인 클러스터에 연결하도록 oc 명령줄 툴이 설치 및 구성되어 있습니다.

4.2. Operator 배포 모범 사례

특히 다른 버전을 사용하는 경우 동일한 OpenShift 클러스터에 Apache Kafka Operator에 대해 두 개 이상의 Streams를 설치하면 잠재적인 문제가 발생할 수 있습니다. 각 Streams for Apache Kafka Operator는 OpenShift 클러스터에서 리소스 세트를 관리합니다. Apache Kafka Operator용 Streams를 여러 개 설치할 때 동일한 리소스를 동시에 관리하려고 할 수 있습니다. 이로 인해 클러스터 내에서 충돌과 예기치 않은 동작이 발생할 수 있습니다. 동일한 OpenShift 클러스터 내의 다른 네임스페이스에 Apache Kafka Operator용 Streams를 배포하는 경우에도 충돌이 계속 발생할 수 있습니다. 네임스페이스는 어느 정도의 리소스 격리를 제공하지만, Streams for Apache Kafka Operator에서 관리하는 특정 리소스(예: CRD(Custom Resource Definitions) 및 역할)에는 클러스터 전체 범위가 있습니다.

또한 다른 버전으로 여러 Operator를 설치하면 관리하는 Operator와 Kafka 클러스터 간에 호환성 문제가 발생할 수 있습니다. Apache Kafka Operator용 Streams의 다른 버전에서는 이전 버전과 호환되지 않는 변경, 버그 수정 또는 개선 사항이 발생할 수 있습니다.

OpenShift 클러스터에서 Apache Kafka Operator에 대한 여러 Streams 설치와 관련된 문제를 방지하려면 다음 지침을 사용하는 것이 좋습니다.

  • 리소스 및 구성을 명확히 분리하기 위해 Kafka 클러스터 및 관리하는 기타 Kafka 구성 요소와 별도의 네임스페이스에 Apache Kafka Operator를 설치합니다.
  • 단일 Streams for Apache Kafka Operator를 사용하여 OpenShift 클러스터 내의 모든 Kafka 인스턴스를 관리합니다.
  • 최신 기능 및 개선 사항을 반영하도록 Apache Kafka Operator 및 지원되는 Kafka 버전을 가능한 한 자주 업데이트합니다.

이러한 모범 사례를 따르고 Apache Kafka Operator의 단일 Streams에 대한 일관된 업데이트를 보장하면 OpenShift 클러스터에서 Kafka 인스턴스 관리의 안정성을 향상시킬 수 있습니다. 이 방법을 사용하면 Apache Kafka의 최신 기능 및 기능에 대한 Streams를 최대한 활용할 수 있습니다.

참고

Apache Kafka용 Streams는 Strimzi를 기반으로 하므로 OpenShift 클러스터에서 Apache Kafka Operator의 Streams를 Strimzi Operator와 결합할 때 동일한 문제가 발생할 수 있습니다.

4.3. Apache Kafka 릴리스 아티팩트용 스트림 다운로드

배포 파일을 사용하여 Apache Kafka용 Streams를 설치하려면 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 파일을 다운로드 하여 추출합니다.

Apache Kafka 릴리스 아티팩트의 스트림에는 Apache Kafka의 스트림 구성 요소를 OpenShift에 배포하고, 일반적인 작업을 수행하고 Kafka 클러스터를 구성하는 데 도움이 되는 샘플 YAML 파일이 포함되어 있습니다.

oc 를 사용하여 다운로드한 ZIP 파일의 install/cluster-operator 폴더에서 Cluster Operator를 배포합니다. Cluster Operator 배포 및 구성에 대한 자세한 내용은 6.2절. “Cluster Operator 배포” 을 참조하십시오.

또한 Apache Kafka Cluster Operator의 Streams에서 관리하지 않는 Kafka 클러스터와 함께 Topic 및 User Operator의 독립형 설치를 사용하려면 install/topic-operator 에서 배포하고 install/user-operator 폴더에서 배포할 수 있습니다.

참고

Apache Kafka 컨테이너 이미지의 스트림은 Red Hat Ecosystem Catalog 를 통해 사용할 수도 있습니다. 그러나 제공된 YAML 파일을 사용하여 Apache Kafka용 Streams를 배포하는 것이 좋습니다.

4.4. 컨테이너 이미지를 자체 레지스트리로 푸시

Apache Kafka용 스트림 컨테이너 이미지는 Red Hat Ecosystem Catalog 에서 사용할 수 있습니다. Apache Kafka용 Streams에서 제공하는 설치 YAML 파일은 Red Hat Ecosystem Catalog 에서 직접 이미지를 가져옵니다.

Red Hat Ecosystem Catalog 에 액세스할 수 없거나 자체 컨테이너 리포지토리를 사용하려면 다음을 수행하십시오.

  1. 여기에 나열된 모든 컨테이너 이미지를 가져옵니다.
  2. 자체 레지스트리로 푸시
  3. 설치 YAML 파일에서 이미지 이름을 업데이트
참고

릴리스에 지원되는 각 Kafka 버전에는 별도의 이미지가 있습니다.

Expand
컨테이너 이미지namespace/Repository설명

Kafka

  • registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
  • registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0

Kafka 실행을 위한 Apache Kafka 이미지 스트림(예:

  • Kafka 브로커
  • Kafka Connect
  • Kafka MirrorMaker
  • ZooKeeper
  • TLS 사이드카
  • 크루즈 제어

Operator

  • registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0

Operator를 실행하기 위한 Apache Kafka 이미지 스트림

  • Cluster Operator
  • 주제 Operator
  • 사용자 Operator
  • Kafka Initializer

Kafka Bridge

  • registry.redhat.io/amq-streams/bridge-rhel9:2.7.0

Apache Kafka 브리지용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림

Apache Kafka Drain cleaner 스트림

  • registry.redhat.io/amq-streams/drain-cleaner-rhel9:2.7.0

Apache Kafka Drain cleaner용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림

Apache Kafka 프록시용 스트림

  • registry.redhat.io/amq-streams/proxy-rhel9-operator:2.7.0

Apache Kafka 프록시용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림

Apache Kafka 콘솔 스트림

  • registry.redhat.io/amq-streams/console-rhel9-operator:2.7.0

Apache Kafka 콘솔용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림

4.5. 컨테이너 이미지 레지스트리에 대한 인증을 위한 풀 시크릿 생성

Apache Kafka용 Streams에서 제공하는 설치 YAML 파일은 Red Hat Ecosystem Catalog 에서 직접 컨테이너 이미지를 가져옵니다. Apache Kafka 배포의 Streams에 인증이 필요한 경우 시크릿에 인증 자격 증명을 구성하고 설치 YAML에 추가합니다.

참고

인증은 일반적으로 필요하지 않지만 특정 플랫폼에서 요청할 수 있습니다.

사전 요구 사항

  • Red Hat 사용자 이름과 암호 또는 Red Hat 레지스트리 서비스 계정의 로그인 정보가 필요합니다.
참고

프로세스

  1. 로그인 세부 정보와 Apache Kafka 이미지의 Streams를 가져오는 컨테이너 레지스트리가 포함된 풀 시크릿을 생성합니다.

    oc create secret docker-registry <pull_secret_name> \
        --docker-server=registry.redhat.io \
        --docker-username=<user_name> \
        --docker-password=<password> \
        --docker-email=<email>

    사용자 이름과 암호를 추가합니다. 이메일 주소는 선택 사항입니다.

  2. install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml 배포 파일을 편집하여 STRIMZI_IMAGE_PULL_SECRETS 환경 변수를 사용하여 풀 시크릿을 지정합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: strimzi-cluster-operator
    spec:
      # ...
      template:
        spec:
          serviceAccountName: strimzi-cluster-operator
          containers:
            # ...
            env:
              - name: STRIMZI_IMAGE_PULL_SECRETS
                value: "<pull_secret_name>"
    # ...

    시크릿은 Cluster Operator가 생성한 모든 Pod에 적용됩니다.

4.6. Apache Kafka 관리자용 Streams 지정

Apache Kafka의 스트림은 배포 구성에 대한 사용자 지정 리소스를 제공합니다. 기본적으로 이러한 리소스를 확인, 생성, 편집 및 삭제할 수 있는 권한은 OpenShift 클러스터 관리자로 제한됩니다. Apache Kafka의 스트림은 이러한 권한을 다른 사용자에게 할당하는 데 사용할 수 있는 두 가지 클러스터 역할을 제공합니다.

  • Strimzi-view 를 사용하면 Apache Kafka 리소스의 Streams를 보고 나열할 수 있습니다.
  • Strimzi-admin 을 사용하면 Apache Kafka 리소스의 Streams를 생성, 편집 또는 삭제할 수도 있습니다.

이러한 역할을 설치하면 기본 OpenShift 클러스터 역할에 이러한 권한을 자동으로 집계(추가)합니다. Strimzi-viewview 역할에 집계되고 strimzi-admin 집계는 editadmin 역할에 집계됩니다. 집계로 인해 이미 유사한 권한이 있는 사용자에게 이러한 역할을 할당할 필요가 없습니다.

다음 절차에서는 비 클러스터 관리자가 Apache Kafka 리소스의 Streams를 관리할 수 있는 strimzi-admin 역할을 할당하는 방법을 보여줍니다.

시스템 관리자는 Cluster Operator를 배포한 후 Apache Kafka 관리자용 Streams를 지정할 수 있습니다.

사전 요구 사항

  • CRD를 관리하기 위해 Apache Kafka CRD(Custom Resource Definitions) 및 RBAC(역할 기반 액세스 제어) 리소스의 Streams가 Cluster Operator와 함께 배포 되었습니다.

프로세스

  1. OpenShift에서 strimzi-viewstrimzi-admin 클러스터 역할을 만듭니다.

    oc create -f install/strimzi-admin
  2. 필요한 경우 액세스 권한이 필요한 사용자에게 액세스 권한을 제공하는 역할을 할당합니다.

    oc create clusterrolebinding strimzi-admin --clusterrole=strimzi-admin --user=user1 --user=user2

5장. 웹 콘솔을 사용하여 OperatorHub에서 Apache Kafka용 스트림 설치

OpenShift Container Platform 웹 콘솔의 OperatorHub에서 Streams for Apache Kafka Operator를 설치합니다.

이 섹션의 절차에서는 다음을 수행하는 방법을 보여줍니다.

5.1. OperatorHub에서 Apache Kafka Operator용 Streams 설치

OpenShift Container Platform 웹 콘솔에서 OperatorHub를 사용하여 Apache Kafka Operator의 Streams를 설치하고 구독할 수 있습니다.

다음 절차에서는 프로젝트를 생성하고 Apache Kafka Operator의 Streams를 해당 프로젝트에 설치하는 방법을 설명합니다. 프로젝트는 네임스페이스를 나타냅니다. 관리를 위해 네임스페이스를 사용하여 함수를 분리하는 것이 좋습니다.

주의

적절한 업데이트 채널을 사용해야 합니다. 지원되는 OpenShift 버전에 있는 경우 기본 stable 채널에서 Apache Kafka용 Streams를 설치하는 것이 일반적으로 안전합니다. 그러나 stable 채널에서 자동 업데이트를 활성화하지 않는 것이 좋습니다. 자동 업그레이드는 업그레이드하기 전에 필요한 단계를 건너뜁니다. 버전별 채널에서만 자동 업그레이드를 사용합니다.

사전 요구 사항

  • cluster-admin 또는 strimzi-admin 권한이 있는 계정을 사용하여 OpenShift Container Platform 웹 콘솔에 액세스합니다.

프로세스

  1. OpenShift 웹 콘솔에서 홈 > 프로젝트 페이지로 이동하여 설치를 위한 프로젝트(네임스페이스)를 생성합니다.

    이 예제에서는 amq-streams-kafka 라는 프로젝트를 사용합니다.

  2. Operators > OperatorHub 페이지로 이동합니다.
  3. 키워드로 필터링 상자에 키워드 를 스크롤하거나 입력하여 Apache Kafka Operator의 Streams를 찾습니다.

    Operator는 Streaming & Messaging 카테고리에 있습니다.

  4. Apache Kafka용 Streams 를 클릭하여 Operator 정보를 표시합니다.
  5. Operator에 대한 정보를 읽고 설치를 클릭합니다.
  6. Operator 설치 페이지에서 다음 설치 및 업데이트 옵션 중에서 선택합니다.

    • Update Channel: Operator의 업데이트 채널을 선택합니다.

      • (기본값) stable 채널에는 메이저, 마이너 및 마이크로 릴리스를 포함한 모든 최신 업데이트 및 릴리스가 포함되어 있으며 이는 잘 테스트되고 안정적인 것으로 간주됩니다.
      • amq-streams-X.x 채널에는 주요 릴리스의 마이너 및 마이크로 릴리스 업데이트가 포함되어 있습니다. 여기서 X 는 주요 릴리스 버전 번호입니다.
      • amq-streams-X.Y.x 채널에는 마이너 릴리스의 마이크로 릴리스 업데이트가 포함되어 있습니다. 여기서 X 는 주요 릴리스 버전 번호이고 Y 는 마이너 릴리스 버전 번호입니다.
    • 설치 모드: 생성한 프로젝트를 선택하여 특정 네임스페이스에 Operator를 설치합니다.

      클러스터의 모든 네임스페이스(기본 옵션) 또는 특정 네임스페이스에 Apache Kafka Operator의 Streams를 설치할 수 있습니다. 특정 네임스페이스를 Kafka 클러스터 및 Apache Kafka 구성 요소의 다른 Streams에 전용으로 사용하는 것이 좋습니다.

    • 업데이트 승인: 기본적으로 Apache Kafka Operator의 Streams는 OLM(Operator Lifecycle Manager)에 의해 Apache Kafka 버전의 최신 스트림으로 자동 업그레이드됩니다. 선택적으로 향후 업그레이드를 수동으로 승인하려면 Manual 을 선택합니다. Operator에 대한 자세한 내용은 OpenShift 설명서 를 참조하십시오.
  7. 설치를 클릭하여 선택한 네임스페이스에 Operator를 설치합니다.

    Streams for Apache Kafka Operator는 선택한 네임스페이스에 Cluster Operator, CRD 및 역할 기반 액세스 제어(RBAC) 리소스를 배포합니다.

  8. Operator를 사용할 준비가 되면 Operator > Installed Operators 로 이동하여 Operator가 선택한 네임스페이스에 설치되어 있는지 확인합니다.

    상태가 성공으로 표시됩니다.

    이제 Kafka 클러스터부터 Kafka 구성 요소를 배포하는 Apache Kafka Operator용 Streams를 사용할 수 있습니다.

참고

워크로드 > Deployments로 이동하는 경우 Cluster Operator 및 Entity Operator에 대한 배포 세부 정보를 확인할 수 있습니다. Cluster Operator의 이름에는 amq-streams-cluster-operator-<version>이라는 버전 번호가 포함됩니다. 이 이름은 Apache Kafka 설치 아티팩트용 Streams를 사용하여 Cluster Operator를 배포할 때 다릅니다. 이 경우 이름은 strimzi-cluster-operator 입니다.

5.2. Apache Kafka Operator용 Streams를 사용하여 Kafka 구성 요소 배포

Openshift에 설치할 때 Apache Kafka Operator용 Streams를 사용하면 사용자 인터페이스에서 Kafka 구성 요소를 설치할 수 있습니다.

다음 Kafka 구성 요소를 설치할 수 있습니다.

  • Kafka
  • Kafka Connect
  • Kafka MirrorMaker
  • Kafka MirrorMaker 2
  • Kafka Topic
  • Kafka 사용자
  • Kafka Bridge
  • Kafka 커넥터
  • Kafka 리밸런스

구성 요소를 선택하고 인스턴스를 생성합니다. 최소한 Kafka 인스턴스를 생성합니다. 다음 절차에서는 기본 설정을 사용하여 Kafka 인스턴스를 생성하는 방법을 설명합니다. 설치를 수행하기 전에 기본 설치 사양을 구성할 수 있습니다.

이 프로세스는 다른 Kafka 구성 요소의 인스턴스를 생성하는 것과 동일합니다.

사전 요구 사항

프로세스

  1. 웹 콘솔에서 Operator > Installed Operators 페이지로 이동하고 Apache Kafka의 Streams를 클릭하여 Operator 세부 정보를 표시합니다.

    제공된 API 에서 Kafka 구성 요소의 인스턴스를 생성할 수 있습니다.

  2. Kafka 아래에 인스턴스 생성 을 클릭하여 Kafka 인스턴스를 생성합니다.

    기본적으로 3개의 Kafka 브로커 노드와 3개의 Zoo Cryostat 노드를 사용하여 my-cluster 라는 Kafka 클러스터를 생성합니다. 클러스터는 임시 스토리지를 사용합니다.

  3. 생성 을 클릭하여 Kafka 설치를 시작합니다.

    상태가 Ready 로 변경될 때까지 기다립니다.

6장. 설치 아티팩트를 사용하여 Apache Kafka용 스트림 배포

Apache Kafka 용 Streams 배포를 위한 환경을 준비하면 Apache Kafka 용 Streams를 OpenShift 클러스터에 배포할 수 있습니다. 릴리스 아티팩트와 함께 제공되는 설치 파일을 사용합니다.

Apache Kafka의 스트림은 Strimzi 0.40.x를 기반으로 합니다. OpenShift 4.12에서 4.15로 Apache Kafka 2.7의 Streams를 배포할 수 있습니다.

설치 파일을 사용하여 Apache Kafka용 Streams를 배포하는 단계는 다음과 같습니다.

  1. Cluster Operator 배포
  2. Cluster Operator를 사용하여 다음을 배포합니다.

  3. 필요한 경우 요구 사항에 따라 다음 Kafka 구성 요소를 배포합니다.

참고

이 가이드에서 명령을 실행하려면 OpenShift 사용자에게 RBAC(역할 기반 액세스 제어) 및 CRD를 관리할 수 있는 권한이 있어야 합니다.

6.1. 기본 배포 경로

Streams for Apache Kafka가 동일한 네임스페이스에서 단일 Kafka 클러스터를 관리하는 배포를 설정할 수 있습니다. 이 구성을 개발 또는 테스트에 사용할 수 있습니다. 또는 프로덕션 환경에서 Apache Kafka용 Streams를 사용하여 다른 네임스페이스의 여러 Kafka 클러스터를 관리할 수 있습니다.

Apache Kafka용 Streams를 배포하는 첫 번째 단계는 install/cluster-operator 파일을 사용하여 Cluster Operator를 설치하는 것입니다.

단일 명령은 cluster-operator 폴더의 모든 설치 파일을 적용합니다. oc apply -f ./install/cluster-operator.

이 명령은 다음을 포함하여 Kafka 배포를 생성하고 관리하는 데 필요한 모든 것을 설정합니다.

  • Cluster Operator(배포,ConfigMap)
  • Apache Kafka CRD용 스트림 (CustomResourceDefinition)
  • RBAC 리소스(ClusterRole,ClusterRoleBinding,RoleBinding)
  • 서비스 계정(ServiceAccount)

기본 배포 경로는 다음과 같습니다.

  1. 릴리스 아티팩트 다운로드
  2. Cluster Operator를 배포할 OpenShift 네임스페이스를 생성합니다.
  3. Cluster Operator 배포

    1. Cluster Operator용으로 생성된 네임스페이스를 사용하도록 install/cluster-operator 파일을 업데이트
    2. Cluster Operator를 설치하여 하나, 여러 개 또는 모든 네임스페이스를 조사합니다.
  4. Kafka 클러스터 생성

그러면 다른 Kafka 구성 요소를 배포하고 배포 모니터링을 설정할 수 있습니다.

6.2. Cluster Operator 배포

Cluster Operator는 OpenShift 클러스터 내에서 Kafka 클러스터를 배포 및 관리합니다.

Cluster Operator가 실행되면 Kafka 리소스의 업데이트를 감시하기 시작합니다.

기본적으로 Cluster Operator의 단일 복제본이 배포됩니다. 리더 선택 항목이 있는 복제본을 추가하여 중단 시 추가 Cluster Operator가 대기 상태가 되도록 할 수 있습니다. 자세한 내용은 9.5.4절. “리더 선택으로 여러 Cluster Operator 복제본 실행”의 내용을 참조하십시오.

6.2.1. Cluster Operator에서 감시하는 네임스페이스 지정

Cluster Operator는 Kafka 리소스가 배포된 네임스페이스의 업데이트를 감시합니다. Cluster Operator를 배포할 때 OpenShift 클러스터에서 조사할 네임스페이스를 지정합니다. 다음 네임스페이스를 지정할 수 있습니다.

여러 선택한 네임스페이스를 조사하면 처리 오버헤드가 증가하여 성능에 가장 큰 영향을 미칩니다. 네임스페이스 모니터링에 대한 성능을 최적화하려면 일반적으로 단일 네임스페이스를 조사하거나 전체 클러스터를 모니터링하는 것이 좋습니다. 단일 네임스페이스를 모니터링하면 네임스페이스별 리소스를 집중적으로 모니터링할 수 있지만 모든 네임스페이스를 모니터링하면 모든 네임스페이스에서 클러스터의 리소스를 포괄적으로 볼 수 있습니다.

Cluster Operator는 다음 리소스의 변경 사항을 감시합니다.

  • Kafka 클러스터용 Kafka입니다.
  • Kafka Connect 클러스터용 KafkaConnect입니다.
  • Kafka Connect 클러스터에서 커넥터를 생성하고 관리하기 위한 KafkaConnector 입니다.
  • Kafka MirrorMaker 인스턴스용 KafkaMirrorMaker.
  • Kafka MirrorMaker 2 인스턴스의 KafkaMirrorMaker2입니다.
  • Kafka 브리지 인스턴스용 KafkaBridge.
  • Cruise Control 최적화 요청에 대한 KafkaRebalance.

OpenShift 클러스터에서 이러한 리소스 중 하나가 생성되면 Operator가 리소스에서 클러스터 설명을 가져오고 Deployments, Pods, Services 및 ConfigMaps와 같은 필요한 OpenShift 리소스를 생성하여 리소스에 대한 새 클러스터 생성을 시작합니다.

Kafka 리소스가 업데이트될 때마다 Operator는 리소스의 클러스터를 구성하는 OpenShift 리소스에서 해당 업데이트를 수행합니다.

리소스가 패치 또는 삭제된 다음 다시 생성되어 리소스의 클러스터를 클러스터의 원하는 상태를 반영하도록 합니다. 이 작업으로 인해 롤링 업데이트가 발생하여 서비스가 중단될 수 있습니다.

리소스가 삭제되면 Operator는 클러스터 배포를 취소하고 관련 OpenShift 리소스를 모두 삭제합니다.

참고

Cluster Operator는 OpenShift 클러스터에서 하나, 여러 또는 모든 네임스페이스를 조사할 수 있지만 Topic Operator 및 User Operator는 단일 네임스페이스에서 KafkaTopicKafkaUser 리소스를 조사합니다. 자세한 내용은 1.2.1절. “OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 스트림 감시”의 내용을 참조하십시오.

6.2.2. 단일 네임스페이스를 조사하기 위해 Cluster Operator 배포

다음 절차에서는 OpenShift 클러스터의 단일 네임스페이스에서 Streams for Apache Kafka 리소스를 조사하기 위해 Cluster Operator를 배포하는 방법을 보여줍니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.

프로세스

  1. Cluster Operator를 설치할 네임스페이스를 사용하도록 Apache Kafka 설치 파일의 Streams를 편집합니다.

    예를 들어 이 절차에서는 Cluster Operator가 네임스페이스 my-cluster-operator-namespace 에 설치됩니다.

    Linux에서 다음을 사용하십시오.

    sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml

    MacOS에서 다음을 사용하십시오.

    sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
  2. Cluster Operator를 배포합니다.

    oc create -f install/cluster-operator -n my-cluster-operator-namespace
  3. 배포 상태를 확인합니다.

    oc get deployments -n my-cluster-operator-namespace

    출력에 배포 이름 및 준비 상태 표시

    NAME                      READY  UP-TO-DATE  AVAILABLE
    strimzi-cluster-operator  1/1    1           1

    READY 는 ready/expected 복제본 수를 표시합니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

6.2.3. 여러 네임스페이스를 조사하기 위해 Cluster Operator 배포

다음 절차에서는 OpenShift 클러스터의 여러 네임스페이스에서 Apache Kafka 리소스의 스트림을 조사하기 위해 Cluster Operator를 배포하는 방법을 보여줍니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.

프로세스

  1. Cluster Operator를 설치할 네임스페이스를 사용하도록 Apache Kafka 설치 파일의 Streams를 편집합니다.

    예를 들어 이 절차에서는 Cluster Operator가 네임스페이스 my-cluster-operator-namespace 에 설치됩니다.

    Linux에서 다음을 사용하십시오.

    sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml

    MacOS에서 다음을 사용하십시오.

    sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
  2. install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml 파일을 편집하여 Cluster Operator가 STRIMZI_NAMESPACE 환경 변수에 감시하는 모든 네임스페이스 목록을 추가합니다.

    예를 들어 이 절차에서 Cluster Operator는 네임스페이스 watched-namespace-1,watched-namespace-2,watched-namespace-3 을 확인합니다.

    apiVersion: apps/v1
    kind: Deployment
    spec:
      # ...
      template:
        spec:
          serviceAccountName: strimzi-cluster-operator
          containers:
          - name: strimzi-cluster-operator
            image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0
            imagePullPolicy: IfNotPresent
            env:
            - name: STRIMZI_NAMESPACE
              value: watched-namespace-1,watched-namespace-2,watched-namespace-3
  3. 나열된 각 네임스페이스에 대해 RoleBinding을 설치합니다.

    이 예제에서는 이러한 명령에서 watched-namespace -namespace를 이전 단계에 나열된 네임스페이스로 교체하여 watched-namespace-1, watched-namespace -2,watched-namespace-3:을 반복합니다.

    oc create -f install/cluster-operator/020-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace>
    oc create -f install/cluster-operator/023-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace>
    oc create -f install/cluster-operator/031-RoleBinding-strimzi-cluster-operator-entity-operator-delegation.yaml -n <watched_namespace>
  4. Cluster Operator를 배포합니다.

    oc create -f install/cluster-operator -n my-cluster-operator-namespace
  5. 배포 상태를 확인합니다.

    oc get deployments -n my-cluster-operator-namespace

    출력에 배포 이름 및 준비 상태 표시

    NAME                      READY  UP-TO-DATE  AVAILABLE
    strimzi-cluster-operator  1/1    1           1

    READY 는 ready/expected 복제본 수를 표시합니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

6.2.4. 모든 네임스페이스를 조사하기 위해 Cluster Operator 배포

다음 절차에서는 OpenShift 클러스터의 모든 네임스페이스에서 Apache Kafka 리소스에 대한 Streams를 조사하기 위해 Cluster Operator를 배포하는 방법을 보여줍니다.

이 모드에서 실행하면 Cluster Operator가 생성된 새 네임스페이스의 클러스터를 자동으로 관리합니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.

프로세스

  1. Cluster Operator를 설치할 네임스페이스를 사용하도록 Apache Kafka 설치 파일의 Streams를 편집합니다.

    예를 들어 이 절차에서는 Cluster Operator가 네임스페이스 my-cluster-operator-namespace 에 설치됩니다.

    Linux에서 다음을 사용하십시오.

    sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml

    MacOS에서 다음을 사용하십시오.

    sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
  2. install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml 파일을 편집하여 STRIMZI_NAMESPACE 환경 변수의 값을 * 로 설정합니다.

    apiVersion: apps/v1
    kind: Deployment
    spec:
      # ...
      template:
        spec:
          # ...
          serviceAccountName: strimzi-cluster-operator
          containers:
          - name: strimzi-cluster-operator
            image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0
            imagePullPolicy: IfNotPresent
            env:
            - name: STRIMZI_NAMESPACE
              value: "*"
            # ...
  3. Cluster Operator에 모든 네임스페이스에 대한 클러스터 전체 액세스 권한을 부여하는 ClusterRoleBindings 를 생성합니다.

    oc create clusterrolebinding strimzi-cluster-operator-namespaced --clusterrole=strimzi-cluster-operator-namespaced --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator
    oc create clusterrolebinding strimzi-cluster-operator-watched --clusterrole=strimzi-cluster-operator-watched --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator
    oc create clusterrolebinding strimzi-cluster-operator-entity-operator-delegation --clusterrole=strimzi-entity-operator --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator
  4. OpenShift 클러스터에 Cluster Operator를 배포합니다.

    oc create -f install/cluster-operator -n my-cluster-operator-namespace
  5. 배포 상태를 확인합니다.

    oc get deployments -n my-cluster-operator-namespace

    출력에 배포 이름 및 준비 상태 표시

    NAME                      READY  UP-TO-DATE  AVAILABLE
    strimzi-cluster-operator  1/1    1           1

    READY 는 ready/expected 복제본 수를 표시합니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

6.3. Kafka 배포

Cluster Operator를 사용하여 Kafka 클러스터를 관리하려면 Kafka 리소스로 배포해야 합니다. Apache Kafka의 스트림은 이 작업을 수행하기 위해 예제 배포 파일을 제공합니다. 이러한 파일을 사용하여 Topic Operator 및 User Operator를 동시에 배포할 수 있습니다.

Cluster Operator를 배포한 후 Kafka 리소스를 사용하여 다음 구성 요소를 배포합니다.

노드 풀은 Kafka 노드 세트에 대한 구성을 제공합니다. 노드 풀을 사용하면 노드가 동일한 Kafka 클러스터 내에서 다른 구성을 가질 수 있습니다.

Kafka 클러스터를 Kafka 리소스로 배포하지 않은 경우 Cluster Operator를 사용하여 관리할 수 없습니다. 예를 들어 OpenShift 외부에서 실행되는 Kafka 클러스터에 적용됩니다. 그러나 독립 실행형 구성 요소로 배포하여 Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터와 함께 Topic Operator 및 User Operator를 사용할 수 있습니다. Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터와 함께 다른 Kafka 구성 요소를 배포하고 사용할 수도 있습니다.

6.3.1. 노드 풀을 사용하여 Kafka 클러스터 배포

다음 절차에서는 Cluster Operator를 사용하여 노드 풀이 있는 Kafka를 OpenShift 클러스터에 배포하는 방법을 보여줍니다. 노드 풀은 동일한 구성을 공유하는 Kafka 클러스터 내의 고유한 Kafka 노드 그룹을 나타냅니다. 노드 풀의 각 Kafka 노드에 대해 노드 풀에 정의되지 않은 구성은 kafka 리소스의 클러스터 구성에서 상속됩니다.

배포에서는 YAML 파일을 사용하여 KafkaNodePool 리소스를 생성하는 사양을 제공합니다. KRaft(Kafka Raft 메타데이터) 모드를 사용하는 Kafka 클러스터에서 노드 풀을 사용하거나 클러스터 관리에 Zoo Cryostat를 사용할 수 있습니다. KRaft 모드에서 Kafka 클러스터를 배포하려면 KafkaNodePool 리소스를 사용해야 합니다.

Apache Kafka의 스트림은 노드 풀을 사용하는 Kafka 클러스터를 생성하는 데 사용할 수 있는 다음 예제 파일을 제공합니다.

kafka-with-dual-role-kraft-nodes.yaml
브로커 및 컨트롤러 역할을 공유하는 하나의 KRaft 노드 풀을 사용하여 Kafka 클러스터를 배포합니다.
kafka-with-kraft.yaml
컨트롤러 노드 풀과 브로커 노드 한 개로 구성된 영구 Kafka 클러스터를 배포합니다.
kafka-with-kraft-ephemeral.yaml
컨트롤러 노드 풀과 브로커 노드 한 개로 이루어진 임시 Kafka 클러스터를 배포합니다.
kafka.yaml
3개의 노드와 Kafka 브로커의 두 개의 다른 풀을 사용하여 Zoo Cryostat를 배포합니다. 각 풀에는 3 개의 브로커가 있습니다. 이 예제의 풀은 다른 스토리지 구성을 사용합니다.
참고

여기에 설명된 단계를 수행하여 KafkaNodePool 리소스를 사용하여 새 Kafka 클러스터를 배포하거나 기존 Kafka 클러스터를 마이그레이션할 수 있습니다.

프로세스

  1. KRaft 기반 Kafka 클러스터를 배포합니다.

    • 이중 역할 노드를 사용하는 단일 노드 풀을 사용하여 KRaft 모드에서 Kafka 클러스터를 배포하려면 다음을 수행합니다.

      oc apply -f examples/kafka/kraft/kafka-with-dual-role-nodes.yaml
    • 브로커 및 컨트롤러 노드에 대해 별도의 노드 풀을 사용하여 KRaft 모드에서 영구 Kafka 클러스터를 배포하려면 다음을 수행합니다.

      oc apply -f examples/kafka/kraft/kafka.yaml
    • 브로커 및 컨트롤러 노드에 대해 별도의 노드 풀을 사용하여 KRaft 모드에서 임시 Kafka 클러스터를 배포하려면 다음을 수행합니다.

      oc apply -f examples/kafka/kraft/kafka-ephemeral.yaml
    • 3개의 브로커로 구성된 두 개의 노드 풀을 사용하여 Kafka 클러스터 및 Zoo Cryostat 클러스터를 배포하려면 다음을 수행합니다.

      oc apply -f examples/kafka/kafka-with-node-pools.yaml
  2. 배포 상태를 확인합니다.

    oc get pods -n <my_cluster_operator_namespace>

    출력에 노드 풀 이름 및 준비 상태가 표시됩니다.

    NAME                        READY  STATUS   RESTARTS
    my-cluster-entity-operator  3/3    Running  0
    my-cluster-pool-a-0         1/1    Running  0
    my-cluster-pool-a-1         1/1    Running  0
    my-cluster-pool-a-4         1/1    Running  0

    • my-cluster 는 Kafka 클러스터의 이름입니다.
    • pool-a 는 노드 풀의 이름입니다.

      0 으로 시작하는 순차적 인덱스 번호는 생성된 각 Kafka Pod를 식별합니다. Zoo Cryostat를 사용하는 경우 Zoo Cryostat Pod도 표시됩니다.

      READY 는 ready/expected 복제본 수를 표시합니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

      배포에 대한 정보는 풀에 있는 노드의 ID 목록을 포함하여 KafkaNodePool 리소스의 상태에도 표시됩니다.

      참고

      노드 ID는 클러스터 내의 모든 노드 풀에서 0(0)부터 순차적으로 할당됩니다. 즉, 노드 ID가 특정 노드 풀 내에서 순차적으로 실행되지 않을 수 있습니다. 클러스터 전체의 노드 ID 시퀀스에 차이가 있는 경우 추가할 다음 노드에는 격차를 채우는 ID가 할당됩니다. 축소하면 풀 내에서 노드 ID가 가장 높은 노드가 제거됩니다.

6.3.2. 노드 풀 없이 Zoo Cryostat 기반 Kafka 클러스터 배포

다음 절차에서는 Cluster Operator를 사용하여 Zoo Cryostat 기반 Kafka 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.

배포에서는 YAML 파일을 사용하여 Kafka 리소스를 생성할 사양을 제공합니다.

Apache Kafka용 스트림은 다음 예제 파일을 제공하여 클러스터 관리에 Zoo Cryostat를 사용하는 Kafka 클러스터를 생성합니다.

kafka-persistent.yaml
3개의 Zoo Cryostat 및 3개의 Kafka 노드로 영구 클러스터를 배포합니다.
kafka-jbod.yaml
3개의 Zoo Cryostat 및 3개의 Kafka 노드로 영구 클러스터를 배포합니다(각각 여러 영구 볼륨을 사용).
kafka-persistent-single.yaml
단일 Zoo Cryostat 노드와 단일 Kafka 노드로 영구 클러스터를 배포합니다.
kafka-ephemeral.yaml
3개의 Zoo Cryostat 및 3개의 Kafka 노드로 임시 클러스터를 배포합니다.
kafka-ephemeral-single.yaml
3개의 Zoo Cryostat 노드와 단일 Kafka 노드로 임시 클러스터를 배포합니다.

이 절차에서는 임시 및 영구 Kafka 클러스터 배포에 대한 예제를 사용합니다.

임시 클러스터
일반적으로 임시(또는 임시) Kafka 클러스터는 프로덕션이 아닌 개발 및 테스트 목적에 적합합니다. 이 배포에서는 emptyDir 볼륨을 사용하여 브로커 정보(Opache의 경우) 및 주제 또는 파티션( Kafka용)을 저장합니다. emptyDir 볼륨을 사용하면 해당 콘텐츠가 Pod 라이프 사이클과 엄격하게 관련되어 있으며 Pod가 중단될 때 삭제됩니다.
영구 클러스터

영구 Kafka 클러스터는 영구 볼륨을 사용하여 Zoo Cryostat 및 Kafka 데이터를 저장합니다. PersistentVolumePersistentVolumeClaim 을 사용하여 취득하여 PersistentVolume 의 실제 유형과 무관하게 만듭니다. PersistentVolumeClaimStorageClass 를 사용하여 자동 볼륨 프로비저닝을 트리거할 수 있습니다. StorageClass 를 지정하지 않으면 OpenShift에서 기본 StorageClass 를 사용하려고 합니다.

다음 예제에서는 몇 가지 일반적인 영구 볼륨 유형을 보여줍니다.

  • OpenShift 클러스터가 Amazon AWS에서 실행되는 경우 OpenShift는 Amazon EBS 볼륨을 프로비저닝할 수 있습니다.
  • OpenShift 클러스터가 Microsoft Azure에서 실행되는 경우 OpenShift는 Azure Disk Storage 볼륨을 프로비저닝할 수 있습니다.
  • OpenShift 클러스터가 Google Cloud에서 실행되는 경우 OpenShift는 영구 디스크 볼륨을 프로비저닝할 수 있습니다.
  • OpenShift 클러스터가 베어 메탈에서 실행되는 경우 OpenShift는 로컬 영구 볼륨을 프로비저닝할 수 있습니다.

예제 YAML 파일은 지원되는 최신 Kafka 버전 및 지원되는 로그 메시지 형식 버전 및 상호 브랜드 프로토콜 버전에 대한 구성을 지정합니다. Kafka 구성inter.broker.protocol.version 속성은 지정된 Kafka 버전 (spec.kafka.version)에서 지원하는 버전이어야 합니다. 속성은 Kafka 클러스터에서 사용되는 Kafka 프로토콜 버전을 나타냅니다.

Kafka 3.0.0에서 inter.broker.protocol.version3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다.

예제 클러스터의 이름은 기본적으로 my-cluster 로 지정됩니다. 클러스터 이름은 리소스 이름으로 정의되며 클러스터를 배포한 후에는 변경할 수 없습니다. 클러스터를 배포하기 전에 클러스터 이름을 변경하려면 관련 YAML 파일에서 Kafka 리소스의 Kafka.metadata.name 속성을 편집합니다.

기본 클러스터 이름 및 지정된 Kafka 버전

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    version: 3.7.0
    #...
    config:
      #...
      log.message.format.version: "3.7"
      inter.broker.protocol.version: "3.7"
  # ...

프로세스

  1. Zoo Cryostat 기반 Kafka 클러스터를 배포합니다.

    • 임시 클러스터를 배포하려면 다음을 수행합니다.

      oc apply -f examples/kafka/kafka-ephemeral.yaml
    • 영구 클러스터를 배포하려면 다음을 수행합니다.

      oc apply -f examples/kafka/kafka-persistent.yaml
  2. 배포 상태를 확인합니다.

    oc get pods -n <my_cluster_operator_namespace>

    출력에 Pod 이름 및 준비 상태 표시

    NAME                        READY   STATUS    RESTARTS
    my-cluster-entity-operator  3/3     Running   0
    my-cluster-kafka-0          1/1     Running   0
    my-cluster-kafka-1          1/1     Running   0
    my-cluster-kafka-2          1/1     Running   0
    my-cluster-zookeeper-0      1/1     Running   0
    my-cluster-zookeeper-1      1/1     Running   0
    my-cluster-zookeeper-2      1/1     Running   0

    my-cluster 는 Kafka 클러스터의 이름입니다.

    0 으로 시작하는 순차적 인덱스 번호는 생성된 각 Kafka 및 Zoo Cryostat Pod를 식별합니다.

    기본 배포를 통해 Entity Operator 클러스터, 3 Kafka Pod 및 3 Zoo Cryostat Pod를 생성합니다.

    READY 는 ready/expected 복제본 수를 표시합니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.3.3. Cluster Operator를 사용하여 Topic Operator 배포

다음 절차에서는 Cluster Operator를 사용하여 Topic Operator를 배포하는 방법을 설명합니다. Topic Operator는 양방향 모드 또는 unidirectional 모드에서 사용하기 위해 배포할 수 있습니다. 양방향 및 단방향 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 에서 참조하십시오.

topicOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 구성합니다. 기본적으로 Topic Operator는 Cluster Operator가 배포한 Kafka 클러스터의 네임스페이스에서 KafkaTopic 리소스를 감시합니다. Topic Operator 사양에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다. 단일 Topic Operator는 단일 네임스페이스를 조사할 수 있습니다. Topic Operator는 하나의 네임스페이스만 조사해야 합니다.

Apache Kafka의 Streams를 사용하여 동일한 네임스페이스에 여러 Kafka 클러스터를 배포하는 경우 하나의 Kafka 클러스터에 대해서만 Topic Operator를 활성화하거나 watchedNamespace 속성을 사용하여 다른 네임스페이스를 조사하도록 Topic Operator를 구성합니다.

Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터에서 Topic Operator를 사용하려면 독립 실행형 구성 요소로 Topic Operator를 배포해야 합니다.

entityOperatortopicOperator 속성 구성에 대한 자세한 내용은 Entity Operator 구성을 참조하십시오.

프로세스

  1. topicOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 편집합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      #...
      entityOperator:
        topicOperator: {}
        userOperator: {}
  2. EntityTopicOperatorSpec 스키마 참조에 설명된 속성을 사용하여 Topic Operator 사양 을 구성합니다.

    모든 속성에서 기본값을 사용하려면 빈 오브젝트({})를 사용합니다.

  3. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>
  4. 배포 상태를 확인합니다.

    oc get pods -n <my_cluster_operator_namespace>

    출력에 Pod 이름 및 준비 상태 표시

    NAME                        READY   STATUS    RESTARTS
    my-cluster-entity-operator  3/3     Running   0
    # ...

    my-cluster 는 Kafka 클러스터의 이름입니다.

    READY 는 ready/expected 복제본 수를 표시합니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.3.4. Cluster Operator를 사용하여 User Operator 배포

다음 절차에서는 Cluster Operator를 사용하여 User Operator를 배포하는 방법을 설명합니다.

userOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 구성합니다. 기본적으로 User Operator는 Kafka 클러스터 배포의 네임스페이스에서 KafkaUser 리소스를 감시합니다. User Operator 사양에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다. 단일 User Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임 스페이스는 하나의 User Operator에서만 조사해야 합니다.

Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터에서 User Operator를 사용하려면 User Operator를 독립 실행형 구성 요소로 배포해야 합니다.

entityOperatoruserOperator 속성을 구성하는 방법에 대한 자세한 내용은 Entity Operator 구성을 참조하십시오.

프로세스

  1. userOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 편집합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      #...
      entityOperator:
        topicOperator: {}
        userOperator: {}
  2. EntityUserOperatorSpec 스키마 참조에 설명된 속성을 사용하여 User Operator 사양 을 구성합니다.

    모든 속성에서 기본값을 사용하려면 빈 오브젝트({})를 사용합니다.

  3. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>
  4. 배포 상태를 확인합니다.

    oc get pods -n <my_cluster_operator_namespace>

    출력에 Pod 이름 및 준비 상태 표시

    NAME                        READY   STATUS    RESTARTS
    my-cluster-entity-operator  3/3     Running   0
    # ...

    my-cluster 는 Kafka 클러스터의 이름입니다.

    READY 는 ready/expected 복제본 수를 표시합니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.3.5. 터미널에서 Zoo Cryostat에 연결

Zookeeper 서비스는 암호화 및 인증으로 보호되며 Apache Kafka용 Streams에 포함되지 않은 외부 애플리케이션에서 사용할 수 없습니다.

그러나 Zoo Cryostat에 대한 연결이 필요한 CLI 도구를 사용하려면 Zoo Cryostat Pod 내에서 터미널을 사용하여 localhost:12181 에 연결할 수 있습니다.

사전 요구 사항

  • OpenShift 클러스터를 사용할 수 있습니다.
  • Kafka 클러스터가 실행 중입니다.
  • Cluster Operator가 실행 중입니다.

프로세스

  1. OpenShift 콘솔을 사용하여 터미널을 열거나 CLI에서 exec 명령을 실행합니다.

    예를 들면 다음과 같습니다.

    oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181 ls /

    localhost:12181 을 사용해야 합니다.

6.3.6. Kafka 클러스터 리소스 목록

다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.

공유 리소스

<kafka_cluster_name>-cluster-ca
클러스터 통신을 암호화하는 데 사용되는 클러스터 CA 개인 키가 있는 시크릿입니다.
<kafka_cluster_name>-cluster-ca-cert
클러스터 CA 공개 키가 있는 시크릿입니다. 이 키를 사용하여 Kafka 브로커의 ID를 확인할 수 있습니다.
<kafka_cluster_name>-clients-ca
사용자 인증서에 서명하는 데 사용되는 클라이언트 CA 개인 키가 있는 시크릿
<kafka_cluster_name>-clients-ca-cert
클라이언트 CA 공개 키가 있는 시크릿입니다. 이 키를 사용하여 Kafka 사용자의 ID를 확인할 수 있습니다.
<kafka_cluster_name>-cluster-operator-certs
Kafka 및 Zoo Cryostat와의 통신을 위한 클러스터 운영자 키가 있는 시크릿입니다.

Zookeeper 노드

<kafka_cluster_name>-zookeeper

다음 Zoo Cryostat 리소스에 지정된 이름입니다.

  • Zoo Cryostat 노드 Pod를 관리하기 위한 StrimziPodSet.
  • Zoo Cryostat 노드에서 사용하는 서비스 계정입니다.
  • PodDisruptionBudget은 Zoo Cryostat 노드에 대해 구성되어 있습니다.
<kafka_cluster_name>-zookeeper-<pod_id>
StrimziPodSet에서 생성한 Pod입니다.
<kafka_cluster_name>-zookeeper-nodes
헤드리스 서비스는 DNS가 Zoo Cryostat Pod IP 주소를 직접 확인해야 했습니다.
<kafka_cluster_name>-zookeeper-client
Kafka 브로커가 클라이언트로 Zoo Cryostat 노드에 연결하는 데 사용하는 서비스입니다.
<kafka_cluster_name>-zookeeper-config
ConfigMap은 Zoo Cryostat ancillary 구성이 포함되어 있고 Zoo Cryostat 노드 Pod에 의해 볼륨으로 마운트됩니다.
<kafka_cluster_name>-zookeeper-nodes
secret with Zoo Cryostat 노드 키입니다.
<kafka_cluster_name>-network-policy-zookeeper
Zoo Cryostat 서비스에 대한 액세스를 관리하는 네트워크 정책입니다.
data-<kafka_cluster_name>-zookeeper-<pod_id>
특정 Zoo Cryostat 노드의 데이터를 저장하는 데 사용되는 볼륨에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장하기 위한 영구 볼륨 프로비저닝용으로 영구 스토리지를 선택한 경우에만 생성됩니다.

Kafka 브로커

<kafka_cluster_name>-kafka

다음 Kafka 리소스에 지정된 이름입니다.

  • Kafka 브로커 Pod를 관리하기 위한 StrimziPodSet.
  • Kafka Pod에서 사용하는 서비스 계정입니다.
  • Kafka 브로커에 대해 구성된 PodDisruptionBudget.
<kafka_cluster_name>-kafka-<pod_id>

다음 Kafka 리소스에 지정된 이름입니다.

  • StrimziPodSet에서 생성한 Pod입니다.
  • Kafka 브로커 구성이 포함된 ConfigMap입니다.
<kafka_cluster_name>-kafka-brokers
DNS에서 Kafka 브로커 포드 IP 주소를 직접 확인하는 데 필요한 서비스입니다.
<kafka_cluster_name>-kafka-bootstrap
서비스는 OpenShift 클러스터 내에서 연결하는 Kafka 클라이언트의 부트스트랩 서버로 사용할 수 있습니다.
<kafka_cluster_name>-kafka-external-bootstrap
OpenShift 클러스터 외부에서 연결하는 클라이언트를 위한 부트스트랩 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 리스너 이름이 외부 이고 포트가 9094 인 경우 이전 서비스 이름은 이전 버전과의 호환성에 사용됩니다.
<kafka_cluster_name>-kafka-<pod_id>
OpenShift 클러스터 외부에서 개별 포드로 트래픽을 라우팅하는 데 사용되는 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 리스너 이름이 외부 이고 포트가 9094 인 경우 이전 서비스 이름은 이전 버전과의 호환성에 사용됩니다.
<kafka_cluster_name>-kafka-external-bootstrap
OpenShift 클러스터 외부에서 연결하는 클라이언트의 부트스트랩 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type route 로 설정됩니다. 리스너 이름이 외부 이고 포트가 9094 인 경우 이전 경로 이름은 이전 버전과의 호환성에 사용됩니다.
<kafka_cluster_name>-kafka-<pod_id>
OpenShift 클러스터 외부에서 개별 포드로의 트래픽 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type route 로 설정됩니다. 리스너 이름이 외부 이고 포트가 9094 인 경우 이전 경로 이름은 이전 버전과의 호환성에 사용됩니다.
<kafka_cluster_name>-kafka-<listener_name>-bootstrap
OpenShift 클러스터 외부에서 연결하는 클라이언트를 위한 부트스트랩 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 새 서비스 이름은 다른 모든 외부 리스너에 사용됩니다.
<kafka_cluster_name>-kafka-<listener_name>-<pod_id>
OpenShift 클러스터 외부에서 개별 포드로 트래픽을 라우팅하는 데 사용되는 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 새 서비스 이름은 다른 모든 외부 리스너에 사용됩니다.
<kafka_cluster_name>-kafka-<listener_name>-bootstrap
OpenShift 클러스터 외부에서 연결하는 클라이언트의 부트스트랩 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type route 로 설정됩니다. 새 경로 이름은 다른 모든 외부 리스너에 사용됩니다.
<kafka_cluster_name>-kafka-<listener_name>-<pod_id>
OpenShift 클러스터 외부에서 개별 포드로의 트래픽 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type route 로 설정됩니다. 새 경로 이름은 다른 모든 외부 리스너에 사용됩니다.
<kafka_cluster_name>-kafka-config
UseStrimziPodSets 기능 게이트를 비활성화할 때 브로커 Pod에 의해 볼륨으로 마운트되는 Kafka 보조 구성이 포함된 ConfigMap입니다.
<kafka_cluster_name>-kafka-brokers
Kafka 브로커 키가 있는 시크릿입니다.
<kafka_cluster_name>-network-policy-kafka
Kafka 서비스에 대한 액세스를 관리하는 네트워크 정책입니다.
strimzi-namespace-name-<kafka_cluster_name>-kafka-init
Kafka 브로커에서 사용하는 클러스터 역할 바인딩입니다.
<kafka_cluster_name>-jmx
Kafka 브로커 포트를 보호하는 데 사용되는 secret 및 password가 있는 secret입니다. 이 리소스는 Kafka에서 Cryostat가 활성화된 경우에만 생성됩니다.
data-<kafka_cluster_name>-kafka-<pod_id>
특정 Kafka 브로커의 데이터를 저장하는 데 사용되는 볼륨에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장하기 위한 영구 볼륨 프로비저닝용으로 영구 스토리지를 선택한 경우에만 생성됩니다.
data-<id>-<kafka_cluster_name>-kafka-<pod_id>
특정 Kafka 브로커의 데이터를 저장하는 사용되는 볼륨 ID에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장할 영구 볼륨을 프로비저닝할 때 JBOD 볼륨에 영구 스토리지를 선택한 경우에만 생성됩니다.

Kafka 노드 풀

Kafka 노드 풀을 사용하는 경우 생성된 리소스는 브로커, 컨트롤러 또는 둘 다로 작동하는지 노드 풀에서 관리되는 노드에 적용됩니다. 이름 지정 규칙에는 Kafka 클러스터의 이름과 노드 풀: < kafka_cluster_name>-<pool_name > 이 포함됩니다.

<kafka_cluster_name>-<pool_name>
Kafka 노드 풀을 관리하기 위해 StrimziPodSet에 지정된 이름입니다.
<kafka_cluster_name>-<pool_name>-<pod_id>

다음 Kafka 노드 풀 리소스에 지정된 이름입니다.

  • StrimziPodSet에서 생성한 Pod입니다.
  • Kafka 노드 구성이 포함된 ConfigMap입니다.
data-<kafka_cluster_name>-<pool_name>-<pod_id>
특정 노드의 데이터를 저장하는 데 사용되는 볼륨에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장하기 위한 영구 볼륨 프로비저닝용으로 영구 스토리지를 선택한 경우에만 생성됩니다.
data-<id>-<kafka_cluster_name>-<pool_name>-<pod_id>
특정 노드의 데이터를 저장하는 데 사용되는 볼륨 ID에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장할 영구 볼륨을 프로비저닝할 때 JBOD 볼륨에 영구 스토리지를 선택한 경우에만 생성됩니다.

Entity Operator

이러한 리소스는 Entity Operator가 Cluster Operator를 사용하여 배포된 경우에만 생성됩니다.

<kafka_cluster_name>-entity-operator

다음 Entity Operator 리소스에 지정된 이름입니다.

  • 주제 및 사용자 Operator를 사용한 배포.
  • Entity Operator에서 사용하는 서비스 계정입니다.
  • Entity Operator 지표에 대한 액세스를 관리하는 네트워크 정책입니다.
<kafka_cluster_name>-entity-operator-<random_string>
Entity Operator 배포에 의해 생성된 Pod입니다.
<kafka_cluster_name>-entity-topic-operator-config
Topic Operators에 대한 보조 구성이 포함된 ConfigMap입니다.
<kafka_cluster_name>-entity-user-operator-config
사용자 Operator에 대한 보조 구성이 포함된 ConfigMap입니다.
<kafka_cluster_name>-entity-topic-operator-certs
Kafka 및 Zoo Cryostat와의 통신을 위한 주제 Operator 키와의 비밀.
<kafka_cluster_name>-entity-user-operator-certs
Kafka 및 Zoo Cryostat와의 통신을 위한 사용자 Operator 키와의 시크릿.
strimzi-<kafka_cluster_name>-entity-topic-operator
Entity Topic Operator에서 사용하는 역할 바인딩입니다.
strimzi-<kafka_cluster_name>-entity-user-operator
Entity User Operator에서 사용하는 역할 바인딩입니다.

Kafka Exporter

이러한 리소스는 Kafka Exporter가 Cluster Operator를 사용하여 배포된 경우에만 생성됩니다.

<kafka_cluster_name>-kafka-exporter

다음 Kafka Exporter 리소스에 지정된 이름입니다.

  • Kafka Exporter를 사용한 배포.
  • 소비자 지연 메트릭을 수집하는 데 사용되는 서비스입니다.
  • Kafka Exporter에서 사용하는 서비스 계정입니다.
  • Kafka 내보내기 메트릭에 대한 액세스를 관리하는 네트워크 정책입니다.
<kafka_cluster_name>-kafka-exporter-<random_string>
Kafka Exporter 배포에서 생성된 Pod입니다.

크루즈 제어

이러한 리소스는 Cruise Control이 Cluster Operator를 사용하여 배포된 경우에만 생성됩니다.

<kafka_cluster_name>-cruise-control

다음 Cruise Control 리소스에 지정된 이름입니다.

  • Cruise Control을 사용한 배포.
  • Cruise Control과 통신하는 데 사용되는 서비스입니다.
  • Cruise Control에서 사용하는 서비스 계정입니다.
<kafka_cluster_name>-cruise-control-<random_string>
Cruise Control 배포에서 생성된 포드입니다.
<kafka_cluster_name>-cruise-control-config
Cruise Control 익명 구성이 포함되어 있고 Cruise Control Pod에 의해 볼륨으로 마운트되는 ConfigMap입니다.
<kafka_cluster_name>-cruise-control-certs
Kafka 및 Zoo Cryostat와의 통신을 위한 Cruise Control 키와의 비밀.
<kafka_cluster_name>-network-policy-cruise-control
Cruise Control 서비스에 대한 액세스를 관리하는 네트워크 정책입니다.

6.4. Kafka Connect 배포

Kafka Connect 는 커넥터 플러그인을 사용하여 Kafka 브로커와 기타 시스템 간에 데이터를 스트리밍하기 위한 통합 툴킷입니다. Kafka Connect는 커넥터를 사용하여 데이터를 가져오거나 내보낼 수 있도록 데이터베이스 또는 메시징 시스템과 같은 외부 데이터 소스 또는 대상을 통합하기 위한 프레임워크를 제공합니다. Connectors는 필요한 연결 구성을 제공하는 플러그인입니다.

Apache Kafka용 Streams에서 Kafka Connect는 분산 모드로 배포됩니다. Kafka Connect는 독립형 모드에서도 작동할 수 있지만 Apache Kafka용 Streams에서는 지원되지 않습니다.

Kafka Connect는 커넥터 의 개념을 사용하여 대량의 데이터를 Kafka 클러스터로 전환하면서 확장성 및 안정성을 유지하기 위한 프레임워크를 제공합니다.

Cluster Operator는 KafkaConnector 리소스를 사용하여 생성된 KafkaConnect 리소스 및 커넥터를 사용하여 배포된 Kafka Connect 클러스터를 관리합니다.

Kafka Connect를 사용하려면 다음을 수행해야 합니다.

참고

커넥터 라는 용어는 Kafka Connect 클러스터 또는 커넥터 클래스 내에서 실행되는 커넥터 인스턴스를 의미하기 위해 서로 바꿔 사용할 수 있습니다. 이 가이드에서는 커넥터 라는 용어가 컨텍스트에서 의미가 명확할 때 사용됩니다.

6.4.1. OpenShift 클러스터에 Kafka Connect 배포

다음 절차에서는 Cluster Operator를 사용하여 Kafka Connect 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.

Kafka Connect 클러스터 배포는 커넥터의 워크로드를 작업으로 분배하여 메시지 흐름을 높은 확장 가능하고 안정적으로 배포하는 구성 가능한 수( 작업자라고도 함)로 구현됩니다.

배포에서는 YAML 파일을 사용하여 KafkaConnect 리소스를 생성하는 사양을 제공합니다.

Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.

  • examples/connect/kafka-connect.yaml
중요

병렬로 실행되도록 Kafka Connect 클러스터를 배포하는 경우 각 인스턴스에서 내부 Kafka Connect 항목에 고유한 이름을 사용해야 합니다. 이렇게 하려면 기본값을 대체하도록 각 Kafka Connect 인스턴스를 구성합니다.

프로세스

  1. OpenShift 클러스터에 Kafka Connect를 배포합니다. examples/connect/kafka-connect.yaml 파일을 사용하여 Kafka Connect를 배포합니다.

    oc apply -f examples/connect/kafka-connect.yaml
  2. 배포 상태를 확인합니다.

    oc get pods -n <my_cluster_operator_namespace>

    출력에 배포 이름 및 준비 상태 표시

    NAME                                 READY  STATUS   RESTARTS
    my-connect-cluster-connect-<pod_id>  1/1    Running  0

    my-connect-cluster 는 Kafka Connect 클러스터의 이름입니다.

    Pod ID는 생성된 각 pod를 식별합니다.

    기본 배포를 사용하면 단일 Kafka Connect Pod를 생성합니다.

    READY 는 ready/expected 복제본 수를 표시합니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.4.2. Kafka Connect 클러스터 리소스 목록

다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.

<connect_cluster_name>-connect

다음 Kafka Connect 리소스에 지정된 이름입니다.

  • Kafka Connect 작업자 노드 Pod를 생성하는 StrimziPodSet.
  • Kafka Connect Pod에 안정적인 DNS 이름을 제공하는 헤드리스 서비스입니다.
  • Kafka Connect Pod에서 사용하는 서비스 계정입니다.
  • Kafka Connect 작업자 노드에 대해 구성된 Pod 중단 예산입니다.
  • Kafka Connect REST API에 대한 액세스를 관리하는 네트워크 정책입니다.
<connect_cluster_name>-connect-<pod_id>
Kafka Connect StrimziPodSet에서 생성된 Pod
<connect_cluster_name>-connect-api
Kafka Connect 클러스터 관리를 위한 REST 인터페이스를 노출하는 서비스입니다.
<connect_cluster_name>-connect-config
Kafka Connect ancillary 구성이 포함된 ConfigMap은 Kafka Connect Pod를 통해 볼륨으로 마운트됩니다.
strimzi-<namespace-name>-<connect_cluster_name>-connect-init
Kafka Connect 클러스터에서 사용하는 클러스터 역할 바인딩입니다.
<connect_cluster_name>-connect-build
추가 커넥터 플러그인으로 새 컨테이너 이미지를 빌드하는 데 사용되는 Pod는 Kafka Connect Build 기능을 사용하는 경우에만 사용됩니다.
<connect_cluster_name>-connect-dockerfile
추가 커넥터 플러그인을 사용하여 새 컨테이너 이미지를 빌드하기 위해 Dockerfile이 생성된 ConfigMap( Kafka Connect 빌드 기능이 사용되는 경우에만).

6.5. Kafka Connect 커넥터 추가

Kafka Connect는 커넥터를 사용하여 데이터를 스트리밍하기 위해 다른 시스템과 통합합니다. 커넥터는 Kafka Connector 클래스의 인스턴스이며 다음 유형 중 하나일 수 있습니다.

소스 커넥터
소스 커넥터는 외부 시스템에서 데이터를 가져와서 Kafka에 메시지로 제공하는 런타임 엔티티입니다.
싱크 커넥터
싱크 커넥터는 Kafka 주제에서 메시지를 가져와서 외부 시스템에 제공하는 런타임 엔티티입니다.

Kafka Connect는 플러그인 아키텍처를 사용하여 커넥터에 구현 아티팩트를 제공합니다. 플러그인을 사용하면 다른 시스템에 대한 연결을 허용하고 데이터를 조작하기 위한 추가 구성을 제공합니다. 플러그인에는 커넥터 및 데이터 변환기 및 변환과 같은 기타 구성 요소가 포함됩니다. 커넥터는 특정 유형의 외부 시스템에서 작동합니다. 각 커넥터는 구성에 사용할 스키마를 정의합니다. Kafka Connect에 구성을 제공하여 Kafka Connect 내에서 커넥터 인스턴스를 생성합니다. 그런 다음 Connector 인스턴스는 시스템 간에 데이터를 이동하기 위한 일련의 작업을 정의합니다.

다음 방법 중 하나로 Kafka Connect에 커넥터 플러그인을 추가합니다.

컨테이너 이미지에 플러그인을 추가한 후 다음과 같은 방법으로 커넥터 인스턴스를 시작, 중지 및 관리할 수 있습니다.

이러한 옵션을 사용하여 새 커넥터 인스턴스를 생성할 수도 있습니다.

6.5.1. 커넥터 플러그인을 사용하여 새 컨테이너 이미지 빌드

Apache Kafka용 Streams가 추가 커넥터를 사용하여 새 컨테이너 이미지를 자동으로 빌드하도록 Kafka Connect를 구성합니다. KafkaConnect 사용자 정의 리소스의 .spec.build.plugins 속성을 사용하여 커넥터 플러그인을 정의합니다. Apache Kafka의 스트림은 커넥터 플러그인을 자동으로 다운로드하고 새 컨테이너 이미지에 추가합니다. 컨테이너는 .spec.build.output 에 지정된 컨테이너 리포지토리로 푸시되고 Kafka Connect 배포에서 자동으로 사용됩니다.

사전 요구 사항

이미지를 푸시, 저장 및 가져올 수 있는 자체 컨테이너 레지스트리를 제공해야 합니다. Apache Kafka의 스트림은 Quay 또는 Docker Hub 와 같은 공개 레지스트리뿐만 아니라 개인 컨테이너 레지스트리를 지원합니다.

프로세스

  1. .spec.build.output 에 컨테이너 레지스트리를 지정하고 .spec.build.plugins: 추가 커넥터를 지정하여 KafkaConnect 사용자 지정 리소스를 구성합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect-cluster
    spec: 
    1
    
      #...
      build:
        output: 
    2
    
          type: docker
          image: my-registry.io/my-org/my-connect-cluster:latest
          pushSecret: my-registry-credentials
        plugins: 
    3
    
          - name: connector-1
            artifacts:
              - type: tgz
                url: <url_to_download_connector_1_artifact>
                sha512sum: <SHA-512_checksum_of_connector_1_artifact>
          - name: connector-2
            artifacts:
              - type: jar
                url: <url_to_download_connector_2_artifact>
                sha512sum: <SHA-512_checksum_of_connector_2_artifact>
      #...
    1
    2
    (필수) 새 이미지를 내보내는 컨테이너 레지스트리의 구성입니다.
    3
    (필수) 새 컨테이너 이미지에 추가할 커넥터 플러그인 및 해당 아티팩트 목록입니다. 각 플러그인은 하나 이상의 아티팩트 로 구성해야 합니다.
  2. 리소스를 생성하거나 업데이트합니다.

    $ oc apply -f <kafka_connect_configuration_file>
  3. 새 컨테이너 이미지가 빌드되고 Kafka Connect 클러스터가 배포될 때까지 기다립니다.
  4. 추가한 커넥터 플러그인을 사용하려면 Kafka Connect REST API 또는 KafkaConnector 사용자 정의 리소스를 사용합니다.

Kafka Connect 기본 이미지의 커넥터 플러그인을 사용하여 사용자 지정 Docker 이미지를 생성합니다. 사용자 지정 이미지를 /opt/kafka/plugins 디렉터리에 추가합니다.

Red Hat Ecosystem Catalog 에서 Kafka 컨테이너 이미지를 추가 커넥터 플러그인으로 자체 사용자 정의 이미지를 생성하기 위한 기본 이미지로 사용할 수 있습니다.

시작 시 Kafka Connect의 Kafka Kafka 버전의 Streams는 /opt/kafka/plugins 디렉터리에 포함된 타사 커넥터 플러그인을 로드합니다.

프로세스

  1. registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 을 기본 이미지로 사용하여 새 Dockerfile 을 생성합니다.

    FROM registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
    USER root:root
    COPY ./my-plugins/ /opt/kafka/plugins/
    USER 1001

    플러그인 파일 예

    $ tree ./my-plugins/
    ./my-plugins/
    ├── debezium-connector-mongodb
    │   ├── bson-<version>.jar
    │   ├── CHANGELOG.md
    │   ├── CONTRIBUTE.md
    │   ├── COPYRIGHT.txt
    │   ├── debezium-connector-mongodb-<version>.jar
    │   ├── debezium-core-<version>.jar
    │   ├── LICENSE.txt
    │   ├── mongodb-driver-core-<version>.jar
    │   ├── README.md
    │   └── # ...
    ├── debezium-connector-mysql
    │   ├── CHANGELOG.md
    │   ├── CONTRIBUTE.md
    │   ├── COPYRIGHT.txt
    │   ├── debezium-connector-mysql-<version>.jar
    │   ├── debezium-core-<version>.jar
    │   ├── LICENSE.txt
    │   ├── mysql-binlog-connector-java-<version>.jar
    │   ├── mysql-connector-java-<version>.jar
    │   ├── README.md
    │   └── # ...
    └── debezium-connector-postgres
        ├── CHANGELOG.md
        ├── CONTRIBUTE.md
        ├── COPYRIGHT.txt
        ├── debezium-connector-postgres-<version>.jar
        ├── debezium-core-<version>.jar
        ├── LICENSE.txt
        ├── postgresql-<version>.jar
        ├── protobuf-java-<version>.jar
        ├── README.md
        └── # ...

    COPY 명령은 컨테이너 이미지에 복사할 플러그인 파일을 가리킵니다.

    이 예제에서는 Debezium 커넥터(MongoDB, MySQL 및 PostgreSQL)용 플러그인을 추가하지만 모든 파일이 간결하게 나열되지는 않습니다. Kafka Connect에서 실행되는 Debezium은 다른 Kafka Connect 작업과 동일합니다.

  2. 컨테이너 이미지를 빌드합니다.
  3. 사용자 정의 이미지를 컨테이너 레지스트리로 내보냅니다.
  4. 새 컨테이너 이미지를 가리킵니다.

    다음 방법 중 하나로 이미지를 가리킬 수 있습니다.

    • KafkaConnect 사용자 정의 리소스의 KafkaConnect.spec.image 속성을 편집합니다.

      설정된 경우 이 속성은 Cluster Operator의 STRIMZI_KAFKA_CONNECT_IMAGES 환경 변수를 재정의합니다.

      apiVersion: kafka.strimzi.io/v1beta2
      kind: KafkaConnect
      metadata:
        name: my-connect-cluster
      spec: 
      1
      
        #...
        image: my-new-container-image 
      2
      
        config: 
      3
      
          #...
      1
      2
      Kafka Connect Pod의 Docker 이미지입니다.
      3
      커넥터가 아닌 Kafka Connect 작업자 의 구성입니다.
    • install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml 파일에서 STRIMZI_KAFKA_CONNECT_IMAGES 환경 변수를 편집한 다음 Cluster Operator를 다시 설치합니다.

6.5.3. KafkaConnector 리소스 배포

KafkaConnector 리소스를 배포하여 커넥터를 관리합니다. KafkaConnector 사용자 정의 리소스는 Cluster Operator의 커넥터 관리에 대한 OpenShift 네이티브 접근 방식을 제공합니다. Kafka Connect REST API와 마찬가지로 커넥터를 관리하기 위해 HTTP 요청을 보낼 필요가 없습니다. 해당 KafkaConnector 리소스를 업데이트한 다음 업데이트를 적용하여 실행 중인 커넥터 인스턴스를 관리합니다. Cluster Operator는 실행 중인 커넥터 인스턴스의 구성을 업데이트합니다. 해당 KafkaConnector 를 삭제하여 커넥터를 제거합니다.

KafkaConnector 리소스는 연결된 Kafka Connect 클러스터와 동일한 네임스페이스에 배포해야 합니다.

이 절차에 표시된 구성에서 실패한 커넥터 및 작업을 자동으로 다시 시작하기 위해 autoRestart 기능이 활성화됨(enabled: true)입니다. KafkaConnector 리소스에 주석을 추가하여 커넥터 를 다시 시작하거나 커넥터 작업을 수동으로 다시 시작할 수도 있습니다.

커넥터 예

자체 커넥터를 사용하거나 Apache Kafka용 Streams에서 제공하는 예제를 시도할 수 있습니다. Apache Kafka 3.1.0까지 파일 커넥터 플러그인 예제가 Apache Kafka에 포함되었습니다. Apache Kafka의 3.1.1 및 3.2.0 릴리스부터는 다른 커넥터로 플러그인 경로에 예제를 추가해야 합니다.

Apache Kafka의 스트림은 예제 파일 커넥터 플러그인에 대한 KafkaConnector 구성 파일 (examples/connect/source-connector.yaml)을 제공합니다. 이 파일은 KafkaConnector 리소스로 다음 커넥터 인스턴스를 생성합니다.

  • Kafka 라이센스 파일(소스)에서 각 행을 읽고 데이터를 하나의 Kafka 항목에 메시지로 쓰는 FileStreamSourceConnector 인스턴스입니다.
  • Kafka 주제에서 메시지를 읽고 메시지를 임시 파일( sink)에 쓰는 FileStreamSinkConnector 인스턴스입니다.

이 절차에서는 예제 파일을 사용하여 커넥터를 만듭니다.

참고

예제 커넥터는 프로덕션 환경에서 사용하기 위한 것이 아닙니다.

사전 요구 사항

  • Kafka Connect 배포
  • Cluster Operator가 실행 중입니다

프로세스

  1. 다음 방법 중 하나로 Kafka Connect에 FileStreamSourceConnectorFileStreamSinkConnector 플러그인을 추가합니다.

  2. Kafka Connect 구성에서 strimzi.io/use-connector-resources 주석을 true 로 설정합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect-cluster
      annotations:
        strimzi.io/use-connector-resources: "true"
    spec:
        # ...

    KafkaConnector 리소스가 활성화된 상태에서 Cluster Operator는 이를 감시합니다.

  3. examples/connect/source-connector.yaml 파일을 편집합니다.

    KafkaConnector 소스 커넥터 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnector
    metadata:
      name: my-source-connector  
    1
    
      labels:
        strimzi.io/cluster: my-connect-cluster 
    2
    
    spec:
      class: org.apache.kafka.connect.file.FileStreamSourceConnector 
    3
    
      tasksMax: 2 
    4
    
      autoRestart: 
    5
    
        enabled: true
      config: 
    6
    
        file: "/opt/kafka/LICENSE" 
    7
    
        topic: my-topic 
    8
    
        # ...

    1
    커넥터의 이름으로 사용되는 KafkaConnector 리소스의 이름입니다. OpenShift 리소스에 유효한 모든 이름을 사용합니다.
    2
    커넥터 인스턴스를 생성하는 Kafka Connect 클러스터의 이름입니다. 커넥터는 연결된 Kafka Connect 클러스터와 동일한 네임스페이스에 배포해야 합니다.
    3
    커넥터 클래스의 전체 이름입니다. Kafka Connect 클러스터에서 사용하는 이미지에 있어야 합니다.
    4
    커넥터가 생성할 수 있는 최대 Kafka Connect 작업 수입니다.
    5
    실패한 커넥터 및 작업을 자동으로 다시 시작할 수 있습니다. 기본적으로 재시작 수는 indefinite이지만 maxRestarts 속성을 사용하여 자동 재시작 횟수에 대해 최대값을 설정할 수 있습니다.
    6
    연결을 키 -값 쌍으로 연결합니다.
    7
    외부 데이터 파일의 위치입니다. 이 예제에서는 /opt/kafka/LICENSE 파일에서 읽을 수 있도록 FileStreamSourceConnector 를 구성하고 있습니다.
    8
    소스 데이터를 게시하는 Kafka 주제입니다.
  4. OpenShift 클러스터에서 소스 KafkaConnector 를 생성합니다.

    oc apply -f examples/connect/source-connector.yaml
  5. examples/connect/sink-connector.yaml 파일을 생성합니다.

    touch examples/connect/sink-connector.yaml
  6. 다음 YAML을 sink-connector.yaml 파일에 붙여넣습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnector
    metadata:
      name: my-sink-connector
      labels:
        strimzi.io/cluster: my-connect
    spec:
      class: org.apache.kafka.connect.file.FileStreamSinkConnector 
    1
    
      tasksMax: 2
      config: 
    2
    
        file: "/tmp/my-file" 
    3
    
        topics: my-topic 
    4
    1
    커넥터 클래스의 전체 이름 또는 별칭입니다. Kafka Connect 클러스터에서 사용하는 이미지에 있어야 합니다.
    2
    연결을 키 -값 쌍으로 연결합니다.
    3
    소스 데이터를 게시하는 임시 파일입니다.
    4
    Kafka 주제에서 소스 데이터를 읽습니다.
  7. OpenShift 클러스터에서 싱크 KafkaConnector 를 생성합니다.

    oc apply -f examples/connect/sink-connector.yaml
  8. 커넥터 리소스가 생성되었는지 확인합니다.

    oc get kctr --selector strimzi.io/cluster=<my_connect_cluster> -o name
    
    my-source-connector
    my-sink-connector

    <my_connect_cluster>를 Kafka Connect 클러스터 이름으로 바꿉니다.

  9. 컨테이너에서 kafka-console-consumer.sh 를 실행하여 소스 커넥터가 해당 항목에 기록된 메시지를 읽습니다.

    oc exec <my_kafka_cluster>-kafka-0 -i -t -- bin/kafka-console-consumer.sh --bootstrap-server <my_kafka_cluster>-kafka-bootstrap.NAMESPACE.svc:9092 --topic my-topic --from-beginning

    <my_kafka_cluster>를 Kafka 클러스터 이름으로 바꿉니다.

소스 및 싱크 커넥터 구성 옵션

커넥터 구성은 KafkaConnector 리소스의 spec.config 속성에 정의됩니다.

FileStreamSourceConnectorFileStreamSinkConnector 클래스는 Kafka Connect REST API와 동일한 구성 옵션을 지원합니다. 기타 커넥터는 다양한 구성 옵션을 지원합니다.

Expand
표 6.1. FileStreamSource 커넥터 클래스에 대한 구성 옵션
이름유형기본값설명

file

문자열

null

메시지를 작성할 소스 파일입니다. 지정하지 않으면 표준 입력이 사용됩니다.

topic

list

null

데이터를 게시하는 Kafka 주제입니다.

Expand
표 6.2. FileStreamSinkConnector 클래스에 대한 구성 옵션
이름유형기본값설명

file

문자열

null

메시지를 쓸 대상 파일입니다. 지정하지 않으면 표준 출력이 사용됩니다.

주제

list

null

데이터를 읽을 하나 이상의 Kafka 주제입니다.

topics.regex

문자열

null

데이터를 읽을 하나 이상의 Kafka 주제와 일치하는 정규식입니다.

6.5.4. Kafka Connect API 노출

Kafka Connect REST API를 KafkaConnector 리소스를 사용하여 커넥터를 관리하는 대신 사용합니다. Kafka Connect REST API는 < connect_cluster_name> -connect-api:8083 에서 실행되는 서비스로 사용할 수 있습니다. 여기서 < connect_cluster_name >은 Kafka Connect 클러스터의 이름입니다. 이 서비스는 Kafka Connect 인스턴스를 생성할 때 생성됩니다.

Kafka Connect REST API에서 지원하는 작업은 Apache Kafka Connect API 설명서에 설명되어 있습니다.

참고

strimzi.io/use-connector-resources 주석은 KafkaConnectors를 활성화합니다. KafkaConnect 리소스 구성에 주석을 적용한 경우 Kafka Connect API를 사용하도록 제거해야 합니다. 그러지 않으면 Kafka Connect REST API를 사용하여 직접 변경한 수동 변경 사항은 Cluster Operator에서 되돌립니다.

커넥터 구성을 JSON 오브젝트로 추가할 수 있습니다.

커넥터 구성을 추가하기 위한 curl 요청 예

curl -X POST \
  http://my-connect-cluster-connect-api:8083/connectors \
  -H 'Content-Type: application/json' \
  -d '{ "name": "my-source-connector",
    "config":
    {
      "connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector",
      "file": "/opt/kafka/LICENSE",
      "topic":"my-topic",
      "tasksMax": "4",
      "type": "source"
    }
}'

API는 OpenShift 클러스터 내에서만 액세스할 수 있습니다. OpenShift 클러스터 외부에서 실행되는 애플리케이션에 Kafka Connect API를 액세스하려면 다음 기능 중 하나를 생성하여 수동으로 노출할 수 있습니다.

  • LoadBalancer 또는 NodePort 유형 서비스
  • Ingress 리소스(Kubernetes만 해당)
  • OpenShift 경로(OpenShift만 해당)
참고

연결이 안전하지 않으므로 외부 액세스를 권장합니다.

서비스를 생성하려면 < connect_cluster_name> -connect-api 서비스의 선택기 에서 레이블을 사용하여 서비스가 트래픽을 라우팅할 Pod를 구성합니다.

서비스의 선택기 구성

# ...
selector:
  strimzi.io/cluster: my-connect-cluster 
1

  strimzi.io/kind: KafkaConnect
  strimzi.io/name: my-connect-cluster-connect 
2

#...

1
OpenShift 클러스터의 Kafka Connect 사용자 지정 리소스의 이름입니다.
2
Cluster Operator가 생성한 Kafka Connect 배포의 이름입니다.

외부 클라이언트의 HTTP 요청을 허용하는 NetworkPolicy 도 생성해야 합니다.

Kafka Connect API에 대한 요청을 허용하는 NetworkPolicy의 예

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-custom-connect-network-policy
spec:
  ingress:
  - from:
    - podSelector: 
1

        matchLabels:
          app: my-connector-manager
    ports:
    - port: 8083
      protocol: TCP
  podSelector:
    matchLabels:
      strimzi.io/cluster: my-connect-cluster
      strimzi.io/kind: KafkaConnect
      strimzi.io/name: my-connect-cluster-connect
  policyTypes:
  - Ingress

1
API에 연결할 수 있는 Pod의 레이블입니다.

클러스터 외부에 커넥터 구성을 추가하려면 curl 명령에 API를 노출하는 리소스의 URL을 사용합니다.

6.5.5. Kafka Connect API에 대한 액세스 제한

무단 조치 및 잠재적인 보안 문제를 방지하기 위해 Kafka Connect API에 대한 액세스를 신뢰할 수 있는 사용자에게만 제한하는 것이 중요합니다. Kafka Connect API는 커넥터 구성을 변경하기 위한 광범위한 기능을 제공하므로 보안 예방 조치를 취하는 것이 더 중요합니다. Kafka Connect API에 대한 액세스 권한이 있는 사용자는 관리자가 안전한 것으로 가정할 수 있는 중요한 정보를 얻을 수 있습니다.

Kafka Connect REST API는 OpenShift 클러스터에 대한 액세스 권한이 있고 호스트 이름/IP 주소 및 포트 번호를 포함하는 엔드포인트 URL을 알고 있는 모든 사용자가 액세스할 수 있습니다.

예를 들어 조직이 Kafka Connect 클러스터 및 커넥터를 사용하여 고객 데이터베이스에서 중앙 데이터베이스로 중요한 데이터를 스트리밍한다고 가정합니다. 관리자는 구성 공급자 플러그인을 사용하여 고객 데이터베이스 및 데이터베이스 연결 세부 정보 및 인증 자격 증명과 같은 중앙 데이터베이스를 연결하는 것과 관련된 중요한 정보를 저장합니다. 구성 공급자는 이러한 민감한 정보가 권한이 없는 사용자에게 노출되지 않도록 보호합니다. 그러나 Kafka Connect API에 액세스할 수 있는 사용자는 관리자의 동의 없이 고객 데이터베이스에 대한 액세스 권한을 계속 받을 수 있습니다. 페이크 데이터베이스를 설정하고 연결하도록 커넥터를 구성하여 이 작업을 수행할 수 있습니다. 그런 다음 고객 데이터베이스를 가리키도록 커넥터 구성을 수정하지만 데이터를 중앙 데이터베이스로 전송하는 대신 페이크 데이터베이스로 보냅니다. 페이크 데이터베이스에 연결하도록 커넥터를 구성하면 구성 공급자에 안전하게 저장되더라도 고객 데이터베이스에 연결하기 위한 로그인 세부 정보와 인증 정보가 가로채어집니다.

KafkaConnector 사용자 지정 리소스를 사용하는 경우 기본적으로 OpenShift RBAC 규칙에 따라 OpenShift 클러스터 관리자만 커넥터를 변경할 수 있습니다. 비 클러스터 관리자를 지정하여 Apache Kafka 리소스의 Streams를 관리할 수도 있습니다. Kafka Connect 구성에서 KafkaConnector 리소스를 활성화하면 Cluster Operator에서 Kafka Connect REST API를 사용하여 직접 변경한 내용을 되돌립니다. KafkaConnector 리소스를 사용하지 않는 경우 기본 RBAC 규칙에서 Kafka Connect API에 대한 액세스를 제한하지 않습니다. OpenShift RBAC를 사용하여 Kafka Connect REST API에 대한 직접 액세스를 제한하려면 KafkaConnector 리소스를 활성화하고 사용해야 합니다.

보안을 강화하려면 Kafka Connect API에 대해 다음 속성을 구성하는 것이 좋습니다.

org.apache.kafka.disallowed.login.modules

(Kafka 3.4 이상) 비보안 로그인 모듈을 사용하지 않도록 org.apache.kafka.disallowed.login.modules Java 시스템 속성을 설정합니다. 예를 들어 com.sun.security.auth.module.JndiLoginModule 을 지정하면 Kafka JndiLoginModule 을 사용할 수 없습니다.

로그인 모듈 비활성화를 위한 설정 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  # ...
  jvmOptions:
    javaSystemProperties:
      - name: org.apache.kafka.disallowed.login.modules
        value: com.sun.security.auth.module.JndiLoginModule, org.apache.kafka.common.security.kerberos.KerberosLoginModule
# ...

신뢰할 수 있는 로그인 모듈만 허용하고 사용 중인 버전에 대해 Kafka의 최신 조언을 따르십시오. 가장 좋은 방법은 org.apache.kafka.disallowed.login.modules 시스템 속성을 사용하여 Kafka Connect 구성에서 비보안 로그인 모듈을 명시적으로 허용하지 않아야 합니다.

connector.client.config.override.policy

커넥터 구성이 Kafka Connect 구성과 사용하는 소비자 및 생산자를 덮어쓰지 않도록 connector.client.config.override.policy 속성을 None 으로 설정합니다.

커넥터 덮어쓰기 정책을 지정하는 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  # ...
  config:
    connector.client.config.override.policy: None
# ...

Kafka Connect API를 사용하여 KafkaConnector 사용자 정의 리소스를 사용하여 커넥터를 관리할 수 있습니다. 전환하려면 표시된 순서대로 다음을 수행합니다.

  1. 구성과 함께 KafkaConnector 리소스를 배포하여 커넥터 인스턴스를 생성합니다.
  2. strimzi.io/use-connector-resources 주석을 true 로 설정하여 Kafka Connect 구성에서 KafkaConnector 리소스를 활성화합니다.
주의

KafkaConnector 리소스를 생성하기 전에 활성화하면 모든 커넥터를 삭제합니다.

KafkaConnector 리소스를 사용하여 Kafka Connect API를 사용하여 전환하려면 먼저 Kafka Connect 구성에서 KafkaConnector 리소스를 활성화하는 주석을 제거합니다. 그러지 않으면 Kafka Connect REST API를 사용하여 직접 변경한 수동 변경 사항은 Cluster Operator에서 되돌립니다.

전환을 수행할 때 KafkaConnect 리소스의 상태를 확인합니다. metadata.generation (현재 배포 버전)의 값은 status.observedGeneration (리소스의 최신 조정)과 일치해야 합니다. Kafka Connect 클러스터가 준비 되면 KafkaConnector 리소스를 삭제할 수 있습니다.

6.6. Kafka MirrorMaker 배포

Kafka MirrorMaker는 데이터 센터 내의 두 개 이상의 Kafka 클러스터 간에 데이터를 복제합니다. 이 프로세스를 Kafka 파티션 복제 개념과 혼동하지 않도록 미러링이라고 합니다. MirrorMaker는 소스 클러스터의 메시지를 사용하고 해당 메시지를 대상 클러스터에 다시 게시합니다.

클러스터 간에 데이터 복제는 다음이 필요한 시나리오를 지원합니다.

  • 시스템 장애 발생 시 데이터 복구
  • 중앙 집중식 분석을 위해 여러 소스 클러스터에서 데이터 통합
  • 특정 클러스터에 대한 데이터 액세스 제한
  • 대기 시간을 개선하기 위해 특정 위치에서 데이터 제공

6.6.1. OpenShift 클러스터에 Kafka MirrorMaker 배포

다음 절차에서는 Cluster Operator를 사용하여 Kafka MirrorMaker 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.

배포에서는 YAML 파일을 사용하여 배포된 MirrorMaker 버전에 따라 KafkaMirrorMaker 또는 KafkaMirrorMaker2 리소스를 생성하는 사양을 제공합니다. MirrorMaker 2는 Kafka Connect를 기반으로 하며 구성 속성을 사용합니다.

중요

Kafka MirrorMaker 1 (문서에서 MirrorMaker 라고도 함)은 Apache Kafka 3.0.0에서 더 이상 사용되지 않으며 Apache Kafka 4.0.0에서 제거됩니다. 결과적으로 Kafka MirrorMaker 1을 배포하는 데 사용되는 KafkaMirrorMaker 사용자 정의 리소스는 Apache Kafka용 Streams에서도 더 이상 사용되지 않습니다. KafkaMirrorMaker 리소스는 Apache Kafka 4.0.0을 채택할 때 Apache Kafka용 Streams에서 제거됩니다. 대신 KafkaMirrorMaker2 사용자 정의 리소스를 IdentityReplicationPolicy 와 함께 사용합니다.

Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.

  • examples/mirror-maker/kafka-mirror-maker.yaml
  • examples/mirror-maker/kafka-mirror-maker-2.yaml
중요

동일한 대상 Kafka 클러스터를 사용하여 병렬로 실행되도록 MirrorMaker 2 클러스터를 배포하는 경우 각 인스턴스에서 내부 Kafka Connect 항목에 고유한 이름을 사용해야 합니다. 이렇게 하려면 기본값을 대체하도록 각 MirrorMaker 2 인스턴스를 구성합니다.

프로세스

  1. Kafka MirrorMaker를 OpenShift 클러스터에 배포합니다.

    MirrorMaker의 경우:

    oc apply -f examples/mirror-maker/kafka-mirror-maker.yaml

    MirrorMaker 2:

    oc apply -f examples/mirror-maker/kafka-mirror-maker-2.yaml
  2. 배포 상태를 확인합니다.

    oc get pods -n <my_cluster_operator_namespace>

    출력에 배포 이름 및 준비 상태 표시

    NAME                                    READY  STATUS   RESTARTS
    my-mirror-maker-mirror-maker-<pod_id>   1/1    Running  1
    my-mm2-cluster-mirrormaker2-<pod_id>    1/1    Running  1

    my-mirror-maker 는 Kafka MirrorMaker 클러스터의 이름입니다. my-mm2-cluster 는 Kafka MirrorMaker 2 클러스터의 이름입니다.

    Pod ID는 생성된 각 pod를 식별합니다.

    기본 배포를 사용하면 단일 MirrorMaker 또는 MirrorMaker 2 Pod를 설치합니다.

    READY 는 ready/expected 복제본 수를 표시합니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.6.2. Kafka MirrorMaker 2 클러스터 리소스 목록

다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.

<mirrormaker2_cluster_name>-mirrormaker2

다음 MirrorMaker 2 리소스에 지정된 이름입니다.

  • MirrorMaker 2 작업자 노드 Pod를 생성하는 StrimziPodSet.
  • MirrorMaker 2 Pod에 안정적인 DNS 이름을 제공하는 헤드리스 서비스입니다.
  • MirrorMaker 2 Pod에서 사용하는 서비스 계정입니다.
  • MirrorMaker 2 작업자 노드에 대해 구성된 Pod 중단 예산입니다.
  • MirrorMaker 2 REST API에 대한 액세스를 관리하는 네트워크 정책입니다.
<mirrormaker2_cluster_name>-mirrormaker2-<pod_id>
MirrorMaker 2 StrimziPodSet에서 생성된 Pod
<mirrormaker2_cluster_name>-mirrormaker2-api
MirrorMaker 2 클러스터를 관리하기 위해 REST 인터페이스를 노출하는 서비스입니다.
<mirrormaker2_cluster_name>-mirrormaker2-config
MirrorMaker 2 보조 구성이 포함되어 있으며 MirrorMaker 2 Pod에서 볼륨으로 마운트되는 ConfigMap입니다.
strimzi-<namespace-name>-<mirrormaker2_cluster_name>-mirrormaker2-init
MirrorMaker 2 클러스터에서 사용하는 클러스터 역할 바인딩입니다.

6.6.3. Kafka MirrorMaker 클러스터 리소스 목록

다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.

<mirrormaker_cluster_name>-mirror-maker

다음 MirrorMaker 리소스에 지정된 이름입니다.

  • MirrorMaker Pod 생성을 담당하는 배포입니다.
  • MirrorMaker 노드에서 사용하는 서비스 계정입니다.
  • MirrorMaker 작업자 노드에 대해 구성된 Pod 중단 예산입니다.
<mirrormaker_cluster_name>-mirror-maker-config
MirrorMaker의 보조 구성이 포함된 ConfigMap은 MirrorMaker Pod에서 볼륨으로 마운트됩니다.

6.7. Kafka 브리지 배포

Kafka 브리지는 HTTP 기반 클라이언트를 Kafka 클러스터와 통합하는 API를 제공합니다.

6.7.1. OpenShift 클러스터에 Kafka 브리지 배포

다음 절차에서는 Cluster Operator를 사용하여 Kafka Bridge 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.

배포에서는 YAML 파일을 사용하여 KafkaBridge 리소스를 생성하는 사양을 제공합니다.

Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.

  • examples/bridge/kafka-bridge.yaml

프로세스

  1. OpenShift 클러스터에 Kafka 브리지를 배포합니다.

    oc apply -f examples/bridge/kafka-bridge.yaml
  2. 배포 상태를 확인합니다.

    oc get pods -n <my_cluster_operator_namespace>

    출력에 배포 이름 및 준비 상태 표시

    NAME                       READY  STATUS   RESTARTS
    my-bridge-bridge-<pod_id>  1/1    Running  0

    my-bridge 는 Kafka Bridge 클러스터의 이름입니다.

    Pod ID는 생성된 각 pod를 식별합니다.

    기본 배포를 사용하면 단일 Kafka Bridge Pod를 설치합니다.

    READY 는 ready/expected 복제본 수를 표시합니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.7.2. 로컬 머신에 Kafka 브리지 서비스 노출

포트 전달을 사용하여 Apache Kafka Bridge 서비스의 스트림을 http://localhost:8080 의 로컬 머신에 노출합니다.

참고

포트 전달은 개발 및 테스트 목적으로만 적합합니다.

프로세스

  1. OpenShift 클러스터에 있는 포드 이름을 나열합니다.

    oc get pods -o name
    
    pod/kafka-consumer
    # ...
    pod/my-bridge-bridge-<pod_id>
  2. 포트 8080 의 Kafka 브리지 Pod에 연결합니다.

    oc port-forward pod/my-bridge-bridge-<pod_id> 8080:8080 &
    참고

    로컬 시스템의 포트 8080이 이미 사용 중인 경우 8008 과 같은 대체 HTTP 포트를 사용합니다.

이제 API 요청이 로컬 머신의 포트 8080에서 Kafka Bridge Pod의 포트 8080으로 전달됩니다.

6.7.3. OpenShift 외부에서 Kafka 브리지 액세스

배포 후 동일한 OpenShift 클러스터에서 실행되는 애플리케이션에서만 Apache Kafka 브리지의 Streams에 액세스할 수 있습니다. 이러한 애플리케이션은 < kafka_bridge_name> -bridge-service 서비스를 사용하여 API에 액세스합니다.

OpenShift 클러스터 외부에서 실행 중인 애플리케이션에 Kafka 브리지를 액세스하려면 다음 기능 중 하나를 생성하여 수동으로 노출할 수 있습니다.

  • LoadBalancer 또는 NodePort 유형 서비스
  • Ingress 리소스(Kubernetes만 해당)
  • OpenShift 경로(OpenShift만 해당)

서비스를 생성하려면 < kafka_bridge_name> -bridge-service 서비스선택기 에서 레이블을 사용하여 서비스에서 트래픽을 라우팅할 Pod를 구성합니다.

  # ...
  selector:
    strimzi.io/cluster: kafka-bridge-name 
1

    strimzi.io/kind: KafkaBridge
  #...
1
OpenShift 클러스터의 Kafka Bridge 사용자 정의 리소스의 이름입니다.

6.7.4. Kafka Bridge 클러스터 리소스 목록

다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.

<bridge_cluster_name>-bridge
Kafka Bridge 작업자 노드 Pod를 생성합니다.
<bridge_cluster_name>-bridge-service
Kafka Bridge 클러스터의 REST 인터페이스를 노출하는 서비스입니다.
<bridge_cluster_name>-bridge-config
Kafka Bridge ancillary 구성이 포함되어 Kafka 브로커 Pod를 통해 볼륨으로 마운트되는 ConfigMap입니다.
<bridge_cluster_name>-bridge
Kafka Bridge 작업자 노드에 대해 구성된 Pod 중단 예산입니다.

6.8. Apache Kafka Operator용 Streams에 대한 대체 독립 실행형 배포 옵션

Topic Operator 및 User Operator의 독립 실행형 배포를 수행할 수 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터를 사용하는 경우 이러한 Operator의 독립 실행형 배포를 고려하십시오.

Operator를 OpenShift에 배포합니다. Kafka는 OpenShift 외부에서 실행할 수 있습니다. 예를 들어 Kafka를 관리 서비스로 사용할 수 있습니다. 독립 실행형 Operator의 배포 구성을 Kafka 클러스터의 주소와 일치하도록 조정합니다.

6.8.1. 독립 실행형 Topic Operator 배포

다음 절차에서는 주제 관리를 위한 독립 실행형 구성 요소로 topic Operator를 unidirectional 모드로 배포하는 방법을 보여줍니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 Topic Operator를 사용할 수 있습니다. Unidirectional 주제 관리에서는 KafkaTopic 리소스를 통해서만 주제를 유지 관리합니다. 리디렉션되지 않은 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 을 참조하십시오. 또한 Topic Operator를 양방향 모드로 배포하기 위한 대체 구성도 표시됩니다.

독립 실행형 배포 파일은 Apache Kafka용 Streams와 함께 제공됩니다. 05-Deployment-strimzi-topic-operator.yaml 배포 파일을 사용하여 Topic Operator를 배포합니다. Kafka 클러스터에 연결하는 데 필요한 환경 변수를 추가하거나 설정합니다.

Topic Operator는 단일 네임스페이스에서 KafkaTopic 리소스를 감시합니다. Topic Operator 구성에서 조사할 네임스페이스 및 Kafka 클러스터에 대한 연결을 지정합니다. 단일 Topic Operator는 단일 네임스페이스를 조사할 수 있습니다. Topic Operator는 하나의 네임스페이스만 조사해야 합니다. 둘 이상의 Topic Operator를 사용하려면 각각 다른 네임스페이스를 조사하도록 구성합니다. 이러한 방식으로 다양한 Kafka 클러스터와 함께 Topic Operator를 사용할 수 있습니다.

사전 요구 사항

  • Topic Operator가 연결할 Kafka 클러스터를 실행하고 있습니다.

    독립 실행형 Topic Operator가 연결에 대해 올바르게 구성된 경우 Kafka 클러스터는 베어 메탈 환경, 가상 머신 또는 관리형 클라우드 애플리케이션 서비스에서 실행할 수 있습니다.

프로세스

  1. install/topic-operator/05-Deployment-strimzi-operator.yaml 독립 실행형 배포 파일에서 env 속성을 편집합니다.

    독립 실행형 Topic Operator 배포 구성 예

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: strimzi-topic-operator
      labels:
        app: strimzi
    spec:
      # ...
      template:
        # ...
        spec:
          # ...
          containers:
            - name: strimzi-topic-operator
              # ...
              env:
                - name: STRIMZI_NAMESPACE 
    1
    
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS 
    2
    
                  value: my-kafka-bootstrap-address:9092
                - name: STRIMZI_RESOURCE_LABELS 
    3
    
                  value: "strimzi.io/cluster=my-cluster"
                - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 
    4
    
                  value: "120000"
                - name: STRIMZI_LOG_LEVEL 
    5
    
                  value: INFO
                - name: STRIMZI_TLS_ENABLED 
    6
    
                  value: "false"
                - name: STRIMZI_JAVA_OPTS 
    7
    
                  value: "-Xmx=512M -Xms=256M"
                - name: STRIMZI_JAVA_SYSTEM_PROPERTIES 
    8
    
                  value: "-Djavax.net.debug=verbose -DpropertyName=value"
                - name: STRIMZI_PUBLIC_CA 
    9
    
                  value: "false"
                - name: STRIMZI_TLS_AUTH_ENABLED 
    10
    
                  value: "false"
                - name: STRIMZI_SASL_ENABLED 
    11
    
                  value: "false"
                - name: STRIMZI_SASL_USERNAME 
    12
    
                  value: "admin"
                - name: STRIMZI_SASL_PASSWORD 
    13
    
                  value: "password"
                - name: STRIMZI_SASL_MECHANISM 
    14
    
                  value: "scram-sha-512"
                - name: STRIMZI_SECURITY_PROTOCOL 
    15
    
                  value: "SSL"
                - name: STRIMZI_USE_FINALIZERS
                  value: "false" 
    16

    1
    Topic Operator에서 KafkaTopic 리소스를 조사하는 OpenShift 네임스페이스입니다. Kafka 클러스터의 네임스페이스를 지정합니다.
    2
    Kafka 클러스터의 모든 브로커를 검색하고 연결할 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 다운된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
    3
    Topic Operator에서 관리하는 KafkaTopic 리소스를 식별하는 레이블입니다. 이는 Kafka 클러스터의 이름일 필요는 없습니다. KafkaTopic 리소스에 할당된 레이블일 수 있습니다. Topic Operator를 두 개 이상 배포하는 경우 레이블은 각각 고유해야 합니다. 즉, 운영자는 동일한 리소스를 관리할 수 없습니다.
    4
    주기적 조정 간격(밀리초)입니다. 기본값은 120000 (2분)입니다.
    5
    로깅 메시지를 출력하는 수준입니다. 수준을 ERROR,WARNING,INFO,DEBUG 또는 TRACE 로 설정할 수 있습니다.
    6
    Kafka 브로커와 암호화된 통신에 대한 TLS 지원을 활성화합니다.
    7
    (선택 사항) Topic Operator를 실행하는 JVM에서 사용하는 Java 옵션입니다.
    8
    (선택 사항) Topic Operator에 설정된 디버깅(-D) 옵션.
    9
    (선택 사항) TLS가 STRIMZI_TLS_ENABLED 를 통해 활성화된 경우 신뢰 저장소 인증서 생성을 건너뜁니다. 이 환경 변수가 활성화된 경우 브로커는 TLS 인증서에 대해 신뢰할 수 있는 공개 인증 기관을 사용해야 합니다. 기본값은 false입니다.
    10
    (선택 사항) mTLS 인증을 위한 키 저장소 인증서를 생성합니다. 이를 false 로 설정하면 mTLS를 사용한 클라이언트 인증이 Kafka 브로커에 대해 비활성화됩니다. 기본값은 true입니다.
    11
    (선택 사항) Kafka 브로커에 연결할 때 클라이언트 인증에 대해 SASL 지원을 활성화합니다. 기본값은 false입니다.
    12
    (선택 사항) 클라이언트 인증에 대한 SASL 사용자 이름입니다. SASL이 STRIMZI_SASL_ENABLED 를 통해 활성화된 경우에만 필수입니다.
    13
    (선택 사항) 클라이언트 인증에 대한 SASL 암호입니다. SASL이 STRIMZI_SASL_ENABLED 를 통해 활성화된 경우에만 필수입니다.
    14
    (선택 사항) 클라이언트 인증을 위한 SASL 메커니즘입니다. SASL이 STRIMZI_SASL_ENABLED 를 통해 활성화된 경우에만 필수입니다. 값을 일반,scram-sha-256 또는 scram-sha-512 로 설정할 수 있습니다.
    15
    (선택 사항) Kafka 브로커와의 통신에 사용되는 보안 프로토콜입니다. 기본값은 "PLAINTEXT"입니다. 값을 PLAINTEXT,SSL,SASL_PLAINTEXT 또는 SASL_SSL 로 설정할 수 있습니다.
    16
    종료자를 사용하여 주제 삭제 를 제어하지 않으려면 STRIMZI_USE_FINALIZERSfalse 로 설정합니다.
  2. 공용 인증 기관의 인증서를 사용하는 Kafka 브로커에 연결하려면 STRIMZI_PUBLIC_CAtrue 로 설정합니다. 예를 들어 Amazon AWS MSK 서비스를 사용하는 경우 이 속성을 true 로 설정합니다.
  3. STRIMZI_TLS_ENABLED 환경 변수를 사용하여 mTLS를 활성화한 경우 Kafka 클러스터에 대한 연결을 인증하는 데 사용되는 키 저장소 및 신뢰 저장소를 지정합니다.

    mTLS 구성의 예

    # ....
    env:
      - name: STRIMZI_TRUSTSTORE_LOCATION 
    1
    
        value: "/path/to/truststore.p12"
      - name: STRIMZI_TRUSTSTORE_PASSWORD 
    2
    
        value: "TRUSTSTORE-PASSWORD"
      - name: STRIMZI_KEYSTORE_LOCATION 
    3
    
        value: "/path/to/keystore.p12"
      - name: STRIMZI_KEYSTORE_PASSWORD 
    4
    
        value: "KEYSTORE-PASSWORD"
    # ...

    1
    신뢰 저장소에는 Kafka 및 Zoo Cryostat 서버 인증서에 서명하는 데 사용되는 인증 기관의 공개 키가 포함되어 있습니다.
    2
    truststore에 액세스하기 위한 암호입니다.
    3
    키 저장소에는 mTLS 인증을 위한 개인 키가 포함되어 있습니다.
    4
    키 저장소에 액세스하기 위한 암호입니다.
  4. 배포 구성에 변경 사항을 적용하여 Topic Operator를 배포합니다.
  5. 배포 상태를 확인합니다.

    oc get deployments

    출력에 배포 이름 및 준비 상태 표시

    NAME                    READY  UP-TO-DATE  AVAILABLE
    strimzi-topic-operator  1/1    1           1

    READY 는 ready/expected 복제본 수를 표시합니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

6.8.1.1. 양방향 주제 관리를 위한 독립 실행형 Topic Operator 배포

양방향 주제 관리에는 클러스터 관리를 위한 Zoo Cryostat가 필요하며 KafkaTopic 리소스와 Kafka 클러스터 내에서 주제를 유지 관리합니다. 이 모드에서 Topic Operator를 사용하여 전환하려면 다음 단계에 따라 독립 실행형 Topic Operator를 배포합니다.

참고

Topic Operator가 단방향 모드로 실행되도록 하는 기능 게이트가 일반 가용성으로 진행되므로 양방향 모드가 단계적으로 표시됩니다. 이 전환은 특히 KRaft 모드에서 Kafka를 지원하는 데 사용되는 사용자 환경을 개선하기 위한 것입니다.

  1. 현재 독립 실행형 Topic Operator 배포를 취소합니다.

    Topic Operator가 다시 배포할 때 선택한 KafkaTopic 리소스를 유지합니다.

  2. 독립 실행형 Topic Operator의 배포 구성을 편집하여 Zoo Cryostat 관련 환경 변수를 포함합니다.

    • STRIMZI_ZOOKEEPER_CONNECT
    • STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS
    • TC_ZK_CONNECTION_TIMEOUT_MS
    • STRIMZI_USE_ZOOKEEPER_TOPIC_STORE

      이는 양방향 주제 Operator가 사용되는지 여부를 정의하는 Zoo Cryostat 변수의 존재 또는 부재입니다. Unidirectional 주제 관리에서는 Zoo Cryostat를 사용하지 않습니다. Zoo Cryostat 환경 변수가 없으면 리디렉션되지 않은 주제 Operator가 사용됩니다. 그렇지 않으면 양방향 주제 Operator가 사용됩니다.

      단방향 모드에서 사용되지 않는 기타 환경 변수는 필요한 경우 추가할 수 있습니다.

    • STRIMZI_REASSIGN_THROTTLE
    • STRIMZI_REASSIGN_VERIFY_INTERVAL_MS
    • STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS
    • STRIMZI_TOPICS_PATH
    • STRIMZI_STORE_TOPIC
    • STRIMZI_STORE_NAME
    • STRIMZI_APPLICATION_ID
    • STRIMZI_STALE_RESULT_TIMEOUT_MS

      양방향 주제 관리를 위한 독립 실행형 Topic Operator 배포 구성의 예

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: strimzi-topic-operator
        labels:
          app: strimzi
      spec:
        # ...
        template:
          # ...
          spec:
            # ...
            containers:
              - name: strimzi-topic-operator
                # ...
                env:
                  - name: STRIMZI_NAMESPACE
                    valueFrom:
                      fieldRef:
                        fieldPath: metadata.namespace
                  - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS
                    value: my-kafka-bootstrap-address:9092
                  - name: STRIMZI_RESOURCE_LABELS
                    value: "strimzi.io/cluster=my-cluster"
                  - name: STRIMZI_ZOOKEEPER_CONNECT 
      1
      
                    value: my-cluster-zookeeper-client:2181
                  - name: STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS 
      2
      
                    value: "18000"
                  - name: STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS 
      3
      
                    value: "6"
                  - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
                    value: "120000"
                  - name: STRIMZI_LOG_LEVEL
                    value: INFO
                  - name: STRIMZI_TLS_ENABLED
                    value: "false"
                  - name: STRIMZI_JAVA_OPTS
                    value: "-Xmx=512M -Xms=256M"
                  - name: STRIMZI_JAVA_SYSTEM_PROPERTIES
                    value: "-Djavax.net.debug=verbose -DpropertyName=value"
                  - name: STRIMZI_PUBLIC_CA
                    value: "false"
                  - name: STRIMZI_TLS_AUTH_ENABLED
                    value: "false"
                  - name: STRIMZI_SASL_ENABLED
                    value: "false"
                  - name: STRIMZI_SASL_USERNAME
                    value: "admin"
                  - name: STRIMZI_SASL_PASSWORD
                    value: "password"
                  - name: STRIMZI_SASL_MECHANISM
                    value: "scram-sha-512"
                  - name: STRIMZI_SECURITY_PROTOCOL
                    value: "SSL"

      1
      (zookeeper) Zoo Cryostat 클러스터에 연결할 주소의 호스트 및 포트 쌍입니다. Kafka 클러스터가 사용 중인 것과 동일한 Zoo Cryostat 클러스터여야 합니다.
      2
      (zookeeper) Zoo Cryostat 세션 시간 제한 시간(밀리초)입니다. 기본값은 18000 (18초)입니다.
      3
      Kafka에서 주제 메타데이터를 가져오는 시도 횟수입니다. 각 시도 사이의 시간은 지수 백오프로 정의됩니다. 파티션 또는 복제본 수로 인해 주제 생성에 더 많은 시간이 걸리는 경우 이 값을 늘리는 것이 좋습니다. 기본값은 6 번 시도입니다.
  3. 배포 구성에 변경 사항을 적용하여 Topic Operator를 배포합니다.

6.8.2. 독립 실행형 User Operator 배포

다음 절차에서는 사용자 관리를 위한 독립 실행형 구성 요소로 User Operator를 배포하는 방법을 보여줍니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 User Operator를 사용할 수 있습니다.

독립 실행형 배포는 모든 Kafka 클러스터에서 작동할 수 있습니다.

독립 실행형 배포 파일은 Apache Kafka용 Streams와 함께 제공됩니다. 05-Deployment-strimzi-user-operator.yaml 배포 파일을 사용하여 User Operator를 배포합니다. Kafka 클러스터에 연결하는 데 필요한 환경 변수를 추가하거나 설정합니다.

User Operator는 단일 네임스페이스에서 KafkaUser 리소스를 감시합니다. User Operator 구성에서 조사할 네임스페이스 및 Kafka 클러스터에 대한 연결을 지정합니다. 단일 User Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임 스페이스는 하나의 User Operator에서만 조사해야 합니다. 두 개 이상의 User Operator를 사용하려면 각각 다른 네임스페이스를 조사하도록 구성합니다. 이렇게 하면 여러 Kafka 클러스터에서 User Operator를 사용할 수 있습니다.

사전 요구 사항

  • User Operator가 연결할 수 있도록 Kafka 클러스터를 실행하고 있습니다.

    독립 실행형 User Operator가 연결에 대해 올바르게 구성된 경우 Kafka 클러스터는 베어 메탈 환경, 가상 머신 또는 관리형 클라우드 애플리케이션 서비스에서 실행할 수 있습니다.

프로세스

  1. install/user-operator/05-Deployment-strimzi-user-operator.yaml 독립 실행형 배포 파일에서 다음 env 속성을 편집합니다.

    독립 실행형 User Operator 배포 구성의 예

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: strimzi-user-operator
      labels:
        app: strimzi
    spec:
      # ...
      template:
        # ...
        spec:
          # ...
          containers:
            - name: strimzi-user-operator
              # ...
              env:
                - name: STRIMZI_NAMESPACE 
    1
    
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
                - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS 
    2
    
                  value: my-kafka-bootstrap-address:9092
                - name: STRIMZI_CA_CERT_NAME 
    3
    
                  value: my-cluster-clients-ca-cert
                - name: STRIMZI_CA_KEY_NAME 
    4
    
                  value: my-cluster-clients-ca
                - name: STRIMZI_LABELS 
    5
    
                  value: "strimzi.io/cluster=my-cluster"
                - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 
    6
    
                  value: "120000"
                - name: STRIMZI_WORK_QUEUE_SIZE 
    7
    
                  value: 10000
                - name: STRIMZI_CONTROLLER_THREAD_POOL_SIZE 
    8
    
                  value: 10
                - name: STRIMZI_USER_OPERATIONS_THREAD_POOL_SIZE 
    9
    
                  value: 4
                - name: STRIMZI_LOG_LEVEL 
    10
    
                  value: INFO
                - name: STRIMZI_GC_LOG_ENABLED 
    11
    
                  value: "true"
                - name: STRIMZI_CA_VALIDITY 
    12
    
                  value: "365"
                - name: STRIMZI_CA_RENEWAL 
    13
    
                  value: "30"
                - name: STRIMZI_JAVA_OPTS 
    14
    
                  value: "-Xmx=512M -Xms=256M"
                - name: STRIMZI_JAVA_SYSTEM_PROPERTIES 
    15
    
                  value: "-Djavax.net.debug=verbose -DpropertyName=value"
                - name: STRIMZI_SECRET_PREFIX 
    16
    
                  value: "kafka-"
                - name: STRIMZI_ACLS_ADMIN_API_SUPPORTED 
    17
    
                  value: "true"
                - name: STRIMZI_MAINTENANCE_TIME_WINDOWS 
    18
    
                  value: '* * 8-10 * * ?;* * 14-15 * * ?'
                - name: STRIMZI_KAFKA_ADMIN_CLIENT_CONFIGURATION 
    19
    
                  value: |
                    default.api.timeout.ms=120000
                    request.timeout.ms=60000

    1
    User Operator가 KafkaUser 리소스를 조사하는 OpenShift 네임스페이스입니다. 하나의 네임스페이스만 지정할 수 있습니다.
    2
    Kafka 클러스터의 모든 브로커를 검색하고 연결할 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 다운된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
    3
    mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA(인증 기관)의 공개 키(ca.crt) 값이 포함된 OpenShift Secret.
    4
    mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA의 개인 키(ca.key) 값이 포함된 OpenShift 보안입니다.
    5
    User Operator에서 관리하는 KafkaUser 리소스를 식별하는 레이블입니다. 이는 Kafka 클러스터의 이름일 필요는 없습니다. KafkaUser 리소스에 할당된 레이블일 수 있습니다. User Operator를 두 개 이상 배포하는 경우 레이블은 각각 고유해야 합니다. 즉, 운영자는 동일한 리소스를 관리할 수 없습니다.
    6
    주기적 조정 간격(밀리초)입니다. 기본값은 120000 (2분)입니다.
    7
    컨트롤러 이벤트 큐의 크기입니다. 큐 크기는 User Operator가 작동할 것으로 예상되는 최대 사용자 수만큼 커야 합니다. 기본값은 1024 입니다.
    8
    사용자를 조정하기 위한 작업자 풀의 크기입니다. 더 큰 풀에는 더 많은 리소스가 필요할 수 있지만 더 많은 KafkaUser 리소스도 처리합니다. 기본값은 50 입니다.
    9
    Kafka Admin API 및 OpenShift 작업의 작업자 풀 크기입니다. 더 큰 풀에는 더 많은 리소스가 필요할 수 있지만 더 많은 KafkaUser 리소스도 처리합니다. 기본값은 4 입니다.
    10
    로깅 메시지를 출력하는 수준입니다. 수준을 ERROR,WARNING,INFO,DEBUG 또는 TRACE 로 설정할 수 있습니다.
    11
    가비지 컬렉션(GC) 로깅을 활성화합니다. 기본값은 true입니다.
    12
    CA의 유효 기간입니다. 기본값은 365 일입니다.
    13
    CA의 갱신 기간입니다. 갱신 기간은 현재 인증서의 만료 날짜로부터 역순으로 측정됩니다. 이전 인증서가 만료되기 전에 인증서 갱신을 시작하는 기본값은 30 일입니다.
    14
    (선택 사항) User Operator를 실행하는 JVM에서 사용하는 Java 옵션
    15
    (선택 사항) User Operator에 설정된 디버깅(-D) 옵션
    16
    (선택 사항) User Operator가 생성한 OpenShift 시크릿 이름에 대한 접두사입니다.
    17
    (선택 사항) Kafka 클러스터가 Kafka 관리자 API를 사용하여 권한 부여 ACL 규칙 관리를 지원하는지 여부를 나타냅니다. false 로 설정하면 User Operator에서 간단한 권한 부여 ACL 규칙이 있는 모든 리소스를 거부합니다. 이렇게 하면 Kafka 클러스터 로그에서 불필요한 예외를 방지할 수 있습니다. 기본값은 true입니다.
    18
    (선택 사항) 사용자 인증서가 갱신되는 유지 관리 시간을 정의하는 세미로 구분된 Cron Expression 목록입니다.
    19
    (선택 사항) User Operator에서 사용하는 Kafka 관리 클라이언트를 속성 형식으로 구성하는 구성 옵션입니다.
  2. mTLS를 사용하여 Kafka 클러스터에 연결하는 경우 연결을 인증하는 데 사용되는 보안을 지정합니다. 그렇지 않으면 다음 단계로 이동합니다.

    mTLS 구성의 예

    # ....
    env:
      - name: STRIMZI_CLUSTER_CA_CERT_SECRET_NAME 
    1
    
        value: my-cluster-cluster-ca-cert
      - name: STRIMZI_EO_KEY_SECRET_NAME 
    2
    
        value: my-cluster-entity-operator-certs
    # ..."

    1
    Kafka 브로커 인증서에 서명하는 CA의 공개 키(ca.crt) 값이 포함된 OpenShift Secret 입니다.
    2
    Kafka 클러스터에 대한 mTLS 인증에 사용되는 인증서 공개 키(entity-operator.crt) 및 개인 키(entity-operator.key)가 포함된 OpenShift 시크릿 입니다.
  3. User Operator를 배포합니다.

    oc create -f install/user-operator
  4. 배포 상태를 확인합니다.

    oc get deployments

    출력에 배포 이름 및 준비 상태 표시

    NAME                   READY  UP-TO-DATE  AVAILABLE
    strimzi-user-operator  1/1    1           1

    READY 는 ready/expected 복제본 수를 표시합니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

7장. 기능 게이트

Apache Kafka 운영자의 스트림은 기능 게이트를 사용하여 특정 기능 및 기능을 활성화하거나 비활성화합니다. 기능 게이트를 활성화하면 연결된 Operator의 동작이 변경되어 Apache Kafka 배포용 Streams에 해당 기능이 도입됩니다.

기능 게이트의 목적은 완전히 채택되기 전에 기능의 평가판 및 테스트를 용이하게 하는 것입니다. 기능 게이트의 상태(활성화 또는 비활성화)는 완성 수준에 따라 기본적으로 다를 수 있습니다.

기능 게이트 자격으로, 일반 가용성(GA)에 도달하여 기본적으로 활성화된 상태로 전환되며 Apache Kafka 배포를 위한 Streams의 영구 일부가 됩니다. GA 단계의 기능 게이트는 비활성화할 수 없습니다.

7.1. 숙련된 기능 게이트(GA)

중개 기능 게이트는 GA(General Availability)에 도달했으며 영구적으로 활성화된 기능입니다.

7.1.1. ControlPlaneListener 기능 게이트

ControlPlaneListener 기능 게이트는 데이터 복제 및 조정을 위해 리스너를 구분합니다.

  • Kafka 컨트롤러와 브로커 간 연결은 포트 9090에서 내부 컨트롤 플레인 리스너 를 사용합니다.
  • 브로커 간 데이터와 Apache Kafka Operator, Cruise Control 또는 Kafka Exporter의 스트림 간 내부 연결 복제는 포트 9091에서 복제 리스너 를 사용합니다.
중요

ControlPlaneListener 기능 게이트를 영구적으로 활성화하면 Apache Kafka 1.7 및 이전 버전의 Streams와 Apache Kafka 2.3 이상의 스트림 간 직접 업그레이드 또는 다운그레이드를 사용할 수 없습니다. 먼저 Apache Kafka 버전용 Streams for Apache Kafka 버전 중 하나를 통해 ControlPlaneListener 기능 게이트를 비활성화한 다음, 기능 게이트가 활성화된 상태에서 대상 버전으로 다운그레이드 또는 업그레이드해야 합니다.

7.1.2. ServiceAccountPatching 기능 게이트

ServiceAccountPatching 기능 게이트를 사용하면 Cluster Operator가 항상 서비스 계정을 조정하고 필요한 경우 이를 업데이트합니다. 예를 들어 사용자 지정 리소스의 template 속성을 사용하여 서비스 계정 레이블 또는 주석을 변경하면 Operator가 기존 서비스 계정 리소스에서 해당 레이블을 자동으로 업데이트합니다.

7.1.3. UseStrimziPodSets 기능 게이트

UseStrimziPodSets 기능 게이트는 Kafka 및 Zoo Cryostat Pod를 관리하기 위한 StrimziPodSet 사용자 정의 리소스를 도입하여 OpenShift StatefulSet 리소스의 사용을 대체합니다.

중요

UseStrimziPodSets 기능 게이트를 영구적으로 활성화하면 Apache Kafka 2.5 이상에서 Apache Kafka 2.0 또는 이전 버전의 Streams로 다운그레이드할 수 없습니다. 먼저 Apache Kafka 버전용 Streams for Apache Kafka 버전 중 하나를 다운로드하고, UseStrimziPodSets 기능 게이트를 비활성화한 다음 Apache Kafka 2.0 또는 이전 버전의 Streams로 다운그레이드해야 합니다.

7.1.4. StableConnectIdentities 기능 게이트

StableConnectIdentities 기능 게이트는 Kafka Connect 및 Kafka MirrorMaker 2 Pod를 관리하기 위한 StrimziPodSet 사용자 정의 리소스를 도입하여 OpenShift 배포 리소스 사용을 대체합니다.

StrimziPodSet 리소스는 Pod에 롤링 업그레이드 중에 변경되지 않는 안정적인 이름과 안정적인 주소를 제공하여 OpenShift Deployment 리소스 사용을 대체합니다.

중요

StableConnectIdentities 기능 게이트를 영구적으로 활성화하면 Apache Kafka 2.7 이상에서 Apache Kafka 2.7 이상에서 Apache Kafka 2.3 또는 이전 버전의 Streams로 다운그레이드를 직접 다운그레이드할 수 없습니다. 먼저 Apache Kafka 버전용 Streams for Apache Kafka 버전 중 하나를 통해 StableConnectIdentities 기능 게이트를 비활성화한 다음 Apache Kafka 2.3 또는 이전 버전의 Streams로 다운그레이드해야 합니다.

7.2. 안정적인 기능 게이트(베타)

안정적인 기능 게이트는 베타 수준의 완성도에 도달했으며 일반적으로 모든 사용자에 대해 기본적으로 활성화됩니다. 안정적인 기능 게이트는 프로덕션 환경에서 사용할 수 있지만 여전히 비활성화할 수 있습니다.

7.2.1. UseKRaft 기능 게이트

UseKRaft 기능 게이트의 기본 상태가 enabled.

UseKRaft 기능 게이트는 Zoo Cryostat 없이 KRaft(Kafka Raft 메타데이터) 모드에 Kafka 클러스터를 배포합니다. Zookeeper 및 KRaft는 Kafka 클러스터에서 메타데이터 및 조정 작업을 관리하는 데 사용되는 메커니즘입니다. Kraft 모드에서는 Zoo Cryostat와 같은 외부 조정 서비스가 필요하지 않습니다. KRaft 모드에서 Kafka 노드는 브로커, 컨트롤러 또는 둘 다의 역할을 수행합니다. 파티션 간에 복제되는 메타데이터를 집합적으로 관리합니다. 컨트롤러는 작업을 조정하고 클러스터 상태를 유지보수해야 합니다.

UseKRaft 기능 게이트를 사용하려면 KafkaNodePools 기능 게이트도 활성화해야 합니다. KRaft 모드에서 Kafka 클러스터를 배포하려면 KafkaNodePool 리소스를 사용해야 합니다. 자세한 내용 및 예제는 6.3.1절. “노드 풀을 사용하여 Kafka 클러스터 배포” 에서 참조하십시오. KRaft 모드를 사용하는 Kafka 사용자 정의 리소스에는 주석 strimzi.io/kraft="enabled" 도 있어야 합니다.

현재 Apache Kafka 스트림의 KRaft 모드에는 다음과 같은 주요 제한 사항이 있습니다.

  • Unidirectional Topic Operator만 KRaft 모드에서 지원됩니다. Bidirectional Topic Operator는 지원되지 않으며 UnidirectionalTopicOperator 기능 게이트를 비활성화하면 spec.entityOperator.topicOperator 속성을 Kafka 사용자 정의 리소스에서 제거해야 합니다.
  • JBOD 스토리지는 지원되지 않습니다. 유형: jbod 스토리지를 사용할 수 있지만 JBOD 배열은 하나의 디스크만 포함할 수 있습니다.
  • KRaft 컨트롤러 전용 노드 확장은 지원되지 않습니다.

UseKRaft 기능 게이트 비활성화

UseKRaft 기능 게이트를 비활성화하려면 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 지정합니다.

7.2.2. KafkaNodePools 기능 게이트

KafkaNodePools 기능 게이트의 기본 상태가 enabled 입니다.

KafkaNodePools 기능 게이트는 Apache Kafka 노드의 다양한 을 구성할 수 있는 새로운 KafkaNodePool 사용자 정의 리소스를 도입합니다.

노드 풀은 Kafka 클러스터 내의 별도의 Kafka 노드 그룹을 나타냅니다. 각 풀에는 복제본 수, 스토리지 구성 및 할당된 역할 목록과 같은 필수 설정이 포함된 고유한 구성이 있습니다. 컨트롤러 역할, 브로커 역할 또는 두 역할을 .spec.roles 필드의 풀의 모든 노드에 할당할 수 있습니다. Zoo Cryostat 기반 Apache Kafka 클러스터와 함께 사용하는 경우 브로커 역할로 설정해야 합니다. UseKRaft 기능 게이트와 함께 사용하면 브로커,컨트롤러 또는 둘 다로 설정할 수 있습니다.

또한 노드 풀은 리소스 요청 및 제한, Java JVM 옵션 및 리소스 템플릿을 자체적으로 구성할 수 있습니다. KafkaNodePool 리소스에 설정되지 않은 구성 옵션은 Kafka 사용자 정의 리소스에서 상속됩니다.

KafkaNodePool 리소스는 strimzi.io/cluster 레이블을 사용하여 속하는 Kafka 클러스터를 나타냅니다. 레이블은 Kafka 사용자 정의 리소스의 이름으로 설정해야 합니다.

KafkaNodePool 리소스의 예는 Apache Kafka용 Streams에서 제공하는 구성 파일 예제에서 확인할 수 있습니다.

KafkaNodePools 기능 게이트 비활성화

KafkaNodePools 기능 게이트를 비활성화하려면 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 지정합니다. 노드 풀을 사용하는 Kafka 사용자 정의 리소스에는 주석 strimzi.io/node-pools: enabled 도 있어야 합니다.

KafkaNodePools에서 다운그레이드

클러스터가 이미 Kafka NodePool 사용자 정의 리소스를 사용하고 있으며 이를 지원하지 않거나 KafkaNodePools 기능 게이트를 비활성화하여 이전 버전의 Apache Kafka로 다운그레이드하려면 먼저 KafkaNodePool 사용자 정의 리소스만 사용하여 KafkaNodePool 사용자 정의 리소스 관리로 마이그레이션해야 합니다.

7.2.3. UnidirectionalTopicOperator 기능 게이트

UnidirectionalTopicOperator 기능 게이트의 기본 상태가 enabled 입니다.

UnidirectionalTopicOperator 기능 게이트는 KafkaTopic 리소스를 사용하여 Kafka 주제를 생성하기 위한 단방향 주제 관리 모드를 도입합니다. Unidirectional 모드는 클러스터 관리를 위해 KRaft를 사용하는 것과 호환됩니다. unidirectional 모드에서는 KafkaTopic 리소스를 사용하여 Kafka 주제를 생성한 다음 Topic Operator에서 관리합니다. KafkaTopic 리소스 외부의 항목에 대한 구성이 취소됩니다. 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 을 참조하십시오.

UnidirectionalTopicOperator 기능 게이트 비활성화

UnidirectionalTopicOperator 기능 게이트를 비활성화하려면 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수에 -UnidirectionalTopicOperator 를 지정합니다.

7.3. 초기 액세스 기능 게이트(Alpha)

초기 액세스 기능 게이트는 아직 베타 단계에 도달하지 않았으며 기본적으로 비활성화되어 있습니다. 초기 액세스 기능 게이트는 기능이 Apache Kafka용 Streams에 영구적으로 통합되기 전에 평가를 수행할 수 있는 기회를 제공합니다.

현재 알파 단계에 기능 게이트가 없습니다.

7.4. 기능 게이트 활성화

기능 게이트의 기본 상태를 수정하려면 Operator의 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 사용합니다. 이 단일 환경 변수를 사용하여 여러 기능 게이트를 수정할 수 있습니다. 쉼표로 구분된 기능 게이트 이름 및 접두사 목록을 지정합니다. + 접두사는 기능 게이트와 - 접두사를 활성화합니다.

FeatureGate1 을 활성화하고 FeatureGate2를 비활성화하는 기능 게이트 구성의 예

env:
  - name: STRIMZI_FEATURE_GATES
    value: +FeatureGate1,-FeatureGate2

7.5. 기능 게이트 릴리스

기능 게이트에는 3 단계의 완성 단계가 있습니다.

  • alpha - 일반적으로 기본적으로 비활성화되어 있습니다.
  • 베타 - 일반적으로 기본적으로 사용 가능
  • GA(GA) - 일반적으로 항상 활성화되어 있음

알파 스테이지 기능은 실험적이거나 불안정할 수 있고, 변경될 수 있거나, 프로덕션 사용을 위해 충분히 테스트되지 않을 수 있습니다. 베타 단계 기능은 잘 테스트되었으며 해당 기능은 변경되지 않습니다. GA 단계 기능은 안정적이며 향후에는 변경되지 않아야 합니다. 알파 및 베타 단계 기능은 유용할 수 없는 경우 제거됩니다.

  • ControlPlaneListener 기능 게이트는 Apache Kafka 2.3의 Streams의 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다.
  • ServiceAccountPatching 기능 게이트는 Apache Kafka 2.3의 Streams에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다.
  • UseStrimziPodSets 기능 게이트가 Apache Kafka 2.5용 Streams의 GA 단계로 이동했으며 StatefulSets에 대한 지원이 완전히 제거됩니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다.
  • StableConnectIdentities 기능 게이트는 Apache Kafka 2.7의 Streams에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다.
  • UseKRaft 기능 게이트는 베타 단계에 있으며 기본적으로 활성화되어 있습니다.
  • KafkaNodePools 기능 게이트는 베타 단계에 있으며 기본적으로 활성화되어 있습니다.
  • UnidirectionalTopicOperator 기능 게이트는 베타 단계에 있으며 기본적으로 활성화되어 있습니다.
참고

기능 게이트는 GA에 도달하면 제거될 수 있습니다. 즉, 이 기능은 Apache Kafka 코어용 Streams에 통합되었으며 더 이상 비활성화할 수 없습니다.

Expand
표 7.1. 기능 게이트 및 Apache Kafka 버전의 Streams를 alpha, beta 또는 GA로 이동할 때
기능 게이트AlphabetaGA

ControlPlaneListener

1.8

2.0

2.3

ServiceAccountPatching

1.8

2.0

2.3

UseStrimziPodSets

2.1

2.3

2.5

UseKRaft

2.2

2.7

-

StableConnectIdentities

2.4

2.6

2.7

KafkaNodePools

2.5

2.7

-

UnidirectionalTopicOperator

2.5

2.7

-

기능 게이트가 활성화된 경우 Apache Kafka 버전의 특정 스트림에서 업그레이드하거나 다운그레이드하기 전에 비활성화해야 할 수 있습니다(또는 먼저 비활성화할 수 있는 Apache Kafka의 Streams 버전으로 업그레이드 / 다운그레이드). 다음 표는 Apache Kafka 버전의 Streams를 업그레이드하거나 다운그레이드할 때 비활성화해야 하는 기능 게이트를 보여줍니다.

Expand
표 7.2. Apache Kafka의 스트림 업그레이드 또는 다운그레이드 시 비활성화할 기능 게이트
기능 게이트 비활성화Apache Kafka 버전의 Streams에서 업그레이드Apache Kafka 버전의 Streams로 다운그레이드

ControlPlaneListener

1.7 및 이전 버전

1.7 및 이전 버전

UseStrimziPodSets

-

2.0 및 이전 버전

StableConnectIdentities

-

2.3 및 이전 버전

8장. KRaft 모드로 마이그레이션

Kafka 클러스터에서 메타데이터 관리에 Zoo Cryostat를 사용하는 경우 KRaft 모드에서 Kafka를 사용하여 마이그레이션할 수 있습니다. Kraft 모드는 분산 조정을 위해 Zoo Cryostat를 대체하여 향상된 안정성, 확장성 및 처리량을 제공합니다.

마이그레이션 중에 컨트롤러 노드의 쿼럼을 노드 풀로 설치하여 클러스터 관리를 위해 Zoo Cryostat를 대체합니다. strimzi.io/kraft="migration" 주석을 적용하여 클러스터 구성에서 KRaft 마이그레이션을 활성화합니다. 마이그레이션이 완료되면 strimzi.io/kraft="enabled" 주석을 사용하여 브로커를 KRaft를 사용하여 마이그레이션 모드로 전환합니다.

마이그레이션을 시작하기 전에 여러 제한 사항이 있으므로 환경에서 KRaft 모드에서 Kafka를 지원할 수 있는지 확인합니다. 또한 다음과 같습니다.

  • 마이그레이션은 브로커 및 컨트롤러로 이중 역할을 하는 노드에서는 전용 컨트롤러 노드에서만 지원됩니다.
  • 마이그레이션 프로세스 전반에 걸쳐 Zoo Cryostat 및 컨트롤러 노드는 일정 기간 동안 병렬로 작동하므로 클러스터에 충분한 컴퓨팅 리소스가 필요합니다.

사전 요구 사항

  • Kafka 3.7.0 이상에서는 Apache Kafka 2.7 이상용 Streams를 사용해야 합니다. 이전 버전의 Apache Kafka 또는 Apache Kafka를 사용하는 경우 KRaft 모드로 마이그레이션하기 전에 업그레이드하십시오.
  • KRaft 모드에서 지원되지 않으므로 Zoo Cryostat 기반 배포가 다음 없이 작동하는지 확인합니다.

    • 양방향 모드로 실행되는 Topic Operator입니다. 이 모드는 unidirectional 모드이거나 비활성화되어 있어야 합니다.
    • JBOD 스토리지. jbod 스토리지 유형을 사용할 수 있지만 JBOD 배열에는 하나의 디스크만 포함되어야 합니다.
  • Kafka 클러스터를 관리하는 Cluster Operator가 실행 중입니다.
  • Kafka 클러스터 배포는 Kafka 노드 풀을 사용합니다.

    Zoo Cryostat 기반 클러스터에서 노드 풀을 이미 사용 중인 경우 마이그레이션할 준비가 된 것입니다. 그렇지 않은 경우 노드 풀을 사용하도록 클러스터를 마이그레이션할 수 있습니다. 클러스터가 노드 풀을 사용하지 않을 때 마이그레이션하려면 브로커 역할이 할당되고 이름이 kafkaKafkaNodePool 리소스 구성에 브로커 를 포함해야 합니다. 노드 풀 지원은 strimzi.io/node-pools: enabled 주석을 사용하여 Kafka 리소스 구성에서 활성화됩니다.

이 절차에서 Kafka 클러스터 이름은 my-project 네임스페이스에 있는 my-cluster 입니다. 생성된 컨트롤러 노드 풀의 이름은 controller 입니다. 브로커의 노드 풀을 kafka 라고 합니다.

프로세스

  1. Kafka 클러스터의 경우 컨트롤러 역할을 사용하여 노드 풀을 생성합니다.

    노드 풀은 컨트롤러 노드의 쿼럼을 클러스터에 추가합니다.

    컨트롤러 노드 풀에 대한 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: controller
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      roles:
        - controller
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 20Gi
            deleteClaim: false
        resources:
          requests:
            memory: 64Gi
            cpu: "8"
          limits:
            memory: 64Gi
            cpu: "12"

    참고

    마이그레이션의 경우 브로커 및 컨트롤러 역할을 공유하는 노드 풀을 사용할 수 없습니다.

  2. KafkaNodePool 리소스를 적용하여 컨트롤러를 생성합니다.

    Cluster Operator 로그에서 Zoo Cryostat 기반 환경에서 컨트롤러 사용과 관련된 오류는 Cluster Operator 로그에서 확인할 수 있습니다. 오류는 조정을 차단할 수 있습니다. 이를 방지하려면 다음 단계를 즉시 수행합니다.

  3. strimzi.io/kraft 주석을 migration로 설정하여 Kafka 리소스에서 KRaft 마이그레이션 을 활성화합니다.

    oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwrite

    KRaft 마이그레이션 활성화

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft="migration"
    # ...

    Kafka 리소스 구성에 주석을 적용하면 마이그레이션이 시작됩니다.

  4. 컨트롤러가 시작되고 브로커가 롤아웃되었는지 확인합니다.

    oc get pods -n my-project

    출력에 브로커 및 컨트롤러 노드 풀의 노드가 표시됩니다.

    NAME                     READY  STATUS   RESTARTS
    my-cluster-kafka-0       1/1    Running  0
    my-cluster-kafka-1       1/1    Running  0
    my-cluster-kafka-2       1/1    Running  0
    my-cluster-controller-3  1/1    Running  0
    my-cluster-controller-4  1/1    Running  0
    my-cluster-controller-5  1/1    Running  0
    # ...

  5. 마이그레이션 상태를 확인합니다.

    oc get kafka my-cluster -n my-project -w

    메타데이터 상태 업데이트

    NAME        ...  METADATA STATE
    my-cluster  ...  Zookeeper
    my-cluster  ...  KRaftMigration
    my-cluster  ...  KRaftDualWriting
    my-cluster  ...  KRaftPostMigration

    METADATA STATE 는 Kafka 메타데이터 및 조정 작업을 관리하는 데 사용되는 메커니즘을 보여줍니다. 마이그레이션이 시작될 때이는 Zoo Cryostat 입니다.

    • Zookeeper 는 메타데이터가 Zoo Cryostat에만 저장되는 초기 상태입니다.
    • KRaftMigration 은 마이그레이션이 진행 중인 상태입니다. Zoo Cryostat를 KRaft로 마이그레이션하는 플래그( Zookeeper.metadata.migration.enable)가 브로커에 추가되어 컨트롤러에 등록하도록 롤아웃됩니다. 이 시점에서 마이그레이션은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.
    • KRaftDualWriting 은 Kafka 클러스터가 KRaft 클러스터로 작동할 때 상태이지만 메타데이터가 Kafka 및 Zoo Cryostat 모두에 저장됩니다. 브로커는 마이그레이션을 활성화하기 위해 플래그를 제거하기 위해 두 번 롤아웃됩니다.
    • KRaftPostMigration 은 브로커에 대해 KRaft 모드가 활성화된 경우의 상태입니다. 메타데이터는 여전히 Kafka 및 Zoo Cryostat에 저장됩니다.

    마이그레이션 상태는 Kafka 리소스의 status.kafkaMetadataState 속성에서도 표시됩니다.

    주의

    이 시점에서 Zoo Cryostat를 사용하여 롤백 할 수 있습니다. 다음 단계는 KRaft를 활성화하는 것입니다. KRaft를 활성화한 후에는 롤백을 수행할 수 없습니다.

  6. 메타데이터 상태가 KRaftPostMigration 에 도달하면 strimzi.io/kraft 주석을 enabled 로 설정하여 Kafka 리소스 구성에서 KRaft를 활성화합니다.

    oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwrite

    KRaft 마이그레이션 활성화

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft="enabled"
    # ...

  7. 전체 KRaft 모드로 이동 상태를 확인합니다.

    oc get kafka my-cluster -n my-project -w

    메타데이터 상태 업데이트

    NAME        ...  METADATA STATE
    my-cluster  ...  Zookeeper
    my-cluster  ...  KRaftMigration
    my-cluster  ...  KRaftDualWriting
    my-cluster  ...  KRaftPostMigration
    my-cluster  ...  PreKRaft
    my-cluster  ...  KRaft

    • PreKRaft 는 모든 Zoo Cryostat 관련 리소스가 자동으로 삭제되는 상태입니다.
    • Kraft는 KRaft 마이그레이션이 완료되면 최종 상태(컨트롤러가 롤아웃된 후)입니다.
    참고

    Zoo Cryostat에 대해 deleteClaim 을 구성하는 방법에 따라 PVC(영구 볼륨 클레임) 및 PV(영구 볼륨)는 삭제되지 않을 수 있습니다. deleteClaim 은 클러스터가 제거될 때 PVC가 삭제되는지 여부를 지정합니다. 기본값은 false입니다.

  8. Kafka 리소스에서 모든 Zoo Cryostat 관련 구성을 제거합니다.

    존재하는 경우 다음을 제거할 수 있습니다.

    • log.message.format.version
    • inter.broker.protocol.version
    • spec.zookeeper.* 속성

      log.message.format.versioninter.broker.protocol.version 을 제거하면 브로커와 컨트롤러가 다시 롤백됩니다. Zoo Cryostat 속성을 제거하면 KRaft-operated 클러스터에 존재하는 Zoo Cryostat 구성과 관련된 경고 메시지가 제거됩니다.

마이그레이션에서 롤백 수행

Kafka 리소스에서 KRaft를 활성화하여 마이그레이션이 완료되고 상태가 KRaft 상태로 이동하기 전에 다음과 같이 롤백 작업을 수행할 수 있습니다.

  1. strimzi.io/kraft="rollback" 주석을 Kafka 리소스에 적용하여 브로커를 롤백합니다.

    oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwrite

    KRaft 마이그레이션 롤백

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft="rollback"
    # ...

    이를 수행하려면 마이그레이션 프로세스가 KRaftPostMigration 상태에 있어야 합니다. 브로커가 롤백되어 Zoo Cryostat에 다시 연결할 수 있으며 상태가 KRaftDualWriting 으로 돌아갑니다.

  2. 컨트롤러 노드 풀을 삭제합니다.

    oc delete KafkaNodePool controller -n my-project
  3. strimzi.io/kraft="disabled" 주석을 Kafka 리소스에 적용하여 메타데이터 상태를 Zoo Cryostat로 반환합니다.

    oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwrite

    Zoo Cryostat를 사용하여 다시 전환

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft="disabled"
    # ...

9장. 배포 구성

Apache Kafka 사용자 정의 리소스의 Streams를 사용하여 정확한 요구 사항에 맞게 Apache Kafka 배포를 위한 Streams를 구성하고 관리합니다. Apache Kafka의 스트림은 각 릴리스와 함께 사용자 정의 리소스의 예를 제공하여 지원되는 Kafka 구성 요소의 인스턴스를 구성하고 생성할 수 있습니다. 특정 요구 사항에 따라 추가 기능을 포함하도록 사용자 정의 리소스를 구성하여 배포를 미세 조정합니다. Kafka Connect 커넥터의 특정 구성 영역, 즉 메트릭, 로깅 및 외부 구성의 경우 ConfigMap 리소스를 사용할 수도 있습니다. ConfigMap 리소스를 사용하여 구성을 통합하면 유지 관리를 중앙에서 관리할 수 있습니다. 구성 공급자를 사용하여 Kafka Connect 커넥터 구성에 대한 인증 정보를 제공하는 것이 좋습니다. 외부 소스에서 구성을 로드할 수도 있습니다.

사용자 지정 리소스를 사용하여 다음 구성 요소의 인스턴스를 구성하고 생성합니다.

  • Kafka 클러스터
  • Kafka Connect 클러스터
  • Kafka MirrorMaker
  • Kafka Bridge
  • 크루즈 제어

사용자 지정 리소스 구성을 사용하여 인스턴스를 관리하거나 배포를 수정하여 추가 기능을 도입할 수도 있습니다. 여기에는 다음을 지원하는 구성이 포함될 수 있습니다.

  • 노드 풀 지정
  • Kafka 브로커에 대한 클라이언트 액세스 보안
  • 클러스터 외부에서 Kafka 브로커에 액세스
  • 주제 생성
  • 사용자 생성(클라이언트)
  • 기능 게이트 제어
  • 로깅 빈도 변경
  • 리소스 제한 및 요청 할당
  • Streams for Apache Kafka Drain cleaner, Cruise Control 또는 distributed tracing과 같은 기능을 소개합니다.

Apache Kafka 사용자 정의 리소스 API 참조 는 구성에서 사용할 수 있는 속성을 설명합니다.

참고

사용자 지정 리소스에 적용되는 레이블은 클러스터를 구성하는 OpenShift 리소스에도 적용됩니다. 필요에 따라 리소스에 레이블을 지정할 수 있는 편리한 메커니즘을 제공합니다.

사용자 정의 리소스 구성 파일에 변경 사항 적용

spec 속성을 사용하여 사용자 정의 리소스에 구성을 추가합니다. 구성을 추가한 후 oc 를 사용하여 사용자 정의 리소스 구성 파일에 변경 사항을 적용할 수 있습니다.

oc apply -f <kafka_configuration_file>

9.1. 설정 파일 예제 사용

지원되는 추가 구성을 통합하여 배포를 추가로 개선합니다. 구성 파일의 예는 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 다운로드할 수 있는 릴리스 아티팩트와 함께 제공됩니다.

예제 파일에는 기본적으로 사용자 정의 리소스의 필수 속성 및 값만 포함됩니다. oc 명령줄 툴을 사용하여 예제를 다운로드하고 적용할 수 있습니다. 예제는 배포에 대한 자체 Kafka 구성 요소 구성을 빌드할 때 시작점 역할을 할 수 있습니다.

참고

Operator를 사용하여 Apache Kafka용 Streams를 설치한 경우에도 예제 파일을 다운로드하여 구성을 업로드하는 데 사용할 수 있습니다.

릴리스 아티팩트에는 구성 예제가 포함된 예제 디렉터리가 포함되어 있습니다.

Apache Kafka용 Streams와 함께 제공되는 구성 파일의 예

examples
├── user 
1

├── topic 
2

├── security 
3

│   ├── tls-auth
│   ├── scram-sha-512-auth
│   └── keycloak-authorization
├── mirror-maker 
4

├── metrics 
5

├── kafka 
6

│   └── nodepools 
7

├── cruise-control 
8

├── connect 
9

└── bridge 
10

1
사용자 Operator가 관리하는 KafkaUser 사용자 정의 리소스 구성
2
Topic Operator에서 관리하는 KafkaTopic 사용자 정의 리소스 구성
3
Kafka 구성 요소에 대한 인증 및 권한 부여 구성입니다. TLS 및 SCRAM-SHA-512 인증에 대한 예제 구성을 포함합니다. Red Hat Single Sign-On 예제에는 Kafka 사용자 정의 리소스 구성 및 Red Hat Single Sign-On 영역 사양이 포함되어 있습니다. 이 예제를 사용하여 Red Hat Single Sign-On 권한 부여 서비스를 시도할 수 있습니다. oauth 인증 및 keycloak 인증 메트릭이 있는 예도 있습니다.
4
Mirror Maker 배포에 대한 Kafka 사용자 정의 리소스 구성 복제 정책 및 동기화 빈도에 대한 구성 예를 포함합니다.
5
Prometheus 설치 및 Grafana 대시보드 파일을 포함한 지표 구성입니다.
6
Kafka 배포에 대한 Kafka 사용자 정의 리소스 구성입니다. 임시 또는 영구 단일 또는 다중 노드 배포에 대한 예제 구성이 포함됩니다.
7
Kafka 클러스터의 Kafka 노드에 대한 KafkaNodePool 구성 KRaft(Kafka Raft 메타데이터) 모드 또는 Zoo Cryostat를 사용하는 클러스터의 노드 구성 예를 포함합니다.
8
Cruise Control에 대한 배포 구성이 포함된 Kafka 사용자 정의 리소스 Cruise Control에서 최적화 제안을 생성하기 위해 KafkaRebalance 사용자 정의 리소스를 포함하며, 기본 또는 사용자 최적화 목표를 사용하는 예제 구성입니다.
9
Kafka Connect 배포에 대한 KafkaConnect 및 KafkaConnector 사용자 지정 리소스 구성입니다. 단일 또는 다중 노드 배포에 대한 예제 구성이 포함됩니다.
10
Kafka Bridge 배포에 대한 KafkaBridge 사용자 정의 리소스 구성

9.2. Kafka 구성

Kafka 사용자 정의 리소스의 사양 속성을 업데이트하여 Kafka 배포를 구성합니다.

Kafka를 구성할 뿐만 아니라 Zoo Cryostat 및 Apache Kafka Operator용 Streams에 대한 구성을 추가할 수 있습니다. 로깅 및 상태 점검과 같은 일반적인 구성 속성은 각 구성 요소에 대해 독립적으로 구성됩니다.

특히 중요한 구성 옵션은 다음과 같습니다.

  • 리소스 요청(CPU / 메모리)
  • 최대 및 최소 메모리 할당을 위한 JVM 옵션
  • Kafka 브로커에 클라이언트를 연결하는 리스너(및 클라이언트 인증)
  • 인증
  • 스토리지
  • Rack 인식
  • 지표
  • 클러스터 재조정을 위한 cruise Control
  • KRaft 기반 Kafka 클러스터의 메타데이터 버전
  • Zoo Cryostat 기반 Kafka 클러스터의 브랜드 간 프로토콜 버전

config의 .spec.kafka.metadataVersion 속성 또는 configinter.broker.protocol.version 속성은 지정된 Kafka 버전 (spec.kafka.version)에서 지원하는 버전이어야 합니다. 속성은 Kafka 클러스터에서 사용되는 Kafka 메타데이터 또는 inter-broker 프로토콜 버전을 나타냅니다. 이러한 속성 중 하나가 구성에 설정되지 않은 경우 Cluster Operator는 버전을 사용된 Kafka 버전의 기본값으로 업데이트합니다.

참고

지원되는 가장 오래된 메타데이터 버전은 3.3입니다. Kafka 버전보다 오래된 메타데이터 버전을 사용하면 일부 기능이 비활성화될 수 있습니다.

Kafka 클러스터 구성 옵션에 대한 자세한 내용은 Apache Kafka 사용자 정의 리소스 API 참조의 Streams 를 참조하십시오.

TLS 인증서 관리

Kafka를 배포할 때 Cluster Operator는 클러스터 내에서 암호화 및 인증을 활성화하기 위해 TLS 인증서를 자동으로 설정하고 갱신합니다. 필요한 경우 갱신 기간이 시작되기 전에 클러스터 및 클라이언트 CA 인증서를 수동으로 갱신할 수 있습니다. 클러스터 및 클라이언트 CA 인증서에서 사용하는 키를 교체할 수도 있습니다. 자세한 내용은 수동으로 CA 인증서 갱신개인 키 교체를 참조하십시오.

Kafka 사용자 정의 리소스 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    replicas: 3 
1

    version: 3.7.0 
2

    logging: 
3

      type: inline
      loggers:
        kafka.root.logger.level: INFO
    resources: 
4

      requests:
        memory: 64Gi
        cpu: "8"
      limits:
        memory: 64Gi
        cpu: "12"
    readinessProbe: 
5

      initialDelaySeconds: 15
      timeoutSeconds: 5
    livenessProbe:
      initialDelaySeconds: 15
      timeoutSeconds: 5
    jvmOptions: 
6

      -Xms: 8192m
      -Xmx: 8192m
    image: my-org/my-image:latest 
7

    listeners: 
8

      - name: plain 
9

        port: 9092 
10

        type: internal 
11

        tls: false 
12

        configuration:
          useServiceDnsDomain: true 
13

      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication: 
14

          type: tls
      - name: external1 
15

        port: 9094
        type: route
        tls: true
        configuration:
          brokerCertChainAndKey: 
16

            secretName: my-secret
            certificate: my-certificate.crt
            key: my-key.key
    authorization: 
17

      type: simple
    config: 
18

      auto.create.topics.enable: "false"
      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
      inter.broker.protocol.version: "3.7"
    storage: 
19

      type: persistent-claim 
20

      size: 10000Gi
    rack: 
21

      topologyKey: topology.kubernetes.io/zone
    metricsConfig: 
22

      type: jmxPrometheusExporter
      valueFrom:
        configMapKeyRef: 
23

          name: my-config-map
          key: my-key
    # ...
  zookeeper: 
24

    replicas: 3 
25

    logging: 
26

      type: inline
      loggers:
        zookeeper.root.logger: INFO
    resources:
      requests:
        memory: 8Gi
        cpu: "2"
      limits:
        memory: 8Gi
        cpu: "2"
    jvmOptions:
      -Xms: 4096m
      -Xmx: 4096m
    storage:
      type: persistent-claim
      size: 1000Gi
    metricsConfig:
      # ...
  entityOperator: 
27

    tlsSidecar: 
28

      resources:
        requests:
          cpu: 200m
          memory: 64Mi
        limits:
          cpu: 500m
          memory: 128Mi
    topicOperator:
      watchedNamespace: my-topic-namespace
      reconciliationIntervalSeconds: 60
      logging: 
29

        type: inline
        loggers:
          rootLogger.level: INFO
      resources:
        requests:
          memory: 512Mi
          cpu: "1"
        limits:
          memory: 512Mi
          cpu: "1"
    userOperator:
      watchedNamespace: my-topic-namespace
      reconciliationIntervalSeconds: 60
      logging: 
30

        type: inline
        loggers:
          rootLogger.level: INFO
      resources:
        requests:
          memory: 512Mi
          cpu: "1"
        limits:
          memory: 512Mi
          cpu: "1"
  kafkaExporter: 
31

    # ...
  cruiseControl: 
32

    # ...

1
복제본 노드 수입니다.
2
업그레이드 절차에 따라 지원되는 버전으로 변경할 수 있는 Kafka 버전입니다.
3
Kafka 로거 및 로그 수준은 ConfigMap을 통해 직접(인라인) 또는 간접적으로(외부)에 추가됩니다. 사용자 정의 Log4j 구성은 ConfigMap의 log4j.properties 키 아래에 배치해야 합니다. Kafka kafka.root.logger.level 로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다.
4
지원되는 리소스(현재 cpumemory ) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다.
5
컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
6
Kafka를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
7
ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
8
리스너는 클라이언트가 부트스트랩 주소를 통해 Kafka 클러스터에 연결하는 방법을 구성합니다. 리스너는 OpenShift 클러스터 내부 또는 외부에서 연결을 위해 내부 또는 외부 리스너로 구성됩니다.
9
리스너를 식별하는 이름입니다. Kafka 클러스터 내에서 고유해야 합니다.
10
Kafka 내의 리스너에서 사용하는 포트 번호입니다. 포트 번호는 지정된 Kafka 클러스터 내에서 고유해야 합니다. 허용되는 포트 번호는 9092 이상이며, 이는 Prometheus 및 Cryostat에 이미 사용되는 포트 9404 및 9999를 제외하고 사용합니다. 리스너 유형에 따라 Kafka 클라이언트를 연결하는 포트 번호와 포트 번호가 동일하지 않을 수 있습니다.
11
internal 또는 cluster-ip 로 지정된 리스너 유형(broker ClusterIP 서비스를 사용하여 Kafka를 노출) 또는 외부 리스너의 경우 경로 (OpenShift만), 로드 밸런서,nodeport 또는 ingress (Kubernetes만 해당)로 표시됩니다.
12
각 리스너에 대해 TLS 암호화를 활성화합니다. 기본값은 false 입니다. 경로수신 유형 리스너의 경우 true 로 설정하여 TLS 암호화를 활성화해야 합니다.
13
클러스터 서비스 접미사(일반적으로 .cluster.local)를 포함하여 정규화된 DNS 이름을 정의합니다.
14
mTLS, SCRAM-SHA-512 또는 토큰 기반 OAuth 2.0으로 지정된 리스너 인증 메커니즘
15
외부 리스너 구성은 경로,로드 밸런서 또는 nodeport 를 통해 Kafka 클러스터가 OpenShift 외부에 노출되는 방법을 지정합니다.
16
외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서에 대한 선택적 구성입니다. brokerCert CryostatAndKey 는 서버 인증서와 개인 키가 포함된 보안을 지정합니다. 활성화된 TLS 암호화를 사용하여 모든 리스너에서 Kafka 리스너 인증서를 구성할 수 있습니다.
17
권한 부여를 사용하면 Kafka 브로커에서 간단한 OAUTH 2.0 또는 OPA 인증을 사용할 수 있습니다. 간단한 인증에서는 AclAuthorizerStandardAuthorizer Kafka 플러그인을 사용합니다.
18
브로커 구성. 표준 Apache Kafka 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
19
영구 볼륨의 스토리지 크기가 증가할 수 있으며 추가 볼륨이 JBOD 스토리지에 추가될 수 있습니다.
20
영구 스토리지에는 동적 볼륨 프로비저닝을 위한 스토리지 ID 및 클래스 와 같은 추가 구성 옵션이 있습니다.
21
다양한 랙, 데이터 센터 또는 가용성 영역에 복제본을 분산하기 위한 랙 인식 구성입니다. topologyKey 는 랙 ID가 포함된 노드 레이블과 일치해야 합니다. 이 구성에 사용된 예제에서는 표준 topology.kubernetes.io/zone 레이블을 사용하는 영역을 지정합니다.
22
Prometheus 지표가 활성화되어 있습니다. 이 예에서는 Prometheus Cryostat Exporter(기본 지표 내보내기)에 대한 메트릭이 구성됩니다.
23
Prometheus Cryostat 내보내기에 대한 구성이 포함된 ConfigMap을 참조하여 활성화되는 Prometheus 형식의 Grafana 대시보드로 메트릭을 내보내는 규칙입니다. metricsConfig.valueFrom.configMapKeyRef.key 아래에 빈 파일이 포함된 ConfigMap에 대한 참조를 사용하여 추가 구성 없이 메트릭을 활성화할 수 있습니다.
24
Kafka 구성과 유사한 속성을 포함하는 Zookeeper별 구성입니다.
25
Zoo Cryostat 노드 수입니다. Zookeeper 클러스터 또는 ensembles는 일반적으로 홀수의 노드(일반적으로 3, 5 또는 7)로 실행됩니다. 유효한 쿼럼을 유지하려면 대부분의 노드를 사용할 수 있어야 합니다. Zoo Cryostat 클러스터가 쿼럼을 끊을 경우 클라이언트에 대한 응답이 중지되고 Kafka 브로커가 작동하지 않습니다. Apache Kafka의 Streams에 안정적이고 가용성이 높은 Zoo Cryostat 클러스터를 보유하는 것이 중요합니다.
26
Zookeeper 로거 및 로그 수준.
27
Entity Operator 구성 - Topic Operator 및 User Operator에 대한 구성을 지정합니다.
28
엔터티 Operator TLS 사이드카 구성. 엔터티 Operator는 Zoo Cryostat와의 보안 통신을 위해 TLS 사이드카를 사용합니다.
29
Topic Operator 로거 및 로그 수준을 지정합니다. 이 예에서는 인라인 로깅을 사용합니다.
30
지정된 사용자 Operator 로거 및 로그 수준입니다.
31
Kafka 내보내기 구성. Kafka 내보내기는 특히 소비자 지연 데이터의 Kafka 브로커에서 메트릭 데이터를 추출하기 위한 선택적 구성 요소입니다. Kafka Exporter가 제대로 작동하려면 소비자 그룹이 사용 중이어야 합니다.
32
Kafka 클러스터를 재조정하는 데 사용되는 Cruise Control에 대한 선택적 구성입니다.

9.2.1. Kafka 정적 할당량 플러그인을 사용하여 브로커에 제한 설정

Kafka 정적 할당량 플러그인을 사용하여 Kafka 클러스터의 브로커에 처리량 및 스토리지 제한을 설정합니다. Kafka 리소스를 구성하여 플러그인을 활성화하고 제한을 설정합니다. 브로커와 상호 작용하는 클라이언트에 제한을 두도록 바이트 비율 임계값 및 스토리지 할당량을 설정할 수 있습니다.

생산자 및 소비자 대역폭에 대한 바이트 비율 임계값을 설정할 수 있습니다. 총 제한은 브로커에 액세스하는 모든 클라이언트에 분산됩니다. 예를 들어 생산자를 위해 바이트 비율 임계값을 40MBps로 설정할 수 있습니다. 두 생산자가 실행 중인 경우 각각 처리량이 20MB로 제한됩니다.

스토리지 할당량은 소프트 제한과 하드 제한 간에 Kafka 디스크 스토리지 제한을 제한합니다. 제한은 사용 가능한 모든 디스크 공간에 적용됩니다. 생산자는 소프트 제한과 하드 제한 사이에 점진적으로 느려집니다. 제한을 통해 디스크가 너무 빨리 채워지고 용량을 초과할 수 있습니다. 전체 디스크로 인해 수정하기 어려운 문제가 발생할 수 있습니다. 하드 제한은 최대 스토리지 제한입니다.

참고

JBOD 스토리지의 경우 제한이 모든 디스크에 적용됩니다. 브로커가 두 개의 1TB 디스크를 사용하고 할당량이 1.1TB인 경우 하나의 디스크가 채워지고 다른 디스크는 거의 비어 있습니다.

사전 요구 사항

  • Kafka 클러스터를 관리하는 Cluster Operator가 실행 중입니다.

프로세스

  1. Kafka 리소스의 구성에 플러그인 속성을 추가합니다.

    플러그인 속성은 이 예제 구성에 표시됩니다.

    Kafka 고정 할당량 플러그인 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        config:
          client.quota.callback.class: io.strimzi.kafka.quotas.StaticQuotaCallback 
    1
    
          client.quota.callback.static.produce: 1000000 
    2
    
          client.quota.callback.static.fetch: 1000000 
    3
    
          client.quota.callback.static.storage.soft: 400000000000 
    4
    
          client.quota.callback.static.storage.hard: 500000000000 
    5
    
          client.quota.callback.static.storage.check-interval: 5 
    6

    1
    Kafka 정적 할당량 플러그인을 로드합니다.
    2
    생산자 바이트 비율 임계값을 설정합니다. 이 예에서는 1Mbps입니다.
    3
    consumer byte-rate threshold를 설정합니다. 이 예에서는 1Mbps입니다.
    4
    스토리지에 대한 더 낮은 소프트 제한을 설정합니다. 이 예에서는 400GB입니다.
    5
    스토리지에 대해 더 높은 하드 제한을 설정합니다. 이 예에서는 500GB입니다.
    6
    스토리지의 점검 간격(초)을 설정합니다. 이 예에서는 5초입니다. 검사를 비활성화하려면 이 값을 0으로 설정할 수 있습니다.
  2. 리소스를 업데이트합니다.

    oc apply -f <kafka_configuration_file>

9.2.2. 기본 Zoo Cryostat 구성 값

Apache Kafka용 Streams를 사용하여 Zoo Cryostat를 배포할 때 Apache Kafka에 대해 Streams에서 설정한 기본 구성 중 일부는 표준 Zoo Cryostat 기본값과 다릅니다. 이는 Apache Kafka용 Streams가 OpenShift 환경 내에서 Zoo Cryostat를 실행하는 데 최적화된 값을 사용하여 여러 Zoo Cryostat 속성을 설정하기 때문입니다.

Apache Kafka용 Streams의 키 Zoo Cryostat 속성에 대한 기본 구성은 다음과 같습니다.

Expand
표 9.1. Apache Kafka용 스트림의 기본 Zoo Cryostat 속성
속성기본값설명

tickTime

2000

세션 시간 제한을 결정하는 단일 틱(밀리초)입니다.

initLimit

5

팔로워가 Zoo Cryostat 클러스터에서 리더로 대체될 수 있는 최대 틱 수입니다.

syncLimit

2

follower가 Zoo Cryostat 클러스터의 리더와 동기화되지 않을 수 있는 최대 틱 수입니다.

autopurge.purgeInterval

1

autopurge 기능을 활성화하고 서버 측 Zoo Cryostat 트랜잭션 로그를 제거하기 위한 시간 간격(시간)을 설정합니다.

admin.enableServer

false

Zoo Cryostat 관리자 서버를 비활성화하려면 플래그를 지정합니다. admin 서버는 Apache Kafka용 Streams에서 사용되지 않습니다.

중요

Kafka 사용자 정의 리소스에서 zookeeper.config 로 기본값을 수정하면 Zoo Cryostat 클러스터의 동작 및 성능에 영향을 미칠 수 있습니다.

9.2.3. 주석을 사용하여 Kafka 노드 삭제

다음 절차에서는 OpenShift 주석을 사용하여 기존 Kafka 노드를 삭제하는 방법을 설명합니다. Kafka 노드를 삭제하면 Kafka 브로커가 실행 중인 Pod 와 관련 PersistentVolumeClaim (클러스터가 영구 스토리지와 함께 배포된 경우)을 모두 삭제하는 것으로 구성됩니다. 삭제 후 Pod 및 관련 PersistentVolumeClaim 이 자동으로 다시 생성됩니다.

주의

PersistentVolumeClaim 을 삭제하면 영구 데이터 손실이 발생할 수 있으며 클러스터의 가용성은 보장할 수 없습니다. 다음 절차는 스토리지 문제가 발생한 경우에만 수행해야 합니다.

사전 요구 사항

  • 실행중인 Cluster Operator

프로세스

  1. 삭제할 Pod 의 이름을 찾습니다.

    Kafka 브로커 Pod의 이름은 < cluster_name>-kafka-<index_number >로 지정됩니다. 여기서 < index_number >는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다. 예를 들면 my-cluster-kafka-0 입니다.

  2. oc annotate 를 사용하여 OpenShift에서 Pod 리소스에 주석을 답니다.

    oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/delete-pod-and-pvc="true"
  3. 기본 영구 볼륨 클레임이 있는 주석이 달린 Pod가 삭제될 때 다음 조정을 기다린 후 다시 생성합니다.

9.2.4. 주석을 사용하여 Zoo Cryostat 노드 삭제

다음 절차에서는 OpenShift 주석을 사용하여 기존 Zoo Cryostat 노드를 삭제하는 방법을 설명합니다. Zoo Cryostat 노드를 삭제하면 Zoo Cryostat가 실행 중인 Pod 와 관련 PersistentVolumeClaim (클러스터가 영구 스토리지와 함께 배포된 경우)을 모두 삭제하는 것으로 구성됩니다. 삭제 후 Pod 및 관련 PersistentVolumeClaim 이 자동으로 다시 생성됩니다.

주의

PersistentVolumeClaim 을 삭제하면 영구 데이터 손실이 발생할 수 있으며 클러스터의 가용성은 보장할 수 없습니다. 다음 절차는 스토리지 문제가 발생한 경우에만 수행해야 합니다.

사전 요구 사항

  • 실행중인 Cluster Operator

프로세스

  1. 삭제할 Pod 의 이름을 찾습니다.

    Zookeeper Pod의 이름은 < cluster_name>-zookeeper-<index_number >로 지정됩니다. 여기서 < index_number >는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다. 예를 들면 my-cluster-zookeeper-0 입니다.

  2. oc annotate 를 사용하여 OpenShift에서 Pod 리소스에 주석을 답니다.

    oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/delete-pod-and-pvc="true"
  3. 기본 영구 볼륨 클레임이 있는 주석이 달린 Pod가 삭제될 때 다음 조정을 기다린 후 다시 생성합니다.

9.3. 노드 풀 구성

KafkaNodePool 사용자 정의 리소스의 spec 속성을 업데이트하여 노드 풀 배포를 구성합니다.

노드 풀은 Kafka 클러스터 내의 별도의 Kafka 노드 그룹을 나타냅니다. 각 풀에는 복제본, 역할 및 스토리지 할당 수에 대한 필수 설정이 포함된 고유한 구성이 있습니다.

선택적으로 다음 속성의 값을 지정할 수도 있습니다.

  • 메모리 및 cpu 요청 및 제한을 지정하는 리소스
  • Pod 및 기타 OpenShift 리소스에 대한 사용자 정의 구성을 지정하는 템플릿
  • 힙 크기, 런타임 및 기타 옵션에 대한 사용자 정의 JVM 구성을 지정하는 jvmOptions

Kafka 리소스는 Kafka 클러스터의 모든 노드에 대한 구성을 나타냅니다. KafkaNodePool 리소스는 노드 풀에서만 노드의 구성을 나타냅니다. 구성 속성이 KafkaNodePool 에 지정되지 않은 경우 Kafka 리소스에서 상속됩니다. 두 리소스에 모두 설정된 경우 KafkaNodePool 리소스에 지정된 구성이 우선합니다. 예를 들어 노드 풀과 Kafka 구성에 모두 jvmOptions 가 포함된 경우 노드 풀 구성에 지정된 값이 사용됩니다. -Xmx: 1024mKafkaNodePool.spec.jvmOptions-Xms: 512m 에 설정된 경우 Kafka.spec.kafka.jvmOptions 에서 노드는 노드 풀 구성의 값을 사용합니다.

KafkaKafkaNodePool 스키마의 속성은 결합되지 않습니다. 명확히 하기 위해 KafkaNodePool.spec.templatepodSet.metadata.labels 만 포함되어 있고 Kafka.spec.kafka.templatepodSet.metadata.annotationspod.metadata.labels 가 포함된 경우 노드 풀 구성에 템플릿 값이 있기 때문에 Kafka 구성의 템플릿 값이 무시됩니다.

노드 풀 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.

KRaft 모드를 사용하는 클러스터의 노드 풀 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: kraft-dual-role 
1

  labels:
    strimzi.io/cluster: my-cluster 
2

spec:
  replicas: 3 
3

  roles: 
4

    - controller
    - broker
  storage: 
5

    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  resources: 
6

      requests:
        memory: 64Gi
        cpu: "8"
      limits:
        memory: 64Gi
        cpu: "12"

1
노드 풀의 고유 이름입니다.
2
노드 풀이 속한 Kafka 클러스터입니다. 노드 풀은 단일 클러스터에만 속할 수 있습니다.
3
노드의 복제본 수입니다.
4
노드 풀의 노드 역할. 이 예에서 노드에는 컨트롤러 및 브로커로서의 이중 역할이 있습니다.
5
노드의 스토리지 사양입니다.
6
지원되는 리소스(현재 cpumemory ) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다.
참고

Kafka 리소스의 구성은 KRaft 모드에 적합해야 합니다. 현재 KRaft 모드에 는 여러 가지 제한 사항이 있습니다.

Zoo Cryostat를 사용하여 클러스터의 노드 풀 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: pool-a
  labels:
    strimzi.io/cluster: my-cluster
spec:
  replicas: 3
  roles:
    - broker 
1

  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  resources:
      requests:
        memory: 64Gi
        cpu: "8"
      limits:
        memory: 64Gi
        cpu: "12"

1
노드 풀의 노드에 대한 역할로, Zoo Cryostat와 함께 Kafka를 사용할 때만 브로커 일 수 있습니다.

9.3.1. 확장 작업을 위해 노드 풀에 ID 할당

다음 절차에서는 노드 풀에서 스케일링 작업을 수행할 때 Cluster Operator에서 고급 노드 ID 처리에 주석을 사용하는 방법을 설명합니다. 다음 ID를 사용하여 Cluster Operator 대신 사용할 노드 ID를 지정합니다. 이러한 방식으로 노드 ID를 관리하면 제어가 향상됩니다.

ID 범위를 추가하려면 KafkaNodePool 리소스에 다음 주석을 할당합니다.

  • Strimzi.io/next-node-ids 는 새 브로커에 사용되는 다양한 ID를 추가합니다.
  • Strimzi.io/remove-node-ids: 기존 브로커를 제거하기 위한 ID 범위 추가

개별 노드 ID, ID 범위 또는 둘 다의 조합을 지정할 수 있습니다. 예를 들어 Kafka 노드 풀을 확장하기 위해 [0, 1, 2, 10-20, 30] 의 범위를 지정할 수 있습니다. 이 형식을 사용하면 개별 노드 ID(0,1,2,30)와 다양한 ID(10-20)의 조합을 지정할 수 있습니다.

일반적인 시나리오에서는 스케일링을 위한 ID 범위와 축소 시 특정 노드를 제거하기 위해 단일 노드 ID를 지정할 수 있습니다.

이 절차에서는 다음과 같이 노드 풀에 확장 주석을 추가합니다.

  • pool-a 에는 확장하기 위한 ID 범위가 할당됩니다.
  • pool-b 에는 축소를 위한 ID 범위가 할당됩니다.

스케일링 작업 중에 ID는 다음과 같이 사용됩니다.

  • 스케일 업은 새 노드의 범위에서 사용 가능한 가장 낮은 ID를 선택합니다.
  • 축소는 범위에서 사용 가능한 ID가 가장 높은 노드를 제거합니다.

노드 풀에서 할당된 노드 ID 시퀀스에 차이가 있는 경우 추가할 다음 노드에 격차를 채우는 ID가 할당됩니다.

주석은 모든 확장 작업 후에 업데이트할 필요가 없습니다. 사용되지 않는 ID는 다음 확장 이벤트에서 계속 유효합니다.

Cluster Operator를 사용하면 오름차순 또는 내림차순으로 ID 범위를 지정할 수 있으므로 노드가 스케일링되는 순서대로 정의할 수 있습니다. 예를 들어 확장 시 [1000-1999] 와 같은 범위를 지정할 수 있으며 새 노드에는 가장 낮은 ID 1000,1001,1002,1003 등이 할당됩니다. 반대로 축소할 때 [1999-1000] 과 같은 범위를 지정하여 다음 ID가 가장 높은 노드가 제거되도록 할 수 있습니다: 1003,1002,1001,1000 등.

주석을 사용하여 ID 범위를 지정하지 않으면 Cluster Operator는 스케일링 작업 중에 ID를 처리하기 위해 기본 동작을 따릅니다. 노드 ID는 0(영)에서 시작하고 Kafka 클러스터에서 순차적으로 실행됩니다. 다음으로 가장 낮은 ID가 새 노드에 할당됩니다. 노드 ID의 격차는 클러스터 전체에서 채워집니다. 즉 노드 풀 내에서 순차적으로 실행되지 않을 수 있습니다. 확장의 기본 동작은 클러스터에서 사용 가능한 다음 노드 ID를 추가하고 축소의 경우 사용 가능한 노드 ID가 가장 높은 노드 풀에서 노드를 제거하는 것입니다. 기본 접근 방식은 할당된 ID 범위가 잘못 포맷되거나 확장 범위가 ID가 부족하거나 축소 범위가 사용 중인 노드에 적용되지 않는 경우에도 적용됩니다.

사전 요구 사항

기본적으로 Apache Kafka는 노드 ID를 0에서 999 사이의 숫자로 제한합니다. 999보다 큰 노드 ID 값을 사용하려면 reserved.broker-max.id 구성 속성을 Kafka 사용자 정의 리소스에 추가하고 필요한 최대 노드 ID 값을 지정합니다.

이 예에서 최대 노드 ID는 10000으로 설정됩니다. 그러면 노드 ID를 해당 값까지 할당할 수 있습니다.

최대 노드 ID 번호 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    config:
      reserved.broker.max.id: 10000
  # ...

프로세스

  1. 다음 예와 같이 확장 또는 축소할 때 사용할 ID로 노드 풀에 주석을 답니다.

    확장의 ID는 노드 풀 pool-a 에 할당됩니다.

    확장에 ID 할당

    oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"

    이 범위에서 사용 가능한 가장 낮은 ID는 pool-a 에 노드를 추가할 때 사용됩니다.

    축소할 ID는 노드 풀 pool-b 에 할당됩니다.

    축소를 위한 ID 할당

    oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"

    pool-b 를 축소할 때 이 범위에서 사용 가능한 가장 높은 ID가 제거됩니다.

    참고

    특정 노드를 제거하려면 축소 주석에 단일 노드 ID를 할당할 수 있습니다. oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[3]".

  2. 이제 노드 풀을 확장할 수 있습니다.

    자세한 내용은 다음을 참조하십시오.

    조정 시 주석이 잘못 포맷되면 경고가 표시됩니다.

  3. 확장 작업을 수행한 후 더 이상 필요하지 않은 경우 주석을 제거할 수 있습니다.

    확장을 위한 주석 제거

    oc annotate kafkanodepool pool-a strimzi.io/next-node-ids-

    축소할 주석 제거

    oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids-

9.3.2. 노드 풀에서 노드를 이동할 때 랙에 미치는 영향

Kafka 클러스터에서 랙 인식이 활성화된 경우 복제본을 다양한 랙, 데이터 센터 또는 가용성 영역에 분산할 수 있습니다. 노드 풀에서 노드를 이동할 때 특히 랙 인식과 관련하여 클러스터 토폴로지에 미치는 영향을 고려하십시오. 노드 풀(특히 순서가 부족)에서 특정 Pod를 제거하면 클러스터 토폴로지가 손상되거나 랙 간에 분산이 발생할 수 있습니다. 불균형은 노드 자체의 배포와 클러스터 내의 파티션 복제본 모두에 영향을 미칠 수 있습니다. 랙에서 노드 및 파티션이 균일하게 배포되면 Kafka 클러스터의 성능과 복원력에 영향을 미칠 수 있습니다.

랙에서 필요한 균형과 탄력성을 유지하기 위해 전략적으로 노드 제거를 계획합니다. strimzi.io/remove-node-ids 주석을 사용하여 특정 ID가 있는 노드를 주의해서 이동합니다. 랙에 파티션 복제본을 분배하고 가장 가까운 복제본에서 사용할 클라이언트가 손상되지 않도록 구성해야 합니다.

작은 정보

RackAwareGoal 과 함께 Cruise Control 및 KafkaRebalance 리소스를 사용하여 복제본을 다른 랙에 분산 상태로 유지합니다.

9.3.3. 노드 풀에 노드 추가

다음 절차에서는 노드 풀을 확장하여 새 노드를 추가하는 방법을 설명합니다. 현재 확장은 전용 브로커로 실행되는 노드를 포함하는 브로커 전용 노드 풀에만 가능합니다.

이 절차에서는 노드 풀 풀에 대한 세 개의 노드로 시작합니다.

노드 풀의 Kafka 노드

NAME                 READY  STATUS   RESTARTS
my-cluster-pool-a-0  1/1    Running  0
my-cluster-pool-a-1  1/1    Running  0
my-cluster-pool-a-2  1/1    Running  0

노드 ID는 생성 시 노드 이름에 추가됩니다. 노드 ID가 3my-cluster-pool-a-3 노드를 추가합니다.

참고

이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.

사전 요구 사항

프로세스

  1. 노드 풀에 새 노드를 생성합니다.

    예를 들어 노드 풀 pool-a 에는 세 개의 복제본이 있습니다. 복제본 수를 늘려 노드를 추가합니다.

    oc scale kafkanodepool pool-a --replicas=4
  2. 배포 상태를 확인하고 노드 풀의 포드가 생성되고 준비될 때까지 기다립니다(1/1).

    oc get pods -n <my_cluster_operator_namespace>

    출력에 노드 풀의 Kafka 노드 4개가 표시됩니다.

    NAME                 READY  STATUS   RESTARTS
    my-cluster-pool-a-0  1/1    Running  0
    my-cluster-pool-a-1  1/1    Running  0
    my-cluster-pool-a-2  1/1    Running  0
    my-cluster-pool-a-3  1/1    Running  0

  3. 노드 풀의 노드 수를 늘린 후 파티션을 다시 할당합니다.

    노드 풀을 확장한 후 Cruise Control add-brokers 모드를 사용하여 기존 브로커에서 새로 추가된 브로커로 파티션 복제본을 이동합니다.

    Cruise Control을 사용하여 파티션 복제본 재할당

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      # ...
    spec:
      mode: add-brokers
      brokers: [3]

    my-cluster-pool-a-3 노드에 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.

9.3.4. 노드 풀에서 노드 제거

다음 절차에서는 노드 풀을 축소하여 노드를 제거하는 방법을 설명합니다. 현재 축소는 전용 브로커로 실행되는 노드를 포함하는 브로커 전용 노드 풀에만 가능합니다.

이 절차에서는 노드 풀 의 경우 4개의 노드로 시작합니다.

노드 풀의 Kafka 노드

NAME                 READY  STATUS   RESTARTS
my-cluster-pool-a-0  1/1    Running  0
my-cluster-pool-a-1  1/1    Running  0
my-cluster-pool-a-2  1/1    Running  0
my-cluster-pool-a-3  1/1    Running  0

노드 ID는 생성 시 노드 이름에 추가됩니다. 노드 ID가 3my-cluster-pool-a-3 노드를 삭제합니다.

참고

이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.

사전 요구 사항

프로세스

  1. 노드 풀의 노드 수를 줄이기 전에 파티션을 다시 할당합니다.

    노드 풀을 축소하기 전에 Cruise Control remove-brokers 모드를 사용하여 제거할 브로커에서 파티션 복제본을 이동합니다.

    Cruise Control을 사용하여 파티션 복제본 재할당

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      # ...
    spec:
      mode: remove-brokers
      brokers: [3]

    my-cluster-pool-a-3 노드에서 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.

  2. 재할당 프로세스가 완료되고 제거 중인 노드에 실시간 파티션이 없으면 노드 풀의 Kafka 노드 수를 줄입니다.

    예를 들어 노드 풀 pool-a 에는 4개의 복제본이 있습니다. 복제본 수를 줄여 노드를 제거합니다.

    oc scale kafkanodepool pool-a --replicas=3

    출력에 노드 풀의 Kafka 노드 3개가 표시되어 있습니다.

    NAME                       READY  STATUS   RESTARTS
    my-cluster-pool-b-kafka-0  1/1    Running  0
    my-cluster-pool-b-kafka-1  1/1    Running  0
    my-cluster-pool-b-kafka-2  1/1    Running  0

9.3.5. 노드 풀 간에 노드 이동

다음 절차에서는 다운타임 없이 소스와 대상 Kafka 노드 풀 간에 노드를 이동하는 방법을 설명합니다. 대상 노드 풀에 새 노드를 생성하고 파티션을 다시 할당하여 소스 노드 풀의 이전 노드에서 데이터를 이동합니다. 새 노드의 복제본이 동기화되면 이전 노드를 삭제할 수 있습니다.

이 절차에서는 두 개의 노드 풀로 시작합니다.

  • pool-a (복제 3개)는 대상 노드 풀입니다.
  • pool-b 에 4개의 복제본이 있는 것은 소스 노드 풀입니다.

을 확장하고 파티션을 다시 할당하고 pool-b 를 축소하면 다음이 생성됩니다.

  • pool-a 및 4개의 복제본
  • pool-b 및 세 개의 복제본
참고

이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.

사전 요구 사항

프로세스

  1. 대상 노드 풀에 새 노드를 생성합니다.

    예를 들어 노드 풀 pool-a 에는 세 개의 복제본이 있습니다. 복제본 수를 늘려 노드를 추가합니다.

    oc scale kafkanodepool pool-a --replicas=4
  2. 배포 상태를 확인하고 노드 풀의 포드가 생성되고 준비될 때까지 기다립니다(1/1).

    oc get pods -n <my_cluster_operator_namespace>

    출력에는 소스 및 대상 노드 풀의 Kafka 노드 4개가 표시됩니다.

    NAME                 READY  STATUS   RESTARTS
    my-cluster-pool-a-0  1/1    Running  0
    my-cluster-pool-a-1  1/1    Running  0
    my-cluster-pool-a-4  1/1    Running  0
    my-cluster-pool-a-7  1/1    Running  0
    my-cluster-pool-b-2  1/1    Running  0
    my-cluster-pool-b-3  1/1    Running  0
    my-cluster-pool-b-5  1/1    Running  0
    my-cluster-pool-b-6  1/1    Running  0

    노드 ID는 생성 시 노드 이름에 추가됩니다. 노드 ID가 7my-cluster-pool-a-7 노드를 추가합니다.

  3. 이전 노드의 파티션을 새 노드에 다시 할당합니다.

    소스 노드 풀을 축소하기 전에 Cruise Control remove-brokers 모드를 사용하여 제거할 브로커에서 파티션 복제본을 이동합니다.

    Cruise Control을 사용하여 파티션 복제본 재할당

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      # ...
    spec:
      mode: remove-brokers
      brokers: [6]

    my-cluster-pool-b-6 노드에서 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.

  4. 재할당 프로세스가 완료되면 소스 노드 풀의 Kafka 노드 수를 줄입니다.

    예를 들어 노드 풀 pool-b 에는 4개의 복제본이 있습니다. 복제본 수를 줄여 노드를 제거합니다.

    oc scale kafkanodepool pool-b --replicas=3

    풀 내에서 ID가 가장 높은 (6) 노드가 제거됩니다.

    출력에 소스 노드 풀의 Kafka 노드 3개가 표시되어 있습니다.

    NAME                       READY  STATUS   RESTARTS
    my-cluster-pool-b-kafka-2  1/1    Running  0
    my-cluster-pool-b-kafka-3  1/1    Running  0
    my-cluster-pool-b-kafka-5  1/1    Running  0

9.3.6. 노드 풀 역할 변경

노드 풀은 KRaft 모드에서 작동하는 Kafka 클러스터( Kafka Raft 메타데이터 사용)와 함께 사용하거나 메타데이터 관리에 Zoo Cryostat를 사용할 수 있습니다. KRaft 모드를 사용하는 경우 노드 풀의 모든 노드가 브로커, 컨트롤러 또는 둘 다로 작동하도록 역할을 지정할 수 있습니다. Zoo Cryostat를 사용하는 경우 노드는 브로커로만 설정해야 합니다.

특정 상황에서는 노드 풀에 할당된 역할을 변경해야 할 수 있습니다. 예를 들어 이중 브로커 및 컨트롤러 역할을 수행하는 노드가 포함된 노드 풀이 있고 두 노드 풀 간에 역할을 분할하도록 결정할 수 있습니다. 이 경우 브로커로만 작동하는 노드를 사용하여 새 노드 풀을 생성한 다음 이중 역할 노드의 파티션을 새 브로커에 다시 할당합니다. 그런 다음 기존 노드 풀을 컨트롤러 전용 역할로 전환할 수 있습니다.

컨트롤러 전용 및 브로커 전용 역할이 있는 노드 풀에서 이중 브로커 및 컨트롤러 역할을 수행하는 노드가 포함된 노드 풀로 이동하여 역방향 작업을 수행할 수도 있습니다. 이 경우 기존 컨트롤러 전용 노드 풀에 broker 역할을 추가하고 브로커 전용 노드의 파티션을 듀얼 역할 노드에 다시 할당한 다음 broker-only 노드 풀을 삭제합니다.

노드 풀 구성에서 브로커 역할을 제거할 때 Kafka에서 파티션을 자동으로 다시 할당하지 않습니다. 브로커 역할을 제거하기 전에 노드가 컨트롤러 전용 역할로 변경해도 파티션이 할당되지 않았는지 확인합니다. 파티션이 할당되면 변경 사항이 발생하지 않습니다. 브로커 역할을 제거하기 전에 노드에 복제본이 남아 있지 않아야 합니다. 역할을 변경하기 전에 파티션을 다시 할당하는 가장 좋은 방법은 remove-brokers 모드에서 Cruise Control 최적화 제안을 적용하는 것입니다. 자세한 내용은 19.6절. “최적화 제안 생성”의 내용을 참조하십시오.

9.3.7. 별도의 브로커 및 컨트롤러 역할로 전환

다음 절차에서는 별도의 역할이 있는 노드 풀 사용으로 전환하는 방법을 설명합니다. Kafka 클러스터에서 컨트롤러 및 브로커 역할이 결합된 노드 풀을 사용하는 경우 별도의 역할이 있는 두 개의 노드 풀을 사용하여 전환할 수 있습니다. 이렇게 하려면 브로커 전용 역할이 있는 노드 풀로 파티션 복제본을 이동하도록 클러스터를 재조정한 다음 이전 노드 풀을 컨트롤러 전용 역할로 전환합니다.

이 절차에서는 controllerbroker 역할이 있는 노드 풀 풀(a )으로 시작합니다.

듀얼 역할 노드 풀

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: pool-a
  labels:
    strimzi.io/cluster: my-cluster
spec:
  replicas: 3
  roles:
    - controller
    - broker
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 20Gi
        deleteClaim: false
  # ...

노드 풀에는 세 개의 노드가 있습니다.

노드 풀의 Kafka 노드

NAME                 READY  STATUS   RESTARTS
my-cluster-pool-a-0  1/1    Running  0
my-cluster-pool-a-1  1/1    Running  0
my-cluster-pool-a-2  1/1    Running  0

각 노드는 브로커 및 컨트롤러의 결합된 역할을 수행합니다. 브로커로만 작동하는 노드 3개를 사용하여 pool-b 라는 두 번째 노드 풀을 생성합니다.

참고

이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.

프로세스

  1. 브로커 역할을 사용하여 노드 풀을 생성합니다.

    노드 풀 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-b
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      roles:
        - broker
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false
      # ...

    새 노드 풀에는 세 개의 노드도 있습니다. 브로커 전용 노드 풀이 이미 있는 경우 이 단계를 건너뛸 수 있습니다.

  2. KafkaNodePool 리소스를 적용하여 브로커를 생성합니다.
  3. 배포 상태를 확인하고 노드 풀의 포드가 생성되고 준비될 때까지 기다립니다(1/1).

    oc get pods -n <my_cluster_operator_namespace>

    출력에서 두 노드 풀에서 실행 중인 Pod 표시

    NAME                 READY  STATUS   RESTARTS
    my-cluster-pool-a-0  1/1    Running  0
    my-cluster-pool-a-1  1/1    Running  0
    my-cluster-pool-a-2  1/1    Running  0
    my-cluster-pool-b-3  1/1    Running  0
    my-cluster-pool-b-4  1/1    Running  0
    my-cluster-pool-b-5  1/1    Running  0

    노드 ID는 생성 시 노드 이름에 추가됩니다.

  4. Cruise Control remove-brokers 모드를 사용하여 이중 역할 노드에서 새로 추가된 브로커에 파티션 복제본을 다시 할당합니다.

    Cruise Control을 사용하여 파티션 복제본 재할당

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      # ...
    spec:
      mode: remove-brokers
      brokers: [0, 1, 2]

    재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.

    참고

    노드가 컨트롤러 전용 역할로 변경되면 파티션이 할당되지 않습니다. Kafka 리소스의 status.conditions 는 변경을 방지하는 이벤트에 대한 세부 정보를 제공합니다.

  5. 원래 결합된 역할이 있는 노드 풀에서 브로커 역할을 제거합니다.

    컨트롤러로 전환된 듀얼 역할 노드

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-a
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      roles:
        - controller
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 20Gi
            deleteClaim: false
      # ...

  6. 노드 풀이 컨트롤러 전용 역할로 전환되도록 구성 변경을 적용합니다.

9.3.8. 이중 역할 노드로 전환

다음 절차에서는 broker-only 및 controller-only 역할이 있는 별도의 노드 풀에서 듀얼 역할 노드 풀을 사용하는 방법을 설명합니다. Kafka 클러스터에서 전용 컨트롤러 및 브로커 노드가 있는 노드 풀을 사용하는 경우 두 역할이 모두 있는 단일 노드 풀을 사용하도록 전환할 수 있습니다. 이렇게 하려면 controller 전용 노드 풀에 broker 역할을 추가하고 파티션 복제본을 듀얼 역할 노드 풀로 이동한 다음 이전 브로커 전용 노드 풀을 삭제하도록 클러스터를 재조정합니다.

이 절차에서는 브로커 역할만 있는 controller 역할과 pool-b 만 있는 두 개의 노드 풀 풀(a )으로 시작합니다.

단일 역할 노드 풀

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: pool-a
  labels:
    strimzi.io/cluster: my-cluster
spec:
  replicas: 3
  roles:
    - controller
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  # ...
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: pool-b
  labels:
    strimzi.io/cluster: my-cluster
spec:
  replicas: 3
  roles:
    - broker
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  # ...

Kafka 클러스터에는 6개의 노드가 있습니다.

노드 풀의 Kafka 노드

NAME                 READY  STATUS   RESTARTS
my-cluster-pool-a-0  1/1    Running  0
my-cluster-pool-a-1  1/1    Running  0
my-cluster-pool-a-2  1/1    Running  0
my-cluster-pool-b-3  1/1    Running  0
my-cluster-pool-b-4  1/1    Running  0
my-cluster-pool-b-5  1/1    Running  0

pool-a 노드는 controller 역할을 수행합니다. pool-b 노드는 브로커 역할을 수행합니다.

참고

이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.

프로세스

  1. 노드 풀 pool-a 를 편집하고 broker 역할을 추가합니다.

    노드 풀 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-a
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      roles:
        - controller
        - broker
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false
      # ...

  2. 상태를 확인하고 노드 풀의 포드가 재시작될 때까지 기다린 후 준비합니다(1/1).

    oc get pods -n <my_cluster_operator_namespace>

    출력에서 두 노드 풀에서 실행 중인 Pod 표시

    NAME                 READY  STATUS   RESTARTS
    my-cluster-pool-a-0  1/1    Running  0
    my-cluster-pool-a-1  1/1    Running  0
    my-cluster-pool-a-2  1/1    Running  0
    my-cluster-pool-b-3  1/1    Running  0
    my-cluster-pool-b-4  1/1    Running  0
    my-cluster-pool-b-5  1/1    Running  0

    노드 ID는 생성 시 노드 이름에 추가됩니다.

  3. Cruise Control remove-brokers 모드를 사용하여 브로커 전용 노드에서 듀얼 역할 노드에 파티션 복제본을 다시 할당합니다.

    Cruise Control을 사용하여 파티션 복제본 재할당

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      # ...
    spec:
      mode: remove-brokers
      brokers: [3, 4, 5]

    재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.

  4. 이전 브로커 전용 노드가 있는 pool-b 노드 풀을 제거합니다.

    oc delete kafkanodepool pool-b -n <my_cluster_operator_namespace>

9.3.9. 노드 풀을 사용하여 스토리지 관리

Apache Kafka용 Streams의 스토리지 관리는 일반적으로 간단하며 설정할 때 거의 변경되지 않아도 되지만 스토리지 구성을 수정해야 하는 상황이 있을 수 있습니다. 노드 풀은 새 스토리지 요구 사항을 지정하는 별도의 노드 풀을 설정할 수 있으므로 이 프로세스를 단순화합니다.

이 절차에서는 세 개의 노드가 포함된 pool-a 노드 풀의 스토리지를 생성하고 관리합니다. 사용하는 영구 스토리지 유형을 정의하는 스토리지 클래스(volume.class)를 변경하는 방법을 보여줍니다. 동일한 단계를 사용하여 스토리지 크기(volume.size )를 변경할 수 있습니다.

참고

블록 스토리지를 사용하는 것이 좋습니다. Apache Kafka의 스트림은 블록 스토리지에서만 사용하도록 테스트됩니다.

사전 요구 사항

프로세스

  1. 자체 스토리지 설정으로 노드 풀을 생성합니다.

    예를 들어 노드 풀은 영구 볼륨에서 JBOD 스토리지를 사용합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-a
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 500Gi
            class: gp2-ebs
      # ...

    pool-a 의 노드는 Amazon EBS (Elastic Block Store) GP2 볼륨을 사용하도록 구성되어 있습니다.

  2. pool-a 에 대한 노드 풀 구성을 적용합니다.
  3. 배포 상태를 확인하고 pool-a 의 포드가 생성되고 준비될 때까지 기다립니다(1/1).

    oc get pods -n <my_cluster_operator_namespace>

    출력에 노드 풀의 Kafka 노드 3개가 표시되어 있습니다.

    NAME                 READY  STATUS   RESTARTS
    my-cluster-pool-a-0  1/1    Running  0
    my-cluster-pool-a-1  1/1    Running  0
    my-cluster-pool-a-2  1/1    Running  0

  4. 새 스토리지 클래스로 마이그레이션하려면 필요한 스토리지 구성을 사용하여 새 노드 풀을 생성합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-b
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      roles:
        - broker
      replicas: 3
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 1Ti
            class: gp3-ebs
      # ...

    pool-b 의 노드는 Amazon EBS (Elastic Block Store) GP3 볼륨을 사용하도록 구성됩니다.

  5. pool-b 에 대한 노드 풀 구성을 적용합니다.
  6. 배포 상태를 확인하고 pool-b 의 포드가 생성되고 준비될 때까지 기다립니다.
  7. pool-a 의 파티션을 pool-b 에 다시 할당합니다.

    새 스토리지 구성으로 마이그레이션할 때 Cruise Control remove-brokers 모드를 사용하여 제거하려는 브로커에서 파티션 복제본을 이동합니다.

    Cruise Control을 사용하여 파티션 복제본 재할당

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      # ...
    spec:
      mode: remove-brokers
      brokers: [0, 1, 2]

    pool-a 에서 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.

  8. 재할당 프로세스가 완료되면 이전 노드 풀을 삭제합니다.

    oc delete kafkanodepool pool-a

9.3.10. 노드 풀을 사용하여 스토리지 유사성 관리

로컬 영구 볼륨과 같은 스토리지 리소스가 특정 작업자 노드 또는 가용성 영역으로 제한되는 경우 스토리지 선호도를 구성하면 올바른 노드를 사용하도록 Pod를 예약하는 데 도움이 됩니다.

노드 풀을 사용하면 선호도를 독립적으로 구성할 수 있습니다. 이 절차에서는 zone-1zone-2 의 두 가용 영역에 대한 스토리지 선호도를 생성하고 관리합니다.

별도의 가용성 영역에 대해 노드 풀을 구성할 수 있지만 동일한 스토리지 클래스를 사용합니다. 각 영역에서 사용 가능한 스토리지 리소스를 나타내는 all-zones 영구 스토리지 클래스를 정의합니다.

또한 .spec.template.pod 속성을 사용하여 노드 유사성을 구성하고 zone-1zone-2 작업자 노드에서 Kafka Pod를 예약합니다.

스토리지 클래스 및 유사성은 각 가용성 영역의 노드를 나타내는 노드 풀에 지정됩니다.

  • pool-zone-1
  • pool-zone-2.

프로세스

  1. 각 가용성 영역에 사용할 스토리지 클래스를 정의합니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: all-zones
    provisioner: kubernetes.io/my-storage
    parameters:
      type: ssd
    volumeBindingMode: WaitForFirstConsumer
  2. all-zones 스토리지 클래스와 각 영역의 선호도를 지정하여 두 가용 영역을 나타내는 노드 풀을 생성합니다.

    zone-1의 노드 풀 구성

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-zone-1
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 500Gi
            class: all-zones
      template:
        pod:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                    - key: topology.kubernetes.io/zone
                      operator: In
                      values:
                      - zone-1
      # ...

    zone-2에 대한 노드 풀 구성

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-zone-2
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 4
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 500Gi
            class: all-zones
      template:
        pod:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                    - key: topology.kubernetes.io/zone
                      operator: In
                      values:
                      - zone-2
      # ...

  3. 노드 풀 구성을 적용합니다.
  4. 배포 상태를 확인하고 노드 풀의 Pod가 생성되고 준비될 때까지 기다립니다(1/1).

    oc get pods -n <my_cluster_operator_namespace>

    output은 pool-zone-1 의 Kafka 노드 3개와 pool-zone-2의 Kafka 노드 4개를 보여줍니다.

    NAME                            READY  STATUS   RESTARTS
    my-cluster-pool-zone-1-kafka-0  1/1    Running  0
    my-cluster-pool-zone-1-kafka-1  1/1    Running  0
    my-cluster-pool-zone-1-kafka-2  1/1    Running  0
    my-cluster-pool-zone-2-kafka-3  1/1    Running  0
    my-cluster-pool-zone-2-kafka-4  1/1    Running  0
    my-cluster-pool-zone-2-kafka-5  1/1    Running  0
    my-cluster-pool-zone-2-kafka-6  1/1    Running  0

9.3.11. Kafka 노드 풀을 사용하도록 기존 Kafka 클러스터 마이그레이션

다음 절차에서는 Kafka 노드 풀을 사용하도록 기존 Kafka 클러스터를 마이그레이션하는 방법을 설명합니다. Kafka 클러스터를 업데이트한 후 노드 풀을 사용하여 각 풀 내의 노드 구성을 관리할 수 있습니다.

참고

현재 KafkaNodePool 리소스의 복제본 및 스토리지 구성도 Kafka 리소스에 있어야 합니다. 노드 풀이 사용 중인 경우 구성이 무시됩니다.

프로세스

  1. KafkaNodePool 리소스를 생성합니다.

    1. 리소스 이름을 kafka 로 지정합니다.
    2. strimzi.io/cluster 레이블을 기존 Kafka 리소스를 지정합니다.
    3. 현재 Kafka 클러스터와 일치하도록 복제본 수 및 스토리지 구성을 설정합니다.
    4. 역할을 브로커로 설정합니다.

    Kafka 클러스터 마이그레이션에 사용되는 노드 풀 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: kafka
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      roles:
        - broker
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false

    주의

    클러스터 데이터와 해당 노드 및 리소스의 이름을 유지하려면 노드 풀 이름은 kafka 여야 하며 strimzi.io/cluster 레이블은 Kafka 리소스 이름과 일치해야 합니다. 그렇지 않으면 노드에서 사용하는 영구 볼륨 스토리지를 포함하여 새 이름으로 노드 및 리소스가 생성됩니다. 따라서 이전 데이터를 사용할 수 없습니다.

  2. KafkaNodePool 리소스를 적용합니다.

    oc apply -f <node_pool_configuration_file>

    이 리소스를 적용하면 노드 풀을 사용하여 Kafka를 로 전환합니다.

    변경 또는 롤링 업데이트가 없으며 리소스는 이전과 동일합니다.

  3. strimzi.io/node-pools: enabled 주석을 사용하여 Kafka 리소스에서 노드 풀에 대한 지원을 활성화합니다.

    Zoo Cryostat를 사용하여 클러스터의 노드 풀 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      annotations:
        strimzi.io/node-pools: enabled
    spec:
      kafka:
        # ...
      zookeeper:
        # ...

  4. Kafka 리소스를 적용합니다.

    oc apply -f <kafka_configuration_file>

    변경 또는 롤링 업데이트가 없습니다. 리소스는 이전과 동일하게 유지됩니다.

  5. Kafka 사용자 정의 리소스에서 복제된 속성을 제거합니다. KafkaNodePool 리소스를 사용 중인 경우 .spec.kafka.replicas.spec.kafka.storage 속성과 같이 KafkaNodePool 리소스에 복사한 속성을 제거할 수 있습니다.

마이그레이션 전환

Kafka 사용자 정의 리소스만 사용하여 Kafka 노드를 관리하려면 다음을 수행합니다.

  1. 노드 풀이 여러 개인 경우 노드 ID가 0에서 N(여기서 N은 복제본 수)을 사용하여 kafka 라는 단일 KafkaNodePool 에 통합합니다.
  2. Kafka 리소스의 .spec.kafka 구성이 스토리지, 리소스 및 복제본을 포함하여 KafkaNodePool 구성과 일치하는지 확인합니다.
  3. strimzi.io/node-pools: disabled 주석을 사용하여 Kafka 리소스에서 노드 풀에 대한 지원을 비활성화합니다.
  4. kafka 라는 Kafka 노드 풀을 삭제합니다.

9.4. Entity Operator 구성

Kafka.spec 에서 entityOperator 속성을 사용하여 Entity Operator를 구성합니다. Entity Operator는 실행 중인 Kafka 클러스터에서 Kafka 관련 엔터티를 관리합니다. 다음과 같은 연산자로 구성됩니다.

  • Kafka 주제를 관리하는 주제 Operator
  • Kafka 사용자를 관리하는 사용자 Operator

Kafka 리소스를 구성하면 Cluster Operator는 하나 또는 두 Operator를 포함하여 Entity Operator를 배포할 수 있습니다. 배포되면 Kafka 클러스터의 주제 및 사용자를 처리하도록 Operator가 자동으로 구성됩니다.

각 Operator는 단일 네임스페이스만 모니터링할 수 있습니다. 자세한 내용은 1.2.1절. “OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 스트림 감시”의 내용을 참조하십시오.

entityOperator 속성은 여러 하위 속성을 지원합니다.

  • tlsSidecar
  • topicOperator
  • userOperator
  • 템플릿

tlsSidecar 속성에는 Zoo Cryostat와 통신하는 데 사용되는 TLS 사이드카 컨테이너 구성이 포함되어 있습니다.

template 속성에는 레이블, 주석, 유사성 및 허용 오차와 같은 Entity Operator Pod 구성이 포함되어 있습니다. 템플릿 구성에 대한 자세한 내용은 9.16절. “OpenShift 리소스 사용자 정의” 을 참조하십시오.

topicOperator 속성에는 Topic Operator의 구성이 포함되어 있습니다. 이 옵션이 없으면 Topic Operator 없이 Entity Operator가 배포됩니다.

userOperator 속성에는 User Operator의 구성이 포함되어 있습니다. 이 옵션이 없으면 User Operator 없이 Entity Operator가 배포됩니다.

Entity Operator를 구성하는 데 사용되는 속성에 대한 자세한 내용은 EntityOperatorSpec 스키마 참조를 참조하십시오.

두 Operator를 모두 활성화하는 기본 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
  zookeeper:
    # ...
  entityOperator:
    topicOperator: {}
    userOperator: {}

topicOperatoruserOperator 에 빈 오브젝트({})를 사용하는 경우 모든 속성은 기본값을 사용합니다.

topicOperatoruserOperator 속성이 모두 누락되면 Entity Operator가 배포되지 않습니다.

9.4.1. Topic Operator 구성

Kafka.spec.entityOperatortopicOperator 속성을 사용하여 Topic Operator를 구성합니다.

참고

기본적으로 활성화된 단방향 주제 관리를 사용하는 경우 다음 속성이 사용되지 않으며 무시됩니다. Kafka.spec.entityOperator.topicOperator.zookeeperSessionTimeoutSecondsKafka.spec.entityOperator.topicMetadataMaxAttempts. 리디렉션되지 않은 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 을 참조하십시오.

지원되는 속성은 다음과 같습니다.

watchedNamespace
Topic Operator가 KafkaTopic 리소스를 감시하는 OpenShift 네임스페이스입니다. default는 Kafka 클러스터가 배포된 네임스페이스입니다.
reconciliationIntervalSeconds
주기적 조정(초) 사이의 간격입니다. 기본값 120 입니다.
zookeeperSessionTimeoutSeconds
Zoo Cryostat 세션 시간(초)입니다. 기본값 18.
topicMetadataMaxAttempts
Kafka에서 주제 메타데이터를 가져오는 시도 횟수입니다. 각 시도 사이의 시간은 지수 백오프로 정의됩니다. 파티션 또는 복제본 수로 인해 주제 생성에 더 많은 시간이 걸릴 수 있는 경우 이 값을 늘리는 것이 좋습니다. 기본 6.
image
image 속성은 사용되는 컨테이너 이미지를 구성하는 데 사용할 수 있습니다. 자세한 내용은 image 속성 구성에 제공된 정보를 참조하십시오.
resources
resources 속성은 Topic Operator에 할당된 리소스 양을 구성합니다. 메모리cpu 리소스에 대한 요청 및 제한을 지정할 수 있습니다. 요청은 Operator의 안정적인 성능을 보장하기에 충분해야 합니다.
logging
logging 속성은 Topic Operator의 로깅을 구성합니다. 자세한 내용은 Topic Operator 로깅 에 있는 정보를 참조하십시오.

Topic Operator 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
  zookeeper:
    # ...
  entityOperator:
    # ...
    topicOperator:
      watchedNamespace: my-topic-namespace
      reconciliationIntervalSeconds: 60
      resources:
        requests:
          cpu: "1"
          memory: 500Mi
        limits:
          cpu: "1"
          memory: 500Mi
    # ...

9.4.2. User Operator 구성

Kafka.spec.entityOperator 에서 userOperator 속성을 사용하여 User Operator를 구성합니다. 지원되는 속성은 다음과 같습니다.

watchedNamespace
User Operator가 KafkaUser 리소스를 감시하는 OpenShift 네임스페이스입니다. default는 Kafka 클러스터가 배포된 네임스페이스입니다.
reconciliationIntervalSeconds
주기적 조정(초) 사이의 간격입니다. 기본값 120 입니다.
image
image 속성은 사용할 컨테이너 이미지를 구성하는 데 사용할 수 있습니다. 자세한 내용은 image 속성 구성에 제공된 정보를 참조하십시오.
resources
resources 속성은 User Operator에 할당된 리소스 양을 구성합니다. 메모리cpu 리소스에 대한 요청 및 제한을 지정할 수 있습니다. 요청은 Operator의 안정적인 성능을 보장하기에 충분해야 합니다.
logging
logging 속성은 User Operator의 로깅을 구성합니다. 자세한 내용은 User Operator 로깅 에 제공된 정보를 참조하십시오.
secretPrefix
secretPrefix 속성은 KafkaUser 리소스에서 생성된 모든 시크릿의 이름에 접두사를 추가합니다. 예를 들어 secretPrefix: kafka- 는 모든 시크릿 이름 앞에 kafka- 를 추가합니다. 따라서 my-user 라는 KafkaUser는 kafka-my-user 라는 시크릿을 생성합니다.

User Operator 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
  zookeeper:
    # ...
  entityOperator:
    # ...
    userOperator:
      watchedNamespace: my-user-namespace
      reconciliationIntervalSeconds: 60
      resources:
        requests:
          cpu: "1"
          memory: 500Mi
        limits:
          cpu: "1"
          memory: 500Mi
    # ...

9.5. Cluster Operator 구성

환경 변수를 사용하여 Cluster Operator를 구성합니다. 배포 구성 파일에서 Cluster Operator의 컨테이너 이미지에 대한 환경 변수를 지정합니다. 다음 환경 변수를 사용하여 Cluster Operator를 구성할 수 있습니다. 대기 모드에서 Cluster Operator 복제본을 실행하는 경우 리더 선택을 활성화하는 추가 환경 변수가 있습니다.

Kafka, Kafka Connect 및 Kafka MirrorMaker는 여러 버전을 지원합니다. STRIMZI_<COMPONENT_NAME>_IMAGES 환경 변수를 사용하여 각 버전에 사용되는 기본 컨테이너 이미지를 구성합니다. 구성은 버전과 이미지 간의 매핑을 제공합니다. 필수 구문은 공백 또는 쉼표로 구분된 < version> = <image > 쌍으로 되어 지정된 버전에 사용할 이미지를 결정합니다. 예: 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0. 구성 요소의 구성에 image 속성 값이 지정된 경우 기본 이미지가 재정의됩니다. 구성 요소의 이미지 구성에 대한 자세한 내용은 Apache Kafka 사용자 정의 리소스 API 참조 에서 참조하십시오.

참고

Apache Kafka 릴리스 아티팩트용 Streams와 함께 제공되는 배포 구성 파일은 install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml 입니다.

STRIMZI_NAMESPACE

Operator가 작동하는 쉼표로 구분된 네임스페이스 목록입니다. 설정되지 않거나 빈 문자열로 설정하거나 * 로 설정하면 Cluster Operator가 모든 네임스페이스에서 작동합니다.

Cluster Operator 배포에서는 Downward API를 사용하여 Cluster Operator가 배포된 네임스페이스로 자동으로 설정할 수 있습니다.

Cluster Operator 네임스페이스 구성 예

env:
  - name: STRIMZI_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace

STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
선택 사항이며 기본값은 120000 ms입니다. 주기적 조정 간격(밀리초)입니다.
STRIMZI_OPERATION_TIMEOUT_MS
선택 사항인 기본 300000 ms. 내부 작업에 대한 제한 시간(밀리초)입니다. 일반 OpenShift 작업이 일반 OpenShift 작업보다 오래 걸리는 클러스터에서 Apache Kafka에 Streams를 사용할 때 (예: 컨테이너 이미지의 긴 다운로드 시간과 같은 요인으로 인해) 이 값을 늘립니다.
STRIMZI_ZOOKEEPER_ADMIN_SESSION_TIMEOUT_MS
선택 사항인 기본 10000 ms. Cluster Operator의 Zoo Cryostat 관리자 클라이언트의 세션 제한 시간(밀리초)입니다. 시간 초과 문제로 인해 Cluster Operator의 Zoo Cryostat 요청이 정기적으로 실패하는 경우 값을 늘립니다. maxSessionTimeout 구성을 통해 Zoo Cryostat 서버 측에 허용되는 최대 세션 시간이 설정됩니다. 기본적으로 최대 세션 시간 제한 값은 40000ms의 기본 tickTime (기본값은 2000초)의 20배입니다. 시간 초과가 더 필요한 경우 maxSessionTimeout Zoo Cryostat 서버 구성 값을 변경합니다.
STRIMZI_OPERATIONS_THREAD_POOL_SIZE
선택 사항, 기본 10. 작업자 스레드 풀 크기: Cluster Operator에서 실행하는 다양한 비동기 및 차단 작업에 사용됩니다.
STRIMZI_OPERATOR_NAME
선택 사항이며 기본값은 Pod의 호스트 이름입니다. Operator 이름은 OpenShift 이벤트를 발송 할 때 Apache Kafka 인스턴스의 Streams를 식별합니다.
STRIMZI_OPERATOR_NAMESPACE

Cluster Operator가 실행 중인 네임스페이스의 이름입니다. 이 변수를 수동으로 구성하지 마십시오. Downward API를 사용합니다.

env:
  - name: STRIMZI_OPERATOR_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
STRIMZI_OPERATOR_NAMESPACE_LABELS

선택 사항: Apache Kafka Cluster Operator의 Streams가 실행 중인 네임스페이스의 레이블입니다. 네임스페이스 레이블을 사용하여 네트워크 정책에서 네임스페이스 선택기를 구성합니다. 네트워크 정책을 사용하면 Apache Kafka Cluster Operator의 Streams for Apache Kafka Cluster Operator가 이러한 레이블이 있는 네임스페이스에서 피연산자에만 액세스할 수 있습니다. 설정되지 않은 경우 OpenShift 클러스터의 네임스페이스에서 Cluster Operator에 액세스할 수 있도록 네트워크 정책의 네임스페이스 선택기가 구성됩니다.

env:
  - name: STRIMZI_OPERATOR_NAMESPACE_LABELS
    value: label1=value1,label2=value2
STRIMZI_LABELS_EXCLUSION_PATTERN

선택 사항인 기본 regex 패턴은 ^app.kubernetes.io/(?!part-of).* 입니다. 기본 사용자 정의 리소스의 레이블 전파를 해당 하위 리소스로 필터링하는 데 사용되는 regex 제외 패턴입니다. 레이블 제외 필터는 spec.kafka.template.pod.metadata.labels 와 같은 템플릿 섹션의 레이블에는 적용되지 않습니다.

env:
  - name: STRIMZI_LABELS_EXCLUSION_PATTERN
    value: "^key1.*"
STRIMZI_CUSTOM_<COMPONENT_NAME>_LABELS

선택 사항: 구성 요소의 사용자 정의 리소스에서 생성한 모든 Pod에 적용할 하나 이상의 사용자 지정 레이블입니다. 사용자 정의 리소스가 생성되거나 다음에 조정될 때 Cluster Operator에서 Pod에 레이블을 지정합니다.

라벨은 다음 구성 요소에 적용할 수 있습니다.

  • KAFKA
  • KAFKA_CONNECT
  • KAFKA_CONNECT_BUILD
  • ZOOKEEPER
  • ENTITY_OPERATOR
  • KAFKA_MIRROR_MAKER2
  • KAFKA_MIRROR_MAKER
  • CRUISE_CONTROL
  • KAFKA_BRIDGE
  • KAFKA_EXPORTER
STRIMZI_CUSTOM_RESOURCE_SELECTOR

선택 사항: Cluster Operator에서 처리하는 사용자 정의 리소스를 필터링하는 라벨 선택기입니다. Operator는 지정된 라벨이 설정된 사용자 정의 리소스에서만 작동합니다. 이러한 레이블이 없는 리소스는 Operator에서 볼 수 없습니다. 라벨 선택기는 Kafka , Kafka Connect,KafkaBridge,KafkaMirrorMakerKafkaMirrorMaker2 리소스에 적용됩니다. KafkaRebalanceKafkaConnector 리소스는 해당 Kafka 및 Kafka Connect 클러스터에 일치하는 라벨이 있는 경우에만 작동합니다.

env:
  - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR
    value: label1=value1,label2=value2
STRIMZI_KAFKA_IMAGES
필수 항목입니다. Kafka 버전에서 해당 버전의 Kafka 브로커가 포함된 해당 이미지로 매핑됩니다. 예: 3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0.
STRIMZI_KAFKA_CONNECT_IMAGES
필수 항목입니다. Kafka 버전에서 해당 버전의 Kafka Connect 이미지로의 매핑입니다. 예: 3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0.
STRIMZI_KAFKA_MIRROR_MAKER2_IMAGES
필수 항목입니다. Kafka 버전에서 해당 버전의 MirrorMaker 2 이미지로의 매핑입니다. 예: 3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0.
(더 이상 사용되지 않음) STRIMZI_KAFKA_MIRROR_MAKER_IMAGES
필수 항목입니다. Kafka 버전에서 해당 버전의 MirrorMaker 이미지로의 매핑입니다. 예: 3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0.
STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE
선택 사항: 기본값은 registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 입니다. Kafka 리소스에서 이미지가 Kafka.spec.entityOperator.topicOperator.image 로 지정되지 않은 경우 Topic Operator를 배포할 때 기본값으로 사용할 이미지 이름입니다.
STRIMZI_DEFAULT_USER_OPERATOR_IMAGE
선택 사항: 기본값은 registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 입니다. 이미지가 Kafka 리소스에 Kafka.spec.entityOperator.userOperator.image 로 지정되지 않은 경우 User Operator를 배포할 때 사용할 이미지 이름입니다.
STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE
선택 사항: 기본값은 registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 입니다. Kafka 리소스의 Kafka.spec.entityOperator.tlsSidecar.image 로 지정되지 않은 경우 Entity Operator에 사이드카 컨테이너를 배포할 때 사용할 이미지 이름입니다. 사이드카는 TLS 지원을 제공합니다.
STRIMZI_DEFAULT_KAFKA_EXPORTER_IMAGE
선택 사항: 기본값은 registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 입니다. 이미지가 Kafka 리소스에서 Kafka.spec.kafkaExporter.image 로 지정되지 않은 경우 Kafka Exporter를 배포할 때 사용할 이미지 이름입니다.
STRIMZI_DEFAULT_CRUISE_CONTROL_IMAGE
선택 사항: 기본값은 registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 입니다. Kafka 리소스에서 이미지가 Kafka.spec.cruiseControl.image 로 지정되지 않은 경우 Cruise Control을 배포할 때 기본값으로 사용할 이미지 이름입니다.
STRIMZI_DEFAULT_KAFKA_BRIDGE_IMAGE
선택 사항: 기본값은 registry.redhat.io/amq-streams/bridge-rhel9:2.7.0 입니다. Kafka 리소스에서 이미지가 Kafka.spec.kafkaBridge.image 로 지정되지 않은 경우 Kafka 브리지를 배포할 때 사용할 이미지 이름입니다.
STRIMZI_DEFAULT_KAFKA_INIT_IMAGE
선택 사항: 기본값은 registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 입니다. Kafka 리소스의 brokerRackInitImage 또는 Kafka Connect 리소스의 clientRackInitImage 에 이미지가 지정되지 않은 경우 Kafka 이니셜라이저 컨테이너의 기본값으로 사용할 이미지 이름입니다. init 컨테이너는 랙 지원과 같은 초기 구성 작업을 위해 Kafka 클러스터보다 먼저 시작됩니다.
STRIMZI_IMAGE_PULL_POLICY
선택 사항: Cluster Operator가 관리하는 모든 Pod의 컨테이너에 적용되는 ImagePullPolicy 입니다. 유효한 값은 Always,IfNotPresentNever 입니다. 지정하지 않으면 OpenShift 기본값이 사용됩니다. 정책을 변경하면 모든 Kafka, Kafka Connect 및 Kafka MirrorMaker 클러스터가 롤링 업데이트됩니다.
STRIMZI_IMAGE_PULL_SECRETS
선택 사항: 쉼표로 구분된 시크릿 이름 목록입니다. 여기에서 참조하는 시크릿에는 컨테이너 이미지를 가져오는 컨테이너 레지스트리에 대한 인증 정보가 포함되어 있습니다. 보안은 Cluster Operator가 생성한 모든 Pod의 imagePullSecrets 속성에 지정됩니다. 이 목록을 변경하면 모든 Kafka, Kafka Connect 및 Kafka MirrorMaker 클러스터의 롤링 업데이트가 생성됩니다.
STRIMZI_KUBERNETES_VERSION

선택 사항: API 서버에서 감지된 OpenShift 버전 정보를 재정의합니다.

OpenShift 버전 덮어쓰기의 구성 예

env:
  - name: STRIMZI_KUBERNETES_VERSION
    value: |
           major=1
           minor=16
           gitVersion=v1.16.2
           gitCommit=c97fe5036ef3df2967d086711e6c0c405941e14b
           gitTreeState=clean
           buildDate=2019-10-15T19:09:08Z
           goVersion=go1.12.10
           compiler=gc
           platform=linux/amd64

KUBERNETES_SERVICE_DNS_DOMAIN

선택 사항: 기본 OpenShift DNS 도메인 이름 접미사를 덮어씁니다.

기본적으로 OpenShift 클러스터에 할당된 서비스에는 기본 접미사 cluster.local 을 사용하는 DNS 도메인 이름이 있습니다.

예를 들어 브로커 kafka-0 의 경우 다음과 같습니다.

<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc.cluster.local

DNS 도메인 이름은 호스트 이름 확인에 사용되는 Kafka 브로커 인증서에 추가됩니다.

클러스터에서 다른 DNS 도메인 이름 접미사를 사용하는 경우 Kafka 브로커와의 연결을 구축하기 위해 KUBERNETES_SERVICE_DNS_DOMAIN 환경 변수를 기본값에서 사용 중인 환경으로 변경합니다.

STRIMZI_CONNECT_BUILD_TIMEOUT_MS
선택 사항인 기본 300000 ms. 추가 커넥터를 사용하여 새 Kafka Connect 이미지를 빌드하는 시간 제한 시간(밀리초)입니다. Apache Kafka에 Streams를 사용하여 많은 커넥터가 포함된 컨테이너 이미지를 빌드하거나 느린 컨테이너 레지스트리를 사용할 때 이 값을 늘리는 것이 좋습니다.
STRIMZI_NETWORK_POLICY_GENERATION

선택 사항, 기본 true. 리소스에 대한 네트워크 정책입니다. 네트워크 정책은 Kafka 구성 요소 간 연결을 허용합니다.

네트워크 정책 생성을 비활성화하려면 이 환경 변수를 false 로 설정합니다. 예를 들어 사용자 지정 네트워크 정책을 사용하려는 경우 이 작업을 수행할 수 있습니다. 사용자 지정 네트워크 정책을 사용하면 구성 요소 간 연결 유지 관리를 더 많이 제어할 수 있습니다.

STRIMZI_DNS_CACHE_TTL
선택 사항인 기본 30 입니다. 로컬 DNS 확인기에서 성공적인 이름 조회를 캐시하는 시간(초)입니다. 모든 음수 값은 캐시를 영구적으로 의미합니다. 0은 캐시가 없으므로 긴 캐싱 정책이 적용되어 연결 오류를 방지하는 데 유용할 수 있습니다.
STRIMZI_POD_SET_RECONCILIATION_ONLY
선택 사항, 기본 false. true 로 설정하면 Cluster Operator가 StrimziPodSet 리소스 및 기타 사용자 정의 리소스(Kafka,KafkaConnect 등)에 대한 변경 사항만 무시됩니다. 이 모드는 필요한 경우 Pod가 다시 생성되지만 클러스터에 다른 변경 사항은 발생하지 않도록 하는 데 유용합니다.
STRIMZI_FEATURE_GATES
선택 사항: 기능 게이트 에 의해 제어되는 기능 및 기능을 활성화하거나 비활성화합니다.
STRIMZI_POD_SECURITY_PROVIDER_CLASS
선택 사항: Pod 및 컨테이너에 대한 보안 컨텍스트 구성을 제공하는 데 사용할 수 있는 플러그형 PodSecurityProvider 클래스에 대한 구성입니다.

9.5.1. 네트워크 정책을 사용하여 Cluster Operator에 대한 액세스 제한

STRIMZI_OPERATOR_NAMESPACE_LABELS 환경 변수를 사용하여 네임스페이스 레이블을 사용하여 Cluster Operator의 네트워크 정책을 설정합니다.

Cluster Operator는 관리하는 리소스 또는 별도의 네임스페이스에서 동일한 네임스페이스에서 실행할 수 있습니다. 기본적으로 STRIMZI_OPERATOR_NAMESPACE 환경 변수는 Downward API를 사용하여 Cluster Operator가 실행 중인 네임스페이스를 찾도록 구성됩니다. Cluster Operator가 리소스와 동일한 네임스페이스에서 실행 중인 경우 로컬 액세스만 필요하며 Apache Kafka용 Streams에서 허용합니다.

Cluster Operator가 관리하는 리소스에 대해 별도의 네임스페이스에서 실행 중인 경우 네트워크 정책이 구성되지 않은 경우 OpenShift 클러스터의 모든 네임스페이스가 Cluster Operator에 액세스할 수 있습니다. 네임스페이스 레이블을 추가하면 Cluster Operator에 대한 액세스 권한이 지정된 네임스페이스로 제한됩니다.

Cluster Operator 배포에 대해 구성된 네트워크 정책

#...
env:
  # ...
  - name: STRIMZI_OPERATOR_NAMESPACE_LABELS
    value: label1=value1,label2=value2
  #...

9.5.2. 사용자 정의 리소스의 정기적인 조정 설정

STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 변수를 사용하여 Cluster Operator의 정기적인 조정을 위한 시간 간격을 설정합니다. 해당 값을 필요한 간격(밀리초)으로 바꿉니다.

Cluster Operator 배포에 구성된 조정 기간

#...
env:
  # ...
  - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
    value: "120000"
  #...

Cluster Operator는 OpenShift 클러스터에서 수신한 적용 가능한 클러스터 리소스에 대한 모든 알림에 응답합니다. Operator가 실행 중이 아니거나 어떤 이유로든 알림이 수신되지 않으면 리소스가 실행 중인 OpenShift 클러스터 상태와 동기화되지 않습니다. 페일오버를 올바르게 처리하기 위해 Cluster Operator가 정기적으로 조정 프로세스를 실행하여 리소스 상태를 현재 클러스터 배포와 비교하여 모든 노드에서 일관된 상태를 유지할 수 있습니다.

9.5.3. 주석을 사용하여 사용자 정의 리소스 조정 일시 중지

수정 사항을 수행하거나 업데이트할 수 있도록 Streams for Apache Kafka Operator에서 관리하는 사용자 정의 리소스의 조정을 일시 중지하는 것이 유용한 경우도 있습니다. 조정이 일시 중지되면 일시 중지가 종료될 때까지 Operator가 사용자 정의 리소스에 대한 변경 사항을 무시합니다.

사용자 정의 리소스의 조정을 일시 중지하려면 구성에서 strimzi.io/pause-reconciliation 주석을 true 로 설정합니다. 이렇게 하면 적절한 Operator가 사용자 정의 리소스의 조정을 일시 중지하도록 지시합니다. 예를 들어 Cluster Operator의 조정이 일시 중지되도록 KafkaConnect 리소스에 주석을 적용할 수 있습니다.

pause 주석이 활성화된 사용자 정의 리소스를 생성할 수도 있습니다. 사용자 정의 리소스가 생성되지만 무시됩니다.

사전 요구 사항

  • 사용자 정의 리소스를 관리하는 Apache Kafka Operator의 Streams for Apache Kafka Operator가 실행 중입니다.

프로세스

  1. OpenShift에서 사용자 정의 리소스에 주석을 달고 pause-reconciliationtrue 로 설정합니다.

    oc annotate <kind_of_custom_resource> <name_of_custom_resource> strimzi.io/pause-reconciliation="true"

    예를 들어 KafkaConnect 사용자 정의 리소스의 경우 다음을 수행합니다.

    oc annotate KafkaConnect my-connect strimzi.io/pause-reconciliation="true"
  2. 사용자 정의 리소스의 상태 조건에 ReconciliationPaused: 변경 사항이 표시되는지 확인합니다.

    oc describe <kind_of_custom_resource> <name_of_custom_resource>

    유형 조건은 lastTransitionTime 에서 ReconciliationPaused 로 변경됩니다.

    일시 중지된 조정 조건 유형이 있는 사용자 정의 리소스의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      annotations:
        strimzi.io/pause-reconciliation: "true"
        strimzi.io/use-connector-resources: "true"
      creationTimestamp: 2021-03-12T10:47:11Z
      #...
    spec:
      # ...
    status:
      conditions:
      - lastTransitionTime: 2021-03-12T10:47:41.689249Z
        status: "True"
        type: ReconciliationPaused

일시 중지에서 재시작

  • 조정을 다시 시작하려면 주석을 false 로 설정하거나 주석을 제거할 수 있습니다.

9.5.4. 리더 선택으로 여러 Cluster Operator 복제본 실행

기본 Cluster Operator 구성을 사용하면 리더 선택을 통해 Cluster Operator의 여러 병렬 복제본을 실행할 수 있습니다. 하나의 복제본이 활성 리더로 선택되고 배포된 리소스를 작동합니다. 다른 복제본은 standby 모드에서 실행됩니다. 리더가 중지되거나 실패하면 대기 복제본 중 하나가 새 리더로 선택되고 배포된 리소스 운영을 시작합니다.

기본적으로 Apache Kafka의 Streams는 항상 리더 복제본인 단일 Cluster Operator 복제본으로 실행됩니다. 단일 Cluster Operator 복제본이 중지되거나 실패하면 OpenShift에서 새 복제본을 시작합니다.

여러 복제본으로 Cluster Operator를 실행하는 것은 필수 사항은 아닙니다. 그러나 주요 오류로 인한 대규모 중단의 경우 복제본이 대기 상태에 있는 것이 좋습니다. 예를 들어 여러 작업자 노드 또는 전체 가용성 영역이 실패한다고 가정합니다. 이러한 오류로 인해 Cluster Operator Pod 및 여러 Kafka Pod가 동시에 중단될 수 있습니다. 후속 Pod 예약으로 인해 리소스 부족으로 인해 혼잡이 발생하는 경우 단일 Cluster Operator를 실행할 때 작업이 지연될 수 있습니다.

9.5.4.1. Cluster Operator 복제본의 리더 선택 활성화

추가 Cluster Operator 복제본을 실행할 때 리더 선택 환경 변수를 구성합니다. 지원되는 환경 변수는 다음과 같습니다.

STRIMZI_LEADER_ELECTION_ENABLED
선택 사항, disabled(false)는 기본적으로 비활성화되어 있습니다. 리더 선택을 활성화하거나 비활성화하여 추가 Cluster Operator 복제본을 대기 상태로 실행할 수 있습니다.
참고

리더 선택이 기본적으로 비활성화되어 있습니다. 이 환경 변수를 설치에 적용하는 경우에만 활성화됩니다.

STRIMZI_LEADER_ELECTION_LEASE_NAME
리더 선택을 활성화할 때 필요합니다. 리더 선택에 사용되는 OpenShift Lease 리소스의 이름입니다.
STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE

리더 선택을 활성화할 때 필요합니다. 리더 선택에 사용되는 OpenShift Lease 리소스가 생성되는 네임스페이스입니다. Downward API를 사용하여 Cluster Operator가 배포된 네임스페이스로 구성할 수 있습니다.

env:
  - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
STRIMZI_LEADER_ELECTION_IDENTITY

리더 선택을 활성화할 때 필요합니다. 리더 선택 중에 사용되는 지정된 Cluster Operator 인스턴스의 ID를 구성합니다. ID는 각 Operator 인스턴스에 대해 고유해야 합니다. Downward API를 사용하여 Cluster Operator가 배포된 Pod의 이름으로 구성할 수 있습니다.

env:
  - name: STRIMZI_LEADER_ELECTION_IDENTITY
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
STRIMZI_LEADER_ELECTION_LEASE_DURATION_MS
선택 사항인 기본 15000 ms. 리스가 유효한 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RENEW_DEADLINE_MS
선택 사항인 기본 10000 ms. 리더가 리더십을 유지하려고 시도하는 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RETRY_PERIOD_MS
선택 사항인 기본 2000 ms입니다. 리더의 리스 잠금에 대한 업데이트 빈도를 지정합니다.
9.5.4.2. Cluster Operator 복제본 구성

대기 모드에서 추가 Cluster Operator 복제본을 실행하려면 복제본 수를 늘리고 리더 선택을 활성화해야 합니다. 리더 선택을 구성하려면 리더 선택 환경 변수를 사용합니다.

필요한 변경을 수행하려면 install/cluster-operator/:에 있는 다음 Cluster Operator 설치 파일을 구성합니다.

  • 060-Deployment-strimzi-cluster-operator.yaml
  • 022-ClusterRole-strimzi-cluster-operator-role.yaml
  • 022-RoleBinding-strimzi-cluster-operator.yaml

리더 선택에는 조사 중인 네임스페이스가 아니라 Cluster Operator가 실행 중인 네임스페이스를 대상으로 하는 자체 ClusterRoleRoleBinding RBAC 리소스가 있습니다.

기본 배포 구성은 Cluster Operator와 동일한 네임스페이스에 strimzi-cluster-operator 라는 Lease 리소스를 생성합니다. Cluster Operator는 리스를 사용하여 리더 선택을 관리합니다. RBAC 리소스는 Lease 리소스를 사용할 수 있는 권한을 제공합니다. 다른 Lease 이름 또는 네임스페이스를 사용하는 경우 그에 따라 ClusterRoleRoleBinding 파일을 업데이트합니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.

프로세스

060- Deployment -strimzi-cluster-operator.yaml 파일에 정의된 Cluster Operator를 배포하는 데 사용되는 Deployment 리소스를 편집합니다.

  1. replicas 속성을 기본 (1)에서 필요한 복제본 수와 일치하는 값으로 변경합니다.

    Cluster Operator 복제본 수 증가

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: strimzi-cluster-operator
      labels:
        app: strimzi
    spec:
      replicas: 3

  2. 리더 선택 env 속성이 설정되어 있는지 확인합니다.

    설정되지 않은 경우 구성합니다.

    리더 선택을 활성화하려면 STRIMZI_LEADER_ELECTION_ENABLEDtrue (기본값)로 설정해야 합니다.

    이 예에서 리스는 my-strimzi-cluster-operator 로 변경됩니다.

    Cluster Operator의 리더 선택 환경 변수 구성

    # ...
    spec
      containers:
        - name: strimzi-cluster-operator
          # ...
          env:
            - name: STRIMZI_LEADER_ELECTION_ENABLED
              value: "true"
            - name: STRIMZI_LEADER_ELECTION_LEASE_NAME
              value: "my-strimzi-cluster-operator"
            - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
            - name: STRIMZI_LEADER_ELECTION_IDENTITY
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name

    사용 가능한 환경 변수에 대한 설명은 9.5.4.1절. “Cluster Operator 복제본의 리더 선택 활성화” 을 참조하십시오.

    리더 선택에 사용된 Lease 리소스의 다른 이름 또는 네임스페이스를 지정한 경우 RBAC 리소스를 업데이트합니다.

  3. (선택 사항) 022-ClusterRole-strimzi-cluster-operator-role.yaml 파일에서 ClusterRole 리소스를 편집합니다.

    Lease 리소스의 이름으로 resourceNames 를 업데이트합니다.

    리스에 대한 ClusterRole 참조 업데이트

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: strimzi-cluster-operator-leader-election
      labels:
        app: strimzi
    rules:
      - apiGroups:
          - coordination.k8s.io
        resourceNames:
          - my-strimzi-cluster-operator
    # ...

  4. (선택 사항) 022-RoleBinding-strimzi-cluster-operator.yaml 파일에서 RoleBinding 리소스를 편집합니다.

    subject.name 및 subject.namespaceLease 리소스의 이름과 생성된 네임스페이스로 업데이트합니다.

    lease에 대한 RoleBinding 참조 업데이트

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: strimzi-cluster-operator-leader-election
      labels:
        app: strimzi
    subjects:
      - kind: ServiceAccount
        name: my-strimzi-cluster-operator
        namespace: myproject
    # ...

  5. Cluster Operator를 배포합니다.

    oc create -f install/cluster-operator -n myproject
  6. 배포 상태를 확인합니다.

    oc get deployments -n myproject

    출력에 배포 이름 및 준비 상태 표시

    NAME                      READY  UP-TO-DATE  AVAILABLE
    strimzi-cluster-operator  3/3    3           3

    READY 는 ready/expected 복제본 수를 표시합니다. AVAILABLE 출력에 올바른 복제본 수가 표시되면 배포가 성공적으로 수행됩니다.

9.5.5. Cluster Operator HTTP 프록시 설정 구성

HTTP 프록시 뒤에서 Kafka 클러스터를 실행 중인 경우에도 클러스터에서 데이터를 계속 전달할 수 있습니다. 예를 들어 프록시 외부에서 데이터를 푸시하고 가져오는 커넥터와 함께 Kafka Connect를 실행할 수 있습니다. 또는 프록시를 사용하여 권한 부여 서버와 연결할 수 있습니다.

프록시 환경 변수를 지정하도록 Cluster Operator 배포를 구성합니다. Cluster Operator는 표준 프록시 구성(HTTP_PROXY,HTTPS_PROXYNO_PROXY)을 환경 변수로 허용합니다. 프록시 설정은 Apache Kafka 컨테이너의 모든 스트림에 적용됩니다.

프록시 주소 형식은 http://<ip_address>:<port_number>입니다. 이름과 암호를 사용하여 프록시를 설정하려면 형식은 http://<username>:<password>@<ip-address>:<port_number>입니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.

프로세스

  1. Cluster Operator에 프록시 환경 변수를 추가하려면 배포 구성을 업데이트합니다(install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml).

    Cluster Operator의 프록시 설정 예

    apiVersion: apps/v1
    kind: Deployment
    spec:
      # ...
      template:
        spec:
          serviceAccountName: strimzi-cluster-operator
          containers:
            # ...
            env:
            # ...
            - name: "HTTP_PROXY"
              value: "http://proxy.com" 
    1
    
            - name: "HTTPS_PROXY"
              value: "https://proxy.com" 
    2
    
            - name: "NO_PROXY"
              value: "internal.com, other.domain.com" 
    3
    
      # ...

    1
    프록시 서버의 주소입니다.
    2
    프록시 서버의 보안 주소입니다.
    3
    프록시 서버에 대한 예외로 직접 액세스하는 서버의 주소입니다. URL은 쉼표로 구분됩니다.

    또는 배포를 직접 편집합니다.

    oc edit deployment strimzi-cluster-operator
  2. 배포를 직접 편집하는 대신 YAML 파일을 업데이트한 경우 변경 사항을 적용합니다.

    oc create -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml

9.5.6. Cluster Operator 구성을 사용하여 FIPS 모드 비활성화

Apache Kafka의 스트림은 FIPS 지원 OpenShift 클러스터에서 실행할 때 FIPS 모드로 자동 전환합니다. Cluster Operator의 배포 구성에서 FIPS_MODE 환경 변수를 비활성화 하여 FIPS 모드를 비활성화합니다. FIPS 모드가 비활성화되면 Apache Kafka의 Streams는 모든 구성 요소에 대해 OpenJDK에서 FIPS를 자동으로 비활성화합니다. FIPS 모드가 비활성화되면 Apache Kafka의 Streams가 FIPS와 호환되지 않습니다. Streams for Apache Kafka Operator 및 모든 피연산자는 FIPS를 활성화하지 않고 OpenShift 클러스터에서 실행 중인 것과 동일한 방식으로 실행됩니다.

프로세스

  1. Cluster Operator에서 FIPS 모드를 비활성화하려면 배포 구성(install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml)을 업데이트하고 FIPS_MODE 환경 변수를 추가합니다.

    Cluster Operator의 FIPS 구성 예

    apiVersion: apps/v1
    kind: Deployment
    spec:
      # ...
      template:
        spec:
          serviceAccountName: strimzi-cluster-operator
          containers:
            # ...
            env:
            # ...
            - name: "FIPS_MODE"
              value: "disabled" 
    1
    
      # ...

    1
    FIPS 모드를 비활성화합니다.

    또는 배포를 직접 편집합니다.

    oc edit deployment strimzi-cluster-operator
  2. 배포를 직접 편집하는 대신 YAML 파일을 업데이트한 경우 변경 사항을 적용합니다.

    oc apply -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml

9.6. Kafka Connect 구성

KafkaConnect 사용자 정의 리소스의 spec 속성을 업데이트하여 Kafka Connect 배포를 구성합니다.

Kafka Connect를 사용하여 Kafka 클러스터에 대한 외부 데이터 연결을 설정합니다. KafkaConnect 리소스의 속성을 사용하여 Kafka Connect 배포를 구성합니다.

Kafka Connect 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.

KafkaConnector 구성

KafkaConnector 리소스를 사용하면 OpenShift 네이티브 방식으로 Kafka Connect의 커넥터 인스턴스를 생성하고 관리할 수 있습니다.

Kafka Connect 구성에서 strimzi.io/use-connector-resources 주석을 추가하여 Kafka Connect 클러스터에 대한 KafkaConnectors를 활성화합니다. Apache Kafka용 Streams가 데이터 연결에 필요한 커넥터 플러그인으로 컨테이너 이미지를 자동으로 빌드하도록 빌드 구성을 추가할 수도 있습니다. Kafka Connect 커넥터에 대한 외부 구성은 externalConfiguration 속성을 통해 지정됩니다.

커넥터를 관리하려면 KafkaConnector 사용자 정의 리소스 또는 Kafka Connect REST API를 사용할 수 있습니다. KafkaConnector 리소스는 연결된 Kafka Connect 클러스터와 동일한 네임스페이스에 배포해야 합니다. 이러한 방법을 사용하여 커넥터를 생성, 재구성 또는 삭제하는 방법에 대한 자세한 내용은 커넥터 추가 를 참조하십시오.

커넥터 구성은 HTTP 요청의 일부로 Kafka Connect에 전달되어 Kafka 자체에 저장됩니다. ConfigMaps 및 Secrets는 구성 및 기밀 데이터를 저장하는 데 사용되는 표준 OpenShift 리소스입니다. ConfigMaps 및 Secrets를 사용하여 커넥터의 특정 요소를 구성할 수 있습니다. 그런 다음 필요한 경우 구성을 분리하고 더 안전하게 유지하는 HTTP REST 명령에서 구성 값을 참조할 수 있습니다. 이 방법은 특히 사용자 이름, 암호 또는 인증서와 같은 기밀 데이터에 적용됩니다.

대량의 메시지 처리

많은 양의 메시지를 처리하도록 구성을 조정할 수 있습니다. 자세한 내용은 많은 양의 메시지 처리를 참조하십시오.

KafkaConnect 사용자 정의 리소스 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect 
1

metadata:
  name: my-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true" 
2

spec:
  replicas: 3 
3

  authentication: 
4

    type: tls
    certificateAndKey:
      certificate: source.crt
      key: source.key
      secretName: my-user-source
  bootstrapServers: my-cluster-kafka-bootstrap:9092 
5

  tls: 
6

    trustedCertificates:
      - secretName: my-cluster-cluster-cert
        certificate: ca.crt
      - secretName: my-cluster-cluster-cert
        certificate: ca2.crt
  config: 
7

    group.id: my-connect-cluster
    offset.storage.topic: my-connect-cluster-offsets
    config.storage.topic: my-connect-cluster-configs
    status.storage.topic: my-connect-cluster-status
    key.converter: org.apache.kafka.connect.json.JsonConverter
    value.converter: org.apache.kafka.connect.json.JsonConverter
    key.converter.schemas.enable: true
    value.converter.schemas.enable: true
    config.storage.replication.factor: 3
    offset.storage.replication.factor: 3
    status.storage.replication.factor: 3
  build: 
8

    output: 
9

      type: docker
      image: my-registry.io/my-org/my-connect-cluster:latest
      pushSecret: my-registry-credentials
    plugins: 
10

      - name: connector-1
        artifacts:
          - type: tgz
            url: <url_to_download_connector_1_artifact>
            sha512sum: <SHA-512_checksum_of_connector_1_artifact>
      - name: connector-2
        artifacts:
          - type: jar
            url: <url_to_download_connector_2_artifact>
            sha512sum: <SHA-512_checksum_of_connector_2_artifact>
  externalConfiguration: 
11

    env:
      - name: AWS_ACCESS_KEY_ID
        valueFrom:
          secretKeyRef:
            name: aws-creds
            key: awsAccessKey
      - name: AWS_SECRET_ACCESS_KEY
        valueFrom:
          secretKeyRef:
            name: aws-creds
            key: awsSecretAccessKey
  resources: 
12

    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "2"
      memory: 2Gi
  logging: 
13

    type: inline
    loggers:
      log4j.rootLogger: INFO
  readinessProbe: 
14

    initialDelaySeconds: 15
    timeoutSeconds: 5
  livenessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
  metricsConfig: 
15

    type: jmxPrometheusExporter
    valueFrom:
      configMapKeyRef:
        name: my-config-map
        key: my-key
  jvmOptions: 
16

    "-Xmx": "1g"
    "-Xms": "1g"
  image: my-org/my-image:latest 
17

  rack:
    topologyKey: topology.kubernetes.io/zone 
18

  template: 
19

    pod:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: application
                    operator: In
                    values:
                      - postgresql
                      - mongodb
              topologyKey: "kubernetes.io/hostname"
    connectContainer: 
20

      env:
        - name: OTEL_SERVICE_NAME
          value: my-otel-service
        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: "http://otlp-host:4317"
  tracing:
    type: opentelemetry 
21

1
KafkaConnect 를 사용합니다.
2
Kafka Connect 클러스터의 KafkaConnectors를 활성화합니다.
3
작업을 실행하는 작업자의 복제본 노드 수입니다.
4
mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 Kafka Connect 클러스터에 대한 인증입니다. 기본적으로 Kafka Connect는 일반 텍스트 연결을 사용하여 Kafka 브로커에 연결합니다.
5
Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다.
6
TLS 인증서가 클러스터의 X.509 형식으로 저장되는 키 이름으로 TLS 암호화 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
7
작업자의 Kafka Connect 구성(연결이 아님). 표준 Apache Kafka 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
8
커넥터 플러그인을 사용하여 컨테이너 이미지를 빌드하기 위한 구성 속성을 자동으로 빌드합니다.
9
(필수) 새 이미지를 내보내는 컨테이너 레지스트리의 구성입니다.
10
(필수) 새 컨테이너 이미지에 추가할 커넥터 플러그인 및 해당 아티팩트 목록입니다. 각 플러그인은 하나 이상의 아티팩트 로 구성해야 합니다.
11
다음과 같이 환경 변수를 사용하는 커넥터의 외부 구성 또는 볼륨. 구성 공급자 플러그인을 사용하여 외부 소스에서 구성 값을 로드할 수도 있습니다.
12
지원되는 리소스(현재 cpumemory ) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다.
13
지정된 Kafka Connect 로거 및 로그 수준이 직접(인라인) 또는 ConfigMap을 통해 간접적으로(외부)됩니다. 사용자 정의 Log4j 구성은 ConfigMap의 log4j.properties 또는 log4j2.properties 키 아래에 배치해야 합니다. Kafka Connect log4j.rootLogger 로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다.
14
컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
15
Prometheus 지표: 이 예제에서 Prometheus Cryostat 내보내기에 대한 구성이 포함된 ConfigMap을 참조하여 활성화됩니다. metricsConfig.valueFrom.configMapKeyRef.key 아래에 빈 파일이 포함된 ConfigMap에 대한 참조를 사용하여 추가 구성 없이 메트릭을 활성화할 수 있습니다.
16
Kafka Connect를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
17
ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
18
SPECIALIZED OPTION: 배포에 대한 Rack 인식 구성입니다. 이는 지역이 아닌 동일한 위치 내의 배포를 위한 특수 옵션입니다. 리더 복제본 대신 커넥터가 가장 가까운 복제본에서 사용할 수 있도록 하려면 이 옵션을 사용합니다. 경우에 따라 가장 가까운 복제본에서 소비하면 네트워크 사용률을 개선하거나 비용을 절감할 수 있습니다. topologyKey 는 랙 ID가 포함된 노드 레이블과 일치해야 합니다. 이 구성에 사용된 예제에서는 표준 topology.kubernetes.io/zone 레이블을 사용하는 영역을 지정합니다. 가장 가까운 복제본에서 사용하려면 Kafka 브로커 구성에서 RackAwareReplicaSelector 를 활성화합니다.
19
템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
20
환경 변수는 분산 추적에 대해 설정됩니다.
21
OpenTelemetry를 사용하여 분산 추적을 활성화합니다.

9.6.1. 여러 인스턴스에 대한 Kafka Connect 구성

기본적으로 Apache Kafka의 Streams는 Kafka Connect에서 사용하는 내부 주제의 그룹 ID와 이름을 구성합니다. Kafka Connect의 여러 인스턴스를 실행하는 경우 다음 구성 속성을 사용하여 이러한 기본 설정을 변경해야 합니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect
spec:
  config:
    group.id: my-connect-cluster 
1

    offset.storage.topic: my-connect-cluster-offsets 
2

    config.storage.topic: my-connect-cluster-configs 
3

    status.storage.topic: my-connect-cluster-status 
4

    # ...
  # ...
1
Kafka 내의 Kafka Connect 클러스터 그룹 ID입니다.
2
커넥터 오프셋을 저장하는 Kafka 주제입니다.
3
커넥터 및 작업 상태 구성을 저장하는 Kafka 주제입니다.
4
커넥터 및 작업 상태 업데이트를 저장하는 Kafka 주제입니다.
참고

세 주제의 값은 동일한 group.id 가 있는 모든 인스턴스에 대해 동일해야 합니다.

이러한 기본 설정을 수정하지 않으면 동일한 Kafka 클러스터에 연결하는 각 인스턴스가 동일한 값으로 배포됩니다. 실제로 모든 인스턴스가 클러스터를 형성하고 동일한 내부 주제를 사용합니다.

동일한 내부 주제를 사용하려는 여러 인스턴스가 예기치 않은 오류가 발생하므로 각 인스턴스에 대한 이러한 속성 값을 변경해야 합니다.

9.6.2. Kafka Connect 사용자 권한 부여 구성

Kafka에서 권한을 사용하는 경우 Kafka Connect 사용자는 클러스터 그룹 및 Kafka Connect의 내부 항목에 대한 읽기/쓰기 액세스 권한이 필요합니다. 다음 절차에서는 간단한 권한 부여 및 ACL을 사용하여 액세스 권한을 부여하는 방법을 간략하게 설명합니다.

Kafka Connect 클러스터 그룹 ID 및 내부 주제의 속성은 기본적으로 Apache Kafka용 Streams에 의해 구성됩니다. 또는 KafkaConnect 리소스의 사양에 명시적으로 정의할 수 있습니다. 이 기능은 그룹 ID 및 주제의 값이 여러 Kafka Connect 인스턴스를 실행할 때 달라야 하므로 여러 인스턴스에 대해 Kafka Connect를 구성할 때 유용합니다.

간단한 인증에서는 Kafka AclAuthorizerStandardAuthorizer 플러그인에서 관리하는 ACL 규칙을 사용하여 적절한 액세스 수준을 보장합니다. 간단한 인증을 사용하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 AclRule 스키마 참조를 참조하십시오.

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator

프로세스

  1. KafkaUser 리소스에서 권한 부여 속성을 편집하여 사용자에게 액세스 권한을 제공합니다.

    액세스 권한은 리터럴 이름 값을 사용하여 Kafka Connect 주제 및 클러스터 그룹에 대해 구성됩니다. 다음 표에서는 주제 및 클러스터 그룹 ID에 대해 구성된 기본 이름을 보여줍니다.

    Expand
    표 9.2. 액세스 권한 구성의 이름
    속성이름

    offset.storage.topic

    connect-cluster-offsets

    status.storage.topic

    connect-cluster-status

    config.storage.topic

    connect-cluster-configs

    group

    connect-cluster

    이 예제 구성에서 기본 이름은 액세스 권한을 지정하는 데 사용됩니다. Kafka Connect 인스턴스에 다른 이름을 사용하는 경우 ACL 구성에서 해당 이름을 사용합니다.

    간단한 권한 부여를 위한 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaUser
    metadata:
      name: my-user
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      # ...
      authorization:
        type: simple
        acls:
          # access to offset.storage.topic
          - resource:
              type: topic
              name: connect-cluster-offsets
              patternType: literal
            operations:
              - Create
              - Describe
              - Read
              - Write
            host: "*"
          # access to status.storage.topic
          - resource:
              type: topic
              name: connect-cluster-status
              patternType: literal
            operations:
              - Create
              - Describe
              - Read
              - Write
            host: "*"
          # access to config.storage.topic
          - resource:
              type: topic
              name: connect-cluster-configs
              patternType: literal
            operations:
              - Create
              - Describe
              - Read
              - Write
            host: "*"
          # cluster group
          - resource:
              type: group
              name: connect-cluster
              patternType: literal
            operations:
              - Read
            host: "*"

  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f KAFKA-USER-CONFIG-FILE

9.6.3. Kafka Connect 커넥터를 수동으로 중지하거나 일시 중지

KafkaConnector 리소스를 사용하여 커넥터를 구성하는 경우 상태 구성을 사용하여 커넥터를 중지하거나 일시 중지합니다. 커넥터 및 작업이 인스턴스화되는 일시 중지된 상태와 달리 커넥터를 중지하면 활성 프로세스가 없는 구성만 유지됩니다. 실행으로부터 커넥터를 중지하는 것은 단순히 일시 중지하는 것보다 장기간에 더 적합할 수 있습니다. 일시 중지된 커넥터를 다시 시작하는 속도가 빨라지지만 중지된 커넥터는 메모리와 리소스를 확보할 수 있는 이점이 있습니다.

참고

상태 구성은 KafkaConnectorSpec 스키마의 (더 이상 사용되지 않음) 일시 중지 구성을 교체하여 커넥터를 일시 중지할 수 있습니다. 이전에 일시 중지 구성을 사용하여 커넥터를 일시 중지한 경우 충돌을 방지하기 위해 상태 구성만 사용하도록 전환하는 것이 좋습니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

프로세스

  1. 일시 중지 또는 중지하려는 커넥터를 제어하는 KafkaConnector 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaConnector
  2. KafkaConnector 리소스를 편집하여 커넥터를 중지하거나 일시 중지합니다.

    Kafka Connect 커넥터를 중지하는 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnector
    metadata:
      name: my-source-connector
      labels:
        strimzi.io/cluster: my-connect-cluster
    spec:
      class: org.apache.kafka.connect.file.FileStreamSourceConnector
      tasksMax: 2
      config:
        file: "/opt/kafka/LICENSE"
        topic: my-topic
      state: stopped
      # ...

    상태 구성을 중지 또는 일시 중지 하도록 변경합니다. 이 속성이 실행 중이 아닌 경우 커넥터의 기본 상태입니다.

  3. KafkaConnector 구성에 변경 사항을 적용합니다.

    상태를 실행 중이거나 구성을 제거하여 커넥터를 다시 시작할 수 있습니다.

참고

또는 Kafka Connect API를 노출 하고 중지 및 일시 중지 를 사용하여 커넥터가 실행되지 않도록 중지할 수 있습니다. 예를 들어 PUT /connectors/<connector_name>/stop. 그런 다음 resume 끝점을 사용하여 다시 시작할 수 있습니다.

9.6.4. Kafka Connect 커넥터 수동 재시작

KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 strimzi.io/restart 주석을 사용하여 커넥터 재시작을 수동으로 트리거합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

프로세스

  1. 재시작할 Kafka 커넥터를 제어하는 KafkaConnector 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaConnector
  2. OpenShift에서 KafkaConnector 리소스에 주석을 달아 커넥터를 다시 시작합니다.

    oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart="true"

    재시작 주석은 true 로 설정됩니다.

  3. 다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).

    조정 프로세스에서 주석을 감지한 한 Kafka 커넥터가 다시 시작됩니다. Kafka Connect에서 재시작 요청을 수락하면 KafkaConnector 사용자 정의 리소스에서 주석이 제거됩니다.

9.6.5. Kafka Connect 커넥터 작업 수동 재시작

KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 strimzi.io/restart-task 주석을 사용하여 커넥터 작업 재시작을 수동으로 트리거합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

프로세스

  1. 재시작할 Kafka 커넥터 작업을 제어하는 KafkaConnector 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaConnector
  2. KafkaConnector 사용자 정의 리소스에서 재시작할 작업의 ID를 찾습니다.

    oc describe KafkaConnector <kafka_connector_name>

    작업 ID는 0부터 시작하여 음수가 아닌 정수입니다.

  3. OpenShift에서 KafkaConnector 리소스에 주석을 달아 커넥터 작업을 다시 시작하려면 ID를 사용합니다.

    oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart-task="0"

    이 예에서는 작업 0 이 다시 시작됩니다.

  4. 다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).

    조정 프로세스에서 주석을 감지한 한 Kafka 커넥터 작업이 다시 시작됩니다. Kafka Connect에서 재시작 요청을 수락하면 KafkaConnector 사용자 정의 리소스에서 주석이 제거됩니다.

9.7. Kafka MirrorMaker 2 구성

KafkaMirrorMaker2 사용자 정의 리소스의 사양 속성을 업데이트하여 MirrorMaker 2 배포를 구성합니다. MirrorMaker 2는 데이터 사용에 소스 클러스터 구성을 사용하고 데이터 출력에 대한 대상 클러스터 구성을 사용합니다.

MirrorMaker 2는 Kafka Connect 프레임워크를 기반으로 하며 클러스터 간 데이터 전송을 관리하는 커넥터 를 기반으로 합니다.

소스 및 대상 클러스터의 연결 세부 정보를 포함하여 Kafka Connect 배포를 정의하도록 MirrorMaker 2를 구성한 다음 MirrorMaker 2 커넥터 세트를 실행하여 연결을 설정합니다.

MirrorMaker 2는 소스 클러스터와 대상 클러스터 간의 구성 동기화를 지원합니다. MirrorMaker 2 구성에서 소스 주제를 지정합니다. MirrorMaker 2는 소스 주제를 모니터링합니다. MirrorMaker 2는 소스 주제를 탐지하고 변경 사항을 원격 주제로 전파합니다. 변경 사항에는 누락된 주제 및 파티션 생성이 포함될 수 있습니다.

참고

대부분의 경우 로컬 항목에 작성하고 원격 주제를 읽습니다. 원격 항목에서는 쓰기 작업을 방지할 수 없지만 피해야 합니다.

구성은 다음을 지정해야 합니다.

  • 각 Kafka 클러스터
  • 인증을 포함하여 각 클러스터에 대한 연결 정보
  • 복제 흐름 및 방향

    • 클러스터 간 클러스터
    • 주제 주제

Kafka MirrorMaker 2 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.

참고

MirrorMaker 2 리소스 구성은 더 이상 사용되지 않는 이전 버전의 MirrorMaker와 다릅니다. 현재 레거시 지원이 없으므로 모든 리소스를 수동으로 새 형식으로 변환해야 합니다.

기본 구성

MirrorMaker 2는 복제 요인과 같은 속성의 기본 구성 값을 제공합니다. 기본값이 변경되지 않은 최소 구성은 다음과 같습니다.

MirrorMaker 2의 최소 구성

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  version: 3.7.0
  connectCluster: "my-cluster-target"
  clusters:
  - alias: "my-cluster-source"
    bootstrapServers: my-cluster-source-kafka-bootstrap:9092
  - alias: "my-cluster-target"
    bootstrapServers: my-cluster-target-kafka-bootstrap:9092
  mirrors:
  - sourceCluster: "my-cluster-source"
    targetCluster: "my-cluster-target"
    sourceConnector: {}

mTLS 또는 SASL 인증을 사용하여 소스 및 대상 클러스터에 대한 액세스 제어를 구성할 수 있습니다. 이 절차에서는 소스 및 대상 클러스터에 TLS 암호화 및 mTLS 인증을 사용하는 구성을 보여줍니다.

KafkaMirrorMaker2 리소스의 소스 클러스터에서 복제하려는 주제 및 소비자 그룹을 지정할 수 있습니다. 이 작업을 수행하려면 topicsPatterngroupsPattern 속성을 사용합니다. 이름 목록을 제공하거나 정규식을 사용할 수 있습니다. 기본적으로 topicsPatterngroupsPattern 속성을 설정하지 않으면 모든 주제와 소비자 그룹이 복제됩니다. 정규식으로 ".*" 를 사용하여 모든 주제 및 소비자 그룹을 복제할 수도 있습니다. 그러나 클러스터에 불필요한 추가 로드를 유발하지 않도록 하는 데 필요한 주제 및 소비자 그룹만 지정합니다.

대량의 메시지 처리

많은 양의 메시지를 처리하도록 구성을 조정할 수 있습니다. 자세한 내용은 많은 양의 메시지 처리를 참조하십시오.

KafkaMirrorMaker2 사용자 정의 리소스 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  version: 3.7.0 
1

  replicas: 3 
2

  connectCluster: "my-cluster-target" 
3

  clusters: 
4

  - alias: "my-cluster-source" 
5

    authentication: 
6

      certificateAndKey:
        certificate: source.crt
        key: source.key
        secretName: my-user-source
      type: tls
    bootstrapServers: my-cluster-source-kafka-bootstrap:9092 
7

    tls: 
8

      trustedCertificates:
      - certificate: ca.crt
        secretName: my-cluster-source-cluster-ca-cert
  - alias: "my-cluster-target" 
9

    authentication: 
10

      certificateAndKey:
        certificate: target.crt
        key: target.key
        secretName: my-user-target
      type: tls
    bootstrapServers: my-cluster-target-kafka-bootstrap:9092 
11

    config: 
12

      config.storage.replication.factor: 1
      offset.storage.replication.factor: 1
      status.storage.replication.factor: 1
    tls: 
13

      trustedCertificates:
      - certificate: ca.crt
        secretName: my-cluster-target-cluster-ca-cert
  mirrors: 
14

  - sourceCluster: "my-cluster-source" 
15

    targetCluster: "my-cluster-target" 
16

    sourceConnector: 
17

      tasksMax: 10 
18

      autoRestart: 
19

        enabled: true
      config
        replication.factor: 1 
20

        offset-syncs.topic.replication.factor: 1 
21

        sync.topic.acls.enabled: "false" 
22

        refresh.topics.interval.seconds: 60 
23

        replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy" 
24

    heartbeatConnector: 
25

      autoRestart:
        enabled: true
      config:
        heartbeats.topic.replication.factor: 1 
26

        replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
    checkpointConnector: 
27

      autoRestart:
        enabled: true
      config:
        checkpoints.topic.replication.factor: 1 
28

        refresh.groups.interval.seconds: 600 
29

        sync.group.offsets.enabled: true 
30

        sync.group.offsets.interval.seconds: 60 
31

        emit.checkpoints.interval.seconds: 60 
32

        replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
    topicsPattern: "topic1|topic2|topic3" 
33

    groupsPattern: "group1|group2|group3" 
34

  resources: 
35

    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "2"
      memory: 2Gi
  logging: 
36

    type: inline
    loggers:
      connect.root.logger.level: INFO
  readinessProbe: 
37

    initialDelaySeconds: 15
    timeoutSeconds: 5
  livenessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
  jvmOptions: 
38

    "-Xmx": "1g"
    "-Xms": "1g"
  image: my-org/my-image:latest 
39

  rack:
    topologyKey: topology.kubernetes.io/zone 
40

  template: 
41

    pod:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: application
                    operator: In
                    values:
                      - postgresql
                      - mongodb
              topologyKey: "kubernetes.io/hostname"
    connectContainer: 
42

      env:
        - name: OTEL_SERVICE_NAME
          value: my-otel-service
        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: "http://otlp-host:4317"
  tracing:
    type: opentelemetry 
43

  externalConfiguration: 
44

    env:
      - name: AWS_ACCESS_KEY_ID
        valueFrom:
          secretKeyRef:
            name: aws-creds
            key: awsAccessKey
      - name: AWS_SECRET_ACCESS_KEY
        valueFrom:
          secretKeyRef:
            name: aws-creds
            key: awsSecretAccessKey

1
Kafka Connect 및 MirrorMaker 2 버전은 항상 동일합니다.
2
작업을 실행하는 작업자의 복제본 노드 수입니다.
3
Kafka Connect의 Kafka 클러스터 별칭은 대상 Kafka 클러스터를 지정해야 합니다. Kafka 클러스터는 내부 주제로 Kafka Connect에서 사용합니다.
4
동기화되는 Kafka 클러스터에 대한 사양입니다.
5
소스 Kafka 클러스터의 클러스터 별칭입니다.
6
mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 소스 클러스터에 대한 인증입니다.
7
소스 Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다.
8
TLS 인증서가 소스 Kafka 클러스터의 X.509 형식으로 저장되는 키 이름이 있는 TLS 암호화입니다. 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
9
대상 Kafka 클러스터의 클러스터 별칭입니다.
10
대상 Kafka 클러스터에 대한 인증은 소스 Kafka 클러스터와 동일한 방식으로 구성됩니다.
11
대상 Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다.
12
Kafka Connect 구성. 표준 Apache Kafka 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
13
대상 Kafka 클러스터의 TLS 암호화는 소스 Kafka 클러스터와 동일한 방식으로 구성됩니다.
14
MirrorMaker 2 커넥터.
15
MirrorMaker 2 커넥터에서 사용하는 소스 클러스터의 클러스터 별칭입니다.
16
MirrorMaker 2 커넥터에서 사용하는 대상 클러스터의 클러스터 별칭입니다.
17
원격 주제를 생성하는 MirrorSourceConnector 에 대한 구성입니다. 구성이 기본 구성 옵션을 덮어씁니다.
18
커넥터가 생성할 수 있는 최대 작업 수입니다. 작업은 데이터 복제를 처리하고 병렬로 실행됩니다. 인프라가 처리 오버헤드를 지원하는 경우 이 값을 늘리면 처리량이 향상될 수 있습니다. Kafka Connect는 클러스터 구성원 간에 작업을 배포합니다. 작업자보다 많은 작업이 있는 경우 작업자에 여러 작업이 할당됩니다. 싱크 커넥터의 경우 소비되는 각 주제 파티션에 대해 하나의 작업을 수행하는 것을 목표로 합니다. 소스 커넥터의 경우 병렬로 실행할 수 있는 작업 수도 외부 시스템에 따라 달라질 수 있습니다. 커넥터는 병렬 처리를 수행할 수 없는 경우 최대 작업 수보다 적은 수를 생성합니다.
19
실패한 커넥터 및 작업을 자동으로 다시 시작할 수 있습니다. 기본적으로 재시작 수는 indefinite이지만 maxRestarts 속성을 사용하여 자동 재시작 횟수에 대해 최대값을 설정할 수 있습니다.
20
대상 클러스터에서 생성된 미러링된 항목의 복제 인수입니다.
21
소스 및 대상 클러스터의 오프셋을 매핑하는 MirrorSourceConnector offset-syncs 내부 주제의 복제 인수입니다.
22
ACL 규칙 동기화가 활성화되면 ACL이 동기화된 항목에 적용됩니다. 기본값은 true입니다. 이 기능은 User Operator와 호환되지 않습니다. User Operator를 사용하는 경우 이 속성을 false 로 설정합니다.
23
새 주제의 검사 빈도를 변경하는 선택적 설정입니다. 기본값은 10분마다 확인용입니다.
24
원격 주제의 자동 이름을 재정의하는 정책을 추가합니다. 소스 클러스터 이름이 있는 이름을 보류하는 대신 주제는 원래 이름을 유지합니다. 이 선택적 설정은 활성/수동 백업 및 데이터 마이그레이션에 유용합니다. 모든 커넥터에 대해 속성을 지정해야 합니다. 양방향(active/active) 복제의 경우 DefaultReplicationPolicy 클래스를 사용하여 원격 주제의 이름을 자동으로 변경하고 모든 커넥터의 replication.policy.separator 속성을 지정하여 사용자 지정 구분자를 추가합니다.
25
연결 검사를 수행하는 MirrorHeartbeatConnector 에 대한 구성입니다. 구성이 기본 구성 옵션을 덮어씁니다.
26
대상 클러스터에서 생성된 하트비트 주제의 복제 요인입니다.
27
오프셋을 추적하는 MirrorCheckpointConnector 에 대한 구성입니다. 구성이 기본 구성 옵션을 덮어씁니다.
28
대상 클러스터에서 생성된 체크포인트 주제의 복제 요인입니다.
29
새 소비자 그룹의 점검 빈도를 변경하는 선택적 설정입니다. 기본값은 10분마다 확인용입니다.
30
활성/수동 구성의 복구에 유용한 소비자 그룹 오프셋을 동기화하는 선택적 설정입니다. 동기화는 기본적으로 활성화되어 있지 않습니다.
31
소비자 그룹 오프셋의 동기화가 활성화된 경우 동기화 빈도를 조정할 수 있습니다.
32
오프셋 추적의 검사 빈도를 조정합니다. 오프셋 동기화의 빈도를 변경하는 경우 이러한 검사의 빈도를 조정해야 할 수도 있습니다.
33
쉼표로 구분된 목록 또는 정규식 패턴으로 정의된 소스 클러스터의 복제를 주제로 지정합니다. 소스 커넥터는 지정된 항목을 복제합니다. 체크포인트 커넥터는 지정된 항목에 대한 오프셋을 추적합니다. 여기에서는 이름으로 세 가지 주제를 요청합니다.
34
쉼표로 구분된 목록 또는 정규식 패턴으로 정의된 소스 클러스터의 소비자 그룹 복제. 체크포인트 커넥터는 지정된 소비자 그룹을 복제합니다. 여기에서는 이름으로 세 개의 소비자 그룹을 요청합니다.
35
지원되는 리소스(현재 cpumemory ) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다.
36
지정된 Kafka Connect 로거 및 로그 수준이 직접(인라인) 또는 ConfigMap을 통해 간접적으로(외부)됩니다. 사용자 정의 Log4j 구성은 ConfigMap의 log4j.properties 또는 log4j2.properties 키 아래에 배치해야 합니다. Kafka Connect log4j.rootLogger 로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다.
37
컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
38
Kafka MirrorMaker를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
39
ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
40
SPECIALIZED OPTION: 배포에 대한 Rack 인식 구성입니다. 이는 지역이 아닌 동일한 위치 내의 배포를 위한 특수 옵션입니다. 리더 복제본 대신 커넥터가 가장 가까운 복제본에서 사용할 수 있도록 하려면 이 옵션을 사용합니다. 경우에 따라 가장 가까운 복제본에서 소비하면 네트워크 사용률을 개선하거나 비용을 절감할 수 있습니다. topologyKey 는 랙 ID가 포함된 노드 레이블과 일치해야 합니다. 이 구성에 사용된 예제에서는 표준 topology.kubernetes.io/zone 레이블을 사용하는 영역을 지정합니다. 가장 가까운 복제본에서 사용하려면 Kafka 브로커 구성에서 RackAwareReplicaSelector 를 활성화합니다.
41
템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
42
환경 변수는 분산 추적에 대해 설정됩니다.
43
OpenTelemetry를 사용하여 분산 추적을 활성화합니다.
44
Kafka MirrorMaker에 환경 변수로 마운트된 OpenShift Secret의 외부 구성입니다. 구성 공급자 플러그인을 사용하여 외부 소스에서 구성 값을 로드할 수도 있습니다.

9.7.1. 활성/활성 또는 활성/패시브 모드 구성

MirrorMaker 2를 활성/패시브 또는 활성 / 활성 클러스터 구성에서 사용할 수 있습니다.

활성/활성 클러스터 구성
활성/활성 구성에는 데이터를 양방향으로 복제하는 두 개의 활성 클러스터가 있습니다. 애플리케이션은 둘 중 하나의 클러스터를 사용할 수 있습니다. 각 클러스터는 동일한 데이터를 제공할 수 있습니다. 이렇게 하면 서로 다른 지리적 위치에서 동일한 데이터를 사용할 수 있습니다. 소비자 그룹이 두 클러스터에서 모두 활성화되므로 복제된 항목에 대한 소비자 오프셋은 소스 클러스터와 다시 동기화되지 않습니다.
활성/수동 클러스터 구성
활성/수동 구성에는 수동 클러스터에 데이터를 복제하는 활성 클러스터 복제가 있습니다. 패시브 클러스터는 대기 상태로 유지됩니다. 시스템 장애 시 데이터 복구에 수동 클러스터를 사용할 수 있습니다.

생산자와 소비자는 활성 클러스터에만 연결할 것으로 예상됩니다. 각 대상 대상에 MirrorMaker 2 클러스터가 필요합니다.

9.7.1.1. 양방향 복제(활성/활성)

MirrorMaker 2 아키텍처는 활성/활성 클러스터 구성에서 양방향 복제를 지원합니다.

각 클러스터는 소스원격 주제의 개념을 사용하여 다른 클러스터의 데이터를 복제합니다. 각 클러스터에 동일한 항목이 저장되므로 원격 주제는 MirrorMaker 2로 이름이 자동으로 변경되어 소스 클러스터를 나타냅니다. 원래 클러스터의 이름 앞에 주제 이름 앞에 추가됩니다.

그림 9.1. 주제 이름 변경

MirrorMaker 2 양방향 아키텍처

원래 클러스터에 플래그를 지정하면 주제가 해당 클러스터로 다시 복제되지 않습니다.

원격 주제를 통한 복제 개념은 데이터 집계가 필요한 아키텍처를 구성할 때 유용합니다. 소비자는 별도의 집계 클러스터 없이도 동일한 클러스터 내의 소스 및 원격 주제를 구독할 수 있습니다.

9.7.1.2. Unidirectional replication (active/passive)

MirrorMaker 2 아키텍처는 활성/수동 클러스터 구성에서 비방향 복제를 지원합니다.

활성/수동 클러스터 구성을 사용하여 백업을 수행하거나 데이터를 다른 클러스터로 마이그레이션할 수 있습니다. 이 경우 원격 주제의 자동 이름 변경을 원하지 않을 수 있습니다.

소스 커넥터 구성에 IdentityReplicationPolicy 를 추가하여 자동 이름 변경을 덮어쓸 수 있습니다. 이 구성을 적용하면 주제는 원래 이름을 유지합니다.

9.7.2. 여러 인스턴스의 MirrorMaker 2 구성

기본적으로 Streams for Apache Kafka는 MirrorMaker 2가 실행되는 Kafka Connect 프레임워크에서 사용하는 내부 주제의 그룹 ID와 이름을 구성합니다. MirrorMaker 2의 여러 인스턴스를 실행하고 동일한 connectCluster 값을 공유하는 경우 다음 구성 속성을 사용하여 이러한 기본 설정을 변경해야 합니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  connectCluster: "my-cluster-target"
  clusters:
  - alias: "my-cluster-target"
    config:
      group.id: my-connect-cluster 
1

      offset.storage.topic: my-connect-cluster-offsets 
2

      config.storage.topic: my-connect-cluster-configs 
3

      status.storage.topic: my-connect-cluster-status 
4

      # ...
    # ...
1
Kafka 내의 Kafka Connect 클러스터 그룹 ID입니다.
2
커넥터 오프셋을 저장하는 Kafka 주제입니다.
3
커넥터 및 작업 상태 구성을 저장하는 Kafka 주제입니다.
4
커넥터 및 작업 상태 업데이트를 저장하는 Kafka 주제입니다.
참고

세 주제의 값은 동일한 group.id 가 있는 모든 인스턴스에 대해 동일해야 합니다.

connectCluster 설정은 내부 주제용으로 Kafka Connect에서 사용하는 대상 Kafka 클러스터의 별칭을 지정합니다. 결과적으로 connectCluster, 그룹 ID 및 내부 주제 이름 지정 구성에 대한 수정은 대상 Kafka 클러스터에 따라 다릅니다. 두 개의 MirrorMaker 2 인스턴스가 동일한 소스 Kafka 클러스터 또는 각 MirrorMaker 2 인스턴스에 다른 connectCluster 설정 및 대상 클러스터가 있는 활성 활성 모드에서 변경할 필요가 없습니다.

그러나 여러 MirrorMaker 2 인스턴스가 동일한 connectCluster 를 공유하는 경우 동일한 대상 Kafka 클러스터에 연결하는 각 인스턴스가 동일한 값으로 배포됩니다. 실제로 모든 인스턴스가 클러스터를 형성하고 동일한 내부 주제를 사용합니다.

동일한 내부 주제를 사용하려는 여러 인스턴스가 예기치 않은 오류가 발생하므로 각 인스턴스에 대한 이러한 속성 값을 변경해야 합니다.

9.7.3. MirrorMaker 2 커넥터 구성

Kafka 클러스터 간 데이터 동기화를 오케스트레이션하는 내부 커넥터에 대해 MirrorMaker 2 커넥터 구성을 사용합니다.

MirrorMaker 2는 다음 커넥터로 구성됩니다.

MirrorSourceConnector
소스 커넥터는 소스 클러스터에서 대상 클러스터로 주제를 복제합니다. 또한 ACL을 복제하고 MirrorCheckpointConnector 를 실행하는 데 필요합니다.
MirrorCheckpointConnector
체크포인트 커넥터는 주기적으로 오프셋을 추적합니다. 활성화하면 소스 클러스터와 대상 클러스터 간에 소비자 그룹 오프셋도 동기화합니다.
MirrorHeartbeatConnector
하트비트 커넥터는 소스 클러스터와 대상 클러스터 간의 연결을 주기적으로 확인합니다.

다음 표에서는 커넥터 속성과 이를 사용하도록 구성된 커넥터에 대해 설명합니다.

Expand
표 9.3. MirrorMaker 2 커넥터 구성 속성
속성sourceConnectorcheckpointConnectorheartbeatConnector
admin.timeout.ms
새 주제 감지와 같은 관리자 작업의 제한 시간입니다. 기본값은 60000 (1분)입니다.

replication.policy.class
원격 주제 이름 지정 규칙을 정의하는 정책입니다. 기본값은 org.apache.kafka.connect.mirror.DefaultReplicationPolicy 입니다.

replication.policy.separator
대상 클러스터에서 주제 이름 지정에 사용되는 구분 기호입니다. 기본적으로 구분 기호는 점(.)으로 설정됩니다. 구분 기호 구성은 원격 주제 이름을 정의하는 DefaultReplicationPolicy 복제 정책 클래스에만 적용할 수 있습니다. IdentityReplicationPolicy 클래스는 속성을 주제로 사용하여 원래 이름을 유지합니다.

consumer.poll.timeout.ms
소스 클러스터를 폴링할 때 제한 시간입니다. 기본값은 1000 초(1초)입니다.

 
offset-syncs.topic.location
소스 (기본값) 또는 대상 클러스터일 수 있는 offset-syncs 항목의 위치입니다.

 
topic.filter.class
주제 필터를 선택하여 복제할 항목을 선택합니다. 기본값은 org.apache.kafka.connect.mirror.DefaultTopicFilter 입니다.

 
config.property.filter.class
복제할 주제 구성 속성을 선택하는 주제 필터입니다. 기본값은 org.apache.kafka.connect.mirror.DefaultConfigPropertyFilter 입니다.

  
config.properties.exclude
복제해서는 안 되는 구성 속성을 주제로 설정합니다. 쉼표로 구분된 속성 이름과 정규식을 지원합니다.

  
offset.lag.max
원격 파티션이 동기화되기 전에 허용되는 최대(동기화되지 않음) 오프셋 지연. 기본값은 100 입니다.

  
offset-syncs.topic.replication.factor
내부 offset-syncs 주제의 복제 인수입니다. 기본값은 3 입니다.

  
refresh.topics.enabled
새 주제 및 파티션을 확인할 수 있습니다. 기본값은 true 입니다.

  
refresh.topics.interval.seconds
주제 새로 고침 빈도. 기본값은 600 (10분)입니다. 기본적으로 소스 클러스터의 새로운 주제는 10분마다 생성됩니다. 소스 커넥터 구성에 refresh.topics.interval.seconds 를 추가하여 빈도를 변경할 수 있습니다.

  
replication.factor
새로운 주제의 복제 요소. 기본값은 2 입니다.

  
sync.topic.acls.enabled
소스 클러스터에서 ACL의 동기화를 활성화합니다. 기본값은 true 입니다. 자세한 내용은 9.7.6절. “원격 주제에 대한 ACL 규칙 동기화”의 내용을 참조하십시오.

  
sync.topic.acls.interval.seconds
ACL 동기화 빈도입니다. 기본값은 600 (10분)입니다.

  
sync.topic.configs.enabled
소스 클러스터에서 주제 구성의 동기화를 활성화합니다. 기본값은 true 입니다.

  
sync.topic.configs.interval.seconds
주제 구성 동기화의 빈도입니다. 기본값 600 (10분).

  
checkpoints.topic.replication.factor
내부 체크포인트 항목에 대한 복제 인수입니다. 기본값은 3 입니다.
 

 
emit.checkpoints.enabled
대상 클러스터에 대한 소비자 오프셋의 동기화를 활성화합니다. 기본값은 true 입니다.
 

 
emit.checkpoints.interval.seconds
소비자 오프셋 동기화 빈도. 기본값은 60 분(1분)입니다.
 

 
group.filter.class
복제할 소비자 그룹을 선택하는 그룹 필터입니다. 기본값은 org.apache.kafka.connect.mirror.DefaultGroupFilter 입니다.
 

 
refresh.groups.enabled
새 소비자 그룹 검사를 활성화합니다. 기본값은 true 입니다.
 

 
refresh.groups.interval.seconds
소비자 그룹 새로 고침 빈도. 기본값은 600 (10분)입니다.
 

 
sync.group.offsets.enabled
대상 클러스터 __consumer_offsets 주제로 소비자 그룹 오프셋의 동기화를 활성화합니다. 기본값은 false 입니다.
 

 
sync.group.offsets.interval.seconds
소비자 그룹 오프셋 동기화의 빈도입니다. 기본값은 60 분(1분)입니다.
 

 
emit.heartbeats.enabled
대상 클러스터에서 연결 검사를 활성화합니다. 기본값은 true 입니다.
  

emit.heartbeats.interval.seconds
연결 확인 빈도입니다. 기본값은 1 초(1초)입니다.
  

heartbeats.topic.replication.factor
내부 하트비트 주제의 복제 요소. 기본값은 3 입니다.
  

9.7.3.1. 소비자 그룹 오프셋 주제의 위치 변경

MirrorMaker 2는 내부 주제를 사용하여 소비자 그룹의 오프셋을 추적합니다.

offset-syncs 주제
offset-syncs 주제는 레코드 메타데이터에서 복제된 주제 파티션의 소스 및 대상 오프셋을 매핑합니다.
Checkpoints 주제
Checkpoints 주제는 각 소비자 그룹의 복제된 주제 파티션에 대해 소스 및 대상 클러스터에 마지막으로 커밋된 오프셋을 매핑합니다.

MirrorMaker 2에서 내부적으로 사용하므로 이러한 주제와 직접 상호 작용하지 않습니다.

MirrorCheckpointConnector 는 오프셋 추적을 위한 체크포인트 를 내보냅니다. 체크포인트 항목에 대한 오프셋은 구성을 통해 미리 정해진 간격으로 추적됩니다. 두 항목 모두 장애 조치의 올바른 오프셋 위치에서 복제를 완전히 복원할 수 있습니다.

offset-syncs 주제의 위치는 기본적으로 소스 클러스터입니다. offset-syncs.topic.location 커넥터 구성을 사용하여 이를 대상 클러스터로 변경할 수 있습니다. 주제가 포함된 클러스터에 대한 읽기/쓰기 액세스 권한이 필요합니다. 대상 클러스터를 offset-syncs 주제의 위치로 사용하면 소스 클러스터에 대한 읽기 권한만 있는 경우에도 MirrorMaker 2를 사용할 수 있습니다.

9.7.3.2. 소비자 그룹 오프셋 동기화

__consumer_offsets 주제는 각 소비자 그룹에 대해 커밋된 오프셋에 대한 정보를 저장합니다. 오프셋 동기화는 소스 클러스터의 소비자 그룹에 대한 소비자 오프셋을 대상 클러스터의 소비자 오프셋 주제로 주기적으로 전송합니다.

오프셋 동기화는 특히 활성/수동 구성에서 유용합니다. 활성 클러스터가 다운되면 소비자 애플리케이션은 패시브(standby) 클러스터로 전환하고 마지막으로 전송된 오프셋 위치에서 선택할 수 있습니다.

주제 오프셋 동기화를 사용하려면 체크포인트 커넥터 구성에 sync.group.offsets.enabled 를 추가하고 속성을 true 로 설정하여 동기화를 활성화합니다. 동기화는 기본적으로 비활성화되어 있습니다.

소스 커넥터에서 IdentityReplicationPolicy 를 사용하는 경우 Checkpoint 커넥터 구성에서도 구성해야 합니다. 이렇게 하면 미러링된 소비자 오프셋이 올바른 항목에 적용됩니다.

소비자 오프셋은 대상 클러스터에서 활성 상태가 아닌 소비자 그룹에 대해서만 동기화됩니다. 소비자 그룹이 대상 클러스터에 있는 경우 동기화를 수행할 수 없으며 UNKNOWN_MEMBER_ID 오류가 반환됩니다.

활성화하면 소스 클러스터의 오프셋 동기화가 주기적으로 수행됩니다. checkpoint 커넥터 구성에 sync.group.offsets.interval.secondsemit.checkpoints.interval.seconds 를 추가하여 빈도를 변경할 수 있습니다. 속성은 소비자 그룹 오프셋이 동기화되는 빈도(초)와 오프셋 추적을 위해 내보낸 체크포인트의 빈도를 지정합니다. 두 속성의 기본값은 60초입니다. 기본적으로 10분마다 수행되는 refresh.groups.interval.seconds 속성을 사용하여 새 소비자 그룹의 점검 빈도를 변경할 수도 있습니다.

동기화는 시간 기반이므로 소비자가 수동 클러스터로 전환하면 메시지가 중복될 수 있습니다.

참고

Java로 작성된 애플리케이션이 있는 경우 RemoteClusterUtils.java 유틸리티를 사용하여 애플리케이션을 통해 오프셋을 동기화할 수 있습니다. 유틸리티는 체크포인트 항목에서 소비자 그룹의 원격 오프셋을 가져옵니다.

9.7.3.3. 하트비트 커넥터 사용 시기 결정

하트비트 커넥터는 하트비트를 내보내 소스와 대상 Kafka 클러스터 간의 연결을 확인합니다. 내부 하트비트 주제는 소스 클러스터에서 복제되므로 하트비트 커넥터를 소스 클러스터에 연결해야 합니다. 하트비트 주제는 대상 클러스터에 있으며 이를 통해 다음을 수행할 수 있습니다.

  • 데이터를 미러링하고 있는 모든 소스 클러스터 식별
  • 미러링 프로세스의 활성 및 대기 시간 확인

이로 인해 프로세스가 중단되거나 어떤 이유로든 중지되었는지 확인하는 데 도움이 됩니다. 하트비트 커넥터는 Kafka 클러스터 간의 미러링 프로세스를 모니터링하는 데 중요한 도구가 될 수 있지만 항상 사용할 필요는 없습니다. 예를 들어 배포에 네트워크 대기 시간이 짧고 또는 적은 수의 주제가 있는 경우 로그 메시지 또는 기타 모니터링 툴을 사용하여 미러링 프로세스를 모니터링하는 것이 좋습니다. 하트비트 커넥터를 사용하지 않으려면 MirrorMaker 2 구성에서 생략하면 됩니다.

9.7.3.4. MirrorMaker 2 커넥터 구성 조정

MirrorMaker 2 커넥터가 제대로 작동하도록 하려면 커넥터 간에 특정 구성 설정을 조정해야 합니다. 특히 다음 속성이 모든 적용 가능한 커넥터에서 동일한 값을 갖도록 합니다.

  • replication.policy.class
  • replication.policy.separator
  • offset-syncs.topic.location
  • topic.filter.class

예를 들어 replication.policy.class 의 값은 source, checkpoint, heartbeat 커넥터에 대해 동일해야 합니다. 설정이 일치하지 않거나 누락되면 데이터 복제 또는 오프셋 동기화에 문제가 발생하므로 동일한 설정으로 구성된 모든 관련 커넥터를 유지해야 합니다.

9.7.4. MirrorMaker 2 커넥터 생산자 및 소비자 구성

MirrorMaker 2 커넥터는 내부 생산자와 소비자를 사용합니다. 필요한 경우 이러한 생산자 및 소비자를 구성하여 기본 설정을 덮어쓸 수 있습니다.

예를 들어 많은 양의 메시지를 더 잘 수용하도록 대상 Kafka 클러스터에 주제를 보내는 소스 생산자의 batch.size 를 늘릴 수 있습니다.

중요

생산자 및 소비자 구성 옵션은 MirrorMaker 2 구현에 따라 다르며 변경될 수 있습니다.

다음 표에서는 각 커넥터의 생산자 및 소비자와 구성을 추가할 수 있는 위치를 설명합니다.

Expand
표 9.4. 소스 커넥터 생산자 및 소비자
유형설명설정

생산자

대상 Kafka 클러스터로 주제 메시지를 보냅니다. 대량의 데이터를 처리할 때 이 생산자의 구성을 조정하는 것이 좋습니다.

mirrors.sourceConnector.config: producer.override.*

생산자

복제된 주제 파티션에 대한 소스 및 대상 오프셋을 매핑하는 offset-syncs 항목에 씁니다.

mirrors.sourceConnector.config: producer.*

소비자

소스 Kafka 클러스터에서 주제 메시지를 검색합니다.

mirrors.sourceConnector.config: consumer.*

Expand
표 9.5. Checkpoint 커넥터 생산자 및 소비자
유형설명설정

생산자

소비자 오프셋 체크포인트를 내보냅니다.

mirrors.checkpointConnector.config: producer.override.*

소비자

offset-syncs 주제를 로드합니다.

mirrors.checkpointConnector.config: consumer.*

참고

target Kafka 클러스터를 offset-syncs 주제의 위치로 사용하도록 offset-syncs.topic.location 을 설정할 수 있습니다.

Expand
표 9.6. heartbeat 커넥터 생산자
유형설명설정

생산자

하트비트를 내보냅니다.

mirrors.heartbeatConnector.config: producer.override.*

다음 예제에서는 생산자와 소비자를 구성하는 방법을 보여줍니다.

커넥터 생산자 및 소비자를 위한 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  version: 3.7.0
  # ...
  mirrors:
  - sourceCluster: "my-cluster-source"
    targetCluster: "my-cluster-target"
    sourceConnector:
      tasksMax: 5
      config:
        producer.override.batch.size: 327680
        producer.override.linger.ms: 100
        producer.request.timeout.ms: 30000
        consumer.fetch.max.bytes: 52428800
        # ...
    checkpointConnector:
      config:
        producer.override.request.timeout.ms: 30000
        consumer.max.poll.interval.ms: 300000
        # ...
    heartbeatConnector:
      config:
        producer.override.request.timeout.ms: 30000
        # ...

9.7.5. 최대 데이터 복제 작업 수 지정

Connectors는 Kafka 내외로 데이터를 이동하는 작업을 생성합니다. 각 커넥터는 작업을 실행하는 작업자 Pod 그룹에 분산된 하나 이상의 작업으로 구성됩니다. 많은 수의 파티션을 복제하거나 많은 수의 소비자 그룹의 오프셋을 동기화할 때 작업 수를 늘리는 데 도움이 될 수 있습니다.

작업은 병렬로 실행됩니다. 작업자에는 하나 이상의 작업이 할당됩니다. 단일 작업은 하나의 작업자 Pod에서 처리하므로 작업보다 더 많은 작업자 Pod가 필요하지 않습니다. 작업자보다 많은 작업이 있는 경우 작업자는 여러 작업을 처리합니다.

tasksMax 속성을 사용하여 MirrorMaker 구성에서 최대 커넥터 작업 수를 지정할 수 있습니다. 최대 작업 수를 지정하지 않으면 기본 설정은 단일 작업입니다.

하트비트 커넥터는 항상 단일 작업을 사용합니다.

소스 및 체크포인트 커넥터에 대해 시작된 작업 수는 가능한 최대 작업 수와 tasksMax 값 사이의 낮은 값입니다. 소스 커넥터의 경우 가능한 최대 작업 수가 소스 클러스터에서 복제되는 각 파티션에 대해 1개입니다. 체크포인트 커넥터의 경우 가능한 최대 작업 수는 소스 클러스터에서 복제되는 각 소비자 그룹에 대해 하나씩입니다. 최대 작업 수를 설정할 때 프로세스를 지원하는 파티션 수와 하드웨어 리소스를 고려하십시오.

인프라가 처리 오버헤드를 지원하는 경우 작업 수를 늘리면 처리량과 대기 시간이 개선될 수 있습니다. 예를 들어 작업을 더 추가하면 많은 수의 파티션 또는 소비자 그룹이 있는 경우 소스 클러스터를 폴링하는 데 걸리는 시간이 줄어듭니다.

소스 커넥터의 작업 수를 늘리면 파티션 수가 많은 경우에 유용합니다.

소스 커넥터의 작업 수 증가

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  # ...
  mirrors:
  - sourceCluster: "my-cluster-source"
    targetCluster: "my-cluster-target"
    sourceConnector:
      tasksMax: 10
  # ...

체크포인트 커넥터에 대한 작업 수를 늘리면 많은 수의 소비자 그룹이 있을 때 유용합니다.

체크포인트 커넥터의 작업 수 증가

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  # ...
  mirrors:
  - sourceCluster: "my-cluster-source"
    targetCluster: "my-cluster-target"
    checkpointConnector:
      tasksMax: 10
  # ...

기본적으로 MirrorMaker 2는 10분마다 새 소비자 그룹을 확인합니다. refresh.groups.interval.seconds 구성을 조정하여 빈도를 변경할 수 있습니다. 더 낮게 조정할 때 주의하십시오. 더 자주 검사하면 성능에 부정적인 영향을 미칠 수 있습니다.

9.7.5.1. 커넥터 작업 확인

Prometheus 및 Grafana를 사용하여 배포를 모니터링하는 경우 MirrorMaker 2 성능을 확인할 수 있습니다. Apache Kafka용 Streams와 함께 제공되는 MirrorMaker 2 Grafana 대시보드 예제에서는 작업 및 대기 시간과 관련된 다음 메트릭을 보여줍니다.

  • 작업 수
  • 복제 대기 시간
  • 오프셋 동기화 대기 시간

9.7.6. 원격 주제에 대한 ACL 규칙 동기화

Apache Kafka용 Streams와 함께 MirrorMaker 2를 사용하는 경우 원격 주제에 대한 ACL 규칙을 동기화할 수 있습니다. 그러나 이 기능은 User Operator를 사용하지 않는 경우에만 사용할 수 있습니다.

User Operator 없이 type: 간단한 권한 부여를 사용하는 경우 브로커에 대한 액세스를 관리하는 ACL 규칙은 원격 주제에도 적용됩니다. 즉, 소스 항목에 대한 읽기 액세스 권한이 있는 사용자도 해당하는 원격 항목을 읽을 수 있습니다.

참고

OAuth 2.0 인증에서는 이러한 방식으로 원격 항목에 대한 액세스를 지원하지 않습니다.

9.7.7. Kafka MirrorMaker 2 배포 보안

다음 절차에서는 MirrorMaker 2 배포를 보호하는 데 필요한 구성을 간략하게 설명합니다.

소스 Kafka 클러스터 및 대상 Kafka 클러스터에 대한 별도의 구성이 필요합니다. 또한 소스 및 대상 Kafka 클러스터에 연결하기 위해 MirrorMaker에 필요한 인증 정보를 제공하려면 별도의 사용자 구성이 필요합니다.

Kafka 클러스터의 경우 OpenShift 클러스터 내에서 보안 연결을 위해 내부 리스너를 지정하고 OpenShift 클러스터 외부의 연결에 대한 외부 리스너를 지정합니다.

인증 및 권한 부여 메커니즘을 구성할 수 있습니다. 소스 및 대상 Kafka 클러스터에 대해 구현된 보안 옵션은 MirrorMaker 2에 구현된 보안 옵션과 호환되어야 합니다.

클러스터 및 사용자 인증 인증 정보를 생성한 후 보안 연결을 위해 MirrorMaker 구성에 지정합니다.

참고

이 절차에서는 Cluster Operator가 생성한 인증서를 사용하지만 자체 인증서를 설치하여 교체할 수 있습니다. 외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서를 사용하도록 리스너를 구성할 수도 있습니다.

시작하기 전

이 절차를 시작하기 전에 Streams for Apache Kafka에서 제공하는 구성 파일 예제 를 살펴보십시오. 여기에는 mTLS 또는 SCRAM-SHA-512 인증을 사용하여 MirrorMaker 2 배포 보안을 위한 예제가 포함됩니다. 예제에서는 OpenShift 클러스터 내에서 연결하기 위한 내부 리스너를 지정합니다.

이 예제에서는 소스 및 대상 Kafka 클러스터에서 사용자 작업을 허용하는 ACL을 포함하여 전체 권한 부여 구성을 제공합니다.

소스 및 대상 Kafka 클러스터에 대한 사용자 액세스를 구성할 때 ACL은 내부 MirrorMaker 2 커넥터에 대한 액세스 권한을 부여하고 대상 클러스터의 기본 Kafka Connect 프레임워크에서 사용하는 클러스터 그룹 및 내부 항목에 대한 읽기/쓰기 액세스 권한을 부여해야 합니다. 클러스터 그룹 또는 내부 주제의 이름이 여러 인스턴스에 대해 MirrorMaker 2를 구성하는 경우 ACL 구성에 해당 이름을 사용합니다.

간단한 인증에서는 Kafka AclAuthorizerStandardAuthorizer 플러그인에서 관리하는 ACL 규칙을 사용하여 적절한 액세스 수준을 보장합니다. 간단한 인증을 사용하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 AclRule 스키마 참조를 참조하십시오.

사전 요구 사항

  • Apache Kafka 스트림이 실행 중입니다.
  • 소스 및 대상 클러스터의 별도의 네임스페이스

이 절차에서는 소스 및 대상 Kafka 클러스터가 별도의 네임스페이스에 설치되어 있다고 가정합니다. Topic Operator를 사용하려면 이 작업을 수행해야 합니다. Topic Operator는 지정된 네임스페이스의 단일 클러스터만 감시합니다.

클러스터를 네임스페이스로 분리하면 네임스페이스 외부에서 액세스할 수 있도록 클러스터 시크릿을 복사해야 합니다. MirrorMaker 구성에서 시크릿을 참조해야 합니다.

프로세스

  1. 대상 Kafka 클러스터를 보호하는 두 개의 Kafka 리소스와 소스 Kafka 클러스터를 보호하도록 구성합니다.

    인증에 대한 리스너 구성을 추가하고 권한을 활성화할 수 있습니다.

    이 예에서 내부 리스너는 TLS 암호화 및 mTLS 인증을 사용하여 Kafka 클러스터에 대해 구성됩니다. Kafka 간단한 승인이 활성화되어 있습니다.

    TLS 암호화 및 mTLS 인증을 사용한 소스 Kafka 클러스터 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-source-cluster
    spec:
      kafka:
        version: 3.7.0
        replicas: 1
        listeners:
          - name: tls
            port: 9093
            type: internal
            tls: true
            authentication:
              type: tls
        authorization:
          type: simple
        config:
          offsets.topic.replication.factor: 1
          transaction.state.log.replication.factor: 1
          transaction.state.log.min.isr: 1
          default.replication.factor: 1
          min.insync.replicas: 1
          inter.broker.protocol.version: "3.7"
        storage:
          type: jbod
          volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false
      zookeeper:
        replicas: 1
        storage:
          type: persistent-claim
          size: 100Gi
          deleteClaim: false
      entityOperator:
        topicOperator: {}
        userOperator: {}

    TLS 암호화 및 mTLS 인증을 사용한 대상 Kafka 클러스터 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-target-cluster
    spec:
      kafka:
        version: 3.7.0
        replicas: 1
        listeners:
          - name: tls
            port: 9093
            type: internal
            tls: true
            authentication:
              type: tls
        authorization:
          type: simple
        config:
          offsets.topic.replication.factor: 1
          transaction.state.log.replication.factor: 1
          transaction.state.log.min.isr: 1
          default.replication.factor: 1
          min.insync.replicas: 1
          inter.broker.protocol.version: "3.7"
        storage:
          type: jbod
          volumes:
            - id: 0
              type: persistent-claim
              size: 100Gi
              deleteClaim: false
      zookeeper:
        replicas: 1
        storage:
          type: persistent-claim
          size: 100Gi
          deleteClaim: false
      entityOperator:
        topicOperator: {}
        userOperator: {}

  2. 별도의 네임스페이스에서 Kafka 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file> -n <namespace>

    Cluster Operator는 리스너를 생성하고 Kafka 클러스터 내에서 인증을 활성화하기 위해 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정합니다.

    인증서는 시크릿 < cluster_name> -cluster-ca-cert 에 생성됩니다.

  3. 두 개의 Kafka 리소스를 구성합니다. 하나는 소스 Kafka 클러스터의 사용자용이고 하나는 대상 Kafka 클러스터 사용자용입니다.

    1. 해당 소스 및 대상 Kafka 클러스터와 동일한 인증 및 권한 부여 유형을 구성합니다. 예를 들어 소스 Kafka 클러스터의 Kafka 구성에 tls 인증 및 간단한 인증 유형을 사용한 경우 KafkaUser 구성에서 동일하게 사용합니다.
    2. 소스 및 대상 Kafka 클러스터에서 작업을 허용하도록 MirrorMaker 2에 필요한 ACL을 구성합니다.

    mTLS 인증을 위한 소스 사용자 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaUser
    metadata:
      name: my-source-user
      labels:
        strimzi.io/cluster: my-source-cluster
    spec:
      authentication:
        type: tls
      authorization:
        type: simple
        acls:
          # MirrorSourceConnector
          - resource: # Not needed if offset-syncs.topic.location=target
              type: topic
              name: mm2-offset-syncs.my-target-cluster.internal
            operations:
              - Create
              - DescribeConfigs
              - Read
              - Write
          - resource: # Needed for every topic which is mirrored
              type: topic
              name: "*"
            operations:
              - DescribeConfigs
              - Read
          # MirrorCheckpointConnector
          - resource:
              type: cluster
            operations:
              - Describe
          - resource: # Needed for every group for which offsets are synced
              type: group
              name: "*"
            operations:
              - Describe
          - resource: # Not needed if offset-syncs.topic.location=target
              type: topic
              name: mm2-offset-syncs.my-target-cluster.internal
            operations:
              - Read

    mTLS 인증을 위한 대상 사용자 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaUser
    metadata:
      name: my-target-user
      labels:
        strimzi.io/cluster: my-target-cluster
    spec:
      authentication:
        type: tls
      authorization:
        type: simple
        acls:
          # cluster group
          - resource:
              type: group
              name: mirrormaker2-cluster
            operations:
              - Read
          # access to config.storage.topic
          - resource:
              type: topic
              name: mirrormaker2-cluster-configs
            operations:
              - Create
              - Describe
              - DescribeConfigs
              - Read
              - Write
          # access to status.storage.topic
          - resource:
              type: topic
              name: mirrormaker2-cluster-status
            operations:
              - Create
              - Describe
              - DescribeConfigs
              - Read
              - Write
          # access to offset.storage.topic
          - resource:
              type: topic
              name: mirrormaker2-cluster-offsets
            operations:
              - Create
              - Describe
              - DescribeConfigs
              - Read
              - Write
          # MirrorSourceConnector
          - resource: # Needed for every topic which is mirrored
              type: topic
              name: "*"
            operations:
              - Create
              - Alter
              - AlterConfigs
              - Write
          # MirrorCheckpointConnector
          - resource:
              type: cluster
            operations:
              - Describe
          - resource:
              type: topic
              name: my-source-cluster.checkpoints.internal
            operations:
              - Create
              - Describe
              - Read
              - Write
          - resource: # Needed for every group for which the offset is synced
              type: group
              name: "*"
            operations:
              - Read
              - Describe
          # MirrorHeartbeatConnector
          - resource:
              type: topic
              name: heartbeats
            operations:
              - Create
              - Describe
              - Write

    참고

    typetls-external 로 설정하여 User Operator 외부에서 발급된 인증서를 사용할 수 있습니다. 자세한 내용은 KafkaUserSpec 스키마 참조를 참조하십시오.

  4. 소스 및 대상 Kafka 클러스터에 대해 생성한 각 네임스페이스에서 KafkaUser 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_user_configuration_file> -n <namespace>

    User Operator는 선택한 인증 유형에 따라 클라이언트(MirrorMaker)를 나타내는 사용자와 클라이언트 인증에 사용되는 보안 인증 정보를 생성합니다.

    User Operator는 KafkaUser 리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 mTLS 인증을 위한 개인 및 공개 키가 포함되어 있습니다. 공개 키는 클라이언트 CA에서 서명한 사용자 인증서에 포함됩니다.

  5. 소스 및 대상 Kafka 클러스터에 연결하기 위해 인증 세부 정보를 사용하여 KafkaMirrorMaker2 리소스를 구성합니다.

    TLS 암호화 및 mTLS 인증을 사용한 MirrorMaker 2 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker2
    metadata:
      name: my-mirror-maker-2
    spec:
      version: 3.7.0
      replicas: 1
      connectCluster: "my-target-cluster"
      clusters:
        - alias: "my-source-cluster"
          bootstrapServers: my-source-cluster-kafka-bootstrap:9093
          tls: 
    1
    
            trustedCertificates:
              - secretName: my-source-cluster-cluster-ca-cert
                certificate: ca.crt
          authentication: 
    2
    
            type: tls
            certificateAndKey:
              secretName: my-source-user
              certificate: user.crt
              key: user.key
        - alias: "my-target-cluster"
          bootstrapServers: my-target-cluster-kafka-bootstrap:9093
          tls: 
    3
    
            trustedCertificates:
              - secretName: my-target-cluster-cluster-ca-cert
                certificate: ca.crt
          authentication: 
    4
    
            type: tls
            certificateAndKey:
              secretName: my-target-user
              certificate: user.crt
              key: user.key
          config:
            # -1 means it will use the default replication factor configured in the broker
            config.storage.replication.factor: -1
            offset.storage.replication.factor: -1
            status.storage.replication.factor: -1
      mirrors:
        - sourceCluster: "my-source-cluster"
          targetCluster: "my-target-cluster"
          sourceConnector:
            config:
              replication.factor: 1
              offset-syncs.topic.replication.factor: 1
              sync.topic.acls.enabled: "false"
          heartbeatConnector:
            config:
              heartbeats.topic.replication.factor: 1
          checkpointConnector:
            config:
              checkpoints.topic.replication.factor: 1
              sync.group.offsets.enabled: "true"
          topicsPattern: "topic1|topic2|topic3"
          groupsPattern: "group1|group2|group3"

    1
    소스 Kafka 클러스터의 TLS 인증서입니다. 별도의 네임스페이스에 있는 경우 Kafka 클러스터의 네임스페이스에서 클러스터 시크릿을 복사합니다.
    2
    TLS 메커니즘을 사용하여 소스 Kafka 클러스터에 액세스하기 위한 사용자 인증입니다.
    3
    대상 Kafka 클러스터의 TLS 인증서입니다.
    4
    대상 Kafka 클러스터에 액세스하기 위한 사용자 인증입니다.
  6. 대상 Kafka 클러스터와 동일한 네임스페이스에서 KafkaMirrorMaker2 리소스를 생성하거나 업데이트합니다.

    oc apply -f <mirrormaker2_configuration_file> -n <namespace_of_target_cluster>

9.7.8. 수동으로 MirrorMaker 2 커넥터를 중지하거나 일시 중지

KafkaMirrorMaker2 리소스를 사용하여 내부 MirrorMaker 커넥터를 구성하는 경우 상태 구성을 사용하여 커넥터를 중지하거나 일시 중지합니다. 커넥터 및 작업이 인스턴스화되는 일시 중지된 상태와 달리 커넥터를 중지하면 활성 프로세스가 없는 구성만 유지됩니다. 실행으로부터 커넥터를 중지하는 것은 단순히 일시 중지하는 것보다 장기간에 더 적합할 수 있습니다. 일시 중지된 커넥터를 다시 시작하는 속도가 빨라지지만 중지된 커넥터는 메모리와 리소스를 확보할 수 있는 이점이 있습니다.

참고

상태 구성은 KafkaMirrorMaker2ConnectorSpec 스키마의 (더 이상 사용되지 않음) 일시 중지 구성을 교체하여 커넥터를 일시 중지할 수 있습니다. 이전에 일시 중지 구성을 사용하여 커넥터를 일시 중지한 경우 충돌을 방지하기 위해 상태 구성만 사용하도록 전환하는 것이 좋습니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

프로세스

  1. 일시 중지 또는 중지하려는 MirrorMaker 2 커넥터를 제어하는 KafkaMirrorMaker2 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaMirrorMaker2
  2. KafkaMirrorMaker2 리소스를 편집하여 커넥터를 중지하거나 일시 중지합니다.

    MirrorMaker 2 커넥터를 중지하는 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker2
    metadata:
      name: my-mirror-maker2
    spec:
      version: 3.7.0
      replicas: 3
      connectCluster: "my-cluster-target"
      clusters:
        # ...
      mirrors:
      - sourceCluster: "my-cluster-source"
        targetCluster: "my-cluster-target"
        sourceConnector:
          tasksMax: 10
          autoRestart:
            enabled: true
          state: stopped
      # ...

    상태 구성을 중지 또는 일시 중지 하도록 변경합니다. 이 속성이 실행 중이 아닌 경우 커넥터의 기본 상태입니다.

  3. KafkaMirrorMaker2 구성에 변경 사항을 적용합니다.

    상태를 실행 중이거나 구성을 제거하여 커넥터를 다시 시작할 수 있습니다.

참고

또는 Kafka Connect API를 노출 하고 중지 및 일시 중지 를 사용하여 커넥터가 실행되지 않도록 중지할 수 있습니다. 예를 들어 PUT /connectors/<connector_name>/stop. 그런 다음 resume 끝점을 사용하여 다시 시작할 수 있습니다.

9.7.9. 수동으로 MirrorMaker 2 커넥터 다시 시작

strimzi.io/restart-connector 주석을 사용하여 MirrorMaker 2 커넥터의 재시작을 수동으로 트리거합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

프로세스

  1. 재시작하려는 Kafka MirrorMaker 2 커넥터를 제어하는 KafkaMirrorMaker2 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaMirrorMaker2
  2. KafkaMirrorMaker2 사용자 정의 리소스에서 다시 시작할 Kafka MirrorMaker 2 커넥터의 이름을 찾습니다.

    oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>
  3. OpenShift에서 KafkaMirrorMaker2 리소스에 주석을 달아 커넥터 이름을 사용하여 커넥터를 다시 시작합니다.

    oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector=<mirrormaker_connector_name>"

    이 예에서는 my-mirror-maker-2 클러스터의 my-connector 커넥터가 다시 시작됩니다.

    oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector=my-connector"
  4. 다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).

    조정 프로세스에서 주석을 감지한 경우 MirrorMaker 2 커넥터가 다시 시작됩니다. MirrorMaker 2가 요청을 수락하면 KafkaMirrorMaker2 사용자 정의 리소스에서 주석이 제거됩니다.

9.7.10. 수동으로 MirrorMaker 2 커넥터 작업 다시 시작

strimzi.io/restart-connector-task 주석을 사용하여 MirrorMaker 2 커넥터의 재시작을 수동으로 트리거합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

프로세스

  1. 다시 시작하려는 MirrorMaker 2 커넥터 작업을 제어하는 KafkaMirrorMaker2 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaMirrorMaker2
  2. KafkaMirrorMaker2 사용자 정의 리소스에서 다시 시작할 커넥터 이름 및 작업 ID를 찾습니다.

    oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>

    작업 ID는 0부터 시작하여 음수가 아닌 정수입니다.

  3. OpenShift에서 KafkaMirrorMaker2 리소스에 주석을 달아 name 및 ID를 사용하여 커넥터 작업을 다시 시작합니다.

    oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector-task=<mirrormaker_connector_name>:<task_id>"

    이 예에서는 my-mirror-maker-2 클러스터의 my-mirror-maker-2 클러스터의 커넥터 my-connector 작업 0 이 다시 시작됩니다.

    oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector-task=my-connector:0"
  4. 다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).

    조정 프로세스에서 주석을 감지한 경우 MirrorMaker 2 커넥터 작업이 다시 시작됩니다. MirrorMaker 2가 요청을 수락하면 KafkaMirrorMaker2 사용자 정의 리소스에서 주석이 제거됩니다.

9.8. Kafka MirrorMaker 구성 (더 이상 사용되지 않음)

KafkaMirrorMaker 사용자 정의 리소스의 사양 속성을 업데이트하여 Kafka MirrorMaker 배포를 구성합니다.

TLS 또는 SASL 인증을 사용하여 생산자 및 소비자에 대한 액세스 제어를 구성할 수 있습니다. 이 절차에서는 소비자 및 생산자 측에서 TLS 암호화 및 mTLS 인증을 사용하는 구성을 보여줍니다.

Kafka MirrorMaker 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.

중요

Kafka MirrorMaker 1 (문서에서 MirrorMaker 라고도 함)은 Apache Kafka 3.0.0에서 더 이상 사용되지 않으며 Apache Kafka 4.0.0에서 제거됩니다. 결과적으로 Kafka MirrorMaker 1을 배포하는 데 사용되는 KafkaMirrorMaker 사용자 정의 리소스는 Apache Kafka용 Streams에서도 더 이상 사용되지 않습니다. KafkaMirrorMaker 리소스는 Apache Kafka 4.0.0을 채택할 때 Apache Kafka용 Streams에서 제거됩니다. 대신 KafkaMirrorMaker2 사용자 정의 리소스를 IdentityReplicationPolicy 와 함께 사용합니다.

KafkaMirrorMaker 사용자 정의 리소스 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker
metadata:
  name: my-mirror-maker
spec:
  replicas: 3 
1

  consumer:
    bootstrapServers: my-source-cluster-kafka-bootstrap:9092 
2

    groupId: "my-group" 
3

    numStreams: 2 
4

    offsetCommitInterval: 120000 
5

    tls: 
6

      trustedCertificates:
      - secretName: my-source-cluster-ca-cert
        certificate: ca.crt
    authentication: 
7

      type: tls
      certificateAndKey:
        secretName: my-source-secret
        certificate: public.crt
        key: private.key
    config: 
8

      max.poll.records: 100
      receive.buffer.bytes: 32768
  producer:
    bootstrapServers: my-target-cluster-kafka-bootstrap:9092
    abortOnSendFailure: false 
9

    tls:
      trustedCertificates:
      - secretName: my-target-cluster-ca-cert
        certificate: ca.crt
    authentication:
      type: tls
      certificateAndKey:
        secretName: my-target-secret
        certificate: public.crt
        key: private.key
    config:
      compression.type: gzip
      batch.size: 8192
  include: "my-topic|other-topic" 
10

  resources: 
11

    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "2"
      memory: 2Gi
  logging: 
12

    type: inline
    loggers:
      mirrormaker.root.logger: INFO
  readinessProbe: 
13

    initialDelaySeconds: 15
    timeoutSeconds: 5
  livenessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
  metricsConfig: 
14

   type: jmxPrometheusExporter
   valueFrom:
     configMapKeyRef:
       name: my-config-map
       key: my-key
  jvmOptions: 
15

    "-Xmx": "1g"
    "-Xms": "1g"
  image: my-org/my-image:latest 
16

  template: 
17

    pod:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: application
                    operator: In
                    values:
                      - postgresql
                      - mongodb
              topologyKey: "kubernetes.io/hostname"
    mirrorMakerContainer: 
18

      env:
        - name: OTEL_SERVICE_NAME
          value: my-otel-service
        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: "http://otlp-host:4317"
  tracing: 
19

    type: opentelemetry

1
복제본 노드 수입니다.
2
소비자 및 생산자를 위한 부트스트랩 서버.
3
소비자의 그룹 ID입니다.
4
소비자 스트림 수입니다.
5
오프셋 자동 커밋 간격(밀리초)입니다.
6
TLS 인증서가 소비자 또는 생산자를 위해 X.509 형식으로 저장되는 키 이름이 있는 TLS 암호화입니다. 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
7
mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 소비자 또는 생산자에 대한 인증입니다.
8
소비자 및 생산자에 대한 Kafka 구성 옵션입니다.
9
abortOnSendFailure 속성이 true 로 설정된 경우 Kafka MirrorMaker가 종료되고 메시지 전송 실패 후 컨테이너가 다시 시작됩니다.
10
소스에서 대상 Kafka 클러스터로 미러링된 포함된 주제 목록입니다.
11
지원되는 리소스(현재 cpumemory ) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다.
12
지정된 로거 및 로그 수준이 직접(인라인) 또는 ConfigMap을 통해 간접적으로(외부) 추가됩니다. 사용자 정의 Log4j 구성은 ConfigMap의 log4j.properties 또는 log4j2.properties 키 아래에 배치해야 합니다. mirrorMaker에는 mirrormaker.root.logger 라는 단일 로거가 있습니다. 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다.
13
컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
14
Prometheus 지표: 이 예제에서 Prometheus Cryostat 내보내기에 대한 구성이 포함된 ConfigMap을 참조하여 활성화됩니다. metricsConfig.valueFrom.configMapKeyRef.key 아래에 빈 파일이 포함된 ConfigMap에 대한 참조를 사용하여 추가 구성 없이 메트릭을 활성화할 수 있습니다.
15
Kafka MirrorMaker를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
16
ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
17
템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
18
환경 변수는 분산 추적에 대해 설정됩니다.
19
OpenTelemetry를 사용하여 분산 추적을 활성화합니다.
주의

abortOnSendFailure 속성을 false 로 설정하면 생산자가 주제에서 다음 메시지를 보냅니다. 실패한 메시지를 다시 전송하려는 시도가 없기 때문에 원래 메시지가 손실될 수 있습니다.

9.9. Kafka 브리지 구성

KafkaBridge 사용자 정의 리소스의 spec 속성을 업데이트하여 Kafka Bridge 배포를 구성합니다.

클라이언트 소비자 요청이 다른 Kafka Bridge 인스턴스에서 처리할 때 발생하는 문제를 방지하려면 요청이 올바른 Kafka Bridge 인스턴스로 라우팅되도록 주소 기반 라우팅을 사용해야 합니다. 또한 각 독립적인 Kafka Bridge 인스턴스에는 복제본이 있어야 합니다. Kafka 브리지 인스턴스에는 다른 인스턴스와 공유되지 않는 자체 상태가 있습니다.

Kafka Bridge 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.

KafkaBridge 사용자 정의 리소스 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaBridge
metadata:
  name: my-bridge
spec:
  replicas: 3 
1

  bootstrapServers: <cluster_name>-cluster-kafka-bootstrap:9092 
2

  tls: 
3

    trustedCertificates:
      - secretName: my-cluster-cluster-cert
        certificate: ca.crt
      - secretName: my-cluster-cluster-cert
        certificate: ca2.crt
  authentication: 
4

    type: tls
    certificateAndKey:
      secretName: my-secret
      certificate: public.crt
      key: private.key
  http: 
5

    port: 8080
    cors: 
6

      allowedOrigins: "https://strimzi.io"
      allowedMethods: "GET,POST,PUT,DELETE,OPTIONS,PATCH"
  consumer: 
7

    config:
      auto.offset.reset: earliest
  producer: 
8

    config:
      delivery.timeout.ms: 300000
  resources: 
9

    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "2"
      memory: 2Gi
  logging: 
10

    type: inline
    loggers:
      logger.bridge.level: INFO
      # enabling DEBUG just for send operation
      logger.send.name: "http.openapi.operation.send"
      logger.send.level: DEBUG
  jvmOptions: 
11

    "-Xmx": "1g"
    "-Xms": "1g"
  readinessProbe: 
12

    initialDelaySeconds: 15
    timeoutSeconds: 5
  livenessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
  image: my-org/my-image:latest 
13

  template: 
14

    pod:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: application
                    operator: In
                    values:
                      - postgresql
                      - mongodb
              topologyKey: "kubernetes.io/hostname"
    bridgeContainer: 
15

      env:
        - name: OTEL_SERVICE_NAME
          value: my-otel-service
        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: "http://otlp-host:4317"
  tracing:
    type: opentelemetry 
16

1
복제본 노드 수입니다.
2
대상 Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다. Kafka 클러스터 이름을 < cluster_name>으로 사용합니다.
3
TLS 인증서가 소스 Kafka 클러스터의 X.509 형식으로 저장되는 키 이름이 있는 TLS 암호화입니다. 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
4
mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 Kafka Bridge 클러스터에 대한 인증입니다. 기본적으로 Kafka 브리지는 인증 없이 Kafka 브로커에 연결합니다.
5
Kafka 브로커에 대한 HTTP 액세스
6
CORS 액세스는 선택한 리소스 및 액세스 방법을 지정합니다. 요청의 추가 HTTP 헤더는 Kafka 클러스터에 액세스할 수 있는 원본을 설명합니다.
7
소비자 구성 옵션.
8
생산자 구성 옵션.
9
지원되는 리소스(현재 cpumemory ) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다.
10
지정된 Kafka 브리지 로거 및 로그 수준이 직접(인라인) 또는 ConfigMap을 통해 간접적으로(외부)됩니다. 사용자 정의 Log4j 구성은 ConfigMap의 log4j.properties 또는 log4j2.properties 키 아래에 배치해야 합니다. Kafka 브리지 로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다.
11
Kafka 브리지를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
12
컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
13
선택 사항: 특정 상황에서만 권장되는 컨테이너 이미지 구성입니다.
14
템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
15
환경 변수는 분산 추적에 대해 설정됩니다.
16
OpenTelemetry를 사용하여 분산 추적을 활성화합니다.

9.10. Kafka 및 Zoo Cryostat 스토리지 구성

Apache Kafka용 스트림은 Kafka 및 Zoo Cryostat의 데이터 스토리지 옵션을 구성하는 유연성을 제공합니다.

지원되는 스토리지 유형은 다음과 같습니다.

  • ephemeral (개발에만 권장)
  • persistent
  • JBOD(Kafka만 해당; Zoo Cryostat에서는 사용할 수 없음)
  • 계층화된 스토리지(Early Access)

스토리지를 구성하려면 구성 요소의 사용자 지정 리소스에서 스토리지 속성을 지정합니다. 스토리지 유형은 storage.type 속성을 사용하여 설정됩니다. 노드 풀을 사용하는 경우 Kafka 클러스터에서 사용되는 각 노드 풀에 고유한 스토리지 구성을 지정할 수 있습니다. Kafka 리소스에서 사용할 수 있는 동일한 스토리지 속성도 Kafka NodePool 풀 리소스에서 사용할 수 있습니다.

계층화된 스토리지는 다양한 특성을 가진 스토리지 유형의 병렬 사용을 활용하여 데이터 관리에 더 많은 유연성을 제공합니다. 예를 들어 계층화된 스토리지는 다음을 포함할 수 있습니다.

  • 성능 향상 및 높은 비용 블록 스토리지
  • 성능 절감 및 비용 객체 스토리지

계층화된 스토리지는 Kafka의 초기 액세스 기능입니다. 계층화된 스토리지를 구성하려면 tieredStorage 속성을 지정합니다. 계층화된 스토리지는 Kafka 사용자 정의 리소스를 사용하여 클러스터 수준에서만 구성됩니다.

스토리지 관련 스키마 참조는 스토리지 구성 속성에 대한 자세한 정보를 제공합니다.

주의

Kafka 클러스터를 배포한 후에는 스토리지 유형을 변경할 수 없습니다.

9.10.1. 데이터 스토리지 고려 사항

Apache Kafka의 스트림이 제대로 작동하려면 효율적인 데이터 스토리지 인프라가 필요합니다. 블록 스토리지를 사용하는 것이 좋습니다. Apache Kafka의 스트림은 블록 스토리지에서만 사용하도록 테스트됩니다. NFS와 같은 파일 스토리지는 테스트되지 않으며 작동한다고 보장할 수 없습니다.

블록 스토리지에 대해 다음 옵션 중 하나를 선택합니다.

참고

Apache Kafka의 스트림에는 OpenShift 원시 블록 볼륨이 필요하지 않습니다.

9.10.1.1. 파일 시스템

Kafka는 메시지를 저장하기 위해 파일 시스템을 사용합니다. Apache Kafka의 스트림은 Kafka와 함께 일반적으로 사용되는 XFS 및 ext4 파일 시스템과 호환됩니다. 파일 시스템을 선택하고 설정할 때 배포의 기본 아키텍처 및 요구 사항을 고려하십시오.

자세한 내용은 Kafka 문서 의 파일 시스템 선택을 참조하십시오.

9.10.1.2. 디스크 사용량

Apache Kafka 및 Zoo Cryostat에 대해 별도의 디스크를 사용합니다.

SSD(Solid-State Drive)는 필수는 아니지만 여러 주제로 데이터를 보내고 비동기적으로 수신하는 대규모 클러스터에서 Kafka의 성능을 향상시킬 수 있습니다. SSD는 Zoo Cryostat에서 특히 효과적이며 빠르고 짧은 대기 시간 데이터 액세스가 필요합니다.

참고

Kafka 및 Zoo Cryostat 둘 다 데이터 복제가 내장되어 있기 때문에 복제된 스토리지를 프로비저닝할 필요가 없습니다.

9.10.2. 임시 스토리지

임시 데이터 스토리지는 일시적인 것입니다. 노드의 모든 Pod는 로컬 임시 스토리지 공간을 공유합니다. 데이터를 사용하는 Pod가 실행 중인 동안 데이터가 유지됩니다. Pod가 삭제되면 데이터가 손실됩니다. Pod는 고가용성 환경에서 데이터를 복구할 수 있습니다.

일시적인 특성으로 인해 임시 스토리지는 개발 및 테스트에만 권장됩니다.

임시 스토리지는 emptyDir 볼륨을 사용하여 데이터를 저장합니다. 노드에 Pod가 할당되면 emptyDir 볼륨이 생성됩니다. sizeLimit 속성을 사용하여 emptyDir 의 총 스토리지 양을 설정할 수 있습니다.

중요

임시 스토리지는 복제 인수가 1인 단일 노드 Zoo Cryostat 클러스터 또는 Kafka 항목에 적합하지 않습니다.

임시 스토리지를 사용하려면 Kafka 또는 Zoo Cryostat 리소스의 스토리지 유형 구성을 임시 로 설정합니다. 노드 풀을 사용하는 경우 개별 노드 풀의 스토리지 구성에서 임시 를 지정할 수도 있습니다.

임시 스토리지 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    storage:
      type: ephemeral
    # ...
  zookeeper:
    storage:
      type: ephemeral
    # ...

9.10.2.1. Kafka 로그 디렉터리의 마운트 경로

임시 볼륨은 Kafka 브로커가 다음 경로에 마운트된 로그 디렉터리로 사용합니다.

/var/lib/kafka/data/kafka-logIDX

여기서 IDX 는 Kafka 브로커 Pod 인덱스입니다. 예: /var/lib/kafka/data/kafka-log0.

9.10.3. 영구 스토리지

영구 데이터 스토리지는 시스템 중단 시 데이터를 유지합니다. 영구 데이터 스토리지를 사용하는 Pod의 경우 Pod 오류가 발생하고 다시 시작할 때마다 데이터가 유지됩니다. 영구 특성으로 인해 프로덕션 환경에 영구 스토리지를 사용하는 것이 좋습니다.

Apache Kafka용 Streams에서 영구 스토리지를 사용하려면 Kafka 또는 Zoo Cryostat 리소스의 스토리지 구성에 persistent-claim 을 지정합니다. 노드 풀을 사용하는 경우 개별 노드 풀의 스토리지 구성에 persistent-claim 을 지정할 수도 있습니다.

Pod에서 PVC( 영구 볼륨 클레임 )를 사용하여 PV(영구 볼륨)에서 스토리지 요청을 수행하도록 리소스를 구성합니다. PV는 필요에 따라 생성되며 이를 사용하는 Pod와 독립적인 스토리지 볼륨을 나타냅니다. PVC는 Pod를 생성할 때 필요한 스토리지 양을 요청합니다. PV의 기본 스토리지 인프라를 이해할 필요가 없습니다. PV가 스토리지 기준과 일치하면 PVC가 PV에 바인딩됩니다.

스토리지 유형을 지정하는 방법은 다음 두 가지가 있습니다.

storage.type: persistent-claim
persistent-claim 을 스토리지 유형으로 선택하면 단일 영구 스토리지 볼륨이 정의됩니다.
storage.type: jbod
스토리지 유형으로 jbod 를 선택하면 고유한 ID를 사용하여 영구 스토리지 볼륨 배열을 정의할 수 있는 유연성이 있습니다.

프로덕션 환경에서는 다음을 구성하는 것이 좋습니다.

  • Kafka 또는 노드 풀의 경우 storage.type 을 하나 이상의 영구 볼륨이 있는 jbod 로 설정합니다.
  • Zoo Cryostat의 경우 storage.type 을 단일 영구 볼륨에 대한 영구 클레임으로 설정합니다.

영구 스토리지에는 다음과 같은 구성 옵션도 있습니다.

ID (선택 사항)
저장 ID 번호입니다. 이 옵션은 JBOD 스토리지 선언에 정의된 스토리지 볼륨에 필요합니다. 기본값은 0 입니다.
크기 (필수)
영구 볼륨 클레임의 크기(예: "1000Gi").
클래스 (선택 사항)
PVC는 StorageClass 를 지정하여 다양한 유형의 영구 스토리지를 요청할 수 있습니다. 스토리지 클래스는 스토리지 프로필을 정의하고 해당 프로필을 기반으로 PV를 동적으로 프로비저닝합니다. 스토리지 클래스를 지정하지 않으면 OpenShift 클러스터에서 기본값으로 표시된 스토리지 클래스가 사용됩니다. 영구 스토리지 옵션에는 SAN 스토리지 유형 또는 로컬 영구 볼륨이 포함될 수 있습니다.
선택기 (선택 사항)
특정 PV를 지정하는 구성입니다. 선택한 볼륨의 레이블을 나타내는 키:값 쌍을 제공합니다.
DeleteClaim (선택 사항)
클러스터가 제거될 때 PVC가 삭제되었는지 여부를 지정하는 부울 값입니다. 기본값은 false 입니다.
주의

Apache Kafka 클러스터의 기존 Streams에서 영구 볼륨 크기를 늘리는 것은 영구 볼륨 크기 조정을 지원하는 OpenShift 버전에서만 지원됩니다. 크기를 조정할 영구 볼륨은 볼륨 확장을 지원하는 스토리지 클래스를 사용해야 합니다. 볼륨 확장을 지원하지 않는 다른 OpenShift 버전 및 스토리지 클래스의 경우 클러스터를 배포하기 전에 필요한 스토리지 크기를 결정해야 합니다. 기존 영구 볼륨의 크기를 줄일 수 없습니다.

Kafka 및 Zoo Cryostat에 대한 영구 스토리지 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
      - id: 1
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
      - id: 2
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
    # ...
  zookeeper:
    storage:
      type: persistent-claim
      size: 1000Gi
    # ...

특정 스토리지 클래스가 있는 영구 스토리지 구성의 예

# ...
storage:
  type: persistent-claim
  size: 500Gi
  class: my-storage-class
# ...

선택기 를 사용하여 SSD와 같은 특정 기능을 제공하는 레이블이 지정된 영구 볼륨을 지정합니다.

selector가 있는 영구 스토리지 구성의 예

# ...
storage:
  type: persistent-claim
  size: 1Gi
  selector:
    hdd-type: ssd
  deleteClaim: true
# ...

9.10.3.1. 스토리지 클래스 덮어쓰기

기본 스토리지 클래스를 사용하는 대신 Kafka 또는 Zoo Cryostat 노드에 대해 다른 스토리지 클래스를 지정할 수 있습니다. 예를 들어 스토리지 클래스가 다른 가용성 영역 또는 데이터 센터로 제한되는 경우 유용합니다. 이 목적을 위해 overrides 필드를 사용할 수 있습니다.

이 예에서 기본 스토리지 클래스의 이름은 my-storage-class:입니다.

클래스 덮어쓰기가 포함된 스토리지 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  labels:
    app: my-cluster
  name: my-cluster
  namespace: myproject
spec:
  # ...
  kafka:
    replicas: 3
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
        class: my-storage-class
        overrides:
        - broker: 0
          class: my-storage-class-zone-1a
        - broker: 1
          class: my-storage-class-zone-1b
        - broker: 2
          class: my-storage-class-zone-1c
      # ...
  # ...
  zookeeper:
    replicas: 3
    storage:
      deleteClaim: true
      size: 100Gi
      type: persistent-claim
      class: my-storage-class
      overrides:
        - broker: 0
          class: my-storage-class-zone-1a
        - broker: 1
          class: my-storage-class-zone-1b
        - broker: 2
          class: my-storage-class-zone-1c
  # ...

구성된 overrides 속성의 결과로 볼륨은 다음 스토리지 클래스를 사용합니다.

  • Zoo Cryostat 노드 0의 영구 볼륨은 my-storage-class-zone-1a 를 사용합니다.
  • Zoo Cryostat 노드 1의 영구 볼륨은 my-storage-class-zone-1b 를 사용합니다.
  • Zoo Cryostat 노드 2의 영구 볼륨은 my-storage-class-zone-1c 를 사용합니다.
  • Kafka 브로커 0의 영구 볼륨은 my-storage-class-zone-1a 를 사용합니다.
  • Kafka 브로커 1의 영구 볼륨은 my-storage-class-zone-1b 를 사용합니다.
  • Kafka 브로커 2의 영구 볼륨은 my-storage-class-zone-1c 를 사용합니다.

overrides 속성은 현재 스토리지 클래스 를 재정의하는 데만 사용됩니다. 다른 스토리지 구성 속성에 대한 재정의는 현재 지원되지 않습니다.

9.10.3.2. 영구 스토리지를 위한 PVC 리소스

영구 스토리지를 사용하면 다음 이름으로 PVC를 생성합니다.

data-cluster-name-kafka-idx
Kafka 브로커 Pod idx 의 데이터를 저장하는 데 사용되는 볼륨의 PVC입니다.
data-cluster-name-zookeeper-idx
Zoo Cryostat 노드 Pod idx 의 데이터를 저장하는 데 사용되는 볼륨의 PVC입니다.
9.10.3.3. Kafka 로그 디렉터리의 마운트 경로

영구 볼륨은 Kafka 브로커가 다음 경로에 마운트된 로그 디렉터리로 사용합니다.

/var/lib/kafka/data/kafka-logIDX

여기서 IDX 는 Kafka 브로커 Pod 인덱스입니다. 예: /var/lib/kafka/data/kafka-log0.

9.10.4. 영구 볼륨 크기 조정

클러스터에서 사용하는 영구 볼륨은 스토리지 인프라에서 지원하는 한 데이터 손실 위험없이 크기를 조정할 수 있습니다. 구성 업데이트에 따라 스토리지 크기를 변경하면 Apache Kafka의 Streams는 스토리지 인프라에 변경하도록 지시합니다. 스토리지 확장은 persistent-claim 볼륨을 사용하는 Apache Kafka 클러스터의 Streams에서 지원됩니다.

스토리지 감소는 브로커당 여러 디스크를 사용하는 경우에만 가능합니다. 디스크의 모든 파티션을 동일한 브로커(intra-broker) 내의 다른 볼륨으로 이동하거나 동일한 클러스터 내의 다른 브로커(클러스터 내)로 이동한 후 디스크를 제거할 수 있습니다.

중요

현재 OpenShift에서 지원되지 않으므로 영구 볼륨의 크기를 줄일 수 없습니다.

사전 요구 사항

  • 볼륨 크기 조정을 지원하는 OpenShift 클러스터입니다.
  • Cluster Operator가 실행 중입니다.
  • 볼륨 확장을 지원하는 스토리지 클래스를 사용하여 생성된 영구 볼륨을 사용하는 Kafka 클러스터입니다.

프로세스

  1. 클러스터의 Kafka 리소스를 편집합니다.

    Kafka 클러스터, Zoo Cryostat 클러스터 또는 둘 다에 할당된 영구 볼륨의 크기를 늘리려면 size 속성을 변경합니다.

    • Kafka 클러스터의 경우 spec.kafka.storage 에서 size 속성을 업데이트합니다.
    • Zoo Cryostat 클러스터의 경우 spec.zookeeper.storage 에서 size 속성을 업데이트합니다.

    볼륨 크기를 2000Gi로 늘리는 Kafka 구성

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        storage:
          type: persistent-claim
          size: 2000Gi
          class: my-storage-class
        # ...
      zookeeper:
        # ...

  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

    OpenShift는 Cluster Operator의 요청에 대한 응답으로 선택한 영구 볼륨의 용량을 늘립니다. 크기 조정이 완료되면 Cluster Operator는 크기가 조정된 영구 볼륨을 사용하는 모든 Pod를 재시작합니다. 이 작업은 자동으로 수행됩니다.

  3. 클러스터의 관련 Pod에 대해 스토리지 용량이 증가했는지 확인합니다.

    oc get pv

    스토리지가 증가된 Kafka 브로커 Pod

    NAME               CAPACITY   CLAIM
    pvc-0ca459ce-...   2000Gi     my-project/data-my-cluster-kafka-2
    pvc-6e1810be-...   2000Gi     my-project/data-my-cluster-kafka-0
    pvc-82dc78c9-...   2000Gi     my-project/data-my-cluster-kafka-1

    출력에는 브로커 Pod와 연결된 각 PVC의 이름이 표시됩니다.

9.10.5. JBOD 스토리지

JBOD 스토리지를 사용하면 여러 디스크 또는 볼륨을 사용하도록 Kafka 클러스터를 구성할 수 있습니다. 이 접근 방식은 Kafka 브로커의 데이터 스토리지 용량이 증가하여 성능이 향상될 수 있습니다. JBOD 구성은 하나 이상의 볼륨으로 정의되며, 각 볼륨은 임시 또는 영구 일 수 있습니다. JBOD 볼륨 선언의 규칙 및 제약 조건은 임시 및 영구 스토리지의 규칙과 제약 조건과 동일합니다. 예를 들어 프로비저닝된 후에는 영구 스토리지 볼륨의 크기를 줄일 수 없으며 유형이 임시 인 경우 sizeLimit 값을 변경할 수 없습니다.

참고

JBOD 스토리지는 Kafka에서만 지원되며 Zoo Cryostat에서는 지원되지 않습니다.

JBOD 스토리지를 사용하려면 Kafka 리소스의 스토리지 유형 구성을 jbod 로 설정합니다. 노드 풀을 사용하는 경우 개별 노드 풀의 스토리지 구성에 jbod 를 지정할 수도 있습니다.

volumes 속성을 사용하면 JBOD 스토리지 어레이 또는 구성을 구성하는 디스크를 설명할 수 있습니다.

JBOD 스토리지 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
      - id: 1
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  # ...

JBOD 볼륨이 생성되면 ID를 변경할 수 없습니다. JBOD 구성에서 볼륨을 추가하거나 제거할 수 있습니다.

9.10.5.1. JBOD 스토리지용 PVC 리소스

영구 스토리지를 사용하여 JBOD 볼륨을 선언하면 다음 이름으로 PVC를 생성합니다.

data-id-cluster-name-kafka-idx
Kafka 브로커 Pod idx 의 데이터를 저장하는 데 사용되는 볼륨의 PVC입니다. id 는 Kafka 브로커 pod에 대한 데이터를 저장하는 데 사용되는 볼륨의 ID입니다.
9.10.5.2. Kafka 로그 디렉터리의 마운트 경로

JBOD 볼륨은 Kafka 브로커가 다음 경로에 마운트된 로그 디렉터리로 사용합니다.

/var/lib/kafka/data-id/kafka-logidx

여기서 id 는 Kafka 브로커 포드 idx 에 대한 데이터를 저장하는 데 사용되는 볼륨의 ID입니다. 예: /var/lib/kafka/data-0/kafka-log0.

9.10.6. JBOD 스토리지에 볼륨 추가

다음 절차에서는 JBOD 스토리지를 사용하도록 구성된 Kafka 클러스터에 볼륨을 추가하는 방법을 설명합니다. 다른 스토리지 유형을 사용하도록 구성된 Kafka 클러스터에 적용할 수 없습니다.

참고

과거 및 제거된 ID 아래에 새 볼륨을 추가할 때 이전에 사용한 PersistentVolumeClaims 가 삭제되었는지 확인해야 합니다.

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator
  • JBOD 스토리지가 있는 Kafka 클러스터

프로세스

  1. Kafka 리소스에서 spec.kafka.storage.volumes 속성을 편집합니다. volumes 배열에 새 볼륨을 추가합니다. 예를 들어 ID 2 를 사용하여 새 볼륨을 추가합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        storage:
          type: jbod
          volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false
          - id: 1
            type: persistent-claim
            size: 100Gi
            deleteClaim: false
          - id: 2
            type: persistent-claim
            size: 100Gi
            deleteClaim: false
        # ...
      zookeeper:
        # ...
  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>
  3. 새 주제를 만들거나 기존 파티션을 새 디스크에 다시 할당합니다.

    작은 정보

    크루즈 컨트롤은 파티션을 다시 할당하는 효과적인 도구입니다. intra-broker 디스크 균형을 수행하려면 KafkaRebalance.spec 아래에서 rebalanceDisktrue 로 설정합니다.

9.10.7. JBOD 스토리지에서 볼륨 제거

다음 절차에서는 JBOD 스토리지를 사용하도록 구성된 Kafka 클러스터에서 볼륨을 제거하는 방법을 설명합니다. 다른 스토리지 유형을 사용하도록 구성된 Kafka 클러스터에 적용할 수 없습니다. JBOD 스토리지에는 항상 하나 이상의 볼륨이 포함되어야 합니다.

중요

데이터 손실을 방지하려면 볼륨을 제거하기 전에 모든 파티션을 이동해야 합니다.

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator
  • 두 개 이상의 볼륨이 있는 JBOD 스토리지가 있는 Kafka 클러스터

프로세스

  1. 제거하려는 디스크에서 모든 파티션을 다시 할당합니다. 제거하려는 디스크에 여전히 할당된 파티션의 데이터가 손실될 수 있습니다.

    작은 정보

    kafka-reassign-partitions.sh 툴을 사용하여 파티션을 다시 할당할 수 있습니다.

  2. Kafka 리소스에서 spec.kafka.storage.volumes 속성을 편집합니다. volumes 배열에서 하나 이상의 볼륨을 제거합니다. 예를 들어 ID가 1 인 볼륨을 제거합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        storage:
          type: jbod
          volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false
        # ...
      zookeeper:
        # ...
  3. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

9.10.8. 계층화된 스토리지(주요 액세스)

계층화된 스토리지는 로그 세그먼트가 별도의 스토리지 시스템으로 이동하는 Kafka 데이터를 관리하는 유연한 접근 방식을 도입합니다. 예를 들어 자주 액세스하는 데이터를 위해 브로커에서 블록 스토리지 사용을 결합하고 데이터 접근성 및 지속성을 손상시키지 않고 블록 스토리지에서 더 비용 효율적이고 확장 가능한 원격 스토리지 솔루션으로 이전 또는 더 적은 액세스 가능한 데이터를 오프로드할 수 있습니다.

주의

계층화된 스토리지는 초기 액세스 Kafka 기능이며, Apache Kafka용 Streams에서도 사용할 수 있습니다. 현재 제한 사항으로 인해 프로덕션 환경에는 권장되지 않습니다.

계층화된 스토리지에는 Kafka와 원격 스토리지 시스템 간의 통신을 처리하기 위해 Kafka의 RemoteStorageManager 인터페이스를 구현해야 하며 Kafka 리소스 구성을 통해 활성화됩니다. Apache Kafka용 스트림은 사용자 정의 계층 스토리지가 활성화된 경우 RLMM(Remote Log Metadata Management)에 Kafka의 TopicBasedRemoteLogMetadataManager 를 사용합니다. RLMM은 원격 스토리지와 관련된 메타데이터를 관리합니다.

사용자 정의 계층 스토리지를 사용하려면 다음을 수행합니다.

  • 사용자 지정 컨테이너 이미지를 빌드하여 Streams for Apache Kafka 이미지에 Kafka의 계층화된 스토리지 플러그인을 포함합니다. 플러그인은 계층화된 스토리지 솔루션과 상호 작용하기 위해 Apache Kafka의 Streams에서 관리하는 Kafka 클러스터에 필요한 기능을 제공해야 합니다.
  • Kafka 리소스의 tieredStorage 속성을 사용하여 계층화된 스토리지에 Kafka 를 구성합니다. 사용자 정의 RemoteStorageManager 구현의 클래스 이름 및 경로와 추가 구성을 지정합니다.
  • 필요한 경우 RLMM 특정 계층 스토리지 구성을 지정합니다.

Kafka에 대한 사용자 정의 계층 스토리지 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    tieredStorage:
      type: custom 
1

      remoteStorageManager: 
2

        className: com.example.kafka.tiered.storage.s3.S3RemoteStorageManager
        classPath: /opt/kafka/plugins/tiered-storage-s3/*
        config:
          storage.bucket.name: my-bucket 
3

          # ...
    config:
      rlmm.config.remote.log.metadata.topic.replication.factor: 1 
4

  # ...

1
유형을 custom 로 설정해야 합니다.
2
클래스 이름 및 경로를 포함하여 사용자 정의 RemoteStorageManager 구현의 구성입니다.
3
Apache Kafka용 Streams가 rsm.config를 자동으로 접두사로 지정하는 사용자 지정 RemoteStorageManager 구현에 전달할 구성입니다.
4
rlmm.config. 접두사가 필요한 RLMM에 전달할 계층화된 스토리지 구성입니다. 계층화된 스토리지 구성에 대한 자세한 내용은 Apache Kafka 설명서 를 참조하십시오.

9.11. CPU 및 메모리 리소스 제한 및 요청 구성

기본적으로 Streams for Apache Kafka Cluster Operator는 배포된 피연산자에 대한 CPU 및 메모리 리소스 요청 및 제한을 지정하지 않습니다. Kafka에서 안정성을 유지하고 최적의 성능을 달성하는 데 중요한 리소스를 할당하는 것이 중요합니다. 이상적인 리소스 할당은 특정 요구 사항 및 사용 사례에 따라 다릅니다.

적절한 요청 및 제한을 설정하여 각 컨테이너의 CPU 및 메모리 리소스를 구성하는 것이 좋습니다.

9.12. Pod 예약 구성

동일한 OpenShift 노드에서 예약된 애플리케이션 간 리소스 충돌로 인한 성능 저하를 방지하기 위해 Kafka Pod를 중요한 워크로드와 별도로 예약할 수 있습니다. 이를 위해 특정 노드를 선택하거나 Kafka 전용 노드 세트를 약화할 수 있습니다.

9.12.1. 유사성, 허용 오차 및 토폴로지 분배 제약 조건 지정

유사성, 허용 오차 및 토폴로지 분배 제약 조건을 사용하여 노드에 kafka 리소스의 Pod를 예약합니다. 유사성, 허용 오차 및 토폴로지 분배 제약 조건은 다음 리소스의 유사성,허용 오차topologySpreadConstraint 속성을 사용하여 구성됩니다.

  • Kafka.spec.kafka.template.pod
  • Kafka.spec.zookeeper.template.pod
  • Kafka.spec.entityOperator.template.pod
  • KafkaConnect.spec.template.pod
  • KafkaBridge.spec.template.pod
  • KafkaMirrorMaker.spec.template.pod
  • KafkaMirrorMaker2.spec.template.pod

선호도,허용 오차topologySpreadConstraint 속성 형식의 형식은 OpenShift 사양을 따릅니다. 선호도 구성에는 다양한 유형의 선호도가 포함될 수 있습니다.

  • Pod 유사성 및 유사성 방지
  • 노드 유사성

Pod 유사성 방지를 사용하여 중요한 애플리케이션이 동일한 디스크에 예약되지 않도록 합니다. Kafka 클러스터를 실행할 때는 Pod 유사성 방지를 사용하여 Kafka 브로커가 데이터베이스와 같은 다른 워크로드와 노드를 공유하지 않도록 하는 것이 좋습니다.

9.12.1.2. 노드 유사성을 사용하여 특정 노드에 워크로드 예약

OpenShift 클러스터는 일반적으로 다양한 유형의 작업자 노드로 구성됩니다. 일부는 CPU가 많은 워크로드, 일부 메모리에 최적화되어 있고 다른 일부는 스토리지(빠른 로컬 SSD) 또는 네트워크에 최적화될 수 있습니다. 다른 노드를 사용하면 비용과 성능을 모두 최적화하는 데 도움이 됩니다. 최상의 성능을 얻으려면 Apache Kafka 구성 요소가 올바른 노드를 사용할 수 있도록 스트림 예약을 허용하는 것이 중요합니다.

OpenShift는 노드 유사성을 사용하여 특정 노드에 워크로드를 예약합니다. 노드 유사성을 사용하면 Pod를 예약할 노드에 대한 스케줄링 제약 조건을 생성할 수 있습니다. 제약 조건은 라벨 선택기로 지정됩니다. 올바른 노드를 선택하려면 beta.kubernetes.io/instance-type 또는 사용자 정의 레이블과 같은 기본 제공 노드 레이블을 사용하여 라벨을 지정할 수 있습니다.

9.12.1.3. 전용 노드에 노드 유사성 및 허용 오차 사용

테인트를 사용하여 전용 노드를 생성한 다음 노드 유사성 및 허용 오차를 구성하여 전용 노드에서 Kafka Pod를 예약합니다.

클러스터 관리자는 선택한 OpenShift 노드를 테인트로 표시할 수 있습니다. 테인트가 있는 노드는 일반 스케줄링에서 제외되며 일반 Pod는 해당 노드에서 실행되도록 예약되지 않습니다. 노드에 테인트를 설정할 수 있는 서비스만 예약할 수 있습니다. 이러한 노드에서 실행되는 유일한 다른 서비스는 로그 수집기 또는 소프트웨어 정의 네트워크와 같은 시스템 서비스입니다.

전용 노드에서 Kafka 및 해당 구성 요소를 실행하면 많은 이점이 있을 수 있습니다. 동일한 노드에서 실행 중인 다른 애플리케이션은 없으며 Kafka에 필요한 리소스를 방해하거나 사용할 수 있습니다. 이로 인해 성능 및 안정성이 향상될 수 있습니다.

많은 Kafka 브로커 또는 Zoo Cryostat 노드는 동일한 OpenShift 작업자 노드에서 실행할 수 있습니다. 작업자 노드가 실패하면 모두 동시에 사용할 수 없게 됩니다. 안정성을 개선하기 위해 podAntiAffinity 구성을 사용하여 다른 OpenShift 작업자 노드에서 각 Kafka 브로커 또는 Zoo Cryostat 노드를 예약할 수 있습니다.

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator

프로세스

  1. 클러스터 배포를 지정하는 리소스에서 affinity 속성을 편집합니다. Kafka 브로커 또는 Zoo Cryostat 노드에서 작업자 노드를 공유하지 않도록 하려면 strimzi.io/name 레이블을 사용합니다. topologyKeykubernetes.io/hostname 으로 설정하여 선택한 Pod가 동일한 호스트 이름이 있는 노드에서 예약되지 않도록 지정합니다. 이렇게 하면 단일 Kafka 브로커 및 단일 Zoo Cryostat 노드에서 동일한 작업자 노드를 공유할 수 있습니다. 예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      kafka:
        # ...
        template:
          pod:
            affinity:
              podAntiAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                        - key: strimzi.io/name
                          operator: In
                          values:
                            - CLUSTER-NAME-kafka
                    topologyKey: "kubernetes.io/hostname"
        # ...
      zookeeper:
        # ...
        template:
          pod:
            affinity:
              podAntiAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                        - key: strimzi.io/name
                          operator: In
                          values:
                            - CLUSTER-NAME-zookeeper
                    topologyKey: "kubernetes.io/hostname"
        # ...

    여기서 CLUSTER-NAME 은 Kafka 사용자 정의 리소스의 이름입니다.

  2. Kafka 브로커와 Zoo Cryostat 노드가 동일한 작업자 노드를 공유하지 않도록 하려면 strimzi.io/cluster 레이블을 사용합니다. 예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      kafka:
        # ...
        template:
          pod:
            affinity:
              podAntiAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                        - key: strimzi.io/cluster
                          operator: In
                          values:
                            - CLUSTER-NAME
                    topologyKey: "kubernetes.io/hostname"
        # ...
      zookeeper:
        # ...
        template:
          pod:
            affinity:
              podAntiAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                        - key: strimzi.io/cluster
                          operator: In
                          values:
                            - CLUSTER-NAME
                    topologyKey: "kubernetes.io/hostname"
        # ...

    여기서 CLUSTER-NAME 은 Kafka 사용자 정의 리소스의 이름입니다.

  3. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

9.12.3. Kafka 구성 요소에서 Pod 유사성 방지 구성

Pod 유사성 방지 구성은 Kafka 브로커의 안정성 및 성능에 도움이 됩니다. podAntiAffinity 를 사용하면 OpenShift에서 다른 워크로드와 동일한 노드에 Kafka 브로커를 예약하지 않습니다. 일반적으로 Kafka가 다른 네트워크 또는 스토리지 집약적인 애플리케이션과 동일한 작업자 노드에서 실행되지 않도록 해야 합니다(예: 데이터베이스, 스토리지 또는 기타 메시징 플랫폼).

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator

프로세스

  1. 클러스터 배포를 지정하는 리소스에서 affinity 속성을 편집합니다. 라벨을 사용하여 동일한 노드에서 예약해서는 안 되는 Pod를 지정합니다. 선택한 Pod를 호스트 이름이 동일한 노드에서 예약하지 않도록 topologyKeykubernetes.io/hostname 으로 설정해야 합니다. 예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      kafka:
        # ...
        template:
          pod:
            affinity:
              podAntiAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                        - key: application
                          operator: In
                          values:
                            - postgresql
                            - mongodb
                    topologyKey: "kubernetes.io/hostname"
        # ...
      zookeeper:
        # ...
  2. 리소스를 생성하거나 업데이트합니다.

    이 작업은 oc apply 를 사용하여 수행할 수 있습니다.

    oc apply -f <kafka_configuration_file>

9.12.4. Kafka 구성 요소에서 노드 유사성 구성

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator

프로세스

  1. Streams for Apache Kafka 구성 요소를 예약해야 하는 노드에 레이블을 지정합니다.

    이 작업은 oc label:을 사용하여 수행할 수 있습니다.

    oc label node NAME-OF-NODE node-type=fast-network

    또는 일부 기존 레이블을 재사용할 수 있습니다.

  2. 클러스터 배포를 지정하는 리소스에서 affinity 속성을 편집합니다. 예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      kafka:
        # ...
        template:
          pod:
            affinity:
              nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                    - matchExpressions:
                      - key: node-type
                        operator: In
                        values:
                        - fast-network
        # ...
      zookeeper:
        # ...
  3. 리소스를 생성하거나 업데이트합니다.

    이 작업은 oc apply 를 사용하여 수행할 수 있습니다.

    oc apply -f <kafka_configuration_file>

9.12.5. 전용 노드 설정 및 Pod 예약

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator

프로세스

  1. 전용으로 사용할 노드를 선택합니다.
  2. 이러한 노드에 예약된 워크로드가 없는지 확인합니다.
  3. 선택한 노드에서 테인트를 설정합니다.

    이 작업은 oc adm taint 를 사용하여 수행할 수 있습니다.

    oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule
  4. 또한 선택한 노드에 레이블을 추가합니다.

    이 작업은 oc label:을 사용하여 수행할 수 있습니다.

    oc label node NAME-OF-NODE dedicated=Kafka
  5. 클러스터 배포를 지정하는 리소스에서 유사성허용 오차 속성을 편집합니다.

    예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      kafka:
        # ...
        template:
          pod:
            tolerations:
              - key: "dedicated"
                operator: "Equal"
                value: "Kafka"
                effect: "NoSchedule"
            affinity:
              nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                  - matchExpressions:
                    - key: dedicated
                      operator: In
                      values:
                      - Kafka
        # ...
      zookeeper:
        # ...
  6. 리소스를 생성하거나 업데이트합니다.

    이 작업은 oc apply 를 사용하여 수행할 수 있습니다.

    oc apply -f <kafka_configuration_file>

9.13. 로깅 수준 구성

Kafka 구성 요소의 사용자 지정 리소스와 Apache Kafka Operator의 Streams에서 로깅 수준을 구성합니다. 사용자 정의 리소스의 spec.logging 속성에서 직접 로깅 수준을 지정할 수 있습니다. 또는 configMapKeyRef 속성을 사용하여 사용자 정의 리소스에서 참조되는 ConfigMap에서 로깅 속성을 정의할 수 있습니다.

ConfigMap을 사용하면 로깅 속성이 한 곳에서 유지 관리되고 두 개 이상의 리소스에서 액세스할 수 있다는 이점이 있습니다. 둘 이상의 리소스에 ConfigMap을 재사용할 수도 있습니다. ConfigMap을 사용하여 Apache Kafka Operator의 Streams에 대한 로거를 지정하는 경우 로깅 사양을 추가하여 필터를 추가할 수도 있습니다.

로깅 사양에 로깅 유형을 지정합니다.

  • 로깅 수준을 직접 지정할 때 인라인
  • ConfigMap을 참조할 때 외부

인라인 로깅 구성 예

# ...
logging:
  type: inline
  loggers:
    kafka.root.logger.level: INFO
# ...

외부 로깅 구성 예

# ...
logging:
  type: external
  valueFrom:
    configMapKeyRef:
      name: my-config-map
      key: my-config-map-key
# ...

ConfigMap의 이름 값은 필수입니다. 이름 또는 키가 설정되지 않은 경우 기본 로깅이 사용됩니다.

9.13.1. Kafka 구성 요소 및 Operator의 로깅 옵션

특정 Kafka 구성 요소 또는 Operator의 로깅 구성에 대한 자세한 내용은 다음 섹션을 참조하십시오.

9.13.2. 로깅을 위한 ConfigMap 생성

ConfigMap을 사용하여 로깅 속성을 정의하려면 ConfigMap을 생성한 다음 리소스 사양에 있는 로깅 정의의 일부로 참조합니다.

ConfigMap에는 적절한 로깅 구성이 포함되어야 합니다.

  • Kafka 구성 요소, Zoo Cryostat 및 Kafka 브리지의 log4j.properties
  • Topic Operator 및 User Operator의 log4j2.properties

이러한 속성 아래에 구성을 배치해야 합니다.

이 절차에서 ConfigMap은 Kafka 리소스에 대한 루트 로거를 정의합니다.

프로세스

  1. ConfigMap을 생성합니다.

    ConfigMap을 YAML 파일 또는 속성 파일에서 생성할 수 있습니다.

    Kafka에 대한 루트 로거 정의가 있는 ConfigMap 예:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: logging-configmap
    data:
      log4j.properties:
        kafka.root.logger.level="INFO"

    속성 파일을 사용하는 경우 명령줄에서 파일을 지정합니다.

    oc create configmap logging-configmap --from-file=log4j.properties

    속성 파일은 로깅 구성을 정의합니다.

    # Define the logger
    kafka.root.logger.level="INFO"
    # ...
  2. 리소스 사양에 외부 로깅을 정의하고 logging.valueFrom.configMapKeyRef.name 을 ConfigMap의 이름으로 설정하고 logging.valueFrom.configMapKeyRef.key 를 이 ConfigMap의 키로 설정합니다.

    # ...
    logging:
      type: external
      valueFrom:
        configMapKeyRef:
          name: logging-configmap
          key: log4j.properties
    # ...
  3. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

9.13.3. Cluster Operator 로깅 구성

클러스터 Operator 로깅은 strimzi-cluster-operator 라는 ConfigMap 을 통해 구성됩니다. Cluster Operator를 설치할 때 로깅 구성이 포함된 ConfigMap 이 생성됩니다. 이 ConfigMapinstall/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml 파일에 설명되어 있습니다. 이 ConfigMapdata.log4j2.properties 값을 변경하여 Cluster Operator 로깅을 구성합니다.

로깅 구성을 업데이트하려면 050-ConfigMap-strimzi-cluster-operator.yaml 파일을 편집한 다음 다음 명령을 실행할 수 있습니다.

oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml

또는 ConfigMap 을 직접 편집합니다.

oc edit configmap strimzi-cluster-operator

이 ConfigMap을 사용하면 다양한 구성 요소의 루트 로거 수준, 로그 출력 형식 및 로그 수준을 포함하여 로깅의 다양한 측면을 제어할 수 있습니다. monitorInterval 설정은 로깅 구성이 다시 로드되는 빈도를 결정합니다. Kafka AdminClient, Zoo Cryostat ZKTrustManager, Netty 및 OkHttp 클라이언트의 로깅 수준을 제어할 수도 있습니다. Netty는 네트워크 통신을 위해 Streams for Apache Kafka에 사용되는 프레임워크이며 OkHttp는 HTTP 요청을 만드는 데 사용되는 라이브러리입니다.

Cluster Operator가 배포될 때 ConfigMap 이 없는 경우 기본 로깅 값이 사용됩니다.

Cluster Operator가 배포된 후 ConfigMap 이 실수로 삭제된 경우 가장 최근에 로드된 로깅 구성이 사용됩니다. 새 로깅 구성을 로드할 새 ConfigMap 을 생성합니다.

참고

ConfigMap 에서는 monitorInterval 옵션을 제거하지 마십시오.

9.13.4. Apache Kafka Operator의 Streams에 로깅 필터 추가

ConfigMap을 사용하여 Apache Kafka Operator의 Streams에 대한 (log4j2) 로깅 수준을 구성하는 경우 로깅 필터를 정의하여 로그에 반환되는 항목을 제한할 수도 있습니다.

로깅 필터는 많은 수의 로깅 메시지가 있는 경우에 유용합니다. 로거의 로그 수준을 DEBUG(rootLogger.level="DEBUG")로 설정한다고 가정합니다. 로깅 필터는 해당 수준에서 로거에 대해 반환된 로그 수를 줄이므로 특정 리소스에 집중할 수 있습니다. 필터가 설정되면 필터와 일치하는 로그 메시지만 기록됩니다.

필터는 마커 를 사용하여 로그에 포함할 항목을 지정합니다. 마커의 종류, 네임스페이스 및 이름을 지정합니다. 예를 들어 Kafka 클러스터가 실패하는 경우 kind를 Kafka 로 지정하여 로그를 분리하고 실패한 클러스터의 네임스페이스와 이름을 사용할 수 있습니다.

이 예에서는 my-kafka-cluster 라는 Kafka 클러스터의 마커 필터를 보여줍니다.

기본 로깅 필터 구성

rootLogger.level="INFO"
appender.console.filter.filter1.type=MarkerFilter 
1

appender.console.filter.filter1.onMatch=ACCEPT 
2

appender.console.filter.filter1.onMismatch=DENY 
3

appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster) 
4

1
MarkerFilter 유형은 필터링을 위해 지정된 마커를 비교합니다.
2
마커가 일치하는 경우 onMatch 속성은 로그를 수락합니다.
3
마커가 일치하지 않는 경우 onMismatch 속성은 로그를 거부합니다.
4
필터링에 사용되는 마커는 KIND(NAMESPACE/NAME-OF-RESOURCE) 형식으로 되어 있습니다.

하나 이상의 필터를 만들 수 있습니다. 여기에서 로그는 두 개의 Kafka 클러스터로 필터링됩니다.

여러 로깅 필터 구성

appender.console.filter.filter1.type=MarkerFilter
appender.console.filter.filter1.onMatch=ACCEPT
appender.console.filter.filter1.onMismatch=DENY
appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster-1)
appender.console.filter.filter2.type=MarkerFilter
appender.console.filter.filter2.onMatch=ACCEPT
appender.console.filter.filter2.onMismatch=DENY
appender.console.filter.filter2.marker=Kafka(my-namespace/my-kafka-cluster-2)

Cluster Operator에 필터 추가

Cluster Operator에 필터를 추가하려면 로깅 ConfigMap YAML 파일 (install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml)을 업데이트합니다.

프로세스

  1. 050-ConfigMap-strimzi-cluster-operator.yaml 파일을 업데이트하여 ConfigMap에 필터 속성을 추가합니다.

    이 예에서 필터 속성은 my-kafka-cluster Kafka 클러스터에 대해서만 로그를 반환합니다.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: strimzi-cluster-operator
    data:
      log4j2.properties:
        #...
        appender.console.filter.filter1.type=MarkerFilter
        appender.console.filter.filter1.onMatch=ACCEPT
        appender.console.filter.filter1.onMismatch=DENY
        appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)

    또는 ConfigMap 을 직접 편집합니다.

    oc edit configmap strimzi-cluster-operator
  2. ConfigMap을 직접 편집하는 대신 YAML 파일을 업데이트한 경우 ConfigMap 을 배포하여 변경 사항을 적용합니다.

    oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml

Topic Operator 또는 User Operator에 필터 추가

Topic Operator 또는 User Operator에 필터를 추가하려면 로깅 ConfigMap을 생성하거나 편집합니다.

이 절차에서는 Topic Operator에 대한 필터를 사용하여 로깅 ConfigMap이 생성됩니다. User Operator에도 동일한 접근 방식이 사용됩니다.

프로세스

  1. ConfigMap을 생성합니다.

    ConfigMap을 YAML 파일 또는 속성 파일에서 생성할 수 있습니다.

    이 예제에서 필터 속성은 my-topic 항목에 대해서만 로그를 반환합니다.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: logging-configmap
    data:
      log4j2.properties:
        rootLogger.level="INFO"
        appender.console.filter.filter1.type=MarkerFilter
        appender.console.filter.filter1.onMatch=ACCEPT
        appender.console.filter.filter1.onMismatch=DENY
        appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic)

    속성 파일을 사용하는 경우 명령줄에서 파일을 지정합니다.

    oc create configmap logging-configmap --from-file=log4j2.properties

    속성 파일은 로깅 구성을 정의합니다.

    # Define the logger
    rootLogger.level="INFO"
    # Set the filters
    appender.console.filter.filter1.type=MarkerFilter
    appender.console.filter.filter1.onMatch=ACCEPT
    appender.console.filter.filter1.onMismatch=DENY
    appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic)
    # ...
  2. 리소스 사양에 외부 로깅을 정의하고 logging.valueFrom.configMapKeyRef.name 을 ConfigMap의 이름으로 설정하고 logging.valueFrom.configMapKeyRef.key 를 이 ConfigMap의 키로 설정합니다.

    Topic Operator의 경우 Kafka 리소스의 topicOperator 구성에 로깅이 지정됩니다.

    spec:
      # ...
      entityOperator:
        topicOperator:
          logging:
            type: external
            valueFrom:
              configMapKeyRef:
                name: logging-configmap
                key: log4j2.properties
  3. Cluster Operator를 배포하여 변경 사항을 적용합니다.
create -f install/cluster-operator -n my-cluster-operator-namespace

9.14. ConfigMap을 사용하여 구성 추가

ConfigMap 리소스를 사용하여 Apache Kafka 배포의 Streams에 특정 구성을 추가합니다. ConfigMaps는 키-값 쌍을 사용하여 기밀이 아닌 데이터를 저장합니다. ConfigMap에 추가된 구성 데이터는 한 곳에서 유지 관리되며 구성 요소 간에 재사용할 수 있습니다.

ConfigMaps는 다음 유형의 구성 데이터만 저장할 수 있습니다.

  • 로깅 구성
  • 메트릭 구성
  • Kafka Connect 커넥터에 대한 외부 구성

다른 구성 영역에는 ConfigMap을 사용할 수 없습니다.

구성 요소를 구성할 때 configMapKeyRef 속성을 사용하여 ConfigMap에 참조를 추가할 수 있습니다.

예를 들어 configMapKeyRef 를 사용하여 로깅 구성을 제공하는 ConfigMap을 참조할 수 있습니다. ConfigMap을 사용하여 Log4j 구성 파일을 전달할 수 있습니다. 로깅 구성에 참조를 추가합니다.

로깅을 위한 ConfigMap 예

# ...
logging:
  type: external
  valueFrom:
    configMapKeyRef:
      name: my-config-map
      key: my-config-map-key
# ...

지표 구성에 ConfigMap을 사용하려면 구성 요소의 metricsConfig 구성에 동일한 방식으로 참조를 추가합니다.

ExternalConfiguration 속성은 환경 변수 또는 볼륨으로 사용할 수 있는 Pod에 마운트된 ConfigMap(또는 시크릿)의 데이터를 만듭니다. Kafka Connect에서 사용하는 커넥터의 외부 구성 데이터를 사용할 수 있습니다. 데이터는 외부 데이터 소스와 관련되어 커넥터가 해당 데이터 소스와 통신하는 데 필요한 값을 제공할 수 있습니다.

예를 들어 configMapKeyRef 속성을 사용하여 ConfigMap에서 구성 데이터를 환경 변수로 전달할 수 있습니다.

환경 변수 값을 제공하는 ConfigMap의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect
spec:
  # ...
  externalConfiguration:
    env:
      - name: MY_ENVIRONMENT_VARIABLE
        valueFrom:
          configMapKeyRef:
            name: my-config-map
            key: my-key

외부에서 관리하는 ConfigMap을 사용하는 경우 구성 공급자를 사용하여 ConfigMap에 데이터를 로드합니다.

9.14.1. 사용자 정의 ConfigMap 이름 지정

Apache Kafka용 스트림은 OpenShift에 배포할 때 자체 ConfigMap 및 기타 리소스를 생성합니다. ConfigMap에는 구성 요소를 실행하는 데 필요한 데이터가 포함되어 있습니다. Streams for Apache Kafka에서 생성한 ConfigMap은 편집할 수 없습니다.

생성하는 사용자 정의 ConfigMap에 이러한 기본 ConfigMap과 동일한 이름이 없는지 확인합니다. 동일한 이름이 있는 경우 덮어씁니다. 예를 들어 ConfigMap의 이름이 Kafka 클러스터의 ConfigMap과 동일한 경우 Kafka 클러스터 업데이트가 있을 때 덮어씁니다.

9.15. 외부 소스에서 구성 값 로드

구성 공급자를 사용하여 외부 소스에서 구성 데이터를 로드합니다. 공급자는 Apache Kafka의 Streams와 독립적으로 작동합니다. 생산자 및 소비자를 포함하여 모든 Kafka 구성 요소에 대한 구성 데이터를 로드하는 데 사용할 수 있습니다. 구성 요소 구성에서 외부 소스를 참조하고 액세스 권한을 제공합니다. 공급자는 새 외부 소스를 참조하는 경우에도 Kafka 구성 요소를 다시 시작하거나 파일을 추출하지 않고도 데이터를 로드합니다. 예를 들어 provider를 사용하여 Kafka Connect 커넥터 구성의 인증 정보를 제공합니다. 구성에는 외부 소스에 대한 모든 액세스 권한이 포함되어야 합니다.

9.15.1. 구성 공급자 활성화

구성 요소의 사양 구성에서 config.providers 속성을 사용하여 하나 이상의 구성 공급자를 활성화할 수 있습니다.

구성 공급자를 활성화하는 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  # ...
  config:
    # ...
    config.providers: env
    config.providers.env.class: org.apache.kafka.common.config.provider.EnvVarConfigProvider
  # ...

KubernetesSecretConfigProvider
OpenShift 시크릿에서 구성 데이터를 로드합니다. 구성 데이터가 저장된 시크릿 내 키와 시크릿의 이름을 지정합니다. 이 공급자는 암호 또는 기타 사용자 자격 증명과 같은 중요한 구성 데이터를 저장하는 데 유용합니다.
KubernetesConfigMapConfigProvider
OpenShift 구성 맵에서 구성 데이터를 로드합니다. 구성 맵의 이름과 구성 데이터가 저장된 구성 맵 내의 키를 지정합니다. 이 공급자는 중요하지 않은 구성 데이터를 저장하는 데 유용합니다.
EnvVarConfigProvider
환경 변수에서 구성 데이터를 로드합니다. 구성 데이터가 저장된 환경 변수의 이름을 지정합니다. 이 공급자는 예를 들어 시크릿에서 매핑된 환경 변수에서 인증서 또는 JAAS 구성을 로드하기 위해 컨테이너에서 실행 중인 애플리케이션을 구성하는 데 유용합니다.
FileConfigProvider
파일에서 구성 데이터를 로드합니다. 구성 데이터가 저장되는 파일의 경로를 지정합니다. 이 공급자는 컨테이너에 마운트된 파일에서 구성 데이터를 로드하는 데 유용합니다.
DirectoryConfigProvider
디렉터리 내의 파일에서 구성 데이터를 로드합니다. 구성 파일이 저장되는 디렉터리의 경로를 지정합니다. 이 공급자는 여러 구성 파일을 로드하고 구성 데이터를 별도의 파일로 구성하는 데 유용합니다.

OpenShift 구성 공급자 플러그인의 일부인 KubernetesSecretConfigProviderKubernetesConfigMapConfigProvider 를 사용하려면 구성 파일이 포함된 네임스페이스에 대한 액세스 권한을 설정해야 합니다.

액세스 권한을 설정하지 않고 다른 공급자를 사용할 수 있습니다. 다음을 수행하여 Kafka Connect 또는 MirrorMaker 2에 대한 커넥터 구성을 이러한 방식으로 제공할 수 있습니다.

  • Kafka Connect Pod에 환경 변수 또는 볼륨으로 구성 맵 또는 시크릿 마운트
  • Kafka Connect 또는 MirrorMaker 2 구성에서 EnvVarConfigProvider,FileConfigProvider 또는 DirectoryConfigProvider 활성화
  • KafkaConnect 또는 KafkaMirrorMaker2 리소스의 사양에 externalConfiguration 속성을 사용하여 커넥터 구성 전달

공급자를 사용하면 Kafka Connect REST 인터페이스를 통해 제한된 정보가 전달되는 것을 방지할 수 있습니다. 다음 시나리오에서는 이 방법을 사용할 수 있습니다.

  • 커넥터가 데이터 소스에 연결하고 통신하는 데 사용하는 값으로 환경 변수 마운트
  • Kafka Connect 커넥터를 구성하는 데 사용되는 값으로 속성 파일 마운트
  • 커넥터에서 사용하는 TLS 신뢰 저장소 및 키 저장소 값이 포함된 디렉터리에 파일 마운트
참고

커넥터에 새 Secret 또는 ConfigMap 을 사용할 때 다시 시작해야 하므로 다른 커넥터가 중단될 수 있습니다.

9.15.2. 보안 또는 구성 맵에서 구성 값 로드

KubernetesSecretConfigProvider 를 사용하여 시크릿 또는 KubernetesConfigMapConfigProvider 에서 구성 속성을 제공하여 구성 맵에서 구성 속성을 제공합니다.

이 절차에서 구성 맵은 커넥터에 대한 구성 속성을 제공합니다. 속성은 구성 맵의 키 값으로 지정됩니다. 구성 맵은 Kafka Connect Pod에 볼륨으로 마운트됩니다.

사전 요구 사항

  • Kafka 클러스터가 실행 중입니다.
  • Cluster Operator가 실행 중입니다.
  • 커넥터 구성이 포함된 구성 맵이 있습니다.

커넥터 속성이 있는 구성 맵의 예

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-connector-configuration
data:
  option1: value1
  option2: value2

프로세스

  1. KafkaConnect 리소스를 구성합니다.

    • KubernetesConfigMapConfigProvider활성화

    여기에 표시된 사양은 구성 맵 및 시크릿의 값 로드를 지원할 수 있습니다.

    구성 맵과 시크릿을 사용하는 Kafka Connect 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect
      annotations:
        strimzi.io/use-connector-resources: "true"
    spec:
      # ...
      config:
        # ...
        config.providers: secrets,configmaps 
    1
    
        config.providers.configmaps.class: io.strimzi.kafka.KubernetesConfigMapConfigProvider 
    2
    
        config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider 
    3
    
      # ...

    1
    구성 공급자의 별칭은 다른 구성 매개 변수를 정의하는 데 사용됩니다. 공급자 매개변수는 config.providers. ${alias}.class 형식의 별칭 을 사용합니다.
    2
    KubernetesConfigMapConfigProvider 는 구성 맵의 값을 제공합니다.
    3
    KubernetesSecretConfigProvider 는 보안의 값을 제공합니다.
  2. 공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_connect_configuration_file>
  3. 외부 구성 맵의 값에 대한 액세스를 허용하는 역할을 생성합니다.

    구성 맵에서 값에 액세스하는 역할의 예

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: connector-configuration-role
    rules:
    - apiGroups: [""]
      resources: ["configmaps"]
      resourceNames: ["my-connector-configuration"]
      verbs: ["get"]
    # ...

    규칙은 my-connector-configuration 구성 맵에 액세스할 수 있는 역할 권한을 제공합니다.

  4. 구성 맵이 포함된 네임스페이스에 대한 액세스를 허용하는 역할 바인딩을 생성합니다.

    구성 맵이 포함된 네임스페이스에 액세스하기 위한 역할 바인딩의 예

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: connector-configuration-role-binding
    subjects:
    - kind: ServiceAccount
      name: my-connect-connect
      namespace: my-project
    roleRef:
      kind: Role
      name: connector-configuration-role
      apiGroup: rbac.authorization.k8s.io
    # ...

    역할 바인딩은 my-project 네임스페이스에 액세스할 수 있는 역할 권한을 제공합니다.

    서비스 계정은 Kafka Connect 배포에서 사용하는 것과 동일해야 합니다. 서비스 계정 이름 형식은 < cluster_name>-connect 입니다. 여기서 < cluster_name >은 KafkaConnect 사용자 정의 리소스의 이름입니다.

  5. 커넥터 구성의 구성 맵을 참조합니다.

    구성 맵을 참조하는 커넥터 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnector
    metadata:
      name: my-connector
      labels:
        strimzi.io/cluster: my-connect
    spec:
      # ...
      config:
        option: ${configmaps:my-project/my-connector-configuration:option1}
        # ...
    # ...

    자리 표시자 구조는 configmaps:<path_and_file_name>:<property> 입니다. KubernetesConfigMapConfigProvider 는 외부 구성 맵에서 option1 속성 값을 읽고 추출합니다.

9.15.3. 환경 변수에서 구성 값 로드

EnvVarConfigProvider 를 사용하여 구성 속성을 환경 변수로 제공합니다. 환경 변수는 구성 맵 또는 시크릿의 값을 포함할 수 있습니다.

이 절차에서 환경 변수는 커넥터가 Amazon AWS와 통신할 수 있도록 구성 속성을 제공합니다. 커넥터는 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 를 읽을 수 있어야 합니다. 환경 변수의 값은 Kafka Connect Pod에 마운트된 보안에서 파생됩니다.

참고

사용자 정의 환경 변수의 이름은 KAFKA_ 또는 STRIMZI_ 로 시작할 수 없습니다.

사전 요구 사항

  • Kafka 클러스터가 실행 중입니다.
  • Cluster Operator가 실행 중입니다.
  • 커넥터 구성이 포함된 시크릿이 있습니다.

환경 변수 값이 있는 시크릿의 예

apiVersion: v1
kind: Secret
metadata:
  name: aws-creds
type: Opaque
data:
  awsAccessKey: QUtJQVhYWFhYWFhYWFhYWFg=
  awsSecretAccessKey: Ylhsd1lYTnpkMjl5WkE=

프로세스

  1. KafkaConnect 리소스를 구성합니다.

    • EnvVarConfigProvider활성화
    • externalConfiguration 속성을 사용하여 환경 변수를 지정합니다.

    외부 환경 변수를 사용하는 Kafka Connect 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect
      annotations:
        strimzi.io/use-connector-resources: "true"
    spec:
      # ...
      config:
        # ...
        config.providers: env 
    1
    
        config.providers.env.class: org.apache.kafka.common.config.provider.EnvVarConfigProvider 
    2
    
      # ...
      externalConfiguration:
        env:
          - name: AWS_ACCESS_KEY_ID 
    3
    
            valueFrom:
              secretKeyRef:
                name: aws-creds 
    4
    
                key: awsAccessKey 
    5
    
          - name: AWS_SECRET_ACCESS_KEY
            valueFrom:
              secretKeyRef:
                name: aws-creds
                key: awsSecretAccessKey
      # ...

    1
    구성 공급자의 별칭은 다른 구성 매개 변수를 정의하는 데 사용됩니다. 공급자 매개변수는 config.providers. ${alias}.class 형식의 별칭 을 사용합니다.
    2
    EnvVarConfigProvider 는 환경 변수에서 값을 제공합니다.
    3
    환경 변수는 시크릿에서 값을 사용합니다.
    4
    환경 변수가 포함된 시크릿의 이름입니다.
    5
    시크릿에 저장된 키의 이름입니다.
    참고

    secretKeyRef 속성은 시크릿의 키를 참조합니다. 보안 대신 구성 맵을 사용하는 경우 configMapKeyRef 속성을 사용합니다.

  2. 공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_connect_configuration_file>
  3. 커넥터 구성의 환경 변수를 참조합니다.

    환경 변수를 참조하는 커넥터 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnector
    metadata:
      name: my-connector
      labels:
        strimzi.io/cluster: my-connect
    spec:
      # ...
      config:
        option: ${env:AWS_ACCESS_KEY_ID}
        option: ${env:AWS_SECRET_ACCESS_KEY}
        # ...
    # ...

    자리 표시자 구조는 env:<environment_variable_name>입니다. EnvVarConfigProvider 는 마운트된 보안에서 환경 변수 값을 읽고 추출합니다.

9.15.4. 디렉터리 내에서 파일에서 구성 값 로드

FileConfigProvider 를 사용하여 디렉터리 내의 파일에서 구성 속성을 제공합니다. 파일은 구성 맵 또는 시크릿일 수 있습니다.

이 절차에서 파일은 커넥터에 대한 구성 속성을 제공합니다. 데이터베이스 이름과 암호는 시크릿의 속성으로 지정됩니다. 시크릿은 Kafka Connect Pod에 볼륨으로 마운트됩니다. 볼륨은 경로 /opt/kafka/external-configuration/<volume-name> 에 마운트됩니다.

사전 요구 사항

  • Kafka 클러스터가 실행 중입니다.
  • Cluster Operator가 실행 중입니다.
  • 커넥터 구성이 포함된 시크릿이 있습니다.

데이터베이스 속성이 있는 시크릿 예

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  connector.properties: |- 
1

    dbUsername: my-username 
2

    dbPassword: my-password

1
속성 파일 형식의 커넥터 구성입니다.
2
구성에 사용되는 데이터베이스 사용자 이름 및 암호 속성입니다.

프로세스

  1. KafkaConnect 리소스를 구성합니다.

    • FileConfigProvider활성화
    • externalConfiguration 속성을 사용하여 파일을 지정합니다.

    외부 속성 파일을 사용하는 Kafka Connect 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect
    spec:
      # ...
      config:
        config.providers: file 
    1
    
        config.providers.file.class: org.apache.kafka.common.config.provider.FileConfigProvider 
    2
    
      #...
      externalConfiguration:
        volumes:
          - name: connector-config 
    3
    
            secret:
              secretName: mysecret 
    4

    1
    구성 공급자의 별칭은 다른 구성 매개 변수를 정의하는 데 사용됩니다.
    2
    FileConfigProvider 는 속성 파일에서 값을 제공합니다. 매개 변수는 config.providers. ${alias}.class 형식의 별칭 을 사용합니다.
    3
    보안이 포함된 볼륨의 이름입니다.
    4
    시크릿의 이름입니다.
  2. 공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_connect_configuration_file>
  3. 커넥터 구성의 파일 속성을 자리 표시자로 참조합니다.

    파일을 참조하는 커넥터 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnector
    metadata:
      name: my-source-connector
      labels:
        strimzi.io/cluster: my-connect-cluster
    spec:
      class: io.debezium.connector.mysql.MySqlConnector
      tasksMax: 2
      config:
        database.hostname: 192.168.99.1
        database.port: "3306"
        database.user: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbUsername}"
        database.password: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbPassword}"
        database.server.id: "184054"
        #...

    자리 표시자 구조는 file:<path_and_file_name>:<property> 입니다. FileConfigProvider 는 마운트된 보안에서 데이터베이스 사용자 이름 및 암호 속성 값을 읽고 추출합니다.

9.15.5. 디렉터리 내에서 여러 파일에서 구성 값 로드

DirectoryConfigProvider 를 사용하여 디렉터리 내의 여러 파일에서 구성 속성을 제공합니다. 파일은 구성 맵 또는 시크릿일 수 있습니다.

이 절차에서 시크릿은 커넥터에 대한 TLS 키 저장소 및 신뢰 저장소 사용자 인증 정보를 제공합니다. 자격 증명은 별도의 파일에 있습니다. 시크릿은 Kafka Connect Pod에 볼륨으로 마운트됩니다. 볼륨은 경로 /opt/kafka/external-configuration/<volume-name> 에 마운트됩니다.

사전 요구 사항

  • Kafka 클러스터가 실행 중입니다.
  • Cluster Operator가 실행 중입니다.
  • 사용자 인증 정보가 포함된 시크릿이 있습니다.

사용자 인증 정보가 있는 시크릿 예

apiVersion: v1
kind: Secret
metadata:
  name: my-user
  labels:
    strimzi.io/kind: KafkaUser
    strimzi.io/cluster: my-cluster
type: Opaque
data:
  ca.crt: <public_key> # Public key of the clients CA
  user.crt: <user_certificate> # Public key of the user
  user.key: <user_private_key> # Private key of the user
  user.p12: <store> # PKCS #12 store for user certificates and keys
  user.password: <password_for_store> # Protects the PKCS #12 store

my-user 시크릿은 커넥터에 대한 키 저장소 인증 정보(user.crtuser.key)를 제공합니다.

Kafka 클러스터를 배포할 때 생성된 < cluster_name>-cluster-ca-cert 시크릿은 클러스터 CA 인증서를 신뢰 저장소 인증 정보(ca.crt)로 제공합니다.

프로세스

  1. KafkaConnect 리소스를 구성합니다.

    • DirectoryConfigProvider활성화
    • externalConfiguration 속성을 사용하여 파일을 지정합니다.

    외부 속성 파일을 사용하는 Kafka Connect 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect
    spec:
      # ...
      config:
        config.providers: directory 
    1
    
        config.providers.directory.class: org.apache.kafka.common.config.provider.DirectoryConfigProvider 
    2
    
      #...
      externalConfiguration:
        volumes: 
    3
    
          - name: cluster-ca 
    4
    
            secret:
              secretName: my-cluster-cluster-ca-cert 
    5
    
          - name: my-user
            secret:
              secretName: my-user 
    6

    1
    구성 공급자의 별칭은 다른 구성 매개 변수를 정의하는 데 사용됩니다.
    2
    DirectoryConfigProvider 는 디렉터리의 파일에서 값을 제공합니다. 매개 변수는 config.providers. ${alias}.class 형식의 별칭 을 사용합니다.
    3
    보안이 포함된 볼륨의 이름입니다.
    4
    신뢰 저장소 구성을 제공하기 위한 클러스터 CA 인증서의 시크릿 이름입니다.
    5
    키 저장소 구성을 제공할 사용자의 시크릿 이름입니다.
  2. 공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_connect_configuration_file>
  3. 커넥터 구성의 파일 속성을 자리 표시자로 참조합니다.

    파일을 참조하는 커넥터 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnector
    metadata:
      name: my-source-connector
      labels:
        strimzi.io/cluster: my-connect-cluster
    spec:
      class: io.debezium.connector.mysql.MySqlConnector
      tasksMax: 2
      config:
        # ...
        database.history.producer.security.protocol: SSL
        database.history.producer.ssl.truststore.type: PEM
        database.history.producer.ssl.truststore.certificates: "${directory:/opt/kafka/external-configuration/cluster-ca:ca.crt}"
        database.history.producer.ssl.keystore.type: PEM
        database.history.producer.ssl.keystore.certificate.chain: "${directory:/opt/kafka/external-configuration/my-user:user.crt}"
        database.history.producer.ssl.keystore.key: "${directory:/opt/kafka/external-configuration/my-user:user.key}"
        #...

    자리 표시자 구조는 directory:<path>:<file_name> 입니다. DirectoryConfigProvider 는 마운트된 보안에서 인증 정보를 읽고 추출합니다.

9.16. OpenShift 리소스 사용자 정의

Apache Kafka 배포를 위한 Streams는 Deployment,Pod, Service 리소스와 같은 OpenShift 리소스를 생성합니다. 이러한 리소스는 Apache Kafka Operator용 Streams에서 관리합니다. 특정 OpenShift 리소스를 관리하는 Operator만 해당 리소스를 변경할 수 있습니다. operator-managed OpenShift 리소스를 수동으로 변경하려고 하면 Operator가 변경 사항을 다시 되돌립니다.

운영자 관리 OpenShift 리소스를 변경하면 다음과 같은 특정 작업을 수행하려는 경우 유용할 수 있습니다.

  • Istio 또는 기타 서비스에서 Pod 를 처리하는 방법을 제어하는 사용자 정의 레이블 또는 주석 추가
  • Manage how Loadbalancer-type Services are created by the cluster

OpenShift 리소스를 변경하려면 Apache Kafka 사용자 정의 리소스에 대한 다양한 Streams의 spec 섹션에서 template 속성을 사용할 수 있습니다.

다음은 변경 사항을 적용할 수 있는 사용자 정의 리소스 목록입니다.

  • Kafka.spec.kafka
  • Kafka.spec.zookeeper
  • Kafka.spec.entityOperator
  • Kafka.spec.kafkaExporter
  • Kafka.spec.cruiseControl
  • KafkaNodePool.spec
  • KafkaConnect.spec
  • KafkaMirrorMaker.spec
  • KafkaMirrorMaker2.spec
  • KafkaBridge.spec
  • KafkaUser.spec

이러한 속성에 대한 자세한 내용은 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.

Apache Kafka 사용자 정의 리소스 API 참조에서는 사용자 지정 가능한 필드에 대한 자세한 정보를 제공합니다.

다음 예에서 template 속성은 Kafka 브로커의 Pod에서 레이블을 수정하는 데 사용됩니다.

템플릿 사용자 정의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  labels:
    app: my-cluster
spec:
  kafka:
    # ...
    template:
      pod:
        metadata:
          labels:
            mylabel: myvalue
    # ...

9.16.1. 이미지 가져오기 정책 사용자 정의

Apache Kafka의 스트림을 사용하면 Cluster Operator가 배포한 모든 Pod의 컨테이너에 대한 이미지 가져오기 정책을 사용자 지정할 수 있습니다. 이미지 가져오기 정책은 Cluster Operator 배포에서 환경 변수 STRIMZI_IMAGE_PULL_POLICY 를 사용하여 구성됩니다. STRIMZI_IMAGE_PULL_POLICY 환경 변수는 다음 세 가지 값으로 설정할 수 있습니다.

Always
Pod를 시작하거나 다시 시작할 때마다 레지스트리에서 컨테이너 이미지를 가져옵니다.
IfNotPresent
컨테이너 이미지는 이전에 가져오지 않은 경우에만 레지스트리에서 가져옵니다.
Never
컨테이너 이미지는 레지스트리에서 가져오지 않습니다.

현재 이미지 가져오기 정책은 모든 Kafka, Kafka Connect 및 Kafka MirrorMaker 클러스터에 대해 한 번에만 사용자 지정할 수 있습니다. 정책을 변경하면 모든 Kafka, Kafka Connect 및 Kafka MirrorMaker 클러스터가 롤링 업데이트됩니다.

9.16.2. 종료 유예 기간 적용

종료 유예 기간을 적용하여 Kafka 클러스터를 완전히 종료할 수 있는 충분한 시간을 제공합니다.

terminationGracePeriodSeconds 속성을 사용하여 시간을 지정합니다. Kafka 사용자 정의 리소스의 template.pod 구성에 속성을 추가합니다.

추가하는 시간은 Kafka 클러스터의 크기에 따라 달라집니다. 종료 유예 기간의 OpenShift 기본값은 30초입니다. 클러스터가 완전히 종료되지 않는 것을 관찰하면 종료 유예 기간을 늘릴 수 있습니다.

Pod가 재시작될 때마다 종료 유예 기간이 적용됩니다. 이 기간은 OpenShift에서 pod에서 실행되는 프로세스에 용어 (사전) 신호를 보낼 때 시작됩니다. 기간은 종료 Pod의 프로세스를 중지하기 전에 다른 Pod로 전송하는 데 필요한 시간을 반영해야 합니다. 기간이 종료되면 종료 신호가 Pod에서 계속 실행 중인 모든 프로세스를 중지합니다.

다음 예제에서는 Kafka 사용자 정의 리소스에 120초의 종료 유예 기간을 추가합니다. 다른 Kafka 구성 요소의 사용자 정의 리소스에 구성을 지정할 수도 있습니다.

종료 유예 기간 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
    template:
      pod:
        terminationGracePeriodSeconds: 120
        # ...
    # ...

10장. Topic Operator를 사용하여 Kafka 주제 관리

KafkaTopic 리소스는 파티션 및 복제 요소 설정을 포함하여 주제를 구성합니다. KafkaTopic 을 사용하여 주제를 생성, 수정 또는 삭제할 때 Topic Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.

KafkaTopic 리소스에 대한 자세한 내용은 KafkaTopic 스키마 참조를 참조하십시오.

10.1. 주제 관리 모드

KafkaTopic 리소스는 Kafka 클러스터 내에서 단일 주제를 관리합니다. Topic Operator는 KafkaTopic 리소스 및 Kafka 주제를 관리하기 위한 두 가지 모드를 제공합니다.

Unidirectional 모드(기본값)
Unidirectional 모드에서는 클러스터 관리를 위해 Zoo Cryostat가 필요하지 않습니다. 이는 KRaft 모드에서 Apache Kafka용 Streams를 사용하는 것과 호환됩니다.
양방향 모드
양방향 모드를 사용하려면 클러스터 관리를 위해 Zoo Cryostat가 필요합니다. KRaft 모드에서 Apache Kafka용 Streams 사용과 호환되지 않습니다.
참고

Topic Operator가 단방향 모드로 실행되도록 하는 기능 게이트가 일반 가용성으로 진행되므로 양방향 모드가 단계적으로 표시됩니다. 이 전환은 특히 KRaft 모드에서 Kafka를 지원하는 데 사용되는 사용자 환경을 개선하기 위한 것입니다.

10.1.1. Unidirectional 주제 관리

unidirectional 모드에서 Topic Operator는 다음과 같이 작동합니다.

  • KafkaTopic 이 생성, 삭제 또는 변경되면 Topic Operator가 Kafka 주제에서 해당 작업을 수행합니다.

해당 KafkaTopic 리소스가 없으면 Kafka 클러스터 내에서 직접 생성, 삭제 또는 수정된 주제가 있는 경우 Topic Operator는 해당 주제를 관리하지 않습니다. Topic Operator는 KafkaTopic 리소스와 관련된 Kafka 주제만 관리하고 Kafka 클러스터 내에서 독립적으로 관리되는 주제를 방해하지 않습니다. Kafka 항목에 대한 KafkaTopic 이 있는 경우 리소스 외부에서 수행된 구성 변경 사항이 되돌아갑니다.

Topic Operator는 동일한 .spec.topicName 을 사용하여 여러 KafkaTopic 리소스가 Kafka 주제를 관리하려고 하는 경우를 감지할 수 있습니다. 가장 오래된 리소스만 조정되지만 다른 리소스는 리소스 충돌 오류와 함께 실패합니다.

10.1.2. 양방향 주제 관리

양방향 모드에서 Topic Operator는 다음과 같이 작동합니다.

  • KafkaTopic 이 생성, 삭제 또는 변경되면 Topic Operator가 Kafka 주제에서 해당 작업을 수행합니다.
  • 마찬가지로 Kafka 클러스터 내에서 주제를 생성, 삭제 또는 변경할 때 Topic Operator는 KafkaTopic 리소스에서 해당 작업을 수행합니다.
작은 정보

KafkaTopic 리소스를 통해 또는 Kafka에서 직접 주제 관리 방법을 유지합니다. 지정된 항목에 대한 두 방법 모두 정기적으로 전환하지 않도록 합니다.

10.2. 주제 이름 지정 규칙

KafkaTopic 리소스에는 주제의 이름과 해당 Kafka 클러스터의 이름을 식별하는 레이블이 포함되어 있습니다.

주제 처리를 위해 Kafka 클러스터를 식별하는 레이블

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: topic-name-1
  labels:
    strimzi.io/cluster: my-cluster
spec:
  topicName: topic-name-1

레이블은 Kafka 리소스의 클러스터 이름을 제공합니다. Topic Operator는 레이블을 관리할 KafkaTopic 리소스를 결정하는 메커니즘으로 사용합니다. 라벨이 Kafka 클러스터와 일치하지 않으면 Topic Operator에서 KafkaTopic 을 볼 수 없으며 주제는 생성되지 않습니다.

Kafka 및 OpenShift에는 고유한 이름 지정 검증 규칙이 있으며 Kafka 주제 이름은 OpenShift에서 유효한 리소스 이름이 아닐 수 있습니다. 가능한 경우 두 가지 모두에 대해 작동하는 이름 지정 규칙을 사용해 보십시오.

다음 지침을 고려하십시오.

  • 주제의 특성을 반영하는 주제 이름을 사용합니다.
  • 간결하게 하고 63자 아래에 이름을 유지합니다.
  • 모든 소문자 및 하이픈 사용
  • 특수 문자, 공백 또는 기호 방지

KafkaTopic 리소스를 사용하면 metadata.name 필드를 사용하여 Kafka 주제 이름을 지정할 수 있습니다. 그러나 원하는 Kafka 주제 이름이 유효한 OpenShift 리소스 이름이 아닌 경우 spec.topicName 속성을 사용하여 실제 이름을 지정할 수 있습니다. spec.topicName 필드는 선택 사항이며, 없는 경우 Kafka 주제 이름은 기본적으로 주제의 metadata.name 으로 설정됩니다. 주제가 생성되면 나중에 주제 이름을 변경할 수 없습니다.

유효한 Kafka 주제 이름을 제공하는 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: my-topic-1 
1

spec:
  topicName: My.Topic.1 
2

  # ...

1
OpenShift에서 작동하는 유효한 주제 이름입니다.
2
OpenShift에서 유효하지 않은 대문자 및 기간을 사용하는 Kafka 주제 이름입니다.

둘 이상의 KafkaTopic 리소스가 동일한 Kafka 주제를 참조하는 경우 먼저 생성된 리소스는 주제를 관리하는 것으로 간주됩니다. 최신 리소스의 상태가 충돌을 나타내도록 업데이트되고 Ready 상태가 False 로 변경됩니다.

Kafka Streams와 같은 Kafka 클라이언트 애플리케이션이 잘못된 OpenShift 리소스 이름으로 주제를 자동으로 생성하는 경우 Topic Operator는 양방향 모드에서 사용할 때 유효한 metadata.name 을 생성합니다. 유효하지 않은 문자를 교체하고 이름에 해시를 추가합니다. 그러나 이 동작은 단방향 모드에서는 적용되지 않습니다.

잘못된 주제 이름을 교체하는 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: my-topic---c55e57fe2546a33f9e603caf57165db4072e827e
  # ...

참고

클러스터의 식별자 및 이름에 대한 요구 사항에 대한 자세한 내용은 OpenShift 문서 오브젝트 이름 및 ID를 참조하십시오.

10.3. 주제에 대한 변경 사항 처리

Topic Operator에서 주제의 변경 사항을 처리하는 방법은 주제 관리 모드에 따라 다릅니다.

  • 비방향 주제 관리의 경우 구성 변경은 KafkaTopic 리소스에서 Kafka 주제로 한 방향으로만 이동합니다. KafkaTopic 리소스 외부에서 관리되는 Kafka 주제의 모든 변경 사항이 취소됩니다.
  • 양방향 주제 관리의 경우 구성 변경 사항은 Kafka 주제와 KafkaTopic 리소스 간에 동기화됩니다. 호환되지 않는 변경 사항은 Kafka 구성에 우선하며 KafkaTopic 리소스는 그에 따라 조정됩니다.

10.3.1. 양방향 주제 관리를 위한 주제 저장소

양방향 주제 관리의 경우 Topic Operator는 단일 정보 소스가 없는 경우 주제 변경 사항을 처리할 수 있습니다. KafkaTopic 리소스 및 Kafka 주제는 특히 Topic Operator가 작동하지 않는 경우 변경 사항에 대한 실시간 관찰이 항상 가능한 것은 아닙니다. 이를 처리하기 위해 Topic Operator는 각 주제에 대한 주제 구성 정보를 저장하는 주제 저장소를 유지 관리합니다. Kafka 클러스터 및 OpenShift의 상태를 주제 저장소와 비교하여 동기화에 필요한 변경 사항을 결정합니다. 이 평가는 시작 중에 그리고 정기적으로 Topic Operator가 활성화되어 있는 동안 수행됩니다.

예를 들어 Topic Operator가 비활성화되고 my-topic 이라는 새 KafkaTopic 이 생성되면 Topic Operator는 주제 저장소에 my-topic 이 없음을 인식합니다. KafkaTopic 은 마지막 작업 후에 생성된 것을 인식합니다. 결과적으로 Topic Operator는 해당 Kafka 주제를 생성하고 주제 저장소에 메타데이터를 저장합니다.

주제 저장소를 사용하면 Topic Operator에서 변경 사항이 호환되는 경우 Kafka 주제 및 KafkaTopic 리소스에서 주제 구성이 변경되는 상황을 관리할 수 있습니다. Kafka 주제 구성이 업데이트되거나 KafkaTopic 사용자 정의 리소스가 변경되면 변경 사항이 호환되는 경우 Kafka 클러스터와 조정한 후 주제 저장소가 업데이트됩니다.

주제 저장소 는 Kafka 주제를 사용하여 상태를 유지하는 Kafka Streams 키-값 메커니즘을 기반으로 합니다. 주제 메타데이터는 메모리 내 캐시되고 Topic Operator 내에서 로컬에 액세스합니다. 로컬 메모리 내 캐시에 적용된 작업에서 업데이트는 디스크의 백업 주제 저장소에 유지됩니다. 주제 저장소는 Kafka 주제 또는 OpenShift KafkaTopic 사용자 정의 리소스의 업데이트와 지속적으로 동기화됩니다. 주제 저장소가 이러한 방식으로 설정된 상태에서 신속하게 처리되지만 메모리 내 캐시가 충돌하면 영구 스토리지에서 자동으로 다시 채워집니다.

내부 주제는 주제 저장소의 주제 메타데이터 처리를 지원합니다.

__strimzi_store_topic
주제 메타데이터 저장을 위한 입력 주제
__strimzi-topic-operator-kstreams-topic-store-changelog
컴팩트한 주제 저장소 값의 로그 유지
주의

Topic Operator 실행에 필수이므로 이러한 주제를 삭제하지 마십시오.

10.3.2. Zoo Cryostat에서 주제 저장소로 주제 메타데이터 마이그레이션

이전 버전의 Apache Kafka에서는 주제 메타데이터가 Zoo Cryostat에 저장되었습니다. 주제 저장소는 이 요구 사항을 제거하여 Kafka 클러스터에 메타데이터를 가져오고 Topic Operator를 제어합니다.

Apache Kafka 2.7용 Streams로 업그레이드할 때 주제 저장소의 Topic Operator 제어로 전환이 원활합니다. 메타 데이터가 Zoo Cryostat에서 찾아 마이그레이션되고 이전 저장소가 삭제됩니다.

주제 메타데이터 스토리지에 Zoo Cryostat를 사용하는 1.7 이전의 Streams 버전으로 되돌리는 경우 Cluster Operator를 이전 버전으로 다운그레이드한 다음 Kafka 브로커 및 클라이언트 애플리케이션을 표준으로 다운그레이드합니다.

그러나 Kafka 클러스터의 부트스트랩 주소를 지정하여 kafka-topics 명령을 사용하여 주제 저장소에 대해 생성된 주제를 삭제해야 합니다. 예를 들면 다음과 같습니다.

oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete

명령은 Kafka 클러스터에 액세스하는 데 사용되는 리스너 및 인증 유형에 해당해야 합니다.

Topic Operator는 Kafka의 주제 상태에서 Zoo Cryostat 주제 메타데이터를 재구성합니다.

10.3.4. 주제 자동 생성

애플리케이션은 Kafka 클러스터에서 주제 자동 생성을 트리거할 수 있습니다. 기본적으로 Kafka 브로커 구성 auto.create.topics.enabletrue 로 설정되어 브로커가 애플리케이션이 존재하지 않는 주제를 생성하거나 사용하려고 할 때 자동으로 주제를 생성할 수 있습니다. 애플리케이션에서는 Kafka AdminClient 를 사용하여 자동으로 주제를 생성할 수도 있습니다. 애플리케이션이 KafkaTopic 리소스와 함께 배포되면 Topic Operator가 KafkaTopic 에 반응하기 전에 클러스터에서 자동 주제 생성이 발생할 수 있습니다.

양방향 주제 관리를 위해 Topic Operator는 주제와 KafkaTopic 리소스 간의 변경 사항을 동기화합니다.

단방향 주제 관리를 사용하는 경우 애플리케이션 배포를 위해 생성된 주제가 처음에 기본 주제 구성으로 생성됨을 의미합니다. Topic Operator가 애플리케이션 배포에 포함된 KafkaTopic 리소스 사양에 따라 주제를 재구성하려고 하면 구성에 필요한 변경이 허용되지 않기 때문에 작업이 실패할 수 있습니다. 예를 들어 변경 시 주제 파티션 수를 줄이는 경우입니다. 따라서 리디렉션되지 않은 주제 관리를 사용할 때 Kafka 클러스터 구성에서 auto.create.topics.enable 을 비활성화하는 것이 좋습니다.

10.4. Kafka 주제 구성

KafkaTopic 리소스의 속성을 사용하여 Kafka 주제를 구성합니다. KafkaTopic 의 주제 구성 변경 사항은 Kafka로 전파됩니다.

oc apply 를 사용하여 주제를 만들거나 수정하고 oc delete 를 사용하여 기존 주제를 삭제할 수 있습니다.

예를 들면 다음과 같습니다.

  • oc apply -f <topic_config_file>
  • oc delete KafkaTopic <topic_name>

주제를 삭제할 수 있으려면 Kafka 리소스의 spec.kafka.config 에서 delete.topic.enabletrue (기본값)로 설정해야 합니다.

다음 절차에서는 10개의 파티션과 2개의 복제본이 있는 주제를 생성하는 방법을 설명합니다.

참고

이 절차는 주제 관리의 단방향 및 양방향 모드와 동일합니다.

사전 준비 사항

KafkaTopic 리소스는 다음 변경을 허용하지 않습니다.

  • spec.topicName 에 정의된 주제의 이름을 변경합니다. spec.topicNamestatus.topicName 간의 불일치가 감지됩니다.
  • spec.partitions 를 사용하여 파티션 수를 줄입니다( Kafka에서 지원되지 않음).
  • spec.replicas 에 지정된 복제본 수 수정
주의

키가 있는 주제의 spec.partitions 를 늘리면 레코드 파티셔닝이 변경되어 특히 주제에서 시맨틱 파티셔닝을 사용하는 경우 문제가 발생할 수 있습니다.

사전 요구 사항

  • mTLS 인증 및 TLS 암호화를 사용하여 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
  • 실행 중인 Topic Operator(일반적으로 Entity Operator와 함께 배포됨).
  • 주제를 삭제하려면 Kafka 리소스의 spec.kafka.config 에서 delete.topic.enable=true (기본값)를 삭제합니다.

프로세스

  1. KafkaTopic 리소스를 구성합니다.

    Kafka 주제 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: my-topic-1
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 10
      replicas: 2

    작은 정보

    주제를 수정할 때 oc get kafkatopic my-topic-1 -o yaml 을 사용하여 현재 버전의 리소스를 가져올 수 있습니다.

  2. OpenShift에서 KafkaTopic 리소스를 생성합니다.

    oc apply -f <topic_config_file>
  3. 주제의 준비 상태가 True 로 변경될 때까지 기다립니다.

    oc get kafkatopics -o wide -w -n <namespace>

    Kafka 주제 상태

    NAME         CLUSTER     PARTITIONS  REPLICATION FACTOR READY
    my-topic-1   my-cluster  10          3                  True
    my-topic-2   my-cluster  10          3
    my-topic-3   my-cluster  10          3                  True

    READY 출력에 True 가 표시되면 주제 생성이 성공합니다.

  4. READY 열이 비어 있는 경우 리소스 YAML 또는 Topic Operator 로그에서 상태에 대한 자세한 정보를 가져옵니다.

    상태 메시지는 현재 상태의 이유에 대한 세부 정보를 제공합니다.

    oc get kafkatopics my-topic-2 -o yaml

    NotReady 상태의 주제 세부 정보

    # ...
    status:
      conditions:
      - lastTransitionTime: "2022-06-13T10:14:43.351550Z"
        message: Number of partitions cannot be decreased
        reason: PartitionDecreaseException
        status: "True"
        type: NotReady

    이 예에서 주제가 준비되지 않은 이유는 KafkaTopic 구성에서 원래 파티션 수가 감소되었기 때문입니다. Kafka는 이를 지원하지 않습니다.

    주제 구성을 재설정한 후 상태에 주제가 준비됨으로 표시됩니다.

    oc get kafkatopics my-topic-2 -o wide -w -n <namespace>

    주제의 상태 업데이트

    NAME         CLUSTER     PARTITIONS  REPLICATION FACTOR READY
    my-topic-2   my-cluster  10          3                  True

    세부 정보 가져오기에 메시지가 표시되지 않음

    oc get kafkatopics my-topic-2 -o yaml

    READY 상태의 주제 세부 정보

    # ...
    status:
      conditions:
      - lastTransitionTime: '2022-06-13T10:15:03.761084Z'
        status: 'True'
        type: Ready

10.5. 복제 및 파티션 수에 대한 주제 구성

Topic Operator에서 관리하는 항목에 권장되는 구성은 3가지의 복제 요소이며 최소 2개의 in-sync 복제본입니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: my-topic
  labels:
    strimzi.io/cluster: my-cluster
spec:
  partitions: 10 
1

  replicas: 3 
2

  config:
    min.insync.replicas: 2 
3

  #...
1
주제의 파티션 수입니다.
2
복제본 주제 파티션 수입니다. 현재는 KafkaTopic 리소스에서 변경할 수 없지만 kafka-reassign-partitions.sh 도구를 사용하여 변경할 수 있습니다.
3
메시지를 성공적으로 작성해야 하는 최소 복제본 파티션 수 또는 예외가 발생합니다.
참고

동기화 내 복제본은 생산자 애플리케이션에 대한 acks 구성과 함께 사용됩니다. acks 구성에 따라 메시지가 성공적으로 수신되는 것으로 확인되기 전에 메시지를 복제해야 하는 후속 파티션 수가 결정됩니다. 양방향 주제 Operator는 내부 주제의 경우 acks=all 과 함께 실행됩니다. 여기서by 메시지는 모든 동기화 복제본에서 승인해야 합니다.

브로커를 추가하거나 제거하여 Kafka 클러스터를 스케일링하는 경우 복제 요인 구성이 변경되지 않고 복제본이 자동으로 다시 할당되지 않습니다. 그러나 kafka-reassign-partitions.sh 툴을 사용하여 복제 요소를 변경하고 브로커에 복제본을 수동으로 다시 할당할 수 있습니다.

또는 Cruise Control for Streams for Streams for Streams를 통합하면 주제의 복제 요소를 변경할 수 없지만 Kafka 재조정을 위해 생성하는 최적화 제안에는 파티션 복제본을 전송하고 파티션 리더십을 변경하는 명령이 포함됩니다.

10.6. Kafka 주제에 영향을 미치지 않고 Kafka 리소스 관리

다음 절차에서는 KafkaTopic 리소스를 통해 현재 관리되는 Kafka 주제를 비관리 주제로 변환하는 방법을 설명합니다. 이 기능은 다양한 시나리오에서 유용할 수 있습니다. 예를 들어 KafkaTopic 리소스의 metadata.name 을 업데이트할 수 있습니다. 원래 KafkaTopic 리소스를 삭제하고 새 리소스를 다시 생성하는 경우에만 이 작업을 수행할 수 있습니다.

strimzi.io/managed=false 를 사용하여 KafkaTopic 리소스에 주석을 달면 Topic Operator에서 더 이상 특정 주제를 관리하지 않아야 함을 나타냅니다. 이를 통해 리소스의 구성 또는 기타 관리 작업을 변경하는 동안 Kafka 주제를 유지할 수 있습니다.

단방향 주제 관리를 사용하는 경우 이 작업을 수행할 수 있습니다.

프로세스

  1. OpenShift에서 KafkaTopic 리소스에 주석을 답니다. strimzi.io/managedfalse 로 설정합니다.

    oc annotate kafkatopic my-topic-1 strimzi.io/managed="false"

    KafkaTopic 리소스에서 topic의 metadata.name 을 지정합니다(이 예제에서는 my-topic-1).

  2. KafkaTopic 리소스의 상태를 확인하여 요청이 성공했는지 확인합니다.

    oc get kafkatopics my-topic-1 -o yaml

    Ready 상태의 항목 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      generation: 124
      name: my-topic-1
      finalizer:
        strimzi.io/topic-operator
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 10
      replicas: 2
    
    # ...
    status:
      observedGeneration: 124 
    1
    
      topicName: my-topic-1
      conditions:
      - type: Ready
        status: True
        lastTransitionTime: 20230301T103000Z

    1
    리소스를 성공적으로 조정하면 주제를 더 이상 관리하지 않습니다.

    metadata.generation (현재 배포 버전)의 값은 status.observedGeneration(리소스의 최신 조정)과 일치해야 합니다.

  3. 이제 관리 중인 Kafka 항목에 영향을 미치지 않고 KafkaTopic 리소스를 변경할 수 있습니다.

    예를 들어 metadata.name 을 변경하려면 다음과 같이 수행합니다.

    1. 원래 KafkTopic 리소스를 삭제합니다.

      oc delete kafkatopic <kafka_topic_name>
    2. 다른 metadata.name 을 사용하여 KafkTopic 리소스를 재생성하지만 spec.topicName 을 사용하여 원본에서 관리하는 것과 동일한 주제를 참조합니다.
  4. 원래 KafkaTopic 리소스를 삭제하지 않았으며 Kafka 주제 관리를 다시 시작하려는 경우 strimzi.io/managed 주석을 true 로 설정하거나 주석을 제거합니다.

10.7. 기존 Kafka 주제의 주제 관리 활성화

다음 절차에서는 KafkaTopic 리소스를 통해 현재 관리되지 않는 주제의 주제 관리를 활성화하는 방법을 설명합니다. 일치하는 KafkaTopic 리소스를 생성하여 이 작업을 수행합니다.

단방향 주제 관리를 사용하는 경우 이 작업을 수행할 수 있습니다.

프로세스

  1. Kafka 주제와 동일한 metadata.name 을 사용하여 KafkaTopic 리소스를 생성합니다.

    또는 Kafka의 주제 이름이 법적 OpenShift 리소스 이름이 아닌 경우 spec.topicName 을 사용합니다.

    Kafka 주제 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: my-topic-1
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 10
      replicas: 2

    이 예제에서 Kafka 주제의 이름은 my-topic-1 입니다.

    Topic Operator는 주제를 다른 KafkaTopic 리소스에서 관리하는지 확인합니다. 이 경우 이전 리소스가 우선하며 리소스 충돌 오류가 새 리소스의 상태로 반환됩니다.

  2. KafkaTopic 리소스를 적용합니다.

    oc apply -f <topic_configuration_file>
  3. Operator가 Kafka의 주제를 업데이트할 때까지 기다립니다.

    Operator는 이름이 동일한 KafkaTopic사양 을 사용하여 Kafka 주제를 업데이트합니다.

  4. KafkaTopic 리소스의 상태를 확인하여 요청이 성공했는지 확인합니다.

    oc get kafkatopics my-topic-1 -o yaml

    Ready 상태의 항목 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      generation: 1
      name: my-topic-1
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 10
      replicas: 2
    # ...
    status:
      observedGeneration: 1 
    1
    
      topicName: my-topic-1
      conditions:
      - type: Ready
        status: True
        lastTransitionTime: 20230301T103000Z

    1
    리소스를 성공적으로 조정하는 것은 이제 주제를 관리하는 것을 의미합니다.

    metadata.generation (현재 배포 버전)의 값은 status.observedGeneration(리소스의 최신 조정)과 일치해야 합니다.

10.8. 관리되는 주제 삭제

Unidirectional 주제 관리에서는 OpenShift 종료자를 사용하거나 사용하지 않고 KafkaTopic 리소스를 통해 관리되는 주제를 삭제할 수 있도록 지원합니다. 이는 STRIMZI_USE_FINALIZERS Topic Operator 환경 변수에 따라 결정됩니다. 기본적으로 이 값은 true 로 설정되지만 Topic Operator에서 종료자를 추가하지 않으려면 Topic Operator env 구성에서 false 로 설정할 수 있습니다.

종료자를 사용하면 KafkaTopic 리소스의 순서가 지정되고 제어됩니다. Topic Operator의 종료자가 KafkaTopic 리소스의 메타데이터에 추가됩니다.

주제 삭제를 제어하는 종료자

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  generation: 1
  name: my-topic-1
  finalizers:
    - strimzi.io/topic-operator
  labels:
    strimzi.io/cluster: my-cluster

이 예제에서는 my-topic-1 항목에 대해 종료자가 추가되었습니다. 종료자를 사용하면 종료 프로세스가 완료될 때까지 주제를 완전히 삭제할 수 없습니다. 그런 다음 oc delete kafkatopic my-topic-1 을 사용하여 주제를 삭제하면 메타데이터에 타임스탬프가 추가됩니다.

삭제 시 종료 종료 타임스탬프

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  generation: 1
  name: my-topic-1
  finalizers:
    - strimzi.io/topic-operator
  labels:
    strimzi.io/cluster: my-cluster
  deletionTimestamp: 20230301T000000.000

리소스가 여전히 존재합니다. 삭제에 실패하면 리소스 상태에 표시됩니다.

종료 작업이 성공적으로 실행되면 종료자가 메타데이터에서 제거되고 리소스가 완전히 삭제됩니다.

종료자는 관련 리소스가 삭제되지 않도록 하는 기능도 제공합니다. unidirectional Topic Operator가 실행 중이 아닌 경우 metadata.finalizers 에서 종료자를 제거할 수 없습니다. 그리고 KafkaTopic 리소스 또는 네임스페이스를 직접 삭제하려고 하면 실패하거나 시간 초과되어 네임스페이스가 중단된 상태가 됩니다. 이 경우 주제의 종료자를 제거하여 종료 프로세스를 바이패스할 수 있습니다.

10.9. Topic Operator 모드 간 전환

Apache Kafka용 Streams를 업그레이드하거나 다운그레이드할 때 또는 해당 버전에서 모드가 지원되는 한 Apache Kafka용 스트림의 동일한 버전을 사용할 때 주제 관리 모드를 전환할 수 있습니다.

양방향에서 단방향 주제 관리 모드로 전환

  1. UnidirectionalTopicOperator 기능 게이트를 활성화합니다.

    Cluster Operator는 Topic Operator를 리디렉션되지 않은 주제 관리 모드로 사용하여 Entity Operator를 배포합니다.

  2. 양방향 주제 관리 모드에서 실행되는 Topic Operator를 지원하는 내부 주제는 더 이상 필요하지 않으므로 KafkaTopic 리소스를 삭제하여 관리할 수 있습니다.

    oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-store-topic) \
      && oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-topic-operator)

    이 명령은 strimzi-store-topicstrimzi-topic-operator 를 시작하는 이름이 있는 내부 주제를 삭제합니다.

  3. 소비자 오프셋 및 트랜잭션 상태를 저장하기 위한 내부 주제는 Kafka에 유지되어야 합니다. 따라서 KafkaTopic 리소스를 삭제하기 전에 Topic Operator에서 관리를 중단해야 합니다.

    1. 주제 관리 중단:

      oc annotate $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) strimzi.io/managed="false" \
        && oc annotate $(oc get kt -n <namespace_name> -o name | grep transaction-state) strimzi.io/managed="false"

      strimzi.io/managed="false" 를 사용하여 KafkaTopic 리소스에 주석을 달면 Topic Operator에서 해당 주제를 더 이상 관리하지 않아야 함을 나타냅니다. 이 경우 consumer-offsetstransaction-state 라는 이름으로 내부 주제를 관리하기 위한 리소스에 주석을 추가하고 있습니다.

    2. 관리가 중단되면 Kafka 내부의 주제 를 삭제하지 않고 Kafka 리소스를 삭제합니다.

      oc delete $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) \
        && oc delete $(oc get kt -n <namespace_name> -o name | grep transaction-state)

단방향에서 양방향 주제 관리 모드로 전환

  1. UnidirectionalTopicOperator 기능 게이트를 비활성화합니다.

    Cluster Operator는 Topic Operator를 양방향 주제 관리 모드로 사용하여 Entity Operator를 배포합니다.

    양방향 주제 관리 모드에서 실행되는 Topic Operator에 필요한 내부 주제가 생성됩니다.

  2. 종료자가 주제 삭제를 제어하는 데 사용 중인지 확인합니다. KafkaTopic 리소스가 종료자를 사용하는 경우 전환 후 다음 중 하나를 수행해야 합니다.

    • 주제에서 모든 종료자를 제거합니다.
    • Topic Operator env 구성에서 STRIMZI_USE_FINALIZERS 환경 변수를 false 로 설정하여 종료자를 비활성화합니다.

      Apache Kafka 관리 클러스터 또는 독립 실행형 배포로 Streams for Apache Kafka 관리 클러스터에서 실행 중인 Topic Operator에 대해 동일한 구성을 사용합니다.

      Apache Kafka 관리 클러스터의 Streams에서 주제 종료자 비활성화

      apiVersion: kafka.strimzi.io/v1beta2
      kind: Kafka
      metadata:
        name: my-cluster
      spec:
        # ...
        entityOperator:
          topicOperator: {}
          userOperator: {}
          template:
            topicOperatorContainer:
              env:
                - name: STRIMZI_USE_FINALIZERS
                  value: "false"
      # ...

      독립 실행형 배포에서 주제 종료자 비활성화

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: strimzi-topic-operator
      spec:
        template:
          spec:
            containers:
              - name: STRIMZI_USE_FINALIZERS
                value: "false"
      # ...

      Topic Operator는 양방향 모드에서 종료자를 사용하지 않습니다. 비방향 모드에서 전환한 후 유지되는 경우 KafkaTopic 및 관련 리소스를 삭제할 수 없습니다.

Topic Operator 모드 간에 전환한 후 주제를 생성하여 Operator가 올바르게 실행되고 있는지 확인합니다. 자세한 내용은 10.4절. “Kafka 주제 구성”의 내용을 참조하십시오.

10.10. 주제에서 종료자 제거

대상 Operator가 실행되지 않고 관리 항목을 삭제할 때 종료 프로세스를 바이패스하려면 종료자를 제거해야 합니다. 리소스를 직접 편집하거나 명령을 사용하여 수동으로 이 작업을 수행할 수 있습니다.

모든 주제에서 종료자를 제거하려면 다음 명령을 사용합니다.

주제에서 종료자 제거

oc get kt -o=json | jq '.items[].metadata.finalizers = null' | oc apply -f -

이 명령은 jq 명령줄 JSON 구문 분석 도구를 사용하여 종료자를 null 로 설정하여 KafkaTopic (kt) 리소스를 수정합니다. 특정 항목에 대해 명령을 사용할 수도 있습니다.

특정 주제에서 종료자 제거

oc get kt <topic_name> -o=json | jq '.metadata.finalizers = null' | oc apply -f -

명령을 실행한 후 주제를 삭제하고 삭제할 수 있습니다. 또는 항목이 이미 삭제되었지만 미해결 종료자로 인해 차단된 경우 삭제가 완료됩니다.

주의

Topic Operator가 실행되지 않는 경우 종료자 프로세스와 관련된 정리 작업이 수행되지 않으므로 종료자를 제거할 때는 주의해야 합니다. 예를 들어 KafkaTopic 리소스에서 종료자를 제거하고 나중에 리소스를 삭제하면 관련 Kafka 항목이 삭제되지 않습니다.

10.11. 주제 삭제를 비활성화할 때 고려 사항

Kafka의 delete.topic.enable 구성이 false 로 설정된 경우 주제를 삭제할 수 없습니다. 특정 시나리오에서는 이 작업이 필요할 수 있지만 Topic Operator를 unidirectional 모드에서 사용할 때 고려해야 할 사항이 있습니다.

주제를 삭제할 수 없으므로 주제 삭제를 제어하기 위해 KafkaTopic 리소스의 메타데이터에 추가되는 종료자는 Topic Operator에서 제거되지 않습니다( 수동으로 제거할수 있음). 마찬가지로 CRD(Custom Resource Definitions) 또는 주제와 연결된 네임스페이스는 삭제할 수 없습니다.

delete.topic.enable=false 를 구성하기 전에 이러한 영향을 평가하여 특정 요구 사항과 일치하는지 확인합니다.

참고

종료자를 사용하지 않으려면 STRIMZI_USE_FINALIZERS Topic Operator 환경 변수를 false 로 설정할 수 있습니다.

10.12. 주제 작업에 대한 요청 배치 튜닝

고정 모드인 Topic Operator는 Kafka Admin API의 요청 일괄 처리 기능을 주제 리소스에 대한 작업에 사용합니다. 다음 Operator 구성 속성을 사용하여 일괄 처리 메커니즘을 미세 조정할 수 있습니다.

  • STRIMZI_MAX_QUEUE_SIZE 는 주제 이벤트 큐의 최대 크기를 설정합니다. 기본값은 1024입니다.
  • STRIMZI_MAX_BATCH_SIZE 는 단일 일괄 처리에서 허용되는 최대 주제 이벤트 수를 설정합니다. 기본값은 100입니다.
  • MAX_BATCH_LINGER_MS 는 일괄 처리가 처리되기 전에 항목을 누적할 때까지 대기하는 최대 시간을 지정합니다. 기본값은 100밀리초입니다.

요청 일괄 처리 대기열의 최대 크기를 초과하면 Topic Operator가 종료되고 다시 시작됩니다. 빈번한 재시작을 방지하려면 일반적인 부하를 수용하도록 STRIMZI_MAX_QUEUE_SIZE 속성을 조정하는 것이 좋습니다.

11장. User Operator를 사용하여 Kafka 사용자 관리

KafkaUser 리소스를 사용하여 사용자를 생성, 수정 또는 삭제할 때 User Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.

KafkaUser 리소스에 대한 자세한 내용은 KafkaUser 스키마 참조를 참조하십시오.

11.1. Kafka 사용자 구성

KafkaUser 리소스의 속성을 사용하여 Kafka 사용자를 구성합니다.

oc apply 를 사용하여 사용자를 만들거나 수정하고 oc delete 를 사용하여 기존 사용자를 삭제할 수 있습니다.

예를 들면 다음과 같습니다.

  • oc apply -f <user_config_file>
  • oc delete KafkaUser &lt ;user_name>

사용자는 Kafka 클라이언트를 나타냅니다. Kafka 사용자를 구성할 때 클라이언트가 Kafka에 액세스하는 데 필요한 사용자 인증 및 권한 부여 메커니즘을 활성화합니다. 사용되는 메커니즘은 동등한 Kafka 구성과 일치해야 합니다. Kafka 브로커에 대한 액세스를 보호하기 위해 KafkaKafkaUser 리소스를 사용하는 방법에 대한 자세한 내용은 Kafka 브로커에 대한 액세스 보안 을 참조하십시오.

사전 요구 사항

  • mTLS 인증 및 TLS 암호화를 사용하여 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
  • 실행 중인 User Operator(일반적으로 Entity Operator와 함께 배포됨)

프로세스

  1. KafkaUser 리소스를 구성합니다.

    이 예제에서는 ACL을 사용하여 mTLS 인증 및 간단한 권한 부여를 지정합니다.

    Kafka 사용자 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaUser
    metadata:
      name: my-user-1
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      authentication:
        type: tls
      authorization:
        type: simple
        acls:
          # Example consumer Acls for topic my-topic using consumer group my-group
          - resource:
              type: topic
              name: my-topic
              patternType: literal
            operations:
              - Describe
              - Read
            host: "*"
          - resource:
              type: group
              name: my-group
              patternType: literal
            operations:
              - Read
            host: "*"
          # Example Producer Acls for topic my-topic
          - resource:
              type: topic
              name: my-topic
              patternType: literal
            operations:
              - Create
              - Describe
              - Write
            host: "*"

  2. OpenShift에서 KafkaUser 리소스를 생성합니다.

    oc apply -f <user_config_file>
  3. 사용자의 준비 상태가 True 로 변경될 때까지 기다립니다.

    oc get kafkausers -o wide -w -n <namespace>

    Kafka 사용자 상태

    NAME       CLUSTER     AUTHENTICATION  AUTHORIZATION READY
    my-user-1  my-cluster  tls             simple        True
    my-user-2  my-cluster  tls             simple
    my-user-3  my-cluster  tls             simple        True

    READY 출력에 True 가 표시되면 사용자 생성이 성공합니다.

  4. READY 열이 비어 있으면 리소스 YAML 또는 User Operator 로그에서 상태에 대한 자세한 정보를 가져옵니다.

    메시지는 현재 상태의 이유에 대한 세부 정보를 제공합니다.

    oc get kafkausers my-user-2 -o yaml

    NotReady 상태의 사용자 세부 정보

    # ...
    status:
      conditions:
      - lastTransitionTime: "2022-06-10T10:07:37.238065Z"
        message: Simple authorization ACL rules are configured but not supported in the
          Kafka cluster configuration.
        reason: InvalidResourceException
        status: "True"
        type: NotReady

    이 예에서 사용자가 준비되지 않은 이유는 Kafka 구성에서 간단한 권한이 활성화되지 않기 때문입니다.

    간단한 인증에 대한 Kafka 구성

      apiVersion: kafka.strimzi.io/v1beta2
      kind: Kafka
      metadata:
        name: my-cluster
      spec:
        kafka:
          # ...
          authorization:
            type: simple

    Kafka 구성을 업데이트하면 상태가 사용자가 준비되었음을 표시합니다.

    oc get kafkausers my-user-2 -o wide -w -n <namespace>

    사용자의 상태 업데이트

    NAME       CLUSTER     AUTHENTICATION  AUTHORIZATION READY
    my-user-2  my-cluster  tls             simple        True

    세부 정보를 가져오면 메시지가 표시되지 않습니다.

    oc get kafkausers my-user-2 -o yaml

    READY 상태의 사용자 세부 정보

    # ...
    status:
      conditions:
      - lastTransitionTime: "2022-06-10T10:33:40.166846Z"
        status: "True"
        type: Ready

12장. Red Hat build of Apicurio Registry를 사용하여 스키마 검증

Red Hat build of Apicurio Registry를 Apache Kafka용 Streams와 함께 사용할 수 있습니다.

Apicurio Registry는 API 및 이벤트 중심 아키텍처에서 표준 이벤트 스키마 및 API 설계를 공유하기 위한 데이터 저장소입니다. Apicurio Registry를 사용하여 클라이언트 애플리케이션에서 데이터 구조를 분리하고, REST 인터페이스를 사용하여 런타임에 데이터 유형 및 API 설명을 공유 및 관리할 수 있습니다.

Apicurio 레지스트리는 클라이언트 애플리케이션에서 메시지를 직렬화 및 역직렬화하는 데 사용되는 스키마를 저장하여 보내는 메시지가 해당 스키마와 호환되는지 확인합니다. Apicurio Registry는 Kafka 생산자 및 소비자 애플리케이션에 대한 Kafka 클라이언트 serializers/deserializers를 제공합니다. Kafka 생산자 애플리케이션은 직렬화기를 사용하여 특정 이벤트 스키마를 준수하는 메시지를 인코딩합니다. Kafka 소비자 애플리케이션은 특정 스키마 ID에 따라 메시지가 올바른 스키마를 사용하여 직렬화되었는지 확인하는 deserialize기를 사용합니다.

애플리케이션에서 레지스트리의 스키마를 사용하도록 설정할 수 있습니다. 이렇게 하면 일관된 스키마 사용이 보장되고 런타임 시 데이터 오류를 방지하는 데 도움이 됩니다.

13장. 변경 데이터 캡처를 위한 Red Hat 빌드 Debezium 통합

Red Hat build of Debezium은 분산 변경 데이터 캡처 플랫폼입니다. 데이터베이스의 행 수준 변경 사항을 캡처하고 변경 이벤트 레코드를 생성하며 Kafka 주제로 레코드를 스트리밍합니다. Debezium은 Apache Kafka를 기반으로 합니다. Red Hat build of Debezium을 Apache Kafka용 Streams와 통합할 수 있습니다. Apache Kafka용 Streams를 배포한 후 Kafka Connect를 통해 Debezium을 커넥터 구성으로 배포합니다. Debezium은 OpenShift의 Apache Kafka용 Streams로 변경 이벤트 레코드를 전달합니다. 애플리케이션은 이러한 변경 이벤트 스트림을 읽고 해당 스트림이 발생한 순서대로 변경 이벤트에 액세스할 수 있습니다.

Debezium은 다음을 포함하여 여러 가지 용도가 있습니다.

  • 데이터 복제
  • 캐시 및 검색 인덱스 업데이트
  • 모놀리식 애플리케이션 간소화
  • 데이터 통합
  • 스트리밍 쿼리 활성화

데이터베이스 변경 사항을 캡처하려면 Debezium 데이터베이스 커넥터를 사용하여 Kafka Connect를 배포합니다. 커넥터 인스턴스를 정의하도록 KafkaConnector 리소스를 구성합니다.

Apache Kafka용 Streams를 사용하여 Red Hat build of Debezium을 배포하는 방법에 대한 자세한 내용은 제품 설명서 를 참조하십시오. 이 문서에는 데이터베이스 업데이트에 대한 변경 이벤트 레코드를 보는 데 필요한 서비스 및 커넥터 설정 프로세스를 안내하는 Debezium 가이드가 포함되어 있습니다.

14장. Kafka 클러스터에 대한 클라이언트 액세스 설정

Apache Kafka 용 Streams를 배포한 후 Kafka 클러스터에 대한 클라이언트 액세스를 설정할 수 있습니다. 배포를 확인하려면 예제 생산자 및 소비자 클라이언트를 배포할 수 있습니다. 그렇지 않으면 OpenShift 클러스터 내부 또는 외부의 클라이언트 액세스를 제공하는 리스너를 생성합니다.

14.1. 예제 클라이언트 배포

메시지를 보내고 받기 위해 생산자 및 소비자 클라이언트 예제를 배포합니다. 이러한 클라이언트를 사용하여 Apache Kafka용 Streams 배포를 확인할 수 있습니다.

사전 요구 사항

  • Kafka 클러스터는 클라이언트에서 사용할 수 있습니다.

프로세스

  1. Kafka 생산자를 배포합니다.

    oc run kafka-producer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic
  2. 생산자가 실행 중인 콘솔에 메시지를 입력합니다.
  3. Enter 를 눌러 메시지를 보냅니다.
  4. Kafka 소비자를 배포합니다.

    oc run kafka-consumer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic --from-beginning
  5. 소비자 콘솔에 들어오는 메시지가 표시되는지 확인합니다.

14.2. Kafka 브로커에 연결하도록 리스너 구성

Kafka 브로커에 대한 클라이언트 연결에 리스너를 사용합니다. Apache Kafka의 스트림은 Kafka 리소스를 통해 리스너를 구성하는 속성이 포함된 일반 GenericKafkaListener 스키마를 제공합니다. GenericKafkaListener 는 리스너 구성에 대한 유연한 접근 방식을 제공합니다. 속성을 지정하여 OpenShift 클러스터 내에서 연결하기 위해 내부 리스너를 구성하거나 OpenShift 클러스터 외부에서 연결하기 위한 외부 리스너를 구성할 수 있습니다.

리스너 구성에 Kafka를 노출할 연결 유형을 지정합니다. 선택한 유형은 요구 사항과 사용자 환경 및 인프라에 따라 다릅니다. 다음과 같은 리스너 유형이 지원됩니다.

내부 리스너
  • 동일한 OpenShift 클러스터 내에서 연결할 내부
  • broker ClusterIP 서비스를 사용하여 Kafka 노출
외부 리스너
  • OpenShift 노드에서 포트 를 사용하는 NodePort
  • loadbalancer 서비스를 사용하는 LoadBalancer
  • Kubernetes 인그레스 및 쿠버네티스 Ingress NGINX Controller (Kubernetes 전용)를 사용하는 Ingress
  • OpenShift 경로 및 기본 HAProxy 라우터(OpenShift만 해당)를 사용하는 경로
중요

OpenShift에서 Ingress를 사용하지 마십시오. 대신 경로 유형을 사용합니다. Ingress NGINX 컨트롤러는 Kubernetes에서만 사용하기 위한 것입니다. 경로 유형은 OpenShift에서만 지원됩니다.

내부 유형 리스너 구성은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. OpenShift 네트워크를 외부 네트워크에 결합할 수 있습니다. 이 경우 OpenShift 서비스 DNS 도메인(일반적으로 .cluster.local)이 사용되지 않도록 내부 유형 리스너( useServiceDnsDomain 속성 사용)를 구성할 수 있습니다. broker ClusterIP 서비스를 기반으로 Kafka 클러스터를 노출하는 cluster-ip 유형의 리스너를 구성할 수도 있습니다. 이 옵션은 헤드리스 서비스를 통해 라우팅할 수 없거나 사용자 정의 액세스 메커니즘을 통합하려는 경우 유용합니다. 예를 들어 특정 Ingress 컨트롤러 또는 OpenShift Gateway API에 대한 자체 유형의 외부 리스너를 빌드할 때 이 리스너를 사용할 수 있습니다.

외부 리스너는 다른 인증 메커니즘이 필요한 네트워크에서 Kafka 클러스터에 대한 액세스를 처리합니다. 로드 밸런서 또는 경로와 같은 지정된 연결 메커니즘을 사용하여 OpenShift 환경 외부의 클라이언트에 액세스할 수 있도록 외부 리스너를 구성할 수 있습니다. 예를 들어, 노드 포트가 더 나은 옵션을 제공하는 베어 메탈과 같은 특정 인프라에 로드 밸런서가 적합하지 않을 수 있습니다.

각 리스너는 Kafka 리소스에서 배열로 정의됩니다.

리스너 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
        configuration:
          useServiceDnsDomain: true
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external1
        port: 9094
        type: route
        tls: true
        configuration:
          brokerCertChainAndKey:
            secretName: my-secret
            certificate: my-certificate.crt
            key: my-key.key
    # ...

이름과 포트가 고유하면 필요한 만큼 많은 리스너를 구성할 수 있습니다. 인증을 사용하여 보안 연결을 위해 리스너를 구성할 수도 있습니다.

각 연결 유형의 장단점에 대해 자세히 알아보려면 Strimzi에서 Apache Kafka 액세스를 참조하십시오.

참고

외부 리스너를 사용하는 동안 Kafka 클러스터를 확장하는 경우 모든 Kafka 브로커의 롤링 업데이트가 트리거될 수 있습니다. 이는 구성에 따라 다릅니다.

14.3. 리스너 이름 지정 규칙

리스너 구성에서 결과 리스너 부트스트랩 및 per-broker 서비스 이름은 다음 명명 규칙에 따라 구성됩니다.

Expand
표 14.1. 리스너 이름 지정 규칙
리스너 유형부트스트랩 서비스 이름Broker 서비스 이름별

internal

<cluster_name>-kafka-bootstrap

해당 없음

LoadBalancer
nodeport
ingress
route
cluster-ip

<cluster_name>-kafka-<listener-name>-bootstrap

<cluster_name>-kafka-<listener-name>-<idx>

예를 들어 my-cluster-kafka-bootstrap,my-cluster-kafka-external1-bootstrap, my-cluster-kafka-external1-0. 이름은 리스너 구성을 통해 생성된 서비스, 경로, 로드 밸런서 및 수신에 할당됩니다.

이전 버전과 호환되는 특정 이름 및 포트 번호를 사용하여 처음 사용 중단된 KafkaListeners 스키마에서 구성된 리스너를 전환할 수 있습니다. 결과 외부 리스너 이름 지정 규칙은 약간 다릅니다. 리스너 이름 및 포트 구성 값의 특정 조합은 이전 버전과 호환됩니다.

Expand
표 14.2. 이전 버전과 호환되는 리스너 이름 및 포트 조합
리스너 이름포트부트스트랩 서비스 이름Broker 서비스 이름별

plain

9092

<cluster_name>-kafka-bootstrap

해당 없음

tls

9093

<cluster-name>-kafka-bootstrap

해당 없음

external

9094

<cluster_name>-kafka-bootstrap

<cluster_name>-kafka-bootstrap-<idx>

Kafka 클러스터의 주소를 사용하여 동일한 OpenShift 클러스터의 클라이언트에 대한 액세스를 제공하거나 다른 OpenShift 네임스페이스 또는 외부 OpenShift의 클라이언트에 대한 외부 액세스를 제공할 수 있습니다. 다음 절차에서는 외부 OpenShift 또는 다른 OpenShift 클러스터에서 Kafka 클러스터에 대한 클라이언트 액세스를 구성하는 방법을 보여줍니다.

Kafka 리스너는 Kafka 클러스터에 대한 액세스를 제공합니다. 클라이언트 액세스는 다음 구성을 사용하여 보호됩니다.

  1. 외부 리스너는 TLS 암호화 및 mTLS 인증과 Kafka 간단한 권한 부여가 활성화된 Kafka 클러스터에 대해 구성됩니다.
  2. mTLS 인증을 사용하여 클라이언트에 대해 KafkaUser 가 생성되고 간단한 승인을 위해 정의된 ACL(액세스 제어 목록)이 생성됩니다.

상호 tls,scram-sha-512 또는 oauth 인증을 사용하도록 리스너를 구성할 수 있습니다. mTLS는 항상 암호화를 사용하지만 SCRAM-SHA-512 및 OAuth 2.0 인증을 사용하는 경우에도 암호화를 사용하는 것이 좋습니다.

Kafka 브로커에 대한 간단한,oauth,opa 또는 사용자 정의 권한을 구성할 수 있습니다. 활성화하면 활성화된 모든 리스너에 권한 부여가 적용됩니다.

KafkaUser 인증 및 권한 부여 메커니즘을 구성할 때 동등한 Kafka 구성과 일치하는지 확인합니다.

  • KafkaUser.spec.authenticationKafka.spec.kafka.listeners[*].authentication과 일치합니다.
  • KafkaUser.spec.authorizationKafka.spec.kafka.authorization과 일치합니다.

KafkaUser 에 사용할 인증을 지원하는 리스너가 하나 이상 있어야 합니다.

참고

Kafka 사용자와 Kafka 브로커 간의 인증은 각각에 대한 인증 설정에 따라 다릅니다. 예를 들어 Kafka 구성에서도 활성화되지 않은 경우 mTLS로 사용자를 인증할 수 없습니다.

Apache Kafka Operator의 스트림은 구성 프로세스를 자동화하고 인증에 필요한 인증서를 생성합니다.

  • Cluster Operator는 리스너를 생성하고 Kafka 클러스터로 인증을 활성화하기 위해 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정합니다.
  • User Operator는 선택한 인증 유형에 따라 클라이언트 및 클라이언트 인증에 사용되는 보안 인증 정보를 나타내는 사용자를 생성합니다.

클라이언트 구성에 인증서를 추가합니다.

이 절차에서는 Cluster Operator에서 생성한 CA 인증서를 사용하지만 자체 인증서를 설치하여 대체할 수 있습니다. 외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서를 사용하도록 리스너를 구성할 수도 있습니다.

인증서는 PEM(.crt) 및 PKCS #12(.p12) 형식으로 사용할 수 있습니다. 이 절차에서는 PEM 인증서를 사용합니다. X.509 형식의 인증서를 사용하는 클라이언트와 함께 PEM 인증서를 사용합니다.

참고

동일한 OpenShift 클러스터 및 네임스페이스의 내부 클라이언트의 경우 Pod 사양에 클러스터 CA 인증서를 마운트할 수 있습니다. 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.

사전 요구 사항

  • Kafka 클러스터는 OpenShift 클러스터 외부에서 실행 중인 클라이언트에서 연결할 수 있습니다.
  • Cluster Operator 및 User Operator가 클러스터에서 실행 중입니다.

프로세스

  1. Kafka 리스너를 사용하여 Kafka 클러스터를 구성합니다.

    • 리스너를 통해 Kafka 브로커에 액세스하는 데 필요한 인증을 정의합니다.
    • Kafka 브로커에서 인증을 활성화합니다.

      리스너 구성의 예

      apiVersion: kafka.strimzi.io/v1beta2
      kind: Kafka
      metadata:
        name: my-cluster
        namespace: myproject
      spec:
        kafka:
          # ...
          listeners: 
      1
      
          - name: external1 
      2
      
            port: 9094 
      3
      
            type: <listener_type> 
      4
      
            tls: true 
      5
      
            authentication:
              type: tls 
      6
      
            configuration: 
      7
      
              #...
          authorization: 
      8
      
            type: simple
            superUsers:
              - super-user-name 
      9
      
        # ...

      1
      외부 리스너를 활성화하는 구성 옵션은 일반 Kafka 리스너 스키마 참조에 설명되어 있습니다.
      2
      리스너를 식별하는 이름입니다. Kafka 클러스터 내에서 고유해야 합니다.
      3
      Kafka 내의 리스너에서 사용하는 포트 번호입니다. 포트 번호는 지정된 Kafka 클러스터 내에서 고유해야 합니다. 허용되는 포트 번호는 9092 이상이며, 이는 Prometheus 및 Cryostat에 이미 사용되는 포트 9404 및 9999를 제외하고 사용합니다. 리스너 유형에 따라 Kafka 클라이언트를 연결하는 포트 번호와 포트 번호가 동일하지 않을 수 있습니다.
      4
      경로 (OpenShift만), 로드 밸런서,nodeport 또는 ingress (Kubernetes만 해당)로 지정된 외부 리스너 유형입니다. 내부 리스너는 internal 또는 cluster-ip 로 지정됩니다.
      5
      필수 항목입니다. 리스너의 TLS 암호화입니다. 경로수신 유형 리스너의 경우 true 로 설정해야 합니다. mTLS 인증의 경우 인증 속성도 사용합니다.
      6
      리스너의 클라이언트 인증 메커니즘. mTLS를 사용한 서버 및 클라이언트 인증의 경우 tls: trueauthentication.type: tls 를 지정합니다.
      7
      (선택 사항) 리스너 유형의 요구 사항에 따라 추가 리스너 구성 을 지정할 수 있습니다.
      8
      AclAuthorizerStandardAuthorizer Kafka 플러그인을 사용하는 간단한 인증으로 지정됩니다.
      9
      (선택 사항) 슈퍼 사용자는 ACL에 정의된 액세스 제한에 관계없이 모든 브로커에 액세스할 수 있습니다.
      주의

      OpenShift 경로 주소는 Kafka 클러스터 이름, 리스너 이름, 프로젝트 이름, 라우터 도메인으로 구성됩니다. 예를 들어 my-cluster-kafka-external1-bootstrap-my-project.domain.com (<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>). 각 DNS 레이블(".")은 63자를 초과해서는 안 되며 주소의 총 길이는 255자를 초과해서는 안 됩니다.

  2. Kafka 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

    Kafka 클러스터는 mTLS 인증을 사용하여 Kafka 브로커 리스너로 구성됩니다.

    각 Kafka 브로커 Pod에 대한 서비스가 생성됩니다.

    Kafka 클러스터 연결에 대한 부트스트랩 주소 역할을 하는 서비스가 생성됩니다.

    서비스는 nodeport 리스너를 사용하여 Kafka 클러스터에 대한 외부 연결의 외부 부트스트랩 주소로 도 생성됩니다.

    kafka 브로커의 ID를 확인하는 클러스터 CA 인증서도 시크릿 < cluster_name> -cluster-ca-cert 에 생성됩니다.

    참고

    외부 리스너를 사용하는 동안 Kafka 클러스터를 확장하는 경우 모든 Kafka 브로커의 롤링 업데이트가 트리거될 수 있습니다. 이는 구성에 따라 다릅니다.

  3. Kafka 리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.

    oc get kafka <kafka_cluster_name> -o=jsonpath='{.status.listeners[?(@.name=="<listener_name>")].bootstrapServers}{"\n"}'

    예를 들면 다음과 같습니다.

    oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}'

    Kafka 클라이언트의 부트스트랩 주소를 사용하여 Kafka 클러스터에 연결합니다.

  4. Kafka 클러스터에 액세스해야 하는 클라이언트를 나타내는 사용자를 생성하거나 수정합니다.

    • Kafka 리스너와 동일한 인증 유형을 지정합니다.
    • 간단한 승인을 위해 권한 부여 ACL을 지정합니다.

      사용자 구성 예

      apiVersion: kafka.strimzi.io/v1beta2
      kind: KafkaUser
      metadata:
        name: my-user
        labels:
          strimzi.io/cluster: my-cluster 
      1
      
      spec:
        authentication:
          type: tls 
      2
      
        authorization:
          type: simple
          acls: 
      3
      
            - resource:
                type: topic
                name: my-topic
                patternType: literal
              operations:
                - Describe
                - Read
            - resource:
                type: group
                name: my-group
                patternType: literal
              operations:
                - Read

      1
      레이블은 Kafka 클러스터의 레이블과 일치해야 합니다.
      2
      상호 tls 로 지정된 인증입니다.
      3
      간단한 권한 부여를 사용하려면 관련 ACL 규칙 목록이 사용자에게 적용되어야 합니다. 규칙은 사용자 이름 (my-user)에 따라 Kafka 리소스에 허용되는 작업을 정의합니다.
  5. KafkaUser 리소스를 생성하거나 수정합니다.

    oc apply -f USER-CONFIG-FILE

    사용자는 KafkaUser 리소스와 동일한 이름을 가진 시크릿과 함께 생성됩니다. 보안에는 mTLS 인증을 위한 공개 및 개인 키가 포함되어 있습니다.

    시크릿 예

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-user
      labels:
        strimzi.io/kind: KafkaUser
        strimzi.io/cluster: my-cluster
    type: Opaque
    data:
      ca.crt: <public_key> # Public key of the clients CA
      user.crt: <user_certificate> # Public key of the user
      user.key: <user_private_key> # Private key of the user
      user.p12: <store> # PKCS #12 store for user certificates and keys
      user.password: <password_for_store> # Protects the PKCS #12 store

  6. Kafka 클러스터의 < cluster_name> -cluster-ca-cert 시크릿에서 클러스터 CA 인증서를 추출합니다.

    oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  7. <user _name> 보안에서 사용자 CA 인증서를 추출합니다.

    oc get secret <user_name> -o jsonpath='{.data.user\.crt}' | base64 -d > user.crt
  8. <user _name> 시크릿에서 사용자의 개인 키를 추출합니다.

    oc get secret <user_name> -o jsonpath='{.data.user\.key}' | base64 -d > user.key
  9. Kafka 클러스터에 연결하기 위한 부트스트랩 주소 호스트 이름 및 포트로 클라이언트를 구성합니다.

    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "<hostname>:<port>");
  10. Kafka 클러스터의 ID를 확인하도록 truststore 자격 증명으로 클라이언트를 구성합니다.

    공용 클러스터 CA 인증서를 지정합니다.

    truststore 구성의 예

    props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL");
    props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "PEM");
    props.put(SslConfigs.SSL_TRUSTSTORE_CERTIFICATES_CONFIG, "<ca.crt_file_content>");

    SSL은 mTLS 인증을 위해 지정된 보안 프로토콜입니다. TLS를 통한 SCRAM-SHA-512 인증에 대해 SASL_SSL 을 지정합니다. PEM은 truststore의 파일 형식입니다.

  11. Kafka 클러스터에 연결할 때 사용자를 확인하도록 키 저장소 인증 정보로 클라이언트를 구성합니다.

    공개 인증서 및 개인 키를 지정합니다.

    키 저장소 구성 예

    props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL");
    props.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, "PEM");
    props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "<user.crt_file_content>");
    props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "<user.key_file_content>");

    키 저장소 인증서와 개인 키를 구성에 직접 추가합니다. 를 한 줄 형식으로 추가합니다. BEGIN CERTIFICATEEND CERTIFICATE 구분 기호 간에 줄 바꿈 문자(\n)로 시작합니다. 원래 인증서의 각 행을 \n 으로 종료합니다.

    키 저장소 구성 예

    props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "-----BEGIN CERTIFICATE----- \n<user_certificate_content_line_1>\n<user_certificate_content_line_n>\n-----END CERTIFICATE---");
    props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "----BEGIN PRIVATE KEY-----\n<user_key_content_line_1>\n<user_key_content_line_n>\n-----END PRIVATE KEY-----");

14.5. 노드 포트를 사용하여 Kafka에 액세스

노드 포트를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 Apache Kafka 클러스터의 Streams에 액세스합니다.

브로커에 연결하려면 Kafka 부트스트랩 주소에 대한 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.

이 절차에서는 기본 nodeport 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성 을 추가합니다. 예를 들어 nodeport 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.

preferredNodePortAddressType
노드 주소로 확인되는 첫 번째 주소 유형을 지정합니다.
externalTrafficPolicy
서비스가 외부 트래픽을 node-local 또는 클러스터 전체 엔드포인트로 라우팅하는지 여부를 지정합니다.
nodePort
부트 스트랩 및 브로커 서비스에 할당된 노드 포트 번호를 덮어씁니다.

리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.

사전 요구 사항

  • 실행중인 Cluster Operator

이 절차에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너 이름은 external4 입니다.

프로세스

  1. nodeport 유형으로 설정된 외부 리스너를 사용하여 Kafka 리소스를 구성합니다.

    예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      labels:
        app: my-cluster
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        # ...
        listeners:
          - name: external4
            port: 9094
            type: nodeport
            tls: true
            authentication:
              type: tls
            # ...
        # ...
      zookeeper:
        # ...
  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

    kafka 브로커의 ID를 확인하기 위한 클러스터 CA 인증서가 시크릿 my-cluster-cluster-ca-cert 에 생성됩니다.

    NodePort 유형 서비스는 각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해 생성됩니다.

    부트스트랩 및 브로커용으로 생성된 노드 포트 서비스

    NAME                                  TYPE      CLUSTER-IP      PORT(S)
    my-cluster-kafka-external4-0          NodePort  172.30.55.13    9094:31789/TCP
    my-cluster-kafka-external4-1          NodePort  172.30.250.248  9094:30028/TCP
    my-cluster-kafka-external4-2          NodePort  172.30.115.81   9094:32650/TCP
    my-cluster-kafka-external4-bootstrap  NodePort  172.30.30.23    9094:32650/TCP

    클라이언트 연결에 사용되는 부트스트랩 주소는 Kafka 리소스의 상태로 전파됩니다.

    부트스트랩 주소의 상태 예

    status:
      clusterId: Y_RJQDGKRXmNF7fEcWldJQ
      conditions:
        - lastTransitionTime: '2023-01-31T14:59:37.113630Z'
          status: 'True'
          type: Ready
      kafkaVersion: 3.7.0
      listeners:
        # ...
        - addresses:
            - host: ip-10-0-224-199.us-west-2.compute.internal
              port: 32650
          bootstrapServers: 'ip-10-0-224-199.us-west-2.compute.internal:32650'
          certificates:
            - |
              -----BEGIN CERTIFICATE-----
    
              -----END CERTIFICATE-----
          name: external4
      observedGeneration: 2
      operatorLastSuccessfulVersion: 2.7
     # ...

  3. Kafka 리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.

    oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external4")].bootstrapServers}{"\n"}'
    
    ip-10-0-224-199.us-west-2.compute.internal:32650
  4. 클러스터 CA 인증서를 추출합니다.

    oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  5. 브로커에 연결하도록 클라이언트를 구성합니다.

    1. Kafka 클라이언트에 연결할 부트스트랩 주소로 부트스트랩 호스트 및 포트를 지정합니다. 예를 들어 ip-10-0-224-199.us-west-2.compute.internal:32650 입니다.
    2. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.

      클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.

참고

자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소 구성에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 추가할 필요가 없습니다.

14.6. 로드 밸런서를 사용하여 Kafka에 액세스

로드 밸런서를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 Apache Kafka 클러스터의 Streams에 액세스합니다.

브로커에 연결하려면 Kafka 부트스트랩 주소에 대한 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.

절차에서는 기본 로드 밸런서 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성 을 추가합니다. 예를 들어 로드 밸런서 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.

loadBalancerSourceRanges
트래픽을 지정된 CIDR(Classless Inter-Domain Routing) 범위로 제한합니다.
externalTrafficPolicy
서비스가 외부 트래픽을 node-local 또는 클러스터 전체 엔드포인트로 라우팅하는지 여부를 지정합니다.
loadBalancerIP
로드 밸런서를 생성할 때 특정 IP 주소를 요청합니다.

리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.

사전 요구 사항

  • 실행중인 Cluster Operator

이 절차에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너 이름은 external3 입니다.

프로세스

  1. 로드 밸런서 유형으로 설정된 외부 리스너를 사용하여 Kafka 리소스를 구성합니다.

    예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      labels:
        app: my-cluster
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        # ...
        listeners:
          - name: external3
            port: 9094
            type: loadbalancer
            tls: true
            authentication:
              type: tls
            # ...
        # ...
      zookeeper:
        # ...
  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

    kafka 브로커의 ID를 확인하는 클러스터 CA 인증서도 시크릿 my-cluster-cluster-ca-cert 에 생성됩니다.

    LoadBalancer 유형 서비스 및 로드 밸런서는 각 Kafka 브로커와 외부 부트스트랩 서비스에 대해 생성됩니다.

    부트스트랩 및 브로커용으로 생성된 LoadBalancer 서비스 및 로드 밸런서

    NAME                                  TYPE            CLUSTER-IP      PORT(S)
    my-cluster-kafka-external3-0          LoadBalancer    172.30.204.234  9094:30011/TCP
    my-cluster-kafka-external3-1          LoadBalancer    172.30.164.89   9094:32544/TCP
    my-cluster-kafka-external3-2          LoadBalancer    172.30.73.151   9094:32504/TCP
    my-cluster-kafka-external3-bootstrap  LoadBalancer    172.30.30.228   9094:30371/TCP
    
    NAME                                  EXTERNAL-IP (loadbalancer)
    my-cluster-kafka-external3-0          a8a519e464b924000b6c0f0a05e19f0d-1132975133.us-west-2.elb.amazonaws.com
    my-cluster-kafka-external3-1          ab6adc22b556343afb0db5ea05d07347-611832211.us-west-2.elb.amazonaws.com
    my-cluster-kafka-external3-2          a9173e8ccb1914778aeb17eca98713c0-777597560.us-west-2.elb.amazonaws.com
    my-cluster-kafka-external3-bootstrap  a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com

    클라이언트 연결에 사용되는 부트스트랩 주소는 Kafka 리소스의 상태로 전파됩니다.

    부트스트랩 주소의 상태 예

    status:
      clusterId: Y_RJQDGKRXmNF7fEcWldJQ
      conditions:
        - lastTransitionTime: '2023-01-31T14:59:37.113630Z'
          status: 'True'
          type: Ready
      kafkaVersion: 3.7.0
      listeners:
        # ...
        - addresses:
            - host: >-
                a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com
              port: 9094
          bootstrapServers: >-
            a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094
          certificates:
            - |
              -----BEGIN CERTIFICATE-----
    
              -----END CERTIFICATE-----
          name: external3
      observedGeneration: 2
      operatorLastSuccessfulVersion: 2.7
     # ...

    클라이언트 연결에 사용되는 DNS 주소는 각 로드 밸런서 서비스의 상태로 전파됩니다.

    부트스트랩 로드 밸런서의 상태 예

    status:
      loadBalancer:
        ingress:
          - hostname: >-
              a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com
     # ...

  3. Kafka 리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.

    oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external3")].bootstrapServers}{"\n"}'
    
    a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094
  4. 클러스터 CA 인증서를 추출합니다.

    oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  5. 브로커에 연결하도록 클라이언트를 구성합니다.

    1. Kafka 클라이언트에 연결할 부트스트랩 주소로 부트스트랩 호스트 및 포트를 지정합니다. 예를 들어 a8d4a6fb363bfb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094.
    2. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.

      클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.

참고

자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소 구성에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 추가할 필요가 없습니다.

14.7. OpenShift 경로를 사용하여 Kafka에 액세스

OpenShift 경로를 사용하여 OpenShift 클러스터 외부의 클라이언트에서 Apache Kafka 클러스터의 Streams에 액세스합니다.

경로를 사용할 수 있으려면 Kafka 사용자 정의 리소스에서 경로 유형 리스너에 대한 구성을 추가합니다. 이 구성을 적용하면 구성에서 외부 부트스트랩 및 클러스터의 각 브로커에 대한 전용 경로 및 서비스를 생성합니다. 클라이언트는 부트스트랩 경로에 연결하여 브로커에 연결할 부트스트랩 서비스를 통해 라우팅합니다. 그런 다음 브로커별 경로 및 서비스를 통해 클라이언트의 트래픽을 브로커로 라우팅하는 DNS 이름을 사용하여broker 연결이 설정됩니다.

브로커에 연결하려면 경로 부트스트랩 주소의 호스트 이름과 TLS 암호화에 사용되는 인증서를 지정합니다. 경로를 사용한 액세스의 경우 포트는 항상 443입니다.

주의

OpenShift 경로 주소는 Kafka 클러스터 이름, 리스너 이름, 프로젝트 이름, 라우터 도메인으로 구성됩니다. 예를 들어 my-cluster-kafka-external1-bootstrap-my-project.domain.com (<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>). 각 DNS 레이블(".")은 63자를 초과해서는 안 되며 주소의 총 길이는 255자를 초과해서는 안 됩니다.

절차에서는 기본 리스너 구성을 보여줍니다. TLS 암호화(tls)를 활성화해야 합니다. 클라이언트 인증 메커니즘(인증)을 지정할 수도 있습니다. 구성 속성을 사용하여 추가 구성 을 추가합니다. 예를 들어 host 구성 속성을 경로 리스너와 함께 사용하여 부트스트랩 및broker 서비스에서 사용하는 호스트 이름을 지정할 수 있습니다.

리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.

TLS 패스스루

TLS 패스스루는 Apache Kafka용 Streams에서 생성한 경로에 대해 활성화됩니다. Kafka는 TCP를 통해 바이너리 프로토콜을 사용하지만 경로는 HTTP 프로토콜을 사용하도록 설계되었습니다. 경로를 통해 TCP 트래픽을 라우팅할 수 있도록 Apache Kafka의 Streams는 TLS 통과를 SNI(Server Name Indication)와 함께 사용합니다.

SNI는 Kafka 브로커에 연결을 식별하고 전달하는 데 도움이 됩니다. passthrough 모드에서는 TLS 암호화가 항상 사용됩니다. 연결은 브로커에 전달되므로 리스너는 수신 인증서가 아닌 내부 클러스터 CA에서 서명한 TLS 인증서를 사용합니다. 자체 리스너 인증서를 사용하도록 리스너를 구성하려면 brokerCert CryostatAndKey 속성을 사용합니다.

사전 요구 사항

  • 실행중인 Cluster Operator

이 절차에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너 이름은 external1 입니다.

프로세스

  1. 경로 유형으로 설정된 외부 리스너를 사용하여 Kafka 리소스를 구성합니다.

    예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      labels:
        app: my-cluster
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        # ...
        listeners:
          - name: external1
            port: 9094
            type: route
            tls: true 
    1
    
            authentication:
              type: tls
            # ...
        # ...
      zookeeper:
        # ...
    1
    경로 유형 리스너의 경우 TLS 암호화를 활성화해야 합니다(true).
  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

    kafka 브로커의 ID를 확인하기 위한 클러스터 CA 인증서가 시크릿 my-cluster-cluster-ca-cert 에 생성됩니다.

    ClusterIP 유형 서비스는 각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해 생성됩니다.

    기본 OpenShift HAProxy 라우터를 사용하여 노출하는 DNS 주소(호스트/포트)를 사용하여 각 서비스에 대해 경로 도 생성됩니다.

    경로는 TLS 패스스루로 사전 구성됩니다.

    부트스트랩 및 브로커용으로 생성된 경로

    NAME                                  HOST/PORT                                                  SERVICES                              PORT  TERMINATION
    my-cluster-kafka-external1-0          my-cluster-kafka-external1-0-my-project.router.com         my-cluster-kafka-external1-0          9094  passthrough
    my-cluster-kafka-external1-1          my-cluster-kafka-external1-1-my-project.router.com         my-cluster-kafka-external1-1          9094  passthrough
    my-cluster-kafka-external1-2          my-cluster-kafka-external1-2-my-project.router.com         my-cluster-kafka-external1-2          9094  passthrough
    my-cluster-kafka-external1-bootstrap  my-cluster-kafka-external1-bootstrap-my-project.router.com my-cluster-kafka-external1-bootstrap  9094  passthrough

    클라이언트 연결에 사용되는 DNS 주소는 각 경로의 상태로 전파됩니다.

    부트스트랩 경로의 상태 예

    status:
      ingress:
        - host: >-
            my-cluster-kafka-external1-bootstrap-my-project.router.com
     # ...

  3. 대상 브로커를 사용하여 OpenSSL s_client 를 사용하여 포트 443에서 클라이언트-서버 TLS 연결을 확인합니다.

    openssl s_client -connect my-cluster-kafka-external1-0-my-project.router.com:443 -servername my-cluster-kafka-external1-0-my-project.router.com -showcerts

    서버 이름은 브로커에 연결을 전달하는 SNI(Server Name Indication)입니다.

    연결에 성공하면 브로커의 인증서가 반환됩니다.

    브로커의 인증서

    Certificate chain
     0 s:O = io.strimzi, CN = my-cluster-kafka
       i:O = io.strimzi, CN = cluster-ca v0

  4. Kafka 리소스의 상태에서 부트스트랩 서비스의 주소를 검색합니다.

    oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external1")].bootstrapServers}{"\n"}'
    
    my-cluster-kafka-external1-bootstrap-my-project.router.com:443

    주소는 Kafka 클러스터 이름, 리스너 이름, 프로젝트 이름 및 라우터 도메인(이 예에서는router.com )으로 구성됩니다.

  5. 클러스터 CA 인증서를 추출합니다.

    oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  6. 브로커에 연결하도록 클라이언트를 구성합니다.

    1. Kafka 클라이언트에 있는 부트스트랩 서비스 및 포트 443을 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다.
    2. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.

      클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.

참고

자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소 구성에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 추가할 필요가 없습니다.

14.8. 서비스에 대한 연결 세부 정보 반환

서비스 검색을 사용하면 Apache Kafka의 Streams와 동일한 OpenShift 클러스터에서 실행되는 클라이언트 애플리케이션이 Kafka 클러스터와 상호 작용할 수 있습니다.

Kafka 클러스터에 액세스하는 데 사용되는 서비스에 대해 서비스 검색 레이블 및 주석이 생성됩니다.

  • 내부 Kafka 부트스트랩 서비스
  • Kafka 브리지 서비스

레이블은 서비스를 검색할 수 있도록 하는 데 도움이 되고, 주석은 클라이언트 애플리케이션이 연결을 설정하는 데 필요한 연결 세부 정보를 제공합니다.

서비스 검색 레이블인 strimzi.io/discoveryService 리소스에 대해 true 로 설정됩니다. 서비스 검색 주석에는 동일한 키가 있어 각 서비스에 대한 연결 세부 정보를 JSON 형식으로 제공합니다.

내부 Kafka 부트스트랩 서비스의 예

apiVersion: v1
kind: Service
metadata:
  annotations:
    strimzi.io/discovery: |-
      [ {
        "port" : 9092,
        "tls" : false,
        "protocol" : "kafka",
        "auth" : "scram-sha-512"
      }, {
        "port" : 9093,
        "tls" : true,
        "protocol" : "kafka",
        "auth" : "tls"
      } ]
  labels:
    strimzi.io/cluster: my-cluster
    strimzi.io/discovery: "true"
    strimzi.io/kind: Kafka
    strimzi.io/name: my-cluster-kafka-bootstrap
  name: my-cluster-kafka-bootstrap
spec:
  #...

Kafka 브리지 서비스 예

apiVersion: v1
kind: Service
metadata:
  annotations:
    strimzi.io/discovery: |-
      [ {
        "port" : 8080,
        "tls" : false,
        "auth" : "none",
        "protocol" : "http"
      } ]
  labels:
    strimzi.io/cluster: my-bridge
    strimzi.io/discovery: "true"
    strimzi.io/kind: KafkaBridge
    strimzi.io/name: my-bridge-bridge-service

명령줄 또는 해당 API 호출에서 서비스를 가져올 때 검색 레이블을 지정하여 서비스를 찾습니다.

검색 레이블을 사용하여 서비스 반환

oc get service -l strimzi.io/discovery=true

연결 세부 정보는 서비스 검색 레이블을 검색할 때 반환됩니다.

15장. Kafka에 대한 액세스 보안

클라이언트가 Kafka 브로커에 대한 액세스를 관리하여 Kafka 클러스터를 보호합니다. Kafka 브로커와 클라이언트 간의 보안 연결은 다음을 포함할 수 있습니다.

  • 데이터 교환을 위한 암호화
  • ID를 증명하기 위한 인증
  • 사용자가 실행하는 작업을 허용하거나 거부할 수 있는 권한 부여

Apache Kafka의 Streams에서 연결을 보호하려면 리스너 및 사용자 계정을 구성해야 합니다.

리스너 구성

Kafka 리소스를 사용하여 Kafka 브로커에 대한 클라이언트 연결에 대한 리스너를 구성합니다. 리스너는 mTLS, SCRAM-SHA-512, OAuth 2.0 또는 사용자 지정 인증 방법과 같이 클라이언트가 인증하는 방법을 정의합니다. 보안을 강화하려면 Kafka 브로커와 클라이언트 간의 통신을 보호하도록 TLS 암호화를 구성합니다. Kafka 브로커 구성에서 지원되는 TLS 버전 및 암호화 제품군을 지정하여 TLS 기반 통신을 추가로 보호할 수 있습니다.

추가된 보호 계층의 경우 Kafka 리소스를 사용하여 간단한 OAuth 2.0, OPA 또는 사용자 정의 권한과 같은 Kafka 클러스터에 대한 권한 부여 방법을 지정합니다.

사용자 계정

Apache Kafka의 Streams에서 KafkaUser 리소스를 사용하여 사용자 계정 및 인증 정보를 설정합니다. 사용자는 클라이언트를 나타내며 Kafka 클러스터를 인증하고 권한을 부여하는 방법을 결정합니다. 사용자 구성에 지정된 인증 및 권한 부여 메커니즘은 Kafka 구성과 일치해야 합니다. 또한 ACL(액세스 제어 목록)을 정의하여 보다 세분화된 권한 부여를 위해 특정 주제 및 작업에 대한 사용자 액세스를 제어합니다. 보안을 강화하기 위해 바이트 속도 또는 CPU 사용률을 기반으로 Kafka 브로커에 대한 클라이언트 액세스를 제한하려면 사용자 할당량을 지정합니다.

사용하는 TLS 버전 및 암호화 제품군을 제한하려면 클라이언트에 생산자 또는 소비자 구성을 추가할 수도 있습니다. 클라이언트의 구성은 브로커에서 활성화된 프로토콜 및 암호화 제품군만 사용해야 합니다.

참고

OAuth 2.0을 사용하여 클라이언트 액세스를 관리하는 경우 사용자 인증 및 권한 부여 인증 정보는 권한 부여 서버를 통해 관리됩니다.

Apache Kafka Operator의 스트림은 구성 프로세스를 자동화하고 인증에 필요한 인증서를 생성합니다. Cluster Operator는 클러스터 내에서 데이터 암호화 및 인증을 위한 TLS 인증서를 자동으로 설정합니다.

15.1. Kafka의 보안 옵션

Kafka 리소스를 사용하여 Kafka 인증 및 권한 부여에 사용되는 메커니즘을 구성합니다.

15.1.1. 리스너 인증

리스너를 생성할 때 Kafka 브로커에 대한 클라이언트 인증을 구성합니다. Kafka 리소스의 Kafka.spec.kafka.listeners.authentication 속성을 사용하여 리스너 인증 유형을 지정합니다.

OpenShift 클러스터 내부의 클라이언트의 경우 일반 (암호 없이) 또는 tls 내부 리스너를 생성할 수 있습니다. 내부 리스너 유형은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. 헤드리스 서비스 대신broker ClusterIP 서비스를 사용하여 Kafka를 노출하는 내부 리스너의 cluster-ip 유형을 생성할 수도 있습니다. OpenShift 클러스터 외부의 클라이언트의 경우 외부 리스너를 생성하고 노드 포트,로드 밸런서,인그레스 (Kubernetes만 해당) 또는 경로 (OpenShift만 해당)일 수 있는 연결 메커니즘을 지정합니다.

외부 클라이언트 연결을 위한 구성 옵션에 대한 자세한 내용은 14장. Kafka 클러스터에 대한 클라이언트 액세스 설정 을 참조하십시오.

지원되는 인증 옵션:

  1. mTLS 인증(TLS가 활성화된 리스너에서만)
  2. SCRAM-SHA-512 인증
  3. OAuth 2.0 토큰 기반 인증
  4. 사용자 정의 인증
  5. TLS 버전 및 암호화 제품군

선택한 인증 옵션은 Kafka 브로커에 대한 클라이언트 액세스를 인증하는 방법에 따라 다릅니다.

참고

사용자 지정 인증을 사용하기 전에 표준 인증 옵션을 살펴봅니다. 사용자 정의 인증을 사용하면 Kafka에서 지원하는 모든 유형의 인증을 사용할 수 있습니다. 더 많은 유연성을 제공할 수 있지만 복잡성도 추가할 수 있습니다.

그림 15.1. Kafka 리스너 인증 옵션

리스너 인증 구성 옵션

리스너 인증 속성은 해당 리스너와 관련된 인증 메커니즘을 지정하는 데 사용됩니다.

인증 속성을 지정하지 않으면 리스너에서 해당 리스너를 통해 연결하는 클라이언트를 인증하지 않습니다. 리스너는 인증 없이 모든 연결을 허용합니다.

User Operator를 사용하여 KafkaUsers 를 관리할 때 인증을 구성해야 합니다.

다음 예제에서는 다음을 보여줍니다.

  • SCRAM-SHA-512 인증을 위해 구성된 일반 리스너
  • mTLS 인증을 사용하는 tls 리스너
  • mTLS 인증을 사용하는 외부 리스너

각 리스너는 Kafka 클러스터 내에서 고유한 이름과 포트로 구성됩니다.

중요

브로커에 대한 클라이언트 액세스를 위해 리스너를 구성할 때 포트 9092 이상(9093, 9094 등)을 사용할 수 있지만 몇 가지 예외가 있습니다. 리스너는 인터브로커 통신(9090 및 9091), Prometheus 지표(9404) 및 Cryostat(Java Management Extensions) 모니터링(9999)을 위해 예약된 포트를 사용하도록 구성할 수 없습니다.

리스너 인증 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  namespace: myproject
spec:
  kafka:
    # ...
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: true
        authentication:
          type: scram-sha-512
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external3
        port: 9094
        type: loadbalancer
        tls: true
        authentication:
          type: tls
# ...

15.1.1.1. mTLS 인증

mTLS 인증은 항상 Kafka 브로커와 Zoo Cryostat Pod 간의 통신에 사용됩니다.

Apache Kafka의 스트림은 TLS(Transport Layer Security)를 사용하도록 Kafka를 구성하여 상호 인증이 있거나 없는 Kafka 브로커와 클라이언트 간에 암호화된 통신을 제공할 수 있습니다. 상호 또는 양방향 인증의 경우 서버와 클라이언트 모두 인증서를 제공합니다. mTLS 인증을 구성하면 브로커는 클라이언트(클라이언트 인증)를 인증하고 클라이언트는 브로커(서버 인증)를 인증합니다.

Kafka 리소스의 mTLS 리스너 구성은 다음과 같습니다.

  • TLS 암호화 및 서버 인증을 지정하는 TLS : true
  • authentication.type: tls 를 사용하여 클라이언트 인증을 지정합니다.

Cluster Operator가 Kafka 클러스터를 생성할 때 <cluster _name>-cluster-ca-cert라는 이름으로 새 시크릿을 생성합니다. 보안에는 CA 인증서가 포함되어 있습니다. CA 인증서는 PEM 및 PKCS #12 형식입니다. Kafka 클러스터를 확인하려면 클라이언트 구성의 신뢰 저장소에 CA 인증서를 추가합니다. 클라이언트를 확인하려면 사용자 인증서와 키를 클라이언트 구성의 키 저장소에 추가합니다. mTLS용 클라이언트 구성에 대한 자세한 내용은 15.2.2절. “사용자 인증” 을 참조하십시오.

참고

TLS 인증은 한 당사자가 다른 사람의 ID를 인증하는 더 일반적으로 단방향입니다. 예를 들어 웹 브라우저와 웹 서버 간에 HTTPS를 사용하면 브라우저가 웹 서버의 ID 증명을 가져옵니다.

15.1.1.2. SCRAM-SHA-512 인증

SCRAM(Salted Challenge Response Authentication Mechanism)은 암호를 사용하여 상호 인증을 설정할 수 있는 인증 프로토콜입니다. Apache Kafka의 스트림은 암호화되지 않은 클라이언트 연결 및 암호화된 클라이언트 연결에 대한 인증을 제공하기 위해 SCRAM-SHA-512를 사용하도록 Kafka를 구성할 수 있습니다.

SCRAM-SHA-512 인증을 TLS 연결과 함께 사용하는 경우 TLS 프로토콜은 암호화를 제공하지만 인증에는 사용되지 않습니다.

SCRAM의 다음 속성은 암호화되지 않은 연결에서도 SCRAM-SHA-512를 안전하게 사용할 수 있도록 합니다.

  • 암호는 통신 채널을 통해 명확하게 전송되지 않습니다. 대신 클라이언트와 서버는 인증 사용자의 암호를 알고 있음을 증명하기 위해 서로 챌린지가 됩니다.
  • 서버와 클라이언트는 각각 인증 교환에 대해 새로운 문제를 생성합니다. 즉, 교환은 재생 공격에 대해 탄력적입니다.

KafkaUser.spec.authentication.typescram-sha-512 로 구성된 경우 User Operator는 대문자 및 소문자 ASCII 문자 및 숫자로 구성된 임의의 12자 암호를 생성합니다.

15.1.1.3. 네트워크 정책

기본적으로 Streams for Apache Kafka는 Kafka 브로커에서 활성화된 모든 리스너에 대한 NetworkPolicy 리소스를 자동으로 생성합니다. 이 NetworkPolicy 를 사용하면 애플리케이션이 모든 네임스페이스의 리스너에 연결할 수 있습니다. 네트워크 정책을 리스너 구성의 일부로 사용합니다.

네트워크 수준에서 리스너에 대한 액세스를 선택한 애플리케이션 또는 네임스페이스로 제한하려면 networkPolicyPeers 속성을 사용합니다. 각 리스너에는 다른 networkPolicyPeers 구성이 있을 수 있습니다. 네트워크 정책 피어에 대한 자세한 내용은 NetworkPolicyPeer API 참조를 참조하십시오.

사용자 정의 네트워크 정책을 사용하려면 Cluster Operator 구성에서 STRIMZI_NETWORK_POLICY_GENERATION 환경 변수를 false 로 설정할 수 있습니다. 자세한 내용은 9.5절. “Cluster Operator 구성”의 내용을 참조하십시오.

참고

OpenShift 구성은 Apache Kafka용 Streams에서 네트워크 정책을 사용하려면 ingress NetworkPolicies 를 지원해야 합니다.

15.1.1.4. 리스너 인증서 제공

TLS 암호화가 활성화된 TLS 리스너 또는 외부 리스너에 대해 Kafka 리스너 인증서 라는 자체 서버 인증서를 제공할 수 있습니다. 자세한 내용은 15.3.4절. “TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공”의 내용을 참조하십시오.

15.1.2. Kafka 권한 부여

Kafka 리소스에서 Kafka.spec.kafka.authorization 속성을 사용하여 Kafka 브로커에 대한 인증을 구성합니다. 권한 부여 속성이 없으면 권한 부여가 활성화되지 않으며 클라이언트에 제한이 없습니다. 활성화하면 활성화된 모든 리스너에 권한 부여가 적용됩니다. 권한 부여 방법은 type 필드에 정의됩니다.

지원되는 권한 부여 옵션:

그림 15.2. Kafka 클러스터 권한 부여 옵션

kafka 권한 부여 구성 옵션
15.1.2.1. 슈퍼유저

슈퍼 사용자는 액세스 제한에 관계없이 Kafka 클러스터의 모든 리소스에 액세스할 수 있으며 모든 권한 부여 메커니즘에서 지원됩니다.

Kafka 클러스터의 슈퍼 사용자를 지정하려면 사용자 주체 목록을 SuperUsers 속성에 추가합니다. 사용자가 mTLS 인증을 사용하는 경우 사용자 이름은 CN= 접두사가 붙은 TLS 인증서 제목의 일반 이름입니다. User Operator를 사용하지 않고 mTLS에 자체 인증서를 사용하지 않는 경우 사용자 이름은 전체 인증서 제목입니다. 전체 인증서 주체는 CN=user,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=my_country_code. 존재하지 않는 필드를 생략합니다.

슈퍼 유저를 사용하는 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  namespace: myproject
spec:
  kafka:
    # ...
    authorization:
      type: simple
      superUsers:
        - CN=client_1
        - user_2
        - CN=client_3
        - CN=client_4,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=US
        - CN=client_5,OU=my_ou,O=my_org,C=GB
        - CN=client_6,O=my_org
    # ...

15.2. Kafka 클라이언트의 보안 옵션

KafkaUser 리소스를 사용하여 Kafka 클라이언트에 대한 인증 메커니즘, 권한 부여 메커니즘 및 액세스 권한을 구성합니다. 보안 구성 측면에서 클라이언트는 사용자로 표시됩니다.

Kafka 브로커에 대한 사용자 액세스 권한을 인증하고 인증할 수 있습니다. 인증을 사용하면 액세스를 허용하고 권한 부여가 허용되는 작업에 대한 액세스를 제한합니다.

Kafka 브로커에 대한 무제한 액세스 권한이 있는 슈퍼 사용자를 생성할 수도 있습니다.

인증 및 권한 부여 메커니즘은 Kafka 브로커에 액세스하는 데 사용되는 리스너의 사양 과 일치해야 합니다.

Kafka 브로커에 안전하게 액세스하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 14.4절. “리스너를 사용하여 Kafka 클러스터에 대한 클라이언트 액세스 설정” 을 참조하십시오.

15.2.1. 사용자 처리를 위한 Kafka 클러스터 식별

KafkaUser 리소스에는 해당 리소스가 속한 Kafka 리소스의 이름에서 파생되는 Kafka 클러스터의 적절한 이름을 정의하는 레이블이 포함됩니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster

이 레이블은 User Operator에서 KafkaUser 리소스를 식별하고 새 사용자를 생성하고 후속 처리를 수행하는 데 사용됩니다.

레이블이 Kafka 클러스터와 일치하지 않으면 User Operator에서 KafkaUser 를 식별할 수 없으며 사용자가 생성되지 않습니다.

KafkaUser 리소스의 상태가 비어 있으면 레이블을 확인합니다.

15.2.2. 사용자 인증

KafkaUser 사용자 지정 리소스를 사용하여 Kafka 클러스터에 액세스해야 하는 사용자(클라이언트)에 대한 인증 자격 증명을 구성합니다. KafkaUser.spec인증 속성을 사용하여 인증 정보를 구성합니다. 유형을 지정하면 생성되는 인증 정보를 제어할 수 있습니다.

지원되는 인증 유형:

  • mTLS 인증용 TLS
  • 외부 인증서를 사용한 mTLS 인증에 대한 TLS- external
  • SCRAM-SHA-512 인증을 위한 SCRAM-sha -512

tls 또는 scram-sha-512 가 지정된 경우 User Operator는 사용자를 생성할 때 인증 인증 정보를 생성합니다. tls-external 가 지정된 경우에도 사용자는 mTLS를 계속 사용하지만 인증 인증 정보는 생성되지 않습니다. 자체 인증서를 제공할 때 이 옵션을 사용합니다. 인증 유형을 지정하지 않으면 User Operator에서 사용자 또는 인증 정보를 생성하지 않습니다.

tls-external 를 사용하여 User Operator 외부에서 발행된 인증서를 사용하여 mTLS로 인증할 수 있습니다. User Operator는 TLS 인증서 또는 보안을 생성하지 않습니다. tls 메커니즘을 사용하는 경우와 동일한 방식으로 User Operator를 통해 ACL 규칙 및 할당량을 계속 관리할 수 있습니다. 즉, ACL 규칙 및 할당량을 지정할 때 CN=USER-NAME 형식을 사용합니다. USER-NAME 은 TLS 인증서에 지정된 일반적인 이름입니다.

15.2.2.1. mTLS 인증

mTLS 인증을 사용하려면 KafkaUser 리소스의 type 필드를 tls 로 설정합니다.

mTLS 인증이 활성화된 사용자 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: tls
  # ...

인증 유형은 Kafka 클러스터에 액세스하는 데 사용되는 Kafka 리스너의 동등한 구성과 일치해야 합니다.

User Operator에 의해 사용자를 생성하면 KafkaUser 리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 mTLS의 개인 및 공개 키가 포함됩니다. 공개 키는 사용자 인증서에 포함되어 있으며 클라이언트 CA(인증 기관)가 이를 생성할 때 서명합니다. 모든 키는 X.509 형식으로 되어 있습니다.

참고

Cluster Operator에서 생성한 클라이언트 CA를 사용하는 경우 Cluster Operator에 의해 클라이언트 CA를 갱신할 때 User Operator에서 생성한 사용자 인증서도 갱신됩니다.

사용자 시크릿 은 PEM 및 PKCS #12 형식의 키와 인증서를 제공합니다.

사용자 인증 정보가 있는 시크릿 예

apiVersion: v1
kind: Secret
metadata:
  name: my-user
  labels:
    strimzi.io/kind: KafkaUser
    strimzi.io/cluster: my-cluster
type: Opaque
data:
  ca.crt: <public_key> # Public key of the clients CA
  user.crt: <user_certificate> # Public key of the user
  user.key: <user_private_key> # Private key of the user
  user.p12: <store> # PKCS #12 store for user certificates and keys
  user.password: <password_for_store> # Protects the PKCS #12 store

클라이언트를 구성할 때 다음을 지정합니다.

  • Kafka 클러스터의 ID를 확인하기 위한 공용 클러스터 CA 인증서의 truststore 속성
  • 클라이언트를 확인하기 위한 사용자 인증 자격 증명의 키 저장소 속성

구성은 파일 형식(PEM 또는 PKCS #12)에 따라 다릅니다. 이 예에서는 PKCS #12 저장소와 저장소의 자격 증명에 액세스하는 데 필요한 암호를 사용합니다.

PKCS #12 형식의 mTLS를 사용하는 클라이언트 구성 예

bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093 
1

security.protocol=SSL 
2

ssl.truststore.location=/tmp/ca.p12 
3

ssl.truststore.password=<truststore_password> 
4

ssl.keystore.location=/tmp/user.p12 
5

ssl.keystore.password=<keystore_password> 
6

1
Kafka 클러스터에 연결할 부트스트랩 서버 주소입니다.
2
암호화에 TLS를 사용할 때 보안 프로토콜 옵션입니다.
3
truststore 위치에는 Kafka 클러스터의 공개 키 인증서(ca.p12)가 포함되어 있습니다. 클러스터 CA 인증서 및 암호는 Kafka 클러스터가 생성될 때 < cluster_name>-cluster-ca-cert 시크릿의 Cluster Operator에 의해 생성됩니다.
4
신뢰 저장소에 액세스하기 위한 암호(ca.password)입니다.
5
키 저장소 위치에는 Kafka 사용자의 공개 키 인증서(user.p12)가 포함되어 있습니다.
6
키 저장소에 액세스하기 위한 암호(user.password)입니다.
15.2.2.2. User Operator 외부에서 발급된 인증서를 사용한 mTLS 인증

User Operator 외부에서 발행된 인증서를 사용하여 mTLS 인증을 사용하려면 KafkaUser 리소스의 type 필드를 tls-external 로 설정합니다. 사용자에 대한 시크릿 및 인증 정보는 생성되지 않습니다.

User Operator 외부에서 발행된 인증서를 사용하는 mTLS 인증이 있는 사용자의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: tls-external
  # ...

15.2.2.3. SCRAM-SHA-512 인증

SCRAM-SHA-512 인증 메커니즘을 사용하려면 KafkaUser 리소스의 type 필드를 scram-sha-512 로 설정합니다.

SCRAM-SHA-512 인증이 활성화된 사용자 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: scram-sha-512
  # ...

User Operator에 의해 사용자를 생성하면 KafkaUser 리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 base64로 인코딩되는 password 키에 생성된 암호가 포함되어 있습니다. 암호를 사용하려면 디코딩해야 합니다.

사용자 인증 정보가 있는 시크릿 예

apiVersion: v1
kind: Secret
metadata:
  name: my-user
  labels:
    strimzi.io/kind: KafkaUser
    strimzi.io/cluster: my-cluster
type: Opaque
data:
  password: Z2VuZXJhdGVkcGFzc3dvcmQ= 
1

  sasl.jaas.config: b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkuc2NyYW0uU2NyYW1Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT0ibXktdXNlciIgcGFzc3dvcmQ9ImdlbmVyYXRlZHBhc3N3b3JkIjsK 
2

1
생성된 암호, base64로 인코딩됩니다.
2
SASL SCRAM-SHA-512 인증에 대한 JAAS 구성 문자열, base64로 인코딩됩니다.

생성된 암호를 디코딩합니다.

echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
15.2.2.3.1. 사용자 정의 암호 구성

사용자가 생성되면 Apache Kafka용 Streams가 임의의 암호를 생성합니다. Apache Kafka용 Streams에서 생성한 암호 대신 고유한 암호를 사용할 수 있습니다. 이렇게 하려면 암호를 사용하여 시크릿을 생성하고 KafkaUser 리소스에서 참조합니다.

SCRAM-SHA-512 인증에 대한 암호가 설정된 사용자 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: scram-sha-512
    password:
      valueFrom:
        secretKeyRef:
          name: my-secret 
1

          key: my-password 
2

  # ...

1
사전 정의된 암호가 포함된 시크릿의 이름입니다.
2
시크릿에 저장된 암호의 키입니다.

15.2.3. 사용자 권한 부여

KafkaUser 사용자 지정 리소스를 사용하여 Kafka 클러스터에 액세스해야 하는 사용자(클라이언트)에 대한 권한 부여 규칙을 구성합니다. KafkaUser.spec 에서 권한 부여 속성을 사용하여 규칙을 구성합니다. 유형을 지정하면 사용되는 규칙을 제어할 수 있습니다.

간단한 인증을 사용하려면 KafkaUser.spec.authorization 에서 type 속성을 simple 로 설정합니다. 간단한 인증에서는 Kafka Admin API를 사용하여 Kafka 클러스터 내부의 ACL 규칙을 관리합니다. User Operator의 ACL 관리가 활성화되어 있는지 여부는 Kafka 클러스터의 권한 부여 구성에 따라 다릅니다.

  • 간단한 승인을 위해 ACL 관리는 항상 활성화됩니다.
  • OPA 권한 부여의 경우 ACL 관리는 항상 비활성화되어 있습니다. 권한 부여 규칙은 OPA 서버에서 구성됩니다.
  • Red Hat Single Sign-On 권한 부여의 경우 Red Hat Single Sign-On에서 ACL 규칙을 직접 관리할 수 있습니다. 구성의 대체 옵션으로 간단한 인증자에게 권한을 위임할 수도 있습니다. 간단한 인증자로 위임할 때 User Operator는 ACL 규칙도 관리할 수 있습니다.
  • 사용자 정의 권한 부여 플러그인을 사용하는 사용자 정의 인증의 경우 Kafka 사용자 정의 리소스의 .spec.kafka.authorization 구성에서 supportsAdminApi 속성을 사용하여 지원을 활성화하거나 비활성화합니다.

권한 부여는 클러스터 전체입니다. 권한 부여 유형은 Kafka 사용자 정의 리소스의 동등한 구성과 일치해야 합니다.

ACL 관리가 활성화되지 않은 경우 Apache Kafka의 Streams는 ACL 규칙이 포함된 경우 리소스를 거부합니다.

User Operator의 독립 실행형 배포를 사용하는 경우 기본적으로 ACL 관리가 활성화됩니다. STRIMZI_ACLS_ADMIN_API_SUPPORTED 환경 변수를 사용하여 비활성화할 수 있습니다.

권한 부여가 지정되지 않은 경우 User Operator는 사용자에 대한 액세스 권한을 프로비저닝하지 않습니다. 이러한 KafkaUser 가 리소스에 계속 액세스할 수 있는지 여부는 사용 중인 인증자에 따라 다릅니다. 예를 들어 간단한 승인을 위해 Kafka 클러스터의 allow.everyone.if.no.acl.found 구성에 의해 결정됩니다.

15.2.3.1. ACL 규칙

간단한 인증에서는 ACL 규칙을 사용하여 Kafka 브로커에 대한 액세스를 관리합니다.

ACL 규칙은 acls 속성에서 지정하는 사용자에게 액세스 권한을 부여합니다.

AclRule 오브젝트에 대한 자세한 내용은 AclRule 스키마 참조를 참조하십시오.

15.2.3.2. Kafka 브로커에 대한 슈퍼 사용자 액세스

사용자가 Kafka 브로커 구성의 슈퍼 사용자 목록에 추가되면 KafkaUser 의 ACL에 정의된 권한 부여 제약 조건에 관계없이 클러스터에 대한 무제한 액세스가 허용됩니다.

브로커에 대한 슈퍼유저 액세스를 구성하는 방법에 대한 자세한 내용은 Kafka 권한 부여를 참조하십시오.

15.2.3.3. 사용자 할당량

사용자가 Kafka 브로커에 대한 구성된 액세스 수준을 초과하지 않도록 KafkaUser 리소스의 사양 을 구성하여 할당량을 적용할 수 있습니다. 크기 기반 네트워크 사용량과 시간 기반 CPU 사용률 임계값을 설정할 수 있습니다. 파티션 변경 할당량을 추가하여 사용자 요청에 대해 파티션 변경 요청을 허용하는 속도를 제어할 수도 있습니다.

사용자 할당량이 있는 KafkaUser 의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  # ...
  quotas:
    producerByteRate: 1048576 
1

    consumerByteRate: 2097152 
2

    requestPercentage: 55 
3

    controllerMutationRate: 10 
4

1
사용자가 Kafka 브로커로 내보낼 수 있는 데이터 양에 대한 바이트당 1초 할당량
2
사용자가 Kafka 브로커에서 가져올 수 있는 데이터 양에 대한 바이트당 할당량
3
클라이언트 그룹의 백분율로 CPU 사용률 제한
4
초당 허용된 동시 파티션 생성 및 삭제 작업(mutations) 수

이러한 속성에 대한 자세한 내용은 KafkaUserQuotas 스키마 참조를 참조하십시오.

15.3. Kafka 브로커에 대한 액세스 보안

Kafka 브로커에 대한 보안 액세스를 설정하려면 다음을 구성하고 적용합니다.

  • 다음을 수행할 Kafka 리소스입니다.

    • 지정된 인증 유형을 사용하여 리스너 생성
    • 전체 Kafka 클러스터에 대한 권한 부여 구성
  • 리스너를 통해 Kafka 브로커에 안전하게 액세스할 수 있는 KafkaUser 리소스

설정하도록 Kafka 리소스를 구성합니다.

  • 리스너 인증
  • Kafka 리스너에 대한 액세스를 제한하는 네트워크 정책
  • Kafka 권한 부여
  • 브로커에 대한 제한없이 액세스 할 수있는 슈퍼 사용자

인증은 각 리스너마다 독립적으로 구성됩니다. 권한 부여는 항상 전체 Kafka 클러스터에 대해 구성됩니다.

Cluster Operator는 리스너를 생성하고 Kafka 클러스터 내에서 인증을 활성화하기 위해 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정합니다.

자체 인증서를 설치하여 Cluster Operator에서 생성한 인증서 를 교체할 수 있습니다.

TLS 암호화가 활성화된 모든 리스너에 대한 자체 서버 인증서 및 개인 키를 제공할 수도 있습니다. 이러한 사용자 제공 인증서를 Kafka 리스너 인증서 라고 합니다. Kafka 리스너 인증서를 제공하면 조직의 개인 CA 또는 공용 CA와 같은 기존 보안 인프라를 활용할 수 있습니다. Kafka 클라이언트는 리스너 인증서에 서명하는 데 사용된 CA를 신뢰해야 합니다. 필요한 경우 Kafka 리스너 인증서를 수동으로 갱신해야 합니다. 인증서는 PKCS #12 형식(.p12) 및 PEM(.crt) 형식으로 사용할 수 있습니다.

KafkaUser 를 사용하여 특정 클라이언트가 Kafka에 액세스하는 데 사용하는 인증 및 권한 부여 메커니즘을 활성화합니다.

설정하도록 KafkaUser 리소스를 구성합니다.

  • 활성화된 리스너 인증과 일치하도록 인증
  • 활성화된 Kafka 권한 부여와 일치하도록 권한 부여
  • 클라이언트의 리소스 사용을 제어하는 할당량

User Operator는 선택한 인증 유형에 따라 클라이언트 및 클라이언트 인증에 사용되는 보안 인증 정보를 나타내는 사용자를 생성합니다.

액세스 구성 속성에 대한 자세한 내용은 스키마 참조를 참조하십시오.

15.3.1. Kafka 브로커 보안

이 절차에서는 Apache Kafka용 Streams를 실행할 때 Kafka 브로커 보안과 관련된 단계를 보여줍니다.

Kafka 브로커에 구현된 보안은 액세스가 필요한 클라이언트에 대해 구현된 보안과 호환되어야 합니다.

  • Kafka.spec.kafka.listeners[*].authenticationKafkaUser.spec.authentication과 일치합니다.
  • Kafka.spec.kafka.authorizationKafkaUser.spec.authorization과 일치합니다.

이 단계에서는 간단한 권한 부여 및 mTLS 인증을 사용하는 리스너에 대한 구성을 보여줍니다. 리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.

또는 리스너 인증에 SCRAM-SHA 또는 OAuth 2.0을 사용하고 Kafka 인증 에는 OAuth 2.0 또는 OPA를 사용할 수 있습니다.

프로세스

  1. Kafka 리소스를 구성합니다.

    1. 권한 부여 에 대한 권한 부여 속성을 구성합니다.
    2. 인증을 사용하여 리스너를 생성하도록 listeners 속성을 구성합니다.

      예를 들면 다음과 같습니다.

      apiVersion: kafka.strimzi.io/v1beta2
      kind: Kafka
      spec:
        kafka:
          # ...
          authorization: 
      1
      
            type: simple
            superUsers: 
      2
      
              - CN=client_1
              - user_2
              - CN=client_3
          listeners:
            - name: tls
              port: 9093
              type: internal
              tls: true
              authentication:
                type: tls 
      3
      
          # ...
        zookeeper:
          # ...
      1
      2
      Kafka에 무제한 액세스가 가능한 사용자 주체 목록입니다. CN 은 mTLS 인증이 사용될 때 클라이언트 인증서의 일반적인 이름입니다.
      3
      각 리스너에 대해 리스너 인증 메커니즘을 구성하고 mTLS, SCRAM-SHA-512 또는 토큰 기반 OAuth 2.0으로 지정할 수 있습니다.

      외부 리스너를 구성하는 경우 구성은 선택한 연결 메커니즘에 따라 달라집니다.

  2. Kafka 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

    Kafka 클러스터는 mTLS 인증을 사용하여 Kafka 브로커 리스너로 구성됩니다.

    각 Kafka 브로커 Pod에 대한 서비스가 생성됩니다.

    Kafka 클러스터 연결에 대한 부트스트랩 주소 역할을 하는 서비스가 생성됩니다.

    kafka 브로커의 ID를 확인하는 클러스터 CA 인증서도 시크릿 < cluster_name> -cluster-ca-cert 에 생성됩니다.

15.3.2. Kafka에 대한 사용자 액세스 보안

Kafka 클러스터에 대한 보안 액세스 권한이 필요한 클라이언트를 나타내도록 KafkaUser 를 생성하거나 수정합니다.

KafkaUser 인증 및 권한 부여 메커니즘을 구성할 때 동등한 Kafka 구성과 일치하는지 확인합니다.

  • KafkaUser.spec.authenticationKafka.spec.kafka.listeners[*].authentication과 일치합니다.
  • KafkaUser.spec.authorizationKafka.spec.kafka.authorization과 일치합니다.

다음 절차에서는 mTLS 인증을 사용하여 사용자를 생성하는 방법을 보여줍니다. SCRAM-SHA 인증을 사용하여 사용자를 생성할 수도 있습니다.

필요한 인증은 Kafka 브로커 리스너에 대해 구성된 인증 유형에 따라 다릅니다.

참고

Kafka 사용자와 Kafka 브로커 간의 인증은 각각에 대한 인증 설정에 따라 다릅니다. 예를 들어 Kafka 구성에서도 활성화되지 않은 경우 mTLS로 사용자를 인증할 수 없습니다.

사전 요구 사항

KafkaUser 의 인증 유형은 Kafka 브로커에 구성된 인증 유형과 일치해야 합니다.

프로세스

  1. KafkaUser 리소스를 구성합니다.

    예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaUser
    metadata:
      name: my-user
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      authentication: 
    1
    
        type: tls
      authorization:
        type: simple 
    2
    
        acls:
          - resource:
              type: topic
              name: my-topic
              patternType: literal
            operations:
              - Describe
              - Read
          - resource:
              type: group
              name: my-group
              patternType: literal
            operations:
              - Read
    1
    상호 tls 또는 scram-sha-512 로 정의된 사용자 인증 메커니즘.
    2
    관련 ACL 규칙 목록이 필요한 간단한 권한 부여.
  2. KafkaUser 리소스를 생성하거나 업데이트합니다.

    oc apply -f <user_config_file>

    사용자는 KafkaUser 리소스와 동일한 이름의 Secret과 함께 생성됩니다. 보안에는 mTLS 인증을 위한 개인 및 공개 키가 포함되어 있습니다.

Kafka 브로커에 대한 보안 연결을 위해 속성을 사용하여 Kafka 클라이언트를 구성하는 방법에 대한 자세한 내용은 14.4절. “리스너를 사용하여 Kafka 클러스터에 대한 클라이언트 액세스 설정” 을 참조하십시오.

15.3.3. 네트워크 정책을 사용하여 Kafka 리스너에 대한 액세스 제한

networkPolicyPeers 속성을 사용하여 리스너에 대한 액세스를 선택한 애플리케이션으로만 제한할 수 있습니다.

사전 요구 사항

  • Ingress NetworkPolicies를 지원하는 OpenShift 클러스터입니다.
  • Cluster Operator가 실행 중입니다.

프로세스

  1. Kafka 리소스를 엽니다.
  2. networkPolicyPeers 속성에서 Kafka 클러스터에 액세스할 수 있는 애플리케이션 Pod 또는 네임스페이스를 정의합니다.

    예를 들어 app 레이블이 kafka-client 로 설정된 애플리케이션 Pod에서만 연결을 허용하도록 tls 리스너를 구성하려면 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      kafka:
        # ...
        listeners:
          - name: tls
            port: 9093
            type: internal
            tls: true
            authentication:
              type: tls
            networkPolicyPeers:
              - podSelector:
                  matchLabels:
                    app: kafka-client
        # ...
      zookeeper:
        # ...
  3. 리소스를 생성하거나 업데이트합니다.

    oc apply:

    oc apply -f your-file

15.3.4. TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공

리스너는 Kafka 브로커에 대한 클라이언트 액세스를 제공합니다. TLS를 사용하여 클라이언트 액세스에 필요한 구성을 포함하여 Kafka 리소스에서 리스너를 구성합니다.

기본적으로 리스너는 Apache Kafka용 Streams에서 생성한 내부 CA(인증 기관) 인증서에서 서명한 인증서를 사용합니다. CA 인증서는 Kafka 클러스터를 생성할 때 Cluster Operator에 의해 생성됩니다. TLS용 클라이언트를 구성할 때 CA 인증서를 신뢰 저장소 구성에 추가하여 Kafka 클러스터를 확인합니다. 자체 CA 인증서를 설치하고 사용할 수도 있습니다. 또는 brokerCert CryostatAndKey 속성을 사용하여 리스너를 구성하고 사용자 지정 서버 인증서를 사용할 수 있습니다.

brokerCert CryostatAndKey 속성을 사용하면 리스너 수준에서 자체 사용자 지정 인증서를 사용하여 Kafka 브로커에 액세스할 수 있습니다. 고유한 개인 키 및 서버 인증서를 사용하여 보안을 생성한 다음 리스너의 brokerCert CryostatAndKey 구성에 키와 인증서를 지정합니다. 공용(외부) CA 또는 개인 CA에서 서명한 인증서를 사용할 수 있습니다. 공용 CA에서 서명한 경우 일반적으로 클라이언트의 신뢰 저장소 구성에 추가할 필요가 없습니다. 사용자 지정 인증서는 Apache Kafka용 Streams에서 관리되지 않으므로 수동으로 업데이트해야 합니다.

참고

리스너 인증서는 TLS 암호화 및 서버 인증에만 사용됩니다. TLS 클라이언트 인증에 사용되지 않습니다. TLS 클라이언트 인증에 자체 인증서를 사용하려면 자체 클라이언트 CA를 설치하고 사용해야 합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • 각 리스너에는 다음이 필요합니다.

    • 외부 CA에서 서명한 호환되는 서버 인증서입니다. (X.509 인증서를 PEM 형식으로 제공)

      여러 리스너에 하나의 리스너 인증서를 사용할 수 있습니다.

    • 제목 대체 이름(SAN)은 각 리스너의 인증서에 지정됩니다. 자세한 내용은 15.3.5절. “Kafka 리스너에 대한 서버 인증서의 대체 대상”의 내용을 참조하십시오.

자체 서명된 인증서를 사용하지 않는 경우 인증서에 전체 CA 체인을 포함하는 인증서를 제공할 수 있습니다.

TLS 암호화(tls: true)가 리스너에 대해 구성된 경우에만 brokerCert CryostatAndKey 속성을 사용할 수 있습니다.

참고

Apache Kafka의 스트림은 TLS에 암호화된 개인 키 사용을 지원하지 않습니다. 이 작업이 작동하려면 시크릿에 저장된 개인 키를 암호화되지 않아야 합니다.

프로세스

  1. 개인 키와 서버 인증서가 포함된 보안을 생성합니다.

    oc create secret generic my-secret --from-file=my-listener-key.key --from-file=my-listener-certificate.crt
  2. 클러스터의 Kafka 리소스를 편집합니다.

    configuration.brokerCertAndKey 속성에서 Secret, 인증서 파일 및 개인 키 파일을 사용하도록 리스너를 구성합니다.

    TLS 암호화가 활성화된 로드 밸런서 외부 리스너 구성 예

    # ...
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: external3
        port: 9094
        type: loadbalancer
        tls: true
        configuration:
          brokerCertChainAndKey:
            secretName: my-secret
            certificate: my-listener-certificate.crt
            key: my-listener-key.key
    # ...

    TLS 리스너 구성 예

    # ...
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
        configuration:
          brokerCertChainAndKey:
            secretName: my-secret
            certificate: my-listener-certificate.crt
            key: my-listener-key.key
    # ...

  3. 새 구성을 적용하여 리소스를 생성하거나 업데이트합니다.

    oc apply -f kafka.yaml

    Cluster Operator는 Kafka 클러스터의 롤링 업데이트를 시작하여 리스너 구성을 업데이트합니다.

    참고

    리스너에서 이미 사용하고 있는 Secret 에서 Kafka 리스너 인증서를 업데이트하는 경우에도 롤링 업데이트가 시작됩니다.

15.3.5. Kafka 리스너에 대한 서버 인증서의 대체 대상

자체 Kafka 리스너 인증서와 함께 TLS 호스트 이름 확인을 사용하려면 각 리스너 에 올바른 주체 대체 이름(SAN)을 사용해야 합니다. 인증서 SAN은 다음에 대한 호스트 이름을 지정해야 합니다.

  • 클러스터의 모든 Kafka 브로커
  • Kafka 클러스터 부트스트랩 서비스

CA에서 지원하는 와일드카드 인증서를 사용할 수 있습니다.

15.3.5.1. 내부 리스너를 위한 SAN의 예

다음 예제를 사용하면 내부 리스너에 대한 인증서에 SAN의 호스트 이름을 지정하는 데 도움이 됩니다.

< cluster-name >을 Kafka 클러스터의 이름으로 바꾸고 < namespace >를 클러스터가 실행 중인 OpenShift 네임스페이스로 바꿉니다.

유형의 와일드카드 예: 내부 리스너

//Kafka brokers
*.<cluster-name>-kafka-brokers
*.<cluster-name>-kafka-brokers.<namespace>.svc

// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc

type: 내부 리스너에 대한 와일드카드가 아닌 예

// Kafka brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers.<namespace>.svc
# ...

// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc

유형: cluster-ip 리스너의 와일드카드가 아닌 예

// Kafka brokers
<cluster-name>-kafka-<listener-name>-0
<cluster-name>-kafka-<listener-name>-0.<namespace>.svc
<cluster-name>-kafka-<listener-name>-1
<cluster-name>-kafka-<listener-name>-1.<namespace>.svc
# ...

// Bootstrap service
<cluster-name>-kafka-<listener-name>-bootstrap
<cluster-name>-kafka-<listener-name>-bootstrap.<namespace>.svc

15.3.5.2. 외부 리스너를 위한 SAN의 예

TLS 암호화가 활성화된 외부 리스너의 경우 인증서에 지정해야 하는 호스트 이름은 외부 리스너 유형에 따라 다릅니다.

Expand
표 15.1. 각 유형의 외부 리스너에 대한 Sans
외부 리스너 유형SAN에서…​을 지정합니다.

Ingress

모든 Kafka 브로커 인그레스 리소스의 주소 및 부트스트랩 Ingress 의 주소입니다.

일치하는 와일드카드 이름을 사용할 수 있습니다.

Route

모든 Kafka 브로커 경로 의 주소 및 부트스트랩 경로 의 주소입니다.

일치하는 와일드카드 이름을 사용할 수 있습니다.

LoadBalancer

모든 Kafka 브로커 로드 밸런서 및 부트스트랩 로드 밸런서 주소의 주소입니다.

일치하는 와일드카드 이름을 사용할 수 있습니다.

NodePort

Kafka 브로커 Pod를 예약할 수 있는 모든 OpenShift 작업자 노드의 주소입니다.

일치하는 와일드카드 이름을 사용할 수 있습니다.

15.4. OAuth 2.0 토큰 기반 인증 사용

Apache Kafka의 스트림은 OAUTHBEARERPLAIN 메커니즘을 사용한 OAuth 2.0 인증 사용을 지원합니다.

OAuth 2.0은 중앙 권한 부여 서버를 사용하여 리소스에 대한 제한된 액세스 권한을 부여하는 토큰을 발행하여 애플리케이션 간에 표준화된 토큰 기반 인증과 권한을 부여할 수 있습니다.

OAuth 2.0 인증을 구성한 다음 OAuth 2.0 인증을 구성할 수 있습니다.

Kafka 브로커 및 클라이언트는 모두 OAuth 2.0을 사용하도록 구성해야 합니다. OAuth 2.0 인증은 단순 또는 OPA 기반 Kafka 권한 과 함께 사용할 수도 있습니다.

OAuth 2.0 토큰 기반 인증을 사용하여 애플리케이션 클라이언트는 계정 자격 증명을 노출하지 않고 애플리케이션 서버( 리소스 서버라고 함)의 리소스에 액세스할 수 있습니다.

애플리케이션 클라이언트는 인증 수단으로 액세스 토큰을 전달합니다. 이 방법으로 부여할 액세스 수준을 결정하는 데 사용할 애플리케이션 서버가 사용할 수 있습니다. 권한 부여 서버는 액세스 권한 부여 및 액세스 관련 문의를 처리합니다.

Apache Kafka 스트림 컨텍스트에서 다음을 수행합니다.

  • Kafka 브로커는 OAuth 2.0 리소스 서버 역할을 합니다.
  • Kafka 클라이언트가 OAuth 2.0 애플리케이션 클라이언트 역할을 합니다.

Kafka 클라이언트는 Kafka 브로커에 인증합니다. 브로커 및 클라이언트는 필요에 따라 OAuth 2.0 권한 부여 서버와 통신하여 액세스 토큰을 얻거나 검증합니다.

Apache Kafka용 Streams 배포를 위해 OAuth 2.0 통합은 다음을 제공합니다.

  • Kafka 브로커에 대한 서버 측 OAuth 2.0 지원
  • Kafka MirrorMaker, Kafka Connect 및 Kafka Bridge에 대한 클라이언트 측 OAuth 2.0 지원

15.4.1. OAuth 2.0 인증 메커니즘

Apache Kafka의 스트림은 OAuth 2.0 인증을 위한 OAUTHBEARER 및 PLAIN 메커니즘을 지원합니다. 두 메커니즘을 통해 Kafka 클라이언트가 Kafka 브로커를 사용하여 인증된 세션을 설정할 수 있습니다. 클라이언트, 권한 부여 서버 및 Kafka 브로커 간의 인증 흐름은 각 메커니즘마다 다릅니다.

가능한 경우 OAUTHBEARER를 사용하도록 클라이언트를 구성하는 것이 좋습니다. OAUTHBEARER는 클라이언트 인증 정보가 Kafka 브로커와 공유 되지 않기 때문에 PLAIN보다 높은 수준의 보안을 제공합니다. OAUTHBEARER를 지원하지 않는 Kafka 클라이언트에서만 PLAIN을 사용하는 것이 좋습니다.

클라이언트 연결에 OAuth 2.0 인증을 사용하도록 Kafka 브로커 리스너를 구성합니다. 필요한 경우 동일한 oauth 리스너에서 OAUTHBEARER 및 PLAIN 메커니즘을 사용할 수 있습니다. 각 메커니즘을 지원하는 속성은 oauth 리스너 구성에 명시적으로 지정해야 합니다.

OAUTHBEARER 개요

OAUTHBEARER는 Kafka 브로커의 oauth 리스너 구성에서 자동으로 활성화됩니다. enableOauthBearer 속성을 true 로 설정할 수 있지만 필수는 아닙니다.

  # ...
  authentication:
    type: oauth
    # ...
    enableOauthBearer: true

많은 Kafka 클라이언트 툴은 프로토콜 수준에서 OAUTHBEARER에 대한 기본 지원을 제공하는 라이브러리를 사용합니다. 애플리케이션 개발을 지원하기 위해 Apache Kafka용 Streams는 업스트림 Kafka 클라이언트 Java 라이브러리에 대한 OAuth 콜백 처리기 를 제공합니다(다른 라이브러리는 아님). 따라서 자체 콜백 처리기를 작성할 필요가 없습니다. 애플리케이션 클라이언트는 콜백 처리기를 사용하여 액세스 토큰을 제공할 수 있습니다. Go와 같은 다른 언어로 작성된 클라이언트는 사용자 지정 코드를 사용하여 권한 부여 서버에 연결하고 액세스 토큰을 받아야 합니다.

클라이언트는 OAUTHBEARER를 사용하여 인증 정보 교환을 위해 Kafka 브로커로 세션을 시작합니다. 여기서 인증 정보는 콜백 처리기에서 제공하는 전달자 토큰의 형태를 취합니다. 콜백을 사용하면 다음 세 가지 방법 중 하나로 토큰 프로비저닝을 구성할 수 있습니다.

  • 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
  • 구성 시 수동으로 얻은 장기 액세스 토큰
  • 구성 시 수동으로 가져온 장기 새로 고침 토큰
참고

OAUTHBEARER 인증은 프로토콜 수준에서 OAUTHBEARER 메커니즘을 지원하는 Kafka 클라이언트에서만 사용할 수 있습니다.

PLAIN 개요

PLAIN을 사용하려면 Kafka 브로커의 oauth 리스너 구성에서 활성화해야 합니다.

다음 예제에서는 기본적으로 활성화되어 있는 OAUTHBEARER 외에도 PLAIN이 활성화됩니다. PLAIN만 사용하려면 enableOauthBearerfalse 로 설정하여 OAUTHBEARER를 비활성화할 수 있습니다.

  # ...
  authentication:
    type: oauth
    # ...
    enablePlain: true
    tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token

PLAIN은 모든 Kafka 클라이언트 툴에서 사용하는 간단한 인증 메커니즘입니다. OAuth 2.0 인증에 사용할 PLAIN을 활성화하려면 Apache Kafka의 Streams는 PLAIN 서버 측 콜백을 통해 OAuth 2.0 을 제공합니다.

PLAIN의 Streams for Apache Kafka 구현을 사용하면 클라이언트 인증 정보가 Zoo Cryostat에 저장되지 않습니다. 대신 OAUTHBEARER 인증이 사용되는 경우와 유사하게 클라이언트 자격 증명은 호환 권한 부여 서버 뒤에서 중앙에서 처리됩니다.

PLAIN 콜백을 통해 OAuth 2.0과 함께 사용하면 Kafka 클라이언트가 다음 방법 중 하나를 사용하여 Kafka 브로커로 인증합니다.

  • 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
  • 구성 시 수동으로 얻은 장기 액세스 토큰

두 방법 모두 클라이언트는 Kafka 브로커에 인증 정보를 전달하기 위해 PLAIN 사용자 이름과 암호 속성을 제공해야 합니다. 클라이언트는 이러한 속성을 사용하여 클라이언트 ID와 시크릿 또는 사용자 이름 및 액세스 토큰을 전달합니다.

클라이언트 ID와 시크릿은 액세스 토큰을 가져오는 데 사용됩니다.

액세스 토큰은 암호 속성 값으로 전달됩니다. $accessToken: 접두사를 사용하거나 사용하지 않고 액세스 토큰을 전달합니다.

  • 리스너 구성에서 토큰 끝점(tokenEndpointUri)을 구성하는 경우 접두사가 필요합니다.
  • 리스너 구성에서 토큰 끝점(tokenEndpointUri)을 구성하지 않으면 접두사가 필요하지 않습니다. Kafka 브로커는 암호를 원시 액세스 토큰으로 해석합니다.

암호 가 액세스 토큰으로 설정된 경우 사용자 이름은 Kafka 브로커가 액세스 토큰에서 얻는 것과 동일한 주체 이름으로 설정해야 합니다. userNameClaim,fallbackUserNameClaim,fallbackUsernamePrefix, userInfoEndpointUri 속성을 사용하여 리스너에서 사용자 이름 추출 옵션을 지정할 수 있습니다. 사용자 이름 추출 프로세스는 권한 부여 서버(특히 클라이언트 ID를 계정 이름에 매핑하는 방법)에 따라 다릅니다.

참고

PLAIN을 통한 OAuth는 암호 부여 메커니즘을 지원하지 않습니다. 위에서 설명한 대로 클라이언트 인증 정보(client Id + secret) 또는 액세스 토큰을 통해 SASL PLAIN 메커니즘을 통해 'proxy'만 수행할 수 있습니다.

15.4.2. OAuth 2.0 Kafka 브로커 구성

OAuth 2.0에 대한 Kafka 브로커 구성은 다음과 같습니다.

  • 권한 부여 서버에서 OAuth 2.0 클라이언트 생성
  • Kafka 사용자 정의 리소스에서 OAuth 2.0 인증 구성
참고

권한 부여 서버와 관련하여 Kafka 브로커 및 Kafka 클라이언트는 모두 OAuth 2.0 클라이언트로 간주됩니다.

15.4.2.1. 권한 부여 서버의 OAuth 2.0 클라이언트 구성

세션 시작 중에 수신된 토큰을 확인하도록 Kafka 브로커를 구성하려면 다음 클라이언트 인증 정보가 활성화된 권한 부여 서버로 구성된 OAuth 2.0 클라이언트 정의를 생성하는 것이 좋습니다.

  • kafka 의 클라이언트 ID(예:)
  • 인증 메커니즘으로 클라이언트 ID 및 시크릿
참고

권한 부여 서버의 비공개 인트로스펙션 엔드포인트를 사용하는 경우에만 클라이언트 ID와 시크릿을 사용해야 합니다. 인증 정보는 빠른 로컬 JWT 토큰 검증과 마찬가지로 공용 권한 부여 서버 끝점을 사용할 때 필요하지 않습니다.

15.4.2.2. Kafka 클러스터의 OAuth 2.0 인증 구성

Kafka 클러스터에서 OAuth 2.0 인증을 사용하려면 인증 방법 oauth:을 사용하여 Kafka 클러스터 사용자 정의 리소스에 대한 tls 리스너 구성을 지정합니다.

OAuth 2.0의 인증 방법 유형 확인

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    # ...
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
      #...

리스너에서 OAuth 2.0 인증을 구성할 수 있습니다. TLS 암호화와 함께 OAuth 2.0 인증을 사용하는 것이 좋습니다(tls: true). 암호화 없이 연결은 토큰 도난을 통해 네트워크 도청 및 무단 액세스에 취약합니다.

보안 전송 계층이 클라이언트와 통신할 수 있도록 type: oauth 를 사용하여 외부 리스너를 구성합니다.

외부 리스너와 함께 OAuth 2.0 사용

# ...
listeners:
  - name: external3
    port: 9094
    type: loadbalancer
    tls: true
    authentication:
      type: oauth
    #...

tls 속성은 기본적으로 false 이므로 활성화해야 합니다.

인증 유형을 OAuth 2.0으로 정의한 경우 인트로스펙션 엔드포인트를 사용하여 빠른 로컬 JWT 검증 또는 토큰 검증으로 검증 유형에 따라 구성을 추가합니다.

설명 및 예제를 사용하여 리스너에 대해 OAuth 2.0 을 구성하는 절차는 Kafka 브로커에 대한 OAuth 2.0 지원 구성에 설명되어 있습니다.

15.4.2.3. 빠른 로컬 JWT 토큰 검증 구성

빠른 로컬 JWT 토큰 검증은 JWT 토큰 서명을 로컬로 확인합니다.

로컬 검사에서는 토큰이 있는지 확인합니다.

  • 액세스 토큰에 대한 Bearer 의 (typ) 클레임 값을 포함하여 유형 준수
  • 유효함 (종료되지 않음)
  • 유효한IssuerURI와 일치하는 발행자가 있음

리스너를 구성할 때 권한 부여 서버가 발행하지 않은 모든 토큰이 거부되도록 유효한IssuerURI 속성을 지정합니다.

빠른 로컬 JWT 토큰 검증 중에 권한 부여 서버에 연결할 필요가 없습니다. OAuth 2.0 권한 부여 서버에서 노출하는 끝점인 jwksEndpointUri 속성을 지정하여 빠른 로컬 JWT 토큰 검증을 활성화합니다. 엔드포인트에는 Kafka 클라이언트가 인증 정보로 전송되는 서명된 JWT 토큰의 유효성을 검사하는 데 사용되는 공개 키가 포함되어 있습니다.

참고

권한 부여 서버와의 모든 통신은 TLS 암호화를 사용하여 수행해야 합니다.

인증서 신뢰 저장소를 Apache Kafka 프로젝트 네임스페이스의 Streams에서 OpenShift Secret으로 구성하고 tlsTrustedCertificates 속성을 사용하여 truststore 파일이 포함된 OpenShift 보안을 가리킬 수 있습니다.

JWT 토큰에서 사용자 이름을 올바르게 추출하도록 userNameClaim 을 구성할 수 있습니다. 필요한 경우 "['user.info'].['user.id']" 와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.

Kafka ACL 권한을 사용하려면 인증 중에 사용자 이름으로 사용자를 식별해야 합니다. ( JWT 토큰의 하위 클레임은 일반적으로 사용자 이름이 아닌 고유 ID입니다.)

빠른 로컬 JWT 토큰 검증을 위한 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    #...
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
          validIssuerUri: <https://<auth_server_address>/auth/realms/tls>
          jwksEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/certs>
          userNameClaim: preferred_username
          maxSecondsWithoutReauthentication: 3600
          tlsTrustedCertificates:
          - secretName: oauth-server-cert
            certificate: ca.crt
    #...

15.4.2.4. OAuth 2.0 인트로스펙션 엔드 포인트 구성

OAuth 2.0 인트로스펙션 엔드포인트를 사용하는 토큰 검증은 수신된 액세스 토큰을 불투명으로 처리합니다. Kafka 브로커는 검증에 필요한 토큰 정보로 응답하는 인트로스펙션 엔드포인트에 액세스 토큰 토큰을 보냅니다. 중요한 것은 특정 액세스 토큰이 유효한 경우 최신 정보와 토큰이 만료되는 시기에 대한 정보를 반환합니다.

OAuth 2.0 인트로스펙션 기반 검증을 구성하려면 빠른 로컬 JWT 토큰 검증에 지정된 jwksEndpointUri 속성 대신 introspectionEndpointUri 속성을 지정합니다. 인증 서버에 따라 인트로스펙션 엔드포인트가 일반적으로 보호되므로 clientIdclientSecret 을 지정해야 합니다.

인트로스펙션 엔드 포인트 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
          clientId: kafka-broker
          clientSecret:
            secretName: my-cluster-oauth
            key: clientSecret
          validIssuerUri: <https://<auth_server_-_address>/auth/realms/tls>
          introspectionEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/token/introspect>
          userNameClaim: preferred_username
          maxSecondsWithoutReauthentication: 3600
          tlsTrustedCertificates:
          - secretName: oauth-server-cert
            certificate: ca.crt

15.4.3. Kafka 브로커에 대한 세션 재인증

Kafka 클라이언트와 Kafka 브로커 간의 OAuth 2.0 세션에 Kafka 세션 재인증 을 사용하도록 oauth 리스너를 구성할 수 있습니다. 이 메커니즘은 정의된 기간 후에 클라이언트와 브로커 간에 인증된 세션 만료를 적용합니다. 세션이 만료되면 클라이언트는 기존 연결을 삭제하는 대신 다시 사용하여 새 세션을 즉시 시작합니다.

세션 재인증은 기본적으로 비활성화되어 있습니다. 이를 활성화하려면 oauth 리스너 구성에서 maxSecondsWithoutReauthentication 의 시간 값을 설정합니다. 동일한 속성은 OAUTHBEARER 및 PLAIN 인증에 대한 세션 재인증을 구성하는 데 사용됩니다. 구성 예제는 15.4.6.2절. “Kafka 브로커에 대한 OAuth 2.0 지원 구성” 을 참조하십시오.

세션 재인증은 클라이언트에서 사용하는 Kafka 클라이언트 라이브러리에서 지원해야 합니다.

세션 재인증은 빠른 로컬 JWT 또는 인트로스펙션 엔드포인트 토큰 검증과 함께 사용할 수 있습니다.

클라이언트 재인증

브로커의 인증된 세션이 만료되면 연결을 삭제하지 않고 새 유효한 액세스 토큰을 브로커에 전송하여 클라이언트가 기존 세션으로 다시 인증해야 합니다.

토큰 유효성 검사가 성공하면 기존 연결을 사용하여 새 클라이언트 세션이 시작됩니다. 클라이언트가 다시 인증되지 않으면 메시지를 보내거나 수신하려고 하면 브로커가 연결을 종료합니다. Kafka 클라이언트 라이브러리 2.2 이상을 사용하는 Java 클라이언트는 브로커에서 재인증 메커니즘이 활성화된 경우 자동으로 다시 인증됩니다.

세션 재인증은 사용되는 경우 토큰 새로 고침에도 적용됩니다. 세션이 만료되면 클라이언트는 새로 고침 토큰을 사용하여 액세스 토큰을 새로 고칩니다. 그런 다음 클라이언트는 새 액세스 토큰을 사용하여 기존 세션에 다시 인증합니다.

OAUTHBEARER 및 PLAIN의 세션 만료

세션 재인증이 구성되면 OAUTHBEARER 및 PLAIN 인증에 대해 세션 만료가 다르게 작동합니다.

OAUTHBEARER 및 PLAIN의 경우 클라이언트 ID 및 시크릿 방법을 사용합니다.

  • 브로커의 인증된 세션은 구성된 maxSecondsWithoutReauthentication 에서 만료됩니다.
  • 구성된 시간 전에 액세스 토큰이 만료되면 세션이 이전에 만료됩니다.

장기 액세스 토큰 방법을 사용하는 PLAIN의 경우:

  • 브로커의 인증된 세션은 구성된 maxSecondsWithoutReauthentication 에서 만료됩니다.
  • 구성된 시간 전에 액세스 토큰이 만료되면 재인증이 실패합니다. 세션 재인증이 시도되었지만 PLAIN에는 토큰을 새로 고치는 메커니즘이 없습니다.

maxSecondsWithoutReauthentication구성되지 않은 경우 OAUTHBEARER 및 PLAIN 클라이언트는 다시 인증할 필요 없이 브로커에 무기한 연결을 유지할 수 있습니다. 인증된 세션은 액세스 토큰 만료로 끝나지 않습니다. 그러나 예를 들어 keycloak 권한 부여를 사용하거나 사용자 정의 승인기를 설치하여 권한을 구성할 때 이를 고려할 수 있습니다.

15.4.4. OAuth 2.0 Kafka 클라이언트 구성

Kafka 클라이언트는 다음 중 하나로 구성됩니다.

  • 권한 부여 서버에서 유효한 액세스 토큰을 가져오는 데 필요한 인증 정보(클라이언트 ID 및 시크릿)
  • 권한 부여 서버에서 제공하는 툴을 사용하여 얻은 유효한 장기 액세스 토큰 또는 새로 고침 토큰

Kafka 브로커로 전송된 유일한 정보는 액세스 토큰입니다. 액세스 토큰을 얻기 위해 권한 부여 서버로 인증하는 데 사용되는 인증 정보는 브로커로 전송되지 않습니다.

클라이언트에서 액세스 토큰을 가져올 때 권한 부여 서버와의 추가 통신이 필요하지 않습니다.

가장 간단한 메커니즘은 클라이언트 ID 및 시크릿을 사용한 인증입니다. 장기 액세스 토큰 또는 수명이 긴 새로 고침 토큰을 사용하면 권한 부여 서버 도구에 대한 추가 종속성이 있기 때문에 복잡성이 향상됩니다.

참고

장기 액세스 토큰을 사용하는 경우 토큰의 최대 수명을 늘리려면 권한 부여 서버에서 클라이언트를 구성해야 할 수 있습니다.

Kafka 클라이언트가 액세스 토큰으로 직접 구성되지 않은 경우 클라이언트는 권한 부여 서버에 연결하여 Kafka 세션 시작 중에 액세스 토큰에 대한 인증 정보를 교환합니다. Kafka 클라이언트 교환:

  • 클라이언트 ID 및 시크릿
  • 클라이언트 ID, 새로 고침 토큰, 시크릿(선택 사항)
  • 사용자 이름과 암호, 클라이언트 ID 및 시크릿 사용(선택 사항)

15.4.5. OAuth 2.0 클라이언트 인증 흐름

OAuth 2.0 인증 흐름은 기본 Kafka 클라이언트 및 Kafka 브로커 구성에 따라 다릅니다. 이 흐름은 사용된 권한 부여 서버에서도 지원해야 합니다.

Kafka 브로커 리스너 구성은 클라이언트가 액세스 토큰을 사용하여 인증하는 방법을 결정합니다. 클라이언트는 클라이언트 ID와 시크릿을 전달하여 액세스 토큰을 요청할 수 있습니다.

리스너가 PLAIN 인증을 사용하도록 구성된 경우 클라이언트는 클라이언트 ID 및 시크릿 또는 사용자 이름 및 액세스 토큰으로 인증할 수 있습니다. 이러한 값은 PLAIN 메커니즘의 사용자 이름암호 속성으로 전달됩니다.

리스너 구성은 다음 토큰 검증 옵션을 지원합니다.

  • 권한 부여 서버에 연결하지 않고도 JWT 서명 확인 및 로컬 토큰 인트로스펙션에 따라 빠른 로컬 토큰 검증을 사용할 수 있습니다. 권한 부여 서버는 토큰의 서명의 유효성을 검사하는 데 사용되는 공용 인증서가 있는 JWKS 엔드포인트를 제공합니다.
  • 권한 부여 서버에서 제공하는 토큰 인트로스펙션 엔드포인트를 호출할 수 있습니다. 새 Kafka 브로커 연결이 설정될 때마다 브로커는 클라이언트에서 수신한 액세스 토큰을 권한 부여 서버로 전달합니다. Kafka 브로커는 토큰이 유효한지 여부를 확인하기 위해 응답을 확인합니다.
참고

권한 부여 서버는 불투명 액세스 토큰만 사용할 수 있으므로 로컬 토큰 유효성 검사는 사용할 수 없습니다.

다음과 같은 인증 유형에 대해 Kafka 클라이언트 인증 정보를 구성할 수도 있습니다.

  • 이전에 생성된 장기 액세스 토큰을 사용하여 로컬 액세스 직접
  • 새 액세스 토큰을 발행하기 위해 권한 부여 서버와 연락합니다(클라이언트 ID와 시크릿 또는 새로 고침 토큰 또는 사용자 이름과 암호 사용)
15.4.5.1. SASL OAUTHBEARER 메커니즘을 사용한 클라이언트 인증 흐름의 예

SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 인증에 다음 통신 흐름을 사용할 수 있습니다.

브로커에서 인증 서버에 검증을 위임하는 클라이언트 ID와 시크릿을 사용하는 클라이언트

Client using client ID and secret with broker delegating validation to authorization server

  1. Kafka 클라이언트는 클라이언트 ID 및 시크릿을 사용하여 권한 부여 서버에서 액세스 토큰을 요청하고 선택적으로 새로 고침 토큰을 요청합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
  2. 권한 부여 서버에서 새 액세스 토큰을 생성합니다.
  3. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 액세스 토큰을 전달하여 Kafka 브로커로 인증합니다.
  4. Kafka 브로커는 자체 클라이언트 ID와 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 엔드포인트를 호출하여 액세스 토큰을 검증합니다.
  5. 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.

브로커가 빠른 로컬 토큰 검증을 수행하는 클라이언트 ID 및 시크릿을 사용하는 클라이언트

Client using client ID and secret with broker performing fast local token validation

  1. Kafka 클라이언트는 클라이언트 ID 및 시크릿을 사용하여 토큰 끝점의 권한 부여 서버와 필요한 경우 새로 고침 토큰을 사용하여 인증합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
  2. 권한 부여 서버에서 새 액세스 토큰을 생성합니다.
  3. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 액세스 토큰을 전달하여 Kafka 브로커로 인증합니다.
  4. Kafka 브로커는 JWT 토큰 서명 검사 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬로 검증합니다.

브로커로 권한 부여 서버에 검증을 위임하는 장기 액세스 토큰을 사용하는 클라이언트

Client using long-lived access token with broker delegating validation to authorization server

  1. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 브로커로 인증하여 장기 액세스 토큰을 전달합니다.
  2. Kafka 브로커는 자체 클라이언트 ID와 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 엔드포인트를 호출하여 액세스 토큰을 검증합니다.
  3. 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.

브로커가 빠른 로컬 유효성 검사를 수행하는 장기 액세스 토큰을 사용하는 클라이언트

Client using long-lived access token with broker performing fast local validation

  1. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 브로커로 인증하여 장기 액세스 토큰을 전달합니다.
  2. Kafka 브로커는 JWT 토큰 서명 검사 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬로 검증합니다.
주의

빠른 로컬 JWT 토큰 서명 검증은 토큰이 취소된 경우 권한 부여 서버와 확인되지 않으므로 수명이 짧은 토큰에만 적합합니다. 토큰 만료는 토큰에 기록되지만 취소는 언제든지 발생할 수 있으므로 권한 부여 서버에 연결하지 않아도 됩니다. 발행된 토큰은 만료될 때까지 유효한 것으로 간주됩니다.

15.4.5.2. SASL PLAIN 메커니즘을 사용한 클라이언트 인증 흐름의 예

OAuth PLAIN 메커니즘을 사용하여 Kafka 인증에 다음 통신 흐름을 사용할 수 있습니다.

브로커가 클라이언트의 액세스 토큰을 가져오는 클라이언트 ID와 시크릿을 사용하는 클라이언트

Client using a client ID and secret with the broker obtaining the access token for the client

  1. Kafka 클라이언트는 사용자 이름으로 clientId 를 전달하고 시크릿 을 암호로 전달합니다.
  2. Kafka 브로커는 토큰 끝점을 사용하여 clientIdsecret 을 권한 부여 서버에 전달합니다.
  3. 인증 서버는 새로운 액세스 토큰을 반환하거나 클라이언트 자격 증명이 유효하지 않은 경우 오류를 반환합니다.
  4. Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.

    1. 토큰 인트로스펙션 엔드포인트가 지정된 경우 Kafka 브로커는 권한 부여 서버에서 엔드포인트를 호출하여 액세스 토큰을 검증합니다. 토큰 유효성 검사가 성공하면 세션이 설정됩니다.
    2. 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 이루어지지 않습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 액세스 토큰을 로컬로 검증합니다.

클라이언트 ID 및 시크릿 없이 장기 액세스 토큰을 사용하는 클라이언트

Client using a long-lived access token without a client ID and secret

  1. Kafka 클라이언트는 사용자 이름과 암호를 전달합니다. 암호는 수동으로 가져와 클라이언트를 실행하기 전에 구성한 액세스 토큰의 값을 제공합니다.
  2. 이 암호는 Kafka 브로커 리스너가 인증을 위해 토큰 끝점으로 구성되었는지 여부에 따라 $accessToken: 문자열 접두사와 함께 전달됩니다.

    1. 토큰 끝점이 구성된 경우 브로커에 password 매개변수에 클라이언트 시크릿이 아닌 액세스 토큰이 포함되어 있음을 알 수 있도록 암호 앞에 $accessToken: 가 붙여야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다.
    2. 토큰 끝점이 Kafka 브로커 리스너에 구성되지 않은 경우( no-client-credentials 모드사용) 암호는 접두사 없이 액세스 토큰을 제공해야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다. 이 모드에서 클라이언트는 클라이언트 ID와 시크릿을 사용하지 않으며 password 매개변수는 항상 원시 액세스 토큰으로 해석됩니다.
  3. Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.

    1. 토큰 인트로스펙션 엔드포인트가 지정된 경우 Kafka 브로커는 권한 부여 서버에서 엔드포인트를 호출하여 액세스 토큰을 검증합니다. 토큰 유효성 검사가 성공하면 세션이 설정됩니다.
    2. 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 없습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 액세스 토큰을 로컬로 검증합니다.

15.4.6. OAuth 2.0 인증 구성

OAuth 2.0은 Kafka 클라이언트와 Apache Kafka 구성 요소의 스트림 간의 상호 작용에 사용됩니다.

Apache Kafka에 OAuth 2.0을 사용하려면 다음을 수행해야 합니다.

15.4.6.1. OAuth 2.0 인증 서버 구성

이 절차에서는 일반적으로 Apache Kafka용 Streams와 통합하기 위해 권한 부여 서버를 구성해야 하는 작업을 설명합니다.

이 지침은 제품에 한정되어 있지 않습니다.

단계는 선택한 권한 부여 서버에 따라 다릅니다. OAuth 2.0 액세스를 설정하는 방법에 대한 정보는 권한 부여 서버에 대한 제품 설명서를 참조하십시오.

참고

권한 부여 서버가 이미 배포된 경우 배포 단계를 건너뛰고 현재 배포를 사용할 수 있습니다.

프로세스

  1. 권한 부여 서버를 클러스터에 배포합니다.
  2. 권한 부여 서버의 CLI 또는 관리 콘솔에 액세스하여 Apache Kafka용 OAuth 2.0을 구성합니다.

    이제 Apache Kafka용 Streams에서 작동하도록 권한 부여 서버를 준비합니다.

  3. kafka-broker 클라이언트를 구성합니다.
  4. 애플리케이션의 각 Kafka 클라이언트 구성 요소에 대해 클라이언트를 구성합니다.

다음에 수행할 작업

권한 부여 서버를 배포하고 구성한 후 OAuth 2.0을 사용하도록 Kafka 브로커를 구성합니다.

15.4.6.2. Kafka 브로커에 대한 OAuth 2.0 지원 구성

다음 절차에서는 브로커 리스너가 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 브로커를 구성하는 방법을 설명합니다.

tls: true 가 있는 리스너를 통해 암호화된 인터페이스를 통해 OAuth 2.0을 사용하는 것이 좋습니다. 일반 리스너는 권장되지 않습니다.

인증 서버가 신뢰할 수 있는 CA에서 서명한 인증서를 사용하고 OAuth 2.0 서버 호스트 이름과 일치하는 경우 TLS 연결이 기본 설정을 사용하여 작동합니다. 그렇지 않으면 적절한 인증서를 사용하여 truststore를 구성하거나 인증서 호스트 이름 검증을 비활성화해야 할 수 있습니다.

Kafka 브로커를 구성할 때 새로 연결된 Kafka 클라이언트의 OAuth 2.0 인증 중에 액세스 토큰을 확인하는 데 사용되는 메커니즘에 대한 두 가지 옵션이 있습니다.

시작하기 전

Kafka 브로커 리스너에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 다음을 참조하십시오.

사전 요구 사항

  • Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
  • OAuth 2.0 인증 서버가 배포됨

프로세스

  1. 편집기에서 Kafka 리소스의 Kafka 브로커 구성(Kafka.spec.kafka)을 업데이트합니다.

    oc edit kafka my-cluster
  2. Kafka 브로커 리스너 구성을 구성합니다.

    각 리스너 유형에 대한 구성은 독립적이므로 동일하지 않아야 합니다.

    다음 예제에서는 외부 리스너에 대해 구성된 구성 옵션을 보여줍니다.

    예 1: 빠른 로컬 JWT 토큰 검증 구성

    #...
    - name: external3
      port: 9094
      type: loadbalancer
      tls: true
      authentication:
        type: oauth 
    1
    
        validIssuerUri: https://<auth_server_address>/auth/realms/external 
    2
    
        jwksEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/certs 
    3
    
        userNameClaim: preferred_username 
    4
    
        maxSecondsWithoutReauthentication: 3600 
    5
    
        tlsTrustedCertificates: 
    6
    
        - secretName: oauth-server-cert
          certificate: ca.crt
        disableTlsHostnameVerification: true 
    7
    
        jwksExpirySeconds: 360 
    8
    
        jwksRefreshSeconds: 300 
    9
    
        jwksMinRefreshPauseSeconds: 1 
    10

    1
    리스너 유형이 oauth 로 설정되었습니다.
    2
    인증에 사용되는 토큰 발행자의 URI입니다.
    3
    로컬 JWT 검증에 사용되는 JWKS 인증서 끝점의 URI입니다.
    4
    사용자를 식별하는 데 사용되는 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 해당 값은 권한 부여 서버에 따라 다릅니다. 필요한 경우 "['user.info'].['user.id']" 와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.
    5
    (선택 사항) 액세스 토큰과 동일한 기간에 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료될 때까지 남은 시간보다 작으면 클라이언트는 실제 토큰 만료 전에 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되고 클라이언트가 재인증을 시도하지 않으면 세션이 만료되지 않습니다.
    6
    (선택 사항) 권한 부여 서버에 대한 TLS 연결에 대한 신뢰할 수 있는 인증서입니다.
    7
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    8
    JWKS 인증서가 만료되기 전에 유효한 인증서로 간주됩니다. 기본값은 360 초입니다. 더 긴 시간을 지정하면 취소된 인증서에 대한 액세스를 허용할 위험을 고려하십시오.
    9
    JWKS 인증서 새로 고침 간격입니다. 간격은 만료 간격보다 60초 이상 짧아야 합니다. 기본값은 300 초입니다.
    10
    JWKS 공개 키를 새로 고치는 시도 사이의 최소 일시 중지 시간(초)입니다. 알 수 없는 서명 키가 발생하면 JWKS 키 새로 고침이 마지막 새로 고침 시도 이후 지정된 일시 중지를 사용하여 정기적인 스케줄 외부에 예약됩니다. 키를 새로 고치는 것은 지수 백오프 규칙을 따르며 jwksRefreshSeconds 에 도달할 때까지 일시 중지를 늘리면 실패한 새로 고침을 다시 시도합니다. 기본값은 1입니다.

    예 2: 인트로스펙션 끝점을 사용하여 토큰 검증 구성

    - name: external3
      port: 9094
      type: loadbalancer
      tls: true
      authentication:
        type: oauth
        validIssuerUri: https://<auth_server_address>/auth/realms/external
        introspectionEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token/introspect 
    1
    
        clientId: kafka-broker 
    2
    
        clientSecret: 
    3
    
          secretName: my-cluster-oauth
          key: clientSecret
        userNameClaim: preferred_username 
    4
    
        maxSecondsWithoutReauthentication: 3600 
    5

    1
    토큰 인트로스펙션 엔드포인트의 URI입니다.
    2
    클라이언트를 식별하는 클라이언트 ID입니다.
    3
    클라이언트 시크릿 및 클라이언트 ID는 인증에 사용됩니다.
    4
    사용자를 식별하는 데 사용되는 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 해당 값은 권한 부여 서버에 따라 다릅니다. 필요한 경우 "['user.info'].['user.id']" 와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.
    5
    (선택 사항) 액세스 토큰과 동일한 기간에 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료될 때까지 남은 시간보다 작으면 클라이언트는 실제 토큰 만료 전에 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되고 클라이언트가 재인증을 시도하지 않으면 세션이 만료되지 않습니다.

    OAuth 2.0 인증 적용 방법과 권한 부여 서버 유형에 따라 다음을 사용할 수 있는 추가 (선택 사항) 구성 설정이 있습니다.

      # ...
      authentication:
        type: oauth
        # ...
        checkIssuer: false 
    1
    
        checkAudience: true 
    2
    
        fallbackUserNameClaim: client_id 
    3
    
        fallbackUserNamePrefix: client-account- 
    4
    
        validTokenType: bearer 
    5
    
        userInfoEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/userinfo 
    6
    
        enableOauthBearer: false 
    7
    
        enablePlain: true 
    8
    
        tokenEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token 
    9
    
        customClaimCheck: "@.custom == 'custom-value'" 
    10
    
        clientAudience: audience 
    11
    
        clientScope: scope 
    12
    
        connectTimeoutSeconds: 60 
    13
    
        readTimeoutSeconds: 60 
    14
    
        httpRetries: 2 
    15
    
        httpRetryPauseMs: 300 
    16
    
        groupsClaim: "$.groups" 
    17
    
        groupsClaimDelimiter: "," 
    18
    
        includeAcceptHeader: false 
    19
    1
    권한 부여 서버에서 iss 클레임을 제공하지 않으면 발급자 검사를 수행할 수 없습니다. 이 경우 checkIssuerfalse 로 설정하고 유효한IssuerUri 를 지정하지 마십시오. 기본값은 true 입니다.
    2
    권한 부여 서버가 aud (audience) 클레임을 제공하고 대상 검사를 적용하려는 경우 checkAudiencetrue 로 설정합니다. 대상 검사에서는 의도된 토큰 수신자를 식별합니다. 결과적으로 Kafka 브로커는 aud 클레임에 clientId 가 없는 토큰을 거부합니다. 기본값은 false 입니다.
    3
    권한 부여 서버는 일반 사용자와 클라이언트를 모두 식별하는 단일 속성을 제공하지 않을 수 있습니다. 클라이언트가 자체 이름으로 인증하면 서버에서 클라이언트 ID 를 제공할 수 있습니다. 사용자가 사용자 이름과 암호를 사용하여 새로 고침 토큰 또는 액세스 토큰을 가져오는 경우 서버는 클라이언트 ID 외에도 사용자 이름 속성을 제공할 수 있습니다. 기본 사용자 ID 속성을 사용할 수 없는 경우 사용할 사용자 이름 클레임(attribute)을 지정하려면 이 대체 옵션을 사용합니다. 필요한 경우 "['client.info'].['client.id']" 와 같은 JsonPath 표현식을 사용하여 대체 사용자 이름을 검색하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.
    4
    fallbackUserNameClaim 이 적용 가능한 경우 사용자 이름 클레임의 값과 대체 사용자 이름 클레임의 이름 충돌을 방지할 수도 있습니다. producer 라는 클라이언트가 존재하지만 producer 라는 일반 사용자도 존재하는 상황을 고려하십시오. 이 속성을 사용하여 클라이언트의 사용자 ID에 접두사를 추가할 수 있습니다.
    5
    ( introspectionEndpointUri) 사용 중인 권한 부여 서버에 따라 인트로스펙션 엔드 포인트가 토큰 유형 속성을 반환하거나 반환하지 않거나 다른 값을 포함할 수 있습니다. 인트로스펙션 끝점의 응답에 포함되어야 하는 유효한 토큰 유형 값을 지정할 수 있습니다.
    6
    (추천 EndpointUri) 인증 서버가 Introspection Endpoint 응답에서 식별 가능한 정보를 제공하지 않도록 인증 서버를 구성하거나 구현할 수 있습니다. 사용자 ID를 얻으려면 userinfo 끝점의 URI를 폴백으로 구성할 수 있습니다. userNameClaim,fallbackUserNameClaimfallbackUserNamePrefix 설정은 userinfo 끝점 응답에 적용됩니다.
    7
    리스너에서 OAUTHBEARER 메커니즘을 비활성화하려면 이를 false 로 설정합니다. PLAIN 또는 OAUTHBEARER 중 하나 이상을 활성화해야 합니다. 기본값은 true 입니다.
    8
    모든 플랫폼에서 클라이언트에 지원되는 리스너에서 PLAIN 인증을 활성화하려면 true 로 설정합니다.
    9
    PLAIN 메커니즘에 대한 추가 구성입니다. 지정된 경우 클라이언트는 $accessToken: 접두사를 사용하여 암호로 액세스 토큰을 전달하여 PLAIN을 통해 인증할 수 있습니다. 프로덕션의 경우 항상 https:// urls를 사용합니다.
    10
    이를 JsonPath 필터 쿼리로 설정하여 검증 중에 JWT 액세스 토큰에 추가 사용자 지정 규칙을 적용할 수 있습니다. 액세스 토큰에 필요한 데이터가 포함되어 있지 않으면 거부됩니다. introspectionEndpointUri 를 사용하는 경우 사용자 정의 검사가 인트로스펙션 엔드포인트 응답 JSON에 적용됩니다.
    11
    토큰 끝점에 전달된 audience 매개변수입니다. 대상 은broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다. clientIdsecret 을 사용하는 PLAIN 클라이언트 인증의 OAuth 2.0용 클라이언트 이름에도 사용됩니다. 이는 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠에만 영향을 미칩니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다.
    12
    토큰 끝점에 전달된 scope 매개변수입니다. 범위는 broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다. clientIdsecret 을 사용하는 PLAIN 클라이언트 인증의 OAuth 2.0용 클라이언트 이름에도 사용됩니다. 이는 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠에만 영향을 미칩니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다.
    13
    권한 부여 서버에 연결할 때 연결 시간(초)입니다. 기본값은 60입니다.
    14
    권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    15
    권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
    16
    권한 부여 서버에 실패한 HTTP 요청을 다시 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 있으므로 일시 중지가 적용되지 않습니다. 이는 실패한 요청을 유발하는 많은 문제가 요청당 네트워크 결함 또는 프록시 문제로 인해 신속하게 해결할 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하가 발생하거나 트래픽이 많은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 성공적인 재시도 가능성을 높일 수 있습니다.
    17
    JWT 토큰 또는 인트로스펙션 엔드포인트 응답에서 그룹 정보를 추출하는 데 사용되는 JsonPath 쿼리입니다. 이 옵션은 기본적으로 설정되어 있지 않습니다. 이 옵션을 구성하면 사용자 정의 작성자가 사용자 그룹을 기반으로 권한 부여 결정을 내릴 수 있습니다.
    18
    그룹으로 구분된 단일 문자열로 반환될 때 그룹 정보를 구문 분석하는 데 사용되는 구분 기호입니다. 기본값은 ',' (comma)입니다.
    19
    일부 인증 서버는 Accept: application/json 헤더를 보내는 클라이언트에 문제가 있습니다. includeAcceptHeader: false 를 설정하면 헤더가 전송되지 않습니다. 기본값은 true 입니다.
  3. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
  4. 로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w

    롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.

15.4.6.3. OAuth 2.0을 사용하도록 Kafka Java 클라이언트 구성

Kafka 브로커와의 상호 작용에 OAuth 2.0을 사용하도록 Kafka 생산자 및 소비자 API를 구성합니다. 클라이언트 pom.xml 파일에 콜백 플러그인을 추가한 다음 OAuth 2.0에 대해 클라이언트를 구성합니다.

클라이언트 구성에 다음을 지정합니다.

  • SASL(Simple Authentication and Security Layer) 보안 프로토콜:

    • TLS 암호화 연결을 통한 인증을 위한 SASL_SSL
    • 암호화되지 않은 연결을 통한 인증을 위한 SASL_PLAINTEXT

      프로덕션에는 SASL_SSL 을 사용하고 로컬 개발에는 SASL_PLAINTEXT 를 사용하십시오. SASL_SSL 을 사용하는 경우 추가 ssl.truststore 구성이 필요합니다. OAuth 2.0 권한 부여 서버에 대한 보안 연결(https://)을 위해서는 truststore 구성이 필요합니다. OAuth 2.0 권한 부여 서버를 확인하려면 인증 서버의 CA 인증서를 클라이언트 구성의 신뢰 저장소에 추가합니다. PEM 또는 PKCS #12 형식으로 신뢰 저장소를 구성할 수 있습니다.

  • Kafka SASL 메커니즘:

    • 전달자 토큰을 사용하여 인증 정보 교환을 위한 OAUTHBEARER
    • 클라이언트 인증 정보(clientId + 시크릿) 또는 액세스 토큰을 전달하는 PLAIN
  • SASL 메커니즘을 구현하는 JAAS(Java Authentication and Authorization Service) 모듈:

    • org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule 은 OAuthbearer 메커니즘을 구현합니다.
    • org.apache.kafka.common.security.plain.PlainLoginModule 은 일반 메커니즘을 구현합니다.

    OAuthbearer 메커니즘을 사용할 수 있으려면 사용자 정의 io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler 클래스를 콜백 처리기로 추가해야 합니다. JaasClientOauthLoginCallbackHandler 는 클라이언트 로그인 중에 토큰을 액세스하기 위해 권한 부여 서버로의 OAuth 콜백을 처리합니다. 이를 통해 자동 토큰 갱신을 통해 사용자 개입 없이 지속적인 인증을 보장할 수 있습니다. 또한 OAuth 2.0 암호 부여 방법을 사용하여 클라이언트의 로그인 인증 정보를 처리합니다.

  • SASL 인증 속성은 다음 인증 방법을 지원합니다.

    • OAuth 2.0 클라이언트 인증 정보
    • OAuth 2.0 암호 부여(더 이상 사용되지 않음)
    • 액세스 토큰
    • 토큰 새로 고침

    SASL 인증 속성을 JAAS 구성(sasl.jaas.configsasl.login.callback.handler.class)으로 추가합니다. 인증 속성을 구성하는 방법은 OAuth 2.0 권한 부여 서버에 액세스하기 위해 사용 중인 인증 방법에 따라 다릅니다. 이 절차에서 속성은 속성 파일에 지정 된 다음 클라이언트 구성에 로드됩니다.In this procedure, the properties are specified in a properties file, then loaded into the client configuration.

참고

인증 속성을 환경 변수로 지정하거나 Java 시스템 속성으로 지정할 수도 있습니다. Java 시스템 속성의 경우 setProperty 를 사용하여 설정하고 -D 옵션을 사용하여 명령줄에서 전달할 수 있습니다.

사전 요구 사항

  • Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
  • OAuth 2.0 권한 부여 서버가 Kafka 브로커에 대한 OAuth 액세스용으로 배포 및 구성됨
  • Kafka 브로커는 OAuth 2.0으로 구성되어 있습니다.

프로세스

  1. OAuth 2.0 지원이 포함된 클라이언트 라이브러리를 Kafka 클라이언트의 pom.xml 파일에 추가합니다.

    <dependency>
     <groupId>io.strimzi</groupId>
     <artifactId>kafka-oauth-client</artifactId>
     <version>0.15.0.redhat-00007</version>
    </dependency>
  2. 속성 파일에 다음 구성을 지정하여 클라이언트 속성을 구성합니다.

    • 보안 프로토콜
    • SASL 메커니즘
    • 사용 방법에 따른 JAAS 모듈 및 인증 속성

      예를 들어 client.properties 파일에 다음을 추가할 수 있습니다.

      클라이언트 인증 메커니즘 속성

      security.protocol=SASL_SSL 
      1
      
      sasl.mechanism=OAUTHBEARER 
      2
      
      ssl.truststore.location=/tmp/truststore.p12 
      3
      
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \ 
      4
      
        oauth.client.id="<client_id>" \ 
      5
      
        oauth.client.secret="<client_secret>" \ 
      6
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ 
      7
      
        oauth.ssl.truststore.password="$STOREPASS" \ 
      8
      
        oauth.ssl.truststore.type="PKCS12" \ 
      9
      
        oauth.scope="<scope>" \ 
      10
      
        oauth.audience="<audience>" ; 
      11
      
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler

      1
      TLS 암호화 연결을 위한 SASL_SSL 보안 프로토콜. 로컬 개발을 위해 암호화되지 않은 연결보다 SASL_PLAINTEXT 를 사용하십시오.
      2
      OAUTHBEARER 또는 PLAIN 으로 지정된 SASL 메커니즘 .
      3
      Kafka 클러스터에 대한 보안 액세스를 위한 신뢰 저장소 구성입니다.
      4
      권한 부여 서버 토큰 끝점의 URI입니다.
      5
      권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
      6
      권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
      7
      위치에는 권한 부여 서버의 공개 키 인증서(truststore.p12)가 포함되어 있습니다.
      8
      truststore에 액세스하기 위한 암호입니다.
      9
      truststore 유형입니다.
      10
      (선택 사항) 토큰 끝점에서 토큰을 요청하는 범위 입니다. 권한 부여 서버에는 클라이언트가 범위를 지정해야 할 수 있습니다.
      11
      (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다. 권한 부여 서버에는 클라이언트가 대상을 지정해야 할 수 있습니다.

      암호는 메커니즘 속성 부여

      security.protocol=SASL_SSL
      sasl.mechanism=OAUTHBEARER
      ssl.truststore.location=/tmp/truststore.p12
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \
        oauth.client.id="<client_id>" \ 
      1
      
        oauth.client.secret="<client_secret>" \ 
      2
      
        oauth.password.grant.username="<username>" \ 
      3
      
        oauth.password.grant.password="<password>" \ 
      4
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \
        oauth.ssl.truststore.password="$STOREPASS" \
        oauth.ssl.truststore.type="PKCS12" \
        oauth.scope="<scope>" \
        oauth.audience="<audience>" ;
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler

      1
      권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
      2
      (선택 사항) 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
      3
      암호 부여 인증의 사용자 이름입니다. OAuth 암호 부여 구성(사용자 이름 및 암호)은 OAuth 2.0 암호 부여 방법을 사용합니다. 암호 부여를 사용하려면 제한된 권한이 있는 권한 부여 서버에서 클라이언트에 대한 사용자 계정을 만듭니다. 계정은 서비스 계정처럼 작동해야 합니다. 인증에 사용자 계정이 필요하지만 새로 고침 토큰을 사용하는 것이 좋습니다.
      4
      암호 부여 인증입니다.
      참고

      SASL PLAIN은 OAuth 2.0 암호 부여 방법을 사용하여 사용자 이름과 암호(암호 부여)를 전달하는 것을 지원하지 않습니다.

      토큰 속성에 액세스

      security.protocol=SASL_SSL
      sasl.mechanism=OAUTHBEARER
      ssl.truststore.location=/tmp/truststore.p12
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \
        oauth.access.token="<access_token>" \ 
      1
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \
        oauth.ssl.truststore.password="$STOREPASS" \
        oauth.ssl.truststore.type="PKCS12" ;
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler

      1
      Kafka 클라이언트용 장기 액세스 토큰입니다.

      토큰 속성 새로 고침

      security.protocol=SASL_SSL
      sasl.mechanism=OAUTHBEARER
      ssl.truststore.location=/tmp/truststore.p12
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \
        oauth.client.id="<client_id>" \ 
      1
      
        oauth.client.secret="<client_secret>" \ 
      2
      
        oauth.refresh.token="<refresh_token>" \ 
      3
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \
        oauth.ssl.truststore.password="$STOREPASS" \
        oauth.ssl.truststore.type="PKCS12" ;
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler

      1
      권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
      2
      (선택 사항) 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
      3
      Kafka 클라이언트의 장기 새로 고침 토큰입니다.
  3. OAUTH 2.0 인증의 클라이언트 속성을 Java 클라이언트 코드에 입력합니다.

    클라이언트 속성의 입력 표시 예

    Properties props = new Properties();
    try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) {
      props.load(reader);
    }

  4. Kafka 클라이언트가 Kafka 브로커에 액세스할 수 있는지 확인합니다.
15.4.6.4. Kafka 구성 요소에 대한 OAuth 2.0 구성

다음 절차에서는 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 구성 요소를 구성하는 방법을 설명합니다.

다음에 대한 인증을 구성할 수 있습니다.

  • Kafka Connect
  • Kafka MirrorMaker
  • Kafka Bridge

이 시나리오에서는 Kafka 구성 요소와 권한 부여 서버가 동일한 클러스터에서 실행되고 있습니다.

시작하기 전

Kafka 구성 요소에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 KafkaClientAuthenticationOAuth 스키마 참조를 참조하십시오. 스키마 참조에는 구성 옵션의 예가 포함되어 있습니다.

사전 요구 사항

  • Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
  • OAuth 2.0 권한 부여 서버가 Kafka 브로커에 대한 OAuth 액세스용으로 배포 및 구성됨
  • Kafka 브로커는 OAuth 2.0으로 구성되어 있습니다.

프로세스

  1. 클라이언트 시크릿을 생성하고 구성 요소에 환경 변수로 마운트합니다.

    예를 들어, 여기에서 Kafka 브리지의 클라이언트 시크릿 을 생성하고 있습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Secret
    metadata:
     name: my-bridge-oauth
    type: Opaque
    data:
     clientSecret: MGQ1OTRmMzYtZTllZS00MDY2LWI5OGEtMTM5MzM2NjdlZjQw 
    1
    1
    clientSecret 키는 base64 형식이어야 합니다.
  2. 인증 속성에 대해 OAuth 2.0 인증이 구성되도록 Kafka 구성 요소의 리소스를 생성하거나 편집합니다.

    OAuth 2.0 인증의 경우 다음 옵션을 사용할 수 있습니다.

    • 클라이언트 ID 및 시크릿
    • 클라이언트 ID 및 새로 고침 토큰
    • 액세스 토큰
    • 사용자 이름 및 암호
    • TLS

    예를 들어 여기에서 OAuth 2.0은 클라이언트 ID와 시크릿 및 TLS를 사용하여 Kafka 브리지 클라이언트에 할당됩니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaBridge
    metadata:
      name: my-bridge
    spec:
      # ...
      authentication:
        type: oauth 
    1
    
        tokenEndpointUri: https://<auth-server-address>/auth/realms/master/protocol/openid-connect/token 
    2
    
        clientId: kafka-bridge
        clientSecret:
          secretName: my-bridge-oauth
          key: clientSecret
        tlsTrustedCertificates: 
    3
    
        - secretName: oauth-server-cert
          certificate: tls.crt
    1
    oauth 로 설정된 인증 유형입니다.
    2
    인증을 위한 토큰 끝점의 URI입니다.
    3
    권한 부여 서버에 대한 TLS 연결에 대한 신뢰할 수 있는 인증서입니다.

    OAuth 2.0 인증 적용 방법과 권한 부여 서버 유형에 따라 다음을 사용할 수 있는 추가 구성 옵션이 있습니다.

    # ...
    spec:
      # ...
      authentication:
        # ...
        disableTlsHostnameVerification: true 
    1
    
        checkAccessTokenType: false 
    2
    
        accessTokenIsJwt: false 
    3
    
        scope: any 
    4
    
        audience: kafka 
    5
    
        connectTimeoutSeconds: 60 
    6
    
        readTimeoutSeconds: 60 
    7
    
        httpRetries: 2 
    8
    
        httpRetryPauseMs: 300 
    9
    
        includeAcceptHeader: false 
    10
    1
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    2
    권한 부여 서버가 JWT 토큰 내에 typ (type) 클레임을 반환하지 않으면 checkAccessTokenType: false 를 적용하여 토큰 유형 검사를 건너뛸 수 있습니다. 기본값은 true 입니다.
    3
    불투명 토큰을 사용하는 경우 액세스 토큰이 JWT 토큰으로 처리되지 않도록 accessTokenIsJwt: false 를 적용할 수 있습니다.
    4
    (선택 사항) 토큰 끝점에서 토큰을 요청하는 범위 입니다. 권한 부여 서버에는 클라이언트가 범위를 지정해야 할 수 있습니다. 이 경우 모든.
    5
    (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다. 권한 부여 서버에는 클라이언트가 대상을 지정해야 할 수 있습니다. 이 경우 kafka 입니다.
    6
    (선택 사항) 권한 부여 서버에 연결할 때 연결 시간 초과(초)입니다. 기본값은 60입니다.
    7
    (선택 사항) 권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    8
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
    9
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 다시 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 있으므로 일시 중지가 적용되지 않습니다. 이는 실패한 요청을 유발하는 많은 문제가 요청당 네트워크 결함 또는 프록시 문제로 인해 신속하게 해결할 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하가 발생하거나 트래픽이 많은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 성공적인 재시도 가능성을 높일 수 있습니다.
    10
    (선택 사항) 일부 인증 서버는 Accept: application/json 헤더를 보내는 클라이언트에 문제가 있습니다. includeAcceptHeader: false 를 설정하면 헤더가 전송되지 않습니다. 기본값은 true 입니다.
  3. Kafka 리소스의 배포에 변경 사항을 적용합니다.

    oc apply -f your-file
  4. 로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w

    롤링 업데이트는 OAuth 2.0 인증을 사용하여 Kafka 브로커와 상호 작용하기 위한 구성 요소를 구성합니다.

15.5. OAuth 2.0 토큰 기반 권한 부여 사용

토큰 기반 인증에 Red Hat Single Sign-On과 함께 OAuth 2.0을 사용하는 경우 Red Hat Single Sign-On을 사용하여 Kafka 브로커에 대한 클라이언트 액세스를 제한하도록 권한 부여 규칙을 구성할 수도 있습니다. 인증은 사용자의 ID를 설정합니다. 권한 부여는 해당 사용자의 액세스 수준을 결정합니다.

Apache Kafka의 스트림은 Red Hat Single Sign-On 인증 서비스를 통해 OAuth 2.0 토큰 기반 권한 사용을 지원하므로 보안 정책과 권한을 중앙에서 관리할 수 있습니다.

Red Hat Single Sign-On에 정의된 보안 정책 및 권한은 Kafka 브로커의 리소스에 대한 액세스 권한을 부여하는 데 사용됩니다. 사용자와 클라이언트는 Kafka 브로커에서 특정 작업을 수행하기 위해 액세스를 허용하는 정책과 일치합니다.

Kafka는 기본적으로 모든 사용자에게 브로커에 대한 전체 액세스를 허용하며 AclAuthorizerStandardAuthorizer 플러그인도 제공하여 ACL(Access Control Lists)을 기반으로 권한 부여를 구성합니다. 이러한 플러그인에서 관리하는 ACL 규칙은 사용자 이름을 기반으로 리소스에 대한 액세스 권한을 부여하거나 거부하는 데 사용되며 이러한 규칙은 Kafka 클러스터 자체에 저장됩니다. 그러나 Red Hat Single Sign-On을 사용한 OAuth 2.0 토큰 기반 권한 부여는 Kafka 브로커에 대한 액세스 제어를 구현하는 방법에 대한 유연성을 훨씬 높여 줍니다. 또한 OAuth 2.0 권한 부여 및 ACL을 사용하도록 Kafka 브로커를 구성할 수 있습니다.

15.5.1. OAuth 2.0 인증 메커니즘

Apache Kafka용 스트림의 OAuth 2.0 인증에서는 Red Hat Single Sign-On 서버 권한 부여 REST 끝점을 사용하여 특정 사용자에게 정의된 보안 정책을 적용하고 해당 사용자의 다른 리소스에 부여된 권한 목록을 제공하여 Red Hat Single Sign-On을 사용하여 토큰 기반 인증을 확장합니다. 정책은 역할과 그룹을 사용하여 사용자와 권한을 일치시킵니다. OAuth 2.0 권한 부여는 Red Hat Single Sign-On 인증 서비스에서 사용자에 대한 수신된 권한 목록을 기반으로 권한을 로컬로 적용합니다.

15.5.1.1. Kafka 브로커 사용자 정의 승인

Red Hat Single Sign-On 승인자 (KeycloakAuthorizer)는 Apache Kafka용 Streams와 함께 제공됩니다. Red Hat Single Sign-On에서 제공하는 권한 부여 서비스에 Red Hat Single Sign-On REST 엔드포인트를 사용하려면 Kafka 브로커에서 사용자 지정 승인자를 구성합니다.

인증자는 필요에 따라 권한 부여 서버에서 부여된 권한 목록을 가져와서 Kafka 브로커에 로컬로 권한 부여를 적용하여 각 클라이언트 요청에 대해 신속하게 권한 부여 결정을 내립니다.

15.5.2. OAuth 2.0 권한 부여 지원 구성

다음 절차에서는 Red Hat Single Sign-On 인증 서비스를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 브로커를 구성하는 방법을 설명합니다.

사전 준비 사항

필요한 액세스 또는 특정 사용자에 대해 제한하려는 경우를 고려하십시오. Red Hat Single Sign-On 그룹,역할,클라이언트사용자를 결합하여 Red Hat Single Sign-On에서 액세스를 구성할 수 있습니다.

일반적으로 그룹은 조직 부서 또는 지리적 위치를 기반으로 사용자와 일치시키는 데 사용됩니다. 및 역할은 해당 기능을 기반으로 사용자와 일치시키는 데 사용됩니다.

Red Hat Single Sign-On을 사용하면 사용자와 그룹을 LDAP에 저장할 수 있지만 클라이언트와 역할은 이러한 방식으로 저장할 수 없습니다. 사용자 데이터에 대한 스토리지 및 액세스는 권한 부여 정책 구성 방법의 요소가 될 수 있습니다.

참고

Super 사용자는 Kafka 브로커에서 구현된 권한 부여에 관계없이 항상 Kafka 브로커에 대한 무제한 액세스 권한을 갖습니다.

사전 요구 사항

  • Apache Kafka용 스트림은 토큰 기반 인증에 Red Hat Single Sign-On과 함께 OAuth 2.0을 사용하도록 구성해야 합니다. 권한 부여를 설정할 때 동일한 Red Hat Single Sign-On 서버 끝점을 사용합니다.
  • 재인증을 활성화하려면 maxSecondsWithoutReauthentication 옵션을 사용하여 OAuth 2.0 인증을 구성해야 합니다.

프로세스

  1. Red Hat Single Sign-On 관리 콘솔에 액세스하거나 Red Hat Single Sign-On 관리 CLI를 사용하여 OAuth 2.0 인증을 설정할 때 생성한 Kafka 브로커 클라이언트에 대한 인증 서비스를 활성화합니다.
  2. 인증 서비스를 사용하여 클라이언트에 대한 리소스, 권한 부여 범위, 정책 및 권한을 정의합니다.
  3. 역할 및 그룹을 할당하여 사용자 및 클라이언트에 권한을 바인딩합니다.
  4. 편집기에서 Kafka 리소스의 Kafka 브로커 구성(Kafka.spec.kafka)을 업데이트하여 Red Hat Single Sign-On 권한을 사용하도록 Kafka 브로커를 구성합니다.

    oc edit kafka my-cluster
  5. keycloak 인증을 사용하고 권한 부여 서버 및 권한 부여 서비스에 액세스할 수 있도록 Kafka 브로커 kafka 구성을 구성합니다.

    예를 들면 다음과 같습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        authorization:
          type: keycloak 
    1
    
          tokenEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/token> 
    2
    
          clientId: kafka 
    3
    
          delegateToKafkaAcls: false 
    4
    
          disableTlsHostnameVerification: false 
    5
    
          superUsers: 
    6
    
          - CN=fred
          - sam
          - CN=edward
          tlsTrustedCertificates: 
    7
    
          - secretName: oauth-server-cert
            certificate: ca.crt
          grantsRefreshPeriodSeconds: 60 
    8
    
          grantsRefreshPoolSize: 5 
    9
    
          grantsMaxIdleSeconds: 300 
    10
    
          grantsGcPeriodSeconds: 300 
    11
    
          grantsAlwaysLatest: false 
    12
    
          connectTimeoutSeconds: 60 
    13
    
          readTimeoutSeconds: 60 
    14
    
          httpRetries: 2 
    15
    
          enableMetrics: false 
    16
    
          includeAcceptHeader: false 
    17
    
        #...
    1
    유형 keycloak 에서는 Red Hat Single Sign-On 권한 부여를 활성화합니다.
    2
    Red Hat Single Sign-On 토큰 끝점의 URI입니다. 프로덕션의 경우 항상 https:// urls를 사용합니다. 토큰 기반 oauth 인증을 구성할 때 로컬 JWT 검증을 위한 URI로 jwksEndpointUri 를 지정합니다. tokenEndpointUri URI의 호스트 이름은 동일해야 합니다.
    3
    권한 부여 서비스가 활성화된 Red Hat Single Sign-On의 OAuth 2.0 클라이언트 정의의 클라이언트 ID입니다. 일반적으로 kafka 는 ID로 사용됩니다.
    4
    (선택 사항) Red Hat Single Sign-On 권한 부여 정책에서 액세스가 거부되는 경우 Kafka AclAuthorizerStandardAuthorizer 에 대한 권한을 위임합니다. 기본값은 false 입니다.
    5
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    6
    (선택 사항) 슈퍼유저 지정.
    7
    (선택 사항) 권한 부여 서버에 대한 TLS 연결에 대한 신뢰할 수 있는 인증서입니다.
    8
    (선택 사항) 두 개의 연속 부여 새로 고침 실행 사이의 시간입니다. 이는 Red Hat Single Sign-On에서 사용자의 권한 변경을 감지할 수 있는 활성 세션의 최대 시간입니다. 기본값은 60입니다.
    9
    (선택 사항) 활성 세션에 대한 권한 부여를 새로 고치는 데 사용할 스레드 수입니다. 기본값은 5입니다.
    10
    (선택 사항) 캐시의 유휴 부여를 제거할 수 있는 시간(초)입니다. 기본값은 300입니다.
    11
    (선택 사항) 캐시에서 오래된 권한을 정리하는 작업의 연속 실행 사이의 시간(초)입니다. 기본값은 300입니다.
    12
    (선택 사항) 새 세션에 대한 최신 권한을 가져올지 여부를 제어합니다. 활성화하면 Red Hat Single Sign-On에서 권한을 검색하고 사용자에게 캐시됩니다. 기본값은 false입니다.
    13
    (선택 사항) Red Hat Single Sign-On 토큰 끝점에 연결할 때 연결 시간(초)입니다. 기본값은 60입니다.
    14
    (선택 사항) Red Hat Single Sign-On 토큰 끝점에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    15
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 일시 중지하지 않고 재시도할 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
    16
    (선택 사항) OAuth 메트릭을 활성화하거나 비활성화합니다. 기본값은 false입니다.
    17
    (선택 사항) 일부 인증 서버는 Accept: application/json 헤더를 보내는 클라이언트에 문제가 있습니다. includeAcceptHeader: false 를 설정하면 헤더가 전송되지 않습니다. 기본값은 true 입니다.
  6. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
  7. 로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f ${POD_NAME} -c kafka
    oc get pod -w

    롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.

  8. Kafka 브로커에 특정 역할이 있는 클라이언트 또는 사용자로 액세스하여 구성된 권한에 액세스하고 필요한 액세스 권한이 있는지 또는 권한이 없는지 확인합니다.

15.5.3. Red Hat Single Sign-On 인증 서비스에서 정책 및 권한 관리

이 섹션에서는 Red Hat Single Sign-On 인증 서비스 및 Kafka에서 사용하는 권한 부여 모델에 대해 설명하고 각 모델에서 중요한 개념을 정의합니다.

Kafka 액세스 권한을 부여하려면 Red Hat Single Sign-On에서 OAuth 클라이언트 사양 을 생성하여 Red Hat Single Sign-On 인증 서비스 오브젝트를 Kafka 리소스에 매핑할 수 있습니다. Kafka 권한은 Red Hat Single Sign-On 인증 서비스 규칙을 사용하여 사용자 계정 또는 서비스 계정에 부여됩니다.

주제 생성 및 나열과 같이 일반적인 Kafka 작업에 필요한 다양한 사용자 권한의 는 다음과 같습니다.

15.5.3.1. Kafka 및 Red Hat Single Sign-On 권한 부여 모델 개요

Kafka 및 Red Hat Single Sign-On 인증 서비스는 다른 권한 부여 모델을 사용합니다.

Kafka 인증 모델

Kafka의 권한 부여 모델에서는 리소스 유형을 사용합니다. Kafka 클라이언트가 브로커에서 작업을 수행할 때 브로커는 구성된 KeycloakAuthorizer 를 사용하여 작업 및 리소스 유형에 따라 클라이언트의 권한을 확인합니다.

Kafka는 5가지 리소스 유형을 사용하여 액세스 권한을 제어합니다. Topic,Group,Cluster,TransactionalId, DelegationToken. 각 리소스 유형에는 사용 가능한 권한 세트가 있습니다.

주제

  • 개발
  • 쓰기
  • 읽기
  • delete
  • describe
  • DescribeConfigs
  • 변경
  • AlterConfigs

그룹

  • 읽기
  • describe
  • delete

Cluster

  • 개발
  • describe
  • 변경
  • DescribeConfigs
  • AlterConfigs
  • IdempotentWrite
  • ClusterAction

TransactionalId

  • describe
  • 쓰기

DelegationToken

  • describe
Red Hat Single Sign-On 인증 서비스 모델

Red Hat Single Sign-On 인증 서비스 모델에는 리소스, 권한 부여범위,정책권한 의 정의 및 부여를 위한 네 가지 개념이 있습니다.

Resources
리소스는 허용된 작업과 리소스를 일치시키는 데 사용되는 리소스 정의 집합입니다. 리소스는 개별 주제일 수 있습니다(예: 동일한 접두사로 시작하는 이름이 있는 모든 주제). 리소스 정의는 사용 가능한 모든 작업 세트를 나타내는 사용 가능한 권한 부여 범위 세트와 연결됩니다. 이러한 작업의 하위 집합만 실제로 허용됩니다.
권한 부여 범위
권한 부여 범위는 특정 리소스 정의에서 사용 가능한 모든 작업 세트입니다. 새 리소스를 정의할 때 모든 범위 집합에서 범위를 추가합니다.
Policies

정책은 계정 목록과 일치하도록 기준을 사용하는 권한 부여 규칙입니다. 정책은 다음과 일치할 수 있습니다.

  • 클라이언트 ID 또는 역할을 기반으로 하는 서비스 계정
  • 사용자 이름, 그룹 또는 역할을 기반으로 하는 사용자 계정 입니다.
권한
권한은 특정 리소스 정의의 권한 부여 범위 하위 집합을 사용자 집합에 부여합니다.

Kafka 권한 부여 모델은 Kafka에 대한 액세스를 제어하는 Red Hat Single Sign-On 역할 및 리소스를 정의하는 데 기반으로 사용됩니다.

사용자 계정 또는 서비스 계정에 Kafka 권한을 부여하려면 먼저 Kafka 브로커의 Red Hat Single Sign-On에서 OAuth 클라이언트 사양 을 생성합니다. 그런 다음 클라이언트에서 Red Hat Single Sign-On 권한 부여 서비스를 지정합니다. 일반적으로 브로커를 나타내는 OAuth 클라이언트의 클라이언트 ID는 kafka 입니다. Apache Kafka용 Streams와 함께 제공되는 구성 파일의 예kafka 를 OAuth 클라이언트 ID로 사용합니다.

참고

Kafka 클러스터가 여러 개인 경우 모두 단일 OAuth 클라이언트(kafka)를 사용할 수 있습니다. 그러면 권한 부여 규칙을 정의하고 관리할 수 있는 단일 통합 공간이 제공됩니다. 그러나 다른 OAuth 클라이언트 ID(예: my-cluster-kafka 또는 cluster-dev-kafka)를 사용하고 각 클라이언트 구성 내에서 각 클러스터에 대한 권한 부여 규칙을 정의할 수도 있습니다.

kafka 클라이언트 정의에는 Red Hat Single Sign-On 관리 콘솔에서 Authorization Enabled 옵션이 활성화되어 있어야 합니다.

모든 권한은 kafka 클라이언트 범위 내에 있습니다. 다른 OAuth 클라이언트 ID로 구성된 Kafka 클러스터가 있는 경우 각각 동일한 Red Hat Single Sign-On 영역의 일부인 경우에도 별도의 권한 세트가 필요합니다.

Kafka 클라이언트가 OAUTHBEARER 인증을 사용하는 경우 Red Hat Single Sign-On 승인자(KeycloakAuthorizer)는 현재 세션의 액세스 토큰을 사용하여 Red Hat Single Sign-On 서버에서 권한 부여 목록을 검색합니다. 권한을 검색하기 위해 인증자는 Red Hat Single Sign-On 인증 서비스 정책 및 권한을 평가합니다.

Kafka 권한에 대한 권한 부여 범위

초기 Red Hat Single Sign-On 구성은 일반적으로 권한 부여 범위를 업로드하여 각 Kafka 리소스 유형에서 수행할 수 있는 모든 가능한 작업 목록을 생성합니다. 이 단계는 권한을 정의하기 전에 한 번만 수행됩니다. 권한 부여 범위를 업로드하는 대신 수동으로 추가할 수 있습니다.

권한 부여 범위에는 리소스 유형에 관계없이 사용 가능한 모든 Kafka 권한이 포함되어야 합니다.

  • 개발
  • 쓰기
  • 읽기
  • delete
  • describe
  • 변경
  • DescribeConfig
  • AlterConfig
  • ClusterAction
  • IdempotentWrite
참고

권한(예: IdempotentWrite)이 필요하지 않은 경우 권한 부여 범위 목록에서 생략할 수 있습니다. 그러나 해당 권한은 Kafka 리소스에서 대상으로 지정할 수 없습니다.

권한 검사에 대한 리소스 패턴

리소스 패턴은 권한 검사를 수행할 때 대상 리소스와 일치하는 패턴에 사용됩니다. 일반적인 패턴 형식은 RESOURCE-TYPE:PATTERN-NAME 입니다.

리소스 유형은 Kafka 권한 부여 모델을 미러링합니다. 이 패턴은 두 가지 일치 옵션을 허용합니다.

  • 정확한 일치(패턴이 *로 끝나지 않는 경우)
  • 접두사 일치(패턴이 *로 종료되면 )

리소스에 대한 패턴 예

Topic:my-topic
Topic:orders-*
Group:orders-*
Cluster:*

또한 일반 패턴 형식 접두사는 kafka-cluster:CLUSTER-NAME 뒤에 쉼표를 사용할 수 있습니다. 여기서 CLUSTER-NAME 은 Kafka 사용자 정의 리소스의 metadata.name 을 나타냅니다.

클러스터 접두사가 있는 리소스의 패턴 예

kafka-cluster:my-cluster,Topic:*
kafka-cluster:*,Group:b_*

kafka-cluster 접두사가 없는 경우 kafka-cluster:* 로 간주됩니다.

리소스를 정의할 때 리소스와 관련된 가능한 권한 부여 범위 목록과 연결할 수 있습니다. 대상 리소스 유형에 적합한 작업을 설정합니다.

모든 리소스에 권한 부여 범위를 추가할 수 있지만 리소스 유형에서 지원하는 범위만 액세스 제어로 간주됩니다.

액세스 권한 적용을 위한 정책

정책은 하나 이상의 사용자 계정 또는 서비스 계정에 대한 권한을 대상으로 하는 데 사용됩니다. 대상 지정은 다음을 참조할 수 있습니다.

  • 특정 사용자 또는 서비스 계정
  • 영역 역할 또는 클라이언트 역할
  • 사용자 그룹
  • 클라이언트 IP 주소와 일치하는 JavaScript 규칙

정책에는 고유한 이름이 지정되며 여러 리소스에 대한 여러 권한을 대상으로 하는 데 재사용할 수 있습니다.

액세스 권한 부여

세분화된 권한을 사용하여 사용자에게 액세스 권한을 부여하는 정책, 리소스 및 권한 부여 범위를 함께 가져옵니다.

각 권한의 이름은 사용자에게 부여하는 권한을 명확하게 정의해야 합니다. 예를 들어 Dev Team B는 x 로 시작하는 주제에서 읽을 수 있습니다.

15.5.3.3. Kafka 작업에 필요한 권한 예

다음 예제에서는 Kafka에서 일반적인 작업을 수행하는 데 필요한 사용자 권한을 보여줍니다.

주제 생성

주제를 만들려면 특정 주제 또는 Cluster:kafka-cluster 에 대한 Create 권한이 필요합니다.

bin/kafka-topics.sh --create --topic my-topic \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

주제 목록

사용자에게 지정된 항목에 대한 설명 권한이 있는 경우 항목이 나열됩니다.

bin/kafka-topics.sh --list \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

주제 세부 정보 표시

주제의 세부 정보를 표시하려면 주제에 대해 설명하고 DescribeConfigs 권한이 필요합니다.

bin/kafka-topics.sh --describe --topic my-topic \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

항목에 메시지 생성

항목에 대한 메시지를 생성하려면 항목에 대해 설명쓰기 권한이 필요합니다.

주제가 아직 생성되지 않았으며 자동 생성 항목이 활성화되어 있는 경우 주제를 만들 수 있는 권한이 필요합니다.

bin/kafka-console-producer.sh  --topic my-topic \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties

주제의 메시지 사용

주제의 메시지를 사용하려면 주제에서 설명읽기 권한이 필요합니다. 주제에서 사용하는 것은 일반적으로 소비자 그룹에 소비자 오프셋을 저장하는 데 의존하며, 소비자 그룹에 대한 추가 설명읽기 권한이 필요합니다.

일치하려면 두 개의 리소스가 필요합니다. 예를 들면 다음과 같습니다.

Topic:my-topic
Group:my-group-*
bin/kafka-console-consumer.sh --topic my-topic --group my-group-1 --from-beginning \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --consumer.config /tmp/config.properties

idempotent 생산자를 사용하여 주제로 메시지 생성

주제를 생성하는 권한뿐만 아니라 Cluster:kafka-cluster 리소스에 추가 IdempotentWrite 권한이 필요합니다.

일치하려면 두 개의 리소스가 필요합니다. 예를 들면 다음과 같습니다.

Topic:my-topic
Cluster:kafka-cluster
bin/kafka-console-producer.sh  --topic my-topic \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties --producer-property enable.idempotence=true --request-required-acks -1

소비자 그룹 나열

소비자 그룹을 나열할 때 사용자에게 권한이 있는 그룹 만 반환됩니다. 또는 사용자에게 Cluster:kafka-cluster 에 대한 Describe 권한이 있는 경우 모든 소비자 그룹이 반환됩니다.

bin/kafka-consumer-groups.sh --list \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

소비자 그룹 세부 정보 표시

소비자 그룹의 세부 정보를 표시하려면 그룹 및 그룹과 연결된 항목에 대한 설명이 필요합니다.

bin/kafka-consumer-groups.sh --describe --group my-group-1 \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

주제 구성 변경

주제의 구성을 변경하려면 설명 대체 권한이 필요합니다.

bin/kafka-topics.sh --alter --topic my-topic --partitions 2 \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

Kafka 브로커 구성 표시

kafka-configs.sh 를 사용하여 브로커의 구성을 가져오려면 Cluster:kafka-clusterDescribeConfigs 권한이 필요합니다.

bin/kafka-configs.sh --entity-type brokers --entity-name 0 --describe --all \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

Kafka 브로커 구성 변경

Kafka 브로커 구성을 변경하려면 Cluster:kafka-clusterDescribeConfigAlterConfigs 권한이 필요합니다.

bin/kafka-configs --entity-type brokers --entity-name 0 --alter --add-config log.cleaner.threads=2 \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

주제 삭제

주제를 삭제하려면 설명삭제 권한이 해당 항목에 필요합니다.

bin/kafka-topics.sh --delete --topic my-topic \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

지도 파티션 선택

주제 파티션에 대해 리더 선택을 실행하려면 Cluster:kafka-clusterAlter 권한이 필요합니다.

bin/kafka-leader-election.sh --topic my-topic --partition 0 --election-type PREFERRED  /
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --admin.config /tmp/config.properties

파티션 재할당

파티션 재할당 파일을 생성하려면 관련 항목에 대한 권한이 필요합니다.

bin/kafka-reassign-partitions.sh --topics-to-move-json-file /tmp/topics-to-move.json --broker-list "0,1" --generate \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties > /tmp/partition-reassignment.json

파티션 재할당을 실행하려면 Cluster:kafka-cluster대해 설명합니다. 또한 관련 항목에 대한 사용 권한이 필요합니다. Describe permissions are required on the topics involved.

bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --execute \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties

파티션 재할당을 확인하려면 Cluster:kafka-cluster 및 관련된 각 항목에 대해 파티션 재할당, AlterConfigs 권한이 필요합니다.

bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --verify \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties

15.5.4. Red Hat Single Sign-On 인증 서비스 사용

이 예에서는 Red Hat Single Sign-On 인증 서비스와 keycloak 권한을 사용하는 방법을 설명합니다. Red Hat Single Sign-On 권한 부여 서비스를 사용하여 Kafka 클라이언트에 대한 액세스 제한을 적용합니다. Red Hat Single Sign-On 인증 서비스는 권한 부여 범위, 정책 및 권한을 사용하여 리소스에 액세스 제어를 정의하고 적용합니다.

Red Hat Single Sign-On 권한 부여 서비스 REST 끝점은 인증된 사용자를 위한 리소스에 대한 권한 부여 목록을 제공합니다. 권한 부여 목록은 Kafka 클라이언트가 인증된 세션을 설정한 후 첫 번째 작업으로 Red Hat Single Sign-On 서버에서 가져옵니다. 해당 권한 부여에 대한 변경 사항이 감지되도록 백그라운드에서 목록이 새로 고쳐집니다. 부여는 각 사용자 세션에 대해 Kafka 브로커에 로컬로 캐시되고 적용되어 빠른 권한 부여 결정을 제공합니다.

Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 여기에는 Red Hat Single Sign-On을 설정하기 위한 다음 예제 파일이 포함됩니다.

kafka-ephemeral-oauth-single-keycloak-authz.yaml
Red Hat Single Sign-On을 사용하여 OAuth 2.0 토큰 기반 권한 부여용으로 구성된 Kafka 사용자 정의 리소스의 예입니다. 사용자 정의 리소스를 사용하여 keycloak 권한 부여 및 토큰 기반 oauth 인증을 사용하는 Kafka 클러스터를 배포할 수 있습니다.
kafka-authz-realm.json
샘플 그룹, 사용자, 역할 및 클라이언트로 구성된 Red Hat Single Sign-On 영역의 예입니다. 이 영역을 Red Hat Single Sign-On 인스턴스로 가져와 Kafka에 액세스할 수 있는 세분화된 권한을 설정할 수 있습니다.

Red Hat Single Sign-On에서 예제를 시도하려면 이러한 파일을 사용하여 표시된 순서대로 이 섹션에 설명된 작업을 수행합니다.

인증

토큰 기반 oauth 인증을 구성할 때 로컬 JWT 검증을 위한 URI로 jwksEndpointUri 를 지정합니다. keycloak 권한을 구성할 때 tokenEndpointUri 를 Red Hat Single Sign-On 토큰 끝점의 URI로 지정합니다. 두 URI의 호스트 이름은 동일해야 합니다.

그룹 또는 역할 정책을 사용하여 대상 권한

Red Hat Single Sign-On에서 서비스 계정이 활성화된 기밀 클라이언트는 클라이언트 ID와 시크릿을 사용하여 자체 이름으로 서버에 인증할 수 있습니다. 이는 일반적으로 특정 사용자의 에이전트(예: 웹 사이트)가 아닌 자체 이름으로 작동하는 마이크로 서비스에 편리합니다. 서비스 계정에는 일반 사용자와 같이 할당된 역할이 있을 수 있습니다. 그러나 그룹에는 할당될 수 없습니다. 결과적으로 서비스 계정을 사용하여 마이크로 서비스에 대한 권한을 대상으로 지정하려면 그룹 정책을 사용할 수 없으며 대신 역할 정책을 사용해야 합니다. 반대로 사용자 이름과 암호를 사용한 인증이 필요한 일반 사용자 계정으로만 특정 권한을 제한하려면 역할 정책이 아닌 그룹 정책을 사용하는 부작용으로 이를 수행할 수 있습니다. 이 예제에서는 ClusterManager 로 시작하는 권한에 사용됩니다. 클러스터 관리 수행은 일반적으로 CLI 툴을 사용하여 대화식으로 수행됩니다. 결과 액세스 토큰을 사용하여 Kafka 브로커에 인증하기 전에 사용자가 로그인해야 합니다. 이 경우 액세스 토큰은 클라이언트 애플리케이션이 아닌 특정 사용자를 나타냅니다.

15.5.4.1. Red Hat Single Sign-On 관리 콘솔에 액세스

Red Hat Single Sign-On을 설정한 다음 관리 콘솔에 연결하고 사전 구성된 영역을 추가합니다. 예제 kafka-authz-realm.json 파일을 사용하여 영역을 가져옵니다. Admin Console에서 영역에 대해 정의된 권한 부여 규칙을 확인할 수 있습니다. 이 규칙은 예제 Red Hat Single Sign-On 영역을 사용하도록 구성된 Kafka 클러스터의 리소스에 대한 액세스 권한을 부여합니다.

사전 요구 사항

  • 실행 중인 OpenShift 클러스터입니다.
  • 사전 구성된 영역이 포함된 Apache Kafka 예제/security/keycloak-authorization/kafka-authz-realm.json 파일의 Streams입니다.

프로세스

  1. Red Hat Single Sign-On 설명서의 서버 설치 및 구성에 설명된 대로 Red Hat Single Sign-On Operator를 사용하여 Red Hat Single Sign-On 서버 를 설치합니다.
  2. Red Hat Single Sign-On 인스턴스가 실행될 때까지 기다립니다.
  3. 관리 콘솔에 액세스할 수 있도록 외부 호스트 이름을 가져옵니다.

    NS=sso
    oc get ingress keycloak -n $NS

    이 예에서는 Red Hat Single Sign-On 서버가 sso 네임스페이스에서 실행되고 있다고 가정합니다.

  4. admin 사용자의 암호를 가져옵니다.

    oc get -n $NS pod keycloak-0 -o yaml | less

    암호는 시크릿으로 저장되므로 Red Hat Single Sign-On 인스턴스에 대한 구성 YAML 파일을 가져와 시크릿 이름을 확인합니다(secretKeyRef.name).

  5. 시크릿 이름을 사용하여 일반 텍스트 암호를 가져옵니다.

    SECRET_NAME=credential-keycloak
    oc get -n $NS secret $SECRET_NAME -o yaml | grep PASSWORD | awk '{print $2}' | base64 -D

    이 예에서는 시크릿 이름이 credential-keycloak 이라고 가정합니다.

  6. 사용자 이름 admin 및 가져온 암호를 사용하여 관리 콘솔에 로그인합니다.

    https://HOSTNAME 을 사용하여 Kubernetes Ingress 에 액세스합니다.

    이제 관리 콘솔을 사용하여 Red Hat Single Sign-On에 예제 영역을 업로드할 수 있습니다.

  7. Add Cryostat 를 클릭하여 예제 영역을 가져옵니다.
  8. examples/security/keycloak-authorization/kafka-authz-realm.json 파일을 추가한 다음 만들기 를 클릭합니다.

    이제 관리 콘솔에서 현재 영역으로 kafka-authz 가 있습니다.

    기본 보기에 마스터 영역이 표시됩니다.

  9. Red Hat Single Sign-On 관리 콘솔에서 클라이언트 > kafka > 인증 > 설정으로 이동하여 의사 결정 전략이 유효한 것으로 설정되어 있는지 확인합니다.

    확인 정책은 클라이언트가 Kafka 클러스터에 액세스하려면 하나 이상의 정책을 충족해야 함을 의미합니다.

  10. Red Hat Single Sign-On 관리 콘솔에서 그룹,사용자,역할클라이언트로 이동하여 영역 구성을 확인합니다.

    그룹
    그룹은 사용자 그룹을 생성하고 사용자 권한을 설정하는 데 사용됩니다. 그룹은 이름이 할당된 사용자 집합입니다. 사용자를 지리적, 조직 또는 부서 단위로 구분하는 데 사용됩니다. 그룹을 LDAP ID 공급자에 연결할 수 있습니다. 예를 들어 Kafka 리소스에 대한 권한을 부여하기 위해 사용자 지정 LDAP 서버 admin 사용자 인터페이스를 통해 사용자에게 그룹의 멤버를 만들 수 있습니다.
    사용자
    사용자는 사용자를 생성하는 데 사용됩니다. 이 예제에서는 alicebob 이 정의됩니다. AliceClusterManager 그룹의 멤버이며 bobClusterManager-my-cluster 그룹의 멤버입니다. 사용자는 LDAP ID 공급자에 저장할 수 있습니다.
    역할
    역할은 사용자 또는 클라이언트가 특정 권한이 있는 것으로 표시합니다. 역할은 그룹과 유사한 개념입니다. 일반적으로 사용자를 조직 역할로 태그 하고 필수 권한이 있는 데 사용됩니다. 역할은 LDAP ID 공급자에 저장할 수 없습니다. LDAP가 요구 사항인 경우 대신 그룹을 사용하고 Red Hat Single Sign-On 역할을 그룹에 추가하여 사용자가 그룹에 할당되면 해당 역할도 가져올 수 있습니다.
    클라이언트

    클라이언트에 는 특정 구성이 있을 수 있습니다. 이 예제에서는 kafka , kafka -cli,team-a-client, team-b-client 클라이언트가 구성됩니다.

    • kafka 클라이언트는 Kafka 브로커가 액세스 토큰 검증에 필요한 OAuth 2.0 통신을 수행하는 데 사용됩니다. 이 클라이언트에는 Kafka 브로커에서 권한 부여를 수행하는 데 사용되는 권한 부여 서비스 리소스 정의, 정책 및 권한 부여 범위도 포함되어 있습니다. 권한 부여 구성은 권한 부여 탭의 kafka 클라이언트에 정의되어 있으며, 설정 탭에서 인증 활성화 가 켜지면 표시됩니다.
    • kafka-cli 클라이언트는 액세스 토큰 또는 새로 고침 토큰을 가져오기 위해 사용자 이름 및 암호로 인증할 때 Kafka 명령줄 툴에서 사용하는 공용 클라이언트입니다.
    • team-a-clientteam-b-client 클라이언트는 특정 Kafka 주제에 대한 부분적인 액세스 권한이 있는 서비스를 나타내는 기밀 클라이언트입니다.
  11. Red Hat Single Sign-On 관리 콘솔에서 Authorization > Permissions 로 이동하여 영역에 정의된 리소스 및 정책을 사용하는 권한이 부여된 권한을 확인합니다.

    예를 들어 kafka 클라이언트에는 다음과 같은 권한이 있습니다.

    Dev Team A can write to topics that start with x_ on any cluster
    Dev Team B can read from topics that start with x_ on any cluster
    Dev Team B can update consumer group offsets that start with x_ on any cluster
    ClusterManager of my-cluster Group has full access to cluster config on my-cluster
    ClusterManager of my-cluster Group has full access to consumer groups on my-cluster
    ClusterManager of my-cluster Group has full access to topics on my-cluster
    Dev 팀 A
    Dev 팀 A 영역 역할은 모든 클러스터에서 x_ 로 시작하는 항목에 쓸 수 있습니다. 그러면 Topic:x_*, 범위 설명쓰기Dev 팀 A 정책이라는 리소스가 결합됩니다. Dev 팀 A 정책은 Dev 팀 A 라는 realm 역할이 있는 모든 사용자와 일치합니다.
    Dev 팀 B
    Dev 팀 B 영역 역할은 모든 클러스터에서 x_ 로 시작하는 주제에서 읽을 수 있습니다. 주제:x_*, Group:x_* 리소스, 설명읽기 범위, Dev 팀 B 정책이 결합됩니다. Dev 팀 B 정책은 Dev 팀 B 라는 realm 역할이 있는 모든 사용자와 일치합니다. 일치 사용자 및 클라이언트는 주제에서 읽고 x_ 로 시작하는 이름이 있는 주제 및 소비자 그룹에 대해 소비된 오프셋을 업데이트할 수 있습니다.
15.5.4.2. Red Hat Single Sign-On 권한 부여를 사용하여 Kafka 클러스터 배포

Red Hat Single Sign-On 서버에 연결하도록 구성된 Kafka 클러스터를 배포합니다. 예제 kafka-ephemeral-oauth-single-keycloak-authz.yaml 파일을 사용하여 Kafka 클러스터를 Kafka 사용자 정의 리소스로 배포합니다. 이 예제에서는 keycloak 권한 부여 및 oauth 인증을 사용하여 단일 노드 Kafka 클러스터를 배포합니다.

사전 요구 사항

  • Red Hat Single Sign-On 권한 부여 서버는 OpenShift 클러스터에 배포되고 example 영역을 사용하여 로드됩니다.
  • Cluster Operator는 OpenShift 클러스터에 배포됩니다.
  • Apache Kafka 예제/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml 사용자 정의 리소스입니다.

프로세스

  1. 배포한 Red Hat Single Sign-On 인스턴스의 호스트 이름을 사용하여 Kafka 브로커의 신뢰 저장소 인증서가 Red Hat Single Sign-On 서버와 통신할 수 있도록 준비합니다.

    SSO_HOST=SSO-HOSTNAME
    SSO_HOST_PORT=$SSO_HOST:443
    STOREPASS=storepass
    
    echo "Q" | openssl s_client -showcerts -connect $SSO_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/sso.pem

    보안(HTTPS) 연결을 위해 Kubernetes Ingress 를 사용하므로 인증서가 필요합니다.

    일반적으로 하나의 인증서가 없지만 인증서 체인이 있습니다. /tmp/sso.pem 파일에 마지막으로 나열된 최상위 발행자 CA만 제공해야 합니다. 수동으로 추출하거나 다음 명령을 사용하여 추출할 수 있습니다.

    인증서 체인에서 최상위 CA 인증서를 추출하는 명령의 예

    split -p "-----BEGIN CERTIFICATE-----" sso.pem sso-
    for f in $(ls sso-*); do mv $f $f.pem; done
    cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt

    참고

    신뢰할 수 있는 CA 인증서는 일반적으로 openssl 명령을 사용하지 않고 신뢰할 수 있는 소스에서 가져옵니다.

  2. OpenShift에 인증서를 시크릿으로 배포합니다.

    oc create secret generic oauth-server-cert --from-file=/tmp/sso-ca.crt -n $NS
  3. 호스트 이름을 환경 변수로 설정

    SSO_HOST=SSO-HOSTNAME
  4. 예제 Kafka 클러스터를 생성하고 배포합니다.

    cat examples/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml | sed -E 's#\${SSO_HOST}'"#$SSO_HOST#" | oc create -n $NS -f -
15.5.4.3. CLI Kafka 클라이언트 세션에 대한 TLS 연결 준비

대화형 CLI 세션에 사용할 새 Pod를 생성합니다. TLS 연결을 위해 Red Hat Single Sign-On 인증서가 있는 신뢰 저장소를 설정합니다. 신뢰 저장소는 Red Hat Single Sign-On 및 Kafka 브로커에 연결하는 것입니다.

사전 요구 사항

  • Red Hat Single Sign-On 권한 부여 서버는 OpenShift 클러스터에 배포되고 example 영역을 사용하여 로드됩니다.

    Red Hat Single Sign-On 관리 콘솔에서 클라이언트에 할당된 역할이 클라이언트 > 서비스 계정 역할에 표시되는지 확인합니다.

  • Red Hat Single Sign-On과 연결하도록 구성된 Kafka 클러스터는 OpenShift 클러스터에 배포됩니다.

프로세스

  1. Apache Kafka 이미지의 Streams를 사용하여 새 대화형 pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.

    NS=sso
    oc run -ti --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 kafka-cli -n $NS -- /bin/sh
    참고

    이미지 다운로드에서 oc 시간이 초과되면 후속 시도로 인해 AlreadyExists 오류가 발생할 수 있습니다.

  2. Pod 컨테이너에 연결합니다.

    oc attach -ti kafka-cli -n $NS
  3. Red Hat Single Sign-On 인스턴스의 호스트 이름을 사용하여 TLS를 사용하여 클라이언트 연결에 대한 인증서를 준비합니다.

    SSO_HOST=SSO-HOSTNAME
    SSO_HOST_PORT=$SSO_HOST:443
    STOREPASS=storepass
    
    echo "Q" | openssl s_client -showcerts -connect $SSO_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/sso.pem

    일반적으로 하나의 인증서가 없지만 인증서 체인이 있습니다. /tmp/sso.pem 파일에 마지막으로 나열된 최상위 발행자 CA만 제공해야 합니다. 수동으로 추출하거나 다음 명령을 사용하여 추출할 수 있습니다.

    인증서 체인에서 최상위 CA 인증서를 추출하는 명령의 예

    split -p "-----BEGIN CERTIFICATE-----" sso.pem sso-
    for f in $(ls sso-*); do mv $f $f.pem; done
    cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt

    참고

    신뢰할 수 있는 CA 인증서는 일반적으로 openssl 명령을 사용하지 않고 신뢰할 수 있는 소스에서 가져옵니다.

  4. Kafka 브로커에 대한 TLS 연결에 대한 신뢰 저장소를 생성합니다.

    keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias sso -storepass $STOREPASS -import -file /tmp/sso-ca.crt -noprompt
  5. Kafka 부트스트랩 주소를 Kafka 브로커의 호스트 이름으로 사용하고 tls 리스너 포트(9093)를 사용하여 Kafka 브로커의 인증서를 준비합니다.

    KAFKA_HOST_PORT=my-cluster-kafka-bootstrap:9093
    STOREPASS=storepass
    
    echo "Q" | openssl s_client -showcerts -connect $KAFKA_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/my-cluster-kafka.pem

    가져온 .pem 파일은 일반적으로 하나의 인증서가 아니라 인증서 체인입니다. /tmp/my-cluster-kafka.pem 파일에 마지막으로 나열된 최상위 발행자 CA만 제공해야 합니다. 수동으로 추출하거나 다음 명령을 사용하여 추출할 수 있습니다.

    인증서 체인에서 최상위 CA 인증서를 추출하는 명령의 예

    split -p "-----BEGIN CERTIFICATE-----" /tmp/my-cluster-kafka.pem kafka-
    for f in $(ls kafka-*); do mv $f $f.pem; done
    cp $(ls kafka-* | sort -r | head -n 1) my-cluster-kafka-ca.crt

    참고

    신뢰할 수 있는 CA 인증서는 일반적으로 openssl 명령을 사용하지 않고 신뢰할 수 있는 소스에서 가져옵니다. 이 예에서는 클라이언트가 Kafka 클러스터가 배포된 동일한 네임스페이스의 Pod에서 실행되고 있다고 가정합니다. 클라이언트가 OpenShift 클러스터 외부에서 Kafka 클러스터에 액세스하는 경우 먼저 부트스트랩 주소를 확인해야 합니다. 이 경우 OpenShift 시크릿에서 직접 클러스터 인증서를 가져올 수 있으며 openssl 이 필요하지 않습니다. 자세한 내용은 14장. Kafka 클러스터에 대한 클라이언트 액세스 설정의 내용을 참조하십시오.

  6. Kafka 브로커의 인증서를 신뢰 저장소에 추가합니다.

    keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias my-cluster-kafka -storepass $STOREPASS -import -file /tmp/my-cluster-kafka-ca.crt -noprompt

    세션을 열린 상태로 유지하여 권한 있는 액세스 권한을 확인합니다.

대화형 CLI 세션을 사용하여 Red Hat Single Sign-On 영역을 통해 적용되는 권한 부여 규칙을 확인합니다. Kafka의 예제 생산자 및 소비자 클라이언트를 사용하여 검사를 적용하여 다른 수준의 액세스 권한이 있는 사용자 및 서비스 계정으로 주제를 생성합니다.

team-a-clientteam-b-client 클라이언트를 사용하여 권한 부여 규칙을 확인합니다. alice admin 사용자를 사용하여 Kafka에서 추가 관리 작업을 수행합니다.

이 예제에서 사용되는 Apache Kafka 이미지의 Streams에는 Kafka 생산자 및 소비자 바이너리가 포함되어 있습니다.

사전 요구 사항

클라이언트 및 관리자 구성 설정

  1. team-a-client 클라이언트에 대한 인증 속성을 사용하여 Kafka 구성 파일을 준비합니다.

    SSO_HOST=SSO-HOSTNAME
    
    cat > /tmp/team-a-client.properties << EOF
    security.protocol=SASL_SSL
    ssl.truststore.location=/tmp/truststore.p12
    ssl.truststore.password=$STOREPASS
    ssl.truststore.type=PKCS12
    sasl.mechanism=OAUTHBEARER
    sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
      oauth.client.id="team-a-client" \
      oauth.client.secret="team-a-client-secret" \
      oauth.ssl.truststore.location="/tmp/truststore.p12" \
      oauth.ssl.truststore.password="$STOREPASS" \
      oauth.ssl.truststore.type="PKCS12" \
      oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ;
    sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
    EOF

    SASL OAUTHBEARER 메커니즘이 사용됩니다. 이 메커니즘에는 클라이언트 ID와 클라이언트 시크릿이 필요합니다. 즉, 클라이언트가 먼저 Red Hat Single Sign-On 서버에 연결하여 액세스 토큰을 가져옵니다. 그러면 클라이언트는 Kafka 브로커에 연결하고 액세스 토큰을 사용하여 인증합니다.

  2. team-b-client 클라이언트에 대한 인증 속성을 사용하여 Kafka 구성 파일을 준비합니다.

    cat > /tmp/team-b-client.properties << EOF
    security.protocol=SASL_SSL
    ssl.truststore.location=/tmp/truststore.p12
    ssl.truststore.password=$STOREPASS
    ssl.truststore.type=PKCS12
    sasl.mechanism=OAUTHBEARER
    sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
      oauth.client.id="team-b-client" \
      oauth.client.secret="team-b-client-secret" \
      oauth.ssl.truststore.location="/tmp/truststore.p12" \
      oauth.ssl.truststore.password="$STOREPASS" \
      oauth.ssl.truststore.type="PKCS12" \
      oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ;
    sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
    EOF
  3. curl 을 사용하고 새로 고침 토큰을 가져오기 위해 암호를 부여하여 admin 사용자 alice 를 인증합니다.

    USERNAME=alice
    PASSWORD=alice-password
    
    GRANT_RESPONSE=$(curl -X POST "https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=password&username=$USERNAME&password=$PASSWORD&client_id=kafka-cli&scope=offline_access" -s -k)
    
    REFRESH_TOKEN=$(echo $GRANT_RESPONSE | awk -F "refresh_token\":\"" '{printf $2}' | awk -F "\"" '{printf $1}')

    새로 고침 토큰은 수명이 긴 오프라인 토큰이며 만료되지 않습니다.

  4. admin 사용자 alice 에 대한 인증 속성을 사용하여 Kafka 구성 파일을 준비합니다.

    cat > /tmp/alice.properties << EOF
    security.protocol=SASL_SSL
    ssl.truststore.location=/tmp/truststore.p12
    ssl.truststore.password=$STOREPASS
    ssl.truststore.type=PKCS12
    sasl.mechanism=OAUTHBEARER
    sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
      oauth.refresh.token="$REFRESH_TOKEN" \
      oauth.client.id="kafka-cli" \
      oauth.ssl.truststore.location="/tmp/truststore.p12" \
      oauth.ssl.truststore.password="$STOREPASS" \
      oauth.ssl.truststore.type="PKCS12" \
      oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ;
    sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
    EOF

    kafka-cli 공용 클라이언트는 sasl.jaas.configoauth.client.id 에 사용됩니다. 공개 클라이언트이므로 시크릿이 필요하지 않습니다. 클라이언트는 이전 단계에서 인증된 새로 고침 토큰을 사용하여 인증합니다. 새로 고침 토큰은 백그라운드에서 액세스 토큰을 요청하고, 그런 다음 인증을 위해 Kafka 브로커로 전송됩니다.

권한이 부여된 액세스로 메시지 생성

team-a-client 구성을 사용하여 a_ 또는 x_ 로 시작하는 항목에 메시지를 생성할 수 있는지 확인합니다.

  1. my-topic 주제를 작성합니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic my-topic \
      --producer.config=/tmp/team-a-client.properties
    First message

    이 요청은 [my-topic] 오류에 액세스할 수 있는 Not authorized 을 반환합니다.

    team-a-client 에는 a_ 로 시작하는 주제에 대해 지원되는 작업을 수행할 수 있는 권한을 부여하는 Dev 팀 A 역할이 있지만 x_ 로 시작하는 항목에만 쓸 수 있습니다. my-topic 이라는 주제는 해당 규칙 중 어느 것과도 일치하지 않습니다.

  2. a_messages 항목에 씁니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \
      --producer.config /tmp/team-a-client.properties
    First message
    Second message

    Kafka에 성공적으로 메시지가 생성됩니다.

  3. CTRL+C를 눌러 CLI 애플리케이션을 종료합니다.
  4. 요청에 대해 Authorization GRANTED 의 디버그 로그에 대한 Kafka 컨테이너 로그를 확인합니다.

    oc logs my-cluster-kafka-0 -f -n $NS

승인된 액세스로 메시지 사용

team-a-client 구성을 사용하여 a_messages 의 메시지를 사용합니다.

  1. 주제 a_messages 에서 메시지를 가져옵니다.

    bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \
      --from-beginning --consumer.config /tmp/team-a-client.properties

    team-a-clientDev Team A 역할은 a_ 로 시작하는 이름이 있는 소비자 그룹에만 액세스할 수 있기 때문에 요청이 오류를 반환합니다.

  2. team-a-client 속성을 업데이트하여 사용할 수 있는 사용자 지정 소비자 그룹을 지정합니다.

    bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \
      --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_1

    소비자는 a_messages 주제에서 모든 메시지를 받습니다.

권한이 부여된 액세스로 Kafka 관리

team-a-client 는 클러스터 수준 액세스 권한이 없는 계정이지만 일부 관리 작업과 함께 사용할 수 있습니다.

  1. 주제 나열.

    bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list

    a_messages 항목이 반환됩니다.

  2. 소비자 그룹을 나열합니다.

    bin/kafka-consumer-groups.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list

    a_consumer_group_1 소비자 그룹이 반환됩니다.

    클러스터 구성에 대한 세부 정보를 가져옵니다.

    bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties \
      --entity-type brokers --describe --entity-default

    작업에 team-a-client 가 없는 클러스터 수준 권한이 필요하므로 요청이 오류를 반환합니다.

다른 권한이 있는 클라이언트 사용

team-b-client 구성을 사용하여 b_ 로 시작하는 항목에 대한 메시지를 생성합니다.

  1. a_messages 항목에 씁니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \
      --producer.config /tmp/team-b-client.properties
    Message 1

    이 요청은 [a_messages] 오류에 액세스할 수 있는 Not authorized 을 반환합니다.

  2. b_messages 항목에 씁니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic b_messages \
      --producer.config /tmp/team-b-client.properties
    Message 1
    Message 2
    Message 3

    Kafka에 성공적으로 메시지가 생성됩니다.

  3. X _messages 항목에 씁니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --producer.config /tmp/team-b-client.properties
    Message 1

    Not authorized to access topics: [x_messages] 오류가 반환됩니다. team-b-clientx_messages 에서만 읽을 수 있습니다.

  4. team-a-client 를 사용하여 x_messages 주제를 작성합니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --producer.config /tmp/team-a-client.properties
    Message 1

    이 요청은 [x_messages] 오류에 액세스할 수 있는 Not authorized 을 반환합니다. team-a-clientx_messages 항목에 쓸 수 있지만 아직 존재하지 않는 경우 주제를 생성할 수 있는 권한이 없습니다. team-a-clientx_messages 항목에 작성하려면 관리자 전원 사용자가 파티션 및 복제본 수와 같은 올바른 구성으로 생성해야 합니다.

권한이 있는 admin 사용자로 Kafka 관리

admin 사용자 alice 를 사용하여 Kafka를 관리합니다. Alice 는 모든 Kafka 클러스터에서 모든 것을 관리할 수 있는 전체 액세스 권한을 갖습니다.

  1. x_messages 주제를 alice 로 만듭니다.

    bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \
      --topic x_messages --create --replication-factor 1 --partitions 1

    주제가 성공적으로 생성되었습니다.

  2. 모든 주제를 alice 로 나열합니다.

    bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties --list
    bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list
    bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-b-client.properties --list

    admin 사용자 alice 는 모든 주제를 나열할 수 있지만 team-a-clientteam-b-client 는 액세스할 수 있는 항목만 나열할 수 있습니다.

    Dev 팀 ADev 팀 B 역할에는 x_ 로 시작하는 주제에 대한 설명 권한이 있지만 해당 역할에 대한 Describe 권한이 없으므로 다른 팀의 주제를 볼 수 없습니다.

  3. team-a-client 를 사용하여 x_messages 항목에 메시지를 생성합니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --producer.config /tmp/team-a-client.properties
    Message 1
    Message 2
    Message 3

    alicex_messages 주제를 생성했으므로 Kafka에 메시지가 성공적으로 생성됩니다.

  4. team-b-client 를 사용하여 x_messages 항목에 대한 메시지를 생성합니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --producer.config /tmp/team-b-client.properties
    Message 4
    Message 5

    이 요청은 [x_messages] 오류에 액세스할 수 있는 Not authorized 을 반환합니다.

  5. team-b-client 를 사용하여 x_messages 주제의 메시지를 사용합니다.

    bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --from-beginning --consumer.config /tmp/team-b-client.properties --group x_consumer_group_b

    소비자는 x_messages 주제에서 모든 메시지를 받습니다.

  6. team-a-client 를 사용하여 x_messages 주제의 메시지를 사용합니다.

    bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --from-beginning --consumer.config /tmp/team-a-client.properties --group x_consumer_group_a

    이 요청은 [x_messages] 오류에 액세스할 수 있는 Not authorized 을 반환합니다.

  7. team-a-client 를 사용하여 a_ 로 시작하는 소비자 그룹의 메시지를 사용합니다.

    bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_a

    이 요청은 [x_messages] 오류에 액세스할 수 있는 Not authorized 을 반환합니다.

    dev 팀 A 에는 x_ 로 시작하는 주제에 대한 읽기 권한이 없습니다.

  8. alice 를 사용하여 x_messages 항목에 대한 메시지를 생성합니다.

    bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --from-beginning --consumer.config /tmp/alice.properties

    Kafka에 성공적으로 메시지가 생성됩니다.

    Alice 는 모든 항목에서 읽거나 쓸 수 있습니다.Alice can read from or write to any topic.

  9. alice 를 사용하여 클러스터 구성을 읽습니다.

    bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \
      --entity-type brokers --describe --entity-default

    이 예제의 클러스터 구성은 비어 있습니다.

16장. TLS 인증서 관리

Apache Kafka의 스트림은 Apache Kafka 구성 요소의 Kafka와 Streams 간의 암호화된 통신을 위해 TLS를 지원합니다.

Apache Kafka의 스트림은 KRaft 모드에서 Kafka를 사용할 때 다음 구성 요소 간 통신을 위해 암호화된 TLS 연결을 설정합니다.

  • Kafka 브로커
  • Kafka 컨트롤러
  • Kafka 브로커 및 컨트롤러
  • Apache Kafka Operator 및 Kafka용 스트림
  • 크루즈 컨트롤 및 Kafka 브로커
  • Kafka Exporter 및 Kafka 브로커

클라이언트와 Kafka 브로커 간의 연결은 TLS 암호화 통신을 사용하도록 구성해야 하는 리스너를 사용합니다. Kafka 사용자 정의 리소스에서 이러한 리스너를 구성하고 각 리스너 이름과 포트 번호는 클러스터 내에서 고유해야 합니다. Kafka 브로커와 Kafka 클라이언트 간의 통신은 리스너에 대해 tls 속성이 구성된 방법에 따라 암호화됩니다. 자세한 내용은 14장. Kafka 클러스터에 대한 클라이언트 액세스 설정의 내용을 참조하십시오.

다음 다이어그램에서는 보안 통신을 위한 연결을 보여줍니다.

그림 16.1. TLS 암호화로 보안된 Kraft 기반 Kafka 통신

보안 통신

다이어그램에 표시된 포트는 다음과 같이 사용됩니다.

컨트롤 플레인 리스너 (9090)
포트 9090의 내부 컨트롤 플레인 리스너는 Kafka 컨트롤러와 브로커-투-컨트롤러 통신 간의 상호 통신이 용이합니다. 또한 Cluster Operator는 리스너를 통해 컨트롤러와 통신합니다. 이 리스너는 Kafka 클라이언트에서 액세스할 수 없습니다.
복제 리스너(9091)
Streams for Apache Kafka Operator, Cruise Control 및 Kafka Exporter의 브로커 간 데이터 복제와 포트 9091에서 복제 리스너를 사용합니다. 이 리스너는 Kafka 클라이언트에서 액세스할 수 없습니다.
클라이언트 연결에 대한 리스너(9092 이상)
TLS 암호화 통신( listener의 구성을 통해)의 경우 내부 및 외부 클라이언트가 Kafka 브로커에 연결됩니다. 외부 클라이언트(생성자 및 소비자)는 공개된 리스너 포트를 통해 Kafka 브로커에 연결합니다.
중요

브로커에 대한 클라이언트 액세스를 위해 리스너를 구성할 때 포트 9092 이상(9093, 9094 등)을 사용할 수 있지만 몇 가지 예외가 있습니다. 리스너는 인터브로커 통신(9090 및 9091), Prometheus 지표(9404) 및 Cryostat(Java Management Extensions) 모니터링(9999)을 위해 예약된 포트를 사용하도록 구성할 수 없습니다.

클러스터 관리를 위해 Zoo Cryostat를 사용하는 경우 Zoo Cryostat와 Kafka 브로커와 Apache Kafka Operator용 Streams 간에 TLS 연결이 있습니다.

다음 다이어그램에서는 Zoo Cryostat를 사용할 때 안전한 통신을 위한 연결을 보여줍니다.

그림 16.2. TLS 암호화로 보안된 Kafka 및 Zoo Cryostat 통신

보안 통신

Zoo Cryostat 포트는 다음과 같이 사용됩니다.

Zookeeper 포트 (2181)
Kafka 브로커에 연결하기 위한 Zookeeper 포트입니다. 또한 Cluster Operator는 이 포트를 통해 Zoo Cryostat와 통신합니다. Topic Operator를 양방향 모드에서 사용하는 경우 이 포트를 통해 Zoo Cryostat와도 통신합니다.
Zookeeper internodal 통신 포트 (2888)
Zoo Cryostat 노드 간의 상호 통신을 위한 Zookeeper 포트입니다.
Zookeeper 리더 선택 포트 (3888)
Zoo Cryostat 클러스터의 Zoo Cryostat 노드 중에서 리더 선택을 위한 Zookeeper 포트입니다.

16.1. 내부 클러스터 CA 및 클라이언트 CA

암호화를 지원하기 위해 각 Streams for Apache Kafka 구성 요소에는 고유한 개인 키와 공개 키 인증서가 필요합니다. 모든 구성 요소 인증서는 클러스터 CA라는 내부 CA(인증 기관)에서 서명합니다.

CA(인증 기관) 인증서는 구성 요소 및 클라이언트의 ID를 확인하기 위해 Cluster Operator에서 생성됩니다.

마찬가지로 mTLS를 사용하여 Apache Kafka용 Streams에 연결하는 각 Kafka 클라이언트 애플리케이션은 개인 키와 인증서를 사용해야 합니다. 클라이언트 CA라는 두 번째 내부 CA는 Kafka 클라이언트 의 인증서에 서명하는 데 사용됩니다.

클러스터 CA 및 클라이언트 CA에는 모두 자체 서명된 공개 키 인증서가 있습니다.

Kafka 브로커는 클러스터 CA 또는 클라이언트 CA에서 서명한 인증서를 신뢰하도록 구성됩니다. 클라이언트가 연결할 필요가 없는 구성 요소(예: Zoo Cryostat)는 클러스터 CA에서 서명한 신뢰 인증서만 사용합니다. 외부 리스너에 대한 TLS 암호화가 비활성화되지 않는 한 클라이언트 애플리케이션은 클러스터 CA에서 서명한 인증서를 신뢰해야 합니다. 이는 mTLS 인증을 수행하는 클라이언트 애플리케이션에도 적용됩니다.

기본적으로 Streams for Apache Kafka는 클러스터 CA 또는 클라이언트 CA에서 발급한 CA 인증서를 자동으로 생성하고 갱신합니다. Kafka.spec.clusterCaKafka.spec.clientsCa 속성을 사용하여 이러한 CA 인증서의 관리를 구성할 수 있습니다.

참고

Cluster Operator에서 생성한 CA를 사용하지 않으려면 자체 클러스터 및 클라이언트 CA 인증서를 설치할 수 있습니다. 제공하는 인증서는 Cluster Operator에 의해 갱신되지 않습니다.

16.2. Operator에서 생성한 보안

Cluster Operator는 클러스터 내에서 암호화 및 인증을 활성화하기 위해 TLS 인증서를 자동으로 설정하고 갱신합니다. Kafka 브로커와 클라이언트 간에 암호화 또는 mTLS 인증을 활성화하려면 다른 TLS 인증서도 설정합니다.

시크릿은 KafkaKafkaUser 와 같은 사용자 정의 리소스가 배포되면 생성됩니다. Apache Kafka의 스트림은 이러한 시크릿을 사용하여 Kafka 클러스터, 클라이언트 및 사용자의 개인 및 공개 키 인증서를 저장합니다. 시크릿은 Kafka 브로커 간 TLS 암호화 연결을 설정하고 브로커와 클라이언트 간의 TLS 암호화 연결을 설정하는 데 사용됩니다. mTLS 인증에도 사용됩니다.

클러스터 및 클라이언트 보안은 항상 쌍입니다. 하나는 공개 키가 포함되어 있고 개인 키가 포함되어 있습니다.

클러스터 시크릿
클러스터 시크릿에는 Kafka 브로커 인증서에 서명하는 클러스터 CA 가 포함되어 있습니다. 클라이언트는 인증서를 사용하여 Kafka 클러스터와 TLS 암호화 연결을 설정합니다. 인증서는 브로커 ID를 확인합니다.
클라이언트 시크릿
클라이언트 시크릿에는 사용자가 자체 클라이언트 인증서에 서명할 수 있는 클라이언트 CA 가 포함되어 있습니다. 이를 통해 Kafka 클러스터에 대한 상호 인증을 허용합니다. 브로커는 인증서를 통해 클라이언트의 ID를 검증합니다.
사용자 시크릿
사용자 시크릿에는 개인 키와 인증서가 포함되어 있습니다. 새 사용자를 생성할 때 클라이언트 CA에서 시크릿을 생성하고 서명합니다. 키와 인증서는 클러스터에 액세스할 때 사용자를 인증하고 권한을 부여하는 데 사용됩니다.
참고

TLS 리스너 또는 TLS 암호화가 활성화된 외부 리스너에 대한 Kafka 리스너 인증서를 제공할 수 있습니다. Kafka 리스너 인증서를 사용하여 이미 보유한 보안 인프라를 통합합니다.

16.2.1. PEM 또는 PKCS #12 형식의 키와 인증서를 사용하는 TLS 인증

Streams for Apache Kafka에서 생성한 시크릿은 PEM(Privacy Enhanced Mail) 및 PKCS #12(Public-Key Cryptography Standards) 형식으로 개인 키와 인증서를 제공합니다. PEM 및 PKCS #12는 SSL 프로토콜을 사용하여 TLS 통신을 위한 OpenSSL 생성 키 형식입니다.

Kafka 클러스터 및 사용자에 대해 생성된 보안에 포함된 인증 정보를 사용하는 상호 TLS(mTLS) 인증을 구성할 수 있습니다.

mTLS를 설정하려면 먼저 다음을 수행해야 합니다.

Kafka 클러스터를 배포할 때 클러스터를 확인하기 위해 < cluster_name>-cluster-ca-cert 시크릿이 공개 키로 생성됩니다. 공개 키를 사용하여 클라이언트의 신뢰 저장소를 구성합니다.

KafkaUser 를 생성할 때 사용자(클라이언트)를 확인하기 위해 키와 인증서로 < kafka_user_name > 시크릿이 생성됩니다. 이러한 인증 정보를 사용하여 클라이언트의 키 저장소를 구성합니다.

Kafka 클러스터 및 클라이언트가 mTLS를 사용하도록 설정된 상태에서 시크릿에서 인증 정보를 추출하여 클라이언트 구성에 추가합니다.

PEM 키 및 인증서

PEM의 경우 클라이언트 구성에 다음을 추가합니다.

truststore
  • 클러스터의 CA 인증서인 < cluster_name>-cluster-ca-cert 시크릿의 ca.crt.
키 저장소
  • < kafka_user_name > 시크릿의 user.crt 는 사용자의 공용 인증서입니다.
  • < kafka_user_name > 시크릿의 user.key 는 사용자의 개인 키입니다.
PKCS #12 키 및 인증서

PKCS #12의 경우 클라이언트 구성에 다음을 추가합니다.

truststore
  • 클러스터의 CA 인증서인 < cluster_name>-cluster-ca-cert 시크릿의 ca.p12.
  • 공용 클러스터 CA 인증서에 액세스하기 위한 암호인 < cluster_name>-cluster-ca-cert 시크릿의 ca.password.
키 저장소
  • < kafka_user_name > 시크릿의 user.p12 는 사용자의 공개 키 인증서입니다.
  • Kafka 사용자의 공개 키 인증서에 액세스하기 위한 암호인 < kafka_user_name > 시크릿의 user.password.

PKCS #12는 Java에서 지원하므로 인증서 값을 Java 클라이언트 구성에 직접 추가할 수 있습니다. 보안 스토리지 위치의 인증서를 참조할 수도 있습니다. PEM 파일을 사용하면 한 줄 형식으로 클라이언트 구성에 인증서를 직접 추가해야 합니다. Kafka 클러스터와 클라이언트 간의 TLS 연결을 설정하는 데 적합한 형식을 선택합니다. PEM에 익숙하지 않은 경우 PKCS #12를 사용합니다.

참고

모든 키는 크기가 2048비트이며 기본적으로 초기 생성에서 365일 동안 유효합니다. 유효 기간을 변경할 수 있습니다.

16.2.2. Cluster Operator에서 생성한 보안

Cluster Operator는 OpenShift 클러스터에 시크릿으로 저장된 다음 인증서를 생성합니다. Apache Kafka의 스트림은 기본적으로 이러한 시크릿을 사용합니다.

클러스터 CA 및 클라이언트 CA에는 개인 키 및 공개 키에 대한 별도의 시크릿이 있습니다.

<cluster_name>-cluster-ca
클러스터 CA의 개인 키를 포함합니다. Apache Kafka 및 Kafka 구성 요소의 스트림은 개인 키를 사용하여 서버 인증서에 서명합니다.
<cluster_name>-cluster-ca-cert
클러스터 CA의 공개 키를 포함합니다. Kafka 클라이언트는 공개 키를 사용하여 TLS 서버 인증으로 연결된 Kafka 브로커의 ID를 확인합니다.
<cluster_name>-clients-ca
클라이언트 CA의 개인 키를 포함합니다. Kafka 클라이언트는 Kafka 브로커에 연결할 때 개인 키를 사용하여 mTLS 인증을 위한 새 사용자 인증서에 서명합니다.
<cluster_name>-clients-ca-cert
클라이언트 CA의 공개 키를 포함합니다. Kafka 브로커는 공개 키를 사용하여 mTLS 인증이 사용되는 경우 Kafka 브로커에 액세스하는 클라이언트의 ID를 확인합니다.

Apache Kafka 구성 요소 스트림 간 통신을 위한 시크릿에는 클러스터 CA에서 서명한 개인 키와 공개 키 인증서가 포함되어 있습니다.

<cluster_name>-kafka-brokers
Kafka 브로커의 개인 키 및 공개 키가 포함되어 있습니다.
<cluster_name>-zookeeper-nodes
Zoo Cryostat 노드의 개인 및 공개 키를 포함합니다.
<cluster_name>-cluster-operator-certs
Cluster Operator와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-entity-topic-operator-certs
Topic Operator와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-entity-user-operator-certs
User Operator와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-cruise-control-certs
Cruise Control과 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-kafka-exporter-certs
Kafka Exporter와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
참고

16.2.3. 클러스터 CA 시크릿

클러스터 CA 보안은 Kafka 클러스터의 Cluster Operator에 의해 관리됩니다.

클라이언트에는 <cluster_name> -cluster-ca-cert 시크릿만 필요합니다. 다른 모든 클러스터 시크릿은 Apache Kafka 구성 요소용 Streams에서 액세스할 수 있습니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 이를 적용할 수 있습니다.

참고

< cluster_name> -cluster-ca-cert 의 CA 인증서는 TLS를 통해 Kafka 브로커에 연결할 때 Kafka 브로커 인증서를 검증하도록 Kafka 클라이언트 애플리케이션에서 신뢰해야 합니다.

Expand
표 16.1. < cluster_name> -cluster-ca 시크릿의 필드
필드설명

ca.key

클러스터 CA의 현재 개인 키입니다.

Expand
표 16.2. < cluster_name> -cluster-ca-cert 시크릿의 필드
필드설명

ca.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

ca.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

ca.crt

클러스터 CA의 현재 인증서입니다.

Expand
표 16.3. < cluster_name> -kafka-brokers 시크릿의 필드
필드설명

<cluster_name>-kafka-<num>.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

<cluster_name>-kafka-<num>.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

<cluster_name>-kafka-<num>.crt

Kafka 브로커 Pod < num>의 인증서입니다. <cluster _name> -cluster-ca 에서 현재 또는 이전 클러스터 CA 개인 키로 서명했습니다.

<cluster_name>-kafka-<num>.key

Kafka 브로커 Pod < num&gt;의 개인 키

Expand
표 16.4. < cluster_name> -zookeeper-nodes 시크릿의 필드
필드설명

<cluster_name>-zookeeper-<num>.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

<cluster_name>-zookeeper-<num>.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

<cluster_name>-zookeeper-<num>.crt

Zoo Cryostat 노드 < num& gt;의 인증서입니다. <cluster _name> -cluster-ca 에서 현재 또는 이전 클러스터 CA 개인 키로 서명했습니다.

<cluster_name>-zookeeper-<num>.key

Zoo Cryostat pod < num> 의 개인 키입니다.

Expand
표 16.5. < cluster_name> -cluster-operator-certs 시크릿의 필드
필드설명

cluster-operator.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

cluster-operator.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

cluster-operator.crt

Cluster Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster _name> -cluster-ca 에서 현재 또는 이전 클러스터 CA 개인 키로 서명했습니다.

cluster-operator.key

Cluster Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다.

Expand
표 16.6. < cluster_name>-entity-topic-operator-certs 시크릿의 필드
필드설명

entity-operator.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

entity-operator.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

entity-operator.crt

Topic Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster _name> -cluster-ca 에서 현재 또는 이전 클러스터 CA 개인 키로 서명했습니다.

entity-operator.key

Topic Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다.

Expand
표 16.7. < cluster_name>-entity-user-operator-certs 시크릿의 필드
필드설명

entity-operator.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

entity-operator.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

entity-operator.crt

User Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster _name> -cluster-ca 에서 현재 또는 이전 클러스터 CA 개인 키로 서명했습니다.

entity-operator.key

User Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다.

Expand
표 16.8. < cluster_name> -cruise-control-certs 시크릿의 필드
필드설명

cruise-control.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

cruise-control.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

cruise-control.crt

Cruise Control과 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster _name> -cluster-ca 에서 현재 또는 이전 클러스터 CA 개인 키로 서명했습니다.

cruise-control.key

크루즈 컨트롤과 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다.

Expand
표 16.9. < cluster_name>-kafka-exporter-certs 시크릿의 필드
필드설명

kafka-exporter.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

kafka-exporter.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

kafka-exporter.crt

Kafka Exporter와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster _name> -cluster-ca 에서 현재 또는 이전 클러스터 CA 개인 키로 서명했습니다.

kafka-exporter.key

Kafka Exporter와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다.

16.2.4. 클라이언트 CA 시크릿

클라이언트 CA 보안은 Kafka 클러스터의 Cluster Operator에 의해 관리됩니다.

< cluster_name> -clients-ca-cert 의 인증서는 Kafka 브로커가 신뢰하는 인증서입니다.

& lt;cluster_name&gt; -clients-ca 시크릿은 클라이언트 애플리케이션의 인증서에 서명하는 데 사용됩니다. User Operator를 사용하지 않고 애플리케이션 인증서를 발행하려는 경우 Apache Kafka 구성 요소의 Streams for Apache Kafka 구성 요소와 관리 액세스에 액세스할 수 있어야 합니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 이를 적용할 수 있습니다.

Expand
표 16.10. < cluster_name> -clients-ca 시크릿의 필드
필드설명

ca.key

클라이언트 CA의 현재 개인 키입니다.

Expand
표 16.11. < cluster_name> -clients-ca-cert 시크릿의 필드
필드설명

ca.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

ca.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

ca.crt

클라이언트 CA의 현재 인증서입니다.

16.2.5. User Operator에서 생성한 사용자 시크릿

사용자 보안은 User Operator가 관리합니다.

User Operator를 사용하여 사용자를 생성하면 사용자 이름을 사용하여 보안이 생성됩니다.

Expand
표 16.12. user_name 시크릿의 필드
시크릿 이름시크릿 내 필드설명

<user_name>

user.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다.

user.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

user.crt

클라이언트 CA에서 서명한 사용자의 인증서

user.key

사용자의 개인 키

16.2.6. 클러스터 CA 보안에 레이블 및 주석 추가

Kafka 사용자 정의 리소스에서 clusterCaCert 템플릿 속성을 구성하면 Cluster Operator에서 생성한 Cluster CA 보안에 사용자 정의 레이블 및 주석을 추가할 수 있습니다. 레이블 및 주석은 오브젝트를 식별하고 컨텍스트 정보를 추가하는 데 유용합니다. Apache Kafka 사용자 정의 리소스의 Streams에서 템플릿 속성을 구성합니다.

보안에 레이블 및 주석을 추가하는 템플릿 사용자 정의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
    template:
      clusterCaCert:
        metadata:
          labels:
            label1: value1
            label2: value2
          annotations:
            annotation1: value1
            annotation2: value2
    # ...

16.2.7. CA 보안에서 ownerReference 비활성화

기본적으로 클러스터 및 클라이언트 CA 보안은 Kafka 사용자 정의 리소스로 설정된 ownerReference 속성을 사용하여 생성됩니다. 즉, Kafka 사용자 정의 리소스가 삭제되면 OpenShift에서 CA 시크릿도 삭제(가용됨)됩니다.

새 클러스터에 CA를 재사용하려면 Kafka 구성에서 클러스터 및 클라이언트 CA 시크릿의 generateSecretOwnerReference 속성을 false 로 설정하여 ownerReference 를 비활성화할 수 있습니다. ownerReference 가 비활성화되면 해당 Kafka 사용자 정의 리소스가 삭제되면 OpenShift에서 CA 시크릿이 삭제되지 않습니다.

클러스터 및 클라이언트 CA에 대해 비활성화된 ownerReference 가 있는 Kafka 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
  clusterCa:
    generateSecretOwnerReference: false
  clientsCa:
    generateSecretOwnerReference: false
# ...

16.3. 인증서 갱신 및 유효 기간

클러스터 CA 및 클라이언트 CA 인증서는 유효 기간이라는 제한된 기간 동안만 유효합니다. 일반적으로 인증서가 생성된 후 일수로 정의됩니다.

Cluster Operator가 자동으로 생성한 CA 인증서의 경우 유효한 기간을 구성할 수 있습니다.

  • Kafka.spec.clusterCa.validityDays의 클러스터 CA 인증서
  • Kafka.spec.clientsCa.validityDays의 클라이언트 CA 인증서

두 인증서의 기본 유효 기간은 365일입니다. 수동으로 설치한 CA 인증서에는 고유한 유효 기간이 정의되어 있어야 합니다.

CA 인증서가 만료되면 해당 인증서를 계속 신뢰하는 구성 요소 및 클라이언트는 CA 개인 키로 인증서를 서명한 피어의 연결을 허용하지 않습니다. 구성 요소 및 클라이언트는 대신 CA 인증서를 신뢰해야 합니다.

서비스 손실 없이 CA 인증서 갱신을 허용하기 위해 Cluster Operator는 이전 CA 인증서가 만료되기 전에 인증서 갱신을 시작합니다.

Cluster Operator가 생성한 인증서의 갱신 기간을 구성할 수 있습니다.

  • Kafka.spec.clusterCa.renewalDays의 클러스터 CA 인증서
  • Kafka.spec.clientsCa.renewalDays의 클라이언트 CA 인증서

두 인증서의 기본 갱신 기간은 30일입니다.

갱신 기간은 현재 인증서의 만료 날짜로부터 역순으로 측정됩니다.

갱신 기간에 대한 유효 기간

Not Before                                     Not After
    |                                              |
    |<--------------- validityDays --------------->|
                              <--- renewalDays --->|

Kafka 클러스터를 생성한 후 유효 기간 및 갱신 기간을 변경하려면 Kafka 사용자 정의 리소스를 구성 및 적용하고 CA 인증서를 수동으로 갱신합니다. 인증서를 수동으로 갱신하지 않으면 다음에 인증서가 자동으로 갱신될 때 새 기간이 사용됩니다.

인증서 유효 기간 및 갱신 기간에 대한 Kafka 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
  clusterCa:
    renewalDays: 30
    validityDays: 365
    generateCertificateAuthority: true
  clientsCa:
    renewalDays: 30
    validityDays: 365
    generateCertificateAuthority: true
# ...

갱신 기간 동안 Cluster Operator의 동작은 클러스터 CA 및 클라이언트 CA의 generateCertificateAuthority 인증서 생성 속성 설정에 따라 다릅니다.

true
속성이 true 로 설정되면 Cluster Operator에 의해 CA 인증서가 자동으로 생성되고 갱신 기간 내에 자동으로 갱신됩니다.
false
속성이 false 로 설정되면 Cluster Operator에 의해 CA 인증서가 생성되지 않습니다. 자체 인증서를 설치하는 경우 이 옵션을 사용합니다.

16.3.1. 자동으로 생성된 CA 인증서로 갱신 프로세스

CA 인증서를 갱신할 때 Cluster Operator는 이 순서대로 다음 프로세스를 수행합니다.

  1. 새 CA 인증서를 생성하지만 기존 키를 유지합니다.

    새 인증서는 이전 인증서를 해당 시크릿 내의 ca.crt 이름으로 교체합니다.

  2. 새 클라이언트 인증서( Zookafka 노드, Kafka 브로커 및 Entity Operator용)를 생성합니다.

    서명 키가 변경되지 않았으므로 엄격하게 필요하지 않지만 클라이언트 인증서의 유효 기간이 CA 인증서와 동기화됩니다.

  3. 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용할 수 있도록 Zoo Cryostat 노드를 재시작합니다.
  4. Kafka 브로커를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.
  5. 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용하도록 Topic 및 User Operator를 다시 시작합니다.

    사용자 인증서는 클라이언트 CA에서 서명합니다. User Operator가 생성한 사용자 인증서는 클라이언트 CA가 갱신될 때 갱신됩니다.

16.3.2. 클라이언트 인증서 갱신

Cluster Operator는 Kafka 클러스터를 사용하는 클라이언트 애플리케이션을 인식하지 못합니다.

클러스터에 연결하고 올바르게 작동하려면 클라이언트 애플리케이션이 다음을 수행해야 합니다.

  • <cluster> - cluster-ca-cert 시크릿에 게시된 클러스터 CA 인증서를 신뢰합니다.
  • < user-name> 보안에 게시된 인증 정보를 사용하여 클러스터에 연결합니다.

    사용자 시크릿은 PEM 및 PKCS #12 형식으로 자격 증명을 제공하거나 SCRAM-SHA 인증을 사용할 때 암호를 제공할 수 있습니다. User Operator는 사용자가 생성될 때 사용자 인증 정보를 생성합니다.

인증서 갱신 후에도 클라이언트가 계속 작동하는지 확인해야 합니다. 갱신 프로세스는 클라이언트 구성 방법에 따라 다릅니다.

클라이언트 인증서 및 키를 수동으로 프로비저닝하는 경우 새 클라이언트 인증서를 생성하고 갱신 기간 내에 클라이언트에서 새 인증서를 사용해야 합니다. 갱신 기간이 끝날 때까지 이 작업을 수행하지 않으면 클라이언트 애플리케이션이 클러스터에 연결할 수 없게 될 수 있습니다.

참고

동일한 OpenShift 클러스터 및 네임스페이스 내에서 실행되는 워크로드의 경우 Secrets는 보안의 현재 상태에서 클라이언트 Pod가 키 저장소 및 신뢰 저장소를 구성하도록 볼륨으로 마운트할 수 있습니다. 이 프로세스에 대한 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.

16.3.3. Cluster Operator 관리 CA 인증서 수동 갱신

Cluster Operator가 생성한 클러스터 및 클라이언트 CA 인증서는 해당 인증서 갱신 기간이 시작될 때 자동으로 갱신됩니다. 그러나 strimzi.io/force-renew 주석을 사용하여 인증서 갱신 기간이 시작되기 전에 이러한 인증서 중 하나 또는 둘 다를 수동으로 갱신할 수 있습니다. 보안상의 이유로 이 작업을 수행하거나 인증서의 갱신 또는 유효 기간을 변경한 경우 .

업데이트된 인증서는 이전 인증서와 동일한 개인 키를 사용합니다.

참고

자체 CA 인증서를 사용하는 경우 force-renew 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.

사전 요구 사항

이 절차에서는 my-project 네임스페이스 내에서 my-cluster 라는 Kafka 클러스터를 사용합니다.

프로세스

  1. 갱신하려는 CA 인증서가 포함된 보안에 strimzi.io/force-renew 주석을 적용합니다.

    클러스터 CA 시크릿 갱신

    oc annotate secret my-cluster-cluster-ca-cert -n my-project strimzi.io/force-renew="true"

    클라이언트 CA 시크릿 갱신

    oc annotate secret my-cluster-clients-ca-cert -n my-project strimzi.io/force-renew="true"

  2. 다음 조정에서 Cluster Operator는 새 인증서를 생성합니다.

    유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 기간 기간 내에 첫 번째 조정에 새 CA 인증서를 생성합니다.

  3. 새 CA 인증서의 유효 기간을 확인합니다.

    새 클러스터 CA 인증서의 유효 기간 확인

    oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates

    새 클라이언트 CA 인증서의 유효 기간 확인

    oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates

    이 명령은 CA 인증서에 유효한 시작 및 종료 날짜인 notBeforenotAfter 날짜를 반환합니다.

  4. 새 클러스터 CA 인증서를 신뢰하도록 클라이언트 구성을 업데이트합니다.

    다음 내용을 참조하십시오.

16.3.4. 만료된 Cluster Operator 관리 CA 인증서에서 수동으로 복구

클러스터 Operator는 갱신 기간이 시작될 때 클러스터 및 클라이언트 CA 인증서를 자동으로 갱신합니다. 그러나 예기치 않은 운영 문제 또는 중단으로 인해 Cluster Operator의 다운타임 또는 Kafka 클러스터를 사용할 수 없는 것과 같은 갱신 프로세스를 방지할 수 있습니다. CA 인증서가 만료되면 Kafka 클러스터 구성 요소는 서로 통신할 수 없으며 Cluster Operator는 수동 조작 없이 CA 인증서를 갱신할 수 없습니다.

즉시 복구를 수행하려면 다음 절차에 설명된 단계를 지정된 순서대로 따르십시오. 만료된 클러스터 및 클라이언트 CA 인증서에서 복구할 수 있습니다. 이 프로세스에서는 Cluster Operator에 의해 새 인증서가 생성되도록 만료된 인증서가 포함된 보안을 삭제해야 합니다. Apache Kafka 스트림에서 관리되는 보안에 대한 자세한 내용은 16.2.2절. “Cluster Operator에서 생성한 보안” 을 참조하십시오.

참고

자체 CA 인증서를 사용하는 경우 프로세스가 만료되지만 Cluster Operator에서 생성한 인증서를 사용하지 않고 CA 인증서를 갱신 해야 합니다.

사전 요구 사항

이 절차에서는 my-project 네임스페이스 내에서 my-cluster 라는 Kafka 클러스터를 사용합니다.

프로세스

  1. 만료된 CA 인증서가 포함된 보안을 삭제합니다.

    클러스터 CA 시크릿 삭제

    oc delete secret my-cluster-cluster-ca-cert -n my-project

    클라이언트 CA 시크릿 삭제

    oc delete secret my-cluster-clients-ca-cert -n my-project

  2. Cluster Operator가 새 인증서를 생성할 때까지 기다립니다.

    • Kafka 브로커의 ID를 동일한 이름(my-cluster-cluster-ca-cert)의 시크릿에 생성하는 새 CA 클러스터 인증서입니다.
    • Kafka 사용자의 ID를 확인하는 새 CA 클라이언트 인증서가 동일한 이름의 시크릿(my-cluster-clients-ca-cert)에 생성됩니다.
  3. 새 CA 인증서의 유효 기간을 확인합니다.

    새 클러스터 CA 인증서의 유효 기간 확인

    oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates

    새 클라이언트 CA 인증서의 유효 기간 확인

    oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates

    이 명령은 CA 인증서에 유효한 시작 및 종료 날짜인 notBeforenotAfter 날짜를 반환합니다.

  4. CA 인증서를 사용하는 구성 요소 Pod 및 시크릿을 삭제합니다.

    1. Zoo Cryostat 시크릿을 삭제합니다.
    2. Cluster Operator가 누락된 Zoo Cryostat 시크릿을 감지하고 다시 생성할 때까지 기다립니다.
    3. 모든 Zoo Cryostat Pod를 삭제합니다.
    4. Kafka 시크릿을 삭제합니다.
    5. Cluster Operator가 누락된 Kafka 시크릿을 감지하고 다시 생성할 때까지 기다립니다.
    6. 모든 Kafka Pod를 삭제합니다.

    클라이언트 CA 인증서만 복구하는 경우 Kafka 시크릿 및 Pod만 삭제해야 합니다.

    다음 oc 명령을 사용하여 리소스를 찾고 해당 리소스가 제거되었는지 확인할 수 있습니다.

    oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>

    & lt;resource_type >을 Pod 또는 Secret 과 같은 리소스 유형으로 바꿉니다.

  5. Cluster Operator가 누락된 Kafka 및 Zoo Cryostat Pod를 감지하고 업데이트된 CA 인증서로 다시 생성할 때까지 기다립니다.

    조정 시 Cluster Operator는 새 CA 인증서를 신뢰하도록 다른 구성 요소를 자동으로 업데이트합니다.

  6. Cluster Operator 로그의 인증서 검증과 관련된 문제가 없는지 확인합니다.
  7. 새 클러스터 CA 인증서를 신뢰하도록 클라이언트 구성을 업데이트합니다.

    다음 내용을 참조하십시오.

16.3.5. Cluster Operator 관리 CA 인증서에서 사용하는 개인 키 교체

Cluster Operator에서 생성한 클러스터 CA 및 클라이언트 CA 인증서에서 사용하는 개인 키를 교체할 수 있습니다. 개인 키가 교체되면 Cluster Operator는 새 개인 키에 대한 새 CA 인증서를 생성합니다.

참고

자체 CA 인증서를 사용하는 경우 force-replace 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.

프로세스

  • strimzi.io/force-replace 주석 을 갱신할 개인 키가 포함된 보안에 적용합니다.

    Expand
    표 16.13. 개인 키 교체 명령
    의 개인 키Secret주석 명령

    클러스터 CA

    <cluster_name>-cluster-ca

    oc annotate secret <cluster_name>-cluster-ca strimzi.io/force-replace="true"

    클라이언트 CA

    <cluster_name>-clients-ca

    oc annotate secret <cluster_name>-clients-ca strimzi.io/force-replace="true"

다음 조정에서 Cluster Operator는 다음을 수행합니다.

  • 주석이 달린 보안에 대한 새 개인 키 생성
  • 새 CA 인증서 생성

유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 기간 내에 첫 번째 조정 시 새 개인 키 및 CA 인증서를 생성합니다.

클라이언트 애플리케이션은 Cluster Operator가 업데이트한 클러스터 및 클라이언트 CA 인증서를 다시 로드해야 합니다.

16.4. 클러스터 CA를 신뢰하도록 내부 클라이언트 구성

다음 절차에서는 클러스터 CA 인증서를 신뢰하기 위해 OpenShift 클러스터 내에 있는 Kafka 클라이언트를 구성하는 방법을 설명합니다.

내부 클라이언트에 이 작업을 수행하는 가장 쉬운 방법은 볼륨 마운트를 사용하여 필요한 인증서 및 키가 포함된 시크릿에 액세스하는 것입니다.

단계에 따라 Java 기반 Kafka Producer, Consumer 및 Streams API에 대한 클러스터 CA에서 서명한 신뢰 인증서를 구성합니다.

클러스터 CA의 인증서 형식에 따라 수행할 단계를 선택합니다. PKCS #12 (.p12) 또는 PEM (.crt).

이 단계에서는 Kafka 클러스터의 ID를 클라이언트 Pod에 확인하는 클러스터 시크릿을 마운트하는 방법을 설명합니다.

사전 요구 사항

  • Cluster Operator가 실행 중이어야 합니다.
  • OpenShift 클러스터 내에 Kafka 리소스가 있어야 합니다.
  • TLS를 사용하여 연결할 OpenShift 클러스터 내부에 Kafka 클라이언트 애플리케이션이 필요하며 클러스터 CA 인증서를 신뢰해야 합니다.
  • 클라이언트 애플리케이션은 Kafka 리소스와 동일한 네임스페이스에서 실행되어야 합니다.

PKCS #12 형식 사용(.p12)

  1. 클라이언트 Pod를 정의할 때 클러스터 보안을 볼륨으로 마운트합니다.

    예를 들면 다음과 같습니다.

    kind: Pod
    apiVersion: v1
    metadata:
      name: client-pod
    spec:
      containers:
      - name: client-name
        image: client-name
        volumeMounts:
        - name: secret-volume
          mountPath: /data/p12
        env:
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: my-password
      volumes:
      - name: secret-volume
        secret:
          secretName: my-cluster-cluster-ca-cert

    여기서는 다음을 마운트하고 있습니다.

    • PKCS #12 파일을 정확한 경로로 구성 가능
    • Java 구성에 사용할 수 있는 환경 변수에 대한 암호
  2. 다음 속성을 사용하여 Kafka 클라이언트를 구성합니다.

    • 보안 프로토콜 옵션:

      • security.protocol: 암호화에 TLS를 사용하는 경우 SSL ( mTLS 인증 포함 또는 사용 안 함)입니다.
      • security.protocol: TLS를 통해 SCRAM-SHA 인증을 사용할 때 SASL_SSL 입니다.
    • 인증서를 가져온 truststore 위치를 사용하는 SSL. truststore.location.
    • truststore에 액세스하기 위한 암호가 있는 SSL. truststore.password.
    • SSL.truststore.type=PKCS12 로 신뢰 저장소 유형을 식별합니다.

PEM 형식 사용(.crt)

  1. 클라이언트 Pod를 정의할 때 클러스터 보안을 볼륨으로 마운트합니다.

    예를 들면 다음과 같습니다.

    kind: Pod
    apiVersion: v1
    metadata:
      name: client-pod
    spec:
      containers:
      - name: client-name
        image: client-name
        volumeMounts:
        - name: secret-volume
          mountPath: /data/crt
      volumes:
      - name: secret-volume
        secret:
          secretName: my-cluster-cluster-ca-cert
  2. 추출된 인증서를 사용하여 X.509 형식으로 인증서를 사용하는 클라이언트에서 TLS 연결을 구성합니다.

16.5. 클러스터 CA를 신뢰하도록 외부 클라이언트 구성

다음 절차에서는 클러스터 CA 인증서를 신뢰하기 위해 OpenShift 클러스터 외부에 있는 Kafka 클라이언트를 구성하는 방법을 설명합니다. 이전 클라이언트 CA 인증서가 교체되는 경우 클라이언트를 설정하고 갱신 기간 동안 다음 절차를 따르십시오.

단계에 따라 Java 기반 Kafka Producer, Consumer 및 Streams API에 대한 클러스터 CA에서 서명한 신뢰 인증서를 구성합니다.

클러스터 CA의 인증서 형식에 따라 수행할 단계를 선택합니다. PKCS #12 (.p12) 또는 PEM (.crt).

이 단계에서는 Kafka 클러스터의 ID를 확인하는 클러스터 시크릿에서 인증서를 가져오는 방법을 설명합니다.

중요

& lt;cluster_name> -cluster-ca-cert 시크릿에는 CA 인증서 갱신 기간 동안 두 개 이상의 CA 인증서가 포함되어 있습니다. 클라이언트는 모두 신뢰 저장소에 추가해야 합니다.

사전 요구 사항

  • Cluster Operator가 실행 중이어야 합니다.
  • OpenShift 클러스터 내에 Kafka 리소스가 있어야 합니다.
  • TLS를 사용하여 연결할 OpenShift 클러스터 외부의 Kafka 클라이언트 애플리케이션이 필요하며 클러스터 CA 인증서를 신뢰해야 합니다.

PKCS #12 형식 사용(.p12)

  1. Kafka 클러스터의 <cluster _name> -cluster-ca-cert Secret에서 클러스터 CA 인증서 및 암호를 추출합니다.

    oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12
    oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password

    & lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다.

  2. 다음 속성을 사용하여 Kafka 클라이언트를 구성합니다.

    • 보안 프로토콜 옵션:

      • security.protocol: TLS를 사용할 때 SSL 입니다.
      • security.protocol: TLS를 통해 SCRAM-SHA 인증을 사용할 때 SASL_SSL 입니다.
    • 인증서를 가져온 truststore 위치를 사용하는 SSL. truststore.location.
    • truststore에 액세스하기 위한 암호가 있는 SSL. truststore.password. truststore에 필요하지 않은 경우 이 속성을 생략할 수 있습니다.
    • SSL.truststore.type=PKCS12 로 신뢰 저장소 유형을 식별합니다.

PEM 형식 사용(.crt)

  1. Kafka 클러스터의 < cluster_name> -cluster-ca-cert 시크릿에서 클러스터 CA 인증서를 추출합니다.

    oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  2. 추출된 인증서를 사용하여 X.509 형식으로 인증서를 사용하는 클라이언트에서 TLS 연결을 구성합니다.

16.6. 자체 CA 인증서 및 개인 키 사용

Cluster Operator에서 생성한 기본값을 사용하는 대신 자체 CA 인증서 및 개인 키를 설치하고 사용합니다. 클러스터 및 클라이언트 CA 인증서 및 개인 키를 교체할 수 있습니다.

다음과 같은 방법으로 자체 CA 인증서 및 개인 키를 사용하여 전환할 수 있습니다.

  • Kafka 클러스터를 배포하기 전에 자체 CA 인증서 및 개인 키 설치
  • Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 고유한 인증서로 교체

Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 교체하는 단계는 자체 CA 인증서 및 개인 키를 갱신하는 데 사용되는 것과 동일합니다.

자체 인증서를 사용하는 경우 자동으로 갱신되지 않습니다. 만료되기 전에 CA 인증서 및 개인 키를 갱신해야 합니다.

갱신 옵션:

  • CA 인증서만 갱신
  • CA 인증서 및 개인 키 갱신(또는 기본값 교체)

16.6.1. 자체 CA 인증서 및 개인 키 설치

Cluster Operator에서 생성한 클러스터 및 클라이언트 CA 인증서 및 개인 키를 사용하는 대신 자체 CA 인증서 및 개인 키를 설치합니다.

기본적으로 Apache Kafka의 Streams는 자동으로 갱신되는 다음 클러스터 CA 및 클라이언트 CA 시크릿을 사용합니다.

  • 클러스터 CA 시크릿

    • <cluster_name>-cluster-ca
    • <cluster_name>-cluster-ca-cert
  • 클라이언트 CA 시크릿

    • <cluster_name>-clients-ca
    • <cluster_name>-clients-ca-cert

자체 인증서를 설치하려면 동일한 이름을 사용합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • Kafka 클러스터는 아직 배포되지 않았습니다.

    Kafka 클러스터를 이미 배포한 경우 기본 CA 인증서를 자체 인증서로 교체할 수 있습니다.

  • 클러스터 CA 또는 클라이언트 CA의 PEM 형식의 고유한 X.509 인증서 및 키입니다.

    • 루트 CA가 아닌 클러스터 또는 클라이언트 CA를 사용하려면 전체 체인을 인증서 파일에 포함해야 합니다. 체인은 다음 순서로 설정되어야 합니다.

      1. 클러스터 또는 클라이언트 CA
      2. 하나 이상의 중간 CA
      3. 루트 CA
    • 체인의 모든 CA는 X509v3 기본 제약 조건 확장을 사용하여 구성해야 합니다. 기본 제한 조건은 인증서 체인의 경로 길이를 제한합니다.
  • 인증서를 변환하는 OpenSSL TLS 관리 툴입니다.

사전 준비 사항

Cluster Operator는 PEM(Privacy Enhanced Mail) 및 PKCS #12(Public-Key Cryptography Standards) 형식으로 키와 인증서를 생성합니다. 두 형식 중 하나로 자체 인증서를 추가할 수 있습니다.

일부 애플리케이션은 PEM 인증서를 사용할 수 없으며 PKCS #12 인증서만 지원합니다. PKCS #12 형식의 클러스터 인증서가 없는 경우 OpenSSL TLS 관리 툴을 사용하여 ca.crt 파일에서 하나를 생성합니다.

certificate generation 명령 예

openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt

<P12_password>를 고유한 암호로 바꿉니다.

프로세스

  1. CA 인증서가 포함된 새 보안을 생성합니다.

    PEM 형식의 인증서가 있는 클라이언트 보안 생성

    oc create secret generic <cluster_name>-clients-ca-cert --from-file=ca.crt=ca.crt

    PEM 및 PKCS #12 형식의 인증서로 클러스터 시크릿 생성

    oc create secret generic <cluster_name>-cluster-ca-cert \
      --from-file=ca.crt=ca.crt \
      --from-file=ca.p12=ca.p12 \
      --from-literal=ca.password=P12-PASSWORD

    <cluster_name>을 Kafka 클러스터 이름으로 바꿉니다.

  2. 개인 키가 포함된 새 보안을 생성합니다.

    oc create secret generic <ca_key_secret> --from-file=ca.key=ca.key
  3. 보안에 레이블을 지정합니다.

    oc label secret <ca_certificate_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"
    oc label secret <ca_key_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"
    • strimzi.io/kind=Kafka 레이블은 Kafka 사용자 정의 리소스를 식별합니다.
    • strimzi.io/cluster="<cluster_name>" 레이블은 Kafka 클러스터를 식별합니다.
  4. 보안 주석

    oc annotate secret <ca_certificate_secret> strimzi.io/ca-cert-generation="<ca_certificate_generation>"
    oc annotate secret <ca_key_secret> strimzi.io/ca-key-generation="<ca_key_generation>"
    • 주석 strimzi.io/ca-cert-generation="<ca_certificate_generation>" 은 새 CA 인증서 생성을 정의합니다.
    • 주석 strimzi.io/ca-key-generation="<ca_key_generation>" 은 새 CA 키 생성을 정의합니다.

      0(zero)에서 자체 CA 인증서에 대한 증분 값(stimzi.io/ca-cert-generation=0)으로 시작합니다. 인증서를 갱신할 때 더 높은 증분 값을 설정합니다.

  5. 생성된 CA를 사용하지 않도록 Kafka.spec.clusterCa 또는 Kafka.spec.clientsCa 오브젝트를 구성하여 클러스터에 대한 Kafka 리소스를 생성합니다.

    사용자가 제공한 인증서를 사용하도록 클러스터 CA를 구성하는 조각 모음 Kafka 리소스의 예

    kind: Kafka
    version: kafka.strimzi.io/v1beta2
    spec:
      # ...
      clusterCa:
        generateCertificateAuthority: false

16.6.2. 자체 CA 인증서 갱신

자체 CA 인증서를 사용하는 경우 수동으로 업데이트해야 합니다. Cluster Operator는 자동으로 갱신되지 않습니다. 갱신 기간이 만료되기 전에 CA 인증서를 갱신합니다.

CA 인증서를 갱신하고 동일한 개인 키를 계속 사용하는 경우 이 절차의 단계를 수행합니다. 자체 CA 인증서 개인 키를 갱신하는 경우 16.6.3절. “CA 인증서 및 개인 키 갱신 또는 교체” 을 참조하십시오.

이 절차에서는 PEM 형식의 CA 인증서 갱신을 설명합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • PEM 형식의 새 클러스터 또는 클라이언트 X.509 인증서가 있습니다.

프로세스

  1. CA 인증서의 시크릿 을 업데이트합니다.

    기존 보안을 편집하여 새 CA 인증서를 추가하고 인증서 생성 주석 값을 업데이트합니다.

    oc edit secret <ca_certificate_secret_name>

    < ca_certificate_secret_name >은 시크릿 의 이름입니다. 이 이름은 클러스터 CA 인증서의 경우 < kafka_cluster_name> -cluster-ca-cert 이고 클라이언트 CA 인증서에 대한 <kafka_cluster_name> -clients-ca-cert 입니다.

    다음 예제에서는 my-cluster 라는 Kafka 클러스터와 연결된 클러스터 CA 인증서의 보안을 보여줍니다.

    클러스터 CA 인증서에 대한 보안 구성의 예

    apiVersion: v1
    kind: Secret
    data:
      ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... 
    1
    
    metadata:
      annotations:
        strimzi.io/ca-cert-generation: "0" 
    2
    
      labels:
        strimzi.io/cluster: my-cluster
        strimzi.io/kind: Kafka
      name: my-cluster-cluster-ca-cert
      #...
    type: Opaque

    1
    현재 base64로 인코딩된 CA 인증서
    2
    현재 CA 인증서 생성 주석 값
  2. 새 CA 인증서를 base64로 인코딩합니다.

    cat <path_to_new_certificate> | base64
  3. CA 인증서를 업데이트합니다.

    이전 단계에서 base64로 인코딩된 CA 인증서를 data 아래의 ca.crt 속성 값으로 복사합니다.

  4. CA 인증서 생성 주석의 값을 늘립니다.

    strimzi.io/ca-cert-generation 주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어 strimzi.io/ca-cert-generation=0strimzi.io/ca-cert-generation=1 으로 변경합니다. 보안에 주석이 없는 경우 값은 0 으로 처리되므로 값이 1 인 주석을 추가합니다.

    Apache Kafka용 Streams가 인증서를 생성하면 Cluster Operator에 의해 인증서 생성 주석이 자동으로 증가합니다. 자체 CA 인증서의 경우 더 높은 증분 값으로 주석을 설정합니다. 이 주석에는 Cluster Operator가 Pod를 롤아웃하고 인증서를 업데이트할 수 있도록 현재 보안의 값보다 높은 값이 필요합니다. strimzi.io/ca-cert-generation 는 각 CA 인증서 갱신에 따라 증가해야 합니다.

  5. 새 CA 인증서 및 인증서 생성 주석 값을 사용하여 보안을 저장합니다.

    새 CA 인증서로 업데이트된 보안 구성의 예

    apiVersion: v1
    kind: Secret
    data:
      ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... 
    1
    
    metadata:
      annotations:
        strimzi.io/ca-cert-generation: "1" 
    2
    
      labels:
        strimzi.io/cluster: my-cluster
        strimzi.io/kind: Kafka
      name: my-cluster-cluster-ca-cert
      #...
    type: Opaque

    1
    새로운 base64로 인코딩된 CA 인증서
    2
    새 CA 인증서 생성 주석 값

다음 조정에서 Cluster Operator는 새 CA 인증서를 신뢰하기 위해 Zoo Cryostat, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행합니다.

유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 기간 기간 내에 첫 번째 조정 시 Pod를 롤아웃합니다.

16.6.3. CA 인증서 및 개인 키 갱신 또는 교체

자체 CA 인증서 및 개인 키를 사용하는 경우 수동으로 갱신해야 합니다. Cluster Operator는 자동으로 갱신되지 않습니다. 갱신 기간이 만료되기 전에 CA 인증서를 갱신합니다. 동일한 절차를 사용하여 Apache Kafka Operator의 Streams에서 생성한 CA 인증서 및 개인 키를 자체 교체할 수도 있습니다.

CA 인증서 및 개인 키를 갱신하거나 교체할 때 이 절차의 단계를 수행합니다. 자체 CA 인증서만 갱신하는 경우 16.6.2절. “자체 CA 인증서 갱신” 을 참조하십시오.

이 절차에서는 PEM 형식의 CA 인증서 및 개인 키 갱신을 설명합니다.

다음 단계를 수행하기 전에 새 CA 인증서의 CN(Common Name)이 현재 CA 인증서와 다른지 확인합니다. 예를 들어 Cluster Operator에서 인증서를 자동으로 갱신하면 v<version_number > 접미사가 추가되어 버전을 확인합니다. 갱신마다 다른 접미사를 추가하여 자체 CA 인증서로 동일한 작업을 수행합니다. 다른 키를 사용하여 새 CA 인증서를 생성하면 Secret 에 저장된 현재 CA 인증서가 유지됩니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • PEM 형식의 새 클러스터 또는 클라이언트 X.509 인증서 및 키가 있습니다.

프로세스

  1. Kafka 사용자 정의 리소스의 조정을 일시 중지합니다.

    1. OpenShift에서 사용자 정의 리소스에 주석을 달고 pause-reconciliation 주석을 true 로 설정합니다.

      oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="true"

      예를 들어 이름이 my-clusterKafka 사용자 정의 리소스의 경우 다음과 같습니다.

      oc annotate Kafka my-cluster strimzi.io/pause-reconciliation="true"
    2. 사용자 정의 리소스의 상태 조건에 ReconciliationPaused: 변경 사항이 표시되는지 확인합니다.

      oc describe Kafka <name_of_custom_resource>

      유형 조건은 lastTransitionTime 에서 ReconciliationPaused 로 변경됩니다.

  2. Kafka 사용자 정의 리소스의 generateCertificateAuthority 속성 설정을 확인합니다.

    속성이 false 로 설정된 경우 Cluster Operator에 의해 CA 인증서가 생성되지 않습니다. 자체 인증서를 사용하는 경우 이 설정이 필요합니다.

  3. 필요한 경우 기존 Kafka 사용자 정의 리소스를 편집하고 generateCertificateAuthority 속성을 false 로 설정합니다.

    oc edit Kafka <name_of_custom_resource>

    다음 예제에서는 사용자에게 위임된 클러스터 및 클라이언트 CA 인증서 생성이 모두 있는 Kafka 사용자 정의 리소스를 보여줍니다.

    자체 CA 인증서를 사용하는 Kafka 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    # ...
    spec:
    # ...
      clusterCa:
        generateCertificateAuthority: false 
    1
    
      clientsCa:
        generateCertificateAuthority: false 
    2
    
    # ...

    1
    자체 클러스터 CA 사용
    2
    자체 클라이언트 CA 사용
  4. CA 인증서의 시크릿 을 업데이트합니다.

    1. 기존 보안을 편집하여 새 CA 인증서를 추가하고 인증서 생성 주석 값을 업데이트합니다.

      oc edit secret <ca_certificate_secret_name>

      <ca_certificate_secret_name>은 시크릿 의 이름입니다. 이 이름은 클러스터 CA 인증서의 경우 < kafka_cluster_name>-cluster-ca-cert 이고 클라이언트 CA 인증서에 대한 <kafka_cluster_name>-clients-ca-cert 입니다.

      다음 예제에서는 my-cluster 라는 Kafka 클러스터와 연결된 클러스터 CA 인증서의 보안을 보여줍니다.

      클러스터 CA 인증서에 대한 보안 구성의 예

      apiVersion: v1
      kind: Secret
      data:
        ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... 
      1
      
      metadata:
        annotations:
          strimzi.io/ca-cert-generation: "0" 
      2
      
        labels:
          strimzi.io/cluster: my-cluster
          strimzi.io/kind: Kafka
        name: my-cluster-cluster-ca-cert
        #...
      type: Opaque

      1
      현재 base64로 인코딩된 CA 인증서
      2
      현재 CA 인증서 생성 주석 값
    2. 현재 CA 인증서의 이름을 변경하여 유지합니다.

      data 아래의 현재 ca.crt 속성의 이름을 ca-<date>.crt 로 변경합니다. 여기서 <date>는 YEAR-MONTH-DAYTHOUR-MINUTE-SECONDZ 형식의 인증서 만료 날짜입니다. 예: ca-2023-01-26T17-32-00Z.crt:. 현재 CA 인증서를 유지하기 위해 속성 값을 그대로 둡니다.

    3. 새 CA 인증서를 base64로 인코딩합니다.

      cat <path_to_new_certificate> | base64
    4. CA 인증서를 업데이트합니다.

      data 아래에 새 ca.crt 속성을 생성하고 이전 단계에서 base64로 인코딩된 CA 인증서를 ca.crt 속성 값으로 복사합니다.

    5. CA 인증서 생성 주석의 값을 늘립니다.

      strimzi.io/ca-cert-generation 주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어 strimzi.io/ca-cert-generation=0strimzi.io/ca-cert-generation=1 으로 변경합니다. 보안에 주석이 없는 경우 값은 0 으로 처리되므로 값이 1 인 주석을 추가합니다.

      Apache Kafka용 Streams가 인증서를 생성하면 Cluster Operator에 의해 인증서 생성 주석이 자동으로 증가합니다. 자체 CA 인증서의 경우 더 높은 증분 값으로 주석을 설정합니다. 이 주석에는 Cluster Operator가 Pod를 롤아웃하고 인증서를 업데이트할 수 있도록 현재 보안의 값보다 높은 값이 필요합니다. strimzi.io/ca-cert-generation 는 각 CA 인증서 갱신에 따라 증가해야 합니다.

    6. 새 CA 인증서 및 인증서 생성 주석 값을 사용하여 보안을 저장합니다.

      새 CA 인증서로 업데이트된 보안 구성의 예

      apiVersion: v1
      kind: Secret
      data:
        ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... 
      1
      
        ca-2023-01-26T17-32-00Z.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... 
      2
      
      metadata:
        annotations:
          strimzi.io/ca-cert-generation: "1" 
      3
      
        labels:
          strimzi.io/cluster: my-cluster
          strimzi.io/kind: Kafka
        name: my-cluster-cluster-ca-cert
        #...
      type: Opaque

      1
      새로운 base64로 인코딩된 CA 인증서
      2
      이전 base64로 인코딩된 CA 인증서
      3
      새 CA 인증서 생성 주석 값
  5. 새 CA 인증서에 서명하는 데 사용되는 CA 키의 시크릿 을 업데이트합니다.

    1. 기존 보안을 편집하여 새 CA 키를 추가하고 키 생성 주석 값을 업데이트합니다.

      oc edit secret <ca_key_name>

      <ca_key_name>은 CA 키의 이름입니다. 클러스터 CA 키의 경우 < kafka_cluster_name>-cluster-ca, 클라이언트 CA 키의 경우 < kafka_cluster_name>-clients-ca 입니다.

      다음 예제에서는 my-cluster 라는 Kafka 클러스터와 연결된 클러스터 CA 키의 시크릿을 보여줍니다.

      클러스터 CA 키의 시크릿 구성 예

      apiVersion: v1
      kind: Secret
      data:
        ca.key: SA1cKF1GFDzOIiPOIUQBHDNFGDFS... 
      1
      
      metadata:
        annotations:
          strimzi.io/ca-key-generation: "0" 
      2
      
        labels:
          strimzi.io/cluster: my-cluster
          strimzi.io/kind: Kafka
        name: my-cluster-cluster-ca
        #...
      type: Opaque

      1
      현재 base64로 인코딩된 CA 키
      2
      현재 CA 키 생성 주석 값
    2. CA 키를 base64로 인코딩합니다.

      cat <path_to_new_key> | base64
    3. CA 키를 업데이트합니다.

      이전 단계에서 base64로 인코딩된 CA 키를 data 아래의 ca.key 속성 값으로 복사합니다.

    4. CA 키 생성 주석의 값을 늘립니다.

      strimzi.io/ca-key-generation 주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어 strimzi.io/ca-key-generation=0strimzi.io/ca-key-generation=1 으로 변경합니다. 보안에 주석이 없는 경우 0 으로 처리되므로 값이 1 인 주석을 추가합니다.

      Apache Kafka용 Streams가 인증서를 생성하면 Cluster Operator에 의해 키 생성 주석이 자동으로 증가합니다. 자체 CA 인증서와 새 CA 키의 경우 주석을 더 높은 증분 값으로 설정합니다. 이 주석에는 Cluster Operator가 Pod를 롤아웃하고 인증서 및 키를 업데이트할 수 있도록 현재 보안의 값보다 높은 값이 필요합니다. strimzi.io/ca-key-generation 는 각 CA 인증서 갱신에 따라 증가해야 합니다.

    5. 새 CA 키 및 키 생성 주석 값을 사용하여 시크릿을 저장합니다.

      새 CA 키로 업데이트된 보안 구성의 예

      apiVersion: v1
      kind: Secret
      data:
        ca.key: AB0cKF1GFDzOIiPOIUQWERZJQ0F... 
      1
      
      metadata:
        annotations:
          strimzi.io/ca-key-generation: "1" 
      2
      
        labels:
          strimzi.io/cluster: my-cluster
          strimzi.io/kind: Kafka
        name: my-cluster-cluster-ca
        #...
      type: Opaque

      1
      새로운 base64로 인코딩된 CA 키
      2
      새 CA 키 생성 주석 값
  6. 일시 중지에서 다시 시작합니다.

    Kafka 사용자 정의 리소스 조정을 다시 시작하려면 pause-reconciliation 주석을 false 로 설정합니다.

    oc annotate --overwrite Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="false"

    pause-reconciliation 주석을 제거하여 동일한 작업을 수행할 수도 있습니다.

    oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation-

    다음 조정에서 Cluster Operator는 새 CA 인증서를 신뢰하기 위해 Zoo Cryostat, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행합니다. 롤링 업데이트가 완료되면 Cluster Operator가 새 CA 키로 서명한 새 서버 인증서를 생성하기 위해 새 업데이트를 시작합니다.

    유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 기간 기간 내에 첫 번째 조정 시 Pod를 롤아웃합니다.

  7. 롤링 업데이트가 새 CA 인증서로 이동할 때까지 기다립니다.
  8. 보안 구성에서 오래된 인증서를 제거하여 클러스터가 더 이상 신뢰하지 않도록 합니다.

    oc edit secret <ca_certificate_secret_name>

    이전 인증서가 제거된 보안 구성의 예

    apiVersion: v1
    kind: Secret
    data:
      ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F...
    metadata:
      annotations:
        strimzi.io/ca-cert-generation: "1"
      labels:
        strimzi.io/cluster: my-cluster
        strimzi.io/kind: Kafka
      name: my-cluster-cluster-ca-cert
      #...
    type: Opaque

  9. 클러스터의 수동 롤링 업데이트를 시작하여 시크릿 구성에 대한 변경 사항을 가져옵니다.

    29.2절. “주석을 사용하여 Kafka 및 기타 피연산자의 롤링 업데이트 시작”을 참조하십시오.

17장. Apache Kafka Pod 및 컨테이너의 Streams에 보안 컨텍스트 적용

보안 컨텍스트는 포드 및 컨테이너에 대한 제약 조건을 정의합니다. 보안 컨텍스트를 지정하면 Pod 및 컨테이너에는 필요한 권한만 있습니다. 예를 들어 권한은 런타임 작업을 제어하거나 리소스에 대한 액세스를 제어할 수 있습니다.

17.1. OpenShift 플랫폼의 보안 컨텍스트 처리

보안 컨텍스트 처리는 사용 중인 OpenShift 플랫폼의 툴링에 따라 다릅니다.

예를 들어 OpenShift는 기본 제공 SCC(보안 컨텍스트 제약 조건)를 사용하여 권한을 제어합니다. SCC는 Pod에서 액세스할 수 있는 보안 기능을 제어하는 설정 및 전략입니다.

기본적으로 OpenShift는 보안 컨텍스트 구성을 자동으로 삽입합니다. 대부분의 경우 Cluster Operator가 생성한 Pod 및 컨테이너에 대한 보안 컨텍스트를 구성할 필요가 없습니다. 여전히 자체 SCC를 생성하고 관리할 수 있습니다.

자세한 내용은 OpenShift 설명서 를 참조하십시오.

18장. 브로커 추가 또는 제거를 통해 클러스터 스케일링

브로커를 추가하여 Kafka 클러스터를 확장하면 클러스터의 성능과 안정성을 높일 수 있습니다. 브로커를 더 많이 추가하면 사용 가능한 리소스가 증가하여 클러스터가 더 큰 워크로드를 처리하고 더 많은 메시지를 처리할 수 있습니다. 또한 더 많은 복제본 및 백업을 제공하여 내결함성을 향상시킬 수 있습니다. 반대로 활용도가 낮은 브로커를 제거하면 리소스 소비를 줄이고 효율성을 향상시킬 수 있습니다. 중단이나 데이터 손실을 방지하려면 스케일링을 신중하게 수행해야 합니다. 클러스터의 모든 브로커에 파티션을 재배포하면 각 브로커의 리소스 사용량이 줄어들어 클러스터의 전체 처리량이 증가할 수 있습니다.

참고

Kafka 주제의 처리량을 높이기 위해 해당 항목의 파티션 수를 늘릴 수 있습니다. 이를 통해 클러스터의 여러 브로커 간에 주제의 부하를 공유할 수 있습니다. 그러나 모든 브로커가 특정 리소스(예: I/O)에 의해 제한되는 경우 파티션을 더 추가하면 처리량이 증가되지 않습니다. 이 경우 클러스터에 브로커를 더 추가해야 합니다.

Kafka.spec.kafka.replicas 구성을 조정하면 복제본 역할을 하는 클러스터의 브로커 수에 영향을 미칩니다. 주제의 실제 복제 요소는 default.replication.factormin.insync.replicas 의 설정과 사용 가능한 브로커 수에 따라 결정됩니다. 예를 들어 3의 복제 요소는 주제의 각 파티션이 세 브로커에 복제되어 브로커가 실패할 경우 내결함성을 보장합니다.

복제본 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    replicas: 3
    # ...
  config:
      # ...
      default.replication.factor: 3
      min.insync.replicas: 2
 # ...

Kafka 리소스 구성을 통해 브로커를 추가할 때 노드 ID는 0(영)에서 시작되고 Cluster Operator는 가장 낮은 ID를 새 노드에 할당합니다. 브로커 제거 프로세스는 클러스터에서 가장 높은 ID가 있는 브로커 Pod에서 시작됩니다.

노드 풀을 사용하여 클러스터에서 노드를 관리하는 경우 KafkaNodePool.spec.replicas 구성을 조정하여 노드 풀의 노드 수를 변경합니다. 또한 노드 풀을 사용하여 기존 클러스터를 확장할 때 확장 작업에 노드 ID를 할당 할 수 있습니다.

브로커를 추가하거나 제거하면 Kafka가 자동으로 파티션을 다시 할당하지 않습니다. 가장 좋은 방법은 Cruise Control을 사용하는 것입니다. 클러스터를 확장하거나 축소할 때 Cruise Control의 add-brokersremove-brokers 모드를 사용할 수 있습니다.

  • Kafka 클러스터를 확장한 후 기존 브로커에서 새로 추가된 브로커로 파티션 복제본을 이동한 후 add-brokers 모드를 사용합니다.
  • Kafka 클러스터를 축소하기 전에 제거하려는 브로커에서 파티션 복제본을 이동하기 전에 remove-brokers 모드를 사용합니다.

18.1. 스케일 다운 작업에서 검사 건너뛰기

기본적으로 Apache Kafka용 Streams는 Kafka 클러스터에서 스케일링 다운 작업을 시작하기 전에 브로커에 파티션 복제본이 없는지 확인하기 위해 검사를 수행합니다. 점검은 브로커의 역할 또는 브로커 및 컨트롤러의 이중 역할을 수행하는 노드 풀의 노드에 적용됩니다.

복제본이 발견되면 잠재적인 데이터 손실을 방지하기 위해 스케일 다운이 수행되지 않습니다. 클러스터를 확장하려면 다시 축소하기 전에 브로커에 복제본을 남겨 두지 않아야 합니다.

그러나 이 메커니즘을 우회하려는 시나리오가 있을 수 있습니다. 예를 들어 새 주제가 브로커의 복제본을 계속 생성하기 때문에 사용 중인 클러스터에 검사를 비활성화해야 할 수 있습니다. 이 상황은 브로커가 거의 비어 있어도 축소를 무기한 차단할 수 있습니다. 이러한 방식으로 차단 메커니즘을 재정의하면 영향을 받습니다. 브로커에 축소되는 항목이 있으면 Kafka 클러스터에 대한 조정 실패가 발생할 수 있습니다.

Kafka 클러스터의 Kafka 리소스에 주석을 달아 차단 메커니즘을 바이패스할 수 있습니다. strimzi.io/skip-broker-scaledown-check 주석을 true 로 설정하여 리소스에 주석을 답니다.

스케일 다운 작업에서 검사를 건너뛸 주석 추가

oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check="true"

이 주석은 Apache Kafka의 Streams가 스케일 다운 검사를 건너뛰도록 지시합니다. my-kafka-cluster 를 특정 Kafka 리소스의 이름으로 교체합니다.

축소 작업 검사를 복원하려면 주석을 제거합니다.

스케일 다운 작업에서 검사를 건너뛸 주석 제거

oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check-

19장. Cruise Control을 사용하여 클러스터 재조정

cruise Control은 다음 Kafka 작업을 지원하는 오픈 소스 시스템입니다.

  • 클러스터 워크로드 모니터링
  • 사전 정의된 제약 조건을 기반으로 클러스터 재조정

이 작업은 브로커 Pod를 보다 효율적으로 사용하는 균형 있는 Kafka 클러스터를 실행하는 데 도움이 됩니다.

일반적인 클러스터는 시간이 지남에 따라 균등하게 로드할 수 있습니다. 대량의 메시지 트래픽을 처리하는 파티션은 사용 가능한 브로커에 균등하게 분산되지 않을 수 있습니다. 클러스터를 재조정하려면 관리자가 브로커의 부하를 모니터링하고 사용 중인 파티션을 예비 용량이 있는 브로커에 수동으로 다시 할당해야 합니다.

cruise Control은 클러스터 재조정 프로세스를 자동화합니다. CPU, 디스크 및 네트워크 로드를 기반으로 클러스터에 대한 리소스 사용률의 워크로드 모델을 구성하고, 분산 파티션 할당을 위해 최적화 제안(승인 또는 거부할 수 있음)을 생성합니다. 구성 가능한 최적화 목표 세트가 이러한 제안을 계산하는 데 사용됩니다.

특정 모드에서 최적화 제안을 생성할 수 있습니다. 기본 전체 모드는 모든 브로커에서 파티션을 재조정합니다. add-brokersremove-brokers 모드를 사용하여 클러스터를 확장하거나 축소할 때 변경 사항을 적용할 수도 있습니다.

최적화 제안을 승인하면 Cruise Control이 Kafka 클러스터에 적용합니다. KafkaRebalance 리소스를 사용하여 최적화 제안을 구성하고 생성합니다. 최적화 제안이 자동으로 또는 수동으로 승인되도록 주석을 사용하여 리소스를 구성할 수 있습니다.

참고

Apache Kafka용 스트림은 Cruise Control에 대한 구성 파일 예제 를 제공합니다.

19.1. 크루즈 컨트롤 구성 요소 및 기능

크루즈 컨트롤은 로드 모니터, Analyzer, Anomaly Detector 및 Executor-및 클라이언트 상호 작용을 위한 REST API 등 네 가지 주요 구성 요소로 구성됩니다. Apache Kafka의 스트림은 REST API를 사용하여 다음 Cruise Control 기능을 지원합니다.

  • 최적화 목표에서 최적화 제안을 생성합니다.
  • 최적화 제안을 기반으로 Kafka 클러스터 재조정.
최적화 목표

최적화 목표는 리밸런스에서 달성하기위한 특정 목표를 설명합니다. 예를 들어 목표는 브로커 간에 주제 복제본을 보다 균등하게 배포하는 것입니다. 구성을 통해 포함할 목표를 변경할 수 있습니다. 목표는 하드 목표 또는 소프트 목표로 정의됩니다. Cruise Control 배포 구성을 통해 하드 목표를 추가할 수 있습니다. 또한 이러한 각 카테고리에 적합한 기본, 기본값 및 사용자 제공 목표를 가지고 있습니다.

  • 하드 목표는 사전 설정되었으며 성공적인 최적화 제안에 충족해야 합니다.
  • 최적화 제안이 성공하려면 소프트 목표를 충족할 필요가 없습니다. 모든 어려운 목표를 달성하는 경우 별도로 설정할 수 있습니다.
  • 주요 목표는 Cruise Control에서 상속됩니다. 일부는 어려운 목표로 구성되어 있습니다. 주요 목표는 기본적으로 최적화 제안에 사용됩니다.
  • 기본 목표는 기본적으로 기본 목표와 동일합니다. 자체 기본 목표 세트를 지정할 수 있습니다.
  • 사용자 제공 목표는 특정 최적화 제안을 생성하도록 구성된 기본 목표의 하위 집합입니다.
최적화 제안

최적화 제안은 재조정에서 달성하려는 목표를 포함합니다. 제안된 변경 사항에 대한 요약과 리밸런스로 가능한 결과를 생성하기 위한 최적화 제안을 생성합니다. 목표는 특정 우선 순위 순서로 평가됩니다. 그런 다음 제안서를 승인하거나 거부하도록 선택할 수 있습니다. 조정된 목표 세트로 다시 실행하려는 제안을 거부할 수 있습니다.

세 가지 모드 중 하나로 최적화 제안을 생성할 수 있습니다.

  • full 은 기본 모드이며 전체 리밸런스를 실행합니다.
  • add-brokers 는 Kafka 클러스터를 확장할 때 브로커를 추가한 후 사용하는 모드입니다.
  • remove-brokers 는 Kafka 클러스터를 축소할 때 브로커를 제거하기 전에 사용하는 모드입니다.

다른 Cruise Control 기능은 현재 자체 교복, 알림, 쓰기 사용자 지정 목표, 주제 복제 요인 변경 등 현재 지원되지 않습니다.

19.2. 최적화 목표 개요

최적화 목표는 Kafka 클러스터의 워크로드 재배포 및 리소스 사용률에 대한 제약입니다. Kafka 클러스터를 재조정하기 위해 Cruise Control은 최적화 목표를 사용하여 승인 또는 거부할 수 있는 최적화 제안을 생성합니다.

19.2.1. 우선 순위의 목표 순서

Apache Kafka의 스트림은 Cruise Control 프로젝트에서 개발된 대부분의 최적화 목표를 지원합니다. 지원되는 목표는 기본 우선순위 내림차순으로 다음과 같습니다.

  1. Rack-awareness
  2. 주제 집합의 브로커당 최소 리더 복제본 수
  3. 복제본 용량
  4. 용량 목표

    • 디스크 용량
    • 네트워크 인바운드 용량
    • 네트워크 아웃 바운드 용량
    • CPU 용량
  5. 복제본 배포
  6. 잠재적인 네트워크 출력
  7. 리소스 배포 목표

    • 디스크 사용률 배포
    • 네트워크 인바운드 사용률 배포
    • 네트워크 아웃 바운드 사용률 배포
    • CPU 사용률 배포
  8. Leader bytes-in rate distribution
  9. 주제 복제본 배포
  10. 리더 복제본 배포
  11. 선호하는 리더 선택
  12. Intra-broker 디스크 용량
  13. Intra-broker 디스크 사용 배포

각 최적화 목표에 대한 자세한 내용은 Cruise Control Wiki의 목표를 참조하십시오.

참고

"자신의 쓰기" 목표와 Kafka 할당자 목표는 아직 지원되지 않습니다.

19.2.2. Apache Kafka 사용자 정의 리소스에 대한 Streams의 목표 구성

KafkaKafkaRebalance 사용자 정의 리소스에서 최적화 목표를 구성합니다. 크루즈 컨트롤에는 주요, 기본값 및 사용자 제공 최적화 목표를 충족해야 하는 하드 최적화 목표에 대한 구성이 있습니다.

다음 구성에서 최적화 목표를 지정할 수 있습니다.

  • 주요 목적 Cryostat- Kafka.spec.cruiseControl.config.goals
  • 하드 목적 Cryostat- Kafka.spec.cruiseControl.config.hard.goals
  • 기본 목적 Cryostat- Kafka.spec.cruiseControl.config.default.goals
  • 사용자 제공 목표 Cryo stat- KafkaRebalance.spec.goals
참고

리소스 배포 목표는 브로커 리소스에 대한 용량 제한 의 적용을 받습니다.

19.2.3. 하드 및 소프트 최적화 목표

하드 목표는 최적화 제안에 충족해야 하는 목표입니다. Cruise Control 코드에서 하드 목표로 정의되지 않은 목표는 소프트 목표 라고 합니다. 소프트 목표는 최선의 노력 목표로 생각할 수 있습니다: 최적화 제안에 만족 할 필요는 없지만 최적화 계산에 포함됩니다. 하나 이상의 소프트 목표를 위반하지만 모든 하드 목표를 충족하는 최적화 제안은 유효합니다.

크루즈 컨트롤은 가능한 한 많은 하드 목표와 가능한 많은 소프트 목표를 충족하는 최적화 제안을 계산합니다. 모든 하드 목표를 충족하지 않는 최적화 제안은 Cruise Control에 의해 거부되고 승인을 위해 사용자에게 전송되지 않습니다.

참고

예를 들어 클러스터에 주제의 복제본을 균등하게 분배하는 소프트 목표를 가질 수 있습니다(복제 복제본 배포 목표 참조). 크루즈 컨트롤은 구성된 모든 하드 목표를 달성할 수 있도록 하는 경우 이 목표를 무시합니다.

Cruise Control에서 다음과 같은 주요 최적화 목표는 어려운 목표입니다.

RackAwareGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal

Cruise Control 배포 구성에서 Kafka.spec.cruiseControl.confighard.goals 속성을 사용하여 적용할 하드 목표를 지정할 수 있습니다.

  • 모든 하드 목표를 강제 실행하려면 hard.goals 속성을 생략하면 됩니다.
  • Cruise Control이 적용하는 하드 목표를 변경하려면 정규화된 도메인 이름을 사용하여 hard.goals 속성에 필요한 목표를 지정합니다.
  • 특정 하드 목표를 실행하지 못하도록 목표는 default.goalshard.goals 목록 구성 둘 다에 포함되지 않아야 합니다.
참고

소프트 또는 하드 목표로 간주되는 목표를 구성할 수 없습니다. 이러한 차이점은 크루즈 제어 코드에 의해 결정됩니다.

하드 최적화 목표에 대한 Kafka 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
  zookeeper:
    # ...
  entityOperator:
    topicOperator: {}
    userOperator: {}
  cruiseControl:
    brokerCapacity:
      inboundNetwork: 10000KB/s
      outboundNetwork: 10000KB/s
    config:
      # Note that `default.goals` (superset) must also include all `hard.goals` (subset)
      default.goals: >
        com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal,
        com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal
      hard.goals: >
        com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal,
        com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal
      # ...

구성된 하드 목표 수를 늘리면 Cruise Control이 유효한 최적화 제안을 생성할 가능성을 줄일 수 있습니다.

skipHardGoalCheck: trueKafkaRebalance 사용자 정의 리소스에 지정된 경우 Cruise Control은 사용자 제공 최적화 목표 목록( KafkaRebalance.spec.goals)에 구성된 모든 하드 목표(hard.goals)가 포함되어 있는지 확인하지 않습니다. 따라서 사용자 제공 최적화 목표의 일부만 hard.goals 목록에 있는 경우 Cruise Control은 skipHardGoalCheck: true 가 지정된 경우에도 여전히 하드 목표로 처리합니다.

19.2.4. 주요 최적화 목표

주요 최적화 목표는 모든 사용자가 사용할 수 있습니다. 주요 최적화 목표에 나열되지 않은 목표는 Cruise Control 작업에서 사용할 수 없습니다.

Cruise Control 배포 구성 을 변경하지 않는 한, Apache Kafka의 Streams는 Cruise Control의 다음과 같은 기본 최적화 목표를 내림차순으로 상속합니다.

RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal

이러한 목표 중 일부는 하드 목표로 사전 설정되어 있습니다.

복잡성을 줄이려면 KafkaRebalance 리소스에서 하나 이상의 목표를 완전히 제외할 필요가 없는 상속된 기본 최적화 목표를 사용하는 것이 좋습니다. 기본 최적화 목표의 우선 순위 순서는 필요한 경우 기본 최적화 목표에 대한 구성에서 수정할 수 있습니다.

필요한 경우 Cruise Control 배포 구성에서 기본 최적화 목표를 구성합니다. Kafka.spec.cruiseControl.config.goals

  • 상속된 주요 최적화 목표를 수락하려면 Kafka.spec.cruiseControl.config 에서 goals 속성을 지정하지 마십시오.
  • 상속된 기본 최적화 목표를 수정해야 하는 경우 목표 목록을 대상 구성 옵션에 내림차순으로 지정합니다.
참고

최적화 제안을 생성할 때 오류를 방지하려면 Kafka.spec.cruiseControl.config목표 또는 default.goals 에 대한 변경 사항이 hard.goals 속성에 지정된 모든 하드 목표를 포함해야 합니다. 명확히 하려면 주요 최적화 목표 및 기본 목표에 대해 (하위 세트로) 하드 목표를 지정해야 합니다.

19.2.5. 기본 최적화 목표

cruise Control은 기본 최적화 목표를 사용하여 캐시된 최적화 제안을 생성합니다. 캐시된 최적화 제안에 대한 자세한 내용은 19.3절. “최적화 제안 개요” 을 참조하십시오.

KafkaRebalance 사용자 정의 리소스에서 사용자 제공 최적화 목표를 설정하여 기본 최적화 목표를 덮어쓸 수 있습니다.

Cruise Control 배포 구성에 default.goals 를 지정하지 않는 한 주요 최적화 목표는 기본 최적화 목표로 사용됩니다. 이 경우 캐시된 최적화 제안은 주요 최적화 목표를 사용하여 생성됩니다.

  • 기본 최적화 목표를 기본 목표로 사용하려면 Kafka.spec.cruiseControl.configdefault.goals 속성을 지정하지 마십시오.
  • 기본 최적화 목표를 수정하려면 Kafka.spec.cruiseControl.config 에서 default.goals 속성을 편집합니다. 주요 최적화 목표의 하위 집합을 사용해야 합니다.

기본 최적화 목표에 대한 Kafka 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
  zookeeper:
    # ...
  entityOperator:
    topicOperator: {}
    userOperator: {}
  cruiseControl:
    brokerCapacity:
      inboundNetwork: 10000KB/s
      outboundNetwork: 10000KB/s
    config:
      # Note that `default.goals` (superset) must also include all `hard.goals` (subset)
      default.goals: >
        com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal,
        com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal,
        com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal
      hard.goals: >
        com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal
      # ...

기본 최적화 목표를 지정하지 않으면 기본 최적화 목표를 사용하여 캐시된 제안서가 생성됩니다.

19.2.6. 사용자 제공 최적화 목표

사용자 제공 최적화 목표는 특정 최적화 제안에 대해 구성된 기본 목표를 좁힙니다. KafkaRebalance 사용자 정의 리소스의 spec.goals 에서 필요에 따라 이를 설정할 수 있습니다.

KafkaRebalance.spec.goals

사용자 제공 최적화 목표는 다양한 시나리오에 대한 최적화 제안을 생성할 수 있습니다. 예를 들어 디스크 용량 또는 디스크 사용률을 고려하지 않고 Kafka 클러스터에서 리더 복제본 배포를 최적화할 수 있습니다. 따라서 리더 복제본 배포를 위한 단일 사용자 제공 목표를 포함하는 KafkaRebalance 사용자 정의 리소스를 생성합니다.

사용자 제공 최적화 목표는 다음과 같아야 합니다.

  • 구성된 모든 하드 목표를 포함하거나 오류가 발생합니다.
  • 주요 최적화 목표의 하위 집합이 될 수 있습니다.

최적화 제안을 생성할 때 구성된 하드 목표를 무시하려면 skipHardGoalCheck: true 속성을 KafkaRebalance 사용자 지정 리소스에 추가합니다. 19.6절. “최적화 제안 생성”을 참조하십시오.

19.3. 최적화 제안 개요

최적화 제안을 생성하고 제안된 변경 사항을 적용하도록 KafkaRebalance 리소스를 구성합니다. 최적화 제안은 브로커 간에 파티션 워크로드가 더 균등하게 분산되는 Kafka 클러스터를 생성하는 제안된 변경 사항에 대한 요약입니다.

각 최적화 제안은 브로커 리소스에 대해 구성된 용량 제한에 따라 이를 생성하는 데 사용된 최적화 목표 세트를 기반으로 합니다.

모든 최적화 제안은 제안된 리밸런스의 영향에 대한 추정치 입니다. 제안을 승인하거나 거부할 수 있습니다. 최적화 제안을 먼저 생성하지 않고 클러스터 재조정을 승인할 수 없습니다.

다음 재조정 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.

  • full
  • add-brokers
  • remove-brokers

19.3.1. 재조정 모드

KafkaRebalance 사용자 정의 리소스의 spec.mode 속성을 사용하여 리밸런싱 모드를 지정합니다.

full
전체 모드는 클러스터의 모든 브로커에서 복제본을 이동하여 전체 재조정을 실행합니다. spec.mode 속성이 KafkaRebalance 사용자 정의 리소스에 정의되지 않은 경우 기본 모드입니다.
add-brokers
add-brokers 모드는 하나 이상의 브로커를 추가하여 Kafka 클러스터를 확장한 후 사용됩니다. 일반적으로 Kafka 클러스터를 확장한 후 새 브로커는 새로 생성된 주제의 파티션만 호스팅하는 데 사용됩니다. 새 항목이 생성되지 않으면 새로 추가된 브로커가 사용되지 않고 기존 브로커가 동일한 부하에 남아 있습니다. 클러스터에 브로커를 추가한 직후 add-brokers 모드를 사용하면 재조정 작업이 기존 브로커에서 새로 추가된 브로커로 복제본이 이동합니다. KafkaRebalance 사용자 정의 리소스의 spec.brokers 속성을 사용하여 새 브로커를 목록으로 지정합니다.
remove-brokers
remove-brokers 모드는 하나 이상의 브로커를 제거하여 Kafka 클러스터를 축소하기 전에 사용됩니다. Kafka 클러스터를 축소하는 경우 복제본을 호스팅하는 경우에도 브로커가 종료됩니다. 이로 인해 복제되지 않은 파티션이 발생할 수 있으며 일부 파티션이 최소 ISR(동기화형 복제본)에 있을 수 있습니다. 이러한 잠재적인 문제를 방지하기 위해 remove-brokers 모드는 제거될 브로커에서 복제본을 이동합니다. 이러한 브로커가 더 이상 복제본을 호스팅하지 않으면 축소 작업을 안전하게 실행할 수 있습니다. 제거 중인 브로커는 KafkaRebalance 사용자 정의 리소스의 spec.brokers 속성에서 목록으로 지정합니다.

일반적으로 전체 리밸런스 모드를 사용하여 브로커 간에 부하를 분산하여 Kafka 클러스터를 재조정합니다. 클러스터를 확장하거나 축소하고 그에 따라 복제본을 재조정하려는 경우에만 add-brokersremove-brokers 모드를 사용합니다.

리밸런스를 실행하는 절차는 세 가지 모드에서 실제로 동일합니다. 유일한 차이점은 spec.mode 속성을 통해 모드를 지정하고 필요한 경우 spec.brokers 속성을 통해 추가되거나 제거될 브로커 목록을 지정하는 것입니다.

19.3.2. 최적화 제안의 결과

최적화 제안이 생성되면 요약 및 브로커 로드가 반환됩니다.

요약
요약은 KafkaRebalance 리소스에 포함되어 있습니다. 요약은 제안된 클러스터 리밸런스에 대한 개요를 제공하고 관련 변경 사항의 규모를 나타냅니다. 성공적으로 생성된 최적화 제안 요약은 KafkaRebalance 리소스의 Status.OptimizationResult 속성에 포함되어 있습니다. 제공되는 정보는 전체 최적화 제안에 대한 요약입니다.
브로커 로드
브로커 로드는 데이터를 JSON 문자열로 포함하는 ConfigMap에 저장됩니다. 브로커 로드는 제안된 리밸런스에 대한 값 전후에 표시되므로 클러스터의 각 브로커에 미치는 영향을 확인할 수 있습니다.

19.3.3. 최적화 제안을 수동으로 승인 또는 거부

최적화 제안 요약은 제안된 변경 범위를 보여줍니다.

KafkaRebalance 리소스의 이름을 사용하여 명령줄에서 요약을 반환할 수 있습니다.

최적화 제안 요약 반환

oc describe kafkarebalance <kafka_rebalance_resource_name> -n <namespace>

jq 명령줄 JSON 구문 분석 도구를 사용할 수도 있습니다.

jq를 사용하여 최적화 제안 요약 반환

oc get kafkarebalance -o json | jq <jq_query>.

요약을 사용하여 최적화 제안을 승인하거나 거부할지 여부를 결정합니다.

최적화 제안 승인
승인하도록 KafkaRebalance 리소스의 strimzi.io/rebalance 주석을 설정하여 최적화 제안을 승인 합니다. 크루즈 컨트롤은 이 제안을 Kafka 클러스터에 적용하고 클러스터 재조정 작업을 시작합니다.
최적화 제안 거부
최적화 제안을 승인하지 않도록 선택하는 경우 최적화 목표를 변경하거나 성능 튜닝 옵션을 재조정 한 다음 다른 제안을 생성할 수 있습니다. strimzi.io/rebalance 주석을 새로 고침 하도록 설정하여 KafkaRebalance 리소스에 대한 새로운 최적화 제안을 생성할 수 있습니다.

재조정에 필요한 효과를 평가하기 위해 최적화 제안을 사용하십시오. 예를 들어 요약은broker 및 intra-broker 이동을 설명합니다. 브랜드 간 리밸런스(broker)는 별도의 브로커 간에 데이터를 리밸런싱합니다. Intra-broker 재조정은 JBOD 스토리지 구성을 사용할 때 동일한 브로커의 디스크 간에 데이터를 이동합니다. 이러한 정보는 귀하가 진행하지 않고 제안을 승인하더라도 유용할 수 있습니다.

재조정할 때 Kafka 클러스터에서 추가 로드로 인해 최적화 제안을 거부하거나 승인을 지연할 수 있습니다.

다음 예에서 제안서는 별도의 브로커 간 데이터 재조정을 제안합니다. 리밸런스에는 브로커 간에 총 12MB의 데이터가 있는 55 파티션 복제본의 이동이 포함됩니다. 파티션 복제본 간 이동은 성능에 큰 영향을 미치지만 총 데이터 양이 크지 않습니다. 총 데이터가 훨씬 큰 경우 제안서를 거부하거나 Kafka 클러스터 성능에 미치는 영향을 제한하기 위해 리밸런스를 승인하는 시간을 거부할 수 있습니다.

성능 튜닝 옵션을 재조정하면 데이터 이동의 영향을 줄이는 데 도움이 될 수 있습니다. 리밸런스 기간을 연장할 수 있는 경우 리밸런스를 작은 일괄 처리로 나눌 수 있습니다. 한 번에 데이터 이동이 줄어들어 클러스터의 부하를 줄일 수 있습니다.

최적화 제안 요약 예

Name:         my-rebalance
Namespace:    myproject
Labels:       strimzi.io/cluster=my-cluster
Annotations:  API Version:  kafka.strimzi.io/v1alpha1
Kind:         KafkaRebalance
Metadata:
# ...
Status:
  Conditions:
    Last Transition Time:  2022-04-05T14:36:11.900Z
    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:   82.91290759174306
    On Demand Balancedness Score Before:  78.01176356230222
    Recent Windows:                       5
  Session Id:                             a4f833bd-2055-4213-bfdd-ad21f95bf184

이 제안은 24 개의 파티션 리더를 다른 브로커로 이동합니다. 이를 위해서는 Zoo Cryostat 구성을 변경해야 하며 이는 성능에 미치는 영향은 낮습니다.

균형 잡힌 점수는 최적화 제안이 승인되기 전과 후에 Kafka 클러스터의 전체 균형에 대한 측정입니다. 균형 잡힌 점수는 최적화 목표를 기반으로합니다. 모든 목표를 충족하면 점수는 100입니다. 달성되지 않는 각 목표의 점수가 줄어듭니다. 균형 잡힌 점수를 비교하여 Kafka 클러스터가 리밸런스를 팔로우할 수 있는 것보다 더 적은지 확인합니다.

19.3.4. 최적화 제안 자동 승인

시간을 절약하기 위해 최적화 제안 승인 프로세스를 자동화할 수 있습니다. 자동화를 사용하면 최적화 제안을 생성할 때 클러스터 재조정으로 바로 들어갑니다.

최적화 제안 자동 승인 메커니즘을 활성화하려면 strimzi.io/rebalance-auto-approval 주석이 true 로 설정된 KafkaRebalance 리소스를 생성합니다. 주석을 설정하지 않거나 false 로 설정하면 최적화 제안에 수동 승인이 필요합니다.

자동 승인 메커니즘을 사용하여 리밸런스 요청의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaRebalance
metadata:
  name: my-rebalance
  labels:
    strimzi.io/cluster: my-cluster
  annotations:
    strimzi.io/rebalance-auto-approval: "true"
spec:
  mode: # any mode
  # ...

최적화 제안을 자동으로 승인할 때 상태를 확인할 수 있습니다. 리밸런스가 완료되면 KafkaRebalance 리소스의 상태가 Ready 로 이동합니다.

19.3.5. 최적화 제안 요약 속성

다음 표에서는 최적화 제안의 요약 섹션에 포함된 속성에 대해 설명합니다.

Expand
표 19.1. 최적화 제안 요약에 포함된 속성
JSON 속성설명

numIntraBrokerReplicaMovements

클러스터 브로커의 디스크 간에 전송할 총 파티션 복제본 수입니다.

리밸런스 작업 중 성능에 미치는 영향: 영구적으로 높지만 numReplica>-<ments보다 적습니다.

excludedBrokersForLeadership

아직 지원되지 않습니다. 빈 목록이 반환됩니다.

numReplicaMovements

별도의 브로커 간에 이동할 파티션 복제본 수입니다.

리밸런스 작업 중 성능에 미치는 영향: Relatively high.

onDemandBalancednessScoreBefore, onDemandBalancednessScoreAfter

최적화 제안이 생성 되기 전과 후에 Kafka 클러스터의 전반적인 균형을 측정합니다.

점수는 각 분류된 소프트 목표를 100에서 위반하는 balancednessScore 의 합계를 뺀 방식으로 계산됩니다. cruise Control은 default.goals 목록의 목표 위치 또는 사용자 제공 목표의 우선 순위를 포함하여 여러 요인을 기반으로 모든 최적화 목표에 balancednessScore 를 할당합니다.

Before 점수는 Kafka 클러스터의 현재 구성을 기반으로 합니다. After 점수는 생성된 최적화 제안을 기반으로 합니다.

intraBrokerDataToMoveMB

동일한 브로커의 디스크 간에 이동할 각 파티션 복제본의 크기 합계 입니다( numIntraBrokerReplicaments 참조).

리밸런스 작업 중 성능에 미치는 영향: 변수. 숫자가 클수록 클러스터 리밸런스를 완료하는 데 시간이 오래 걸립니다. 동일한 브로커의 디스크 간에 대량의 데이터를 이동하면 별도의 브로커보다 영향을 덜 받습니다(Data To#178MB참조).

recentWindows

최적화 제안서를 기반으로 하는 메트릭 창 수입니다.

dataToMoveMB

별도의 브로커로 이동할 각 파티션 복제본의 크기의 합계입니다 ( numReplica Cryostatments참조).

리밸런스 작업 중 성능에 미치는 영향: 변수. 숫자가 클수록 클러스터 리밸런스를 완료하는 데 시간이 오래 걸립니다.

monitoredPartitionsPercentage

최적화 제안에 적용되는 Kafka 클러스터의 파티션 백분율입니다. excludedTopics 수의 영향을 받습니다.

excludedTopics

KafkaRebalance 리소스에서 spec.excludedTopicsRegex 속성에 정규식을 지정한 경우 해당 표현식과 일치하는 모든 주제 이름이 여기에 나열됩니다. 이러한 주제는 최적화 제안에서 파티션 복제본/리더 이동의 계산에서 제외됩니다.

numLeaderMovements

리더가 다른 복제본으로 전환될 파티션의 수입니다. 이를 위해서는 Zoo Cryostat 구성을 변경해야 합니다.

리밸런스 작업 중 성능에 미치는 영향: Relatively low.

excludedBrokersForReplicaMove

아직 지원되지 않습니다. 빈 목록이 반환됩니다.

19.3.6. 브로커 로드 속성

브로커 로드는 JSON 형식 문자열과 KafkaRebalance 사용자 정의 리소스와 동일한 이름( KafkaRebalance 사용자 정의 리소스와 동일한 이름)에 저장됩니다. 이 JSON 문자열은 각 브로커의 여러 메트릭에 연결된 각 브로커 ID의 키가 있는 JSON 오브젝트로 구성됩니다. 각 메트릭은 세 개의 값으로 구성됩니다. 첫 번째는 최적화 제안이 적용되기 전에 메트릭 값이고, 두 번째는 제안이 적용된 후 지표의 예상값이며, 세 번째는 처음 두 값 사이의 차이입니다(이전에서 제외).

참고

KafkaRebalance 리소스가 ProposalReady 상태에 있을 때 ConfigMap이 표시되고 리밸런스가 완료된 후에도 유지됩니다.

ConfigMap의 이름을 사용하여 명령줄에서 해당 데이터를 볼 수 있습니다.

ConfigMap 데이터 반환

oc describe configmaps <my_rebalance_configmap_name> -n <namespace>

jq 명령줄 JSON 구문 분석 도구를 사용하여 ConfigMap에서 JSON 문자열을 추출할 수도 있습니다.

jq를 사용하여 ConfigMap에서 JSON 문자열 추출

oc get configmaps <my_rebalance_configmap_name> -o json | jq '.["data"]["brokerLoad.json"]|fromjson|.'

다음 표에서는 최적화 제안의 브로커 로드 ConfigMap에 포함된 속성을 설명합니다.

Expand
JSON 속성설명

리더

파티션 리더인 이 브로커의 복제본 수입니다.

replicas

이 브로커의 복제본 수입니다.

cpuPercentage

정의된 용량의 백분율로 CPU 사용률입니다.

diskUsedPercentage

정의된 용량의 백분율로 디스크 사용률입니다.

diskUsedMB

절대 디스크 사용량(MB)입니다.

networkOutRate

브로커의 총 네트워크 출력 비율입니다.

leaderNetworkInRate

이 브로커의 모든 파티션 리더 복제본의 네트워크 입력 비율입니다.

followerNetworkInRate

이 브로커의 모든 후속 복제본의 네트워크 입력 비율입니다.

potentialMaxNetworkOutRate

이 브로커가 현재 호스팅되는 모든 복제본의 리더가 되는 경우 실현 가능한 최대 네트워크 출력 비율입니다.

19.3.7. 캐시된 최적화 제안

cruise Control은 구성된 기본 최적화 목표에 따라 캐시된 최적화 제안을 유지합니다. 워크로드 모델에서 생성된 캐시된 최적화 제안은 Kafka 클러스터의 현재 상태를 반영하도록 15분마다 업데이트됩니다. 기본 최적화 목표를 사용하여 최적화 제안을 생성하면 Cruise Control은 최신 캐시된 제안을 반환합니다.

캐시된 최적화 제안 새로 고침 간격을 변경하려면 Cruise Control 배포 구성에서 proposal.expiration.ms 설정을 편집합니다. Cruise Control 서버의 로드가 증가하지만 빠르게 변화하는 클러스터의 더 짧은 간격을 고려하십시오.

19.4. 성능 튜닝 개요

클러스터 재조정을 위해 여러 성능 튜닝 옵션을 조정할 수 있습니다. 이러한 옵션은 리밸런스에서의 파티션 복제본 및 리더십 이동 방식 및 리밸런스 작업에 할당된 대역폭을 제어합니다.

19.4.1. 파티션 재할당 명령

최적화 제안은 별도의 파티션 재할당 명령으로 구성됩니다. 제안을 승인 하면 Cruise Control 서버에서 이러한 명령을 Kafka 클러스터에 적용합니다.

파티션 재할당 명령은 다음 작업 유형 중 하나로 구성됩니다.

  • 파티션 이동: 파티션 복제본과 해당 데이터를 새 위치로 전송합니다. 파티션 모음은 다음 두 가지 형식 중 하나를 수행할 수 있습니다.

    • 브랜드 간 이동: 파티션 복제본이 다른 브로커의 로그 디렉터리로 이동됩니다.
    • Intra-broker 이동: 파티션 복제본은 동일한 브로커의 다른 로그 디렉터리로 이동합니다.
  • 리더십 이동: 파티션 복제본의 리더를 전환해야 합니다.

cruise Control은 배치의 Kafka 클러스터에 파티션 재할당 명령을 발행합니다. 리밸런스 중 클러스터 성능은 각 배치에 포함된 각 이동 유형의 영향을 받습니다.

19.4.2. 복제본 이동 전략

클러스터 리밸런스 성능은 파티션 재할당 명령의 배치에 적용되는 복제본 이동 전략 의 영향을 받습니다. 기본적으로 Cruise Control은 생성된 순서대로 명령을 간단히 적용하는 BaseReplica CryostatmentStrategy 를 사용합니다. 그러나 제안 초기에 매우 큰 파티션 재할당이 있는 경우 이 전략은 다른 재할당의 적용 속도가 느려질 수 있습니다.

cruise Control은 최적화 제안에 적용할 수 있는 네 가지 대체 복제본 이동 전략을 제공합니다.

  • PrioritizeSmallReplicamentStrategy: 오름차순으로 재할당합니다.
  • PrioritizeLargeReplicamentStrategy: 내림차순으로 재할당합니다.
  • PostponeUrpReplica>-<mentStrategy: 동기화되지 않은 복제본이 없는 파티션 복제본의 재할당을 우선순위화합니다.
  • PrioritizeMinIsrWithOfflineReplicasStrategy: 오프라인 복제본을 사용하여 (At/Under)MinISR 파티션을 사용하여 재할당을 우선순위화합니다. 이 전략은 Kafka 사용자 정의 리소스의 사양에서 cruiseControl.config.concurrency.adjuster.min.isr.check.enabledtrue 로 설정된 경우에만 작동합니다.

이러한 전략은 시퀀스로 구성할 수 있습니다. 첫 번째 전략은 내부 논리를 사용하여 두 파티션 재할당을 비교하려고 합니다. 재할당이 동일한 경우 순서에서 다음 전략으로 전달하여 순서를 결정하는 등의 작업을 수행합니다.

19.4.3. Intra-broker 디스크 밸런싱

동일한 브로커의 디스크 간에 대량의 데이터를 이동해도 별도의 브로커보다 더 적은 영향을 미칩니다. 동일한 브로커에 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포를 실행 중인 경우 Cruise Control은 디스크 간에 파티션의 균형을 조정할 수 있습니다.

참고

단일 디스크와 함께 JBOD 스토리지를 사용하는 경우 균형을 조정할 디스크가 없으므로 intra-broker 디스크 밸런싱이 0인 제안이 발생합니다.

intra-broker 디스크 균형을 수행하려면 KafkaRebalance.spec 에서 rebalanceDisktrue 로 설정합니다. rebalanceDisktrue 로 설정할 때 Cruise Control이 자동으로 브랜드 내 목표를 설정하고 브랜드 간 목표를 무시하므로 KafkaRebalance.spec 의 목표 필드를 설정하지 마십시오. 크루즈 컨트롤은broker와 intra-broker 밸런싱을 동시에 수행하지 않습니다.

19.4.4. 조정 옵션 재조정

크루즈 컨트롤은 위에서 설명한 리밸런스 매개변수를 조정하기 위한 몇 가지 구성 옵션을 제공합니다. Kafka 또는 최적화 제안 수준을 사용하여 Cruise Control을 구성하고 배포 할 때 이러한 튜닝 옵션을 설정할 수 있습니다.

  • Cruise Control 서버 설정은 Kafka.spec.cruiseControl.config 의 Kafka 사용자 지정 리소스에서 설정할 수 있습니다.
  • 개별 리밸런스 성능 구성은 KafkaRebalance.spec 아래에 설정할 수 있습니다.

관련 구성은 다음 표에 요약되어 있습니다.

Expand
표 19.2. 성능 튜닝 구성 재조정
크루즈 컨트롤 속성KafkaRebalance 속성기본설명

num.concurrent.partition.movements.per.broker

concurrentPartitionMovementsPerBroker

5

각 파티션 재할당 배치의 최대 구성 요소 수

num.concurrent.intra.broker.partition.movements

concurrentIntraBrokerPartitionMovements

2

각 파티션 재할당 배치에서 인트라브러 파티션의 최대 수

num.concurrent.leader.movements

concurrentLeaderMovements

1000

각 파티션 재할당 배치의 최대 파티션 리더십 변경 수

default.replication.throttle

replicationThrottle

null (제한 없음)

파티션 재할당에 할당할 대역폭(초당 바이트 단위)

default.replica.movement.strategies

replicaMovementStrategies

BaseReplicaMovementStrategy

생성된 제안서에 대해 파티션 재할당 명령이 실행되는 순서를 결정하는 데 사용되는 전략 목록(우선순)입니다. 서버 설정의 경우 전략 클래스의 정규화된 이름으로 쉼표로 구분된 문자열을 사용합니다( 각 클래스 이름 시작에 com.linkedin.kafka.cruisecontrol.executor.strategy. 를 추가). KafkaRebalance 리소스 설정의 경우 전략 클래스 이름의 YAML 배열을 사용합니다.

-

rebalanceDisk

false

intra-broker 디스크 밸런싱을 활성화합니다. 이는 동일한 브로커의 디스크 공간 사용률의 균형을 유지합니다. 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포에만 적용됩니다.

기본 설정을 변경하면 리밸런스가 완료하는 데 걸리는 시간과 재조정 중 Kafka 클러스터에 배치된 로드에 영향을 미칩니다. 더 낮은 값을 사용하면 로드가 줄어들지만 사용된 시간이 증가하고 그 반대의 경우도 마찬가지입니다.

19.5. Kafka를 사용하여 Cruise Control 구성 및 배포

Kafka 클러스터와 함께 Cruise Control을 배포하도록 Kafka 리소스를 구성합니다. Kafka 리소스의 cruiseControl 속성을 사용하여 배포를 구성할 수 있습니다. Kafka 클러스터당 하나의 Cruise Control 인스턴스를 배포합니다.

Cruise Control config 에서 목표 구성을 사용하여 최적화 제안을 생성하기 위한 최적화 목표를 지정합니다. brokerCapacity 를 사용하여 리소스 배포와 관련된 목표에 대한 기본 용량 제한을 변경할 수 있습니다. 브로커가 이기종 네트워크 리소스가 있는 노드에서 실행 중인 경우 재정의 를 사용하여 각 브로커의 네트워크 용량 제한을 설정할 수 있습니다.

cruiseControl 구성에 빈 오브젝트({})를 사용하는 경우 모든 속성은 기본값을 사용합니다.

Cruise Control의 구성 옵션에 대한 자세한 내용은 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.

사전 요구 사항

  • OpenShift 클러스터
  • 실행중인 Cluster Operator

프로세스

  1. Kafka 리소스의 cruiseControl 속성을 편집합니다.

    구성할 수 있는 속성은 이 예제 구성에 표시됩니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      # ...
      cruiseControl:
        brokerCapacity: 
    1
    
          inboundNetwork: 10000KB/s
          outboundNetwork: 10000KB/s
          overrides: 
    2
    
          - brokers: [0]
            inboundNetwork: 20000KiB/s
            outboundNetwork: 20000KiB/s
          - brokers: [1, 2]
            inboundNetwork: 30000KiB/s
            outboundNetwork: 30000KiB/s
          # ...
        config: 
    3
    
          # Note that `default.goals` (superset) must also include all `hard.goals` (subset)
          default.goals: > 
    4
    
            com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal,
            com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal,
            com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal
            # ...
          hard.goals: >
            com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal
            # ...
          cpu.balance.threshold: 1.1
          metadata.max.age.ms: 300000
          send.buffer.bytes: 131072
          webserver.http.cors.enabled: true 
    5
    
          webserver.http.cors.origin: "*"
          webserver.http.cors.exposeheaders: "User-Task-ID,Content-Type"
          # ...
        resources: 
    6
    
          requests:
            cpu: 1
            memory: 512Mi
          limits:
            cpu: 2
            memory: 2Gi
        logging: 
    7
    
            type: inline
            loggers:
              rootLogger.level: INFO
        template: 
    8
    
          pod:
            metadata:
              labels:
                label1: value1
            securityContext:
              runAsUser: 1000001
              fsGroup: 0
            terminationGracePeriodSeconds: 120
        readinessProbe: 
    9
    
          initialDelaySeconds: 15
          timeoutSeconds: 5
        livenessProbe:
          initialDelaySeconds: 15
          timeoutSeconds: 5
        metricsConfig: 
    10
    
          type: jmxPrometheusExporter
          valueFrom:
            configMapKeyRef:
              name: cruise-control-metrics
              key: metrics-config.yml
    # ...
    1
    브로커 리소스에 대한 용량 제한입니다.
    2
    덮어쓰기는 이기종 네트워크 리소스가 있는 노드에서 실행할 때 특정 브로커에 대한 네트워크 용량 제한을 설정합니다.
    3
    크루즈 제어 구성. 표준 크루즈 컨트롤 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제공될 수 있습니다.
    4
    최적화 목표 구성: 기본 최적화 목표(default.goals), 주요 최적화 목표(대상) 및 하드목표(hard.goals)를 위한 구성을 포함할 수 있습니다.
    5
    CORS를 활성화하고 Cruise Control API에 대한 읽기 전용 액세스를 위해 구성되었습니다.
    6
    지원되는 리소스(현재 cpumemory ) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다.
    7
    크루즈 제어 로거 및 로그 수준은 ConfigMap을 통해 직접(인라인) 또는 간접적으로(외부)에 추가됩니다. 사용자 정의 Log4j 구성은 ConfigMap의 log4j.properties 키 아래에 배치해야 합니다. cruise Control에는 rootLogger.level 이라는 단일 로거가 있습니다. 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다.
    8
    템플릿 사용자 지정. 여기에서 Pod는 추가 보안 특성으로 예약됩니다.
    9
    컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
    10
    Prometheus 지표가 활성화되어 있습니다. 이 예에서는 Prometheus Cryostat Exporter(기본 지표 내보내기)에 대한 메트릭이 구성됩니다.
  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>
  3. 배포 상태를 확인합니다.

    oc get deployments -n <my_cluster_operator_namespace>

    출력에 배포 이름 및 준비 상태 표시

    NAME                      READY  UP-TO-DATE  AVAILABLE
    my-cluster-cruise-control 1/1    1           1

    my-cluster 는 Kafka 클러스터의 이름입니다.

    READY 는 ready/expected 복제본 수를 표시합니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

자동 생성 주제

다음 표에서는 Cruise Control을 배포할 때 자동으로 생성되는 세 가지 주제를 보여줍니다. 이러한 주제는 크루즈 제어가 제대로 작동하려면 필수이며 삭제하거나 변경하지 않아야 합니다. 지정된 구성 옵션을 사용하여 주제 이름을 변경할 수 있습니다.

Expand
표 19.3. 자동 생성 주제
자동 생성 주제 구성기본 주제 이름작성자함수

metric.reporter.topic

strimzi.cruisecontrol.metrics

Apache Kafka Metrics Reporter 스트림

각 Kafka 브로커의 Metrics Reporter의 원시 지표를 저장합니다.

partition.metric.sample.store.topic

strimzi.cruisecontrol.partitionmetricsamples

크루즈 제어

각 파티션에 대해 파생된 지표를 저장합니다. 이는 Metric Sample Aggregator 에 의해 생성됩니다.

broker.metric.sample.store.topic

strimzi.cruisecontrol.modeltrainingsamples

크루즈 제어

클러스터 워크로드 모델을 생성하는 데 사용되는 메트릭 샘플을 저장합니다.

Cruise Control에 필요한 레코드 제거를 방지하기 위해 자동 생성된 항목에서 로그 압축이 비활성화됩니다.

참고

Cruise Control이 활성화된 Kafka 클러스터에서 자동 생성 주제의 이름이 변경된 경우 이전 주제는 삭제되지 않으며 수동으로 제거해야 합니다.

다음에 수행할 작업

Cruise Control을 구성하고 배포한 후 최적화 제안을 생성할 수 있습니다.

19.6. 최적화 제안 생성

KafkaRebalance 리소스를 생성하거나 업데이트할 때 Cruise Control은 구성된 최적화 목표에 따라 Kafka 클러스터에 대한 최적화 제안을 생성합니다. 최적화 제안에서 정보를 분석하고 승인 여부를 결정합니다. 최적화 제안의 결과를 사용하여 Kafka 클러스터를 재조정할 수 있습니다.

다음 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.

  • Full (기본값)
  • add-brokers
  • remove-brokers

사용하는 모드는 Kafka 클러스터에서 이미 실행 중인 모든 브로커 간에 재조정하는지 아니면 Kafka 클러스터를 확장한 후 또는 Kafka 클러스터를 축소하기 전에 재조정해야 하는지에 따라 다릅니다. 자세한 내용은 브로커 스케일링을 사용하여 모드 재조정 을 참조하십시오.

사전 요구 사항

  • Apache Kafka 클러스터의 Streams에 Cruise Control을 배포 했습니다.
  • 최적화 목표를 구성하고 브로커 리소스에 대한 용량 제한을 선택적으로 구성했습니다.

Cruise Control 구성에 대한 자세한 내용은 19.5절. “Kafka를 사용하여 Cruise Control 구성 및 배포” 을 참조하십시오.

프로세스

  1. KafkaRebalance 리소스를 생성하고 적절한 모드를 지정합니다.

    전체 모드(기본값)

    Kafka 리소스에 정의된 기본 최적화 목표를 사용하려면 spec 속성을 비워 둡니다. cruise Control은 기본적으로 Kafka 클러스터를 전체 모드로 재조정합니다.

    기본적으로 전체 재조정이 있는 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      name: my-rebalance
      labels:
        strimzi.io/cluster: my-cluster
    spec: {}

    spec.mode 속성을 통해 전체 모드를 지정하여 전체 리밸런스를 실행할 수도 있습니다.

    전체 모드를 지정하는 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      name: my-rebalance
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      mode: full

    add-brokers 모드

    확장 후 Kafka 클러스터를 재조정하려면 add-brokers 모드를 지정합니다.

    이 모드에서는 기존 복제본이 새로 추가된 브로커로 이동합니다. 브로커를 목록으로 지정해야 합니다.

    add-brokers 모드를 지정하는 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      name: my-rebalance
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      mode: add-brokers
      brokers: [3, 4] 
    1

    1
    확장 작업에 의해 추가된 새로 추가된 브로커 목록입니다. 이 속성은 필수입니다.
    remove-brokers 모드

    축소 전에 Kafka 클러스터를 재조정하려면 remove-brokers 모드를 지정합니다.

    이 모드에서 복제본은 제거하려는 브로커에서 이동합니다. 목록으로 제거되는 브로커를 지정해야 합니다.

    remove-brokers 모드를 지정하는 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      name: my-rebalance
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      mode: remove-brokers
      brokers: [3, 4] 
    1

    1
    축소 작업에서 제거할 브로커 목록입니다. 이 속성은 필수입니다.
    참고

    다음 단계와 리밸런스를 승인하거나 중지하는 단계는 사용 중인 리밸런스 모드에 관계없이 동일합니다.

  2. 기본 목표를 사용하는 대신 사용자 제공 최적화 목표를 구성하려면 goals 속성을 추가하고 하나 이상의 목표를 입력합니다.

    다음 예에서는 랙 인식 및 복제본 용량이 사용자 제공 최적화 목표로 구성됩니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      name: my-rebalance
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      goals:
        - RackAwareGoal
        - ReplicaCapacityGoal
  3. 구성된 하드 목표를 무시하려면 skipHardGoalCheck: true 속성을 추가합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      name: my-rebalance
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      goals:
        - RackAwareGoal
        - ReplicaCapacityGoal
      skipHardGoalCheck: true
  4. (선택 사항) 최적화 제안을 자동으로 승인하려면 strimzi.io/rebalance-auto-approval 주석을 true 로 설정합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaRebalance
    metadata:
      name: my-rebalance
      labels:
        strimzi.io/cluster: my-cluster
      annotations:
        strimzi.io/rebalance-auto-approval: "true"
    spec:
      goals:
        - RackAwareGoal
        - ReplicaCapacityGoal
      skipHardGoalCheck: true
  5. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_rebalance_configuration_file>

    Cluster Operator는 Cruise Control에서 최적화 제안을 요청합니다. Kafka 클러스터 크기에 따라 몇 분이 걸릴 수 있습니다.

  6. 자동 승인 메커니즘을 사용한 경우 최적화 제안 상태가 Ready 로 변경될 때까지 기다립니다. 자동 승인 메커니즘을 활성화하지 않은 경우 최적화 제안 상태가 ProposalReady 로 변경될 때까지 기다립니다.

    oc get kafkarebalance -o wide -w -n <namespace>
    PendingProposal
    PendingProposal 상태는 리밸런스 Operator가 Cruise Control API를 폴링하여 최적화 제안이 준비되었는지 확인합니다.
    ProposalReady
    ProposalReady 상태는 최적화 제안이 검토 및 승인을 받을 준비가 되었음을 의미합니다.

    상태가 ProposalReady 로 변경되면 최적화 제안을 승인할 준비가 된 것입니다.

  7. 최적화 제안을 검토하십시오.

    최적화 제안은 KafkaRebalance 리소스의 Status.Optimization Result 속성에 포함되어 있습니다.

    oc describe kafkarebalance <kafka_rebalance_resource_name>

    최적화 제안 예

    Status:
      Conditions:
        Last Transition Time:  2020-05-19T13:50:12.533Z
        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:         0
        Monitored Partitions Percentage:      100
        Num Intra Broker Replica Movements:   0
        Num Leader Movements:                 0
        Num Replica Movements:                26
        On Demand Balancedness Score After:   81.8666802863978
        On Demand Balancedness Score Before:  78.01176356230222
        Recent Windows:                       1
      Session Id:                             05539377-ca7b-45ef-b359-e13564f1458c

    최적화 결과 섹션의 속성은 보류 중인 클러스터 재조정 작업을 설명합니다. 각 속성에 대한 설명은 최적화 제안의 콘텐츠를 참조하십시오.

CPU 용량 부족

CPU 사용률 측면에서 Kafka 클러스터가 과부하된 경우 KafkaRebalance 상태에 충분하지 않은 CPU 용량 오류가 표시될 수 있습니다. 이 사용률 값이 excludedTopics 구성의 영향을 받지 않음을 주목할 가치가 있습니다. 최적화 제안서가 제외된 주제의 복제본을 다시 할당하지 않지만, 해당 부하는 여전히 사용률 계산에서 고려됩니다.

CPU 사용률 오류 예

com.linkedin.kafka.cruisecontrol.exception.OptimizationFailureException:
[CpuCapacityGoal] Insufficient capacity for cpu (Utilization 615.21, Allowed Capacity 420.00, Threshold: 0.70). Add at least 3 brokers with the same cpu capacity (100.00) as broker-0. Add at least 3 brokers with the same cpu capacity (100.00) as broker-0.

참고

오류에 CPU 용량이 CPU 코어 수가 아닌 백분율로 표시됩니다. 따라서 Kafka 사용자 정의 리소스에 구성된 CPU 수에 직접 매핑되지 않습니다. 브로커당 단일 가상 CPU를 사용하는 것과 같습니다. 이 CPU에는 Kafka.spec.kafka.resources.limits.cpu 에 구성된 CPU의 주기가 있습니다. 이는 CPU 사용률과 용량 간의 비율이 동일하게 유지되므로 리밸런스 동작에는 영향을 미치지 않습니다.

다음에 수행할 작업

19.7절. “최적화 제안 승인”

19.7. 최적화 제안 승인

상태가 ProposalReady 인 경우 Cruise Control에서 생성한 최적화 제안을 승인할 수 있습니다. 그런 다음 cruise Control은 Kafka 클러스터에 최적화 제안을 적용하고 브로커에 파티션을 다시 할당하고 파티션 리더십을 변경합니다.

Important

이는 드라이 목이 아닙니다. 최적화 제안을 승인하기 전에 다음을 수행해야 합니다.

  • 예기치 않은 경우 제안을 새로 고칩니다.
  • 제안의 내용을 주의 깊게 검토합니다.

사전 요구 사항

  • Cruise Control에서 최적화 제안을 생성 했습니다.
  • KafkaRebalance 사용자 정의 리소스 상태는 ProposalReady 입니다.

프로세스

승인하려는 최적화 제안을 위해 다음 단계를 수행하십시오.

  1. 최적화 제안이 새로 생성되지 않는 한 Kafka 클러스터 상태에 대한 현재 정보를 기반으로 하는지 확인합니다. 이렇게 하려면 최적화 제안을 새로 고침하여 최신 클러스터 메트릭을 사용하는지 확인합니다.

    1. strimzi.io/rebalance=refresh: OpenShift의 KafkaRebalance 리소스에 주석을 답니다.

      oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="refresh"
  2. 최적화 제안의 상태가 ProposalReady 로 변경될 때까지 기다립니다.

    oc get kafkarebalance -o wide -w -n <namespace>
    PendingProposal
    PendingProposal 상태는 리밸런스 Operator가 Cruise Control API를 폴링하여 최적화 제안이 준비되었는지 확인합니다.
    ProposalReady
    ProposalReady 상태는 최적화 제안이 검토 및 승인을 받을 준비가 되었음을 의미합니다.

    상태가 ProposalReady 로 변경되면 최적화 제안을 승인할 준비가 된 것입니다.

  3. Cruise Control을 적용할 최적화 제안을 승인합니다.

    strimzi.io/rebalance=approve: OpenShift의 KafkaRebalance 리소스에 주석을 답니다.

    oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="approve"
  4. Cluster Operator는 주석이 있는 리소스를 감지하고 Cruise Control에 Kafka 클러스터를 재조정하도록 지시합니다.
  5. 최적화 제안 상태가 Ready 로 변경될 때까지 기다립니다.

    oc get kafkarebalance -o wide -w -n <namespace>
    재조정
    재조정 상태는 재조정 이 진행 중임을 의미합니다.
    Ready
    Ready 상태는 리밸런스가 완료되었음을 의미합니다.
    NotReady
    NotReady 상태는 오류가 발생했음을 의미합니다. KafkaRebalance 리소스의 문제 해결을 참조하십시오.

    상태가 Ready 로 변경되면 리밸런스가 완료됩니다.

    동일한 KafkaRebalance 사용자 정의 리소스를 사용하여 다른 최적화 제안을 생성하려면 새로 고침 주석을 사용자 정의 리소스에 적용합니다. 이렇게 하면 사용자 정의 리소스가 PendingProposal 또는 ProposalReady 상태로 이동합니다. 그런 다음 최적화 제안을 검토하고 원하는 경우 승인할 수 있습니다.

19.8. 클러스터 리밸런스 중지

시작되고 나면 클러스터 리밸런스 작업을 완료하는 데 시간이 걸릴 수 있으며 Kafka 클러스터의 전반적인 성능에 영향을 미칠 수 있습니다.

진행 중인 클러스터 재조정 작업을 중지하려면 stop 주석을 KafkaRebalance 사용자 지정 리소스에 적용합니다. 이는 Cruise Control에 현재 파티션 재할당을 완료한 다음 재조정을 중지하도록 지시합니다. 리밸런스가 중지되면 완료된 파티션 재할당이 이미 적용되어 있으므로 리밸런스 작업을 시작하기 전과 비교할 때 Kafka 클러스터의 상태가 다릅니다. 추가 재조정이 필요한 경우 새로운 최적화 제안을 생성해야 합니다.

참고

중간(중지됨) 상태의 Kafka 클러스터의 성능은 초기 상태보다 더 나을 수 있습니다.

사전 요구 사항

프로세스

  1. OpenShift의 KafkaRebalance 리소스에 주석을 답니다.

    oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="stop"
  2. KafkaRebalance 리소스의 상태를 확인합니다.

    oc describe kafkarebalance rebalance-cr-name
  3. 상태가 Stopped 로 변경될 때까지 기다립니다.

19.9. KafkaRebalance 리소스 문제 해결

KafkaRebalance 리소스를 생성하거나 Cruise Control과 상호 작용할 때 문제가 발생하면 문제 해결 방법에 대한 세부 정보와 함께 리소스 상태에 오류가 보고됩니다. 리소스는 NotReady 상태로도 이동합니다.

클러스터 리밸런스 작업을 계속하려면 KafkaRebalance 리소스 자체 또는 전체 Cruise Control 배포에서 문제를 수정해야 합니다. 문제에는 다음이 포함될 수 있습니다.

  • KafkaRebalance 리소스의 잘못 구성된 매개변수입니다.
  • KafkaRebalance 리소스에서 Kafka 클러스터를 지정하는 데 필요한 strimzi.io/cluster 레이블이 없습니다.
  • Cruise Control 서버는 Kafka 리소스에 cruiseControl 속성이 누락되어 있지 않습니다.
  • Cruise Control 서버에 연결할 수 없습니다.

문제를 해결한 후 KafkaRebalance 리소스에 새로 고침 주석을 추가해야 합니다. "새로 고침" 중에 Cruise Control 서버에서 새로운 최적화 제안을 요청합니다.

사전 요구 사항

프로세스

  1. KafkaRebalance 상태에서 오류에 대한 정보를 가져옵니다.

    oc describe kafkarebalance rebalance-cr-name
  2. KafkaRebalance 리소스에서 문제를 해결합니다.
  3. OpenShift의 KafkaRebalance 리소스에 주석을 답니다.

    oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="refresh"
  4. KafkaRebalance 리소스의 상태를 확인합니다.

    oc describe kafkarebalance rebalance-cr-name
  5. 상태가 PendingProposal 또는 ProposalReady 로 직접 변경될 때까지 기다립니다.

20장. 파티션 재할당 도구 사용

Kafka 클러스터를 스케일링하는 경우 브로커를 추가하거나 제거하고 파티션 배포 또는 주제의 복제 요소를 업데이트해야 할 수 있습니다. 파티션 및 주제를 업데이트하려면 kafka-reassign-partitions.sh 툴을 사용할 수 있습니다.

Streams for Apache Kafka Cruise Control 통합이나 Topic Operator는 주제의 복제 요소 변경을 지원하지 않습니다. 그러나 kafka-reassign-partitions.sh 도구를 사용하여 주제의 복제 요소를 변경할 수 있습니다.

이 도구를 사용하여 파티션을 다시 할당하고 브로커 간에 파티션의 분산을 조정하여 성능을 향상시킬 수도 있습니다. 그러나 자동 파티션 재할당 및 클러스터 재조정에 Cruise Control 을 사용하는 것이 좋습니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.

kafka-reassign-partitions.sh 툴을 브로커 컨테이너가 아닌 별도의 대화형 pod로 실행하는 것이 좋습니다. 브로커 컨테이너 내에서 Kafka bin/ 스크립트를 실행하면 JVM이 Kafka 브로커와 동일한 설정으로 시작될 수 있으므로 중단이 발생할 수 있습니다. 별도의 Pod에서 kafka-reassign-partitions.sh 툴을 실행하면 이 문제를 방지할 수 있습니다. -ti 옵션을 사용하여 Pod를 실행하면 Pod 내에서 쉘 명령을 실행하기 위한 터미널이 포함된 대화형 Pod가 생성됩니다.

터미널을 사용하여 대화형 Pod 실행

oc run helper-pod -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bash

20.1. 파티션 재할당 도구 개요

파티션 재할당 툴에서는 Kafka 파티션 및 브로커를 관리하기 위한 다음과 같은 기능을 제공합니다.

파티션 복제본 재배포
브로커를 추가하거나 제거하여 클러스터를 확장하고 많이 로드된 브로커에서 활용도가 낮은 브로커로 Kafka 파티션을 이동합니다. 이렇게 하려면 이동할 주제와 파티션과 이동할 위치를 식별하는 파티션 재할당 계획을 만들어야 합니다. cruise Control은 클러스터 재조정 프로세스를 자동화 하므로 이 유형의 작업에 권장됩니다.
주제 복제 요인 확장 및 축소
Kafka 주제의 복제 요소를 늘리거나 줄입니다. 이렇게 하려면 파티션 간에 기존 복제 할당을 식별하고 복제 요소가 변경되면 업데이트된 할당을 생성하는 파티션 재할당 계획을 만들어야 합니다.
선호하는 리더 변경
Kafka 파티션의 기본 리더를 변경합니다. 현재 선호하는 리더를 사용할 수 없거나 클러스터의 브로커 간에 부하를 재배포하려는 경우 유용할 수 있습니다. 이렇게 하려면 복제본 순서를 변경하여 각 파티션의 새로운 기본 리더를 지정하는 파티션 재할당 계획을 만들어야 합니다.
특정 JBOD 볼륨을 사용하도록 로그 디렉터리 변경
특정 JBOD 볼륨을 사용하도록 Kafka 브로커의 로그 디렉터리를 변경합니다. 이 기능은 Kafka 데이터를 다른 디스크 또는 스토리지 장치로 이동하려는 경우 유용할 수 있습니다. 이렇게 하려면 각 주제의 새 로그 디렉터리를 지정하는 파티션 재할당 계획을 만들어야 합니다.

20.1.1. 파티션 재할당 계획 생성

파티션 재할당 도구(kafka-reassign-partitions.sh)는 현재 브로커에서 새 브로커로 이동해야 하는 파티션을 지정하는 파티션 할당 계획을 생성하여 작동합니다.

계획에 만족하는 경우 실행할 수 있습니다. 이 툴은 다음을 수행합니다.

  • 파티션 데이터를 새 브로커로 마이그레이션
  • 새 파티션 할당을 반영하도록 Kafka 브로커의 메타데이터 업데이트
  • Kafka 브로커의 롤링 재시작을 트리거하여 새 할당이 적용되도록 합니다.

파티션 재할당 툴에는 세 가지 모드가 있습니다.

--generate
주제 및 브로커 세트를 가져와서 재할당 JSON 파일을 생성하여 해당 브로커에 해당 주제의 파티션이 할당됩니다. 이는 전체 항목에서 작동하기 때문에 일부 주제의 일부 파티션만 다시 할당하려는 경우 사용할 수 없습니다.
--execute
JSON 파일을 다시 할당 하여 클러스터의 파티션 및 브로커에 적용합니다. 결과적으로 파티션을 얻는 브로커는 파티션 리더의 팔로우가됩니다. 지정된 파티션의 경우 새 브로커가 ISR(동기화형 복제본)에 가입하고 ISR(동기화) 복제본에 가입하면 이전 브로커가 팔로워가 되는 것을 중지하고 해당 복제본을 삭제합니다.
--verify
--execute 단계와 동일한 재할당 JSON 파일을 사용하여 --verify 는 파일의 모든 파티션이 의도한 브로커로 이동되었는지 확인합니다. 재할당이 완료되면 --verify 는 적용되는 트래픽 제한(--throttle)도 제거합니다. 제거되지 않으면 제한은 재할당이 완료된 후에도 클러스터에 계속 영향을 미칩니다.

지정된 시간에 클러스터에서 하나의 재할당을 실행할 수 있으며 실행 중인 재할당을 취소할 수 없습니다. 재할당을 취소해야 하는 경우 재할당이 완료될 때까지 기다린 다음 다른 재할당을 수행하여 첫 번째 재할당의 효과를 되돌립니다. kafka-reassign-partitions.sh 는 이 재버전에 대한 재할당 JSON을 출력 출력의 일부로 출력합니다. 매우 큰 재할당은 진행 중인 재할당을 중지해야 하는 경우 다수의 작은 재할당으로 분류되어야 합니다.

20.1.2. 파티션 재할당 JSON 파일에 주제 지정

kafka-reassign-partitions.sh 툴은 다시 할당할 주제를 지정하는 재할당 JSON 파일을 사용합니다. 특정 파티션을 이동하려는 경우 JSON 파일을 다시 할당하거나 파일을 수동으로 생성할 수 있습니다.

기본 재할당 JSON 파일에는 다음 예제에 표시된 구조가 있으며, 이 구조는 두 Kafka 항목에 속하는 파티션 세 개를 설명합니다. 각 파티션은 브로커 ID로 식별되는 새 복제본 세트에 다시 할당됩니다. version,topic,partition, replicas 속성은 모두 필요합니다.

파티션 재할당 JSON 파일 구조의 예

{
  "version": 1, 
1

  "partitions": [ 
2

    {
      "topic": "example-topic-1", 
3

      "partition": 0, 
4

      "replicas": [1, 2, 3] 
5

    },
    {
      "topic": "example-topic-1",
      "partition": 1,
      "replicas": [2, 3, 4]
    },
    {
      "topic": "example-topic-2",
      "partition": 0,
      "replicas": [3, 4, 5]
    }
  ]
}

1
재할당 JSON 파일 형식의 버전입니다. 현재는 버전 1만 지원되므로 항상 1이어야 합니다.
2
다시 할당할 파티션을 지정하는 배열입니다.
3
파티션이 속한 Kafka 주제의 이름입니다.
4
다시 할당되는 파티션의 ID입니다.
5
이 파티션의 복제본으로 할당되어야 하는 브로커의 정렬된 ID 배열입니다. 목록의 첫 번째 브로커는 리더 복제본입니다.
참고

JSON에 포함되지 않은 파티션은 변경되지 않습니다.

주제 배열을 사용하여 주제만 지정하는 경우 파티션 재할당 도구에서 지정된 항목에 속하는 모든 파티션을 다시 할당합니다.

주제의 모든 파티션을 다시 할당하는 JSON 파일 구조의 예

{
  "version": 1,
  "topics": [
    { "topic": "my-topic"}
  ]
}

20.1.3. JBOD 볼륨 간에 파티션 재할당

Kafka 클러스터에서 JBOD 스토리지를 사용하는 경우 특정 볼륨과 로그 디렉터리 간에 파티션을 다시 할당할 수 있습니다(각 볼륨에 단일 로그 디렉터리가 있음).

파티션을 특정 볼륨에 다시 할당하려면 재할당 JSON 파일의 각 파티션에 대한 log_dirs 값을 추가합니다. 각 log_dirs 배열에는 각 복제본을 특정 로그 디렉터리에 할당해야 하므로 replicas 배열과 동일한 수의 항목이 포함됩니다. log_dirs 배열에는 로그 디렉터리의 절대 경로 또는 특수 값이 포함되어 있습니다. any 값은 Kafka가 해당 복제본에 사용 가능한 로그 디렉토리를 선택할 수 있음을 나타냅니다. 이는 JBOD 볼륨 간에 파티션을 다시 할당할 때 유용할 수 있습니다.

로그 디렉터리가 있는 JSON 파일 구조 재할당의 예

{
  "version": 1,
  "partitions": [
    {
      "topic": "example-topic-1",
      "partition": 0,
      "replicas": [1, 2, 3]
      "log_dirs": ["/var/lib/kafka/data-0/kafka-log1", "any", "/var/lib/kafka/data-1/kafka-log2"]
    },
    {
      "topic": "example-topic-1",
      "partition": 1,
      "replicas": [2, 3, 4]
      "log_dirs": ["any",  "/var/lib/kafka/data-2/kafka-log3", "/var/lib/kafka/data-3/kafka-log4"]
    },
    {
      "topic": "example-topic-2",
      "partition": 0,
      "replicas": [3, 4, 5]
      "log_dirs": ["/var/lib/kafka/data-4/kafka-log5", "any",  "/var/lib/kafka/data-5/kafka-log6"]
    }
  ]
}

20.1.4. 파티션 재할당 제한

브로커 간에 대량의 데이터를 전송해야 하므로 파티션 재할당은 느린 프로세스일 수 있습니다. 클라이언트에 부정적인 영향을 미치지 않도록 하려면 재할당 프로세스를 중단할 수 있습니다. kafka-reassign-partitions.sh 툴과 함께 --throttle 매개변수를 사용하여 재할당을 제한합니다. 브로커 간 파티션 이동에 대한 초당 최대 임계값(바이트)을 지정합니다. 예를 들어 --throttle 5000000 은 50MBps의 파티션 이동을 위한 최대 임계값을 설정합니다.

제한으로 인해 재할당이 완료되는 데 시간이 더 걸릴 수 있습니다.

  • 스로틀이 너무 낮으면 새로 할당된 브로커는 게시되는 레코드를 유지할 수 없으며 재할당이 완료되지 않습니다.
  • 스로틀이 너무 높으면 클라이언트에 영향을 미칩니다.

예를 들어 프로듀서의 경우 이는 승인을 기다리는 일반 대기 시간보다 높을 수 있습니다. 소비자의 경우 폴링 간에 대기 시간이 길기 때문에 처리량이 저하될 수 있습니다.

20.2. 파티션을 다시 할당하기 위한 재할당 JSON 파일 생성

kafka-reassign-partitions.sh 툴을 사용하여 Kafka 클러스터를 확장한 후 파티션을 다시 할당하도록 JSON 파일을 다시 할당합니다. 브로커를 추가하거나 제거해도 기존 파티션을 자동으로 재배포하지 않습니다. 파티션 배포를 밸런싱하고 새 브로커를 최대한 활용하려면 kafka-reassign-partitions.sh 도구를 사용하여 파티션을 다시 할당할 수 있습니다.

Kafka 클러스터에 연결된 대화형 Pod 컨테이너에서 툴을 실행합니다.

다음 절차에서는 mTLS를 사용하는 보안 재할당 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.

연결을 설정하려면 다음이 필요합니다.

  • Kafka 클러스터가 생성될 때 Cluster Operator에서 생성한 클러스터 CA 인증서 및 암호
  • 사용자가 Kafka 클러스터에 대한 클라이언트 액세스를 위해 생성될 때 User Operator에서 생성한 사용자 CA 인증서 및 암호

이 절차에서 CA 인증서 및 해당 암호는 PKCS #12(.p12.password) 형식으로 포함하는 클러스터 및 사용자 시크릿에서 추출됩니다. 암호를 사용하면 인증서가 포함된 .p12 저장소에 액세스할 수 있습니다. .p12 저장소를 사용하여 Kafka 클러스터에 대한 연결을 인증할 신뢰 저장소 및 키 저장소를 지정합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • 내부 TLS 암호화 및 mTLS 인증으로 구성된 Kafka 리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다.

    TLS 암호화 및 mTLS 인증을 사용하여 Kafka 구성

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        listeners:
          # ...
          - name: tls
            port: 9093
            type: internal
            tls: true 
    1
    
            authentication:
              type: tls 
    2
    
        # ...

    1
    내부 리스너에 대한 TLS 암호화를 활성화합니다.
    2
    상호 tls 로 지정된 리스너 인증 메커니즘 .
  • 실행 중인 Kafka 클러스터에는 다시 할당할 주제 및 파티션 세트가 포함되어 있습니다.

    my-topic의 주제 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: my-topic
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 10
      replicas: 3
      config:
        retention.ms: 7200000
        segment.bytes: 1073741824
        # ...

  • Kafka 브로커에서 주제를 생성하고 사용할 수 있는 권한을 지정하는 ACL 규칙으로 KafkaUser 가 구성되어 있습니다.

    my-topicmy-cluster에서 작업을 허용하는 ACL 규칙이 있는 Kafka 사용자 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaUser
    metadata:
      name: my-user
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      authentication: 
    1
    
        type: tls
      authorization:
        type: simple 
    2
    
        acls:
          # access to the topic
          - resource:
              type: topic
              name: my-topic
            operations:
              - Create
              - Describe
              - Read
              - AlterConfigs
            host: "*"
          # access to the cluster
          - resource:
              type: cluster
            operations:
              - Alter
              - AlterConfigs
            host: "*"
          # ...
      # ...

    1
    상호 tls 로 정의된 사용자 인증 메커니즘 .
    2
    간단한 권한 부여 및 ACL 규칙 목록.

프로세스

  1. Kafka 클러스터의 <cluster _name> -cluster-ca-cert 시크릿에서 클러스터 CA 인증서 및 암호를 추출합니다.

    oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12
    oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password

    & lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다. Kafka 리소스를 사용하여 Kafka 를 배포할 때 클러스터 CA 인증서가 있는 시크릿은 Kafka 클러스터 이름(<cluster_name> -cluster-ca-cert)을 사용하여 생성됩니다. 예를 들면 my-cluster-cluster-ca-cert 입니다.

  2. Apache Kafka 이미지의 Streams를 사용하여 새 대화형 pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.

    oc run --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 <interactive_pod_name> -- /bin/sh -c "sleep 3600"

    & lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.

  3. 클러스터 CA 인증서를 대화형 Pod 컨테이너에 복사합니다.

    oc cp ca.p12 <interactive_pod_name>:/tmp
  4. Kafka 브로커에 액세스할 수 있는 권한이 있는 Kafka 사용자의 시크릿에서 사용자 CA 인증서 및 암호를 추출합니다.

    oc get secret <kafka_user> -o jsonpath='{.data.user\.p12}' | base64 -d > user.p12
    oc get secret <kafka_user> -o jsonpath='{.data.user\.password}' | base64 -d > user.password

    & lt;kafka_user >를 Kafka 사용자의 이름으로 바꿉니다. KafkaUser 리소스를 사용하여 Kafka 사용자를 생성하면 사용자 CA 인증서가 있는 시크릿이 Kafka 사용자 이름으로 생성됩니다. 예를 들면 my-user 입니다.

  5. 사용자 CA 인증서를 대화형 Pod 컨테이너에 복사합니다.

    oc cp user.p12 <interactive_pod_name>:/tmp

    CA 인증서를 사용하면 대화형 Pod 컨테이너가 TLS를 사용하여 Kafka 브로커에 연결할 수 있습니다.

  6. config.properties 파일을 생성하여 Kafka 클러스터에 대한 연결을 인증하는 데 사용되는 truststore 및 키 저장소를 지정합니다.

    이전 단계에서 추출한 인증서 및 암호를 사용합니다.

    bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093 
    1
    
    security.protocol=SSL 
    2
    
    ssl.truststore.location=/tmp/ca.p12 
    3
    
    ssl.truststore.password=<truststore_password> 
    4
    
    ssl.keystore.location=/tmp/user.p12 
    5
    
    ssl.keystore.password=<keystore_password> 
    6
    1
    Kafka 클러스터에 연결할 부트스트랩 서버 주소입니다. < kafka_cluster_name>을 교체하려면 자체 Kafka 클러스터 이름을 사용합니다.
    2
    암호화에 TLS를 사용할 때 보안 프로토콜 옵션입니다.
    3
    truststore 위치에는 Kafka 클러스터의 공개 키 인증서(ca.p12)가 포함되어 있습니다.
    4
    신뢰 저장소에 액세스하기 위한 암호(ca.password)입니다.
    5
    키 저장소 위치에는 Kafka 사용자의 공개 키 인증서(user.p12)가 포함되어 있습니다.
    6
    키 저장소에 액세스하기 위한 암호(user.password)입니다.
  7. config.properties 파일을 대화형 Pod 컨테이너에 복사합니다.

    oc cp config.properties <interactive_pod_name>:/tmp/config.properties
  8. 이동할 주제를 지정하는 topics.json 이라는 JSON 파일을 준비합니다.

    주제 이름을 쉼표로 구분된 목록으로 지정합니다.

    my-topic의 모든 파티션을 다시 할당하는 JSON 파일의 예

    {
      "version": 1,
      "topics": [
        { "topic": "my-topic"}
      ]
    }

    이 파일을 사용하여 주제의 복제 요소를 변경할 수도 있습니다.

  9. topics.json 파일을 대화형 Pod 컨테이너에 복사합니다.

    oc cp topics.json <interactive_pod_name>:/tmp/topics.json
  10. 대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.

    oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash

    & lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.

  11. kafka-reassign-partitions.sh 명령을 사용하여 재할당 JSON을 생성합니다.

    my-topic 의 파티션을 지정된 브로커로 이동하는 명령의 예

    bin/kafka-reassign-partitions.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --topics-to-move-json-file /tmp/topics.json \
      --broker-list 0,1,2,3,4 \
      --generate

20.3. 브로커 추가 후 파티션 재할당

kafka-reassign-partitions.sh 툴에서 생성한 재할당 파일을 사용하여 Kafka 클러스터의 브로커 수를 늘린 후 파티션을 다시 할당합니다. 재할당 파일은 확대된 Kafka 클러스터의 브로커에 파티션을 다시 할당하는 방법을 설명해야 합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다.

이 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.

kafka-reassign-partitions.sh 툴은 클러스터를 통해 모든 노드를 관리하고 있는지 또는 노드 풀을 사용하여 클러스터 내의 노드 그룹을 관리하는지 여부에 관계없이 Kafka 클러스터 내에서 파티션을 다시 할당하는 데 사용할 수 있습니다.

참고

kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동 파티션 재할당 및 클러스터 재조정에 Cruise Control을 사용하는 것이 좋습니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.

사전 요구 사항

  • 내부 TLS 암호화 및 mTLS 인증으로 구성된 Kafka 리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다.
  • reassignment.json 이라는 JSON 파일을 다시 생성 했습니다.
  • 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
  • Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된 KafkaUser 로 연결되어 있습니다.

프로세스

  1. Kafka.spec.kafka.replicas 구성 옵션을 늘려 필요한 만큼 새 브로커를 추가합니다.
  2. 새 브로커 Pod가 시작되었는지 확인합니다.
  3. 이 작업을 수행하지 않은 경우 대화형 Pod 컨테이너를 실행하여 reassignment.json 이라는 재할당 JSON 파일을 생성합니다.
  4. reassignment.json 파일을 대화형 Pod 컨테이너에 복사합니다.

    oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json

    & lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.

  5. 대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.

    oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash

    & lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.

  6. 대화형 Pod 컨테이너에서 kafka-reassign-partitions.sh 스크립트를 사용하여 파티션 재할당을 실행합니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
     <cluster_name>-kafka-bootstrap:9093 \
     --command-config /tmp/config.properties \
     --reassignment-json-file /tmp/reassignment.json \
     --execute

    & lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다. 예: my-cluster-kafka-bootstrap:9093

    복제를 제한하려면broker throttled 속도(초당 바이트)로 --throttle 옵션을 전달할 수도 있습니다. 예를 들면 다음과 같습니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --throttle 5000000 \
      --execute

    이 명령은 두 개의 재할당 JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 이 값을 저장해야 합니다. 두 번째 JSON 오브젝트는 재할당 JSON 파일에 전달된 대상 재할당입니다.

    재할당하는 동안 throttle을 변경해야하는 경우 다른 제한 속도로 동일한 명령을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --throttle 10000000 \
      --execute
  7. 브로커 Pod의 kafka-reassign-partitions.sh 명령줄 도구를 사용하여 재할당이 완료되었는지 확인합니다. 이 명령은 이전 단계와 동일하지만 --execute 옵션 대신 --verify 옵션을 사용합니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --verify

    --verify 명령은 이동 중인 각 파티션이 성공적으로 완료되었음을 보고하면 재할당이 완료되었습니다. 이 마지막 --verify 는 또한 reassignment throttles를 제거하는 효과가 있습니다.

  8. 원래 브로커로 할당을 되돌리기 위해 JSON을 저장한 경우 revert 파일을 삭제할 수 있습니다.

20.4. 브로커를 제거하기 전에 파티션 재할당

Kafka 클러스터의 브로커 수를 줄이기 전에 kafka-reassign-partitions.sh 툴에서 생성한 재할당 파일을 사용하여 파티션을 다시 할당합니다. 재할당 파일은 Kafka 클러스터의 나머지 브로커에 파티션을 다시 할당하는 방법을 설명해야합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다. 가장 많은 Pod의 브로커가 먼저 제거됩니다.

이 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.

kafka-reassign-partitions.sh 툴은 클러스터를 통해 모든 노드를 관리하고 있는지 또는 노드 풀을 사용하여 클러스터 내의 노드 그룹을 관리하는지 여부에 관계없이 Kafka 클러스터 내에서 파티션을 다시 할당하는 데 사용할 수 있습니다.

참고

kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동 파티션 재할당 및 클러스터 재조정에 Cruise Control을 사용하는 것이 좋습니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.

사전 요구 사항

  • 내부 TLS 암호화 및 mTLS 인증으로 구성된 Kafka 리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다.
  • reassignment.json 이라는 JSON 파일을 다시 생성 했습니다.
  • 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
  • Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된 KafkaUser 로 연결되어 있습니다.

프로세스

  1. 이 작업을 수행하지 않은 경우 대화형 Pod 컨테이너를 실행하여 reassignment.json 이라는 재할당 JSON 파일을 생성합니다.
  2. reassignment.json 파일을 대화형 Pod 컨테이너에 복사합니다.

    oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json

    & lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.

  3. 대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.

    oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash

    & lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.

  4. 대화형 Pod 컨테이너에서 kafka-reassign-partitions.sh 스크립트를 사용하여 파티션 재할당을 실행합니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
     <cluster_name>-kafka-bootstrap:9093 \
     --command-config /tmp/config.properties \
     --reassignment-json-file /tmp/reassignment.json \
     --execute

    & lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다. 예: my-cluster-kafka-bootstrap:9093

    복제를 제한하려면broker throttled 속도(초당 바이트)로 --throttle 옵션을 전달할 수도 있습니다. 예를 들면 다음과 같습니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --throttle 5000000 \
      --execute

    이 명령은 두 개의 재할당 JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 이 값을 저장해야 합니다. 두 번째 JSON 오브젝트는 재할당 JSON 파일에 전달된 대상 재할당입니다.

    재할당하는 동안 throttle을 변경해야하는 경우 다른 제한 속도로 동일한 명령을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --throttle 10000000 \
      --execute
  5. 브로커 Pod의 kafka-reassign-partitions.sh 명령줄 도구를 사용하여 재할당이 완료되었는지 확인합니다. 이 명령은 이전 단계와 동일하지만 --execute 옵션 대신 --verify 옵션을 사용합니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --verify

    --verify 명령은 이동 중인 각 파티션이 성공적으로 완료되었음을 보고하면 재할당이 완료되었습니다. 이 마지막 --verify 는 또한 reassignment throttles를 제거하는 효과가 있습니다.

  6. 원래 브로커로 할당을 되돌리기 위해 JSON을 저장한 경우 revert 파일을 삭제할 수 있습니다.
  7. 모든 파티션 재할당이 완료되면 제거되는 브로커는 클러스터의 파티션에 대한 책임이 없어야 합니다. 브로커의 데이터 로그 디렉터리에 라이브 파티션 로그가 포함되어 있지 않은지 확인하여 이를 확인할 수 있습니다. 브로커의 로그 디렉터리에 확장 정규식 \.[a-z0-9]-delete$ 와 일치하지 않는 디렉터리가 포함되어 있는 경우 브로커에는 여전히 라이브 파티션이 있으므로 중지해서는 안 됩니다.

    다음 명령을 실행하여 확인할 수 있습니다.

    oc exec my-cluster-kafka-0 -c kafka -it -- \
      /bin/bash -c \
      "ls -l /var/lib/kafka/kafka-log_<n>_ | grep -E '^d' | grep -vE '[a-zA-Z0-9.-]+\.[a-z0-9]+-delete$'"

    여기서 n 은 삭제 중인 Pod 수입니다.

    위의 명령이 출력을 출력하는 경우 브로커에는 여전히 라이브 파티션이 있습니다. 이 경우 재할당이 완료되지 않았거나 재할당 JSON 파일이 올바르지 않았습니다.

  8. 브로커에 라이브 파티션이 없음을 확인하면 Kafka 리소스의 Kafka.spec.kafka.replicas 속성을 편집하여 브로커 수를 줄일 수 있습니다.

20.5. 주제의 복제 요소 변경

Kafka 클러스터에서 주제의 복제 요소를 변경하려면 kafka-reassign-partitions.sh 툴을 사용합니다. 이 작업은 Kafka 클러스터에 연결된 대화형 pod 컨테이너에서 툴을 실행하고 재할당 파일을 사용하여 주제 복제본을 변경하는 방법을 설명하여 수행할 수 있습니다.

이 절차에서는 TLS를 사용하는 보안 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.

사전 요구 사항

  • 내부 TLS 암호화 및 mTLS 인증으로 구성된 Kafka 리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다.
  • 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
  • reassignment.json 이라는 JSON 파일을 다시 생성했습니다.
  • Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된 KafkaUser 로 연결되어 있습니다.

JSON 파일 다시 할당을 참조하십시오.

이 절차에서 my-topic 이라는 주제에는 4개의 복제본이 있으며 이를 3으로 줄이고자 합니다. topics.json 이라는 JSON 파일은 주제를 지정하고 reassignment.json 파일을 생성하는 데 사용되었습니다.

JSON 파일의 예는 my-topic을 지정합니다.

{
  "version": 1,
  "topics": [
    { "topic": "my-topic"}
  ]
}

프로세스

  1. 이 작업을 수행하지 않은 경우 대화형 Pod 컨테이너를 실행하여 reassignment.json 이라는 재할당 JSON 파일을 생성합니다.

    현재 및 제안된 복제본 할당을 표시하는 재할당 JSON 파일의 예

    Current partition replica assignment
    {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[3,4,2,0],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[0,2,3,1],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[1,3,0,4],"log_dirs":["any","any","any","any"]}]}
    
    Proposed partition reassignment configuration
    {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3,4],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4,0],"log_dirs":["any","any","any","any"]}]}

    나중에 변경 사항을 복원해야 하는 경우 이 파일의 사본을 로컬에 저장합니다.

  2. reassignment.json 을 편집하여 각 파티션에서 복제본을 제거합니다.

    예를 들어 jq 명령줄 JSON 구문 분석 도구를 사용하여 주제의 각 파티션에 대한 목록의 마지막 복제본을 제거합니다.

    각 파티션의 마지막 주제 복제본 제거

    jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json

    업데이트된 복제본을 표시하는 재할당 파일의 예

    {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}

  3. reassignment.json 파일을 대화형 Pod 컨테이너에 복사합니다.

    oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json

    & lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.

  4. 대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.

    oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash

    & lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.

  5. 대화형 pod 컨테이너에서 kafka-reassign-partitions.sh 스크립트를 사용하여 topic replica를 변경합니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
     <cluster_name>-kafka-bootstrap:9093 \
     --command-config /tmp/config.properties \
     --reassignment-json-file /tmp/reassignment.json \
     --execute
    참고

    브로커에서 복제본을 제거해도 데이터 간 데이터 이동이 필요하지 않으므로 복제를 방해할 필요가 없습니다. 복제본을 추가하는 경우 throttle 속도를 변경해야 할 수 있습니다.

  6. 브로커 Pod의 kafka-reassign-partitions.sh 명령줄 도구를 사용하여 주제 복제본에 대한 변경이 완료되었는지 확인합니다. 이 명령은 이전 단계와 동일하지만 --execute 옵션 대신 --verify 옵션을 사용합니다.

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --verify

    --verify 명령은 이동 중인 각 파티션이 성공적으로 완료되었음을 보고하면 재할당이 완료되었습니다. 이 마지막 --verify 는 또한 reassignment throttles를 제거하는 효과가 있습니다.

  7. bin/kafka-topics.sh 명령을 --describe 옵션과 함께 실행하여 주제 변경 결과를 확인합니다.

    bin/kafka-topics.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --describe

    주제의 복제본 수를 줄이는 결과

    my-topic  Partition: 0  Leader: 0  Replicas: 0,1,2 Isr: 0,1,2
    my-topic  Partition: 1  Leader: 2  Replicas: 1,2,3 Isr: 1,2,3
    my-topic  Partition: 2  Leader: 3  Replicas: 2,3,4 Isr: 2,3,4

  8. 마지막으로 KafkaTopic 사용자 정의 리소스를 편집하여 .spec.replicas 를 3으로 변경한 다음 조정을 기다립니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: my-topic
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 3
      replicas: 3

21장. Apache Kafka의 Streams에 대한 메트릭 및 대시보드 설정

메트릭을 수집하는 것은 Kafka 배포의 상태 및 성능을 이해하는 데 중요합니다. 메트릭을 모니터링하면 중요 상태가 되기 전에 문제를 적극적으로 식별하고 리소스 할당 및 용량 계획에 대한 정보에 입각한 결정을 내릴 수 있습니다. 메트릭이 없으면 Kafka 배포의 동작에 대한 가시성이 제한되어 문제 해결을 더 어렵고 시간이 많이 소요될 수 있습니다. 메트릭을 설정하면 장기적으로 시간과 리소스를 절약할 수 있으며 Kafka 배포의 안정성을 보장하는 데 도움이 됩니다.

메트릭은 Apache Kafka용 Streams의 각 구성 요소에 사용할 수 있으므로 개별 성능에 대한 중요한 통찰력을 제공합니다. 다른 구성 요소에는 메트릭 노출을 노출하기 위한 구성이 필요하지만 Apache Kafka Operator의 Streams는 기본적으로 Prometheus 지표를 자동으로 노출합니다. 이러한 메트릭에는 다음이 포함됩니다.

  • 조정 수
  • 처리 중인 사용자 정의 리소스 수
  • 조정 기간
  • JVM 지표

Kafka 리소스의 리스너 또는 권한 부여 구성에서 enableMetrics 속성을 활성화하여 oauth 인증 및 opa 또는 keycloak 권한과 관련된 메트릭을 수집할 수도 있습니다. 마찬가지로 KafkaBridge,KafkaConnect, KafkaMirrorMaker , KafkaMirrorMaker 2 와 같은 사용자 정의 리소스에서 oauth 인증에 대한 메트릭을 활성화할 수 있습니다.

Apache Kafka Console의 Streams는 Kafka 클러스터에서 메트릭을 모니터링하기 위한 사용자 인터페이스를 제공합니다. Apache Kafka용 Streams에서 관리하는 Kafka 클러스터를 Apache Kafka 콘솔의 Streams에 연결하면 브로커, 주제, 파티션 및 소비자 그룹과 같은 구성 요소에 대한 자세한 정보에 액세스할 수 있습니다.

참고

Apache Kafka Console의 Streams는 현재 기술 프리뷰로 사용할 수 있습니다.

Prometheus 및 Grafana를 사용하여 Apache Kafka의 Streams를 모니터링할 수도 있습니다. Prometheus 규칙으로 구성된 경우 Prometheus는 클러스터에서 실행 중인 Pod의 지표를 사용합니다. Grafana는 대시보드에 이러한 메트릭을 시각화하여 모니터링을 위한 직관적인 인터페이스를 제공합니다.

메트릭 통합을 용이하게 하기 위해 Apache Kafka의 Streams는 Apache Kafka 구성 요소에 대한 Streams에 대한 Prometheus 규칙 및 Grafana 대시보드를 제공합니다. 특정 배포 요구 사항에 맞게 Grafana 대시보드를 사용자 지정할 수 있습니다. 규칙을 사용하여 특정 메트릭을 기반으로 경고를 트리거하는 조건을 정의할 수 있습니다.

모니터링 요구 사항에 따라 다음을 수행할 수 있습니다.

또한 분산 추적을 설정하거나 진단 도구 (report.sh)를 사용하여 문제 해결 데이터를 검색하여 메시지를 엔드 투 엔드로 추적 하도록 배포를 구성할 수 있습니다.

참고

Apache Kafka의 스트림은 Prometheus 및 Grafana에 대한 설치 파일 예제를 제공합니다. 이 파일은 Streams for Apache Kafka 배포를 모니터링하기 위한 시작점 역할을 할 수 있습니다. 추가 지원을 받으려면 Prometheus 및 Grafana 개발자 커뮤니티에 참여하십시오.

메트릭 및 모니터링 툴에 대한 지원 문서

메트릭 및 모니터링 툴에 대한 자세한 내용은 지원 문서를 참조하십시오.

21.1. Kafka 내보내기를 사용하여 소비자 지연 모니터링

Kafka Exporter 는 Apache Kafka 브로커 및 클라이언트의 모니터링을 개선하는 오픈 소스 프로젝트입니다. Kafka 클러스터와 함께 Kafka Exporter를 배포하도록 Kafka 리소스를 구성할 수 있습니다. Kafka Exporter는 오프셋, 소비자 그룹, 소비자 지연 및 주제와 관련된 Kafka 브로커에서 추가 지표 데이터를 추출합니다. 예를 들어 지표 데이터는 느린 소비자를 식별하는 데 사용됩니다. 지연 데이터는 Prometheus 지표로 노출되며 분석을 위해 Grafana에 표시될 수 있습니다.

Kafka Exporter는 소비자 그룹의 커밋된 오프셋에 대한 정보를 저장하는 __consumer_offsets 항목에서 읽습니다. Kafka Exporter가 제대로 작동하려면 소비자 그룹이 사용 중이어야 합니다.

Kafka Exporter용 Grafana 대시보드는 Apache Kafka용 Streams에서 제공하는 많은 Grafana 대시보드 중 하나입니다.

중요

Kafka 내보내기는 소비자 지연 및 소비자 오프셋과 관련된 추가 지표만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.

소비자 지연은 메시지의 프로덕션 속도와 사용 속도의 차이를 나타냅니다. 특히 지정된 소비자 그룹의 소비자 지연은 파티션의 마지막 메시지와 해당 소비자가 현재 선택 중인 메시지 사이의 지연을 나타냅니다.

지연은 파티션 로그의 끝과 관련하여 소비자 오프셋의 위치를 반영합니다.

생산자와 소비자 오프셋 간의 소비자 지연

Consumer lag

이러한 차이점은 생산자 오프셋과 소비자 오프셋 간의 delta: Kafka 브로커 주제 파티션의 읽기 및 쓰기 위치라고도 합니다.

주제가 1초에 100개의 메시지를 스트리밍한다고 가정합니다. 생산자 오프셋(주파 파티션 헤드)과 소비자가 읽은 마지막 오프셋은 10초 지연을 의미합니다.

소비자 지연 모니터링의 중요성

실시간 데이터의 처리에 의존하는 애플리케이션의 경우 소비자 지연을 모니터링하는 것이 너무 크지 않은지 확인하는 것이 중요합니다. 지연이 많을수록 프로세스가 실시간 처리 목표에서 이동합니다.

예를 들어 소비자 지연은 제거되지 않았거나 계획되지 않은 종료를 통해 오래된 데이터를 너무 많이 소비한 결과일 수 있습니다.

소비자 지연 감소

Grafana 차트를 사용하여 지연을 분석하고 지연을 줄이는 작업이 영향을 받는 소비자 그룹에 영향을 미치는지 확인합니다. 예를 들어 Kafka 브로커가 지연을 줄이기 위해 조정되면 대시보드에는 소비자 그룹 차트가 중단되고 분별 메시지 차트가 가동되는 메시지가 표시됩니다.

지연을 줄이기 위한 일반적인 작업은 다음과 같습니다.

  • 새 소비자를 추가하여 소비자 그룹 확장
  • 메시지가 주제에 남아 있도록 보존 시간 늘리기
  • 메시지 버퍼를 늘리기 위해 디스크 용량을 더 추가

소비자 지연을 줄이기 위한 작업은 기본 인프라와 Apache Kafka의 스트림 스트림이 지원 중인 사용 사례에 따라 달라집니다. 예를 들어, 지연된 소비자는 브로커에서 디스크 캐시의 가져오기 요청을 서비스할 수 있는 이점이 줄어듭니다. 또한 특정 경우에는 소비자가 catch될 때까지 메시지를 자동으로 삭제하는 것이 허용될 수 있습니다.

21.2. Cruise Control 작업 모니터링

크루즈 컨트롤은 브로커, 주제 및 파티션의 사용을 추적하기 위해 Kafka 브로커를 모니터링합니다. 크루즈 컨트롤은 자체 성능을 모니터링하기 위한 메트릭 세트도 제공합니다.

Cruise Control 지표 보고자는 Kafka 브로커에서 원시 메트릭 데이터를 수집합니다. 데이터는 Cruise Control에 의해 자동으로 생성되는 주제로 생성됩니다. 메트릭은 Kafka 클러스터에 대한 최적화 제안을 생성하는 데 사용됩니다.

크루즈 제어 메트릭은 Cruise Control 작업의 실시간 모니터링에 사용할 수 있습니다. 예를 들어 Cruise Control 메트릭을 사용하여 실행 중인 재조정 작업 상태를 모니터링하거나 작업 성능에서 감지된 예외에 대한 경고를 제공할 수 있습니다.

Cruise Control 구성에서 Prometheus Cryostat Exporter 를 활성화하여 Cruise Control 지표를 노출합니다.

참고

센서로 알려진 사용 가능한 Cruise Control 메트릭의 전체 목록은 Cruise Control 설명서를 참조하십시오.

21.2.1. 균형 조정 점수 모니터링

크루즈 컨트롤 메트릭에는 균형 잡힌 점수가 포함됩니다. 균형은 Kafka 클러스터에 워크로드가 균등하게 배포되는 방법의 척도입니다.

균형성 점수(balanceness-score)에 대한 Cruise Control 메트릭은 KafkaRebalance 리소스의 균형 잡힌 점수와 다를 수 있습니다. cruise Control은 KafkaRebalance 리소스에서 사용되는 default.goals 와 동일하지 않을 수 있는 anomaly.detection.goals 를 사용하여 각 점수를 계산합니다. anomaly.detection.goalsKafka 사용자 정의 리소스의 spec.cruiseControl.config 에 지정됩니다.

참고

KafkaRebalance 리소스를 새로 고치면 최적화 제안을 가져옵니다. 다음 조건 중 하나가 적용되는 경우 최신 캐시된 최적화 제안을 가져옵니다.

  • KafkaRebalance 목표는 Kafka 리소스의 default.goals 섹션에 구성된 목표와 일치합니다.
  • KafkaRebalance 목표는 지정되지 않음

그렇지 않으면 Cruise Control은 KafkaRebalance 목표를 기반으로 새로운 최적화 제안을 생성합니다. 새로 고침마다 새로운 제안이 생성되면 성능 모니터링에 영향을 미칠 수 있습니다.

21.2.2. 변칙 탐지에 대한 경고 설정

크루즈 컨트롤의 변종 탐지기는 브로커 실패와 같은 최적화 목표 생성을 차단하는 조건에 대한 메트릭 데이터를 제공합니다. 더 많은 가시성을 원하는 경우, anomaly detect에서 제공하는 메트릭을 사용하여 경고를 설정하고 알림을 보낼 수 있습니다. 지정된 알림 채널을 통해 이러한 메트릭을 기반으로 경고를 라우팅하도록 Cruise Control의 anomaly notifier 를 설정할 수 있습니다. 또는 anomaly detect에서 제공하는 메트릭 데이터를 스크랩하고 경고를 생성하도록 Prometheus를 설정할 수 있습니다. Prometheus Alertmanager는 Prometheus에서 생성한 경고를 라우팅할 수 있습니다.

Cruise Control 설명서AnomalyDetector 메트릭 및 anomaly notifier에 대한 정보를 제공합니다.

21.3. 메트릭 파일 예

Apache Kafka용 Streams에서 제공하는 구성 파일 예제에서 Grafana 대시보드 및 기타 지표 구성 파일 예를 찾을 수 있습니다.

Apache Kafka용 Streams와 함께 제공되는 메트릭 파일의 예

metrics
├── grafana-dashboards 
1

│   ├── strimzi-cruise-control.json
│   ├── strimzi-kafka-bridge.json
│   ├── strimzi-kafka-connect.json
│   ├── strimzi-kafka-exporter.json
│   ├── strimzi-kafka-mirror-maker-2.json
│   ├── strimzi-kafka.json
│   ├── strimzi-operators.json
│   └── strimzi-zookeeper.json
├── grafana-install
│   └── grafana.yaml 
2

├── prometheus-additional-properties
│   └── prometheus-additional.yaml 
3

├── prometheus-alertmanager-config
│   └── alert-manager-config.yaml 
4

├── prometheus-install
│    ├── alert-manager.yaml 
5

│    ├── prometheus-rules.yaml 
6

│    ├── prometheus.yaml 
7

│    └── strimzi-pod-monitor.yaml 
8

├── kafka-bridge-metrics.yaml 
9

├── kafka-connect-metrics.yaml 
10

├── kafka-cruise-control-metrics.yaml 
11

├── kafka-metrics.yaml 
12

└── kafka-mirror-maker-2-metrics.yaml 
13

1
Apache Kafka 구성 요소에 대한 다양한 Streams에 대한 Grafana 대시보드의 예.
2
Grafana 이미지에 대한 설치 파일입니다.
3
노드의 OpenShift cAdvisor 에이전트 및 kubelet에서 직접 제공되는 CPU, 메모리 및 디스크 볼륨 사용에 대한 메트릭을 스크랩하는 추가 구성입니다.
4
Alertmanager를 통해 알림을 전송하기 위한 후크 정의입니다.
5
Alertmanager 배포 및 구성을 위한 리소스입니다.
6
Prometheus Alertmanager와 함께 사용하기 위한 경고 규칙 예(Prometheus와 함께 배포됨)
7
Prometheus 이미지에 대한 설치 리소스 파일입니다.
8
Prometheus Operator에서 변환한 PodMonitor 정의는 Pod에서 직접 메트릭 데이터를 스크랩할 수 있도록 Prometheus 서버의 작업으로 변환됩니다.
9
메트릭이 활성화된 Kafka 브리지 리소스.
10
Kafka Connect에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.
11
Cruise Control에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.
12
Kafka 및 Zoo Cryostat에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.
13
Kafka MirrorMaker 2에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.

21.3.1. Prometheus 지표 구성의 예

Apache Kafka의 스트림은 Prometheus Cryostat Exporter 를 사용하여 Prometheus 서버에서 스크랩할 수 있는 HTTP 끝점을 통해 지표를 노출합니다.

Grafana 대시보드는 사용자 정의 리소스 구성에서 Apache Kafka 구성 요소에 대한 Streams에 대해 정의된 Prometheus Cryostat Exporter 재레이블 규칙에 따라 달라집니다.

레이블은 이름-값 쌍입니다. 레이블 재지정은 레이블을 동적으로 작성하는 프로세스입니다. 예를 들어 레이블의 값은 Kafka 서버 및 클라이언트 ID의 이름에서 파생될 수 있습니다.

Apache Kafka의 스트림은 레이블을 다시 지정하는 규칙을 사용하여 사용자 정의 리소스 구성 YAML 파일의 예를 제공합니다. Prometheus 지표 구성을 배포할 때 예제 사용자 정의 리소스를 배포하거나 메트릭 구성을 자체 사용자 정의 리소스 정의에 복사할 수 있습니다.

Expand
표 21.1. 메트릭 구성이 포함된 사용자 정의 리소스의 예
Component사용자 정의 리소스YAML 파일의 예

Kafka 및 Zoo Cryostat

Kafka

kafka-metrics.yaml

Kafka Connect

KafkaConnect

kafka-connect-metrics.yaml

Kafka MirrorMaker 2

KafkaMirrorMaker2

kafka-mirror-maker-2-metrics.yaml

Kafka Bridge

KafkaBridge

kafka-bridge-metrics.yaml

크루즈 제어

Kafka

kafka-cruise-control-metrics.yaml

21.3.2. 경고 알림에 대한 Prometheus 규칙의 예

경고 알림에 대한 Prometheus 규칙은 Apache Kafka용 Streams에서 제공하는 지표 구성 파일 예제 와 함께 제공됩니다. 규칙은 Prometheus 배포에서 사용할 수 있도록 예제 prometheus-rules.yaml 파일에 지정됩니다.

prometheus-rules.yaml 파일에는 다음 구성 요소에 대한 예제 규칙이 포함되어 있습니다.

  • Kafka
  • ZooKeeper
  • Entity Operator
  • Kafka Connect
  • Kafka Bridge
  • MirrorMaker
  • Kafka Exporter

각 예제 규칙에 대한 설명은 파일에 제공됩니다.

경고 규칙은 메트릭에서 관찰된 특정 상태에 대한 알림을 제공합니다. 규칙은 Prometheus 서버에서 선언되지만 Prometheus Alertmanager는 경고 알림을 담당합니다.

Prometheus 경고 규칙은 지속적으로 평가되는 PromQL 표현식을 사용하는 조건을 설명합니다.

경고 표현식이 true가 되면 조건이 충족되고 Prometheus 서버는 경고 데이터를 Alertmanager에 보냅니다. 그런 다음 Alertmanager는 배포에 대해 구성된 통신 방법을 사용하여 알림을 보냅니다.

경고 규칙 정의에 대한 일반 지점:

  • for 속성은 경고가 트리거되기 전에 조건이 유지되어야 하는 기간을 결정하기 위해 규칙과 함께 사용됩니다.
  • 틱은 밀리초 단위로 측정되고 Kafka.spec.zookeeper.configtickTime 매개 변수를 사용하여 구성된 기본 Zoo Cryostat 시간 단위입니다. 예를 들어, Zoo Cryostat tickTime=3000 인 경우 3 틱 (3 x 3000)은 9000 밀리초와 같습니다.
  • ZookeeperRunningOutOfSpace 지표 및 경고의 가용성은 사용된 OpenShift 구성 및 스토리지 구현에 따라 달라집니다. 특정 플랫폼에 대한 스토리지 구현은 메트릭이 경고를 제공하는 데 필요한 사용 가능한 공간에 대한 정보를 제공하지 못할 수 있습니다.

이메일, 채팅 메시지 또는 기타 알림 방법을 사용하도록 Alertmanager를 구성할 수 있습니다. 특정 요구 사항에 따라 예제 규칙의 기본 구성을 조정합니다.

21.3.3. Grafana 대시보드 예

지표를 제공하기 위해 Prometheus를 배포하는 경우 Apache Kafka용 Streams와 함께 제공되는 Grafana 대시보드 예제를 사용하여 Apache Kafka 구성 요소의 Streams를 모니터링할 수 있습니다.

예제 대시보드는 example/metrics/grafana-dashboards 디렉터리에 JSON 파일로 제공됩니다.

모든 대시보드는 JVM 지표와 구성 요소와 관련된 메트릭을 제공합니다. 예를 들어 Apache Kafka Operator용 Grafana 대시보드는 처리 중인 조정 또는 사용자 정의 리소스 수에 대한 정보를 제공합니다.

예제 대시보드에는 Kafka에서 지원하는 모든 메트릭이 표시되지 않습니다. 대시보드는 모니터링을 위한 대표 지표 세트로 채워집니다.

Expand
표 21.2. Grafana 대시보드 파일 예
ComponentJSON 파일의 예

Apache Kafka Operator용 스트림

strimzi-operators.json

Kafka

strimzi-kafka.json

ZooKeeper

strimzi-zookeeper.json

Kafka Connect

strimzi-kafka-connect.json

Kafka MirrorMaker 2

strimzi-kafka-mirror-maker-2.json

Kafka Bridge

strimzi-kafka-bridge.json

크루즈 제어

strimzi-cruise-control.json

Kafka Exporter

strimzi-kafka-exporter.json

참고

Kafka Exporter에서 메트릭을 사용할 수 없는 경우 아직 클러스터에 트래픽이 없기 때문에 Kafka Exporter Grafana 대시보드에 숫자 필드에 N/A, 그래프에 표시할 데이터가 없습니다.

21.4. 구성을 통해 Prometheus 지표 활성화

Prometheus용 Apache Kafka의 Streams에 지표를 활성화하고 노출하려면 지표 구성 속성을 사용합니다.

다음 구성 요소에는 메트릭을 노출하려면 metricsConfig 구성이 필요합니다.

  • Kafka
  • KafkaConnect
  • MirrorMaker
  • 크루즈 제어
  • ZooKeeper

이 구성을 사용하면 Prometheus Cryostat Exporter 가 HTTP 끝점을 통해 지표를 노출할 수 있습니다. Cryostat 내보내기 HTTP 끝점의 포트는 9404입니다. Prometheus는 이 끝점을 스크랩하여 Kafka 지표를 수집합니다.

이러한 구성 요소의 메트릭을 노출하려면 enableMetrics 속성을 true 로 설정합니다.

  • Kafka Bridge
  • OAuth 2.0 인증 및 권한 부여 프레임워크
  • 승인을 위한 OPA(Open Policy Agent)

Apache Kafka의 Streams에 Prometheus 지표 구성을 배포하려면 자체 구성 또는 Apache Kafka용 Streams와 함께 제공되는 사용자 정의 리소스 구성 파일 예제 를 사용할 수 있습니다.

  • kafka-metrics.yaml
  • kafka-connect-metrics.yaml
  • kafka-mirror-maker-2-metrics.yaml
  • kafka-bridge-metrics.yaml
  • kafka-cruise-control-metrics.yaml
  • oauth-metrics.yaml

이러한 파일에는 Prometheus 지표를 활성화하는 데 필요한 재레이블 규칙 및 구성이 포함되어 있습니다. Apache Kafka용 Streams로 Prometheus를 시도하는 데 좋은 출발점입니다.

다음 절차에서는 Kafka 리소스에 예제 Prometheus 지표 구성을 배포하는 방법을 보여줍니다. 다른 리소스에 대한 예제 파일을 배포할 때 프로세스는 동일합니다.

Kafka Exporter 지표를 포함하려면 Kafka 리소스에 kafkaExporter 구성을 추가합니다.

중요

Kafka 내보내기는 소비자 지연 및 소비자 오프셋과 관련된 추가 지표만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.

프로세스

  1. Prometheus 구성을 사용하여 예제 사용자 정의 리소스를 배포합니다.

    예를 들어 각 Kafka 리소스에 대해 kafka-metrics.yaml 파일을 적용할 수 있습니다.

    예제 구성 배포

    oc apply -f kafka-metrics.yaml

    또는 kafka-metrics.yaml 의 예제 구성을 자체 Kafka 리소스에 복사할 수 있습니다.

    예제 구성 복사

    oc edit kafka <kafka_configuration_file>

    Kafka 리소스에 대한 metricsConfig 속성 및 ConfigMap 을 복사합니다.

    Kafka의 메트릭 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        metricsConfig: 
    1
    
          type: jmxPrometheusExporter
          valueFrom:
            configMapKeyRef:
              name: kafka-metrics
              key: kafka-metrics-config.yml
    ---
    kind: ConfigMap 
    2
    
    apiVersion: v1
    metadata:
      name: kafka-metrics
      labels:
        app: strimzi
    data:
      kafka-metrics-config.yml: |
      # metrics configuration...

    1
    메트릭 구성이 포함된 ConfigMap을 참조하는 metricsConfig 속성을 복사합니다.
    2
    메트릭 구성을 지정하는 전체 ConfigMap 을 복사합니다.
  2. Kafka Exporter를 배포하려면 kafkaExporter 구성을 추가합니다.

    kafkaExporter 구성은 Kafka 리소스에만 지정됩니다.

    Kafka 내보내기 배포를 위한 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      # ...
      kafkaExporter:
        image: my-registry.io/my-org/my-exporter-cluster:latest 
    1
    
        groupRegex: ".*" 
    2
    
        topicRegex: ".*" 
    3
    
        groupExcludeRegex: "^excluded-.*" 
    4
    
        topicExcludeRegex: "^excluded-.*" 
    5
    
        resources: 
    6
    
          requests:
            cpu: 200m
            memory: 64Mi
          limits:
            cpu: 500m
            memory: 128Mi
        logging: debug 
    7
    
        enableSaramaLogging: true 
    8
    
        template: 
    9
    
          pod:
            metadata:
              labels:
                label1: value1
            imagePullSecrets:
              - name: my-docker-credentials
            securityContext:
              runAsUser: 1000001
              fsGroup: 0
            terminationGracePeriodSeconds: 120
        readinessProbe: 
    10
    
          initialDelaySeconds: 15
          timeoutSeconds: 5
        livenessProbe: 
    11
    
          initialDelaySeconds: 15
          timeoutSeconds: 5
    # ...

    1
    ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
    2
    메트릭에 포함할 소비자 그룹을 지정하는 정규식입니다.
    3
    메트릭에 포함할 주제를 지정하는 정규식입니다.
    4
    메트릭에서 제외할 소비자 그룹을 지정하는 정규식입니다.
    5
    메트릭에서 제외할 주제를 지정하는 정규식입니다.
    6
    예약할 CPU 및 메모리 리소스입니다.
    7
    로깅 구성은 심각도가 지정된 메시지(debug, info, warn, error, fatal) 이상을 기록합니다.
    8
    Kafka Exporter에서 사용하는 Go 클라이언트 라이브러리인 Sarama 로깅을 활성화하는 부울입니다.
    9
    배포 템플릿 및 포드 사용자 지정.
    10
    상태 점검 준비 프로브.
    11
    상태 점검 활성 프로브.
참고

Kafka Exporter가 제대로 작동하려면 소비자 그룹이 사용 중이어야 합니다.

Kafka 브리지의 메트릭 활성화

Kafka Bridge의 지표를 노출하려면 KafkaBridge 리소스에서 enableMetrics 속성을 true 로 설정합니다.

Kafka 브리지의 메트릭 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaBridge
metadata:
  name: my-bridge
spec:
  # ...
  bootstrapServers: my-cluster-kafka:9092
  http:
    # ...
  enableMetrics: true
  # ...

OAuth 2.0 및 OPA 메트릭 활성화

OAuth 2.0 또는 OPA의 메트릭을 노출하려면 적절한 사용자 정의 리소스에서 enableMetrics 속성을 true 로 설정합니다.

OAuth 2.0 메트릭

Kafka 리소스에서 Kafka 클러스터 권한 부여 및 Kafka 리스너 인증에 대한 지표를 활성화합니다.

지원되는 다른 구성 요소의 사용자 정의 리소스에서 OAuth 2.0 인증에 대한 메트릭을 활성화할 수도 있습니다.

OPA 메트릭
Kafka 클러스터 권한 부여 메트릭을 OAuth 2.0과 동일한 방식으로 Kafka 리소스를 활성화합니다.

다음 예에서 OAuth 2.0 리스너 인증 및 OAuth 2.0(keycloak) 클러스터 권한에 대해 메트릭이 활성화됩니다.

OAuth 2.0에 대해 메트릭이 활성화된 클러스터 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  namespace: myproject
spec:
  kafka:
    # ...
    listeners:
    - name: external3
      port: 9094
      type: loadbalancer
      tls: true
      authentication:
        type: oauth
        enableMetrics: true
      configuration:
        #...
    authorization:
      type: keycloak
      enableMetrics: true
  # ...

Prometheus와 함께 OAuth 2.0 지표를 사용하려면 oauth-metrics.yaml 파일을 사용하여 예제 Prometheus 지표 구성을 배포할 수 있습니다. oauth-metrics.yaml 파일에 포함된 ConfigMap 구성을 OAuth 2.0에 대한 메트릭을 활성화한 동일한 Kafka 리소스 구성 파일에 복사합니다.

21.5. OpenShift에서 Kafka 메트릭 및 대시보드 보기

Apache Kafka의 스트림이 OpenShift Container Platform에 배포되면 사용자 정의 프로젝트에 대한 모니터링 을 통해 메트릭이 제공됩니다. 이 OpenShift 기능을 사용하면 개발자가 자체 프로젝트(예: Kafka 프로젝트)를 모니터링하기 위해 별도의 Prometheus 인스턴스에 액세스할 수 있습니다.

사용자 정의 프로젝트에 대한 모니터링이 활성화된 경우 openshift-user-workload-monitoring 프로젝트에 다음 구성 요소가 포함됩니다.

  • Prometheus Operator
  • Prometheus 인스턴스(Prometheus Operator에서 자동으로 배포)
  • Thanos Ruler 인스턴스

Apache Kafka의 스트림은 이러한 구성 요소를 사용하여 메트릭을 사용합니다.

클러스터 관리자는 사용자 정의 프로젝트에 대한 모니터링을 활성화한 다음 개발자 및 기타 사용자에게 자체 프로젝트 내에서 애플리케이션을 모니터링할 수 있는 권한을 부여해야 합니다.

Grafana 배포

Kafka 클러스터가 포함된 프로젝트에 Grafana 인스턴스를 배포할 수 있습니다. 그런 다음 예제 Grafana 대시보드를 사용하여 Grafana 사용자 인터페이스에서 Apache Kafka의 Streams에 대한 Prometheus 지표를 시각화할 수 있습니다.

중요

openshift-monitoring 프로젝트는 핵심 플랫폼 구성 요소에 대한 모니터링을 제공합니다. 이 프로젝트에서 Prometheus 및 Grafana 구성 요소를 사용하여 OpenShift Container Platform 4.x에서 Apache Kafka에 대한 스트림 모니터링을 구성하지 마십시오.

절차 개요

OpenShift Container Platform에서 Apache Kafka 모니터링의 Streams를 설정하려면 다음 절차를 순서대로 따르십시오.

21.5.1. 사전 요구 사항

  • 예제 YAML 파일을 사용하여 Prometheus 지표 구성을 배포 했습니다.
  • 사용자 정의 프로젝트에 대한 모니터링이 활성화됩니다. 클러스터 관리자가 OpenShift 클러스터에 cluster-monitoring-config 구성 맵을 생성했습니다.
  • 클러스터 관리자에게 monitoring-rules-edit 또는 monitoring-edit 역할이 할당되었습니다.

cluster-monitoring-config 구성 맵을 생성하고 사용자 정의 프로젝트를 모니터링할 수 있는 사용자에게 권한을 부여하는 방법에 대한 자세한 내용은 OpenShift 설명서 를 참조하십시오.

21.5.2. Prometheus 리소스 배포

Prometheus를 사용하여 Kafka 클러스터에서 모니터링 데이터를 가져옵니다.

자체 Prometheus 배포를 사용하거나 Apache Kafka용 Streams에서 제공하는 지표 구성 파일 예제 를 사용하여 Prometheus를 배포할 수 있습니다. 예제 파일을 사용하려면 PodMonitor 리소스를 구성하고 배포합니다. PodMonitor 는 Apache Kafka, Zoo Cryostat, Operators, Kafka Bridge 및 Cruise Control의 Pod에서 직접 데이터를 스크랩합니다.

그런 다음 Alertmanager에 대한 경고 규칙 예제를 배포합니다.

사전 요구 사항

프로세스

  1. 사용자 정의 프로젝트에 대한 모니터링이 활성화되어 있는지 확인합니다.

    oc get pods -n openshift-user-workload-monitoring

    활성화하면 모니터링 구성 요소의 Pod가 반환됩니다. 예를 들면 다음과 같습니다.

    NAME                                   READY   STATUS    RESTARTS   AGE
    prometheus-operator-5cc59f9bc6-kgcq8   1/1     Running   0          25s
    prometheus-user-workload-0             5/5     Running   1          14s
    prometheus-user-workload-1             5/5     Running   1          14s
    thanos-ruler-user-workload-0           3/3     Running   0          14s
    thanos-ruler-user-workload-1           3/3     Running   0          14s

    반환된 Pod가 없는 경우 사용자 정의 프로젝트에 대한 모니터링이 비활성화됩니다. 21.5절. “OpenShift에서 Kafka 메트릭 및 대시보드 보기” 의 사전 요구 사항을 참조하십시오.

  2. 여러 PodMonitor 리소스는 examples/metrics/prometheus-install/strimzi-pod-monitor.yaml 에서 정의됩니다.

    PodMonitor 리소스에 대해 spec.namespaceSelector.matchNames 속성을 편집합니다.

    apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
      name: cluster-operator-metrics
      labels:
        app: strimzi
    spec:
      selector:
        matchLabels:
          strimzi.io/kind: cluster-operator
      namespaceSelector:
        matchNames:
          - <project-name> 
    1
    
      podMetricsEndpoints:
      - path: /metrics
        port: http
    # ...
    1
    메트릭을 스크랩할 Pod가 실행 중인 프로젝트입니다(예: Kafka ).
  3. strimzi-pod-monitor.yaml 파일을 Kafka 클러스터가 실행 중인 프로젝트에 배포합니다.

    oc apply -f strimzi-pod-monitor.yaml -n MY-PROJECT
  4. 예제 Prometheus 규칙을 동일한 프로젝트에 배포합니다.

    oc apply -f prometheus-rules.yaml -n MY-PROJECT

21.5.3. Grafana의 서비스 계정 생성

Apache Kafka용 Streams에 대한 Grafana 인스턴스는 cluster-monitoring-view 역할이 할당된 서비스 계정으로 실행해야 합니다.

Grafana를 사용하여 모니터링에 대한 지표를 표시하는 경우 서비스 계정을 생성합니다.

사전 요구 사항

프로세스

  1. Kafka 클러스터가 포함된 프로젝트에서 Grafana에 대한 ServiceAccount 를 생성합니다.

     oc create sa grafana-service-account -n my-project

    이 예에서는 my-project 네임스페이스에 grafana-service-account 라는 서비스 계정이 생성됩니다.

  2. Grafana ServiceAccountcluster-monitoring-view 역할을 할당하는 ClusterRoleBinding 리소스를 생성합니다. 여기서 리소스의 이름은 grafana-cluster-monitoring-binding 입니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: grafana-cluster-monitoring-binding
      labels:
        app: strimzi
    subjects:
      - kind: ServiceAccount
        name: grafana-service-account
        namespace: my-project
    roleRef:
      kind: ClusterRole
      name: cluster-monitoring-view
      apiGroup: rbac.authorization.k8s.io
  3. 동일한 프로젝트에 ClusterRoleBinding 을 배포합니다.

    oc apply -f grafana-cluster-monitoring-binding.yaml -n my-project
  4. 서비스 계정에 대한 토큰 시크릿을 생성합니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-sa
      annotations:
        kubernetes.io/service-account.name: "grafana-service-account" 
    1
    
    type: kubernetes.io/service-account-token 
    2
    1
    서비스 계정을 지정합니다.
    2
    서비스 계정 토큰 시크릿을 지정합니다.
  5. Secret 오브젝트 및 액세스 토큰을 생성합니다.

    oc create -f <secret_configuration>.yaml

    Grafana를 배포할 때 액세스 토큰이 필요합니다.

21.5.4. Prometheus 데이터 소스를 사용하여 Grafana 배포

Prometheus 지표를 표시하기 위해 Grafana를 배포합니다. Grafana 애플리케이션에는 OpenShift Container Platform 모니터링 스택에 대한 구성이 필요합니다.

OpenShift Container Platform에는 openshift-monitoring 프로젝트에 Thanos Querier 인스턴스가 포함되어 있습니다. Thanos Querier는 플랫폼 메트릭을 집계하는 데 사용됩니다.

필요한 플랫폼 지표를 사용하려면 Grafana 인스턴스에 Thanos Querier에 연결할 수 있는 Prometheus 데이터 소스가 필요합니다. 이 연결을 구성하려면 Thanos Querier와 함께 실행되는 oauth-proxy 사이드카에 토큰을 사용하여 인증하는 구성 맵을 생성합니다. datasource.yaml 파일은 구성 맵의 소스로 사용됩니다.

마지막으로 Kafka 클러스터가 포함된 프로젝트에 볼륨으로 마운트된 구성 맵을 사용하여 Grafana 애플리케이션을 배포합니다.

사전 요구 사항

프로세스

  1. Grafana ServiceAccount:의 액세스 토큰을 가져옵니다.

    oc describe sa/grafana-service-account | grep Tokens:
    oc describe secret grafana-service-account-token-mmlp9 | grep token:

    이 예에서 서비스 계정의 이름은 grafana-service-account 입니다. 다음 단계에서 사용할 액세스 토큰을 복사합니다.

  2. Grafana에 대한 Thanos Querier 구성이 포함된 datasource.yaml 파일을 생성합니다.

    표시된 대로 액세스 토큰을 httpHeaderValue1 속성에 붙여넣습니다.

    apiVersion: 1
    
    datasources:
    - name: Prometheus
      type: prometheus
      url: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091
      access: proxy
      basicAuth: false
      withCredentials: false
      isDefault: true
      jsonData:
        timeInterval: 5s
        tlsSkipVerify: true
        httpHeaderName1: "Authorization"
      secureJsonData:
        httpHeaderValue1: "Bearer ${GRAFANA-ACCESS-TOKEN}" 
    1
    
      editable: true
    1
    GRAFANA-ACCESS-TOKEN: Grafana ServiceAccount 에 대한 액세스 토큰의 값입니다.
  3. datasource.yaml 파일에서 grafana-config 라는 구성 맵을 생성합니다.

    oc create configmap grafana-config --from-file=datasource.yaml -n MY-PROJECT
  4. 배포 및 서비스로 구성된 Grafana 애플리케이션을 생성합니다.

    grafana-config 구성 맵은 데이터 소스 구성의 볼륨으로 마운트됩니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grafana
      labels:
        app: strimzi
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: grafana
      template:
        metadata:
          labels:
            name: grafana
        spec:
          serviceAccountName: grafana-service-account
          containers:
          - name: grafana
            image: grafana/grafana:10.4.2
            ports:
            - name: grafana
              containerPort: 3000
              protocol: TCP
            volumeMounts:
            - name: grafana-data
              mountPath: /var/lib/grafana
            - name: grafana-logs
              mountPath: /var/log/grafana
            - name: grafana-config
              mountPath: /etc/grafana/provisioning/datasources/datasource.yaml
              readOnly: true
              subPath: datasource.yaml
            readinessProbe:
              httpGet:
                path: /api/health
                port: 3000
              initialDelaySeconds: 5
              periodSeconds: 10
            livenessProbe:
              httpGet:
                path: /api/health
                port: 3000
              initialDelaySeconds: 15
              periodSeconds: 20
          volumes:
          - name: grafana-data
            emptyDir: {}
          - name: grafana-logs
            emptyDir: {}
          - name: grafana-config
            configMap:
              name: grafana-config
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: grafana
      labels:
        app: strimzi
    spec:
      ports:
      - name: grafana
        port: 3000
        targetPort: 3000
        protocol: TCP
      selector:
        name: grafana
      type: ClusterIP
  5. Kafka 클러스터가 포함된 프로젝트에 Grafana 애플리케이션을 배포합니다.

    oc apply -f <grafana-application> -n <my-project>

21.5.5. Grafana 서비스에 대한 경로 생성

Grafana 서비스를 노출하는 경로를 통해 Grafana 사용자 인터페이스에 액세스할 수 있습니다.

프로세스

  • grafana 서비스에 대한 에지 경로를 생성합니다.

    oc create route edge <my-grafana-route> --service=grafana --namespace=KAFKA-NAMESPACE

21.5.6. Grafana 대시보드 가져오기

Grafana를 사용하여 사용자 지정 가능한 대시보드에 Prometheus 지표의 시각화를 제공합니다.

Apache Kafka 스트림에서는 JSON 형식으로 Grafana에 대한 대시보드 구성 파일의 예를 제공합니다.

  • 예/metrics/grafana-dashboards

이 절차에서는 Grafana 대시보드 예제를 사용합니다.

예제 대시보드는 키 메트릭을 모니터링하는 데 좋은 시작점이지만 Kafka에서 지원하는 모든 메트릭은 표시되지 않습니다. 인프라에 따라 예제 대시보드를 수정하거나 다른 메트릭을 추가할 수 있습니다.

프로세스

  1. Grafana 서비스로의 경로 세부 정보를 가져옵니다. 예를 들면 다음과 같습니다.

    oc get routes
    
    NAME               HOST/PORT                         PATH  SERVICES
    MY-GRAFANA-ROUTE   MY-GRAFANA-ROUTE-amq-streams.net        grafana
  2. 웹 브라우저에서 경로 호스트 및 포트의 URL을 사용하여 Grafana 로그인 화면에 액세스합니다.
  3. 사용자 이름과 암호를 입력한 다음 로그인 을 클릭합니다.

    기본 Grafana 사용자 이름과 암호는 모두 admin 입니다. 처음 로그인한 후 암호를 변경할 수 있습니다.

  4. Configuration > Data Sources 에서 Prometheus 데이터 소스가 생성되었는지 확인합니다. 데이터 소스는 21.5.4절. “Prometheus 데이터 소스를 사용하여 Grafana 배포” 에서 생성되었습니다.
  5. + 아이콘을 클릭한 다음 가져오기 를 클릭합니다.
  6. examples/metrics/grafana-dashboards 에서 가져올 대시보드의 JSON을 복사합니다.
  7. 텍스트 상자에 JSON을 붙여넣은 다음 Load 를 클릭합니다.
  8. 다른 예제 Grafana 대시보드에 대해 5-7단계를 반복합니다.

가져온 Grafana 대시보드는 대시보드 홈 페이지에서 볼 수 있습니다.

22장. 분산 추적 소개

분산 추적은 분산 시스템의 애플리케이션 간 트랜잭션 진행 상황을 추적합니다. 마이크로 서비스 아키텍처에서 추적은 서비스 간 트랜잭션 진행 상황을 추적합니다. 추적 데이터는 애플리케이션 성능을 모니터링하고 대상 시스템 및 최종 사용자 애플리케이션 관련 문제를 조사하는 데 유용합니다.

Apache Kafka용 Streams에서 추적은 소스 시스템에서 Kafka로 보낸 다음 Kafka에서 대상 시스템 및 애플리케이션까지 메시지의 엔드 투 엔드 추적을 용이하게 합니다. 분산 추적은 Grafana 대시보드의 메트릭 모니터링과 구성 요소 로거를 보완합니다.

추적 지원은 다음 Kafka 구성 요소에 빌드됩니다.

  • 소스 클러스터에서 대상 클러스터로 메시지를 추적하는 MirrorMaker
  • Kafka Connect에서 사용하고 생성하는 메시지를 추적하기 위한 Kafka 연결
  • Kafka 및 HTTP 클라이언트 애플리케이션 간 메시지 추적을 위한 Kafka 브리지

Kafka 브로커에서는 추적이 지원되지 않습니다.

사용자 정의 리소스를 통해 이러한 구성 요소에 대한 추적을 활성화하고 구성합니다. spec.template 속성을 사용하여 추적 구성을 추가합니다.

spec.tracing.type 속성을 사용하여 추적 유형을 지정하여 추적을 활성화합니다.

OpenTelemetry
OpenTelemetry를 사용하려면 type: opentelemetry 를 지정합니다. 기본적으로 OpenTelemetry는 OTLP(OpenTelemetry Protocol) 내보내기 및 끝점을 사용하여 추적 데이터를 가져옵니다. Jaeger 추적을 포함하여 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. 이렇게 하려면 추적 구성에서 OpenTelemetry 내보내기 및 끝점을 변경합니다.
Important

Apache Kafka용 스트림은 더 이상 OpenTracing을 지원하지 않습니다. 이전에 type: jaeger 옵션과 함께 OpenTracing을 사용하는 경우 대신 OpenTelemetry를 사용하도록 전환하는 것이 좋습니다.

22.1. 추적 옵션

Jaeger 추적 시스템과 함께 OpenTelemetry를 사용합니다.

OpenTelemetry는 추적 또는 모니터링 시스템과 독립적인 API 사양을 제공합니다.

API를 사용하여 추적을 위한 애플리케이션 코드를 계측합니다.

  • 조정된 애플리케이션은 분산 시스템에서 개별 요청에 대한 추적 을 생성합니다.
  • 추적은 시간이 지남에 따라 특정 작업 단위를 정의하는 범위로 구성됩니다.

Jaeger는 마이크로 서비스 기반 분산 시스템의 추적 시스템입니다.

  • Jaeger 사용자 인터페이스를 사용하면 추적 데이터를 쿼리, 필터링 및 분석할 수 있습니다.

간단한 쿼리를 표시하는 Jaeger 사용자 인터페이스

The Jaeger user interface showing a simple query

22.2. 추적을 위한 환경 변수

Kafka 구성 요소에 대한 추적을 활성화하거나 Kafka 클라이언트의 추적기를 초기화할 때 환경 변수를 사용합니다.

환경 변수 추적은 변경될 수 있습니다. 최신 정보는 OpenTelemetry 설명서 를 참조하십시오.

다음 표에서는 추적기를 설정하기 위한 주요 환경 변수를 설명합니다.

Expand
표 22.1. OpenTelemetry 환경 변수
속성필수 항목설명

OTEL_SERVICE_NAME

제공됨

OpenTelemetry에 대한 Jaeger 추적 서비스의 이름입니다.

OTEL_EXPORTER_JAEGER_ENDPOINT

제공됨

추적에 사용되는 내보내기입니다.

OTEL_TRACES_EXPORTER

제공됨

추적에 사용되는 내보내기입니다. 기본적으로 otlp 로 설정합니다. Jaeger 추적을 사용하는 경우 이 환경 변수를 jaeger 로 설정해야 합니다. 다른 추적 구현을 사용하는 경우 사용된 내보내기기를 지정합니다.

22.3. 분산 추적 설정

사용자 정의 리소스에 추적 유형을 지정하여 Kafka 구성 요소에서 분산 추적을 활성화합니다. 메시지 엔드 투 엔드 추적을 위한 Kafka 클라이언트의 장치 추적기.

분산 추적을 설정하려면 다음 절차를 순서대로 수행합니다.

22.3.1. 사전 요구 사항

분산 추적을 설정하기 전에 Jaeger 백엔드 구성 요소가 OpenShift 클러스터에 배포되었는지 확인합니다. OpenShift 클러스터에 Jaeger를 배포하기 위해 Jaeger Operator를 사용하는 것이 좋습니다.

배포 지침은 Jaeger 설명서 를 참조하십시오.

참고

Streams for Apache Kafka 이외의 애플리케이션 및 시스템에 대한 추적을 설정하는 것은 이 콘텐츠의 범위를 벗어납니다.

22.3.2. MirrorMaker, Kafka Connect 및 Kafka Bridge 리소스에서 추적 활성화

분산 추적은 MirrorMaker, MirrorMaker 2, Kafka Connect 및 Apache Kafka Bridge용 Streams에서 지원됩니다. 추적기 서비스를 지정하고 활성화하도록 구성 요소의 사용자 지정 리소스를 구성합니다.

리소스에서 추적을 활성화하면 다음 이벤트가 트리거됩니다.

  • 인터셉터 클래스는 구성 요소의 통합 소비자 및 생산자에서 업데이트됩니다.
  • MirrorMaker, MirrorMaker 2 및 Kafka Connect의 경우 추적 에이전트는 리소스에 정의된 추적 구성을 기반으로 추적기를 초기화합니다.
  • Kafka 브리지의 경우 리소스에 정의된 추적 구성을 기반으로 하는 추적기가 Kafka Bridge 자체에 의해 초기화됩니다.

OpenTelemetry를 사용하는 추적을 활성화할 수 있습니다.

MirrorMaker 및 MirrorMaker 2의 추적

MirrorMaker 및 MirrorMaker 2의 경우 소스 클러스터에서 대상 클러스터로 메시지가 추적됩니다. 추적 데이터는 MirrorMaker 또는 MirrorMaker 2 구성 요소를 입력하고 남겨진 메시지를 기록합니다.

Kafka Connect의 추적

Kafka Connect의 경우 Kafka Connect에서 생성하고 사용하는 메시지만 추적됩니다. Kafka Connect와 외부 시스템 간에 전송된 메시지를 추적하려면 해당 시스템의 커넥터에서 추적을 구성해야 합니다.

Kafka 브리지의 추적

Kafka 브리지의 경우 Kafka 브리지에서 생성하고 사용하는 메시지가 추적됩니다. Kafka 브리지를 통해 메시지를 보내고 수신하기 위해 클라이언트 애플리케이션에서 들어오는 HTTP 요청도 추적됩니다. 엔드 투 엔드 추적을 사용하려면 HTTP 클라이언트에서 추적을 구성해야 합니다.

프로세스

KafkaMirrorMaker,KafkaMirrorMaker2,KafkaConnectKafkaBridge 리소스에 대해 다음 단계를 수행합니다.

  1. spec.template 속성에서 tracer 서비스를 구성합니다.

    • 추적 환경 변수를 템플릿 구성 속성으로 사용합니다.
    • OpenTelemetry의 경우 spec.tracing.type 속성을 opentelemetry 로 설정합니다.

    OpenTelemetry를 사용한 Kafka Connect의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
      #...

    OpenTelemetry를 사용한 MirrorMaker의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker
    metadata:
      name: my-mirror-maker
    spec:
      #...
      template:
        mirrorMakerContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
    #...

    OpenTelemetry를 사용한 MirrorMaker 2의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker2
    metadata:
      name: my-mm2-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
    #...

    OpenTelemetry를 사용한 Kafka 브리지의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaBridge
    metadata:
      name: my-bridge
    spec:
      #...
      template:
        bridgeContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
    #...

  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <resource_configuration_file>

22.3.3. Kafka 클라이언트의 추적 초기화

OpenTelemetry에 대한 추적기를 초기화한 다음 분산 추적을 위해 클라이언트 애플리케이션을 측정합니다. Kafka 생산자 및 소비자 클라이언트 및 Kafka Streams API 애플리케이션을 계측할 수 있습니다.

추적 환경 변수 세트를 사용하여 추적기를 구성하고 초기화합니다.

프로세스

각 클라이언트 애플리케이션에서 추적기에 대한 종속성을 추가합니다.

  1. 클라이언트 애플리케이션의 pom.xml 파일에 Maven 종속성을 추가합니다.

    OpenTelemetry 종속 항목

    <dependency>
        <groupId>io.opentelemetry.semconv</groupId>
        <artifactId>opentelemetry-semconv</artifactId>
        <version>1.21.0-alpha</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-otlp</artifactId>
        <version>1.34.1</version>
        <exclusions>
            <exclusion>
                <groupId>io.opentelemetry</groupId>
                <artifactId>opentelemetry-exporter-sender-okhttp</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-sender-grpc-managed-channel</artifactId>
        <version>1.34.1</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
        <version>1.34.1</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-kafka-clients-2.6</artifactId>
        <version>1.32.0-alpha</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk</artifactId>
        <version>1.34.1</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-sender-jdk</artifactId>
        <version>1.34.1-alpha</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.61.0</version>
    </dependency>

  2. 추적 환경 변수를 사용하여 추적 프로그램의 구성을 정의합니다.
  3. 환경 변수로 초기화되는 추적기를 생성합니다.

    OpenTelemetry용 추적기 생성

    OpenTelemetry ot = GlobalOpenTelemetry.get();

  4. 추적기를 글로벌 추적기로 등록합니다.

    GlobalTracer.register(tracer);
  5. 클라이언트를 계측합니다.

22.3.4. 추적을 위한 생산자 및 소비자 처리

Kafka 생산자 및 소비자에서 추적을 활성화하는 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Java 생산자 및 소비자 애플리케이션 코드를 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.

OpenTelemetry 계측 프로젝트는 생산자 및 소비자의 계측을 지원하는 클래스를 제공합니다.

데코레이터 계측
데코레이터 계측을 위해 추적을 위해 수정된 생산자 또는 소비자 인스턴스를 생성합니다.
인터셉터 계측
인터셉터 계측의 경우 소비자 또는 생산자 구성에 추적 기능을 추가합니다.

사전 요구 사항

프로세스

각 생산자 및 소비자 애플리케이션의 애플리케이션 코드에서 다음 단계를 수행합니다. 데코레이터 패턴 또는 인터셉터를 사용하여 클라이언트 애플리케이션 코드를 측정합니다.

  • 데코레이터 패턴을 사용하려면 수정된 생산자 또는 소비자 인스턴스를 생성하여 메시지를 보내거나 받습니다.

    원래 KafkaProducer 또는 KafkaConsumer 클래스를 전달합니다.

    OpenTelemetry에 대한 데코레이터 계측 예

    // Producer instance
    Producer < String, String > op = new KafkaProducer < > (
        configs,
        new StringSerializer(),
        new StringSerializer()
        );
        Producer < String, String > producer = tracing.wrap(op);
    KafkaTracing tracing = KafkaTracing.create(GlobalOpenTelemetry.get());
    producer.send(...);
    
    //consumer instance
    Consumer<String, String> oc = new KafkaConsumer<>(
        configs,
        new StringDeserializer(),
        new StringDeserializer()
        );
        Consumer<String, String> consumer = tracing.wrap(oc);
    consumer.subscribe(Collections.singleton("mytopic"));
    ConsumerRecords<Integer, String> records = consumer.poll(1000);
    ConsumerRecord<Integer, String> record = ...
    SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);

  • 인터셉터를 사용하려면 생산자 또는 소비자 구성에서 interceptor 클래스를 설정합니다.

    일반적인 방식으로 KafkaProducerKafkaConsumer 클래스를 사용합니다. TracingProducerInterceptorTracingConsumerInterceptor 클래스는 추적 기능을 처리합니다.

    인터셉터를 사용한 생산자 구성 예

    senderProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG,
        TracingProducerInterceptor.class.getName());
    
    KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps);
    producer.send(...);

    인터셉터를 사용한 소비자 구성 예

    consumerProps.put(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG,
        TracingConsumerInterceptor.class.getName());
    
    KafkaConsumer<Integer, String> consumer = new KafkaConsumer<>(consumerProps);
    consumer.subscribe(Collections.singletonList("messages"));
    ConsumerRecords<Integer, String> records = consumer.poll(1000);
    ConsumerRecord<Integer, String> record = ...
    SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);

22.3.5. 추적을 위한 Kafka Streams 애플리케이션 조정

Kafka Streams API 애플리케이션에서 추적을 활성화하는 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Kafka Streams API 애플리케이션을 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.

데코레이터 계측
데코레이터 계측을 위해 추적을 위해 수정된 Kafka Streams 인스턴스를 생성합니다. OpenTelemetry의 경우 Kafka Streams에 추적 계측을 제공하기 위해 사용자 정의 TracingKafkaClientSupplier 클래스를 생성해야 합니다.
인터셉터 계측
인터셉터 계측의 경우 Kafka Streams 생산자 및 소비자 구성에 추적 기능을 추가합니다.

사전 요구 사항

  • 클라이언트에 대한 추적을 초기화했습니다.

    추적 JAR을 프로젝트에 종속 항목으로 추가하여 Kafka Streams 애플리케이션에서 계측을 활성화합니다.

  • OpenTelemetry를 사용하여 Kafka Streams를 조정하려면 사용자 정의 TracingKafkaClientSupplier 를 작성해야 합니다.
  • 사용자 정의 TracingKafkaClientSupplier 는 Kafka의 DefaultKafkaClientSupplier 를 확장하여 생산자 및 소비자 생성 방법을 재정의하여 Telemetry 관련 코드로 인스턴스를 래핑할 수 있습니다.

    사용자 정의 TracingKafkaClientSupplier의 예

    private class TracingKafkaClientSupplier extends DefaultKafkaClientSupplier {
        @Override
        public Producer<byte[], byte[]> getProducer(Map<String, Object> config) {
            KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get());
            return telemetry.wrap(super.getProducer(config));
        }
    
        @Override
        public Consumer<byte[], byte[]> getConsumer(Map<String, Object> config) {
            KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get());
            return telemetry.wrap(super.getConsumer(config));
        }
    
        @Override
        public Consumer<byte[], byte[]> getRestoreConsumer(Map<String, Object> config) {
            return this.getConsumer(config);
        }
    
        @Override
        public Consumer<byte[], byte[]> getGlobalConsumer(Map<String, Object> config) {
            return this.getConsumer(config);
        }
    }

프로세스

각 Kafka Streams API 애플리케이션에 대해 다음 단계를 수행합니다.

  • 데코레이터 패턴을 사용하려면 TracingKafkaClientSupplier 공급자 인터페이스 인스턴스를 생성한 다음 공급자 인터페이스를 KafkaStreams 에 제공합니다.

    데코레이터 계측 예

    KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer);
    KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier);
    streams.start();

  • 인터셉터를 사용하려면 Kafka Streams 생산자 및 소비자 구성에서 interceptor 클래스를 설정합니다.

    TracingProducerInterceptorTracingConsumerInterceptor 클래스는 추적 기능을 처리합니다.

    인터셉터를 사용한 생산자 및 소비자 구성의 예

    props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName());
    props.put(StreamsConfig.CONSUMER_PREFIX + ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName());

22.3.6. 다른 OpenTelemetry 추적 시스템 도입

기본 OTLP 시스템 대신 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. Apache Kafka용 Streams와 함께 제공된 Kafka 이미지에 필요한 아티팩트를 추가하여 이 작업을 수행합니다. 필요한 구현별 환경 변수도 설정해야 합니다. 그런 다음 OTEL_TRACES_EXPORTER 환경 변수를 사용하여 새 추적 구현을 활성화합니다.

다음 절차에서는 Zipkin 추적을 구현하는 방법을 설명합니다.

프로세스

  1. Apache Kafka 이미지의 Streams의 /opt/kafka/libs/ 디렉터리에 추적 아티팩트를 추가합니다.

    Red Hat Ecosystem Catalog 에서 Kafka 컨테이너 이미지를 새 사용자 정의 이미지를 생성하기 위한 기본 이미지로 사용할 수 있습니다.

    Zipkin의 OpenTelemetry 아티팩트

    io.opentelemetry:opentelemetry-exporter-zipkin

  2. 새 추적 구현에 대해 추적 내보내기 및 끝점을 설정합니다.

    Zikpin 추적기 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker2
    metadata:
      name: my-mm2-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-zipkin-service
            - name: OTEL_EXPORTER_ZIPKIN_ENDPOINT
              value: http://zipkin-exporter-host-name:9411/api/v2/spans 
    1
    
            - name: OTEL_TRACES_EXPORTER
              value: zipkin 
    2
    
      tracing:
        type: opentelemetry
    #...

    1
    연결할 Zipkin 엔드포인트를 지정합니다.
    2
    Zipkin 내보내기입니다.

22.3.7. OpenTelemetry에 대한 사용자 정의 범위 이름 지정

추적 범위는 작업 이름, 시작 시간 및 기간이 있는 Jaeger의 논리적 작업 단위입니다. 범위에는 이름이 내장되어 있지만 Kafka 클라이언트 계측에 사용자 정의 범위 이름을 지정할 수 있습니다.

사용자 지정 범위 이름을 지정하는 것은 선택 사항이며 생산자 및 소비자 클라이언트 계측 또는 Kafka 스트림 조정에서 데코레이터 패턴을 사용하는 경우에만 적용됩니다.

사용자 지정 범위 이름은 OpenTelemetry로 직접 지정할 수 없습니다. 대신 클라이언트 애플리케이션에 코드를 추가하여 추가 태그 및 속성을 추출하여 범위 이름을 검색합니다.

특성을 추출하는 코드 예

//Defines attribute extraction for a producer
private static class ProducerAttribExtractor implements AttributesExtractor < ProducerRecord < ? , ? > , Void > {
    @Override
    public void onStart(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord) {
        set(attributes, AttributeKey.stringKey("prod_start"), "prod1");
    }
    @Override
    public void onEnd(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
        set(attributes, AttributeKey.stringKey("prod_end"), "prod2");
    }
}
//Defines attribute extraction for a consumer
private static class ConsumerAttribExtractor implements AttributesExtractor < ConsumerRecord < ? , ? > , Void > {
    @Override
    public void onStart(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord) {
        set(attributes, AttributeKey.stringKey("con_start"), "con1");
    }
    @Override
    public void onEnd(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
        set(attributes, AttributeKey.stringKey("con_end"), "con2");
    }
}
//Extracts the attributes
public static void main(String[] args) throws Exception {
        Map < String, Object > configs = new HashMap < > (Collections.singletonMap(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"));
        System.setProperty("otel.traces.exporter", "jaeger");
        System.setProperty("otel.service.name", "myapp1");
        KafkaTracing tracing = KafkaTracing.newBuilder(GlobalOpenTelemetry.get())
            .addProducerAttributesExtractors(new ProducerAttribExtractor())
            .addConsumerAttributesExtractors(new ConsumerAttribExtractor())
            .build();

23장. Apache Kafka DrainCleaner용 Streams를 사용하여 Pod 제거

Kafka 및 Zoo Cryostat Pod는 OpenShift 업그레이드, 유지 관리 또는 Pod 일정 변경 중에 제거될 수 있습니다. Kafka 및 Zoo Cryostat Pod가 Apache Kafka용 Streams에 의해 배포된 경우 Apache Kafka DrainCleaner 툴의 Streams를 사용하여 Pod 제거를 처리할 수 있습니다. Apache Kafka Draincleaner의 Streams는 OpenShift 대신 제거를 처리합니다.

Apache Kafka DrainCleaner용 Streams를 배포하면 Cluster Operator를 사용하여 OpenShift 대신 Kafka Pod를 이동할 수 있습니다. Cluster Operator는 복제되지 않으며 제거 프로세스 중에 Kafka가 계속 작동할 수 있습니다. OpenShift 작업자 노드가 연속으로 드레이닝되므로 Cluster Operator는 주제가 동기화될 때까지 기다립니다.

승인 Webhook는 Apache Kafka의 Pod 제거 요청의 Streams for Apache Kafka에 대한 알림을 Kubernetes API에 알립니다. 그런 다음 Streams for Apache Kafka DrainCleaner는 드레인할 Pod에 롤링 업데이트 주석을 추가합니다. 이렇게 하면 Cluster Operator에 제거된 Pod의 롤링 업데이트를 수행합니다.

참고

Apache Kafka DrainCleaner용 Streams를 사용하지 않는 경우 Pod 주석을 추가하여 롤링 업데이트를 수동으로 수행할 수 있습니다.

Webhook 구성

Apache Kafka Drain cleaner 배포 파일에는 ValidatingWebhookConfiguration 리소스 파일이 포함되어 있습니다. 리소스는 Kubernetes API에 Webhook를 등록하기 위한 구성을 제공합니다.

구성은 Pod 제거 요청 시 수행할 Kubernetes API에 대한 규칙을 정의합니다. 규칙은 pods/eviction 하위 리소스와 관련된 CREATE 작업만 인터셉트되도록 지정합니다. 이러한 규칙이 충족되면 API에서 알림을 전달합니다.

clientConfig 는 Apache Kafka Drain cleaner 서비스의 Streams 및 Webhook를 노출하는 /drainer 엔드포인트를 가리킵니다. Webhook는 인증이 필요한 보안 TLS 연결을 사용합니다. caBundle 속성은 HTTPS 통신의 유효성을 검사하는 인증서 체인을 지정합니다. 인증서는 Base64로 인코딩됩니다.

Pod 제거 알림에 대한 Webhook 구성

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
# ...
webhooks:
  - name: strimzi-drain-cleaner.strimzi.io
    rules:
      - apiGroups:   [""]
        apiVersions: ["v1"]
        operations:  ["CREATE"]
        resources:   ["pods/eviction"]
        scope:       "Namespaced"
    clientConfig:
      service:
        namespace: "strimzi-drain-cleaner"
        name: "strimzi-drain-cleaner"
        path: /drainer
        port: 443
        caBundle: Cg==
    # ...

23.1. Apache Kafka DrainCleaner 배포 파일 스트림 다운로드

Apache Kafka DrainCleaner용 Streams를 배포하고 사용하려면 배포 파일을 다운로드해야 합니다.

Apache Kafka Drain cleaner 배포 파일은 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 사용할 수 있습니다.

23.2. 설치 파일을 사용하여 Apache Kafka DrainCleaner용 Streams 배포

Cluster Operator 및 Kafka 클러스터가 실행 중인 OpenShift 클러스터에 Apache Kafka Drain cleaner의 Streams를 배포합니다.

Apache Kafka Drain cleaner용 스트림은 두 가지 다른 모드로 실행할 수 있습니다. 기본적으로 Drain cleaner는 OpenShift 제거 요청을 거부하여 OpenShift 제거 요청을 거부하여 Pod를 제거하고 대신 Cluster Operator를 사용하여 Pod를 이동합니다. 이 모드는 다양한 클러스터 자동 스케일링 툴과 더 적합하며 특정 PodDisuptionBudget 구성이 필요하지 않습니다. 또는 Cluster Operator가 Pod를 이동하도록 지시하는 동안 제거 요청을 허용하는 레거시 모드를 활성화할 수 있습니다. 레거시 모드가 작동하려면 maxUnavailable 옵션을 0 으로 설정하여 PodDisruptionBudget 을 구성해야합니다.

사전 요구 사항

  • Apache Kafka DrainCleaner 배포 파일의 Streams를 다운로드 했습니다.
  • 업데이트하려는 OpenShift 작업자 노드에서 실행 중인 고가용성 Kafka 클러스터 배포가 있습니다.
  • 고가용성을 위해 주제가 복제됩니다.

    주제 구성은 복제 요소보다 최소 3개 이상 및 최소 동기화된 복제본 수를 1개로 지정합니다.

    고가용성을 위해 Kafka 주제 복제

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: my-topic
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 1
      replicas: 3
      config:
        # ...
        min.insync.replicas: 2
        # ...

Kafka 또는 Zoo Cryostat 제외

Drain cleaner 작업에 Kafka 또는 Zoo Cryostat Pod를 포함하지 않거나 기존 모드에서 DrainCleaner를 사용하려는 경우 Drain cleaner 배포 구성 파일의 기본 환경 변수를 변경합니다.

  • PodDisruptionBudget 구성에 의존하는 레거시 모드를 사용하도록 STRIMZI_DENY_EVICTIONfalse 로 설정합니다.
  • Kafka Pod를 제외하려면 STRIMZI_DRAIN_KAFKAfalse 로 설정합니다.
  • Zoo Cryostat Pod를 제외하려면 STRIMZI_DRAIN_ZOOKEEPERfalse 로 설정합니다.

Zoo Cryostat Pod를 제외하는 구성 예

apiVersion: apps/v1
kind: Deployment
spec:
  # ...
  template:
    spec:
      serviceAccountName: strimzi-drain-cleaner
      containers:
        - name: strimzi-drain-cleaner
          # ...
          env:
            - name: STRIMZI_DENY_EVICTION
              value: "true"
            - name: STRIMZI_DRAIN_KAFKA
              value: "true"
            - name: STRIMZI_DRAIN_ZOOKEEPER
              value: "false"
          # ...

프로세스

  1. STRIMZI_DENY_EVICTION 환경 변수를 false 로 설정하여 활성화된 레거시 모드를 사용하는 경우 PodDisruptionBudget 리소스도 구성해야 합니다. 템플릿 설정을 사용하여 Kafka 리소스의 Kafka 및 Zoo Cryostat 섹션에서 maxUnavailable0 (zero)으로 설정합니다.

    Pod 중단 예산 지정

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        template:
          podDisruptionBudget:
            maxUnavailable: 0
    
      # ...
      zookeeper:
        template:
          podDisruptionBudget:
            maxUnavailable: 0
      # ...

    이 설정은 계획된 중단 시 Pod를 자동으로 제거하여 Apache Kafka 드인클린더 및 Cluster Operator의 Streams를 다른 작업자 노드에 Pod를 롤아웃합니다.

    Apache Kafka DrainCleaner에 Streams를 사용하여 Zoo Cryostat 노드를 드레이닝하려면 Zoo Cryostat에 대해 동일한 구성을 추가합니다.

  2. Kafka 리소스를 업데이트합니다.

    oc apply -f <kafka_configuration_file>
  3. Apache Kafka Drain cleaner용 Streams를 배포합니다.

    • OpenShift에서 Drain cleaner를 실행하려면 /install/drain-cleaner/openshift 디렉터리에 리소스를 적용합니다.

      oc apply -f ./install/drain-cleaner/openshift

23.3. Apache Kafka DrainCleaner용 스트림 사용

Cluster Operator와 함께 Apache Kafka Drain cleaner의 Streams를 사용하여 드레이닝 중인 노드에서 Kafka 브로커 또는 Zoo Cryostat Pod를 이동합니다. Apache Kafka DrainCleaner의 Streams를 실행하면 롤링 업데이트 pod 주석이 있는 Pod에 주석을 추가합니다. Cluster Operator는 주석을 기반으로 롤링 업데이트를 수행합니다.

사전 요구 사항

유사성 방지 구성을 사용할 때 고려 사항

Kafka 또는 Zoo Cryostat Pod와 함께 유사성 방지를 사용하는 경우 클러스터에 예비 작업자 노드를 추가하는 것이 좋습니다. 예비 노드를 포함하면 다른 노드를 드레이닝하거나 임시로 사용할 수 없는 동안 클러스터에서 Pod를 다시 예약할 수 있는 용량을 확보할 수 있습니다. 작업자 노드가 드레인되고 유사성 방지 규칙이 대체 노드에서 Pod 일정을 제한하는 경우 예비 노드를 사용하면 재시작된 Pod를 예약할 수 없게 됩니다. 이렇게 하면 드레이닝 작업이 실패할 위험이 완화됩니다.

프로세스

  1. Kafka 브로커 또는 Zoo Cryostat Pod를 호스팅하는 지정된 OpenShift 노드를 드레이닝합니다.

    oc get nodes
    oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --force
  2. Apache Kafka Drain cleaner 로그의 Streams에서 제거 이벤트를 확인하여 Pod에 다시 시작 주석이 추가되었는지 확인합니다.

    Apache Kafka Drain cleaner 로그 스트림에서 Pod의 주석 표시

    INFO ... Received eviction webhook for Pod my-cluster-zookeeper-2 in namespace my-project
    INFO ... Pod my-cluster-zookeeper-2 in namespace my-project will be annotated for restart
    INFO ... Pod my-cluster-zookeeper-2 in namespace my-project found and annotated for restart
    
    INFO ... Received eviction webhook for Pod my-cluster-kafka-0 in namespace my-project
    INFO ... Pod my-cluster-kafka-0 in namespace my-project will be annotated for restart
    INFO ... Pod my-cluster-kafka-0 in namespace my-project found and annotated for restart

  3. Cluster Operator 로그에서 조정 이벤트를 확인하여 롤링 업데이트를 확인합니다.

    Cluster Operator 로그에서 롤링 업데이트 표시

    INFO  PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-zookeeper-2
    INFO  PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-kafka-0
    INFO  AbstractOperator:500 - Reconciliation #13(timer) Kafka(my-project/my-cluster): reconciled

23.4. Apache Kafka Drain cleaner용 Streams에서 사용하는 TLS 인증서 감시

기본적으로 Drain cleaner 배포는 인증에 사용하는 TLS 인증서가 포함된 시크릿을 감시합니다. DrainCleaner는 인증서 갱신과 같은 변경 사항을 감시합니다. 변경 사항이 감지되면 다시 시작하여 TLS 인증서를 다시 로드합니다. Drain cleaner 설치 파일은 기본적으로 이 동작을 활성화합니다. 그러나 DrainCleaner 설치 파일의 배포 구성(060- Deployment.yaml)에서 STRIMZI_CERTIFICATE_WATCH_ENABLED 환경 변수를 false 로 설정하여 인증서 감시를 비활성화할 수 있습니다.

STRIMZI_CERTIFICATE_WATCH_ENABLED 를 활성화하면 TLS 인증서를 감시하는 데 다음 환경 변수를 사용할 수도 있습니다.

Expand
표 23.1. TLS 인증서 감시를 위해 cleaner 환경 변수 드레이닝
환경 변수설명기본

STRIMZI_CERTIFICATE_WATCH_ENABLED

인증서 감시 활성화 또는 비활성화

false

STRIMZI_CERTIFICATE_WATCH_NAMESPACE

Drain cleaner가 배포되고 인증서 보안이 존재하는 네임스페이스입니다.

strimzi-drain-cleaner

STRIMZI_CERTIFICATE_WATCH_POD_NAME

Drain cleaner Pod 이름

-

STRIMZI_CERTIFICATE_WATCH_SECRET_NAME

TLS 인증서를 포함하는 시크릿의 이름

strimzi-drain-cleaner

STRIMZI_CERTIFICATE_WATCH_SECRET_KEYS

TLS 인증서가 포함된 시크릿 내부의 필드 목록

tls.crt, tls.key

조사 작업을 제어하는 환경 변수 구성의 예

apiVersion: apps/v1
kind: Deployment
metadata:
  name: strimzi-drain-cleaner
  labels:
    app: strimzi-drain-cleaner
  namespace: strimzi-drain-cleaner
spec:
  # ...
    spec:
      serviceAccountName: strimzi-drain-cleaner
      containers:
        - name: strimzi-drain-cleaner
          # ...
          env:
            - name: STRIMZI_DRAIN_KAFKA
              value: "true"
            - name: STRIMZI_DRAIN_ZOOKEEPER
              value: "true"
            - name: STRIMZI_CERTIFICATE_WATCH_ENABLED
              value: "true"
            - name: STRIMZI_CERTIFICATE_WATCH_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: STRIMZI_CERTIFICATE_WATCH_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
              # ...

작은 정보

Downward API 메커니즘을 사용하여 STRIMZI_CERTIFICATE_WATCH_NAMESPACESTRIMZI_CERTIFICATE_WATCH_POD_NAME 을 구성합니다.

24장. 진단 및 문제 해결 데이터 검색

report.sh 진단 툴은 OpenShift에서 Apache Kafka 배포용 Streams 문제 해결을 위한 필수 데이터를 수집하기 위해 Red Hat에서 제공하는 스크립트입니다. 관련 로그, 구성 파일 및 기타 진단 데이터를 수집하여 문제를 식별하고 해결합니다. 스크립트를 실행할 때 추가 매개변수를 지정하여 특정 데이터를 검색할 수 있습니다.

사전 요구 사항

  • Bash 4 이상에서 스크립트를 실행합니다.
  • OpenShift oc 명령줄 툴이 설치되어 실행 중인 클러스터에 연결하도록 구성되어 있습니다.

이렇게 하면 oc 명령줄 툴에서 클러스터와 상호 작용하고 필요한 진단 데이터를 검색하는 데 필요한 인증이 설정됩니다.

프로세스

  1. 툴을 다운로드하여 추출합니다.

    진단 툴은 Apache Kafka 소프트웨어 다운로드 페이지 에서는 Streams에서 사용할 수 있습니다.

  2. 툴을 추출한 디렉터리에서 터미널을 열고 보고 툴을 실행합니다.

    ./report.sh --namespace=<cluster_namespace> --cluster=<cluster_name> --out-dir=<local_output_directory>

    < cluster_namespace >를 Apache Kafka 배포에 대한 Streams의 실제 OpenShift 네임스페이스로, < cluster_name >을 Kafka 클러스터의 이름으로, < local_output_directory >를 생성된 보고서를 저장하려는 로컬 디렉터리의 경로로 바꿉니다. 디렉터리를 지정하지 않으면 임시 디렉터리가 생성됩니다.

    필요에 따라 기타 선택적 보고 옵션을 포함합니다.

    --bridge=<string>
    Pod 및 로그에서 데이터를 가져오려면 Kafka Bridge 클러스터의 이름을 지정합니다.
    --connect=<string>
    Pod 및 로그에서 데이터를 가져올 Kafka Connect 클러스터의 이름을 지정합니다.
    --mm2=<string>
    Pod 및 로그의 데이터를 가져올 미러 메이커 2 클러스터의 이름을 지정합니다.
    --secrets=(off|hidden|all)

    시크릿 상세 정보 표시 수준을 지정합니다. 기본값은 hidden 입니다. 사용 가능한 옵션은 다음과 같습니다.

    • all: 시크릿 키와 데이터 값이 보고됩니다.
    • hidden: 키만 있는 시크릿이 보고됩니다. 암호와 같은 데이터 값이 제거됩니다.
    • Off: 시크릿은 전혀 보고되지 않습니다.

    데이터 수집 옵션이 있는 요청 예

    ./report.sh --namespace=my-amq-streams-namespace --cluster=my-kafka-cluster --bridge=my-bridge-component --secrets=all --out-dir=~/reports

    참고

    필요한 경우 chmod 명령을 사용하여 스크립트에 대한 실행 권한을 사용자에게 할당합니다. 예를 들어 chmod +x report.sh.

스크립트 실행이 완료되면 출력 디렉터리에 Apache Kafka 배포를 위해 Streams의 각 구성 요소에 대해 수집된 로그, 구성 및 기타 진단 데이터의 파일 및 디렉터리가 포함됩니다.

보고 진단 툴로 수집한 데이터

다음 구성 요소의 데이터가 있는 경우 반환됩니다.

Cluster Operator

  • 배포 YAML 및 로그
  • 모든 관련 Pod 및 해당 로그
  • 클러스터 Operator와 관련된 리소스에 대한 YAML 파일(ClusterRoles, ClusterRoleBindings)

drain cleaner (있는 경우)

  • 배포 YAML 및 로그
  • Pod 로그

사용자 정의 리소스

  • CRD(사용자 정의 리소스 정의) YAML
  • 모든 관련 사용자 정의 리소스(CR)에 대한 YAML 파일

이벤트

  • 지정된 네임스페이스와 관련된 이벤트

구성

  • Kafka Pod 로그 및 구성 파일 (strimzi.properties)
  • Zookeeper Pod 로그 및 구성 파일 ( Zookeeper.properties)
  • Entity Operator(Topic Operator, User Operator) Pod 로그
  • cruise Control Pod 로그
  • Kafka Exporter Pod 로그
  • 옵션에 지정된 경우 브리지 Pod 로그
  • 옵션에 지정된 경우 Pod 로그 연결
  • 옵션에 지정된 경우 MirrorMaker 2 Pod 로그

보안 (옵션에서 요청된 경우)

  • 지정된 Kafka 클러스터와 관련된 모든 보안에 대한 YAML 파일

25장. Apache Kafka의 스트림 업그레이드

Streams for Apache Kafka 설치를 버전 2.7로 업그레이드하고 새로운 기능, 성능 개선 및 향상된 보안 옵션을 활용할 수 있습니다. 업그레이드 중에 Kafka가 지원되는 최신 버전으로 업데이트되어 Apache Kafka 배포를 위한 Streams에 추가 기능 및 버그 수정이 도입되었습니다.

초기 배포 방법으로 Cluster Operator를 업그레이드하려면 동일한 방법을 사용합니다. 예를 들어, Apache Kafka 설치 파일의 Streams를 사용한 경우 해당 파일을 수정하여 업그레이드를 수행합니다. Cluster Operator를 2.7로 업그레이드한 후 다음 단계는 모든 Kafka 노드를 지원되는 최신 Kafka 버전으로 업그레이드하는 것입니다. Kafka 업그레이드는 Kafka 노드의 롤링 업데이트를 통해 Cluster Operator에 의해 수행됩니다.

새 버전에 문제가 발생하면 Apache Kafka용 Streams를 이전 버전으로 다운그레이드 할 수 있습니다.

Apache Kafka 버전용 릴리스 스트림은 Apache Kafka 소프트웨어 다운로드용 Streams에서 찾을 수 있습니다.

다운타임 없이 업그레이드

고가용성(최소 3 및 균등하게 분산 파티션의 복제 요소)으로 구성된 주제의 경우 업그레이드 프로세스에서 소비자 및 생산자의 다운타임을 유발하지 않아야 합니다.

업그레이드는 프로세스의 다른 단계에서 브로커를 하나씩 다시 시작하는 롤링 업데이트를 트리거합니다. 이 기간 동안 전체 클러스터 가용성이 일시적으로 줄어들어 브로커가 실패할 경우 메시지 손실 위험이 증가할 수 있습니다.

25.1. 필수 업그레이드 순서

다운타임 없이 브로커 및 클라이언트를 업그레이드하려면 다음 순서로 Apache Kafka 업그레이드 절차를 완료해야 합니다.

  1. OpenShift 클러스터 버전이 지원되는지 확인합니다.

    Apache Kafka 2.7의 스트림에는 OpenShift 4.12 ~ 4.15가 필요합니다.

    다운타임을 최소화하여 OpenShift를 업그레이드할 수 있습니다.

  2. Cluster Operator를 업그레이드합니다.
  3. 클러스터 구성에 따라 Kafka를 업그레이드합니다.

    1. KRaft 모드에서 Kafka를 사용하는 경우 Kafka 버전 및 spec.kafka.metadataVersion 을 업데이트하여 모든 Kafka 브로커 및 클라이언트 애플리케이션을 업그레이드 합니다.
    2. Zoo Cryostat 기반 Kafka를 사용하는 경우 Kafka 버전과 inter.broker.protocol.version 을 업데이트하여 모든 Kafka 브로커 및 클라이언트 애플리케이션을 업그레이드 합니다.
참고

Streams for Apache Kafka 2.7에서 KRaft 기반 클러스터 간의 업그레이드 및 다운그레이드가 지원됩니다.

25.2. Apache Kafka 업그레이드 경로 스트림

Apache Kafka용 Streams에 두 개의 업그레이드 경로를 사용할 수 있습니다.

증분 업그레이드
증분 업그레이드에는 이전 마이너 버전에서 버전 2.7로 Apache Kafka의 Streams를 업그레이드해야 합니다.
다중 버전 업그레이드
다중 버전 업그레이드에는 Apache Kafka의 이전 버전의 Streams를 단일 업그레이드 내에서 버전 2.7으로 업그레이드하여 하나 이상의 중간 버전을 건너뜁니다. 예를 들어 Streams for Apache Kafka 2.3.0에서 Apache Kafka 2.7의 Streams로 직접 업그레이드할 수 있습니다.

25.2.1. 업그레이드할 때 Kafka 버전 지원

Apache Kafka용 Streams를 업그레이드할 때 사용 중인 Kafka 버전과의 호환성을 확인하는 것이 중요합니다.

지원되는 Kafka 버전이 이전 버전과 새 버전 간에 다른 경우에도 다중 버전 업그레이드가 가능합니다. 그러나 현재 Kafka 버전을 지원하지 않는 Apache Kafka 버전의 새 Streams로 업그레이드하려고 하면 Kafka 버전이 지원되지 않음을 나타내는 오류가 생성됩니다. 이 경우 Kafka 사용자 정의 리소스의 spec.kafka.version 을 새 Streams for Apache Kafka 버전에 대해 지원되는 버전으로 변경하여 Apache Kafka 에 대한 Streams for Apache Kafka 업그레이드의 일부로 Kafka 버전을 업그레이드해야 합니다.

25.2.2. 1.7 이전의 Apache Kafka용 Streams에서 업그레이드

버전 1.7 이전 버전에서 Apache Kafka의 최신 버전으로 업그레이드하는 경우 다음을 수행합니다.

  1. 표준 순서에 따라 Apache Kafka의 Streams를 버전 1.7로 업그레이드합니다.
  2. Apache Kafka 사용자 정의 리소스의 Streams를 Apache Kafka용 Streams와 함께 제공되는 API 변환 툴 을 사용하여 v1beta2 로 변환합니다.
  3. 다음 중 하나를 수행합니다.

    • Apache Kafka의 Streams를 1.8에서 0.26 사이의 버전으로 업그레이드합니다. 여기서 ControlPlaneListener 기능 게이트는 기본적으로 비활성화되어 있습니다.
    • Apache Kafka의 Streams를 2.0에서 0.31(기본적으로 ControlPlaneListener 기능 게이트가 활성화되어 있음)과 ControlPlaneListener 기능 게이트가 비활성화된 버전으로 업그레이드합니다.
  4. ControlPlaneListener 기능 게이트를 활성화합니다.
  5. 표준 순서에 따라 Apache Kafka 2.7의 Streams로 업그레이드.

Apache Kafka 사용자 정의 리소스의 스트림은 릴리스 1.7에서 v1beta2 API 버전을 사용하기 시작했습니다. Apache Kafka 1.8 이상 버전으로 업그레이드하기 전에 CRD 및 사용자 정의 리소스를 변환해야 합니다. API 변환 툴 사용에 대한 자세한 내용은 Apache Kafka 1.7 업그레이드 설명서 를 참조하십시오.

참고

버전 1.7로 처음 업그레이드하는 대신 버전 1.7에서 사용자 지정 리소스를 설치한 다음 리소스를 변환할 수 있습니다.

이제 ControlPlaneListener 기능이 Apache Kafka용 Streams에서 영구적으로 활성화됩니다. 비활성화된 Apache Kafka용 Streams 버전으로 업그레이드한 다음 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 사용하여 활성화해야 합니다.

ControlPlaneListener 기능 게이트 비활성화

env:
  - name: STRIMZI_FEATURE_GATES
    value: -ControlPlaneListener

ControlPlaneListener 기능 게이트 활성화

env:
  - name: STRIMZI_FEATURE_GATES
    value: +ControlPlaneListener

25.2.3. Kafka 버전 및 이미지 매핑

Kafka를 업그레이드할 때 STRIMZI_KAFKA_IMAGES 환경 변수 및 Kafka.spec.kafka.version 속성에 대한 설정을 고려하십시오.

  • Kafka 리소스는 지정되지 않은 경우 지원되는 최신 Kafka 버전 (3.7.0)으로 기본 제공되는 Kafka.spec.kafka.version 을 사용하여 구성할 수 있습니다.
  • Cluster Operator의 STRIMZI_KAFKA_IMAGES 환경 변수는 Kafka 버전과 지정된 Kafka 리소스에서 특정 Kafka 버전을 요청할 때 사용할 이미지 간 매핑 (<kafka_version>=<image>)을 제공합니다. 예: 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0.

    • Kafka.spec.kafka.image 가 구성되지 않은 경우 지정된 버전의 기본 이미지가 사용됩니다.
    • Kafka.spec.kafka.image 가 구성된 경우 기본 이미지가 재정의됩니다.
주의

Cluster Operator는 이미지에 예상 버전의 Kafka 브로커가 실제로 포함되어 있는지 확인할 수 없습니다. 지정된 이미지가 지정된 Kafka 버전에 해당하는지 확인합니다.

25.3. 클라이언트 업그레이드 전략

Kafka 클라이언트를 업그레이드하면 새로운 버전의 Kafka에 도입된 기능, 수정 및 개선 사항의 이점을 누릴 수 있습니다. 업그레이드된 클라이언트는 다른 업그레이드된 Kafka 구성 요소와의 호환성을 유지합니다. 고객의 성능과 안정성도 개선될 수 있습니다.

원활한 전환을 위해 Kafka 클라이언트 및 브로커를 업그레이드하는 가장 좋은 방법을 고려하십시오. 선택한 업그레이드 전략은 브로커 또는 클라이언트를 먼저 업그레이드하는지 여부에 따라 달라집니다. Kafka 3.0부터는 브로커와 클라이언트를 어떤 순서로 독립적으로 업그레이드할 수 있습니다. 먼저 클라이언트 또는 브로커 업그레이드 결정은 업그레이드해야 하는 애플리케이션 수와 다운타임을 허용할 수 없는 여러 요인에 따라 달라집니다.

브로커 전에 클라이언트를 업그레이드하는 경우 일부 새로운 기능은 브로커가 아직 지원하지 않기 때문에 작동하지 않을 수 있습니다. 그러나 브로커는 다른 버전으로 실행되고 다른 로그 메시지 버전을 지원하는 생산자 및 소비자를 처리할 수 있습니다.

25.4. 다운타임을 최소화하여 OpenShift 업그레이드

OpenShift를 업그레이드하는 경우 OpenShift 업그레이드 설명서를 참조하여 업그레이드 경로와 노드를 올바르게 업그레이드하는 단계를 확인하십시오. OpenShift를 업그레이드하기 전에 Apache Kafka용 Streams 버전에 대해 지원되는 버전을 확인합니다.

업그레이드를 수행할 때 다음 단계를 수행하여 Kafka 클러스터의 가용성을 확인하십시오.

  1. Pod 중단 예산 구성
  2. 다음 방법 중 하나를 사용하여 롤링 Pod

    1. Apache Kafka Drain cleaner용 Streams 사용 (권장 권장)
    2. Pod에 주석을 적용하여 수동으로 롤아웃

Kafka가 계속 작동하려면 고가용성을 위해 주제를 복제해야 합니다. 이를 위해서는 복제 요소보다 3개 이상의 복제 요소와 최소 개수의 in-sync 복제본 수를 1로 지정하는 주제 구성이 필요합니다.

고가용성을 위해 Kafka 주제 복제

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: my-topic
  labels:
    strimzi.io/cluster: my-cluster
spec:
  partitions: 1
  replicas: 3
  config:
    # ...
    min.insync.replicas: 2
    # ...

고가용성 환경에서 Cluster Operator는 업그레이드 프로세스 중에 다운타임이 없도록 최소한의 in-sync 복제본을 유지 관리합니다.

25.4.1. Drain cleaner를 사용하여 롤링 Pod

OpenShift 업그레이드 중에 노드를 제거하기 위해 Streams for Apache Kafka DrainCleaner를 사용하면 Pod에 수동 롤링 업데이트 주석이 추가되어 Cluster Operator에 제거되어야 하는 Pod의 롤링 업데이트를 수행하고 업그레이드 중인 OpenShift 노드에서 이동하도록 알립니다.

자세한 내용은 23장. Apache Kafka DrainCleaner용 Streams를 사용하여 Pod 제거의 내용을 참조하십시오.

25.4.2. 롤링 Pod 수동 (클린더를 Drain cleaner로)

DrainCleaner를 사용하여 Pod를 롤오버하는 대신 Cluster Operator를 통해 Pod의 수동 롤링 업데이트를 트리거할 수 있습니다. Pod 리소스를 사용하여 롤링 업데이트는 새 Pod를 사용하여 리소스의 Pod를 다시 시작합니다. 주제를 계속 사용하여 Drain cleaner의 작업을 복제하려면 Pod 중단 예산에 대해 maxUnavailable 값을 0으로 설정해야 합니다. Pod 중단 예산을 0으로 줄이면 OpenShift에서 포드를 자동으로 제거하지 못합니다.

Pod 중단 예산 지정

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  namespace: myproject
spec:
  kafka:
    # ...
    template:
      podDisruptionBudget:
        maxUnavailable: 0
# ...

드레인해야 하는 Pod를 확인해야 합니다. 그런 다음 Pod 주석을 추가하여 업데이트합니다.

여기에서 주석은 my-cluster-pool-a-1 이라는 Kafka Pod를 업데이트합니다.

Kafka Pod에서 수동 롤링 업데이트 수행

oc annotate pod my-cluster-pool-a-1 strimzi.io/manual-rolling-update="true"

25.5. Cluster Operator 업그레이드

초기 배포 방법으로 Cluster Operator를 업그레이드하려면 동일한 방법을 사용합니다.

25.5.1. 설치 파일을 사용하여 Cluster Operator 업그레이드

다음 절차에서는 Apache Kafka 2.7에 Streams를 사용하도록 Cluster Operator 배포를 업그레이드하는 방법을 설명합니다.

설치 YAML 파일을 사용하여 Cluster Operator를 배포한 경우 다음 절차를 따르십시오.

Cluster Operator에서 관리하는 Kafka 클러스터의 가용성은 업그레이드 작업의 영향을 받지 않습니다.

참고

해당 버전으로 업그레이드하는 방법에 대한 정보는 특정 버전의 Apache Kafka를 지원하는 설명서를 참조하십시오.

사전 요구 사항

프로세스

  1. 기존 Cluster Operator 리소스( /install/cluster-operator 디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. Cluster Operator의 새 버전으로 변경 사항을 덮어씁니다.
  2. Apache Kafka 버전 2.7에 사용할 수 있는 지원되는 구성 옵션을 반영하도록 사용자 지정 리소스를 업데이트합니다.
  3. Cluster Operator를 업데이트합니다.

    1. Cluster Operator가 실행되는 네임스페이스에 따라 새 Cluster Operator 버전의 설치 파일을 수정합니다.

      Linux에서 다음을 사용하십시오.

      sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml

      MacOS에서 다음을 사용하십시오.

      sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
    2. 기존 Cluster Operator 배포에서 하나 이상의 환경 변수를 수정한 경우 install/cluster-operator/060- Deployment -strimzi-cluster-operator.yaml 파일을 편집하여 해당 환경 변수를 사용합니다.
  4. 업데이트된 구성이 있는 경우 나머지 설치 리소스와 함께 배포합니다.

    oc replace -f install/cluster-operator

    롤링 업데이트가 완료될 때까지 기다립니다.

  5. 새 Operator 버전이 업그레이드 중인 Kafka 버전을 더 이상 지원하지 않는 경우 Cluster Operator는 버전이 지원되지 않는 것으로 오류 메시지를 반환합니다. 그렇지 않으면 오류 메시지가 반환되지 않습니다.

    • 오류 메시지가 반환되면 새 Cluster Operator 버전에서 지원하는 Kafka 버전으로 업그레이드합니다.

      1. Kafka 사용자 정의 리소스를 편집합니다.
      2. spec.kafka.version 속성을 지원되는 Kafka 버전으로 변경합니다.
    • 오류 메시지가 반환 되지 않으면 다음 단계로 이동합니다. 나중에 Kafka 버전을 업그레이드합니다.
  6. Kafka Pod의 이미지를 가져와 업그레이드가 성공적으로 수행되었는지 확인합니다.

    oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'

    image 태그는 Apache Kafka 버전의 새 Streams와 Kafka 버전이 차례로 표시됩니다.

    registry.redhat.io/amq-streams/strimzi-kafka-37-rhel9:2.7.0

    Kafka 리소스 상태에서 업그레이드가 성공적으로 완료되었는지 확인할 수도 있습니다.

Cluster Operator는 버전 2.7으로 업그레이드되지만 관리하는 클러스터에서 실행되는 Kafka 버전은 변경되지 않습니다.

25.5.2. OperatorHub를 사용하여 Cluster Operator 업그레이드

OperatorHub에서 Apache Kafka용 Streams를 배포하는 경우 OLM(Operator Lifecycle Manager)을 사용하여 Apache Kafka Operator의 스트림 업데이트 채널을 Apache Kafka 버전의 새 스트림으로 변경합니다.

채널을 업데이트하면 선택한 업그레이드 전략에 따라 다음 유형의 업그레이드 중 하나가 시작됩니다.

  • 자동 업그레이드가 시작됨
  • 설치를 시작하기 전에 승인이 필요한 수동 업그레이드
참고

stable 채널을 구독하면 채널을 변경하지 않고도 자동 업데이트를 받을 수 있습니다. 그러나 설치 전 업그레이드 단계가 누락될 가능성이 있으므로 자동 업데이트를 활성화하는 것은 권장되지 않습니다. 버전별 채널에서만 자동 업그레이드를 사용합니다.

OperatorHub를 사용하여 Operator를 업그레이드하는 방법에 대한 자세한 내용은 설치된 Operator 업그레이드(OpenShift 문서)를 참조하십시오.

25.5.3. 단방향 주제 관리로 마이그레이션

Topic Operator를 배포하여 주제를 관리할 때 Cluster Operator는 기본적으로 단방향 주제 관리를 활성화합니다. 양방향 주제 관리를 사용한 Apache Kafka용 스트림 버전에서 전환하는 경우 Cluster Operator를 업그레이드한 후 수행해야 하는 몇 가지 정리 작업이 있습니다. 자세한 내용은 10.9절. “Topic Operator 모드 간 전환”의 내용을 참조하십시오.

25.5.4. Cluster Operator 업그레이드 시 Kafka 버전 오류가 반환됩니다.

Cluster Operator를 사용 중인 현재 Kafka 버전을 지원하지 않는 버전으로 업그레이드하는 경우 지원되지 않는 Kafka 버전 오류가 발생합니다. 이 오류는 모든 설치 방법에 적용되며 Kafka를 지원되는 Kafka 버전으로 업그레이드해야 합니다. Kafka 리소스의 spec.kafka.version 을 지원되는 버전으로 변경합니다.

oc 를 사용하여 Kafka 리소스의 상태에서 이와 같은 오류 메시지를 확인할 수 있습니다.

Kafka 상태에 오류가 있는지 확인

oc get kafka <kafka_cluster_name> -n <namespace> -o jsonpath='{.status.conditions}'

<kafka_cluster_name>을 Kafka 클러스터의 이름으로 바꾸고 <namespace>를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.

OperatorHub를 사용하여 Apache Kafka 1.7 또는 이전 버전의 Streams에서 업그레이드하는 경우 필요한 작업

Apache Kafka Operator의 Streams for Apache Kafka Operator 를 버전 2.7로 업그레이드하기 전에 다음과 같은 사항을 변경해야 합니다.

  • 사용자 정의 리소스 및 CRD를 v1beta2로 변환
  • ControlPlaneListener 기능 게이트가 비활성화된 Apache Kafka의 Streams 버전으로 업그레이드

이러한 요구 사항은 25.2.2절. “1.7 이전의 Apache Kafka용 Streams에서 업그레이드” 에 설명되어 있습니다.

Apache Kafka 1.7 또는 이전 버전의 Streams에서 업그레이드하는 경우 다음을 수행합니다.

  1. Apache Kafka 1.7의 Streams로 업그레이드합니다.
  2. Apache Kafka 소프트웨어 다운로드 페이지에서 Streams for Apache Kafka 1.8와 함께 제공되는 Red Hat Streams for Apache Kafka API 변환 툴 을 다운로드합니다.
  3. 사용자 정의 리소스 및 CRD를 v1beta2 로 변환합니다.

    자세한 내용은 Streams for Apache Kafka 1.7 업그레이드 설명서를 참조하십시오.

  4. OperatorHub에서 Apache Kafka Operator용 Streams 1.7 버전을 삭제합니다.
  5. 또한 존재하는 경우 Apache Kafka Operator용 Streams 2.7 버전을 삭제합니다.

    존재하지 않는 경우 다음 단계로 이동합니다.

    Apache Kafka Operator의 Streams에 대한 승인 전략이 자동으로 설정된 경우 Operator의 버전 2.7이 클러스터에 이미 존재할 수 있습니다. 사용자 정의 리소스 및 CRD를 릴리스 전에 v1beta2 API 버전으로 변환 하지 않은 경우 operator-managed 사용자 정의 리소스 및 CRD는 이전 API 버전을 사용합니다. 그 결과 2.7 Operator가 Pending 상태로 유지됩니다. 이 경우 버전 2.7 of the Streams for Apache Kafka Operator 및 버전 1.7을 삭제해야 합니다.

    두 Operator를 모두 삭제하면 새 Operator 버전이 설치될 때까지 조정이 일시 중지됩니다. 사용자 정의 리소스에 대한 변경 사항이 지연되지 않도록 다음 단계를 즉시 수행합니다.

  6. OperatorHub에서 다음 중 하나를 수행합니다.

    • Apache Kafka Operator용 Streams 1.8로 업그레이드( ControlPlaneListener 기능 게이트는 기본적으로 비활성화되어 있음).
    • ControlPlaneListener 기능 게이트를 비활성화하여 Apache Kafka Operator용 Streams 2.0 또는 2.2( ControlPlaneListener 기능 게이트가 기본적으로 활성화되어 있음)로 업그레이드합니다.
  7. Apache Kafka Operator의 Streams 2.7으로 즉시 업그레이드합니다.

    설치된 2.7 Operator는 클러스터를 모니터링하고 롤링 업데이트를 수행합니다. 이 프로세스 중에 클러스터 성능이 일시적으로 저하될 수 있습니다.

Apache Kafka 클러스터의 KRaft 기반 Streams를 지원되는 최신 Kafka 버전 및 KRaft 메타데이터 버전으로 업그레이드합니다.

또한 클라이언트 업그레이드 전략을 선택해야 합니다. Kafka 클라이언트는 이 절차의 6단계에서 업그레이드됩니다.

참고

KRaft 기반 업그레이드 지원에 대한 최신 정보는 Apache Kafka 설명서를 참조하십시오.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • Apache Kafka 클러스터의 Streams를 업그레이드하기 전에 Kafka 리소스의 속성에 새 Kafka 버전에서 지원되지 않는 구성 옵션이 포함되어 있지 않은지 확인합니다.

프로세스

  1. Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka <kafka_configuration_file>
  2. 구성된 경우 현재 spec.kafka.metadataVersion 이 업그레이드 중인 Kafka 버전에서 지원하는 버전으로 설정되어 있는지 확인합니다.

    예를 들어 Kafka 버전 3.6.0에서 3.7.0으로 업그레이드하는 경우 현재 버전은 3.6-IV2입니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        replicas: 3
        metadataVersion: 3.6-IV2
        version: 3.6.0
        # ...

    metadataVersion 이 구성되지 않은 경우 다음 단계에서 Kafka 버전으로 업데이트한 후 Apache Kafka의 Streams를 현재 기본값으로 자동으로 업데이트합니다.

    참고

    metadataVersion 의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.

  3. Kafka.spec.kafka.version 을 변경하여 새 Kafka 버전을 지정하고 metadataVersion현재 Kafka 버전의 기본값으로 둡니다.

    참고

    kafka.version 을 변경하면 클러스터의 모든 브로커가 새 브로커 바이너리를 사용하도록 업그레이드됩니다. 이 프로세스 중에 일부 브로커는 이전 바이너리를 사용하고 있지만 다른 브로커는 이미 새 바이너리로 업그레이드했습니다. 현재 설정에서 metadataVersion 을 변경하지 않고 그대로 유지하면 Kafka 브로커와 컨트롤러가 업그레이드 중에 계속 서로 통신할 수 있습니다.

    예를 들어 Kafka 3.6.0에서 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        replicas: 3
        metadataVersion: 3.6-IV2 
    1
    
        version: 3.7.0 
    2
    
        # ...
    1
    메타데이터 버전이 변경되지 않음
    2
    Kafka 버전이 새 버전으로 변경되었습니다.
  4. Kafka 클러스터의 이미지가 Kafka 사용자 정의 리소스의 Kafka.spec.kafka. image 에 정의된 경우 새 Kafka 버전이 있는 컨테이너 이미지를 가리키도록 이미지를 업데이트합니다.

    Kafka 버전 및 이미지 매핑을 참조하십시오.

  5. 편집기를 저장하고 종료한 다음 롤링 업데이트가 Kafka 노드를 업그레이드할 때까지 기다립니다.

    Pod 상태 전환을 확인하여 롤링 업데이트의 진행 상황을 확인합니다.

    oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'

    롤링 업데이트를 통해 각 pod가 새 Kafka 버전에 브로커 바이너리를 사용하고 있는지 확인합니다.

  6. 클라이언트를 업그레이드하기 위한 선택한 전략에 따라 모든 클라이언트 애플리케이션을 업그레이드하여 새 버전의 클라이언트 바이너리를 사용합니다.

    필요한 경우 Kafka Connect 및 MirrorMaker의 버전 속성을 Kafka의 새 버전으로 설정합니다.

    1. Kafka Connect의 경우 KafkaConnect.spec.version 을 업데이트합니다.
    2. MirrorMaker의 경우 KafkaMirrorMaker.spec.version 을 업데이트합니다.
    3. MirrorMaker 2의 경우 KafkaMirrorMaker2.spec.version 을 업데이트합니다.

      참고

      수동으로 빌드된 사용자 지정 이미지를 사용하는 경우 해당 이미지를 다시 빌드하여 Apache Kafka 기본 이미지의 최신 스트림으로 최신 이미지인지 확인해야 합니다. 예를 들어 기본 Kafka Connect 이미지에서 컨테이너 이미지를 생성한 경우 최신 기본 이미지 및 빌드 구성을 가리키도록 Dockerfile을 업데이트합니다.

  7. 업그레이드된 클라이언트 애플리케이션이 새 Kafka 브로커에서 올바르게 작동하는지 확인합니다.
  8. 구성된 경우 새 metadataVersion 버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 9단계로 이동합니다.

    예를 들어 Kafka 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        replicas: 3
        metadataVersion: 3.7-IV2
        version: 3.7.0
        # ...
    주의

    다운그레이딩이 가능하지 않을 수 있으므로 metadataVersion 을 변경할 때는 주의하십시오. 새 Kafka 버전의 metadataVersion 이 다운그레이드하려는 Kafka 버전보다 크면 Kafka를 다운그레이드할 수 없습니다. 그러나 이전 버전을 유지 관리할 때 지원 및 호환성에 미치는 잠재적 영향을 이해하십시오.

  9. Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.

    Kafka 리소스 상태에서 업그레이드가 성공적으로 완료되었는지 확인할 수 있습니다.

25.7. Zoo Cryostat를 사용할 때 Kafka 업그레이드

Zoo Cryostat 기반 Kafka 클러스터를 사용하는 경우 업그레이드하려면 Kafka 버전과 브랜드 간 프로토콜 버전을 업데이트해야 합니다.

KRaft 모드에서 메타데이터 관리를 위해 Zoo Cryostat를 사용하여 Kafka 클러스터를 전환하려면 업그레이드와 별도로 단계를 수행해야 합니다. KRaft 기반 클러스터로 마이그레이션하는 방법에 대한 자세한 내용은 8장. KRaft 모드로 마이그레이션 을 참조하십시오.

25.7.1. Kafka 버전 업데이트

클러스터 관리를 위해 Zoo Cryostat를 사용할 때 Kafka 를 업그레이드하려면 Kafka 리소스 구성에서 Kafka 버전(Kafka.spec.kafka.version)과 브랜드 간 프로토콜 버전(inter.broker.protocol.version)을 업데이트해야 합니다. Kafka의 각 버전에는 해석 간 프로토콜의 호환 버전이 있습니다. broker 간 프로토콜은 브루커 간 통신에 사용됩니다. 프로토콜의 마이너 버전은 일반적으로 이전 표에 표시된 대로 Kafka의 마이너 버전과 일치하도록 증가합니다. broker 프로토콜 버전은 Kafka 리소스에서 클러스터 전체로 설정됩니다. 이를 변경하려면 Kafka.spec.kafka.config 에서 inter.broker.protocol.version 속성을 편집합니다.

다음 표는 Kafka 버전의 차이점을 보여줍니다.

Expand
표 25.1. Kafka 버전 차이점
Apache Kafka 버전용 스트림Kafka 버전broker 프로토콜 버전로그 메시지 형식 버전Zookeeper 버전

2.7

3.7.0

3.7

3.7

3.8.3

2.6

3.6.0

3.6

3.6

3.8.3

  • Kafka 3.7.0은 프로덕션 용도로 지원됩니다.
  • Kafka 3.6.0은 Apache Kafka 2.7용 Streams로 업그레이드하기 위한 목적으로만 지원됩니다.

로그 메시지 형식 버전

생산자가 Kafka 브로커에 메시지를 보내면 메시지는 특정 형식을 사용하여 인코딩됩니다. 형식은 Kafka 릴리스 간에 변경될 수 있으므로 메시지는 인코딩된 메시지 형식의 버전을 지정합니다.

특정 메시지 형식 버전을 설정하는 데 사용되는 속성은 다음과 같습니다.

  • 주제의 message.format.version 속성
  • Kafka 브로커의 log.message.format.version 속성

Kafka 3.0.0에서 메시지 형식 버전 값은 inter.broker.protocol.version 과 일치하도록 가정되며 설정할 필요가 없습니다. 값은 사용된 Kafka 버전을 반영합니다.

Kafka 3.0.0 이상으로 업그레이드할 때 inter.broker.protocol.version 을 업데이트할 때 이러한 설정을 제거할 수 있습니다. 그러지 않으면 업그레이드할 Kafka 버전에 따라 메시지 형식 버전을 설정할 수 있습니다.

항목에 대한 message.format.version 의 기본값은 Kafka 브로커에 설정된 log.message.format.version 에 의해 정의됩니다. 주제 구성을 수정하여 주제의 message.format.version 을 수동으로 설정할 수 있습니다.

Kafka 버전 변경에서 롤링 업데이트

Kafka 버전이 업데이트되면 Cluster Operator가 Kafka 브로커에 대한 롤링 업데이트를 시작합니다. 추가 롤링 업데이트는 inter.broker.protocol.versionlog.message.format.version 에 대한 구성에 따라 달라집니다.

Expand
Kafka.spec.kafka.config 에…​이 포함된 경우Cluster Operator가…​을 시작합니다.

inter.broker.protocol.versionlog.message.format.version.

단일 롤링 업데이트. 업데이트 후 inter.broker.protocol.version 을 수동으로 업데이트하고 log.message.format.version 을 사용해야 합니다. 각각을 변경하면 추가 롤링 업데이트가 트리거됩니다.

inter.broker.protocol.version 또는 log.message.format.version 중 하나입니다.

두 개의 롤링 업데이트

inter.broker.protocol.version 또는 log.message.format.version 에 대한 구성이 없습니다.

두 개의 롤링 업데이트

중요

Kafka 3.0.0에서 inter.broker.protocol.version3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다. 브로커의 log.message.format.version 속성 및 주제의 message.format.version 속성은 더 이상 사용되지 않으며 Kafka의 향후 릴리스에서 제거됩니다.

Kafka 업그레이드의 일부로 Cluster Operator는 Zoo Cryostat에 대한 롤링 업데이트를 시작합니다.

  • 단일 롤링 업데이트는 Zoo Cryostat 버전이 변경되지 않은 경우에도 발생합니다.
  • 추가 롤링 업데이트는 Kafka의 새 버전에 새 Zoo Cryostat 버전이 필요한 경우 발생합니다.

25.7.2. 이전 메시지 형식으로 클라이언트 업그레이드

Kafka 3.0 이전에는 log.message.format.version 속성(또는 주제 수준의 message.format.version 속성)을 사용하여 브로커에 대한 특정 메시지 형식을 구성할 수 있습니다. 이로 인해 브로커는 오래된 메시지 형식을 사용하는 이전 Kafka 클라이언트를 수용할 수 있었습니다. Kafka는 이 속성을 명시적으로 설정하지 않고 이전 클라이언트를 고유하게 지원하지만 브로커는 상당한 성능 비용과 함께 이전 클라이언트에서 메시지를 변환해야 합니다.

Apache Kafka Java 클라이언트는 버전 0.11 이후 최신 메시지 형식 버전을 지원했습니다. 모든 클라이언트가 최신 메시지 버전을 사용하는 경우 브로커를 업그레이드할 때 log.message.format.version 또는 message.format.version 덮어쓰기를 제거할 수 있습니다.

그러나 이전 메시지 형식 버전을 사용하는 클라이언트가 여전히 있는 경우 먼저 클라이언트를 업그레이드하는 것이 좋습니다. 소비자와 함께 시작한 다음 브로커를 업그레이드할 때 log.message.format.version 또는 message.format.version 을 제거하기 전에 생산자를 업그레이드합니다. 이렇게 하면 모든 클라이언트가 최신 메시지 형식 버전을 지원할 수 있으며 업그레이드 프로세스가 원활하게 진행됩니다.

이 메트릭을 사용하여 Kafka 클라이언트 이름 및 버전을 추적할 수 있습니다.

  • Kafka.server:type=socket-server-metrics,clientSoftwareName=<name>,clientSoftwareVersion=<version>,listener=<listener>,networkProcessor=<processor>
작은 정보

다음 Kafka 브로커 메트릭은 메시지 down-conversion의 성능을 모니터링하는 데 도움이 됩니다.

  • Kafka .network:type=RequestMetrics,name=MessageConversionsTimeMs,request={Produce|Fetch} 는 메시지 변환을 수행하는 데 걸리는 시간에 대한 메트릭을 제공합니다.
  • Kafka .server:type=BrokerTopicMetrics,name={Produce|Fetch}MessageConversionsPerSec,topic=([.\w]+) 은 일정 기간 동안 변환된 메시지 수에 대한 메트릭을 제공합니다.

지원되는 최신 Kafka 버전 및 브랜드 간 프로토콜 버전으로 Apache Kafka 클러스터의 Zoo Cryostat 기반 Streams를 업그레이드합니다.

또한 클라이언트 업그레이드 전략을 선택해야 합니다. Kafka 클라이언트는 이 절차의 6단계에서 업그레이드됩니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • Apache Kafka 클러스터의 Streams를 업그레이드하기 전에 Kafka 리소스의 속성에 새 Kafka 버전에서 지원되지 않는 구성 옵션이 포함되어 있지 않은지 확인합니다.

프로세스

  1. Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka <kafka_configuration_file>
  2. 구성된 경우 inter.broker.protocol.versionlog.message.format.version 속성이 현재 버전으로 설정되어 있는지 확인합니다.

    예를 들어 Kafka 버전 3.6.0에서 3.7.0으로 업그레이드하는 경우 현재 버전은 3.6입니다.

    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.6.0
        config:
          log.message.format.version: "3.6"
          inter.broker.protocol.version: "3.6"
          # ...

    log.message.format.versioninter.broker.protocol.version 이 구성되지 않은 경우 Apache Kafka의 Streams는 다음 단계에서 Kafka 버전으로 업데이트한 후 이러한 버전을 현재 기본값으로 자동으로 업데이트합니다.

    참고

    log.message.format.versioninter.broker.protocol.version 의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.

  3. Kafka.spec.kafka.version 을 변경하여 새 Kafka 버전을 지정하고, 현재 Kafka 버전의 기본값으로 log.message.format.versioninter.broker.protocol.version 을 남겨 둡니다.

    참고

    kafka.version 을 변경하면 클러스터의 모든 브로커가 새 브로커 바이너리를 사용하도록 업그레이드됩니다. 이 프로세스 중에 일부 브로커는 이전 바이너리를 사용하고 있지만 다른 브로커는 이미 새 바이너리로 업그레이드했습니다. 현재 설정에서 inter.broker.protocol.version 을 변경하지 않으면 브로커가 업그레이드 중에 계속 서로 통신할 수 있습니다.

    예를 들어 Kafka 3.6.0에서 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.7.0 
    1
    
        config:
          log.message.format.version: "3.6" 
    2
    
          inter.broker.protocol.version: "3.6" 
    3
    
          # ...
    1
    Kafka 버전이 새 버전으로 변경되었습니다.
    2
    메시지 형식 버전은 변경되지 않습니다.
    3
    broker 프로토콜 버전은 변경되지 않습니다.
    주의

    새 Kafka 버전의 inter.broker.protocol.version 이 변경되면 Kafka를 다운그레이드할 수 없습니다. inter-broker 프로토콜 버전은 __consumer_offsets 에 기록된 메시지를 포함하여 브로커가 저장한 영구 메타데이터에 사용되는 스키마를 결정합니다. 다운그레이드된 클러스터는 메시지를 이해할 수 없습니다.

  4. Kafka 클러스터의 이미지가 Kafka 사용자 정의 리소스의 Kafka.spec.kafka. image 에 정의된 경우 새 Kafka 버전이 있는 컨테이너 이미지를 가리키도록 이미지를 업데이트합니다.

    Kafka 버전 및 이미지 매핑을 참조하십시오.

  5. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.

    Pod 상태 전환을 확인하여 롤링 업데이트의 진행 상황을 확인합니다.

    oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'

    롤링 업데이트를 통해 각 pod가 새 Kafka 버전에 브로커 바이너리를 사용하고 있는지 확인합니다.

  6. 클라이언트를 업그레이드하기 위한 선택한 전략에 따라 모든 클라이언트 애플리케이션을 업그레이드하여 새 버전의 클라이언트 바이너리를 사용합니다.

    필요한 경우 Kafka Connect 및 MirrorMaker의 버전 속성을 Kafka의 새 버전으로 설정합니다.

    1. Kafka Connect의 경우 KafkaConnect.spec.version 을 업데이트합니다.
    2. MirrorMaker의 경우 KafkaMirrorMaker.spec.version 을 업데이트합니다.
    3. MirrorMaker 2의 경우 KafkaMirrorMaker2.spec.version 을 업데이트합니다.

      참고

      수동으로 빌드된 사용자 지정 이미지를 사용하는 경우 해당 이미지를 다시 빌드하여 Apache Kafka 기본 이미지의 최신 스트림으로 최신 이미지인지 확인해야 합니다. 예를 들어 기본 Kafka Connect 이미지에서 컨테이너 이미지를 생성한 경우 최신 기본 이미지 및 빌드 구성을 가리키도록 Dockerfile을 업데이트합니다.

  7. 업그레이드된 클라이언트 애플리케이션이 새 Kafka 브로커에서 올바르게 작동하는지 확인합니다.
  8. 구성된 경우 새 inter.broker.protocol.version 버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 9단계로 이동합니다.

    예를 들어 Kafka 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.7.0
        config:
          log.message.format.version: "3.6"
          inter.broker.protocol.version: "3.7"
          # ...
  9. Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
  10. 구성된 경우 새 log.message.format.version 버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 10 단계로 이동합니다.

    예를 들어 Kafka 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.7.0
        config:
          log.message.format.version: "3.7"
          inter.broker.protocol.version: "3.7"
          # ...
    중요

    Kafka 3.0.0에서 inter.broker.protocol.version3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다.

  11. Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.

    Kafka 리소스 상태에서 업그레이드가 성공적으로 완료되었는지 확인할 수 있습니다.

25.8. 업그레이드 상태 확인

업그레이드(또는 다운그레이드)를 수행할 때 Kafka 사용자 정의 리소스의 상태에서 성공적으로 완료되었는지 확인할 수 있습니다. 상태는 사용 중인 Apache Kafka 및 Kafka 버전의 Streams에 대한 정보를 제공합니다.

업그레이드를 완료한 후 올바른 버전이 있는지 확인하려면 Kafka 상태에서 kafkaVersionoperatorLastSuccessfulVersion 값을 확인합니다.

  • operatorLastSuccessfulVersion 은 마지막으로 조정에 성공한 Apache Kafka Operator의 Streams 버전입니다.
  • kafkaVersion 은 Kafka 클러스터에서 사용하는 Kafka 버전입니다.
  • kafkaMetadataVersion 은 KRaft 기반 Kafka 클러스터에서 사용하는 메타데이터 버전입니다.

이 값을 사용하여 Apache Kafka 또는 Kafka에 대한 Streams 업그레이드가 완료되었는지 확인할 수 있습니다.

Kafka 상태에서 업그레이드 확인

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
spec:
  # ...
status:
  # ...
  kafkaVersion: 3.7.0
  operatorLastSuccessfulVersion: 2.7
  kafkaMetadataVersion: 3.7

25.9. Apache Kafka의 Streams를 업그레이드할 때 FIPS 모드로 전환

Apache Kafka의 스트림이 FIPS 지원 OpenShift 클러스터에서 FIPS 모드에서 실행되도록 업그레이드합니다. Apache Kafka 2.3의 스트림까지 FIPS 지원 OpenShift 클러스터에서 실행되는 것은 FIPS_MODE 환경 변수를 사용하여 FIPS 모드를 비활성화한 경우에만 사용할 수 있었습니다. 릴리스 2.3에서 Apache Kafka용 Streams는 FIPS 모드를 지원합니다. FIPS_MODEdisabled 로 설정하여 FIPS 지원 OpenShift 클러스터에서 Apache Kafka에 대한 Streams를 실행하면 다음 절차에 따라 활성화할 수 있습니다.

사전 요구 사항

  • FIPS 지원 OpenShift 클러스터
  • FIPS_MODE 환경 변수가 disabled로 설정된 기존 Cluster Operator 배포

프로세스

  1. Cluster Operator를 버전 2.3 이상으로 업그레이드하지만 FIPS_MODE 환경 변수를 disabled 로 설정합니다.
  2. 2.3 이전의 Apache Kafka 버전의 Streams를 처음 배포한 경우 FIPS가 활성화된 상태에서 지원되지 않는 PKCS #12 저장소에서 이전 암호화 및 다이제스트 알고리즘을 사용할 수 있습니다. 업데이트된 알고리즘으로 인증서를 다시 생성하려면 클러스터 및 클라이언트 CA 인증서를 갱신합니다.

  3. SCRAM-SHA-512 인증을 사용하는 경우 사용자의 암호 길이를 확인합니다. 32자 미만의 경우 다음 방법 중 하나로 새 암호를 생성합니다.

    1. User Operator가 충분한 길이의 새 암호를 사용하여 새 암호를 생성하도록 사용자 시크릿을 삭제합니다.
    2. KafkaUser 사용자 정의 리소스의 .spec.authentication.password 속성을 사용하여 암호를 제공한 경우 동일한 암호 구성에서 참조되는 OpenShift 시크릿의 암호를 업데이트합니다. 새 암호를 사용하도록 클라이언트를 업데이트하는 것을 잊어서는 안 됩니다.
  4. CA 인증서가 올바른 알고리즘을 사용하고 SCRAM-SHA-512 암호가 충분한 길이인지 확인합니다. 그런 다음 FIPS 모드를 활성화할 수 있습니다.
  5. Cluster Operator 배포에서 FIPS_MODE 환경 변수를 제거합니다. 그러면 Cluster Operator가 재시작되고 모든 피연산자를 롤백하여 FIPS 모드를 활성화합니다. 재시작이 완료되면 이제 모든 Kafka 클러스터가 FIPS 모드가 활성화된 상태에서 실행됩니다.

26장. Apache Kafka용 다운그레이드 스트림

업그레이드한 Apache Kafka의 Streams 버전에 문제가 있는 경우 설치를 이전 버전으로 되돌릴 수 있습니다.

YAML 설치 파일을 사용하여 Apache Kafka용 Streams를 설치한 경우 이전 릴리스의 YAML 설치 파일을 사용하여 다운그레이드 절차를 수행할 수 있습니다. Cluster Operator 및 사용 중인 Kafka 버전을 업데이트하여 Apache Kafka용 Streams를 다운그레이드할 수 있습니다. Kafka 버전 다운그레이드는 Cluster Operator에서 수행합니다.

주의

다음 다운그레이드 지침은 설치 파일을 사용하여 Apache Kafka용 Streams를 설치한 경우에만 적합합니다. OperatorHub와 같은 다른 방법을 사용하여 Apache Kafka용 Streams를 설치한 경우 문서에 지정하지 않는 한 해당 메서드에서 다운그레이드가 지원되지 않을 수 있습니다. 성공적인 다운그레이드 프로세스를 위해서는 지원되는 접근 방식을 사용해야 합니다.

26.1. Cluster Operator를 이전 버전으로 다운그레이드

Apache Kafka용 Streams에 문제가 있는 경우 설치를 되돌릴 수 있습니다.

다음 절차에서는 Cluster Operator 배포를 이전 버전으로 다운그레이드하는 방법을 설명합니다.

사전 요구 사항

사전 준비 사항

Apache Kafka 기능 게이트용 Streams 의 다운그레이드 요구 사항을 확인합니다. 기능 게이트가 영구적으로 활성화된 경우 대상 버전으로 다운그레이드하기 전에 비활성화할 수 있는 버전으로 다운그레이드해야 할 수 있습니다.

프로세스

  1. 기존 Cluster Operator 리소스( /install/cluster-operator 디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. 이전 버전의 Cluster Operator에서 변경 사항을 덮어씁니다.
  2. 사용자 정의 리소스를 되돌리면 다운그레이드하려는 Apache Kafka의 Streams에 사용할 수 있는 지원되는 구성 옵션을 반영합니다.
  3. Cluster Operator를 업데이트합니다.

    1. Cluster Operator가 실행 중인 네임스페이스에 따라 이전 버전의 설치 파일을 수정합니다.

      Linux에서 다음을 사용하십시오.

      sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml

      MacOS에서 다음을 사용하십시오.

      sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
    2. 기존 Cluster Operator 배포에서 하나 이상의 환경 변수를 수정한 경우 install/cluster-operator/060- Deployment -strimzi-cluster-operator.yaml 파일을 편집하여 해당 환경 변수를 사용합니다.
  4. 업데이트된 구성이 있는 경우 나머지 설치 리소스와 함께 배포합니다.

    oc replace -f install/cluster-operator

    롤링 업데이트가 완료될 때까지 기다립니다.

  5. Kafka Pod의 이미지를 가져와서 다운그레이드에 성공했는지 확인합니다.

    oc get pod my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'

    image 태그는 Apache Kafka 버전의 새 Streams 및 Kafka 버전을 표시합니다. 예를 들어 < strimzi_version>-kafka-<kafka_version>.

    또한 Kafka 리소스 상태에서 다운그레이드가 성공적으로 완료되었는지 확인할 수 있습니다.

Apache Kafka 클러스터의 KRaft 기반 Streams를 이전 버전으로 다운그레이드합니다. Apache Kafka 클러스터의 KRaft 기반 Streams를 3.7.0에서 3.6.0으로 이동하는 등 더 낮은 버전으로 다운그레이드하는 경우 Kafka 클러스터에서 사용하는 메타데이터 버전이 다운그레이드하려는 Kafka 버전에서 지원하는 버전인지 확인합니다. 다운그레이드하려는 Kafka 버전의 메타데이터 버전은 다운그레이드된 버전보다 크지 않아야 합니다.

참고

KRaft 기반 다운그레이드와 관련된 지원 및 제한 사항에 대한 정보는 Apache Kafka 설명서를 참조하십시오.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • Apache Kafka 클러스터의 Streams를 다운그레이드하기 전에 Kafka 리소스에 대해 다음을 확인합니다.

    • Kafka 사용자 정의 리소스에는 다운그레이드된 Kafka 버전에서 지원하지 않는 옵션이 포함되어 있지 않습니다.
    • spec.kafka.metadataVersion 은 다운그레이드된 Kafka 버전에서 지원하는 버전으로 설정됩니다.

프로세스

  1. Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka <kafka_configuration_file>
  2. metadataVersion 버전을 다운그레이드하려는 Kafka 버전에서 지원하는 버전으로 변경합니다. 현재 Kafka 버전에서 변경하지 않고 Kafka.spec.kafka.version 을 그대로 둡니다.

    예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        replicas: 3
        metadataVersion: 3.6-IV2 
    1
    
        version: 3.7.0 
    2
    
        # ...
    1
    메타데이터 버전은 이전 Kafka 버전에서 지원하는 버전으로 변경됩니다.
    2
    Kafka 버전은 변경되지 않습니다.
    참고

    metadataVersion 의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.

  3. 변경 사항을 저장하고 Cluster Operator가 Kafka 리소스의 .status.kafkaMetadataVersion 을 업데이트할 때까지 기다립니다.
  4. Kafka.spec.kafka.version 을 이전 버전으로 변경합니다.

    예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        replicas: 3
        metadataVersion: 3.6-IV2 
    1
    
        version: 3.6.0 
    2
    
        # ...
    1
    메타데이터 버전은 Kafka 버전에서 지원합니다.
    2
    Kafka 버전이 새 버전으로 변경되었습니다.
  5. Kafka 버전의 이미지가 Cluster Operator의 STRIMZI_KAFKA_IMAGES 에 정의된 이미지와 다른 경우 Kafka.spec.kafka.image 를 업데이트합니다.

    25.2.3절. “Kafka 버전 및 이미지 매핑”을 참조하십시오.

  6. Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.

    Kafka 리소스 상태에서 다운그레이드가 성공적으로 완료되었는지 확인할 수 있습니다.

  7. 이전 버전의 클라이언트 바이너리를 사용하도록 모든 클라이언트 애플리케이션(consumers)을 다운그레이드합니다.

    Kafka 클러스터 및 클라이언트는 이제 이전 Kafka 버전을 사용하고 있습니다.

26.3. Zoo Cryostat를 사용할 때 Kafka 다운그레이드

Zoo Cryostat 모드에서 Kafka를 사용하는 경우 다운그레이드 프로세스에서 Kafka 버전 및 관련 log.message.format.versioninter.broker.protocol.version 속성을 변경해야 합니다.

26.3.1. 다운그레이드에 대한 Kafka 버전 호환성

Kafka 다운그레이드는 호환되는 현재 및 대상 Kafka 버전 및 메시지가 기록된 상태에 따라 달라집니다.

해당 버전에서 해당 클러스터에서 사용된 inter.broker.protocol.version 설정을 지원하지 않거나 최신 log.message.format.version 을 사용하는 메시지 로그에 메시지가 추가된 경우 이전 Kafka 버전으로 되돌릴 수 없습니다.

inter.broker.protocol.version__consumer_offsets 에 기록된 메시지의 스키마와 같이 브로커가 저장한 영구 메타데이터에 사용되는 스키마를 결정합니다. 클러스터에서 이전에 사용된 inter.broker.protocol.version 을 이해하지 못하는 Kafka 버전으로 다운그레이드하는 경우 브로커는 이해할 수 없는 데이터를 접하게 됩니다.

Kafka의 대상 다운그레이드 버전에 해당하는 경우:

  • 현재 버전과 동일한 log.message.format.version, Cluster Operator는 브로커를 단일 롤링 재시작하여 다운그레이드합니다.
  • 다른 log.message.format.version.downgrading은 실행 중인 클러스터에 항상 log.message.format.version 이 downgraded 버전에서 사용하는 버전으로 설정된 경우에만 가능합니다. 일반적으로 log.message.format.version 을 변경하기 전에 업그레이드 절차가 중단된 경우에만 해당합니다. 이 경우 다운그레이드에는 다음이 필요합니다.

    • 두 버전의 interbroker 프로토콜이 다른 경우 브로커의 두 롤링 재시작
    • 동일한 경우 단일 롤링 재시작

새 버전이 log.message.format.version 의 기본값을 사용하는 경우를 포함하여 이전 버전에서 지원하지 않는 log.message.format.version 을 사용한 경우 다운그레이드를 수행할 수 없습니다. 예를 들어 log.message.format.version 이 변경되지 않았기 때문에 Kafka 버전 3.6.0으로 이 리소스를 다운그레이드할 수 있습니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  # ...
  kafka:
    version: 3.7.0
    config:
      log.message.format.version: "3.6"
      # ...

log.message.format.version"3.7" 로 설정되었거나 값이 없는 경우 다운그레이드를 수행할 수 없으므로 매개 변수가 3.7의 3.7.0 브로커에 기본값을 사용합니다.

중요

Kafka 3.0.0에서 inter.broker.protocol.version3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다.

Apache Kafka 클러스터의 Zoo Cryostat 기반 스트림을 이전 버전으로 다운그레이드합니다. Apache Kafka 클러스터용 Zoo Cryostat 기반 Streams를 3.7.0에서 3.6.0으로 이동하는 것과 같은 더 낮은 버전으로 다운그레이드하는 경우 Kafka 클러스터에서 사용하는 비브로커 프로토콜 버전이 다운그레이드하려는 Kafka 버전에서 지원하는 버전인지 확인합니다. 다운그레이드하려는 Kafka 버전에 대한 inter-broker 프로토콜 버전은 다운그레이드 중인 버전보다 높지 않아야 합니다.

참고

Zoo Cryostat 기반 다운그레이드와 관련된 지원 및 제한 사항에 대한 정보는 Apache Kafka 설명서를 참조하십시오.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • Apache Kafka 클러스터의 Streams를 다운그레이드하기 전에 Kafka 리소스에 대해 다음을 확인합니다.

    • 중요: Kafka 버전의 호환성.
    • Kafka 사용자 정의 리소스에는 다운그레이드된 Kafka 버전에서 지원하지 않는 옵션이 포함되어 있지 않습니다.
    • Kafka.spec.kafka.config 에는 로 다운그레이드되는 Kafka 버전에서 지원하는 log.message.format.versioninter.broker.protocol.version 이 있습니다.

      Kafka 3.0.0에서 inter.broker.protocol.version3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다.

프로세스

  1. Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka <kafka_configuration_file>
  2. inter.broker.protocol.version 버전(및 log.message.format.version )을 다운그레이드하려는 Kafka 버전에서 지원하는 버전으로 변경합니다. Kafka.spec.kafka.version현재 Kafka 버전에서 변경되지 않은 상태로 둡니다.

    예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      # ...
      kafka:
        version: 3.7.0 
    1
    
        config:
          inter.broker.protocol.version: "3.6" 
    2
    
          log.message.format.version: "3.6"
          # ...
    1
    Kafka 버전은 변경되지 않습니다.
    2
    broker 프로토콜 버전이 이전 Kafka 버전에서 지원하는 버전으로 변경됩니다.
    참고

    log.message.format.versioninter.broker.protocol.version 의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.

  3. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.

    Pod 상태 전환을 확인하여 롤링 업데이트의 진행 상황을 확인합니다.

    oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'

    롤링 업데이트를 통해 각 pod가 지정된 Kafka 간 프로토콜 버전을 사용하고 있습니다.

  4. Kafka.spec.kafka.version 을 이전 버전으로 변경합니다.

    예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      # ...
      kafka:
        version: 3.6.0 
    1
    
        config:
          inter.broker.protocol.version: "3.6" 
    2
    
          log.message.format.version: "3.6"
          # ...
    1
    Kafka 버전이 새 버전으로 변경되었습니다.
    2
    broker 간 프로토콜 버전은 Kafka 버전에서 지원됩니다.
  5. Kafka 버전의 이미지가 Cluster Operator의 STRIMZI_KAFKA_IMAGES 에 정의된 이미지와 다른 경우 Kafka.spec.kafka.image 를 업데이트합니다.

    25.2.3절. “Kafka 버전 및 이미지 매핑”을 참조하십시오.

  6. Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.

    Kafka 리소스 상태에서 다운그레이드가 성공적으로 완료되었는지 확인할 수 있습니다.

  7. 이전 버전의 클라이언트 바이너리를 사용하도록 모든 클라이언트 애플리케이션(consumers)을 다운그레이드합니다.

    Kafka 클러스터 및 클라이언트는 이제 이전 Kafka 버전을 사용하고 있습니다.

  8. 주제 메타데이터 스토리지에 Zoo Cryostat를 사용하는 1.7 이전의 Apache Kafka용 Streams 버전으로 되돌리는 경우 Kafka 클러스터에서 내부 주제 저장소 주제를 삭제합니다.

    oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete

27장. Apache Kafka의 스트림 설치 제거

OpenShift Container Platform 웹 콘솔 또는 CLI를 사용하여 OperatorHub에서 OpenShift 4.12에서 4.15로 Apache Kafka의 Streams를 설치 제거할 수 있습니다.

Apache Kafka용 Streams를 설치하는 데 사용한 것과 동일한 접근 방식을 사용합니다.

Apache Kafka용 Streams를 설치 제거할 때 배포를 위해 특별히 생성된 리소스를 식별하고 Apache Kafka 리소스에서 참조하는 리소스를 식별해야 합니다.

이러한 리소스는 다음과 같습니다.

  • 보안(사용자 정의 CA 및 인증서, Kafka Connect 시크릿 및 기타 Kafka 시크릿)
  • 로깅 ConfigMaps (유형 외부)

이러한 리소스는 Kafka , Kafka Connect,KafkaMirrorMaker 또는 KafkaBridge 구성에서 참조하는 리소스입니다.

주의

CRD 및 관련 사용자 정의 리소스 삭제

CustomResourceDefinition 이 삭제되면 해당 유형의 사용자 정의 리소스도 삭제됩니다. 여기에는 Apache Kafka 용 Streams에서 관리하는 Kafka , Kafka Connect,KafkaMirrorMaker 및 Kafka Kafka의 Pod를 관리하는 데 사용하는 StrimziPodSet 리소스 스트림이 포함됩니다. 또한 Deployment,Pod,Service, ConfigMap 리소스와 같이 이러한 사용자 정의 리소스에서 생성한 모든 OpenShift 리소스도 제거됩니다. 의도하지 않은 데이터 손실을 방지하기 위해 이러한 리소스를 삭제할 때는 항상 주의하십시오.

27.1. 웹 콘솔을 사용하여 OperatorHub에서 Apache Kafka의 스트림 설치 제거

다음 절차에서는 OperatorHub에서 Apache Kafka의 Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.

콘솔에서 단계를 수행하거나 대체 CLI 명령을 사용할 수 있습니다.

사전 요구 사항

  • cluster-admin 또는 strimzi-admin 권한이 있는 계정을 사용하여 OpenShift Container Platform 웹 콘솔에 액세스합니다.
  • 삭제할 리소스를 확인했습니다.

    다음 oc CLI 명령을 사용하여 리소스를 찾고 Apache Kafka의 스트림을 제거할 때 해당 리소스가 제거되었는지 확인할 수 있습니다.

    Apache Kafka 배포를 위한 스트림과 관련된 리소스를 찾는 명령

    oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>

    & lt;resource_type >을 시크릿 또는 configmap 과 같이 검사 중인 리소스 유형으로 바꿉니다.

프로세스

  1. OpenShift 웹 콘솔에서 Operator > 설치된 Operator로 이동합니다.
  2. 설치된 Apache Kafka Operator 의 경우 옵션 아이콘(세 개의 수직 점)을 선택하고 Operator 설치 제거를 클릭합니다.

    Operator는 설치된 Operator에서 제거됩니다.

  3. Home > Projects 로 이동하여 Apache Kafka용 Streams 및 Kafka 구성 요소를 설치한 프로젝트를 선택합니다.
  4. Inventory 아래의 옵션을 클릭하여 관련 리소스를 삭제합니다.

    리소스에는 다음이 포함됩니다.

    • 배포
    • StatefulSets
    • Pods
    • 서비스
    • ConfigMaps
    • 보안
    작은 정보

    검색을 사용하여 Kafka 클러스터 이름으로 시작하는 관련 리소스를 찾습니다. 워크로드에서 리소스를 찾을 수도 있습니다.

대체 CLI 명령

CLI 명령을 사용하여 OperatorHub에서 Apache Kafka의 스트림을 제거할 수 있습니다.

  1. Apache Kafka 서브스크립션의 Streams를 삭제합니다.

    oc delete subscription amq-streams -n openshift-operators
  2. CSV(클러스터 서비스 버전)를 삭제합니다.

    oc delete csv amqstreams.<version>  -n openshift-operators
  3. 관련 CRD를 제거합니다.

    oc get crd -l app=strimzi -o name | xargs oc delete

27.2. CLI를 사용하여 Apache Kafka의 스트림 설치 제거

다음 절차에서는 oc 명령줄 툴을 사용하여 Apache Kafka의 Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.

사전 요구 사항

  • cluster-admin 또는 strimzi-admin 권한이 있는 계정을 사용하여 OpenShift 클러스터에 액세스합니다.
  • 삭제할 리소스를 확인했습니다.

    다음 oc CLI 명령을 사용하여 리소스를 찾고 Apache Kafka의 스트림을 제거할 때 해당 리소스가 제거되었는지 확인할 수 있습니다.

    Apache Kafka 배포를 위한 스트림과 관련된 리소스를 찾는 명령

    oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>

    & lt;resource_type >을 시크릿 또는 configmap 과 같이 검사 중인 리소스 유형으로 바꿉니다.

프로세스

  1. Cluster Operator Deployment, 관련 CustomResourceDefinitionsRBAC 리소스를 삭제합니다.

    Cluster Operator를 배포하는 데 사용되는 설치 파일을 지정합니다.

    oc delete -f install/cluster-operator
  2. 사전 요구 사항에서 확인한 리소스를 삭제합니다.

    oc delete <resource_type> <resource_name> -n <namespace>

    & lt;resource_type >을 삭제 중인 리소스 유형으로 바꾸고 < resource_name >을 리소스 이름으로 바꿉니다.

    시크릿 삭제 예

    oc delete secret my-cluster-clients-ca-cert -n my-project

28장. Kafka 재시작에 대한 정보 검색

Cluster Operator가 OpenShift 클러스터에서 Kafka Pod를 다시 시작한 후 Pod가 다시 시작된 이유를 설명하는 Pod의 네임스페이스에 OpenShift 이벤트를 내보냅니다. 클러스터 동작을 이해하는 데 도움이 필요하면 명령줄에서 재시작 이벤트를 확인할 수 있습니다.

작은 정보

Prometheus와 같은 메트릭 컬렉션 툴을 사용하여 재시작 이벤트를 내보내고 모니터링할 수 있습니다. 적절한 형식으로 출력을 내보낼 수 있는 이벤트 내보내기기와 함께 메트릭 툴을 사용합니다.

28.1. 재시작 이벤트 이유

Cluster Operator는 특정 이유로 재시작 이벤트를 시작합니다. 재시작 이벤트에 대한 정보를 가져와서 이유를 확인할 수 있습니다.

Expand
표 28.1. 재시작 이유
이벤트설명

CaCertHasOldGeneration

Pod는 이전 CA로 서명된 서버 인증서를 계속 사용하므로 인증서 업데이트의 일부로 다시 시작해야 합니다.

CaCertRemoved

만료된 CA 인증서가 제거되었으며 Pod가 현재 인증서로 실행되도록 다시 시작됩니다.

CaCertRenewed

CA 인증서가 갱신되었으며 Pod가 업데이트된 인증서로 실행되도록 다시 시작됩니다.

ClientCaCertKeyReplaced

클라이언트 CA 인증서에 서명하는 데 사용되는 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 다시 시작됩니다.

ClusterCaCertKeyReplaced

클러스터의 CA 인증서에 서명하는 데 사용되는 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 다시 시작됩니다.

ConfigChangeRequiresRestart

일부 Kafka 구성 속성은 동적으로 변경되지만 다른 경우 브로커를 다시 시작해야 합니다.

FileSystemResizeNeeded

파일 시스템 크기가 증가했으며 이를 적용하려면 다시 시작해야 합니다.

KafkaCertificatesChanged

Kafka 브로커에서 사용하는 하나 이상의 TLS 인증서가 업데이트되었으며 이를 사용하려면 다시 시작해야 합니다.

ManualRollingUpdate

사용자가 Pod를 주석 처리하거나 StrimziPodSet 을 설정하여 재시작을 트리거합니다.

PodForceRestartOnError

수정을 위해 Pod를 다시 시작해야 하는 오류가 발생했습니다.

PodHasOldRevision

Kafka 볼륨에서 디스크가 추가되거나 제거되었으며 변경 사항을 적용하려면 다시 시작해야 합니다. StrimziPodSet 리소스를 사용할 때 Pod를 다시 생성해야 하는 경우 동일한 이유가 제공됩니다.

PodHasOldRevision

Pod의 멤버인 StrimziPodSet 이 업데이트되어 Pod를 다시 생성해야 합니다. StrimziPodSet 리소스를 사용할 때 Kafka 볼륨에서 디스크를 추가하거나 제거하는 경우에도 동일한 이유가 제공됩니다.

PodStuck

Pod는 여전히 보류 중이고 예약되지 않았거나 예약할 수 없으므로 Operator에서 Pod를 마지막으로 실행하여 Pod를 다시 시작했습니다.

PodUnresponsive

Apache Kafka의 스트림을 Pod에 연결할 수 없어 브로커가 올바르게 시작되지 않음을 나타낼 수 있으므로 Operator에서 문제를 해결하기 위해 다시 시작했습니다.

28.2. 이벤트 필터 재시작

명령줄에서 재시작 이벤트를 확인할 때 OpenShift 이벤트 필드에 필터링할 필드 선택기 를 지정할 수 있습니다.

다음 필드는 필드 선택기 로 이벤트를 필터링할 때 사용할 수 있습니다.

regardingObject.kind
재시작된 오브젝트와 재시작 이벤트의 경우 kind는 항상 Pod 입니다.
regarding.namespace
Pod가 속한 네임스페이스입니다.
regardingObject.name
Pod의 이름(예: strimzi-cluster-kafka-0 )
regardingObject.uid
Pod의 고유 ID입니다.
reason
Pod를 재시작한 이유(예: JbodVolumesChanged )
reportingController
보고 구성 요소는 항상 Apache Kafka 재시작 이벤트용 Streams용 strimzi.io/cluster-operator 입니다.
소스
sourcereportingController 의 이전 버전입니다. 보고 구성 요소는 항상 Apache Kafka 재시작 이벤트용 Streams용 strimzi.io/cluster-operator 입니다.
type
Warning 또는 Normal 인 이벤트 유형입니다. Apache Kafka 재시작 이벤트용 Streams의 경우 유형은 Normal 입니다.
참고

이전 버전의 OpenShift에서 regarding 접두사를 사용하는 필드는 대신 involvedObject 접두사를 사용할 수 있습니다. reportingController 는 이전에 reportingComponent 를 호출했습니다.

28.3. Kafka 재시작 확인

oc 명령을 사용하여 Cluster Operator가 시작한 재시작 이벤트를 나열합니다. Cluster Operator를 reportingController 또는 소스 이벤트 필드를 사용하여 보고 구성 요소로 설정하여 Cluster Operator에서 내보낸 재시작 이벤트를 필터링합니다.

사전 요구 사항

  • Cluster Operator가 OpenShift 클러스터에서 실행되고 있습니다.

프로세스

  1. Cluster Operator에서 내보낸 모든 재시작 이벤트를 가져옵니다.

    oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator

    반환된 이벤트를 표시하는 예

    LAST SEEN   TYPE     REASON                   OBJECT                        MESSAGE
    2m          Normal   CaCertRenewed            pod/strimzi-cluster-kafka-0   CA certificate renewed
    58m         Normal   PodForceRestartOnError   pod/strimzi-cluster-kafka-1   Pod needs to be forcibly restarted due to an error
    5m47s       Normal   ManualRollingUpdate      pod/strimzi-cluster-kafka-2   Pod was manually annotated to be rolled

    이유 또는 기타 필드 선택기 옵션을 지정하여 반환된 이벤트를 제한할 수도 있습니다.

    여기에는 특정 이유가 추가되었습니다.

    oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator,reason=PodForceRestartOnError
  2. YAML과 같은 출력 형식을 사용하여 하나 이상의 이벤트에 대한 자세한 정보를 반환합니다.

    oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator,reason=PodForceRestartOnError -o yaml

    자세한 이벤트 출력 표시 예

    apiVersion: v1
    items:
    - action: StrimziInitiatedPodRestart
      apiVersion: v1
      eventTime: "2022-05-13T00:22:34.168086Z"
      firstTimestamp: null
      involvedObject:
          kind: Pod
          name: strimzi-cluster-kafka-1
          namespace: kafka
      kind: Event
      lastTimestamp: null
      message: Pod needs to be forcibly restarted due to an error
      metadata:
          creationTimestamp: "2022-05-13T00:22:34Z"
          generateName: strimzi-event
          name: strimzi-eventwppk6
          namespace: kafka
          resourceVersion: "432961"
          uid: 29fcdb9e-f2cf-4c95-a165-a5efcd48edfc
      reason: PodForceRestartOnError
      reportingController: strimzi.io/cluster-operator
      reportingInstance: strimzi-cluster-operator-6458cfb4c6-6bpdp
      source: {}
      type: Normal
    kind: List
    metadata:
      resourceVersion: ""
      selfLink: ""

다음 필드는 더 이상 사용되지 않으므로 이러한 이벤트에 대해 채워지지 않습니다.

  • firstTimestamp
  • lastTimestamp
  • 소스

29장. Apache Kafka용 스트림 관리

Apache Kafka용 Streams를 관리하려면 Kafka 클러스터 및 관련 리소스가 원활하게 실행되도록 다양한 작업을 수행해야 합니다. oc 명령을 사용하여 리소스의 상태를 확인하고, 롤링 업데이트에 대한 유지 관리 창을 구성하고, Apache Kafka Drain cleaner 및 Kafka Static Quota 플러그인과 같은 툴을 활용하여 배포를 효과적으로 관리합니다.

29.1. 롤링 업데이트를 위한 유지 관리 기간

유지 관리 시간 창을 사용하면 Kafka 및 Zoo Cryostat 클러스터의 특정 롤링 업데이트를 편리한 시간에 시작할 수 있습니다.

29.1.1. 유지 관리 시간 창 개요

대부분의 경우 Cluster Operator는 해당 Kafka 리소스에 대한 변경 사항에 따라 Kafka 또는 Zoo Cryostat 클러스터만 업데이트합니다. 이를 통해 Kafka 리소스에 변경 사항을 적용할 시기를 계획하여 Kafka 클라이언트 애플리케이션에 미치는 영향을 최소화할 수 있습니다.

그러나 Kafka 및 Zoo Cryostat 클러스터에 대한 일부 업데이트는 Kafka 리소스를 변경하지 않고 발생할 수 있습니다. 예를 들어 관리하는 CA(인증 기관) 인증서가 만료되기 가까운 경우 Cluster Operator는 롤링 재시작을 수행해야 합니다.

Pod를 롤링 재시작하면 서비스 가용성에 영향을 미치지 않지만(올바른 브로커 및 주제 구성 가정) Kafka 클라이언트 애플리케이션의 성능 에 영향을 미칠 수 있습니다. 유지 관리 시간 창을 사용하면 Kafka 및 Zoo Cryostat 클러스터의 자동 롤링 업데이트를 편리한 시간에 시작할 수 있습니다. 유지 관리 시간 창이 클러스터에 대해 구성되지 않은 경우 예측 가능한 로드 기간 동안과 같이 이러한 무관한 롤링 업데이트가 불편한 시간에 발생할 수 있습니다.

29.1.2. 유지 관리 시간 창 정의

Kafka.spec.maintenanceTimeWindows 속성에 문자열 배열을 입력하여 유지 관리 시간 창을 구성합니다. 각 문자열은 UTC (Coordinated Universal Time)로 해석되는 cron 표현식 입니다. 실용적인 목적으로는 Greenwich Mean Time과 동일합니다.

다음 예제에서는 자정에 시작하여 오전 01:59am (UTC), 일요일, 월요일, 화요일, 수요일 및 목요일에 종료되는 단일 유지 관리 시간 창을 구성합니다.

# ...
maintenanceTimeWindows:
  - "* * 0-1 ? * SUN,MON,TUE,WED,THU *"
# ...

실제로 유지 관리 창은 Kafka 리소스의 Kafka.spec.clusterCa.renewalDaysKafka.spec.clientsCa.renewalDays 속성과 함께 설정하여 필요한 CA 인증서 갱신을 구성된 유지 관리 시간 창에서 완료할 수 있도록 해야 합니다.

참고

Apache Kafka의 스트림은 지정된 창에 따라 정확히 유지 관리 작업을 예약하지 않습니다. 대신 각 조정에 대해 유지 관리 기간이 현재 "오픈"인지 확인합니다. 즉, 지정된 시간 내에 유지 관리 작업 시작이 Cluster Operator 조정 간격까지 지연될 수 있습니다. 따라서 유지 관리 시간은 이 기간 이상이어야 합니다.

29.1.3. 유지 관리 시간 창 구성

지원되는 프로세스에서 트리거한 롤링 업데이트에 대한 유지 관리 시간 창을 구성할 수 있습니다.

사전 요구 사항

  • OpenShift 클러스터입니다.
  • Cluster Operator가 실행 중입니다.

프로세스

  1. Kafka 리소스에서 maintenanceTimeWindows 속성을 추가하거나 편집합니다. 예를 들어 0800에서 1059 사이와 1400에서 1559 사이의 유지 관리를 허용하려면 다음과 같이 maintenanceTimeWindows 를 설정합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
      zookeeper:
        # ...
      maintenanceTimeWindows:
        - "* * 8-10 * * ?"
        - "* * 14-15 * * ?"
  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

29.2. 주석을 사용하여 Kafka 및 기타 피연산자의 롤링 업데이트 시작

Apache Kafka의 스트림은 Cluster Operator를 통해 Kafka 및 기타 피연산자의 롤링 업데이트를 수동으로 트리거하는 주석 사용을 지원합니다. 주석을 사용하여 Kafka, Kafka Connect, MirrorMaker 2 및 Zoo Cryostat 클러스터의 롤링 업데이트를 시작합니다.

일반적으로 특정 Pod 또는 Pod 세트에서 롤링 업데이트를 수동으로 수행하는 것은 예외적인 경우에만 필요합니다. 그러나 Pod를 직접 삭제하지 않고 Cluster Operator를 통해 롤링 업데이트를 수행하면 다음을 확인합니다.

  • Pod의 수동 삭제는 동시에 다른 Pod 삭제와 같은 동시 Cluster Operator 작업과 충돌하지 않습니다.
  • Cluster Operator 논리는 동기화 중인 복제본 수와 같은 Kafka 구성 사양을 처리합니다.

29.2.1. Pod 관리 주석을 사용하여 롤링 업데이트 수행

다음 절차에서는 Kafka, Kafka Connect, MirrorMaker 2, 또는 Zoo Cryostat 클러스터의 롤링 업데이트를 트리거하는 방법을 설명합니다. 업데이트를 트리거하려면 클러스터에서 실행 중인 Pod를 관리하는 StrimziPodSet 에 주석을 추가합니다.

사전 요구 사항

수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator가 필요합니다. Kafka, Kafka Connect, MirrorMaker 2 또는 Zoo Cryostat와 관계없이 업데이트할 구성 요소의 클러스터도 실행 중이어야 합니다.

프로세스

  1. 수동으로 업데이트할 Pod를 제어하는 리소스의 이름을 찾습니다.

    예를 들어 Kafka 클러스터 이름이 my-cluster 인 경우 해당 이름은 my-cluster-kafkamy-cluster-zookeeper 입니다. my-connect-cluster 라는 Kafka Connect 클러스터의 경우 해당 이름은 my-connect-cluster-connect 입니다. my-mm2-cluster 라는 MirrorMaker 2 클러스터의 경우 해당 이름은 my-mm2-cluster-mirrormaker2 입니다.

  2. oc annotate 를 사용하여 OpenShift에서 적절한 리소스에 주석을 답니다.

    StrimziPodSet 주석 처리

    oc annotate strimzipodset <cluster_name>-kafka strimzi.io/manual-rolling-update="true"
    
    oc annotate strimzipodset <cluster_name>-zookeeper strimzi.io/manual-rolling-update="true"
    
    oc annotate strimzipodset <cluster_name>-connect strimzi.io/manual-rolling-update="true"
    
    oc annotate strimzipodset <cluster_name>-mirrormaker2 strimzi.io/manual-rolling-update="true"

  3. 다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다). 조정 프로세스에서 주석을 감지한 한 주석이 주석으로 감지되면 주석이 주석에 있는 모든 Pod의 롤링 업데이트가 트리거됩니다. 모든 Pod의 롤링 업데이트가 완료되면 리소스에서 주석이 자동으로 제거됩니다.

29.2.2. Pod 주석을 사용하여 롤링 업데이트 수행

다음 절차에서는 OpenShift Pod 주석을 사용하여 기존 Kafka, Kafka Connect, MirrorMaker 2 또는 Zoo Cryostat 클러스터의 롤링 업데이트를 수동으로 트리거하는 방법을 설명합니다. 여러 Pod에 주석이 있으면 동일한 조정 실행 내에서 연속 롤링 업데이트가 수행됩니다.

사전 요구 사항

수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator가 필요합니다. Kafka, Kafka Connect, MirrorMaker 2 또는 Zoo Cryostat와 관계없이 업데이트할 구성 요소의 클러스터도 실행 중이어야 합니다.

사용된 주제 복제 요인에 관계없이 Kafka 클러스터에서 롤링 업데이트를 수행할 수 있습니다. 그러나 Kafka가 업데이트 중에 작동하려면 다음이 필요합니다.

  • 업데이트하려는 노드에서 실행되는 고가용성 Kafka 클러스터 배포입니다.
  • 고가용성을 위해 복제된 주제입니다.

    주제 구성은 복제 요소보다 최소 3개 이상 및 최소 동기화된 복제본 수를 1개로 지정합니다.

    고가용성을 위해 Kafka 주제 복제

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: my-topic
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 1
      replicas: 3
      config:
        # ...
        min.insync.replicas: 2
        # ...

프로세스

  1. 수동으로 업데이트할 Pod 이름을 찾습니다.

    Pod 이름 지정 규칙은 다음과 같습니다.

    • Kafka 클러스터의 <CLUSTER_NAME>-kafka-<index_number >
    • <CLUSTER_NAME>-zookeeper-<index_number >
    • Kafka Connect 클러스터의 <CLUSTER_NAME>-connect-<index_number >
    • <CLUSTER_NAME>-mirrormaker2-<index_number > 2 클러스터의 경우

    Pod에 할당된 < index_number >는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다.

  2. oc annotate 를 사용하여 OpenShift에서 Pod 리소스에 주석을 답니다.

    oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/manual-rolling-update="true"
    
    oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/manual-rolling-update="true"
    
    oc annotate pod <cluster_name>-connect-<index_number> strimzi.io/manual-rolling-update="true"
    
    oc annotate pod <cluster_name>-mirrormaker2-<index_number> strimzi.io/manual-rolling-update="true"
  3. 다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다). 조정 프로세스에서 주석이 감지된 한 주석이 주석에 감지되면 주석이 주석의 롤링 업데이트가 트리거됩니다. Pod의 롤링 업데이트가 완료되면 Pod 에서 주석이 자동으로 제거됩니다.

29.3. 영구 볼륨에서 클러스터 복구

PV(영구 볼륨)가 여전히 존재하는 경우 Kafka 클러스터를 복구할 수 있습니다.

예를 들어 다음과 같은 작업을 수행할 수 있습니다.

  • 네임스페이스가 의도하지 않게 삭제됨
  • 전체 OpenShift 클러스터가 손실되었지만 PV는 인프라에 남아 있습니다.

29.3.1. 네임스페이스 삭제에서 복구

영구 볼륨과 네임스페이스 간의 관계로 인해 네임스페이스 삭제로 인한 복구가 가능합니다. PV( PersistentVolume )는 네임스페이스 외부에 있는 스토리지 리소스입니다. PV는 네임스페이스 내에 있는 PVC( PersistentVolumeClaim )를 사용하여 Kafka Pod에 마운트됩니다.

PV의 회수 정책은 네임스페이스를 삭제할 때 클러스터에 작동하는 방법을 지시합니다. 회수 정책이 다음과 같이 설정된 경우

  • 삭제 (기본값), 네임스페이스 내에서 PVC가 삭제되면 PV가 삭제됩니다.
  • 네임스페이스를 삭제할 때 PV가 삭제되지 않음

의도하지 않게 삭제된 경우 PV에서 복구하려면 persistentVolumeReclaimPolicy 속성을 사용하여 PV 사양의 Delete 에서 Retain 으로 정책을 재설정해야 합니다.

apiVersion: v1
kind: PersistentVolume
# ...
spec:
  # ...
  persistentVolumeReclaimPolicy: Retain

또는 PV는 관련 스토리지 클래스의 회수 정책을 상속할 수 있습니다. 스토리지 클래스는 동적 볼륨 할당에 사용됩니다.

스토리지 클래스에 대한 reclaimPolicy 속성을 구성하면 스토리지 클래스를 사용하는 PV가 적절한 회수 정책으로 생성됩니다. 스토리지 클래스는 storageClassName 속성을 사용하여 PV에 구성됩니다.

apiVersion: v1
kind: StorageClass
metadata:
  name: gp2-retain
parameters:
  # ...
# ...
reclaimPolicy: Retain
apiVersion: v1
kind: PersistentVolume
# ...
spec:
  # ...
  storageClassName: gp2-retain
참고

Retain 을 회수 정책으로 사용하지만 전체 클러스터를 삭제하려면 PV를 수동으로 삭제해야 합니다. 그렇지 않으면 삭제되지 않으며 리소스에 대한 불필요한 문제가 발생할 수 있습니다.

29.3.2. OpenShift 클러스터 손실에서 복구

클러스터가 손실되면 디스크/볼륨의 데이터를 사용하여 인프라 내에 보존된 경우 클러스터를 복구할 수 있습니다. 복구 절차는 PV를 복구하고 수동으로 생성할 수 있다고 가정하면 네임스페이스 삭제와 동일합니다.

29.3.3. 영구 볼륨에서 삭제된 클러스터 복구

다음 절차에서는 PV(영구 볼륨)에서 삭제된 클러스터를 복구하는 방법을 설명합니다.

이 경우 Topic Operator는 Kafka에 항목이 존재하지만 KafkaTopic 리소스가 존재하지 않습니다.

클러스터를 다시 생성하는 단계에 도달하면 다음 두 가지 옵션이 있습니다.

  1. 모든 KafkaTopic 리소스를 복구할 수 있는 경우 옵션 1 을 사용합니다.

    따라서 KafkaTopic 리소스는 Topic Operator에서 해당 주제를 삭제하지 않도록 클러스터를 시작하기 전에 복구해야 합니다.

  2. 모든 KafkaTopic 리소스를 복구할 수 없는 경우 옵션 2 를 사용합니다.

    이 경우 Topic Operator 없이 클러스터를 배포하고 Topic Operator 주제 저장소 메타데이터를 삭제한 다음 Topic Operator를 사용하여 Kafka 클러스터를 재배포하여 해당 주제에서 KafkaTopic 리소스를 다시 생성할 수 있습니다.

참고

Topic Operator가 배포되지 않은 경우 PVC( PersistentVolumeClaim ) 리소스만 복구해야 합니다.

사전 준비 사항

이 절차에서는 데이터 손상을 방지하려면 PV를 올바른 PVC에 마운트해야 합니다. volumeName 은 PVC에 지정되어 있으며 PV의 이름과 일치해야 합니다.

자세한 내용은 영구 스토리지를 참조하십시오.

참고

프로세스에는 수동으로 다시 생성해야 하는 KafkaUser 리소스의 복구가 포함되지 않습니다. 암호 및 인증서를 유지해야 하는 경우 KafkaUser 리소스를 생성하기 전에 시크릿을 다시 생성해야 합니다.

프로세스

  1. 클러스터의 PV에 대한 정보를 확인합니다.

    oc get pv

    데이터가 있는 PV에 대한 정보가 제공됩니다.

    다음 절차에 중요한 열을 보여주는 출력 예:

    NAME                                         RECLAIMPOLICY CLAIM
    pvc-5e9c5c7f-3317-11ea-a650-06e1eadd9a4c ... Retain ...    myproject/data-my-cluster-zookeeper-1
    pvc-5e9cc72d-3317-11ea-97b0-0aef8816c7ea ... Retain ...    myproject/data-my-cluster-zookeeper-0
    pvc-5ead43d1-3317-11ea-97b0-0aef8816c7ea ... Retain ...    myproject/data-my-cluster-zookeeper-2
    pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c ... Retain ...    myproject/data-0-my-cluster-kafka-0
    pvc-7e21042e-3317-11ea-9786-02deaf9aa87e ... Retain ...    myproject/data-0-my-cluster-kafka-1
    pvc-7e226978-3317-11ea-97b0-0aef8816c7ea ... Retain ...    myproject/data-0-my-cluster-kafka-2
    • NAME 에는 각 PV의 이름이 표시됩니다.
    • RECLAIM POLICY 는 PV가 유지되고 있음을 보여줍니다.
    • CLAIM 은 원래 PVC에 대한 링크를 보여줍니다.
  2. 원래 네임스페이스를 다시 생성합니다.

    oc create namespace myproject
  3. 원래 PVC 리소스 사양을 다시 생성하여 PVC를 적절한 PV에 연결합니다.

    예를 들면 다음과 같습니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: data-0-my-cluster-kafka-0
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
      storageClassName: gp2-retain
      volumeMode: Filesystem
      volumeName: pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c
  4. PV 사양을 편집하여 원래 PVC를 바인딩된 claimRef 속성을 삭제합니다.

    예를 들면 다음과 같습니다.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        kubernetes.io/createdby: aws-ebs-dynamic-provisioner
        pv.kubernetes.io/bound-by-controller: "yes"
        pv.kubernetes.io/provisioned-by: kubernetes.io/aws-ebs
      creationTimestamp: "<date>"
      finalizers:
      - kubernetes.io/pv-protection
      labels:
        failure-domain.beta.kubernetes.io/region: eu-west-1
        failure-domain.beta.kubernetes.io/zone: eu-west-1c
      name: pvc-7e226978-3317-11ea-97b0-0aef8816c7ea
      resourceVersion: "39431"
      selfLink: /api/v1/persistentvolumes/pvc-7e226978-3317-11ea-97b0-0aef8816c7ea
      uid: 7efe6b0d-3317-11ea-a650-06e1eadd9a4c
    spec:
      accessModes:
      - ReadWriteOnce
      awsElasticBlockStore:
        fsType: xfs
        volumeID: aws://eu-west-1c/vol-09db3141656d1c258
      capacity:
        storage: 100Gi
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: data-0-my-cluster-kafka-2
        namespace: myproject
        resourceVersion: "39113"
        uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: failure-domain.beta.kubernetes.io/zone
              operator: In
              values:
              - eu-west-1c
            - key: failure-domain.beta.kubernetes.io/region
              operator: In
              values:
              - eu-west-1
      persistentVolumeReclaimPolicy: Retain
      storageClassName: gp2-retain
      volumeMode: Filesystem

    이 예제에서는 다음 속성이 삭제됩니다.

    claimRef:
      apiVersion: v1
      kind: PersistentVolumeClaim
      name: data-0-my-cluster-kafka-2
      namespace: myproject
      resourceVersion: "39113"
      uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea
  5. Cluster Operator를 배포합니다.

    oc create -f install/cluster-operator -n my-project
  6. 클러스터를 다시 생성합니다.

    클러스터를 다시 생성하는 데 필요한 모든 KafkaTopic 리소스가 있는지 여부에 따라 단계를 따르십시오.

    옵션 1: __consumer_offsets 의 커밋된 오프셋과 같은 내부 주제를 포함하여 클러스터를 손실하기 전에 존재하는 모든 KafkaTopic 리소스가 있는 경우 :

    1. 모든 KafkaTopic 리소스를 다시 생성합니다.

      클러스터를 배포하기 전에 리소스를 다시 생성해야 합니다. 그러지 않으면 Topic Operator에서 주제를 삭제해야 합니다.

    2. Kafka 클러스터를 배포합니다.

      예를 들면 다음과 같습니다.

      oc apply -f kafka.yaml

    옵션 2: 클러스터를 손실하기 전에 존재하는 모든 KafkaTopic 리소스가 없는 경우:

    1. 첫 번째 옵션과 마찬가지로 Kafka 클러스터를 배포하지만, 배포하기 전에 Kafka 리소스에서 topicOperator 속성을 제거하여 Topic Operator 없이 Kafka 클러스터를 배포합니다.

      Topic Operator를 배포에 포함하는 경우 Topic Operator는 모든 주제를 삭제합니다.

    2. Kafka 클러스터에서 내부 주제 저장소 주제를 삭제합니다.

      oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete

      명령은 Kafka 클러스터에 액세스하는 데 사용되는 리스너 및 인증 유형에 해당해야 합니다.

    3. topicOperator 속성으로 Kafka 클러스터를 재배포하여 KafkaTopic 리소스를 다시 생성하여 Topic Operator를 활성화합니다.

      예를 들면 다음과 같습니다.

      apiVersion: kafka.strimzi.io/v1beta2
      kind: Kafka
      metadata:
        name: my-cluster
      spec:
        #...
        entityOperator:
          topicOperator: {} 
      1
      
          #...
    1
    여기서는 추가 속성이 없는 기본 구성을 보여줍니다. EntityTopicOperatorSpec 스키마 참조에 설명된 속성을 사용하여 필요한 구성을 지정합니다.
  7. KafkaTopic 리소스를 나열하여 복구를 확인합니다.

    oc get KafkaTopic

29.4. 자주하는 질문

30장. Apache Kafka용 Streams에서 미터링 사용

OpenShift에서 사용할 수 있는 미터링 툴을 사용하여 다양한 데이터 소스에서 미터링 보고서를 생성할 수 있습니다. 클러스터 관리자는 미터링을 사용하여 클러스터에서 발생하는 상황을 분석할 수 있습니다. 자체적으로 작성하거나 사전 정의된 SQL 쿼리를 사용하여 사용 가능한 다양한 데이터 소스에서 데이터를 처리하는 방법을 정의할 수 있습니다. Prometheus를 기본 데이터 소스로 사용하면 Pod, 네임스페이스 및 대부분의 다른 OpenShift 리소스에 대한 보고서를 생성할 수 있습니다.

OpenShift Metering Operator를 사용하여 설치된 Apache Kafka 구성 요소를 분석하여 Red Hat 서브스크립션을 준수하는지 확인할 수도 있습니다.

Apache Kafka용 Streams와 함께 미터링을 사용하려면 먼저 OpenShift Container Platform에서 Metering Operator 를 설치하고 구성해야 합니다.

30.1. 미터링 리소스

미터링에는 많은 리소스가 있으며, 기능 미터링을 보고하는 기능과 함께 미터링 배포 및 설치를 관리하는 데 사용할 수 있습니다. 미터링은 다음 CRD를 사용하여 관리합니다.

Expand
표 30.1. 미터링 리소스
이름설명

MeteringConfig

배포에 대해 미터링 스택을 구성합니다. 미터링 스택을 구성하는 각 구성 요소를 제어하기 위한 사용자 정의 및 구성 옵션이 포함되어 있습니다.

Reports

사용할 쿼리, 쿼리를 실행할 빈도 및 결과를 저장할 위치를 제어합니다.

ReportQueries

ReportDataSources 에 포함된 데이터에서 분석을 수행하는 데 사용되는 SQL 쿼리를 포함합니다.

ReportDataSources

ReportQueries 및 Reports에서 사용할 수 있는 데이터를 제어합니다. 미터링 내에서 사용할 수 있도록 다양한 데이터베이스에 대한 액세스를 구성할 수 있습니다.

30.2. Apache Kafka의 Streams에 대한 미터링 레이블

다음 표에는 Apache Kafka 인프라 구성 요소 및 통합용 Streams의 미터링 레이블이 나열되어 있습니다.

Expand
표 30.2. 미터링 라벨
레이블가능한 값

com.company

Red_Hat

rht.prod_name

Red_Hat_Application_Foundations

rht.prod_ver

2024.Q2

rht.comp

AMQ_Streams

rht.comp_ver

2.7

rht.subcomp

인프라

cluster-operator

entity-operator

topic-operator

user-operator

Zookeeper

애플리케이션

kafka-broker

kafka-connect

kafka-connect-build

kafka-mirror-maker2

kafka-mirror-maker

cruise-control

kafka-bridge

kafka-exporter

drain-cleaner

rht.subcomp_t

인프라

애플리케이션

  • 인프라 예(인프라 구성 요소가 entity-operator인 경우)

    com.company=Red_Hat
    rht.prod_name=Red_Hat_Application_Foundations
    rht.prod_ver=2024.Q2
    rht.comp=AMQ_Streams
    rht.comp_ver=2.7
    rht.subcomp=entity-operator
    rht.subcomp_t=infrastructure
  • 애플리케이션 예(통합 배포 이름은 kafka-bridge)

    com.company=Red_Hat
    rht.prod_name=Red_Hat_Application_Foundations
    rht.prod_ver=2024.Q2
    rht.comp=AMQ_Streams
    rht.comp_ver=2.7
    rht.subcomp=kafka-bridge
    rht.subcomp_t=application

부록 A. 서브스크립션 사용

Apache Kafka의 스트림은 소프트웨어 서브스크립션을 통해 제공됩니다. 서브스크립션을 관리하려면 Red Hat 고객 포털에서 계정에 액세스하십시오.

계정 액세스

  1. access.redhat.com 으로 이동합니다.
  2. 계정이 없는 경우 계정을 생성합니다.
  3. 계정에 로그인합니다.

서브스크립션 활성화

  1. access.redhat.com 으로 이동합니다.
  2. 내 서브스크립션 으로 이동합니다.
  3. 서브스크립션 활성화로 이동하여 16자리 활성화 번호를 입력합니다.

Zip 및 Tar 파일 다운로드

zip 또는 tar 파일에 액세스하려면 고객 포털을 사용하여 다운로드할 관련 파일을 찾습니다. RPM 패키지를 사용하는 경우 이 단계는 필요하지 않습니다.

  1. 브라우저를 열고 Red Hat Customer Portal 제품 다운로드 페이지에 access.redhat.com/downloads.
  2. INTEGRATION 및 AUTOMATION 카테고리에서 Apache Kafka에 대한 Streams for Apache Kafka 항목을 찾습니다.
  3. Apache Kafka 제품에 대해 원하는 Streams를 선택합니다. 소프트웨어 다운로드 페이지가 열립니다.
  4. 구성 요소에 대한 다운로드 링크를 클릭합니다.

DNF를 사용하여 패키지 설치

패키지 및 모든 패키지 종속 항목을 설치하려면 다음을 사용합니다.

dnf install <package_name>

로컬 디렉터리에서 이전에 다운로드한 패키지를 설치하려면 다음을 사용합니다.

dnf install <path_to_download_package>

2024-05-31에 최종 업데이트된 문서

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat
맨 위로 이동