OpenShift에서 AMQ Streams 배포 및 관리


Red Hat AMQ Streams 2.4

OpenShift Container Platform에 AMQ Streams 2.4 배포

초록

OperatorHub 또는 설치 아티팩트를 사용하여 AMQ Streams를 OpenShift 클러스터에 배포합니다. AMQ Streams Operator를 사용하여 Kafka 구성 요소를 배포 및 관리합니다. AMQ Streams를 업그레이드하여 새로운 기능을 활용합니다. 업그레이드의 일부로 Kafka를 지원되는 최신 버전으로 업그레이드합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. 배포 개요

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

이 가이드에서는 AMQ Streams 배포 및 업그레이드에 사용할 수 있는 모든 옵션과 OpenShift 클러스터에서 Apache Kafka를 실행하는 데 필요한 배포 순서를 설명합니다.

배포 단계에 대한 설명뿐만 아니라 이 가이드에서는 사전 및 배포 후 지침을 제공하여 배포를 준비하고 검증합니다. 이 가이드에서는 메트릭을 도입하기 위한 추가 배포 옵션도 설명합니다.

AMQ Streams 및 Kafka 업그레이드에 대한 업그레이드 지침이 제공됩니다.

AMQ Streams는 공용 및 프라이빗 클라우드에서 개발을 위해 의도된 로컬 배포에 관계없이 배포와 관계없이 모든 유형의 OpenShift 클러스터에서 작동하도록 설계되었습니다.

1.1. 배포 구성

이 가이드의 배포 절차는 배포의 초기 구조를 설정하는 데 도움이 되도록 고안되어 있습니다. 구조를 설정한 후 사용자 정의 리소스를 사용하여 정확한 요구에 맞게 배포를 구성할 수 있습니다. 배포 절차에서는 AMQ Streams와 함께 제공되는 설치 파일 예제를 사용합니다. 이 절차에서는 중요한 구성 고려 사항을 강조하지만 사용 가능한 모든 구성 옵션을 설명하지는 않습니다.

AMQ Streams를 배포하기 전에 Kafka 구성 요소에 사용할 수 있는 구성 옵션을 검토할 수 있습니다. 구성 옵션에 대한 자세한 내용은 사용자 정의 리소스 API 참조 를 참조하십시오.

1.1.1. Securing Kafka

배포 시 Cluster Operator는 클러스터 내의 데이터 암호화 및 인증에 필요한 TLS 인증서를 자동으로 설정합니다.

AMQ Streams는 암호화,인증권한 부여 에 대한 추가 구성 옵션을 제공합니다.

1.1.2. 배포 모니터링

AMQ Streams는 배포를 모니터링할 수 있는 추가 배포 옵션을 지원합니다.

1.1.3. CPU 및 메모리 리소스 제한 및 요청

기본적으로 AMQ Streams Cluster Operator는 배포하는 피연산자의 CPU 및 메모리 리소스에 대한 요청 및 제한을 지정하지 않습니다.

Kafka와 같은 애플리케이션이 안정적이고 우수한 성능을 제공하려면 충분한 리소스를 보유하는 것이 중요합니다.

사용해야 하는 적절한 리소스 양은 특정 요구 사항 및 사용 사례에 따라 다릅니다.

CPU 및 메모리 리소스를 구성하는 것을 고려해야 합니다. AMQ Streams 사용자 정의 리소스에서 각 컨테이너에 대한 리소스 요청 및 제한을 설정할 수 있습니다.

1.2. AMQ Streams 사용자 정의 리소스

AMQ Streams를 사용하여 OpenShift 클러스터에 Kafka 구성 요소를 배포하는 것은 사용자 정의 리소스 애플리케이션을 통해 구성할 수 있습니다. 사용자 정의 리소스는 OpenShift 리소스를 확장하기 위해 CRD(Custom Resource Definitions)에서 추가한 API 인스턴스로 생성됩니다.

CRD는 OpenShift 클러스터의 사용자 정의 리소스를 설명하는 구성 지침 역할을 하며, 배포에 사용된 각 Kafka 구성 요소에 대해 AMQ Streams와 사용자 및 주제를 제공합니다. CRD 및 사용자 정의 리소스는 YAML 파일로 정의됩니다. YAML 파일의 예는 AMQ Streams 배포와 함께 제공됩니다.

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

1.2.1. AMQ Streams 사용자 정의 리소스 예

CRD에는 AMQ Streams 관련 리소스를 인스턴스화하고 관리하는 데 사용되는 스키마를 정의하기 위해 클러스터에 일회성 설치가 필요합니다.

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

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

참고

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

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

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

주의

CRD가 삭제되면 해당 유형의 사용자 정의 리소스도 삭제됩니다. 또한 Pod 및 statefulsets와 같은 사용자 정의 리소스에서 생성한 리소스도 삭제됩니다.

각 AMQ Streams별 사용자 정의 리소스는 리소스 종류의 CRD에서 정의한 스키마를 준수합니다. AMQ Streams 구성 요소에 대한 사용자 정의 리소스에는 사양에 정의된 공통 구성 속성이 있습니다.

CRD와 사용자 정의 리소스 간의 관계를 이해하기 위해 Kafka 항목에 대한 CRD 샘플을 살펴보겠습니다.

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

파일 이름에 인덱스 번호와 'Crd'가 포함되어 있기 때문에 AMQ Streams 설치 파일과 함께 제공되는 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 클러스터의 이름을 정의하는 KafkaTopicKafkaUser 리소스에만 적용되는 레이블입니다.
3
사양은 주제의 파티션 및 복제본 수와 주제 자체에 대한 구성 매개 변수를 보여줍니다. 이 예에서는 메시지가 항목에 남아 있고 로그의 세그먼트 파일 크기가 지정됩니다.
4
KafkaTopic 리소스의 상태 상태입니다. lastTransitionTime 에서 유형 조건이 Ready 로 변경되었습니다.

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

KafkaTopic 사용자 정의 리소스가 생성되면 Topic Operator에 알림을 받고 해당 Kafka 항목이 AMQ Streams에서 생성됩니다.

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

AMQ Streams Kafka Bridge API를 사용하여 소비자를 생성 및 관리하고 기본 Kafka 프로토콜이 아닌 HTTP를 통해 레코드를 전송 및 수신할 수 있습니다.

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

1.4. 문서 관련

사용자 대체 값

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

예를 들어 다음 코드에서 < my_namespace>를 네임스페이스 이름으로 교체하려고 합니다.

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

2장. AMQ Streams 설치 방법

다음 두 가지 방법으로 OpenShift 4.10에 AMQ Streams를 4.13에 설치할 수 있습니다.

Expand
설치 방법설명

설치 아티팩트(YAML 파일)

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

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

  • AMQ Streams 관리자 역할(strimzi-admin)
  • 독립 실행형 주제 Operator(topic-operator)
  • 독립 실행형 사용자 Operator(user-operator)
  • AMQ Streams DrainCleaner (drain-cleaner)

OperatorHub

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

유연성을 극대화하려면 설치 아티팩트 방법을 선택합니다. OperatorHub 방법은 표준 구성을 제공하며 자동 업데이트를 활용할 수 있습니다.

참고

Helm을 사용한 AMQ Streams 설치는 지원되지 않습니다.

3장. AMQ Streams로 배포 대상

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

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

  • 브로커 노드의 Kafka 클러스터
  • 복제된 ZooKeeper 인스턴스의 zookeeper 클러스터
  • 외부 데이터 연결을 위한 Kafka Connect 클러스터
  • 보조 클러스터에서 Kafka 클러스터를 미러링할 Kafka MirrorMaker 클러스터
  • 모니터링을 위한 추가 Kafka 메트릭 데이터를 추출하기 위한 Kafka 내보내기
  • Kafka 클러스터에 대한 HTTP 기반 요청 생성

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

3.1. 배포 순서

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

  1. Kafka 클러스터를 관리하기 위해 Cluster Operator 배포
  2. ZooKeeper 클러스터를 사용하여 Kafka 클러스터를 배포하고 배포에 Topic Operator 및 User Operator를 포함합니다.
  3. 선택적으로 다음을 배포합니다.

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

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

4장. AMQ Streams 배포 준비

이 섹션에서는 다음을 설명하는 AMQ Streams 배포를 준비하는 방법을 보여줍니다.

참고

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

4.1. 배포 사전 요구 사항

AMQ Streams를 배포하려면 다음이 필요합니다.

  • OpenShift 4.10에서 4.13 클러스터로.

    AMQ Streams는 Strimzi 0.34.x를 기반으로 합니다.

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

4.2. AMQ Streams 릴리스 아티팩트 다운로드

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

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

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

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

참고

또한 AMQ Streams 컨테이너 이미지는 Red Hat Ecosystem Catalog 를 통해 사용할 수 있습니다. 그러나 AMQ Streams를 배포하기 위해 제공된 YAML 파일을 사용하는 것이 좋습니다.

4.3. 구성 및 배포 파일의 예

AMQ Streams와 함께 제공되는 구성 및 배포 파일을 사용하여 다양한 구성으로 Kafka 구성 요소를 배포하고 배포를 모니터링합니다. 사용자 지정 리소스에 대한 구성 파일의 예제에는 중요한 속성 및 값이 포함되어 있으며, 자체 배포에 대해 지원되는 추가 구성 속성으로 확장할 수 있습니다.

4.3.1. 파일 위치 예

예제 파일은 AMQ Streams 소프트웨어 다운로드 페이지에서 다운로드할 수 있는 릴리스 아티팩트를 통해 제공됩니다.

oc 명령줄 툴을 사용하여 예제를 다운로드하여 적용할 수 있습니다. 이 예제에서는 배포에 대한 자체 Kafka 구성 요소 구성을 빌드할 때 시작점으로 사용될 수 있습니다.

참고

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

4.3.2. AMQ Streams와 함께 제공되는 파일 예

릴리스 아티팩트에는 구성 예제가 포함된 examples 디렉터리가 포함되어 있습니다.

디렉터리 예

examples
├── user 
1

├── topic 
2

├── security 
3

│   ├── tls-auth
│   ├── scram-sha-512-auth
│   └── keycloak-authorization
├── mirror-maker 
4

├── metrics 
5

├── kafka 
6

├── cruise-control 
7

├── connect 
8

└── bridge 
9

1
User 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
MirrorECDHE 배포를 위한 Kafka 사용자 정의 리소스 구성 복제 정책 및 동기화 빈도에 대한 구성 예제가 포함되어 있습니다.
5
Prometheus 설치 및 Grafana 대시보드 파일을 포함한 지표 구성
6
Kafka 배포에 대한 Kafka 사용자 지정 리소스 구성 임시 또는 영구 단일 또는 다중 노드 배포를 위한 구성 예를 포함합니다.
7
Cruise Control에 대한 배포 구성이 있는 Kafka 사용자 지정 리소스 KafkaRebalance 사용자 정의 리소스를 포함하여 Cruise Control에서 최적화 제안을 생성하고 기본 또는 사용자 최적화 목표를 사용하는 예제 구성을 포함합니다.
8
KafkaConnectKafkaConnector 사용자 정의 리소스 구성: Kafka Connect 배포용. 단일 또는 다중 노드 배포를 위한 구성 예시가 포함되어 있습니다.
9
Kafka 브리지 배포를 위한 KafkaBridge 사용자 정의 리소스 구성

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

AMQ Streams의 컨테이너 이미지는 Red Hat Ecosystem Catalog 에서 사용할 수 있습니다. AMQ 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-34-rhel8:2.4.0
  • registry.redhat.io/amq-streams/kafka-33-rhel8:2.4.0

Kafka를 실행하기 위한 AMQ Streams 이미지 (예:

  • Kafka Broker
  • Kafka Connect
  • Kafka MirrorMaker
  • ZooKeeper
  • TLS 사이드카

Operator

  • registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.4.0

Operator 실행을 위한 AMQ Streams 이미지:

  • Cluster Operator
  • 주제 Operator
  • User Operator
  • Kafka Initializer

Kafka 브리지

  • registry.redhat.io/amq-streams/bridge-rhel8:2.4.0

AMQ Streams Kafka 브리지 실행을 위한 AMQ Streams 이미지

AMQ Streams DrainCleaner

  • registry.redhat.io/amq-streams/drain-cleaner-rhel8:2.4.0

AMQ Streams Drain cleaner 실행을 위한 AMQ Streams 이미지

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

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

참고

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

사전 요구 사항

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

절차

  1. 로그인 세부 정보와 AMQ 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_SECRET 환경 변수를 사용하여 풀 시크릿을 지정합니다.

    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. AMQ Streams 관리자 지정

AMQ Streams는 배포 구성을 위한 사용자 정의 리소스를 제공합니다. 기본적으로 이러한 리소스를 보고, 생성, 편집 및 삭제하는 권한은 OpenShift 클러스터 관리자에게 제한됩니다. AMQ Streams는 이러한 권한을 다른 사용자에게 할당하는 데 사용할 수 있는 두 개의 클러스터 역할을 제공합니다.

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

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

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

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

사전 요구 사항

절차

  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에서 AMQ Streams 설치

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

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

5.1. OperatorHub에서 AMQ Streams Operator 설치

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

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

주의

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

사전 요구 사항

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

절차

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

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

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

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

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

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

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

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

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

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

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

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

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

참고

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

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

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

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

  • Kafka
  • Kafka Connect
  • Kafka MirrorMaker
  • Kafka MirrorMaker 2
  • Kafka Topic
  • Kafka 사용자
  • Kafka 브리지
  • Kafka Connector
  • Kafka 리밸런스

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

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

사전 요구 사항

절차

  1. 웹 콘솔에서 Operator > 설치된 Operator 페이지로 이동하고 AMQ Streams 를 클릭하여 Operator 세부 정보를 표시합니다.

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

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

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

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

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

6장. 설치 아티팩트를 사용하여 AMQ Streams 배포

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

AMQ Streams는 Strimzi 0.34.x를 기반으로 합니다. OpenShift 4.10에 AMQ Streams 2.4를 4.13에 배포할 수 있습니다.

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

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

  3. 선택적으로 요구 사항에 따라 다음 Kafka 구성 요소를 배포합니다.

참고

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

6.1. 기본 배포 경로

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

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

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

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

  • Cluster Operator (배포,ConfigMap)
  • AMQ Streams 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가 제공되도록 리더 선택으로 복제본을 추가할 수 있습니다. 자세한 내용은 13.2.5절. “리더 선택을 사용하여 여러 Cluster Operator 복제본 실행”의 내용을 참조하십시오.

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

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

참고

Cluster Operator는 OpenShift 클러스터에서 하나, 여러 개 또는 모든 네임스페이스를 조사할 수 있습니다. Topic Operator 및 User Operator는 단일 네임스페이스에서 KafkaTopicKafkaUser 리소스를 조사합니다. 자세한 내용은 13.1절. “AMQ Streams Operator를 사용하여 네임스페이스 모니터링”의 내용을 참조하십시오.

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

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

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

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

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

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

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

다음 절차에서는 OpenShift 클러스터의 단일 네임스페이스에서 AMQ Streams 리소스를 조사하기 위해 Cluster Operator를 배포하는 방법을 설명합니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.

절차

  1. AMQ Streams 설치 파일을 편집하여 Cluster Operator가 설치될 네임스페이스를 사용합니다.

    예를 들어 이 절차에서는 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 에는 준비되거나 예상된 복제본 수가 표시됩니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

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

다음 절차에서는 Cluster Operator를 배포하여 OpenShift 클러스터의 여러 네임스페이스에서 AMQ Streams 리소스를 조사하는 방법을 설명합니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.

절차

  1. AMQ Streams 설치 파일을 편집하여 Cluster Operator가 설치될 네임스페이스를 사용합니다.

    예를 들어 이 절차에서는 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-rhel8-operator:2.4.0
            imagePullPolicy: IfNotPresent
            env:
            - name: STRIMZI_NAMESPACE
              value: watched-namespace-1,watched-namespace-2,watched-namespace-3
  3. 나열된 각 네임스페이스에 대해 RoleBindings 를 설치합니다.

    이 예제에서는 이 명령에서 watched-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 에는 준비되거나 예상된 복제본 수가 표시됩니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

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

다음 절차에서는 OpenShift 클러스터의 모든 네임스페이스에서 AMQ Streams 리소스를 조사하기 위해 Cluster Operator를 배포하는 방법을 설명합니다.

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

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.

절차

  1. AMQ Streams 설치 파일을 편집하여 Cluster Operator가 설치될 네임스페이스를 사용합니다.

    예를 들어 이 절차에서는 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-rhel8-operator:2.4.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 에는 준비되거나 예상된 복제본 수가 표시됩니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

6.3. Kafka 배포

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

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

Kafka를 설치할 때 AMQ Streams는 ZooKeeper 클러스터를 설치하고, Kafka를 ZooKeeper와 연결하는 데 필요한 구성을 추가합니다.

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

6.3.1. Kafka 클러스터 배포

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

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

AMQ Streams는 Kafka 클러스터를 생성하는 데 사용할 수 있는 다음 예제 파일을 제공합니다.

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

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

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

영구 Kafka 클러스터는 영구 볼륨을 사용하여 ZooKeeper 및 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 버전을 지정하고 지원되는 로그 메시지 형식 버전 및broker 간 프로토콜 버전에 대한 구성을 지정합니다. Kafka 구성에 대한 inter.broker.protocol.version 속성은 지정된 Kafka 버전 (spec.kafka.version)에서 지원하는 버전이어야합니다. 속성은 Kafka 클러스터에서 사용되는 Kafka 프로토콜 버전을 나타냅니다.

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

Kafka를 업그레이드 할 때 inter.broker.protocol.version 에 대한 업데이트가 필요합니다.

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

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

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

절차

  1. 임시 또는 영구 클러스터를 생성하고 배포합니다.

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

      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 및 ZooKeeper Pod를 식별합니다.

    기본 배포를 사용하면 Entity Operator 클러스터, Kafka Pod 3개 및 3 ZooKeeper Pod를 생성합니다.

    READY 에는 준비되거나 예상된 복제본 수가 표시됩니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

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

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

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

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

AMQ 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 에는 준비되거나 예상된 복제본 수가 표시됩니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

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

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

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

AMQ 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 에는 준비되거나 예상된 복제본 수가 표시됩니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.4. Kafka Connect 배포

Kafka Connect 는 Apache Kafka와 기타 시스템 간에 데이터를 스트리밍하는 툴입니다. 예를 들어 Kafka Connect는 Kafka를 외부 데이터베이스 또는 스토리지 및 메시징 시스템과 통합할 수 있습니다.

AMQ Streams에서 Kafka Connect는 분산 모드로 배포됩니다. Kafka Connect는 독립 실행형 모드에서도 작동할 수 있지만 AMQ 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 클러스터 배포는 연결 작업의 워크로드를 작업으로 배포하는 구성 가능한 수의 노드( 작업자라고도 함)로 구현되어 메시지 flow가 확장성이 높고 신뢰할 수 있습니다.

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

AMQ Streams는 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.

  • examples/connect/kafka-connect.yaml

절차

  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 에는 준비되거나 예상된 복제본 수가 표시됩니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.4.2. 여러 인스턴스에 대한 Kafka Connect 구성

Kafka Connect의 여러 인스턴스를 실행하는 경우 다음 구성 속성의 기본 구성을 변경해야 합니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect
spec:
  # ...
  config:
    group.id: connect-cluster 
1

    offset.storage.topic: connect-cluster-offsets 
2

    config.storage.topic: connect-cluster-configs 
3

    status.storage.topic: connect-cluster-status  
4

    # ...
# ...
1
Kafka 내의 Kafka Connect 클러스터 ID입니다.
2
커넥터 오프셋을 저장하는 Kafka 주제입니다.
3
커넥터 및 작업 상태 구성을 저장하는 Kafka 주제입니다.
4
커넥터 및 작업 상태 업데이트를 저장하는 Kafka 주제입니다.
참고

세 항목의 값은 동일한 group.id 가 있는 모든 Kafka Connect 인스턴스에 대해 동일해야 합니다.

기본 설정을 변경하지 않으면 동일한 Kafka 클러스터에 연결하는 각 Kafka Connect 인스턴스가 동일한 값으로 배포됩니다. 실제로 모든 인스턴스가 클러스터에서 실행되고 동일한 주제를 사용하도록 연결된 것입니다.

여러 Kafka Connect 클러스터가 동일한 주제를 사용하려고 하면 Kafka Connect가 예상대로 작동하지 않고 오류를 생성합니다.

여러 Kafka Connect 인스턴스를 실행하려면 각 인스턴스에 대해 이러한 속성의 값을 변경합니다.

6.4.3. 커넥터 추가

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

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

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

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

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

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

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

사전 요구 사항

이미지를 푸시, 저장 및 가져올 수 있는 자체 컨테이너 레지스트리를 제공해야 합니다. AMQ Streams는 프라이빗 컨테이너 레지스트리 및 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: debezium-postgres-connector
            artifacts:
              - type: tgz
                url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-postgres/2.1.3.Final/debezium-connector-postgres-2.1.3.Final-plugin.tar.gz
                sha512sum: c4ddc97846de561755dc0b021a62aba656098829c70eb3ade3b817ce06d852ca12ae50c0281cc791a5a131cb7fc21fb15f4b8ee76c6cae5dd07f9c11cb7c6e79
          - name: camel-telegram
            artifacts:
              - type: tgz
                url: https://repo.maven.apache.org/maven2/org/apache/camel/kafkaconnector/camel-telegram-kafka-connector/0.11.5/camel-telegram-kafka-connector-0.11.5-package.tar.gz
                sha512sum: d6d9f45e0d1dbfcc9f6d1c7ca2046168c764389c78bc4b867dab32d24f710bb74ccf2a007d7d7a8af2dfca09d9a52ccbc2831fc715c195a3634cca055185bd91
      #...
    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의 AMQ Streams 버전은 /opt/kafka/plugins 디렉터리에 포함된 타사 커넥터 플러그인을 로드합니다.

절차

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

    FROM registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0
    USER root:root
    COPY ./my-plugins/ /opt/kafka/plugins/
    USER 1001

    plugins 파일 예

    $ 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
      포드의 Docker 이미지입니다.
      3
      Kafka Connect 작업자 구성(연결이 아님).
    • install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml 파일에서 STRIMZI_KAFKA_CONNECT_IMAGES 환경 변수를 편집하여 새 컨테이너 이미지를 가리키는 다음 Cluster Operator를 다시 설치합니다.
6.4.3.3. KafkaConnector 리소스 배포

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

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

이 절차에 표시된 구성에서 autoRestart 속성은 true 로 설정됩니다. 이를 통해 실패한 커넥터 및 작업을 자동으로 다시 시작할 수 있습니다. 재시작 횟수는 최대 7개까지 수행되며, 이 후에는 수동으로 다시 시작해야 합니다. KafkaConnector 리소스에 커넥터 를 다시 시작하거나 커넥터 작업을 수동으로 다시 시작하도록 주석을 답니다.

커넥터 예

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

AMQ Streams는 예제 파일 커넥터 플러그인에 대한 KafkaConnector 구성 파일 (examples/connect/source-connector.yaml) 예제를 제공하여 KafkaConnector 리소스로 다음 커넥터 인스턴스를 생성합니다.

  • Kafka 라이센스 파일(소스)에서 각 행을 읽고 해당 데이터를 단일 Kafka 항목에 메시지로 기록하는 instance입니다.
  • Kafka 주제에서 메시지를 읽고 메시지를 임시 파일(스케크)에 쓰는 instance입니다.

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

참고

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

사전 요구 사항

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

절차

  1. 다음 방법 중 하나로 Kafka Connect에 ScanSetting SourceConnector 및 ScanSettingSink Connector 플러그인을 추가합니다.

  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 파일을 편집합니다.

    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
    실패한 커넥터 및 작업의 자동 재시작을 활성화합니다.
    6
    커넥터 구성은 키-값 쌍으로 설정됩니다.
    7
    이 예제 소스 커넥터 구성은 /opt/kafka/LICENSE 파일에서 데이터를 읽습니다.
    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 속성에 정의되어 있습니다.

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

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

file

문자열

null

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

주제

list

null

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

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

file

문자열

null

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

주제

list

null

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

topics.regex

문자열

null

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

6.4.3.4. 커넥터 수동 다시 시작

KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 restart 주석을 사용하여 커넥터 재시작을 수동으로 트리거합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

절차

  1. 재시작하려는 Kafka 커넥터를 제어하는 KafkaConnector 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaConnector
  2. OpenShift에서 KafkaConnector 리소스에 주석을 달아 커넥터를 다시 시작합니다.

    oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart=true

    restart 주석은 true 로 설정됩니다.

  3. 다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다).

    조정 프로세스에서 주석이 감지된 한 Kafka 커넥터가 재시작됩니다. Kafka Connect에서 재시작 요청을 수락하면 주석이 KafkaConnector 사용자 정의 리소스에서 제거됩니다.

6.4.3.5. Kafka 커넥터 작업 수동 다시 시작

KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 restart-task 주석을 사용하여 커넥터 작업 재시작을 수동으로 트리거합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

절차

  1. 재시작하려는 Kafka 커넥터 작업을 제어하는 KafkaConnector 사용자 정의 리소스의 이름을 찾습니다.

    oc get KafkaConnector
  2. KafkaConnector 사용자 정의 리소스에서 재시작할 작업의 ID를 찾습니다. 작업 ID는 0부터 시작하여 음수가 아닌 정수입니다.

    oc describe KafkaConnector <kafka_connector_name>
  3. OpenShift에서 KafkaConnector 리소스에 주석을 달아 ID를 사용하여 커넥터 작업을 다시 시작합니다.

    oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart-task=0

    이 예에서는 작업 0 이 다시 시작됩니다.

  4. 다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다).

    조정 프로세스에서 주석을 탐지한 경우 Kafka 커넥터 작업이 재시작됩니다. Kafka Connect에서 재시작 요청을 수락하면 주석이 KafkaConnector 사용자 정의 리소스에서 제거됩니다.

6.4.3.6. Kafka Connect API 노출

KafkaConnector 리소스를 사용하여 커넥터를 관리하는 대신 Kafka Connect REST API를 사용합니다. 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.4.3.7. 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 클러스터 관리자만 커넥터를 변경할 수 있습니다. AMQ Streams 리소스를 관리하기 위해 비 클러스터 관리자를 지정할 수도 있습니다. Kafka Connect 구성에서 KafkaConnector 리소스를 활성화하면 Kafka Connect REST API를 사용하여 직접 변경한 사항이 Cluster Operator에 의해 되돌아갑니다. 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.5. Kafka MirrorMaker 배포

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

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

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

배포에서는 YAML 파일을 사용하여 배포된 MirrorMaker 버전에 따라 KafkaMirrorMaker 또는 KafkaMirrorMaker2 리소스를 생성합니다.

중요

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

AMQ Streams는 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.

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

절차

  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 에는 준비되거나 예상된 복제본 수가 표시됩니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

6.6. Kafka 브리지 배포

Cluster Operator는 하나 이상의 Kafka 브리지 복제본을 배포하여 HTTP API를 통해 Kafka 클러스터와 클라이언트 간에 데이터를 보냅니다.

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

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

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

AMQ Streams는 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.

  • 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 브리지 클러스터의 이름입니다.

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

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

    READY 에는 준비되거나 예상된 복제본 수가 표시됩니다. STATUSRunning 으로 표시되면 배포가 성공적으로 수행됩니다.

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

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

참고

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

절차

  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 브리지 Pod의 포트 8080으로 전달됩니다.

6.6.3. OpenShift 외부에서 Kafka 브릿지 액세스

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

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

  • 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 브리지 사용자 정의 리소스의 이름입니다.

6.7. AMQ Streams Operator의 다른 독립 실행형 배포 옵션

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

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

6.7.1. 독립 실행형 주제 Operator 배포

다음 절차에서는 주제 관리를 위해 Topic Operator를 독립 실행형 구성 요소로 배포하는 방법을 설명합니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 Topic Operator를 사용할 수 있습니다.

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

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

주제 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-topic-operator.yaml 독립 실행형 배포 파일에서 env 속성을 편집합니다.

    독립 실행형 주제 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_ZOOKEEPER_CONNECT 
    4
    
                  value: my-cluster-zookeeper-client:2181
                - name: STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS 
    5
    
                  value: "18000"
                - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 
    6
    
                  value: "120000"
                - name: STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS 
    7
    
                  value: "6"
                - name: STRIMZI_LOG_LEVEL 
    8
    
                  value: INFO
                - name: STRIMZI_TLS_ENABLED 
    9
    
                  value: "false"
                - name: STRIMZI_JAVA_OPTS 
    10
    
                  value: "-Xmx=512M -Xms=256M"
                - name: STRIMZI_JAVA_SYSTEM_PROPERTIES 
    11
    
                  value: "-Djavax.net.debug=verbose -DpropertyName=value"
                - name: STRIMZI_PUBLIC_CA 
    12
    
                  value: "false"
                - name: STRIMZI_TLS_AUTH_ENABLED 
    13
    
                  value: "false"
                - name: STRIMZI_SASL_ENABLED 
    14
    
                  value: "false"
                - name: STRIMZI_SASL_USERNAME 
    15
    
                  value: "admin"
                - name: STRIMZI_SASL_PASSWORD 
    16
    
                  value: "password"
                - name: STRIMZI_SASL_MECHANISM 
    17
    
                  value: "scram-sha-512"
                - name: STRIMZI_SECURITY_PROTOCOL 
    18
    
                  value: "SSL"

    1
    KafkaTopic 리소스를 조사할 Topic Operator의 OpenShift 네임스페이스입니다. Kafka 클러스터의 네임스페이스를 지정합니다.
    2
    Kafka 클러스터의 모든 브로커를 검색하고 연결하는 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 중단된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
    3
    Topic Operator에서 관리하는 KafkaTopic 리소스를 식별하는 레이블입니다. Kafka 클러스터의 이름이 될 필요는 없습니다. KafkaTopic 리소스에 할당된 레이블일 수 있습니다. 둘 이상의 Topic Operator를 배포하는 경우 레이블은 각각에 대해 고유해야 합니다. 즉, Operator는 동일한 리소스를 관리할 수 없습니다.
    4
    ZooKeeper 클러스터에 연결할 주소의 호스트 및 포트 쌍입니다. Kafka 클러스터가 사용 중인 것과 동일한 ZooKeeper 클러스터여야 합니다.
    5
    ZooKeeper 세션 시간 초과(밀리초)입니다. 기본값은 18000 (18초)입니다.
    6
    정기적인 조정 간격(밀리초)입니다. 기본값은 120000 (2분)입니다.
    7
    Kafka에서 주제 메타데이터를 가져오는 시도 횟수입니다. 각 시도 사이의 시간은 지수 백오프로 정의됩니다. 파티션 또는 복제본 수로 인해 주제 생성에 시간이 더 걸리면 이 값을 늘리는 것이 좋습니다. 기본값은 6 번 시도입니다.
    8
    로깅 메시지를 출력하는 수준입니다. 수준을 ERROR,WARNING,INFO,DEBUG, TRACE 로 설정할 수 있습니다.
    9
    Kafka 브로커와의 암호화된 통신에 대한 TLS 지원을 활성화합니다.
    10
    (선택 사항) Topic Operator를 실행하는 JVM에서 사용하는 Java 옵션입니다.
    11
    (선택 사항) Topic Operator에 설정된 디버깅(-D) 옵션입니다.
    12
    (선택 사항) TLS가 STRIMZI_TLS_ENABLED 를 통해 활성화되는 경우 신뢰 저장소 인증서 생성에 영향을 미칩니다. 이 환경 변수가 활성화된 경우 브로커는 TLS 인증서에 신뢰할 수 있는 공개 인증 기관을 사용해야 합니다. 기본값은 false입니다.
    13
    (선택 사항) mTLS 인증을 위한 키 저장소 인증서를 생성합니다. 이 값을 false 로 설정하면 mTLS를 사용하여 Kafka 브로커에 대한 클라이언트 인증이 비활성화됩니다. 기본값은 true입니다.
    14
    (선택 사항) Kafka 브로커에 연결할 때 클라이언트 인증에 대해 SASL 지원을 활성화합니다. 기본값은 false입니다.
    15
    (선택 사항) 클라이언트 인증을 위한 SASL 사용자 이름입니다. STRIMZI_SASL_ENABLED 를 통해 SASL이 활성화된 경우에만 필수 항목입니다.
    16
    (선택 사항) 클라이언트 인증을 위한 SASL 암호입니다. STRIMZI_SASL_ENABLED 를 통해 SASL이 활성화된 경우에만 필수 항목입니다.
    17
    (선택 사항) 클라이언트 인증을 위한 SASL 메커니즘입니다. STRIMZI_SASL_ENABLED 를 통해 SASL이 활성화된 경우에만 필수 항목입니다. 값을 plain,scram-sha-256 또는 scram-sha-512 로 설정할 수 있습니다.
    18
    (선택 사항) Kafka 브로커와의 통신에 사용되는 보안 프로토콜입니다. 기본값은 "PLAINTEXT"입니다. 이 값을 PLAINTEXT,SSL,SASL_PLAINTEXT, SASL_SSL 로 설정할 수 있습니다.
  2. 공개 인증 기관의 인증서를 사용하는 Kafka 브로커에 연결하려면 STRIMZI_ECDHELIC_CAtrue 로 설정합니다. 이 속성을 true 로 설정합니다(예: Amazon AWS MSK 서비스를 사용하는 경우).
  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 및 ZooKeeper 서버 인증서에 서명하는 데 사용되는 인증 기관의 공개 키가 포함되어 있습니다.
    2
    신뢰 저장소에 액세스하기 위한 암호입니다.
    3
    키 저장소에는 mTLS 인증을 위한 개인 키가 포함됩니다.
    4
    키 저장소에 액세스하기 위한 암호입니다.
  4. Topic Operator를 배포합니다.

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

    oc get deployments

    출력에 배포 이름과 준비 상태가 표시됩니다.

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

    READY 에는 준비되거나 예상된 복제본 수가 표시됩니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

6.7.2. 독립 실행형 사용자 Operator 배포

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

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

독립 실행형 배포 파일은 AMQ 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
                - name: STRIMZI_KRAFT_ENABLED 
    20
    
                  value: "false"

    1
    KafkaUser 리소스를 조사할 User Operator의 OpenShift 네임스페이스입니다. 하나의 네임스페이스만 지정할 수 있습니다.
    2
    Kafka 클러스터의 모든 브로커를 검색하고 연결하는 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 중단된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
    3
    mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA(인증 기관)의 공개 키(ca.crt) 값이 포함된 OpenShift Secret 입니다.
    4
    mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA의 개인 키(ca.key) 값이 포함된 OpenShift Secret
    5
    User Operator가 관리하는 KafkaUser 리소스를 식별하는 레이블입니다. Kafka 클러스터의 이름이 될 필요는 없습니다. KafkaUser 리소스에 할당된 레이블일 수 있습니다. 둘 이상의 User Operator를 배포하는 경우 레이블은 각각에 대해 고유해야 합니다. 즉, 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 Admin API를 사용하여 권한 부여 ACL 규칙 관리를 지원하는지 여부를 나타냅니다. false 로 설정하면 User Operator는 간단한 권한 부여 ACL 규칙이 있는 모든 리소스를 거부합니다. 이는 Kafka 클러스터 로그에서 불필요한 예외를 방지하는 데 도움이 됩니다. 기본값은 true입니다.
    18
    (선택 사항) 만료 사용자 인증서가 갱신되는 동안 유지 관리 시간 창을 정의하는 Cron 표현식의 반 연속으로 구분된 목록입니다.
    19
    (선택 사항) User Operator가 속성 형식으로 사용하는 Kafka 관리자 클라이언트를 구성하기 위한 구성 옵션입니다.
    20
    (선택 사항) User Operator가 연결하는 Kafka 클러스터가 ZooKeeper 대신 KRaft를 사용하고 있는지 여부를 나타냅니다. Kafka 클러스터가 KRaft를 사용하는 경우 이 변수를 true 로 설정합니다. 기본값은 false입니다. KRaft 클러스터에서 실행할 때 일부 기능을 사용할 수 없습니다. 예를 들어, 현재 Apache Kafka에서 지원하는 SCRAM-SHA-512 사용자 관리는 비활성화되어 있습니다.
  2. Kafka 클러스터에 연결하는 데 mTLS를 사용하는 경우 연결을 인증하는 데 사용되는 시크릿을 지정합니다. 그렇지 않으면 다음 단계로 이동합니다.

    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 Secret 입니다.
  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 에는 준비되거나 예상된 복제본 수가 표시됩니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

7장. Kafka 클러스터에 대한 클라이언트 액세스 설정

AMQ Streams를 배포한 후 Kafka 클러스터에 대한 클라이언트 액세스를 설정할 수 있습니다. 배포를 확인하려면 예제 생산자 및 소비자 클라이언트를 배포할 수 있습니다. 또는 OpenShift 클러스터 내부 또는 외부에서 클라이언트 액세스를 제공하는 리스너를 생성합니다.

7.1. 예제 클라이언트 배포

생산자 및 소비자 클라이언트 예제를 배포하여 메시지를 보내고 받습니다. 이러한 클라이언트를 사용하여 AMQ Streams 배포를 확인할 수 있습니다.

사전 요구 사항

  • Kafka 클러스터는 클라이언트에서 사용할 수 있습니다.

절차

  1. Kafka 생산자를 배포합니다.

    oc run kafka-producer -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.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-34-rhel8:2.4.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic --from-beginning
  5. 소비자 콘솔에 들어오는 메시지가 표시되는지 확인합니다.

7.2. Kafka 브로커에 연결하도록 리스너 구성

Kafka 브로커에 대한 클라이언트 연결에 리스너를 사용합니다. AMQ Streams는 Kafka 리소스를 통해 리스너를 구성하는 속성과 함께 일반 GenericKafkaListener 스키마를 제공합니다. GenericKafkaListener 는 리스너 구성에 유연한 접근 방식을 제공합니다. OpenShift 클러스터 외부 연결을 위해 OpenShift 클러스터 또는 외부 리스너 내에서 연결하기 위해 속성을 지정하여 내부 리스너를 구성할 수 있습니다.

리스너 구성에서 Kafka를 노출할 연결 유형을 지정합니다. 선택한 유형은 요구 사항 및 환경 및 인프라에 따라 다릅니다. 다음 리스너 유형이 지원됩니다.

내부 리스너
  • 내부 와 동일한 OpenShift 클러스터 내에서 연결
  • broker별 ClusterIP 서비스를 사용하여 Kafka를 노출하는 cluster-ip
외부 리스너
중요

OpenShift에서 수신 을 사용하지 말고 대신 경로 유형을 사용합니다. Ingress NGINX 컨트롤러는 Kubernetes에서만 사용하기 위한 것입니다. 경로 유형은 OpenShift에서만 지원됩니다.

내부 유형 리스너 구성은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. OpenShift 네트워크에 외부 네트워크에 참여할 수 있습니다. 이 경우 OpenShift 서비스 DNS 도메인(일반적으로 .cluster.local)을 사용하지 않도록 내부 유형 리스너를 구성할 수 있습니다. 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: external
        port: 9094
        type: route
        tls: true
        configuration:
          brokerCertChainAndKey:
            secretName: my-secret
            certificate: my-certificate.crt
            key: my-key.key
    # ...

이름과 포트가 고유한 경우 필요에 따라 리스너를 구성할 수 있습니다. 인증을 사용하여 보안 연결을 위해 리스너를 구성할 수도 있습니다.

각 연결 유형의 장단점에 대해 자세히 알아보려면 Strimzi에서 Apache Kafka 액세스를 참조하십시오.

참고

외부 리스너를 사용하는 동안 Kafka 클러스터를 스케일링하는 경우 모든 Kafka 브로커의 롤링 업데이트가 트리거될 수 있습니다. 구성에 따라 달라집니다.

7.3. 리스너를 사용하여 Kafka 클러스터에 클라이언트 액세스 설정

Kafka 클러스터의 주소를 사용하여 동일한 OpenShift 클러스터의 클라이언트에 대한 액세스를 제공하거나 다른 OpenShift 네임스페이스 또는 OpenShift 외부의 클라이언트에 대한 외부 액세스를 제공할 수 있습니다. 다음 절차에서는 OpenShift 외부 또는 다른 OpenShift 클러스터에서 Kafka 클러스터에 대한 클라이언트 액세스를 구성하는 방법을 설명합니다.

Kafka 리스너는 Kafka 클러스터에 대한 액세스를 제공합니다. 클라이언트 액세스는 다음 구성을 사용하여 보호됩니다.

  1. 외부 리스너는 TLS 암호화 및 mTLS 인증 및 Kafka 간단한 인증이 활성화된 Kafka 클러스터에 대해 구성됩니다.
  2. KafkaUser 는 mTLS 인증 및 간단한 권한 부여를 위해 정의된 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로 사용자를 인증할 수 없습니다.

AMQ Streams Operator는 구성 프로세스를 자동화하고 인증에 필요한 인증서를 생성합니다.

  • Cluster Operator는 리스너를 생성하고 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정하여 Kafka 클러스터와의 인증을 활성화합니다.
  • 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: external 
      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이고 포트 9404 및 9999를 제외하고 이미 Prometheus 및 10.0.0.1에 사용됩니다. 리스너 유형에 따라 포트 번호가 Kafka 클라이언트를 연결하는 포트 번호와 동일하지 않을 수 있습니다.
      4
      경로 (OpenShift만), 로드 밸런서 ,노드 포트 또는 수신 (Kubernetes만)로 지정된 외부 리스너 유형. 내부 리스너는 내부 또는 cluster-ip 로 지정됩니다.
      5
      필수 항목입니다. 리스너의 TLS 암호화입니다. routeingress 유형 리스너의 경우 true 로 설정해야 합니다. mTLS 인증의 경우 인증 속성도 사용합니다.
      6
      리스너의 클라이언트 인증 메커니즘. mTLS를 사용한 서버 및 클라이언트 인증의 경우 tls: trueauthentication.type: tls 를 지정합니다.
      7
      (선택 사항) 리스너 유형의 요구 사항에 따라 추가 리스너 구성을 지정할 수 있습니다.
      8
      권한 부여는 AclAuthorizer Kafka 플러그인을 사용하는 단순 로 지정됩니다.
      9
      (선택 사항) 슈퍼 사용자는 ACL에 정의된 액세스 제한에 관계없이 모든 브로커에 액세스할 수 있습니다.
      주의

      OpenShift 경로 주소는 Kafka 클러스터의 이름, 리스너의 이름 및 생성된 네임스페이스의 이름으로 구성됩니다. 예를 들면 my-cluster-kafka-listener1-bootstrap-myproject (CLUSTER-NAME-kafka-LISTENER-NAME -bootstrap-NAMESPACE)입니다. 경로 리스너 유형을 사용하는 경우 주소의 전체 길이가 최대 63자 제한을 초과하지 않도록 주의하십시오.

  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를 확인하도록 신뢰 저장소 자격 증명으로 클라이언트를 구성합니다.

    공용 클러스터 CA 인증서를 지정합니다.

    신뢰 저장소 구성 예

    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은 신뢰 저장소의 파일 형식입니다.

  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>");

    키 저장소 인증서와 개인 키를 구성에 직접 추가합니다. 를 단일 줄 형식으로 추가합니다. BEGINCERTIFICATEENDCERT IFICATE 구분자 사이에 줄 바꿈 문자(\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-----");

7.4. 노드 포트를 사용하여 Kafka 액세스

노드 포트를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 AMQ Streams Kafka 클러스터에 액세스합니다.

브로커에 연결하려면 Kafka 부트스트랩 주소의 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.

이 절차에서는 기본 nodeport 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성을 추가합니다. 예를 들어 nodeport 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.

preferredNodePortAddressType
노드 주소로 확인되는 첫 번째 주소 유형을 지정합니다.
externalTrafficPolicy
서비스가 외부 트래픽을 노드 로컬 또는 클러스터 전체 엔드포인트로 라우팅하는지를 지정합니다.
nodePort
부트스트랩 및 브로커 서비스에 할당된 노드 포트 번호를 덮어씁니다.

리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.

사전 요구 사항

  • 실행 중인 Cluster Operator

이 프로세스에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너의 이름은 external 입니다.

절차

  1. 외부 리스너를 사용하여 nodeport 유형으로 Kafka 리소스를 구성합니다.

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

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      labels:
        app: my-cluster
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        # ...
        listeners:
          - name: external
            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 에 생성됩니다.

    각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해 NodePort 유형 서비스가 생성됩니다.

    부트스트랩 및 브로커용으로 생성된 노드 포트 서비스

    NAME                                 TYPE      CLUSTER-IP      PORT(S)
    my-cluster-kafka-external-0          NodePort  172.30.55.13    9094:31789/TCP
    my-cluster-kafka-external-1          NodePort  172.30.250.248  9094:30028/TCP
    my-cluster-kafka-external-2          NodePort  172.30.115.81   9094:32650/TCP
    my-cluster-kafka-external-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
      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: external
          type: external
      observedGeneration: 2
     # ...

  3. Kafka 리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.

    oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].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 클라이언트의 부트스트랩 호스트 및 포트를 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다. 예를 들어 ip-10-0-224-199.us-west-2.compute.internal:32650 입니다.
    2. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.

      클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.

참고

자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 CA를 추가할 필요가 없습니다.

7.5. 로드 밸런서를 사용하여 Kafka 액세스

로드 밸런서를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 AMQ Streams Kafka 클러스터에 액세스합니다.

브로커에 연결하려면 Kafka 부트스트랩 주소의 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.

이 절차에서는 기본 로드 밸런서 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성을 추가합니다. 예를 들어 로드 밸런서 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.

loadBalancerSourceRanges
CIDR(Classless Inter-Domain Routing) 범위의 지정된 목록으로 트래픽을 제한합니다.
externalTrafficPolicy
서비스가 외부 트래픽을 노드 로컬 또는 클러스터 전체 엔드포인트로 라우팅하는지를 지정합니다.
loadBalancerIP
로드 밸런서를 생성할 때 특정 IP 주소를 요청합니다.

리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.

사전 요구 사항

  • 실행 중인 Cluster Operator

이 프로세스에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너의 이름은 external 입니다.

절차

  1. 외부 리스너를 사용하여 loadbalancer 유형으로 Kafka 리소스를 구성합니다.

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

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      labels:
        app: my-cluster
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        # ...
        listeners:
          - name: external
            port: 9095
            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-external-0          LoadBalancer     172.30.204.234  9095:30011/TCP
    my-cluster-kafka-external-1          LoadBalancer     172.30.164.89   9095:32544/TCP
    my-cluster-kafka-external-2          LoadBalancer     172.30.73.151   9095:32504/TCP
    my-cluster-kafka-external-bootstrap  LoadBalancer     172.30.30.228   9095:30371/TCP
    
    NAME                                 EXTERNAL-IP (loadbalancer)
    my-cluster-kafka-external-0          a8a519e464b924000b6c0f0a05e19f0d-1132975133.us-west-2.elb.amazonaws.com
    my-cluster-kafka-external-1          ab6adc22b556343afb0db5ea05d07347-611832211.us-west-2.elb.amazonaws.com
    my-cluster-kafka-external-2          a9173e8ccb1914778aeb17eca98713c0-777597560.us-west-2.elb.amazonaws.com
    my-cluster-kafka-external-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
      listeners:
        # ...
        - addresses:
            - host: >-
                a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com
              port: 9095
          bootstrapServers: >-
            a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9095
          certificates:
            - |
              -----BEGIN CERTIFICATE-----
    
              -----END CERTIFICATE-----
          name: external
          type: external
      observedGeneration: 2
     # ...

    클라이언트 연결에 사용되는 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=="external")].bootstrapServers}{"\n"}'
    
    a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9095
  4. 클러스터 CA 인증서를 추출합니다.

    oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  5. 브로커에 연결하도록 클라이언트를 구성합니다.

    1. Kafka 클라이언트의 부트스트랩 호스트 및 포트를 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다. 예를 들어 a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9095.
    2. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.

      클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.

참고

자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 CA를 추가할 필요가 없습니다.

7.6. OpenShift 경로를 사용하여 Kafka 액세스

OpenShift 경로를 사용하여 OpenShift 클러스터 외부 클라이언트에서 AMQ Streams Kafka 클러스터에 액세스합니다.

경로를 사용하려면 Kafka 사용자 정의 리소스에서 경로 유형 리스너에 대한 구성을 추가합니다. 적용되면 구성이 외부 부트스트랩 및 클러스터의 각 브로커에 대한 전용 경로 및 서비스를 생성합니다. 클라이언트는 부트스트랩 서비스를 통해 브로커에 연결하도록 라우팅하는 부트스트랩 경로에 연결합니다. 그런 다음 연결마다 DNS 이름을 사용하여 설정되며, 이 이름은 브로커별 경로 및 서비스를 통해 클라이언트에서 브로커로 트래픽을 라우팅합니다.

브로커에 연결하려면 경로 부트스트랩 주소의 호스트 이름과 TLS 암호화에 사용되는 인증서를 지정합니다. 경로를 사용한 액세스의 경우 포트는 항상 443입니다.

주의

OpenShift 경로 주소는 Kafka 클러스터의 이름, 리스너 이름 및 생성된 프로젝트의 이름으로 구성됩니다. 예를 들어 my-cluster-kafka-external-bootstrap-myproject (<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>)입니다. 주소의 전체 길이가 최대 63자 제한을 초과하지 않도록 주의하십시오.

이 절차에서는 기본 리스너 구성을 보여줍니다. TLS 암호화(tls)를 활성화해야 합니다. 클라이언트 인증 메커니즘(인증)을 지정할 수도 있습니다. 구성 속성을 사용하여 추가 구성을 추가합니다. 예를 들어 경로 리스너와 함께 호스트 구성 속성을 사용하여 부트스트랩 및 인수별 서비스에서 사용하는 호스트 이름을 지정할 수 있습니다.

리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.

TLS 패스스루

AMQ Streams에서 생성한 경로에 대해 TLS 패스스루가 활성화됩니다. Kafka는 TCP를 통해 바이너리 프로토콜을 사용하지만 경로는 HTTP 프로토콜에서 작동하도록 설계되었습니다. 경로를 통해 TCP 트래픽을 라우팅할 수 있도록 AMQ Streams는 SNI(Server Name Indication)를 사용하여 TLS 패스스루를 사용합니다.

SNI는 Kafka 브로커의 연결을 식별하고 전달하는 데 도움이 됩니다. passthrough 모드에서 TLS 암호화는 항상 사용됩니다. 연결이 브로커에 전달되므로 리스너는 수신 인증서가 아닌 내부 클러스터 CA에서 서명한 TLS 인증서를 사용합니다. 자체 리스너 인증서를 사용하도록 리스너를 구성하려면 brokerCertECDHEAndKey 속성을 사용합니다.

사전 요구 사항

  • 실행 중인 Cluster Operator

이 프로세스에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너의 이름은 external 입니다.

절차

  1. 외부 리스너를 사용하여 경로 유형으로 Kafka 리소스를 구성합니다.

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

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      labels:
        app: my-cluster
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        # ...
        listeners:
          - name: external
            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 에 생성됩니다.

    각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해 ClusterIP 유형 서비스가 생성됩니다.

    기본 OpenShift HAProxy 라우터를 사용하여 이를 노출하는 DNS 주소(host/port)를 사용하여 각 서비스에 대해 경로가 생성됩니다.

    경로는 TLS 패스스루를 사용하여 사전 구성됩니다.

    부트스트랩 및 브로커에 대해 생성된 경로

    NAME                                  HOST/PORT                                                   SERVICES                              PORT  TERMINATION
    my-cluster-kafka-external-0          my-cluster-kafka-external-0-my-project.router.com          my-cluster-kafka-external-0          9094  passthrough
    my-cluster-kafka-external-1          my-cluster-kafka-external-1-my-project.router.com          my-cluster-kafka-external-1          9094  passthrough
    my-cluster-kafka-external-2          my-cluster-kafka-external-2-my-project.router.com          my-cluster-kafka-external-2          9094  passthrough
    my-cluster-kafka-external-bootstrap  my-cluster-kafka-external-bootstrap-my-project.router.com  my-cluster-kafka-external-bootstrap  9094  passthrough

    클라이언트 연결에 사용되는 DNS 주소는 각 경로의 상태로 전파됩니다.

    부트스트랩 경로의 상태 예

    status:
      ingress:
        - host: >-
            my-cluster-kafka-external-bootstrap-my-project.router.com
     # ...

  3. 대상 브로커를 사용하여 OpenSSL s_client 를 사용하여 포트 443에서 클라이언트-서버 TLS 연결을 확인합니다.

    openssl s_client -connect my-cluster-kafka-external-0-my-project.router.com:443 -servername my-cluster-kafka-external-0-my-project.router.com -showcerts

    서버 이름은 브로커에 연결을 전달하는 SNI입니다.

    연결에 성공하면 브로커의 인증서가 반환됩니다.

    브로커의 인증서

    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=="external")].bootstrapServers}{"\n"}'
    
    my-cluster-kafka-external-bootstrap-my-project.router.com:443

    주소는 클러스터 이름, 리스너 이름, 프로젝트 이름 및 라우터 도메인(이 예에서는router.com )으로 구성됩니다.

  5. 클러스터 CA 인증서를 추출합니다.

    oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  6. 브로커에 연결하도록 클라이언트를 구성합니다.

    1. Kafka 클라이언트에서 Kafka 클러스터에 연결할 부트스트랩 주소로 부트스트랩 서비스 및 포트 443의 주소를 지정합니다.
    2. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.

      클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.

참고

자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 CA를 추가할 필요가 없습니다.

8장. Kafka에 대한 보안 액세스 관리

각 클라이언트에 Kafka 브로커에 대한 액세스를 관리하여 Kafka 클러스터를 보호할 수 있습니다.

Kafka 브로커와 클라이언트 간의 보안 연결은 다음을 포함할 수 있습니다.

  • 데이터 교환의 암호화
  • ID를 증명하기 위한 인증
  • 사용자가 실행하는 작업을 허용 또는 거부할 수 있는 권한 부여

이 장에서는 Kafka 브로커와 클라이언트 간의 보안 연결을 설정하는 방법과 함께 다음 섹션을 설명합니다.

  • Kafka 클러스터 및 클라이언트에 대한 보안 옵션
  • Kafka 브로커를 보호하는 방법
  • OAuth 2.0 토큰 기반 인증 및 권한 부여에 대한 권한 부여 서버를 사용하는 방법

8.1. Kafka의 보안 옵션

Kafka 리소스를 사용하여 Kafka 인증 및 권한 부여에 사용되는 메커니즘을 구성합니다.

8.1.1. 리스너 인증

리스너를 생성할 때 Kafka 브로커에 대한 클라이언트 인증을 구성합니다. Kafka 리소스에서 Kafka.spec.kafka.listeners.authentication 속성을 사용하여 리스너 인증 유형을 지정합니다.

OpenShift 클러스터 내부의 클라이언트의 경우 일반 (암호화 제외) 또는 tls 내부 리스너를 생성할 수 있습니다. 내부 리스너 유형은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. 헤드리스 서비스의 대안으로, 각 브로커 ClusterIP 서비스를 사용하여 Kafka를 노출하는 내부 리스너의 cluster-ip 유형을 생성할 수도 있습니다. OpenShift 클러스터 외부의 클라이언트의 경우 외부 리스너를 생성하고 노드 포트, 로드 밸런서,수신 (Kubernetes만) 또는 경로 (OpenShift 전용)일 수 있는 연결 메커니즘을 지정합니다.

외부 클라이언트 연결의 구성 옵션에 대한 자세한 내용은 7장. Kafka 클러스터에 대한 클라이언트 액세스 설정 을 참조하십시오.

지원되는 인증 옵션:

  1. mTLS 인증 (TLS가 활성화된 리스너에서만)
  2. SCRAM-SHA-512 인증
  3. OAuth 2.0 토큰 기반 인증
  4. 사용자 정의 인증

선택하는 인증 옵션은 Kafka 브로커에 대한 클라이언트 액세스를 인증하는 방법에 따라 다릅니다.

참고

사용자 지정 인증을 사용하기 전에 표준 인증 옵션을 살펴보십시오. 사용자 정의 인증은 모든 유형의 kafka 지원 인증을 허용합니다. 더 많은 유연성을 제공할 수 있지만 복잡성을 더할 수도 있습니다.

그림 8.1. Kafka 리스너 인증 옵션

리스너 인증 구성 옵션

리스너 인증 속성은 해당 리스너와 관련된 인증 메커니즘을 지정하는 데 사용됩니다.

인증 속성이 지정되지 않은 경우 리스너는 해당 리스너를 통해 연결하는 클라이언트를 인증하지 않습니다. 리스너는 인증 없이 모든 연결을 허용합니다.

KafkaUsers 를 관리하기 위해 User Operator를 사용할 때 인증을 구성해야 합니다.

다음 예제에서는 다음을 보여줍니다.

  • SCRAM-SHA-512 인증을 위해 구성된 일반 리스너
  • mTLS 인증이 있는 tls 리스너
  • mTLS 인증이 있는 외부 리스너

각 리스너는 Kafka 클러스터 내에서 고유한 이름과 포트로 구성됩니다.

참고

구독자 간 통신(9091 또는 9090) 및 메트릭(9404)을 위해 예약된 포트를 사용하도록 리스너를 구성할 수 없습니다.

리스너 인증 구성 예

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: external
        port: 9094
        type: loadbalancer
        tls: true
        authentication:
          type: tls
# ...

8.1.1.1. mTLS 인증

mTLS 인증은 항상 Kafka 브로커와 ZooKeeper Pod 간의 통신에 사용됩니다.

AMQ Streams는 TLS(Transport Layer Security)를 사용하여 상호 인증을 사용하거나 사용하지 않고 Kafka 브로커와 클라이언트 간에 암호화된 통신을 제공하도록 Kafka를 구성할 수 있습니다. 상호 또는 양방향 인증의 경우 서버와 클라이언트 모두 인증서를 제공합니다. mTLS 인증을 구성하면 브로커는 클라이언트(클라이언트 인증)를 인증하고 클라이언트는 브로커(서버 인증)를 인증합니다.

Kafka 리소스의 mTLS 리스너 구성에는 다음이 필요합니다.

  • TLS: true: TLS 암호화 및 서버 인증을 지정
  • authentication.type: tls: 클라이언트 인증 지정

Cluster Operator에 의해 Kafka 클러스터를 생성하면 <cluster _name>-cluster-ca-cert라는 이름으로 새 시크릿을 생성합니다. 보안에는 CA 인증서가 포함되어 있습니다. CA 인증서는 PEM 및 PKCS #12 형식입니다. Kafka 클러스터를 확인하려면 클라이언트 구성의 신뢰 저장소에 CA 인증서를 추가합니다. 클라이언트를 확인하려면 사용자 인증서 및 키를 클라이언트 구성의 키 저장소에 추가합니다. mTLS에 대한 클라이언트 구성에 대한 자세한 내용은 8.2.2절. “사용자 인증” 을 참조하십시오.

참고

TLS 인증은 일반적으로 일방향이며 한 당사자가 다른 당사자의 ID를 인증합니다. 예를 들어 웹 브라우저와 웹 서버 간에 HTTPS를 사용하는 경우 브라우저는 웹 서버의 ID 증명을 가져옵니다.

8.1.1.2. SCRAM-SHA-512 인증

SCRAM(Salted Challenge Response Authentication Mechanism)은 암호를 사용하여 상호 인증을 설정할 수 있는 인증 프로토콜입니다. AMQ Streams는 암호화되지 않고 암호화된 클라이언트 연결 모두에서 인증을 제공하기 위해 SASL(Simple Authentication and Security Layer) SCRAM-SHA-512를 사용하도록 Kafka를 구성할 수 있습니다.

SCRAM-SHA-512 인증이 TLS 연결과 함께 사용되는 경우 TLS 프로토콜은 암호화를 제공하지만 인증에는 사용되지 않습니다.

SCRAM의 다음 속성을 사용하면 암호화되지 않은 연결에서도 SCRAM-SHA-512를 안전하게 사용할 수 있습니다.

  • 암호는 통신 채널을 통해 명확하게 전송되지 않습니다. 대신 클라이언트와 서버는 인증 사용자의 암호를 알고 있음을 증명하기 위해 서로 어려움을 겪습니다.
  • 서버와 클라이언트는 각각 인증 교환에 대한 새로운 과제를 생성합니다. 즉, 재생 공격에 대해 교환이 탄력적입니다.

KafkaUser.spec.authentication.typescram-sha-512 로 구성된 경우 User Operator는 대문자 및 소문자 ASCII 문자 및 숫자로 구성된 임의의 12자 암호를 생성합니다.

8.1.1.3. 네트워크 정책

기본적으로 AMQ Streams는 Kafka 브로커에서 활성화된 모든 리스너에 대해 NetworkPolicy 리소스를 자동으로 생성합니다. 이 NetworkPolicy 를 사용하면 애플리케이션이 모든 네임스페이스의 리스너에 연결할 수 있습니다. 네트워크 정책을 리스너 구성의 일부로 사용합니다.

네트워크 수준에서 선택한 애플리케이션 또는 네임스페이스로만 리스너에 대한 액세스를 제한하려면 networkPolicyPeers 속성을 사용합니다. 각 리스너에는 다른 networkPolicyPeers 구성이 있을 수 있습니다. 네트워크 정책 피어에 대한 자세한 내용은 NetworkPolicyPeer API 참조 를 참조하십시오.

사용자 지정 네트워크 정책을 사용하려면 Cluster Operator 구성에서 STRIMZI_NETWORK_POLICY_GENERATION 환경 변수를 false 로 설정할 수 있습니다. 자세한 내용은 13.2.3절. “환경 변수를 사용하여 Cluster Operator 구성”의 내용을 참조하십시오.

참고

OpenShift를 구성하면 AMQ Streams에서 네트워크 정책을 사용하려면 수신 NetworkPolicies 를 지원해야 합니다.

8.1.1.4. 리스너 인증서 제공

TLS 암호화가 활성화된 TLS 리스너 인증서 또는 TLS 리스너에 대해 Kafka 리스너 인증서 라는 고유한 서버 인증서를 제공할 수 있습니다. 자세한 내용은 8.3.4절. “TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공”의 내용을 참조하십시오.

8.1.2. Kafka 권한 부여

Kafka 리소스에서 Kafka.spec.kafka.authorization 속성을 사용하여 Kafka 브로커에 대한 권한을 구성합니다. 권한 부여 속성이 없는 경우 권한 부여가 활성화되지 않으며 클라이언트에는 제한이 없습니다. 활성화되면 권한 부여가 활성화된 모든 리스너에 적용됩니다. 권한 부여 방법은 type 필드에 정의됩니다.

지원되는 권한 부여 옵션:

그림 8.2. Kafka 클러스터 권한 부여 옵션

kafka 권한 부여 구성 옵션
8.1.2.1. Super 사용자

Super 사용자는 액세스 제한에 관계없이 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
    # ...

8.2. Kafka 클라이언트의 보안 옵션

KafkaUser 리소스를 사용하여 Kafka 클라이언트에 대한 인증 메커니즘, 권한 부여 메커니즘 및 액세스 권한을 구성합니다. 보안 구성 측면에서 클라이언트는 사용자로 표시됩니다.

Kafka 브로커에 대한 사용자 액세스 권한을 인증하고 인증할 수 있습니다. 인증은 액세스를 허용하고 권한 부여는 허용되는 작업에 대한 액세스를 제한합니다.

Kafka 브로커에 대한 제약되지 않은 액세스 권한이 있는 슈퍼 사용자를 생성할 수도 있습니다.

인증 및 권한 부여 메커니즘은 Kafka 브로커에 액세스하는 데 사용되는 리스너의 사양과 일치해야 합니다.

Kafka 브로커에 안전하게 액세스하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 7.3절. “리스너를 사용하여 Kafka 클러스터에 클라이언트 액세스 설정” 을 참조하십시오.

8.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 리소스의 상태가 비어 있으면 레이블을 확인합니다.

8.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 인증서에 지정된 공통 이름입니다.

8.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를 사용하는 경우 클라이언트 CA를 Cluster Operator가 갱신할 때 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 인증서의 신뢰 저장소 속성
  • 사용자 인증 자격 증명의 키 저장소 속성을 사용하여 클라이언트를 확인합니다.

구성은 파일 형식(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
신뢰 저장소 위치에는 Kafka 클러스터의 공개 키 인증서(ca.p12)가 포함됩니다. Kafka 클러스터가 생성될 때 <cluster _name>-cluster-ca-cert 보안의 Cluster Operator에 클러스터 CA 인증서 및 암호가 생성됩니다.
4
신뢰 저장소에 액세스하기 위한 암호(ca.password)입니다.
5
키 저장소 위치에는 Kafka 사용자의 공개 키 인증서(user.p12)가 포함됩니다.
6
키 저장소에 액세스하기 위한 암호(user.password)
8.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
  # ...

8.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로 인코딩됩니다. 암호를 사용하려면 암호를 디코딩해야 합니다.

사용자 인증 정보가 있는 시크릿 예

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 인증, base64로 인코딩되는 SASL 구성 문자열입니다.

생성된 암호를 디코딩합니다.

echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
8.2.2.3.1. 사용자 정의 암호 구성

사용자가 생성되면 AMQ Streams에서 임의의 암호를 생성합니다. AMQ 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
시크릿 내에 저장된 암호의 키입니다.

8.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 관리가 활성화되지 않은 경우 AMQ Streams는 ACL 규칙이 포함된 경우 리소스를 거부합니다.

User Operator의 독립 실행형 배포를 사용하는 경우 ACL 관리가 기본적으로 활성화됩니다. STRIMZI_ACLS_ADMIN_API_SUPPORTED 환경 변수를 사용하여 비활성화할 수 있습니다.

인증이 지정되지 않은 경우 User Operator는 사용자에 대한 액세스 권한을 프로비저닝하지 않습니다. 이러한 KafkaUser 가 리소스에 계속 액세스할 수 있는지의 여부는 사용 중인 인증자에 따라 달라집니다. 예를 들어 AclAuthorizer 의 경우 allow.everyone.if.no.acl.found 구성에 따라 결정됩니다.

8.2.3.1. ACL 규칙

AclAuthorizer 는 ACL 규칙을 사용하여 Kafka 브로커에 대한 액세스를 관리합니다.

ACL 규칙은 acls 속성에 지정하는 사용자에게 액세스 권한을 부여합니다.

AclRule 오브젝트에 대한 자세한 내용은 AclRule 스키마 참조 를 참조하십시오.

8.2.3.2. Kafka 브로커에 대한 Super 사용자 액세스

Kafka 브로커 구성의 슈퍼 사용자 목록에 사용자를 추가하면 KafkaUser 의 ACL에 정의된 권한 부여 제약 조건에 관계없이 사용자가 클러스터에 대한 무제한 액세스를 허용합니다.

브로커에 대한 슈퍼 사용자 액세스에 대한 자세한 내용은 Kafka 권한 부여 를 참조하십시오.

8.2.3.3. 사용자 할당량

KafkaUser 리소스에 대한 사양 을 구성하여 사용자가 Kafka 브로커에 대한 구성된 액세스 수준을 초과하지 않도록 할당량을 적용할 수 있습니다. 크기 기반 네트워크 사용량 및 시간 기반 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 브로커로 푸시할 수 있는 데이터 양에 대한 바이트당 할당량
2
사용자가 Kafka 브로커에서 가져올 수 있는 데이터 크기에 대한 바이트당 할당량
3
클라이언트 그룹의 시간 백분율로 CPU 사용률 제한
4
초당 허용된 동시 파티션 생성 및 삭제 작업(변경 사항) 수

이러한 속성에 대한 자세한 내용은 KafkaUserQuotas 스키마 참조 를 참조하십시오.

8.3. Kafka 브로커에 대한 액세스 보안

Kafka 브로커에 대한 보안 액세스를 구축하기 위해 다음을 구성하고 적용합니다.

  • 다음을 수행하는 Kafka 리소스

    • 지정된 인증 유형으로 리스너 생성
    • 전체 Kafka 클러스터에 대한 권한 부여 구성
  • 리스너를 통해 Kafka 브로커에 안전하게 액세스하는 KafkaUser 리소스

설정할 Kafka 리소스를 구성합니다.

  • 리스너 인증
  • Kafka 리스너에 대한 액세스를 제한하는 네트워크 정책
  • Kafka 권한 부여
  • 브로커에 대한 제한되지 않은 액세스를 위한 수퍼 사용자

인증은 각 리스너에 대해 독립적으로 구성됩니다. 권한 부여는 항상 전체 Kafka 클러스터에 대해 구성됩니다.

Cluster Operator는 리스너를 생성하고 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정하여 Kafka 클러스터 내에서 인증을 활성화합니다.

자체 인증서를 설치하여 Cluster Operator에서 생성한 인증서를 교체할 수 있습니다.

TLS 암호화가 활성화된 모든 리스너의 고유한 서버 인증서 및 개인 키를 제공할 수도 있습니다. 이러한 사용자 제공 인증서를 Kafka 리스너 인증서 라고 합니다. Kafka 리스너 인증서를 제공하면 조직의 프라이빗 CA 또는 공용 CA와 같은 기존 보안 인프라를 활용할 수 있습니다. Kafka 클라이언트는 리스너 인증서에 서명하는 데 사용된 CA를 신뢰해야 합니다. 필요한 경우 Kafka 리스너 인증서를 수동으로 갱신해야 합니다. 인증서는 PKCS #12 형식(.p12) 및 PEM(.crt) 형식으로 사용할 수 있습니다.

KafkaUser 를 사용하여 특정 클라이언트가 Kafka에 액세스하는 데 사용하는 인증 및 권한 부여 메커니즘을 활성화합니다.

다음을 설정하도록 KafkaUser 리소스를 구성합니다.

  • 활성화된 리스너 인증과 일치하도록 인증
  • 활성화된 Kafka 권한 부여와 일치하도록 권한 부여
  • 클라이언트에서 리소스 사용을 제어하기 위한 할당량

User Operator는 선택한 인증 유형을 기반으로 클라이언트 및 클라이언트 인증에 사용되는 보안 자격 증명을 나타내는 사용자를 생성합니다.

액세스 구성 속성에 대한 자세한 내용은 스키마 참조를 참조하십시오.

8.3.1. Kafka 브로커 보안

이 절차에서는 AMQ Streams를 실행할 때 Kafka 브로커 보안 단계를 보여줍니다.

Kafka 브로커에 대해 구현된 보안은 액세스가 필요한 클라이언트에 대해 구현된 보안과 호환되어야 합니다.

  • Kafka.spec.kafka.listeners[*].authenticationKafkaUser.spec.authentication과 일치합니다.
  • Kafka.spec.kafka.authorizationKafkaUser.spec.authorization

이 단계는 mTLS 인증을 사용하는 간단한 권한 부여 및 리스너에 대한 구성을 보여줍니다. 리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.

또는 리스너 인증에 SCRAM-SHA 또는 OAuth 2.0을 사용하고 OAuth 2.0 또는 Kafka 권한 부여 의 경우 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에 무제한 액세스할 수 있는 사용자 보안 주체 목록입니다. mTLS 인증이 사용되는 경우 CN 은 클라이언트 인증서의 공통 이름입니다.
      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 에 생성됩니다.

8.3.2. Kafka에 대한 사용자 액세스 보안

Kafka 사용자를 생성하거나 수정하여 Kafka 클러스터에 대한 보안 액세스가 필요한 클라이언트를 나타냅니다.

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 클라이언트를 구성하는 방법에 대한 자세한 내용은 7.3절. “리스너를 사용하여 Kafka 클러스터에 클라이언트 액세스 설정” 을 참조하십시오.

8.3.3. 네트워크 정책을 사용하여 Kafka 리스너에 대한 액세스 제한

networkPolicyPeers 속성을 사용하여 리스너에 대한 액세스를 선택한 애플리케이션으로만 제한할 수 있습니다.

사전 요구 사항

  • Ingress NetworkPolicies를 지원하는 OpenShift 클러스터입니다.
  • Cluster Operator가 실행 중입니다.

절차

  1. Kafka 리소스를 엽니다.
  2. networkPolicyPeers 속성에서 Kafka 클러스터에 액세스할 수 있는 애플리케이션 포드 또는 네임스페이스를 정의합니다.

    예를 들어 app 레이블이 있는 애플리케이션 Pod의 연결만 kafka-client 로 설정하도록 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

8.3.4. TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공

리스너는 Kafka 브로커에 대한 클라이언트 액세스를 제공합니다. TLS를 사용하여 클라이언트 액세스에 필요한 구성을 포함하여 Kafka 리소스에서 리스너를 구성합니다.

기본적으로 리스너는 AMQ Streams에서 생성한 내부 CA(인증 기관) 인증서에서 서명한 인증서를 사용합니다. Kafka 클러스터를 생성할 때 Cluster Operator에 의해 CA 인증서가 생성됩니다. TLS에 대한 클라이언트를 구성할 때 Kafka 클러스터를 확인하기 위해 신뢰 저장소 구성에 CA 인증서를 추가합니다. 자체 CA 인증서를 설치하고 사용할 수도 있습니다. 또는 brokerCertECDHEAndKey 속성을 사용하여 리스너를 구성하고 사용자 정의 서버 인증서를 사용할 수 있습니다.

brokerCertRoleBindingAndKey 속성을 사용하면 리스너 수준에서 자체 사용자 정의 인증서를 사용하여 Kafka 브로커에 액세스할 수 있습니다. 고유한 개인 키 및 서버 인증서를 사용하여 보안을 생성한 다음 리스너의 brokerCertCertECDHEAndKey 구성에 키 와 인증서를 지정합니다. 공용(외부) CA 또는 개인 CA에서 서명한 인증서를 사용할 수 있습니다. 공용 CA에서 서명한 경우 일반적으로 클라이언트의 신뢰 저장소 구성에 추가할 필요가 없습니다. 사용자 정의 인증서는 AMQ Streams에서 관리하지 않으므로 수동으로 갱신해야 합니다.

참고

리스너 인증서는 TLS 암호화 및 서버 인증에만 사용됩니다. TLS 클라이언트 인증에 사용되지 않습니다. TLS 클라이언트 인증에 자체 인증서를 사용하려면 자체 클라이언트 CA를 설치하고 사용해야 합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • 각 리스너에는 다음이 필요합니다.

    • 외부 CA에서 서명한 호환 서버 인증서입니다. (X.509 인증서를 PEM 형식으로 제공)

      여러 리스너에 하나의 리스너 인증서를 사용할 수 있습니다.

    • 주체 대체 이름(SAN)은 각 리스너의 인증서에 지정됩니다. 자세한 내용은 8.3.5절. “Kafka 리스너 서버 인증서의 대체 주체”의 내용을 참조하십시오.

자체 서명된 인증서를 사용하지 않는 경우 인증서에 전체 CA 체인을 포함하는 인증서를 제공할 수 있습니다.

리스너에 대해 TLS 암호화(tls: true)가 구성된 경우에만 brokerCert>-<AndKey 속성을 사용할 수 있습니다.

참고

AMQ Streams는 TLS에 대해 암호화된 개인 키 사용을 지원하지 않습니다. 시크릿에 저장된 개인 키는 이 기능이 작동하려면 암호화되지 않아야 합니다.

절차

  1. 개인 키 및 서버 인증서가 포함된 보안을 생성합니다.

    oc create secret generic my-secret --from-file=my-listener-key.key --from-file=my-listener-certificate.crt
  2. 클러스터의 Kafka 리소스를 편집합니다.

    configuration.brokerCertECDHEAndKey 속성에서 Secret, 인증서 파일 및 개인 키 파일을 사용하도록 리스너를 구성합니다.

    TLS 암호화가 활성화된 로드 밸런서 외부 리스너 구성 예

    # ...
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: external
        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 리스너 인증서를 업데이트하는 경우에도 시작됩니다.

8.3.5. Kafka 리스너 서버 인증서의 대체 주체

자체 Kafka 리스너 인증서와 함께 TLS 호스트 이름 확인을 사용하려면 각 리스너 에 올바른 SAN(Subject Alternative Names)을 사용해야 합니다. 인증서 SAN은 다음의 호스트 이름을 지정해야 합니다.

  • 클러스터의 모든 Kafka 브로커
  • Kafka 클러스터 부트스트랩 서비스

CA에서 지원하는 경우 와일드카드 인증서를 사용할 수 있습니다.

8.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

유형의 Wildcards 예: 내부 리스너

// 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

유형의 Wildcards 예: 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

8.3.5.2. 외부 리스너를 위한 SAN의 예

TLS 암호화가 활성화된 외부 리스너의 경우 인증서에서 지정해야 하는 호스트 이름은 외부 리스너 유형에 따라 다릅니다.

Expand
표 8.1. 각 유형의 외부 리스너에 대한 샌스
외부 리스너 유형SAN에서 지정합니다.…​

Ingress

모든 Kafka 브로커 Ingress 리소스의 주소 및 부트스트랩 Ingress 의 주소 .

일치하는 와일드카드 이름을 사용할 수 있습니다.

Route

모든 Kafka 브로커 경로 의 주소 및 부트스트랩 경로 의 주소 .

일치하는 와일드카드 이름을 사용할 수 있습니다.

loadbalancer

모든 Kafka 브로커 로드 밸런서 및 부트스트랩 로드 밸런서 주소 주소입니다.

일치하는 와일드카드 이름을 사용할 수 있습니다.

nodeport

Kafka 브로커 Pod를 예약할 수 있는 모든 OpenShift 작업자 노드의 주소입니다.

일치하는 와일드카드 이름을 사용할 수 있습니다.

8.4. OAuth 2.0 토큰 기반 인증 사용

AMQ Streams는 OAUTHB>-<ERPLAIN 메커니즘을 사용한 OAuth 2.0 인증 사용을 지원합니다.

OAuth 2.0을 사용하면 리소스에 대한 제한된 액세스 권한을 부여하는 토큰을 발행하기 위한 중앙 권한 부여 서버를 사용하여 애플리케이션 간 표준화된 토큰 기반 인증 및 권한 부여가 가능합니다.

OAuth 2.0 인증을 구성한 다음 OAuth 2.0 권한 부여 를 설정할 수 있습니다.

OAuth 2.0을 사용하도록 Kafka 브로커 및 클라이언트를 구성해야 합니다. OAuth 2.0 인증은 단순 또는 OPA 기반 Kafka 권한 부여 와 함께 사용할 수도 있습니다.

애플리케이션 클라이언트는 OAuth 2.0 토큰 기반 인증을 사용하여 계정 자격 증명을 노출하지 않고 애플리케이션 서버( 리소스 서버라고 함)의 리소스에 액세스할 수 있습니다.

애플리케이션 클라이언트는 권한 부여 수준을 결정하는 데 사용할 수 있는 인증 수단으로 액세스 토큰을 전달합니다. 권한 부여 서버는 액세스 권한 부여 및 문의를 처리합니다.

AMQ Streams의 컨텍스트에서 다음을 수행합니다.

  • Kafka 브로커는 OAuth 2.0 리소스 서버 역할을 합니다.
  • Kafka 클라이언트는 OAuth 2.0 애플리케이션 클라이언트 역할을 합니다.

Kafka 클라이언트는 Kafka 브로커에 대해 인증합니다. 브로커 및 클라이언트는 필요한 경우 OAuth 2.0 권한 부여 서버와 통신하여 액세스 토큰을 얻거나 검증합니다.

AMQ Streams 배포를 위해 OAuth 2.0 통합은 다음을 제공합니다.

  • Kafka 브로커에 대한 서버 측 OAuth 2.0 지원
  • Kafka MirrorMaker, Kafka Connect 및 Kafka Bridge에 대한 클라이언트 측 OAuth 2.0 지원

8.4.1. OAuth 2.0 인증 메커니즘

AMQ Streams는 OAuth 2.0 인증을 위해 OAUTHBISTRAER 및 PLAIN 메커니즘을 지원합니다. 두 메커니즘을 모두 사용하면 Kafka 클라이언트가 Kafka 브로커와 인증 세션을 설정할 수 있습니다. 클라이언트, 권한 부여 서버 및 Kafka 브로커 간의 인증 흐름은 각 메커니즘마다 다릅니다.

가능하면 언제든지 OAUTHBECDHEER를 사용하도록 클라이언트를 구성하는 것이 좋습니다. OAUTHBLOGER는 클라이언트 자격 증명이 Kafka 브로커와 공유되지 않기 때문에 PLAIN보다 높은 수준의 보안을 제공합니다. OAUTHB topicER를 지원하지 않는 Kafka 클라이언트에만 PLAIN을 사용하는 것이 좋습니다.

클라이언트 연결에 OAuth 2.0 인증을 사용하도록 Kafka 브로커 리스너를 구성합니다. 필요한 경우 동일한 oauth 리스너에서 OAUTHBISTRAER 및 PLAIN 메커니즘을 사용할 수 있습니다. 각 메커니즘을 지원하는 속성을 oauth 리스너 구성에 명시적으로 지정해야 합니다.

AUTHBLOGER 개요

OAUTHBISTRAER는 Kafka 브로커의 oauth 리스너 구성에서 자동으로 활성화됩니다. 이 속성은 필수는 아니지만 enableOauthBearer 속성을 true 로 설정할 수 있습니다.

  # ...
  authentication:
    type: oauth
    # ...
    enableOauthBearer: true

많은 Kafka 클라이언트 도구는 프로토콜 수준에서 OAUTHB topicER에 대한 기본 지원을 제공하는 라이브러리를 사용합니다. 애플리케이션 개발을 지원하기 위해 AMQ Streams는 업스트림 Kafka 클라이언트 Java 라이브러리에 대한 OAuth 콜백 핸들러 를 제공합니다(다른 라이브러리에서는 제외). 따라서 자체 콜백 핸들러를 작성할 필요가 없습니다. 애플리케이션 클라이언트는 콜백 처리기를 사용하여 액세스 토큰을 제공할 수 있습니다. Go와 같은 다른 언어로 작성된 클라이언트는 사용자 정의 코드를 사용하여 권한 부여 서버에 연결하고 액세스 토큰을 받아야 합니다.

OAUTHBLOGER를 사용하면 클라이언트는 인증 정보 교환을 위해 Kafka 브로커와 세션을 시작합니다. 여기서 자격 증명은 콜백 처리기에서 제공하는 전달자 토큰의 형식을 취합니다. 콜백을 사용하면 다음 세 가지 방법 중 하나로 토큰 프로비저닝을 구성할 수 있습니다.

  • 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
  • 구성 시 수동으로 가져온 장기 액세스 토큰
  • 구성 시 수동으로 가져온 장기 새로 고침 토큰
참고

프로토콜 수준에서 OAUTHBREER 메커니즘을 지원하는 Kafka 클라이언트에서만 인증을 사용할 수 있습니다.

PLAIN 개요

PLAIN을 사용하려면 Kafka 브로커의 oauth 리스너 구성에서 활성화해야 합니다.

다음 예에서 PLAIN은 OAUTHBECDHEER 외에 기본적으로 활성화되어 있습니다. PLAIN만 사용하려면 enableOauthBearerfalse 로 설정하여 OAUTHBLOGER를 비활성화할 수 있습니다.

  # ...
  authentication:
    type: oauth
    # ...
    enablePlain: true
    tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token

PLAIN은 모든 Kafka 클라이언트 툴에서 사용하는 간단한 인증 메커니즘입니다. PLAIN을 OAuth 2.0 인증과 함께 사용할 수 있도록 AMQ Streams는 PLAIN 서버 측 콜백을 통해 OAuth 2.0 을 제공합니다.

PLAIN의 AMQ Streams 구현을 사용하면 클라이언트 인증 정보가 ZooKeeper에 저장되지 않습니다. 대신 클라이언트 자격 증명은 OAUTHB learnER 인증이 사용될 때와 유사하게 호환 권한 부여 서버 뒤에 중앙에서 처리됩니다.

OAuth 2.0 over PLAIN 콜백과 함께 사용하면 Kafka 클라이언트는 다음 방법 중 하나를 사용하여 Kafka 브로커로 인증합니다.

  • 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
  • 구성 시 수동으로 가져온 장기 액세스 토큰

두 방법 모두 클라이언트는 PLAIN 사용자 이름암호 속성을 제공하여 인증서를 Kafka 브로커에 전달해야 합니다. 클라이언트는 이러한 속성을 사용하여 클라이언트 ID와 시크릿 또는 사용자 이름 및 액세스 토큰을 전달합니다.

클라이언트 ID 및 시크릿은 액세스 토큰을 가져오는 데 사용됩니다.

액세스 토큰은 암호 속성 값으로 전달됩니다. $accessToken: 접두사를 사용하거나 사용하지 않고 액세스 토큰을 전달합니다.

  • 리스너 구성에서 토큰 끝점(tokenEndpointUri)을 구성하는 경우 접두사가 필요합니다.
  • 리스너 구성에서 토큰 끝점(tokenEndpointUri)을 구성하지 않으면 접두사가 필요하지 않습니다. Kafka 브로커는 암호를 원시 액세스 토큰으로 해석합니다.

암호 가 액세스 토큰으로 설정된 경우 사용자 이름을 Kafka 브로커가 액세스 토큰에서 가져오는 동일한 보안 이름으로 설정해야 합니다. userNameClaim,fallbackUserNameClaim,fallbackUsernamePrefixuserInfoEndpointUri 속성을 사용하여 리스너에서 사용자 이름 추출 옵션을 지정할 수 있습니다. 사용자 이름 추출 프로세스는 권한 부여 서버(특히 클라이언트 ID를 계정 이름에 매핑하는 방법)에 따라 달라집니다.

참고

PLAIN을 통한 OAuth는 암호 부여 메커니즘을 지원하지 않습니다. SASL PLAIN을 통해 'proxy'를 통해 클라이언트 자격 증명(client Id + secret) 또는 위에 설명된 액세스 토큰을 메커니즘할 수 있습니다.

8.4.2. OAuth 2.0 Kafka 브로커 구성

OAuth 2.0의 Kafka 브로커 구성은 다음과 같습니다.

  • 권한 부여 서버에서 OAuth 2.0 클라이언트 생성
  • Kafka 사용자 정의 리소스에서 OAuth 2.0 인증 구성
참고

권한 부여 서버와 관련하여 Kafka 브로커 및 Kafka 클라이언트는 모두 OAuth 2.0 클라이언트로 간주됩니다.

8.4.2.1. 권한 부여 서버의 OAuth 2.0 클라이언트 구성

세션 시작 중에 수신된 토큰을 확인하도록 Kafka 브로커를 구성하려면 다음 클라이언트 인증 정보를 사용하여 권한 부여 서버에 OAuth 2.0 클라이언트 정의를 생성하는 것이 좋습니다.

  • kafka 의 클라이언트 ID(예:)
  • 인증 메커니즘으로서의 클라이언트 ID 및 시크릿
참고

권한 부여 서버의 공용이 아닌 인트로스펙션 끝점을 사용하는 경우에만 클라이언트 ID와 시크릿을 사용해야 합니다. 빠른 로컬 JWT 토큰 검증과 마찬가지로 공용 권한 부여 서버 끝점을 사용할 때는 일반적으로 자격 증명이 필요하지 않습니다.

8.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 인증을 구성할 수 있습니다. OAuth 2.0 인증을 TLS 암호화(tls: true)와 함께 사용하는 것이 좋습니다. 암호화가 없으면 연결은 네트워크 도약 및 토큰 도용을 통한 무단 액세스에 취약합니다.

보안 전송 계층이 클라이언트와 통신할 수 있도록 type: oauth 를 사용하여 외부 리스너를 구성합니다.

외부 리스너에서 OAuth 2.0 사용

# ...
listeners:
  - name: external
    port: 9094
    type: loadbalancer
    tls: true
    authentication:
      type: oauth
    #...

tls 속성은 기본적으로 false 이므로 활성화해야 합니다.

인증 유형을 OAuth 2.0으로 정의한 경우 빠른 로컬 JWT 검증 또는 인트로스펙션 끝점을 사용하여 토큰 검증 유형으로 구성을 추가합니다.

리스너에 대해 OAuth 2.0을 구성하는 절차는 Kafka 브로커에 대한 OAuth 2.0 지원 구성에 설명되어 있습니다.

8.4.2.3. 빠른 로컬 JWT 토큰 검증 구성

빠른 로컬 JWT 토큰 검증은 JWT 토큰 서명을 로컬에서 확인합니다.

로컬 검사에서 토큰을 확인합니다.

  • 액세스 토큰에 대한 Bearer 의 (typ) 클레임 값을 포함하여 유형을 준수합니다.
  • 유효 ( 만료되지 않음)
  • 유효한IssuerURI와 일치하는 발급자가 있습니다.

권한 부여 서버에서 발행하지 않은 모든 토큰이 거부되도록 리스너를 구성할 때 validIssuerURI 속성을 지정합니다.

빠른 로컬 JWT 토큰 검증 중에 권한 부여 서버에 연결할 필요가 없습니다. OAuth 2.0 인증 서버에서 노출하는 끝점인 jwksEndpointUri 속성을 지정하여 빠른 로컬 JWT 토큰 검증을 활성화합니다. 엔드포인트에는 Kafka 클라이언트에서 인증 정보로 전송되는 서명된 JWT 토큰의 유효성을 확인하는 데 사용되는 공개 키가 포함되어 있습니다.

참고

권한 부여 서버와의 모든 통신은 TLS 암호화를 사용하여 수행해야 합니다.

AMQ Streams 프로젝트 네임스페이스에서 인증서 신뢰 저장소를 OpenShift Secret으로 구성하고 tlsTrustedCertificates 속성을 사용하여 신뢰 저장소 파일이 포함된 OpenShift 보안을 가리킬 수 있습니다.

JWT 토큰에서 사용자 이름을 올바르게 추출하도록 userNameClaim 을 구성할 수 있습니다. 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
    #...

8.4.2.4. OAuth 2.0 인트로스펙션 엔드 포인트 구성

OAuth 2.0 인트로스펙션 끝점을 사용한 토큰 검증은 수신된 액세스 토큰을 opaque로 처리합니다. 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

8.4.3. Kafka 브로커에 대한 세션 재인증

Kafka 클라이언트와 Kafka 브로커 간의 OAuth 2.0 세션에 대한 Kafka 세션 재인증 을 사용하도록 oauth 리스너를 구성할 수 있습니다. 이 메커니즘은 정의된 기간 후에 클라이언트와 브로커 간에 인증된 세션의 만료를 적용합니다. 세션이 만료되면 클라이언트는 기존 연결을 삭제하는 대신 기존 연결을 재사용하여 새 세션을 즉시 시작합니다.

세션 재인증은 기본적으로 비활성화되어 있습니다. 이를 활성화하려면 oauth 리스너 구성에서 maxSecondsWithoutReauthentication 의 시간 값을 설정합니다. 동일한 속성이 OAUTHB topicER 및 PLAIN 인증에 대한 세션 재인증을 구성하는 데 사용됩니다. 예제 구성은 8.4.6.2절. “Kafka 브로커에 대한 OAuth 2.0 지원 구성” 에서 참조하십시오.

세션 재인증은 클라이언트에서 사용하는 Kafka 클라이언트 라이브러리에서 지원해야 합니다.

세션 재인증은 빠른 로컬 JWT 또는 인트로스펙션 끝점 토큰 검증과 함께 사용할 수 있습니다.

클라이언트 재인증

브로커의 인증된 세션이 만료되면 클라이언트는 연결을 삭제하지 않고 유효한 새 액세스 토큰을 브로커에 전송하여 기존 세션으로 다시 인증해야 합니다.

토큰 검증에 성공하면 기존 연결을 사용하여 새 클라이언트 세션이 시작됩니다. 클라이언트가 다시 인증되지 않으면 브로커는 메시지 전송 또는 수신을 위해 추가 시도를 수행하면 연결을 종료합니다. 브로커에서 재인증 메커니즘이 활성화된 경우 Kafka 클라이언트 라이브러리 2.2 이상을 사용하는 Java 클라이언트는 자동으로 다시 인증됩니다.

세션 재인증은 사용하는 경우 새로 고침 토큰에도 적용됩니다. 세션이 만료되면 클라이언트는 새로 고침 토큰을 사용하여 액세스 토큰을 새로 고칩니다. 그런 다음 클라이언트는 새 액세스 토큰을 사용하여 기존 세션으로 다시 인증합니다.

OAUTHBREER 및 PLAIN의 세션 만료

세션 재인증이 구성되면 세션 만료가 OAUTHB topicER 및 PLAIN 인증에 다르게 작동합니다.

OAUTHBREER 및 PLAIN의 경우 클라이언트 ID 및 시크릿 방법을 사용합니다.

  • 브로커의 인증된 세션은 구성된 maxSecondsWithoutReauthentication 에서 만료됩니다.
  • 구성된 시간 전에 액세스 토큰이 만료되면 세션이 일찍 만료됩니다.

수명이 긴 액세스 토큰 방법을 사용하는 PLAIN의 경우:

  • 브로커의 인증된 세션은 구성된 maxSecondsWithoutReauthentication 에서 만료됩니다.
  • 구성된 시간 이전에 액세스 토큰이 만료되면 재인증이 실패합니다. 세션 재인증이 시도되지만 PLAIN에는 토큰을 새로 고치는 메커니즘이 없습니다.

maxSecondsWithoutReauthentication구성되지 않은 경우 다시 인증되지 않고도 OAUTHB>-<ER 및 PLAIN 클라이언트는 브로커에 영구적으로 연결된 상태로 유지될 수 있습니다. 인증된 세션은 액세스 토큰 만료로 끝나지 않습니다. 그러나 이는 예를 들어 keycloak 인증을 사용하거나 사용자 정의 인증 기관을 설치하여 권한을 구성할 때 고려할 수 있습니다.

8.4.4. OAuth 2.0 Kafka 클라이언트 구성

Kafka 클라이언트는 다음 중 하나로 구성됩니다.

  • 권한 부여 서버에서 유효한 액세스 토큰을 가져오는 데 필요한 인증 정보(클라이언트 ID 및 시크릿)
  • 권한 부여 서버에서 제공하는 툴을 사용하여 얻은 유효한 장기 액세스 토큰 또는 새로 고침 토큰

Kafka 브로커에 전송된 유일한 정보는 액세스 토큰입니다. 액세스 토큰을 얻기 위해 권한 부여 서버를 통해 인증하는 데 사용되는 인증 정보는 브로커로 전송되지 않습니다.

클라이언트에서 액세스 토큰을 가져오는 경우 권한 부여 서버와 더 이상 통신할 필요가 없습니다.

가장 간단한 메커니즘은 클라이언트 ID 및 시크릿을 사용한 인증입니다. 장기 액세스 토큰 또는 수명이 긴 새로 고침 토큰을 사용하면 권한 부여 서버 도구에 대한 추가 종속성이 있으므로 복잡성이 추가됩니다.

참고

수명이 긴 액세스 토큰을 사용하는 경우 토큰의 최대 수명을 늘리도록 권한 부여 서버에서 클라이언트를 구성해야 할 수 있습니다.

Kafka 클라이언트가 액세스 토큰으로 직접 구성되지 않은 경우 클라이언트는 권한 부여 서버에 연결하여 Kafka 세션 시작 중에 액세스 토큰에 대한 인증 정보를 전송합니다. Kafka 클라이언트가 다음 중 하나를 교환합니다.

  • 클라이언트 ID 및 시크릿
  • 클라이언트 ID, 새로 고침 토큰 및 (선택 사항) 시크릿
  • 사용자 이름 및 암호, 클라이언트 ID 및 (선택 사항) 시크릿

8.4.5. OAuth 2.0 클라이언트 인증 흐름

OAuth 2.0 인증 흐름은 기본 Kafka 클라이언트 및 Kafka 브로커 구성에 따라 다릅니다. 사용된 권한 부여 서버에서도 이 흐름을 지원해야 합니다.

Kafka 브로커 리스너 구성은 클라이언트가 액세스 토큰을 사용하여 인증하는 방법을 결정합니다. 클라이언트는 클라이언트 ID와 시크릿을 전달하여 액세스 토큰을 요청할 수 있습니다.

리스너가 PLAIN 인증을 사용하도록 구성된 경우 클라이언트는 클라이언트 ID와 시크릿 또는 사용자 이름 및 액세스 토큰으로 인증할 수 있습니다. 이러한 값은 PLAIN 메커니즘의 사용자 이름암호 속성으로 전달됩니다.

리스너 구성은 다음 토큰 검증 옵션을 지원합니다.

  • 권한 부여 서버에 연결하지 않고도 JWT 서명 확인 및 로컬 토큰 인트로스펙션을 기반으로 빠른 로컬 토큰 검증을 사용할 수 있습니다. 권한 부여 서버는 토큰의 서명을 확인하는 데 사용되는 공용 인증서가 포함된 JWKS 엔드포인트를 제공합니다.
  • 권한 부여 서버에서 제공하는 토큰 인트로스펙션 끝점에 대한 호출을 사용할 수 있습니다. 새 Kafka 브로커 연결이 설정될 때마다 브로커는 클라이언트에서 인증된 액세스 토큰을 권한 부여 서버로 전달합니다. Kafka 브로커는 응답을 확인하여 토큰이 유효한지 여부를 확인합니다.
참고

권한 부여 서버에서는 불투명 액세스 토큰만 사용할 수 있으므로 로컬 토큰 검증이 불가능합니다.

Kafka 클라이언트 인증 정보는 다음 유형의 인증에 대해 구성할 수도 있습니다.

  • 이전에 생성된 장기 액세스 토큰을 사용한 직접 로컬 액세스
  • 새 액세스 토큰이 발행될 수 있도록 권한 서버와 연결합니다(클라이언트 ID와 시크릿 또는 새로 고침 토큰 또는 사용자 이름 및 암호 사용)

SASL OAUTHB topicER 메커니즘을 사용하여 Kafka 인증에 대해 다음 통신 흐름을 사용할 수 있습니다.

클라이언트 ID 및 보안을 사용하는 클라이언트, 브로커가 권한 부여 서버에 대한 검증을 위임함

Client using client ID and secret with broker delegating validation to authorization server

  1. Kafka 클라이언트는 클라이언트 ID 및 시크릿과 선택적으로 새로 고침 토큰을 사용하여 권한 부여 서버에서 액세스 토큰을 요청합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
  2. 권한 부여 서버는 새 액세스 토큰을 생성합니다.
  3. Kafka 클라이언트는 SASL OAUTHB>-<ER 메커니즘을 사용하여 액세스 토큰을 전달하는 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 OAUTHB>-<ER 메커니즘을 사용하여 액세스 토큰을 전달하는 Kafka 브로커로 인증합니다.
  4. Kafka 브로커는 JWT 토큰 서명 확인 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬에서 검증합니다.

장기 액세스 토큰을 사용하는 클라이언트 및 인증 서버에 대한 검증을 위임하는 브로커

Client using long-lived access token with broker delegating validation to authorization server

  1. Kafka 클라이언트는 SASL OAUTHB>-<ER 메커니즘을 사용하여 장기간의 액세스 토큰을 전달하는 Kafka 브로커로 인증합니다.
  2. Kafka 브로커는 자체 클라이언트 ID 및 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 끝점을 호출하여 액세스 토큰을 검증합니다.
  3. 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.

빠른 로컬 검증 수행 브로커를 통해 장기 액세스 토큰을 사용하는 클라이언트

Client using long-lived access token with broker performing fast local validation

  1. Kafka 클라이언트는 SASL OAUTHB>-<ER 메커니즘을 사용하여 장기간의 액세스 토큰을 전달하는 Kafka 브로커로 인증합니다.
  2. Kafka 브로커는 JWT 토큰 서명 확인 및 로컬 토큰 인트로스펙션을 사용하여 로컬에서 액세스 토큰을 검증합니다.
주의

빠른 로컬 JWT 토큰 서명 검증은 토큰이 취소된 경우 권한 부여 서버에 검사가 없기 때문에 수명이 짧은 토큰에만 적합합니다. 토큰 만료는 토큰에 기록되지만 해지는 언제든지 발생할 수 있으므로 권한 부여 서버에 연결하지 않으면 이를 고려할 수 없습니다. 발행된 모든 토큰은 만료될 때까지 유효한 것으로 간주됩니다.

8.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 브로커는 토큰 끝점을 사용하여 clientId시크릿 을 권한 부여 서버에 전달합니다.
  3. 클라이언트 인증 정보가 유효하지 않은 경우 권한 부여 서버에서 새 액세스 토큰 또는 오류를 반환합니다.
  4. Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.

    1. 토큰 인트로스펙션 엔드 포인트가 지정되면 Kafka 브로커는 권한 부여 서버에서 끝점을 호출하여 액세스 토큰을 검증합니다. 토큰 검증에 성공하면 세션이 설정됩니다.
    2. 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 수행되지 않습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 로컬에서 액세스 토큰을 검증합니다.

클라이언트 ID 및 시크릿 없이 장기 액세스 토큰을 사용하는 클라이언트

Client using a long-lived access token without a client ID and secret

  1. Kafka 클라이언트는 사용자 이름과 암호를 전달합니다. password는 클라이언트를 실행하기 전에 수동으로 가져와 구성한 액세스 토큰의 값을 제공합니다.
  2. 암호는 Kafka 브로커 리스너가 인증을 위해 토큰 끝점으로 구성되었는지에 따라 $accessToken: 문자열 접두사를 사용하여 전달됩니다.

    1. 토큰 끝점이 구성된 경우 브로커에 클라이언트 시크릿 대신 액세스 토큰이 포함되어 있음을 알리기 위해 암호 앞에 $accessToken: 접두사가 추가해야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다.
    2. Kafka 브로커 리스너에 토큰 끝점이 구성되지 않은 경우( no-client-credentials 모드강화) 암호는 접두사 없이 액세스 토큰을 제공해야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다. 이 모드에서 클라이언트는 클라이언트 ID와 시크릿을 사용하지 않으며 password 매개변수는 항상 원시 액세스 토큰으로 해석됩니다.
  3. Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.

    1. 토큰 인트로스펙션 엔드 포인트가 지정되면 Kafka 브로커는 권한 부여 서버에서 끝점을 호출하여 액세스 토큰을 검증합니다. 토큰 검증에 성공하면 세션이 설정됩니다.
    2. 로컬 토큰 인트로스펙션을 사용하는 경우 권한 부여 서버에 대한 요청이 없습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 로컬에서 액세스 토큰을 검증합니다.

8.4.6. OAuth 2.0 인증 구성

OAuth 2.0은 Kafka 클라이언트와 AMQ Streams 구성 요소 간의 상호 작용에 사용됩니다.

AMQ Streams에 OAuth 2.0을 사용하려면 다음을 수행해야 합니다.

8.4.6.1. OAuth 2.0 권한 부여 서버 구성

이 절차에서는 일반적으로 AMQ Streams와의 통합을 위해 권한 부여 서버를 구성하기 위해 수행해야 하는 작업을 설명합니다.

이 지침은 제품에 특정하지 않습니다.

단계는 선택한 권한 부여 서버에 따라 다릅니다. OAuth 2.0 액세스 설정 방법에 대한 정보는 권한 부여 서버의 제품 설명서를 참조하십시오.

참고

권한 부여 서버가 이미 배포된 경우 배포 단계를 건너뛰고 현재 배포를 사용할 수 있습니다.

절차

  1. 클러스터에 권한 부여 서버를 배포합니다.
  2. 인증 서버의 CLI 또는 관리 콘솔에 액세스하여 AMQ Streams에 대한 OAuth 2.0을 구성합니다.

    이제 AMQ Streams에서 작동하도록 권한 부여 서버를 준비합니다.

  3. kafka-broker 클라이언트를 구성합니다.
  4. 애플리케이션의 각 Kafka 클라이언트 구성 요소에 대해 클라이언트를 구성합니다.

다음에 수행할 작업

권한 부여 서버를 배포 및 구성한 후 OAuth 2.0을 사용하도록 Kafka 브로커를 구성합니다.

8.4.6.2. Kafka 브로커에 대한 OAuth 2.0 지원 구성

다음 절차에서는 인증 서버를 사용하여 브로커 리스너가 OAuth 2.0 인증을 사용하도록 활성화되도록 Kafka 브로커를 구성하는 방법을 설명합니다.

tls: true 가 있는 리스너를 통해 암호화된 인터페이스를 통해 OAuth 2.0을 사용하는 것이 좋습니다. 일반 리스너는 권장되지 않습니다.

권한 부여 서버가 신뢰할 수 있는 CA에서 서명한 인증서를 사용하고 OAuth 2.0 서버 호스트 이름과 일치하는 경우 TLS 연결은 기본 설정을 사용하여 작동합니다. 그렇지 않으면 적절한 인증서로 신뢰 저장소를 구성하거나 인증서 호스트 이름 검증을 비활성화해야 할 수 있습니다.

Kafka 브로커를 구성할 때 새로 연결된 Kafka 클라이언트의 OAuth 2.0 인증 중에 액세스 토큰을 검증하는 데 사용되는 메커니즘에 대한 두 가지 옵션이 있습니다.

시작하기 전에

Kafka 브로커 리스너의 OAuth 2.0 인증 구성에 대한 자세한 내용은 다음을 참조하십시오.

사전 요구 사항

  • AMQ Streams 및 Kafka가 실행 중입니다.
  • OAuth 2.0 인증 서버가 배포됨

절차

  1. 편집기에서 Kafka 리소스의 Kafka 브로커 구성(Kafka.spec.kafka)을 업데이트합니다.

    oc edit kafka my-cluster
  2. Kafka 브로커 리스너 구성을 구성합니다.

    각 유형의 리스너에 대한 구성은 서로 독립적이므로 동일하지 않아도 됩니다.

    다음 예제에서는 외부 리스너에 대해 구성된 구성 옵션을 보여줍니다.

    예 1: 빠른 로컬 JWT 토큰 검증 구성

    #...
    - name: external
      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
    토큰에 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 사용자 이름은 사용자를 식별하는 데 사용되는 보안 주체 입니다. userNameClaim 값은 인증 흐름과 사용된 권한 부여 서버에 따라 달라집니다.
    5
    (선택 사항) 액세스 토큰과 동일한 기간 동안 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료되기 위해 남은 시간보다 작으면 실제 토큰 만료 전에 클라이언트가 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되면 세션이 만료되지 않으며 클라이언트는 재인증을 시도하지 않습니다.
    6
    (선택 사항) 권한 부여 서버에 대한 TLS 연결에 필요한 신뢰할 수 있는 인증서입니다.
    7
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    8
    JWKS 인증서는 만료되기 전에 유효한 것으로 간주됩니다. 기본값은 360 초입니다. 더 긴 시간을 지정하는 경우 취소된 인증서에 대한 액세스를 허용할 위험을 고려하십시오.
    9
    JWKS 인증서 새로 고침 간격입니다. 간격은 만료 간격보다 최소 60초 짧어야 합니다. 기본값은 300 초입니다.
    10
    연속한 시도 사이에 최소 일시 정지(초)는 JWKS 공개 키를 새로 고침합니다. 알 수 없는 서명 키가 발생하면 JWKS 키 새로 고침은 마지막 새로 고침 시도 이후 지정된 일시 중지를 포함하여 정기적인 일정 외부에서 예약됩니다. 키를 새로 고치면 exponential 백오프 규칙을 따르고 jwksRefreshSeconds 에 도달할 때까지 일시 중지를 계속 늘리면 실패한 새로 고침을 다시 시도합니다. 기본값은 1입니다.

    예 2: 인트로스펙션 끝점을 사용하여 토큰 검증 구성

    - name: external
      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
    토큰에 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 사용자 이름은 사용자를 식별하는 데 사용되는 보안 주체 입니다. userNameClaim 값은 사용된 권한 부여 서버에 따라 달라집니다.
    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://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/userinfo 
    6
    
        enableOauthBearer: false 
    7
    
        enablePlain: true 
    8
    
        tokenEndpointUri: https://OAUTH-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
    1
    권한 부여 서버에서 iss 클레임을 제공하지 않으면 발급자 검사를 수행할 수 없습니다. 이 경우 checkIssuerfalse 로 설정하고 validIssuerUri 를 지정하지 마십시오. 기본값은 true 입니다.
    2
    권한 부여 서버에서 aud (audience) 클레임을 제공하고 오디언스 검사를 적용하려면 checkAudiencetrue 로 설정합니다. 대상 검사에서 의도된 토큰 수신자를 식별합니다. 결과적으로 Kafka 브로커는 aud 클레임에 clientId 가 없는 토큰을 거부합니다. 기본값은 false 입니다.
    3
    권한 부여 서버는 일반 사용자와 클라이언트를 모두 식별하는 단일 속성을 제공하지 않을 수 있습니다. 클라이언트가 자체 이름으로 인증되면 서버에서 클라이언트 ID 를 제공할 수 있습니다. 사용자 이름과 암호를 사용하여 인증할 때 새로 고침 토큰 또는 액세스 토큰을 얻기 위해 서버는 클라이언트 ID 외에도 username 속성을 제공할 수 있습니다. 기본 사용자 ID 속성을 사용할 수 없는 경우 사용할 사용자 이름 클레임(attribute)을 지정하려면 이 대체 옵션을 사용합니다.
    4
    fallbackUserNameClaim 이 적용되는 상황에서는 사용자 이름 클레임 값과 대체 사용자 이름 클레임의 값 간에 이름 충돌을 방지해야 할 수도 있습니다. 생산자라는 클라이언트뿐만 아니라 생산자 라는 일반 사용자도 존재하는 상황을 고려하십시오. 이 속성을 사용하여 클라이언트의 사용자 ID에 접두사를 추가할 수 있습니다.You can use this property to add a prefix to the user ID of the client.
    5
    (사용 중인 권한 부여 서버에 따라 introspectionEndpointUri를 사용하는 경우에만 적용 가능) 인트로스펙션 끝점에서 토큰 유형 특성을 반환하거나 반환하지 않거나 다른 값을 포함할 수 있습니다. 인트로스펙션 끝점의 응답에 포함해야 하는 유효한 토큰 유형 값을 지정할 수 있습니다.
    6
    (Introspection EndpointUri를 사용하는 경우에만) 권한 부여 서버는 Introspection Endpoint 응답으로 식별 가능한 정보를 제공하지 않도록 구성되거나 구현될 수 있습니다. 사용자 ID를 가져오려면 userinfo 끝점의 URI를 폴백으로 구성할 수 있습니다. userNameClaim,fallbackUserNameClaim, fallbackUserNamePrefix 설정이 userinfo 끝점의 응답에 적용됩니다.
    7
    이 값을 false 로 설정하여 리스너에서 OAUTHBREER 메커니즘을 비활성화합니다. 최소 하나의 PLAIN 또는 OAUTHB possibilityER를 사용하도록 설정해야 합니다. 기본값은 true 입니다.
    8
    모든 플랫폼의 클라이언트에 대해 지원되는 리스너에서 PLAIN 인증을 활성화하려면 true 로 설정합니다.
    9
    PLAIN 메커니즘에 대한 추가 구성입니다. 지정된 경우 클라이언트는 $accessToken: 접두사 를 사용하여 액세스 토큰을 암호로 전달하여 PLAIN을 통해 인증할 수 있습니다. 프로덕션의 경우 항상 https:// URL을 사용합니다.
    10
    이 값을 JsonPath 필터 쿼리로 설정하여 검증 중에 JWT 액세스 토큰에 추가 사용자 지정 규칙을 적용할 수 있습니다. 액세스 토큰에 필요한 데이터가 포함되어 있지 않으면 거부됩니다. introspectionEndpointUri 를 사용하는 경우 사용자 정의 검사가 인트로스펙션 끝점 응답 JSON에 적용됩니다.
    11
    토큰 끝점에 전달된 대상 매개변수입니다. 구독자 간 인증을 위한 액세스 토큰을 가져올 때 대상 사용자가 사용됩니다.An audience is used when obtaining an access token for inter-broker authentication. 또한 clientId시크릿 을 사용하여 PLAIN 클라이언트 인증을 통해 OAuth 2.0에 대한 클라이언트 이름에 사용됩니다. 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠만 가져올 수 있습니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다.
    12
    토큰 끝점에 전달된 범위 매개변수입니다. 범위는broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다. 또한 clientId시크릿 을 사용하여 PLAIN 클라이언트 인증을 통해 OAuth 2.0에 대한 클라이언트 이름에 사용됩니다. 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠만 가져올 수 있습니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다.
    13
    권한 부여 서버에 연결할 때 연결 제한 시간(초)입니다. 기본값은 60입니다.
    14
    권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    15
    권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션에 대한 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에서 사용할 수 없게 할 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
    16
    권한 부여 서버에 실패한 HTTP 요청의 다른 재시도를 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 일시 중지가 적용되지 않습니다. 실패한 요청으로 인해 많은 문제가 요청별 네트워크 결함 또는 프록시 문제로 신속하게 해결될 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하 상태에 있거나 트래픽이 높은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 재시도 횟수 가능성을 높일 수 있습니다.
    17
    JWT 토큰 또는 인트로스펙션 끝점 응답에서 그룹 정보를 추출하는 데 사용되는 JsonPath 쿼리입니다. 이 옵션은 기본적으로 설정되어 있지 않습니다. 이 옵션을 구성하면 사용자 정의 작성자가 사용자 그룹을 기반으로 권한 결정을 내릴 수 있습니다.
    18
    하나의 구분된 단일 문자열로 반환될 때 그룹 정보를 구문 분석하는 데 사용되는 구분 기호입니다. 기본값은 ','(comma)입니다.
  3. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
  4. 로그 또는 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w

    롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.

8.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 권한 부여 서버에 대한 보안 연결(http://)에는 truststore 구성이 필요합니다. OAuth 2.0 권한 부여 서버를 확인하려면 권한 부여 서버의 CA 인증서를 클라이언트 구성의 신뢰 저장소에 추가합니다. PEM 또는 PKCS #12 형식으로 신뢰 저장소를 구성할 수 있습니다.

  • Kafka SASL 메커니즘:

    • 전달자 토큰 사용하여 자격 증명 교환을 위한 태그
    • 클라이언트 인증 정보(clientId + secret) 또는 액세스 토큰을 전달하는 PLAIN
  • SASL 메커니즘을 구현하는 module(Java Authentication and Authorization Service) 모듈:

    • org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule
    • org.apache.kafka.common.security.plain.PlainLoginModule 은 PLAIN 메커니즘을 구현합니다.
  • 다음 인증 방법을 지원하는 SASL 인증 속성:

    • OAuth 2.0 클라이언트 자격 증명
    • OAuth 2.0 암호 부여(더 이상 사용되지 않음)
    • 액세스 토큰
    • 토큰 새로 고침

SASL 인증 속성을 10.0.0.1 구성(sasl.jaas.config)으로 추가합니다. 인증 속성을 구성하는 방법은 OAuth 2.0 권한 부여 서버에 액세스하는 데 사용 중인 인증 방법에 따라 다릅니다. 이 절차에서는 속성 파일에 속성이 지정된 다음 클라이언트 구성으로 로드됩니다.

참고

인증 속성을 환경 변수로 또는 Java 시스템 속성으로 지정할 수도 있습니다. Java 시스템 속성의 경우 setProperty 를 사용하여 -D 옵션을 사용하여 명령줄에서 설정할 수 있습니다.

사전 요구 사항

  • AMQ Streams 및 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.12.0.redhat-00006</version>
    </dependency>
  2. 속성 파일에 다음 구성을 지정하여 클라이언트 속성을 구성합니다.

    • 보안 프로토콜
    • SASL 메커니즘
    • 사용 중인 방법에 따른 module 및 인증 속성

      예를 들어 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

      1
      TLS 암호화 연결을 위한 SASL_SSL 보안 프로토콜. 로컬 개발에만 암호화되지 않은 연결에서는 SASL_PLAINTEXT 를 사용하십시오.
      2
      SASL 메커니즘을 OAUTHB learnER 또는 PLAIN 으로 지정합니다.
      3
      Kafka 클러스터에 대한 보안 액세스를 위한 신뢰 저장소 구성입니다.
      4
      권한 부여 서버 토큰 끝점의 URI입니다.
      5
      클라이언트 ID: 권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름입니다.
      6
      권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
      7
      위치에는 권한 부여 서버의 공개 키 인증서(truststore.p12)가 포함됩니다.
      8
      신뢰 저장소에 액세스하기 위한 암호입니다.
      9
      truststore 유형입니다.
      10
      (선택 사항) 토큰 끝점에서 토큰을 요청하는 범위입니다. 권한 부여 서버에 범위를 지정하기 위해 클라이언트가 필요할 수 있습니다.
      11
      (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다. 권한 부여 서버에 대상을 지정하기 위해 클라이언트가 필요할 수 있습니다.

      password grant mechanism properties

      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>" ;

      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" \

      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" \

      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 브로커에 액세스할 수 있는지 확인합니다.
8.4.6.4. Kafka 구성 요소에 대한 OAuth 2.0 구성

다음 절차에서는 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 구성 요소를 구성하는 방법을 설명합니다.

다음을 위한 인증을 구성할 수 있습니다.

  • Kafka Connect
  • Kafka MirrorMaker
  • Kafka 브리지

이 시나리오에서는 Kafka 구성 요소와 권한 부여 서버가 동일한 클러스터에서 실행됩니다.

시작하기 전에

Kafka 구성 요소에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 KafkaClientAuthenticationOAuth 스키마 참조 를 참조하십시오. 스키마 참조에는 구성 옵션의 예가 포함되어 있습니다.

사전 요구 사항

  • AMQ Streams 및 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
    1
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    2
    권한 부여 서버가 JWT 토큰 내에 typ (유형) 클레임을 반환하지 않으면 checkAccessTokenType: false 를 적용하여 토큰 유형 검사를 건너뛸 수 있습니다. 기본값은 true 입니다.
    3
    불투명 토큰을 사용하는 경우 액세스 토큰이 JWT 토큰으로 처리되지 않도록 accessTokenIsJwt: false 를 적용할 수 있습니다.
    4
    (선택 사항) 토큰 끝점에서 토큰을 요청하는 범위입니다. 권한 부여 서버에 범위를 지정하기 위해 클라이언트가 필요할 수 있습니다. 이 경우 이 모든 것입니다.
    5
    (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다. 권한 부여 서버에 대상을 지정하기 위해 클라이언트가 필요할 수 있습니다. 이 경우 kafka 입니다.
    6
    (선택 사항) 권한 부여 서버에 연결할 때 연결 제한 시간(초)입니다. 기본값은 60입니다.
    7
    (선택 사항) 권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    8
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션에 대한 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에서 사용할 수 없게 할 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
    9
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청의 다른 재시도를 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 일시 중지가 적용되지 않습니다. 실패한 요청으로 인해 많은 문제가 요청별 네트워크 결함 또는 프록시 문제로 신속하게 해결될 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하 상태에 있거나 트래픽이 높은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 재시도 횟수 가능성을 높일 수 있습니다.
  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 브로커와 상호 작용하도록 구성 요소를 구성합니다.

8.5. OAuth 2.0 토큰 기반 권한 부여 사용

토큰 기반 인증에 Red Hat Single Sign-On과 함께 OAuth 2.0을 사용하는 경우 Red Hat Single Sign-On을 사용하여 Kafka 브로커에 대한 클라이언트 액세스를 제한하도록 권한 부여 규칙을 구성할 수도 있습니다. 인증은 사용자의 ID를 설정합니다. 권한 부여는 해당 사용자의 액세스 수준을 결정합니다.

AMQ Streams는 Red Hat Single Sign-On Authorization Services 를 통해 OAuth 2.0 토큰 기반 권한 부여를 지원하므로 보안 정책 및 권한을 중앙에서 관리할 수 있습니다.

Red Hat Single Sign-On에 정의된 보안 정책 및 권한은 Kafka 브로커의 리소스에 대한 액세스 권한을 부여하는 데 사용됩니다. 사용자와 클라이언트는 Kafka 브로커에서 특정 작업을 수행하기 위해 액세스를 허용하는 정책과 대조됩니다.

Kafka는 기본적으로 모든 사용자에게 브로커에 대한 전체 액세스를 허용하고, ACL(액세스 제어 목록)을 기반으로 권한을 구성할 수 있도록 AclAuthorizer 플러그인도 제공합니다.

zookeeper는 사용자 이름을 기반으로 리소스에 대한 액세스를 부여하거나 거부하는 ACL 규칙을 저장합니다. 그러나 Red Hat Single Sign-On을 통한 OAuth 2.0 토큰 기반 권한 부여는 Kafka 브로커에 대한 액세스 제어를 구현하는 방법에 대해 훨씬 더 큰 유연성을 제공합니다. 또한 OAuth 2.0 권한 부여 및 ACL을 사용하도록 Kafka 브로커를 구성할 수 있습니다.

8.5.1. OAuth 2.0 인증 메커니즘

AMQ Streams의 OAuth 2.0 권한 부여에서는 Red Hat Single Sign-On 서버 권한 부여 서비스 REST 엔드포인트를 사용하여 특정 사용자에게 정의된 보안 정책을 적용하고 해당 사용자에게 다양한 리소스에 부여된 권한 목록을 제공하여 Red Hat Single Sign-On으로 토큰 기반 인증을 확장합니다. 정책은 역할 및 그룹을 사용하여 사용자와 권한을 일치시킵니다. OAuth 2.0 권한 부여는 Red Hat Single Sign-On 인증 서비스에서 사용자에게 수신된 부여 목록에 따라 권한을 로컬로 적용합니다.

8.5.1.1. Kafka 브로커 사용자 정의 인증

Red Hat Single Sign-On 작성자(KeycloakRBACAuthorizer)는 AMQ Streams를 통해 제공됩니다. Red Hat Single Sign-On에서 제공하는 인증 서비스에 Red Hat Single Sign-On REST 엔드포인트를 사용하려면 Kafka 브로커에 사용자 정의 인증 기관을 구성합니다.

작성자는 필요에 따라 권한 부여 서버에서 부여된 권한 목록을 가져와서 Kafka 브로커에 로컬로 권한 부여를 적용하여 각 클라이언트 요청에 대해 신속하게 승인 결정을 내립니다.

8.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 브로커에 대한 제한되지 않은 액세스 권한이 항상 있습니다.

사전 요구 사항

  • AMQ Streams는 토큰 기반 인증에 Red Hat Single Sign-On과 함께 OAuth 2.0을 사용하도록 구성해야 합니다. 권한을 설정할 때 동일한 Red Hat Single Sign-On 서버 엔드포인트를 사용합니다.
  • 재인증을 활성화하려면 OAuth 2.0 인증을 maxSecondsWithoutReauthentication 옵션으로 구성해야 합니다.

절차

  1. Red Hat Single Sign-On 관리 콘솔에 액세스하거나 OAuth 2.0 인증을 설정할 때 생성한 Kafka 브로커 클라이언트에 대한 인증 서비스를 활성화하려면 Red Hat Single Sign-On Admin CLI를 사용합니다.
  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
    
          connectTimeoutSeconds: 60 
    10
    
          readTimeoutSeconds: 60 
    11
    
          httpRetries: 2 
    12
    
        #...
    1
    유형 keycloak 을 사용하면 Red Hat Single Sign-On 인증을 사용할 수 있습니다.
    2
    Red Hat Single Sign-On 토큰 끝점의 URI입니다. 프로덕션의 경우 항상 https:// URL을 사용합니다. 토큰 기반 oauth 인증을 구성할 때 jwksEndpointUri 를 로컬 JWT 검증을 위한 URI로 지정합니다. tokenEndpointUri URI의 호스트 이름은 동일해야 합니다.
    3
    권한 부여 서비스가 활성화된 Red Hat Single Sign-On의 OAuth 2.0 클라이언트 정의의 클라이언트 ID입니다. 일반적으로 kafka 는 ID로 사용됩니다.
    4
    (선택 사항) Red Hat Single Sign-On 인증 서비스 정책에서 액세스를 거부하는 경우 Kafka AclAuthorizer 에 대한 권한 부여 기본값은 false 입니다.
    5
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    6
    (선택 사항) 지정된 수퍼 사용자입니다.
    7
    (선택 사항) 권한 부여 서버에 대한 TLS 연결에 필요한 신뢰할 수 있는 인증서입니다.
    8
    (선택 사항) 연속 두 개의 연속 부여 새로 고침 실행 사이의 시간입니다. 즉 활성 세션에서 Red Hat Single Sign-On에서 사용자의 권한 변경을 감지할 수 있는 최대 시간입니다. 기본값은 60입니다.
    9
    (선택 사항) 활성 세션에 대한 부여를 새로 고치는 데 사용할 스레드 수입니다. 기본값은 5입니다.
    10
    (선택 사항) Red Hat Single Sign-On 토큰 엔드포인트에 연결할 때 연결 제한 시간(초)입니다. 기본값은 60입니다.
    11
    (선택 사항) Red Hat Single Sign-On 토큰 엔드포인트에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    12
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 재시도하지 않고 재시도할 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션에 대한 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에서 사용할 수 없게 할 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
  6. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
  7. 로그 또는 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f ${POD_NAME} -c kafka
    oc get pod -w

    롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.

  8. Kafka 브로커에 특정 역할을 가진 클라이언트 또는 사용자로 액세스하여 구성된 권한을 확인하고, 필요한 액세스 권한이 있는지 확인하거나, 보유하지 않은 권한이 없는지 확인합니다.

8.5.3. Red Hat Single Sign-On 권한 부여 서비스에서 정책 및 권한 관리

이 섹션에서는 Red Hat Single Sign-On Authorization Services 및 Kafka에서 사용하는 권한 부여 모델에 대해 설명하고 각 모델에서 중요한 개념을 정의합니다.

Kafka에 액세스할 수 있는 권한을 부여하려면 Red Hat Single Sign-On에서 OAuth 클라이언트 사양 을 생성하여 Red Hat Single Sign-On 인증 서비스 오브젝트를 Kafka 리소스에 매핑할 수 있습니다. Kafka 권한은 Red Hat Single Sign-On 인증 서비스 규칙을 사용하여 사용자 계정 또는 서비스 계정에 부여됩니다.

다음은 주제 생성 및 나열과 같은 공통 Kafka 작업에 필요한 다양한 사용자 권한의 예입니다.

8.5.3.1. Kafka 및 Red Hat Single Sign-On 권한 부여 모델 개요

Kafka 및 Red Hat Single Sign-On 인증 서비스는 다른 권한 부여 모델을 사용합니다.

Kafka 인증 모델

Kafka의 권한 부여 모델은 리소스 유형을 사용합니다. Kafka 클라이언트가 브로커에 작업을 수행할 때 브로커는 구성된 KeycloakRBACAuthorizer 를 사용하여 작업 및 리소스 유형에 따라 클라이언트의 권한을 확인합니다.

Kafka는 5가지 리소스 유형을 사용하여 액세스를 제어합니다. Topic,Group,Cluster,TransactionalId, DelegationToken. 각 리소스 유형에는 사용 가능한 권한 집합이 있습니다.

주제

  • 개발
  • write
  • read
  • delete
  • describe
  • DescribeConfigs
  • 변경
  • AlterConfigs

그룹

  • read
  • describe
  • delete

Cluster

  • 개발
  • describe
  • 변경
  • DescribeConfigs
  • AlterConfigs
  • IdempotentWrite
  • ClusterAction

TransactionalId

  • describe
  • write

DelegationToken

  • describe
Red Hat Single Sign-On 인증 서비스 모델

Red Hat Single Sign-On Authorization Services 모델에는 권한 정의 및 부여 범위, 권한 부여범위,정책권한 부여 에 대한 4가지 개념이 있습니다.

Resources
리소스는 허용된 작업과 리소스를 일치시키는 데 사용되는 리소스 정의 집합입니다. 리소스는 개별 항목(예: 또는 동일한 접두사로 시작하는 이름이 있는 모든 항목)일 수 있습니다. 리소스 정의는 사용 가능한 권한 부여 범위 집합과 연관되며, 리소스에서 사용 가능한 모든 작업 집합을 나타냅니다. 이러한 작업의 하위 집합만 실제로 허용됩니다.
권한 부여 범위
권한 부여 범위는 특정 리소스 정의에서 사용 가능한 모든 작업의 집합입니다. 새 리소스를 정의할 때 모든 범위 집합의 범위를 추가합니다.
Policies

정책은 계정 목록과 일치하는 조건을 사용하는 권한 부여 규칙입니다. 정책은 다음과 일치할 수 있습니다.

  • 클라이언트 ID 또는 역할을 기반으로 하는 서비스 계정
  • 사용자 이름, 그룹 또는 역할을 기반으로 하는 사용자 계정 입니다.
권한
권한은 특정 리소스 정의의 권한 부여 범위 하위 집합을 사용자 집합에 부여합니다.
8.5.3.2. Red Hat Single Sign-On 인증 서비스를 Kafka 인증 모델에 매핑

Kafka 권한 부여 모델은 Kafka에 대한 액세스를 제어하는 Red Hat Single Sign-On 역할 및 리소스를 정의하는 기반으로 사용됩니다.

사용자 계정 또는 서비스 계정에 Kafka 권한을 부여하려면 먼저 Kafka 브로커에 대한 Red Hat Single Sign-On에 OAuth 클라이언트 사양 을 생성합니다. 그런 다음 클라이언트에서 Red Hat Single Sign-On 인증 서비스 규칙을 지정합니다. 일반적으로 브로커를 나타내는 OAuth 클라이언트의 클라이언트 ID는 kafka 입니다. AMQ 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 클라이언트가 OAUTHBISTRAER 인증을 사용하는 경우 Red Hat Single Sign-On 작성자(KeycloakRBACAuthorizer)는 현재 세션의 액세스 토큰을 사용하여 Red Hat Single Sign-On 서버에서 부여 목록을 검색합니다. 권한을 검색하기 위해 작성자는 Red Hat Single Sign-On Authorization Services 정책 및 권한을 평가합니다.

Kafka 권한의 권한 부여 범위

초기 Red Hat Single Sign-On 구성은 일반적으로 각 Kafka 리소스 유형에서 수행할 수 있는 모든 가능한 작업 목록을 생성하기 위해 권한 부여 범위를 업로드하는 것입니다. 이 단계는 권한을 정의하기 전에 한 번만 수행됩니다. 권한 부여 범위를 업로드하는 대신 수동으로 추가할 수 있습니다.

권한 부여 범위에는 리소스 유형에 관계없이 가능한 모든 Kafka 권한이 포함되어야 합니다.

  • 개발
  • write
  • read
  • 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로 시작하는 주제에서 읽을 수 있습니다.

8.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

주제 나열

사용자에게 지정된 항목에 대한 Describe 권한이 있는 경우 해당 항목이 나열됩니다.

bin/kafka-topics.sh --list \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties

주제 세부 정보 표시

주제 세부 사항을 표시하려면 항목에 대해 설명 및 설명 권한이 필요합니다.

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

소비자 그룹 나열

소비자 그룹을 나열할 때 사용자에게 Describe 권한이 있는 그룹만 반환됩니다. 또는 사용자에게 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-cluster 에 대해 DescribeConfigsAlterConfigs 권한이 필요합니다.

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대해 설명 및 대체 권한이 필요합니다. 또한 사용 권한에 대해 설명해야 합니다.Also, 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

8.5.4. Red Hat Single Sign-On 인증 서비스 사용

이 예에서는 키cloak 권한 부여와 함께 Red Hat Single Sign-On 인증 서비스를 사용하는 방법을 설명합니다. Kafka 클라이언트에 대한 액세스 제한을 적용하려면 Red Hat Single Sign-On 인증 서비스를 사용합니다. Red Hat Single Sign-On Authorization Services는 권한 부여 범위, 정책 및 권한을 사용하여 리소스에 대한 액세스 제어를 정의하고 적용합니다.

Red Hat Single Sign-On Authorization Services REST 엔드포인트는 인증된 사용자를 위한 리소스에 대한 승인된 권한 목록을 제공합니다. Kafka 클라이언트가 인증된 세션을 설정한 후 Red Hat Single Sign-On 서버에서 첫 번째 조치로 부여(권한) 목록은 Red Hat Single Sign-On 서버에서 가져옵니다. 권한 부여 변경 사항이 감지되도록 목록이 백그라운드에서 새로 고쳐집니다. 권한 부여는 빠른 권한 결정을 제공하기 위해 각 사용자 세션에 대해 Kafka 브로커에 로컬로 캐시되고 적용됩니다.

AMQ Streams는 구성 파일 예제 를 제공합니다. 다음은 Red Hat Single Sign-On 설정을 위한 다음 예제 파일이 있습니다.

kafka-ephemeral-oauth-single-keycloak-authz.yaml
Red Hat Single Sign-On을 사용하여 OAuth 2.0 토큰 기반 인증에 대해 구성된 Kafka 사용자 지정 리소스의 예입니다. 사용자 정의 리소스를 사용하여 키cloak 권한 부여 및 토큰 기반 oauth 인증을 사용하는 Kafka 클러스터를 배포할 수 있습니다.
kafka-authz-realm.json
샘플 그룹, 사용자, 역할 및 클라이언트로 구성된 Red Hat Single Sign-On 영역의 예입니다. 영역을 Red Hat Single Sign-On 인스턴스로 가져와서 Kafka에 액세스할 수 있는 세분화된 권한을 설정할 수 있습니다.

Red Hat Single Sign-On으로 예제를 시도하려면 다음 파일을 사용하여 표시된 순서대로 이 섹션에 설명된 작업을 수행합니다.

인증

토큰 기반 oauth 인증을 구성할 때 jwksEndpointUri 를 로컬 JWT 검증을 위한 URI로 지정합니다. keycloak 인증을 구성할 때 tokenEndpointUri 를 Red Hat Single Sign-On 토큰 끝점의 URI로 지정합니다. 두 URI의 호스트 이름은 동일해야 합니다.

그룹 또는 역할 정책이 포함된 대상 권한

Red Hat Single Sign-On에서 서비스 계정이 있는 기밀 클라이언트는 클라이언트 ID와 시크릿을 사용하여 자체 이름으로 서버에 인증할 수 있습니다. 이 기능은 일반적으로 특정 사용자(예: 웹 사이트)의 에이전트가 아닌 자체 이름으로 작동하는 마이크로 서비스에 편리합니다. 서비스 계정에는 일반 사용자와 같은 역할이 할당될 수 있습니다. 그러나 그룹을 할당할 수는 없습니다. 결과적으로 서비스 계정을 사용하여 마이크로 서비스에 대한 권한을 대상으로 지정하려면 그룹 정책을 사용할 수 없으며 대신 역할 정책을 사용해야 합니다. 반대로 사용자 이름 및 암호를 사용한 인증이 필요한 일반 사용자 계정으로만 특정 권한을 제한하려면 역할 정책이 아닌 그룹 정책을 사용하여 이를 수행할 수 있습니다. 이는 ClusterManager 로 시작하는 권한에 대해 이 예에서 사용되는 것입니다. 일반적으로 CLI 툴을 사용하여 클러스터 관리 수행은 대화식으로 수행됩니다. 결과 액세스 토큰을 사용하여 Kafka 브로커에 인증하기 전에 사용자가 로그인해야 하는 것이 좋습니다. 이 경우 액세스 토큰은 클라이언트 애플리케이션이 아닌 특정 사용자를 나타냅니다.

8.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 클러스터.
  • AMQ Streams examples/security/keycloak-authorization/kafka-authz-realm.json 파일은 사전 구성된 영역을 포함합니다.

절차

  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

    이 예제에서는 시크릿 이름이 credentials -keycloak 이라고 가정합니다.

  6. 사용자 이름 admin 과 가져온 암호를 사용하여 관리 콘솔에 로그인합니다.

    https://HOSTNAME 을 사용하여 Kubernetes Ingress 에 액세스합니다.

    이제 Admin Console을 사용하여 예제 영역을 Red Hat Single Sign-On에 업로드할 수 있습니다.

  7. Add CloudEvent를 클릭하여 예제 영역을 가져옵니다.
  8. examples/security/keycloak-authorization/kafka-authz-realm.json 파일을 추가한 다음 Create 를 클릭합니다.

    이제 관리 콘솔의 현재 영역으로 kafka-authz 가 있습니다.

    기본 보기는 마스터 영역을 표시합니다.

  9. Red Hat Single Sign-On 관리 콘솔에서 클라이언트 > kafka > Authorization > Settings 로 이동하여 결정 전략이 승인으로 설정되어 있는지 확인합니다.

    검증 정책은 클라이언트가 Kafka 클러스터에 액세스하기 위해 하나 이상의 정책을 충족해야 함을 의미합니다.

  10. Red Hat Single Sign-On 관리 콘솔에서 그룹,사용자,역할, 클라이언트로 이동 하여 영역 구성을 확인합니다.

    그룹
    그룹은 사용자 그룹을 생성하고 사용자 권한을 설정하는 데 사용됩니다. groups은 이름이 할당된 사용자 집합입니다. 사용자를 지역, 조직 또는 부서 단위로 구분하는 데 사용됩니다. 그룹을 LDAP ID 공급자에 연결할 수 있습니다. 예를 들어 Kafka 리소스에 대한 권한을 부여하기 위해 사용자 정의 LDAP 서버 관리자 사용자 인터페이스를 통해 사용자를 그룹 멤버로 만들 수 있습니다.
    사용자
    사용자는 사용자를 생성하는 데 사용됩니다. 이 예제에서는 alicebob 가 정의됩니다. AliceClusterManager 그룹의 멤버이며 bobClusterManager-my-cluster 그룹의 멤버입니다. 사용자는 LDAP ID 공급자에 저장할 수 있습니다.
    역할
    역할은 사용자 또는 클라이언트를 특정 권한을 갖는 것으로 표시합니다. 역할은 그룹과 유사한 개념입니다. 일반적으로 조직의 역할을 가진 사용자를 태그 하고 필수 권한을 갖는 데 사용됩니다. 역할은 LDAP ID 공급자에 저장할 수 없습니다. LDAP가 요구 사항인 경우 대신 그룹을 사용하고 Red Hat Single Sign-On 역할을 그룹에 추가하여 사용자에게 해당 역할을 할당받을 수 있습니다.
    클라이언트

    클라이언트에 는 특정 구성이 있을 수 있습니다. 예에서는 kafka,kafka-cli,team-a-clientteam-b-client 클라이언트가 구성됩니다.

    • kafka 클라이언트는 Kafka 브로커가 액세스 토큰 검증에 필요한 OAuth 2.0 통신을 수행하는 데 사용됩니다. 이 클라이언트에는 Kafka 브로커에서 권한을 수행하는 데 사용되는 권한 부여 서비스 리소스 정의, 정책 및 권한 부여 범위도 포함되어 있습니다. 권한 부여 구성은 Authorization EnabledSettings 탭에서 전환될 때 표시되는 Authorization 탭의 kafka 클라이언트에 정의되어 있습니다.
    • kafka-cli 클라이언트는 액세스 토큰 또는 새로 고침 토큰을 가져오기 위해 사용자 이름 및 암호로 인증할 때 Kafka 명령줄 툴에서 사용하는 공용 클라이언트입니다.
    • team-a-clientteam-b-client 클라이언트는 특정 Kafka 항목에 대한 부분 액세스 권한이 있는 서비스를 나타내는 기밀 클라이언트입니다.
  11. Red Hat Single Sign-On 관리 콘솔에서 권한 부여 > 권한으로 이동하여 영역에 정의된 리소스 및 정책을 사용하는 승인된 권한을 확인합니다.

    예를 들어 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 Team A
    Dev Team A realm 역할은 모든 클러스터에서 x_ 로 시작하는 항목에 쓸 수 있습니다. 이를 통해 Topic:x_*, DescribeWrite 범위, Dev Team A 정책이 결합되어 있습니다. Dev Team A 정책은 Dev Team A 라는 영역 역할이 있는 모든 사용자와 일치합니다.
    Dev Team B
    Dev Team B 영역 역할은 모든 클러스터에서 x_ 로 시작하는 주제에서 읽을 수 있습니다. 이를 통해 Topic:x_*, Group:x_* 리소스, 설명읽기 범위, Dev Team B 정책이 결합되어 있습니다. Dev Team B 정책은 Dev Team B 라는 영역 역할이 있는 모든 사용자와 일치합니다. 사용자 및 클라이언트 일치에는 주제에서 읽고 x_ 로 시작하는 이름이 있는 주제 및 소비자 그룹에 대해 소비된 오프셋을 업데이트할 수 있습니다.
8.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 클러스터에 배포되어 예제 영역을 사용하여 로드됩니다.
  • Cluster Operator가 OpenShift 클러스터에 배포됩니다.
  • AMQ Streams 예제/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

    Kubernetes Ingress 를 사용하여 보안(HTTPS)을 연결하면 인증서가 필요합니다.

    일반적으로 단일 인증서는 없지만 인증서 체인이 있습니다. /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 -
8.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 클러스터에 배포되어 예제 영역을 사용하여 로드됩니다.

    Red Hat Single Sign-On 관리 콘솔에서 클라이언트에 할당된 역할이 클라이언트 > 서비스 계정 역할에 표시되는지 확인합니다.

  • Red Hat Single Sign-On과 연결하도록 구성된 Kafka 클러스터는 OpenShift 클러스터에 배포됩니다.

절차

  1. AMQ Streams Kafka 이미지를 사용하여 새 대화형 Pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.

    NS=sso
    oc run -ti --restart=Never --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.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 이 필요하지 않습니다. 자세한 내용은 7장. 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에서 추가 관리 작업을 수행합니다.

이 예제에서 사용된 AMQ Streams Kafka 이미지에는 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 OAUTHBLOGER 메커니즘이 사용됩니다. 이 메커니즘을 사용하려면 클라이언트 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 사용자의 인증 속성을 사용하여 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

    이 요청은 주제에 액세스할 수 있는 Not authorized to access topics: [my-topic] 오류를 반환합니다.

    team-a-client 에는 a_ 로 시작하는 항목에 대해 지원되는 모든 작업을 수행할 수 있는 권한을 부여하는 Dev Team A 역할이 있지만 x_ 로 시작하는 항목에만 쓸 수 있습니다. my-topic 이라는 주제는 해당 규칙과 일치하지 않습니다.

  2. a_ECDHE에 주제를 작성합니다.

    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_ECDHE 주제의 메시지를 사용합니다.

  1. 주제 a_ECDHE에서 메시지를 가져옵니다.

    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_ECDHE 주제에서 모든 메시지를 수신합니다.

권한 있는 액세스로 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_ECDHE 주제가 반환됩니다.

  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_ECDHE에 주제를 작성합니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \
      --producer.config /tmp/team-b-client.properties
    Message 1

    이 요청은 항목에 액세스할 수 있는 Not authorized to access topics: [a_ECDHE] 오류를 반환합니다.

  2. 기록 b_ECDHE.

    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_ECDHE 주제를 작성할 수 있습니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --producer.config /tmp/team-b-client.properties
    Message 1

    항목에 액세스할 수 있는 권한이 없음: [x_ECDHE] 오류가 반환되고 team-b-client 는 주제 x_ECDHE 에서만 읽을 수 있습니다.

  4. team-a-client 를 사용하여 x_ ECDHE 주제를 작성합니다.

    bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --producer.config /tmp/team-a-client.properties
    Message 1

    이 요청은 항목에 액세스할 수 있는 Not authorized to access topics: [x_ECDHE] 오류를 반환합니다. team-a-clientx_ ECDHE 항목에 쓸 수 있지만 아직 없는 경우 주제를 만들 수 있는 권한이 없습니다. team-a-clientx_ ECDHE 항목에 쓰기 전에 관리자의 고급 사용자가 파티션 및 복제본 수와 같은 올바른 구성으로 생성해야 합니다.

권한이 있는 admin 사용자로 Kafka 관리

admin 사용자 alice 를 사용하여 Kafka를 관리합니다. Alice 는 Kafka 클러스터의 모든 항목을 관리할 수 있는 전체 액세스 권한을 갖습니다.

  1. x_ECDHE 주제를 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 Team ADev Team B 역할에는 모두 x_ 로 시작하는 항목에 대한 자세한 권한이 있지만 해당 역할에 대한 자세한 권한이 없기 때문에 다른 팀의 주제를 볼 수 없습니다.

  3. team-a-client 를 사용하여 x_ECDHE 항목에 대한 메시지를 생성합니다.

    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_ECDHE 주제를 만들었으므로 Kafka에 메시지가 성공적으로 생성됩니다.

  4. team-b-client 를 사용하여 x_ECDHE 항목에 대한 메시지를 생성합니다.

    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

    이 요청은 항목에 액세스할 수 있는 Not authorized to access topics: [x_ECDHE] 오류를 반환합니다.

  5. team-b-client 를 사용하여 x_ECDHE 주제의 메시지를 사용합니다.

    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_ECDHE 주제에서 모든 메시지를 수신합니다.

  6. team-a-client 를 사용하여 x_ECDHE 주제의 메시지를 사용합니다.

    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

    이 요청은 항목에 액세스할 수 있는 Not authorized to access topics: [x_ECDHE] 오류를 반환합니다.

  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

    이 요청은 항목에 액세스할 수 있는 Not authorized to access topics: [x_ECDHE] 오류를 반환합니다.

    Dev Team A 에는 x_ 로 시작하는 항목에 대한 읽기 액세스 권한이 없습니다.

  8. alice 를 사용하여 x_ECDHE 항목에 대한 메시지를 생성합니다.

    bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \
      --from-beginning --consumer.config /tmp/alice.properties

    Kafka에 메시지가 성공적으로 생성됩니다.

    Alice 는 모든 주제에서 읽거나 쓸 수 있습니다.

  9. alice 를 사용하여 클러스터 구성을 읽습니다.

    bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \
      --entity-type brokers --describe --entity-default

    이 예제의 클러스터 구성은 비어 있습니다.

9장. TLS 인증서 관리

AMQ Streams는 Kafka 및 AMQ Streams 구성 요소 간 암호화된 통신을 위해 TLS를 지원합니다.

통신은 항상 다음 구성 요소 간에 암호화됩니다.

  • Kafka와 ZooKeeper 간의 통신
  • Kafka 브로커 간 Interbroker 통신
  • ZooKeeper 노드 간 상호 통신
  • AMQ Streams Operator와 Kafka 브로커 및 ZooKeeper 노드와의 통신

Kafka 클라이언트와 Kafka 브로커 간의 통신은 클러스터 구성 방법에 따라 암호화됩니다. Kafka 및 AMQ Streams 구성 요소의 경우 TLS 인증서도 인증에 사용됩니다.

Cluster Operator는 클러스터 내에서 암호화 및 인증을 활성화하기 위해 TLS 인증서를 자동으로 설정 및 갱신합니다. Kafka 브로커와 클라이언트 간의 암호화 또는 mTLS 인증을 활성화하려면 다른 TLS 인증서도 설정합니다.

CA(인증 기관) 인증서는 Cluster Operator에 의해 생성되어 구성 요소 및 클라이언트의 ID를 확인합니다. Cluster Operator에서 생성한 CA를 사용하지 않으려면 자체 클러스터 및 클라이언트 CA 인증서를 설치할 수 있습니다.

TLS 암호화가 활성화된 TLS 리스너 또는 외부 리스너에 대한 Kafka 리스너 인증서를제공할 수도 있습니다. Kafka 리스너 인증서를 사용하여 이미 보유하고 있는 보안 인프라를 통합합니다.

참고

제공하는 인증서는 Cluster Operator에 의해 갱신되지 않습니다.

그림 9.1. TLS로 보호되는 통신 아키텍처의 예

보안 통신

9.1. 내부 클러스터 CA 및 클라이언트 CA

암호화를 지원하기 위해 각 AMQ Streams 구성 요소에는 고유한 개인 키와 공개 키 인증서가 필요합니다. 모든 구성 요소 인증서는 클러스터 CA라는 내부 CA(인증 기관)에 의해 서명됩니다.

마찬가지로 mTLS를 사용하여 AMQ Streams에 연결하는 각 Kafka 클라이언트 애플리케이션은 개인 키와 인증서를 사용해야 합니다. 클라이언트 CA라는 두 번째 내부 CA는 Kafka 클라이언트 의 인증서에 서명하는 데 사용됩니다.

클러스터 CA 및 클라이언트 CA에는 자체 서명된 공개 키 인증서가 모두 있습니다.

Kafka 브로커는 클러스터 CA 또는 클라이언트 CA에서 서명한 인증서를 신뢰하도록 구성됩니다. 클라이언트가 ZooKeeper와 같이 클라이언트가 연결할 필요가 없는 구성 요소(예: 클러스터 CA에서 서명한 인증서만 신뢰). 외부 리스너에 대한 TLS 암호화가 비활성화되지 않은 경우 클라이언트 애플리케이션은 클러스터 CA에서 서명한 인증서를 신뢰해야 합니다. mTLS 인증을 수행하는 클라이언트 애플리케이션에서도 마찬가지입니다.

기본적으로 AMQ Streams는 클러스터 CA 또는 클라이언트 CA에서 발급한 CA 인증서를 자동으로 생성하고 갱신합니다. Kafka.spec.clusterCaKafka.spec.clientsCa 오브젝트에서 이러한 CA 인증서 관리를 구성할 수 있습니다.

클러스터 CA 또는 클라이언트 CA의 CA 인증서를 자체 인증서로 교체할 수 있습니다. 자세한 내용은 9.7.1절. “자체 CA 인증서 및 개인 키 설치”의 내용을 참조하십시오. 자체 CA 인증서를 제공하는 경우 만료되기 전에 해당 인증서를 갱신해야 합니다.

9.2. Operator가 생성한 보안

시크릿은 KafkaKafkaUser 와 같은 사용자 정의 리소스가 배포될 때 생성됩니다. AMQ Streams는 이러한 보안을 사용하여 Kafka 클러스터, 클라이언트 및 사용자에 대한 개인 키 및 공개 키 인증서를 저장합니다. 보안은 Kafka 브로커 간 및 브로커와 클라이언트 간 TLS 암호화 연결을 설정하는 데 사용됩니다. mTLS 인증에도 사용됩니다.

클러스터 및 클라이언트 보안은 항상 쌍입니다. 하나는 공개 키가 있고 하나는 개인 키가 포함되어 있습니다.

클러스터 보안
클러스터 시크릿에는 Kafka 브로커 인증서에 서명하는 클러스터 CA 가 포함되어 있습니다. 클라이언트가 연결하면 인증서를 사용하여 Kafka 클러스터와의 TLS 암호화 연결을 설정합니다. 인증서는 브로커 ID를 확인합니다.
클라이언트 시크릿
클라이언트 시크릿에는 사용자가 자체 클라이언트 인증서에 서명할 수 있는 클라이언트 CA 가 포함되어 있습니다. 이를 통해 Kafka 클러스터에 대한 상호 인증을 허용합니다. 브로커는 인증서를 통해 클라이언트의 ID를 검증합니다.
사용자 시크릿
사용자 시크릿에는 개인 키와 인증서가 포함됩니다. 새 사용자를 생성할 때 클라이언트 CA에서 시크릿을 생성하고 서명합니다. 키와 인증서는 클러스터에 액세스할 때 사용자를 인증하고 권한을 부여하는 데 사용됩니다.

9.2.1. PEM 또는 PKCS #12 형식의 키와 인증서를 사용한 TLS 인증

AMQ Streams에서 생성한 보안은 PEM(Privacy Enhanced>-<) 및 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 입니다.
키 저장소
  • 사용자의 공용 인증서인 & lt;kafka_user_name > 시크릿의 user.crt 입니다.
  • 사용자의 개인 키 인 & lt;kafka_user_name > 시크릿의 user.key입니다.
PKCS #12 키 및 인증서

PKCS #12의 경우 클라이언트 구성에 다음을 추가합니다.

truststore
  • ca.p12클러스터의 CA 인증서인 <cluster_name>-cluster-ca-cert 보안입니다.
  • < cluster_name>-cluster-ca-cert 보안의 CA . password는 공용 클러스터 CA 인증서에 액세스하는 암호입니다.
키 저장소
  • user.p12 는 사용자의 공개 키 인증서인 < kafka_user_name > 시크릿의 이름입니다.
  • Kafka 사용자의 공개 키 인증서에 액세스하는 암호인 < kafka_user_name > 시크릿의 user.password.

PKCS #12는 Java에서 지원되므로 인증서 값을 Java 클라이언트 구성에 직접 추가할 수 있습니다. 보안 스토리지 위치에서 인증서를 참조할 수도 있습니다. PEM 파일을 사용하면 단일 줄 형식으로 클라이언트 구성에 직접 인증서를 추가해야 합니다. Kafka 클러스터와 클라이언트 간에 TLS 연결을 설정하는 데 적합한 형식을 선택합니다. PEM에 익숙하지 않은 경우 PKCS #12를 사용합니다.

참고

모든 키는 2048비트 크기이며 기본적으로 초기 생성일로부터 365일 동안 유효합니다. 유효 기간을 변경할 수 있습니다.

9.2.2. Cluster Operator가 생성한 보안

Cluster Operator는 다음 인증서를 생성합니다. 이 인증서는 OpenShift 클러스터에 시크릿으로 저장됩니다. AMQ Streams는 기본적으로 이러한 보안을 사용합니다.

클러스터 CA 및 클라이언트 CA에는 개인 키 및 공개 키에 대한 별도의 시크릿이 있습니다.

<cluster_name>-cluster-ca
클러스터 CA의 개인 키를 포함합니다. AMQ Streams 및 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를 확인합니다.

AMQ Streams 구성 요소 간 통신에는 개인 키와 클러스터 CA에서 서명한 공개 키 인증서가 포함되어 있습니다.

<cluster_name>-kafka-brokers
Kafka 브로커를 위한 개인 키 및 공개 키가 포함되어 있습니다.
<cluster_name>-zookeeper-nodes
ZooKeeper 노드의 개인 키 및 공개 키가 포함되어 있습니다.
<cluster_name>-cluster-operator-certs
Cluster Operator와 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-entity-topic-operator-certs
Topic Operator와 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-entity-user-operator-certs
User Operator와 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-cruise-control-certs
Cruise Control 및 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-kafka-exporter-certs
Kafka 내보내기 및 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키 및 공개 키가 포함되어 있습니다.
참고

9.2.3. 클러스터 CA 보안

클러스터 CA 보안은 Kafka 클러스터에서 Cluster Operator에 의해 관리됩니다.

클라이언트에는 <cluster_name> -cluster-ca-cert 보안만 필요합니다. 다른 모든 클러스터 시크릿은 AMQ Streams 구성 요소에서 액세스할 수 있습니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 적용할 수 있습니다.

참고

< cluster_name> -cluster-ca-cert 의 CA 인증서는 TLS를 통해 Kafka 브로커 인증서에 연결할 때 Kafka 클라이언트 애플리케이션에서 신뢰해야 합니다.

Expand
표 9.1. < cluster_name> -cluster-ca 시크릿의 필드
필드설명

ca.key

클러스터 CA의 현재 개인 키입니다.

Expand
표 9.2. < cluster_name>-cluster-ca-cert 보안 필드
필드설명

ca.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

ca.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

ca.crt

클러스터 CA의 현재 인증서입니다.

Expand
표 9.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>.

Expand
표 9.4. < cluster_name> -zookeeper-nodes 시크릿의 필드
필드설명

<cluster_name>-zookeeper-<num>.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

<cluster_name>-zookeeper-<num>.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

<cluster_name>-zookeeper-<num>.crt

ZooKeeper 노드 인증서 < num>. <cluster _name> -cluster-ca의 현재 또는 이전 클러스터 CA 개인 키로 서명합니다.

<cluster_name>-zookeeper-<num>.key

ZooKeeper Pod의 개인 키 < num>.

Expand
표 9.5. < cluster_name>-cluster-operator-certs 보안 필드
필드설명

cluster-operator.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

cluster-operator.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

cluster-operator.crt

Cluster Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster _name> -cluster-ca의 현재 또는 이전 클러스터 CA 개인 키로 서명합니다.

cluster-operator.key

Cluster Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다.

Expand
표 9.6. < cluster_name>-entity-topic-operator-certs 보안 필드
필드설명

entity-operator.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

entity-operator.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

entity-operator.crt

Topic Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster _name> -cluster-ca의 현재 또는 이전 클러스터 CA 개인 키로 서명합니다.

entity-operator.key

Topic Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다.

Expand
표 9.7. < cluster_name>-entity-user-operator-certs 보안 필드
필드설명

entity-operator.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

entity-operator.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

entity-operator.crt

User Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster _name> -cluster-ca의 현재 또는 이전 클러스터 CA 개인 키로 서명합니다.

entity-operator.key

User Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다.

Expand
표 9.8. < cluster_name>-cruise-control-certs 보안 필드
필드설명

cruise-control.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

cruise-control.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

cruise-control.crt

Cruise Control과 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster _name> -cluster-ca의 현재 또는 이전 클러스터 CA 개인 키로 서명합니다.

cruise-control.key

Cruise Control과 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다.

Expand
표 9.9. < cluster_name>-kafka-exporter-certs 보안 필드
필드설명

kafka-exporter.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

kafka-exporter.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

kafka-exporter.crt

Kafka 내보내기 및 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster _name> -cluster-ca의 현재 또는 이전 클러스터 CA 개인 키로 서명합니다.

kafka-exporter.key

Kafka 내보내기 및 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다.

9.2.4. 클라이언트 CA 보안

클라이언트 CA 보안은 Kafka 클러스터에서 Cluster Operator에 의해 관리됩니다.

< cluster_name> -clients-ca-cert 의 인증서는 Kafka 브로커를 신뢰하는 인증서입니다.

& lt;cluster_name> -clients-ca 보안은 클라이언트 애플리케이션 인증서에 서명하는 데 사용됩니다. User Operator를 사용하지 않고 애플리케이션 인증서를 발급하려는 경우 AMQ Streams 구성 요소 및 관리 액세스에서 이 시크릿에 액세스할 수 있어야 합니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 적용할 수 있습니다.

Expand
표 9.10. < cluster_name> -clients-ca 시크릿의 필드
필드설명

ca.key

client CA의 현재 개인 키입니다.

Expand
표 9.11. < cluster_name> -clients-ca-cert 시크릿의 필드
필드설명

ca.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

ca.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

ca.crt

client CA의 현재 인증서입니다.

9.2.5. User Operator가 생성한 사용자 보안

사용자 보안은 User Operator가 관리합니다.

User Operator를 사용하여 사용자를 생성하면 사용자 이름을 사용하여 시크릿이 생성됩니다.

Expand
표 9.12. user_name 시크릿의 필드
시크릿 이름보안 내 필드설명

<user_name>

user.p12

인증서 및 키를 저장하기 위한 PKCS #12 저장소

user.password

PKCS #12 저장소를 보호하기 위한 암호입니다.

user.crt

클라이언트 CA에서 서명한 사용자 인증서

user.key

사용자의 개인 키

9.2.6. 클러스터 CA 보안에 라벨 및 주석 추가

Kafka 사용자 정의 리소스에서 clusterCaCert 템플릿 속성을 구성하면 Cluster Operator가 생성한 Cluster CA 보안에 사용자 정의 레이블 및 주석을 추가할 수 있습니다. 레이블 및 주석은 오브젝트를 식별하고 컨텍스트 정보를 추가하는 데 유용합니다. AMQ 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
    # ...

9.2.7. CA 시크릿에서 ownerReference 비활성화

기본적으로 클러스터 및 클라이언트 CA 보안은 Kafka 사용자 정의 리소스로 설정된 ownerReference 속성을 사용하여 생성됩니다. 즉, Kafka 사용자 정의 리소스가 삭제되면 OpenShift에서 CA 시크릿도 삭제됩니다(가장).

새 클러스터에 CA를 재사용하려면 Kafka 구성에서 클러스터의 generateSecretOwnerReference 속성과 클라이언트 CA 시크릿을 false 로 설정하여 ownerReference 를 비활성화할 수 있습니다. ownerReference 가 비활성화되면 해당 Kafka 사용자 정의 리소스가 삭제될 때 OpenShift에서 CA 시크릿을 삭제하지 않습니다.

클러스터 및 클라이언트 CA에 대해 ownerReference 가 비활성화된 Kafka 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
  clusterCa:
    generateSecretOwnerReference: false
  clientsCa:
    generateSecretOwnerReference: false
# ...

9.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의 generate properties 설정에 따라 다릅니다.

true
속성이 true 로 설정되면 CA 인증서가 Cluster Operator에 의해 자동으로 생성되고 갱신 기간 내에 자동으로 갱신됩니다.
false
속성이 false 로 설정되면 Cluster Operator에 의해 CA 인증서가 생성되지 않습니다. 자체 인증서를 설치하는 경우 이 옵션을 사용합니다.

9.3.1. 자동으로 생성된 CA 인증서가 있는 갱신 프로세스

Cluster Operator는 CA 인증서를 갱신할 때 이 순서로 다음 프로세스를 수행합니다.

  1. 새 CA 인증서를 생성하지만 기존 키를 유지합니다.

    새 인증서는 해당 시크릿 내의 이름으로 이전 인증서를 대체합니다.

  2. 새 클라이언트 인증서( ZooKeeper 노드, Kafka 브로커 및 Entity Operator의 경우)를 생성합니다.

    서명 키가 변경되지 않았기 때문에 반드시 필요한 것은 아니지만 CA 인증서와 동기화된 클라이언트 인증서의 유효 기간을 유지합니다.

  3. ZooKeeper 노드를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.
  4. Kafka 브로커를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.
  5. Topic 및 User Operator를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.

    사용자 인증서는 클라이언트 CA에서 서명합니다. 클라이언트 CA가 갱신되면 User Operator가 생성한 사용자 인증서가 갱신됩니다.

9.3.2. 클라이언트 인증서 갱신

Cluster Operator는 Kafka 클러스터를 사용하는 클라이언트 애플리케이션을 인식하지 못합니다.

클러스터에 연결하고 올바르게 작동하는지 확인하려면 클라이언트 애플리케이션이 다음을 수행해야 합니다.

  • <cluster> - cluster-ca-cert 보안에 게시된 클러스터 CA 인증서를 신뢰합니다.
  • < user-name> 보안에 게시된 인증 정보를 사용하여 클러스터에 연결합니다.

    사용자 보안은 PEM 및 PKCS #12 형식으로 인증 정보를 제공하거나 SCRAM-SHA 인증을 사용할 때 암호를 제공할 수 있습니다. 사용자가 생성될 때 User Operator에서 사용자 인증 정보를 생성합니다.

인증서를 업데이트한 후에도 클라이언트가 계속 작동하는지 확인해야 합니다. 갱신 프로세스는 클라이언트 구성 방법에 따라 다릅니다.

클라이언트 인증서와 키를 수동으로 프로비저닝하는 경우 새 클라이언트 인증서를 생성하고 갱신 기간 내에 클라이언트가 새 인증서를 사용하는지 확인해야 합니다. 갱신 기간이 끝나면 이를 수행하지 않으면 클라이언트 애플리케이션이 클러스터에 연결할 수 없습니다.

참고

동일한 OpenShift 클러스터 및 네임스페이스 내에서 실행되는 워크로드의 경우 시크릿을 볼륨으로 마운트할 수 있으므로 클라이언트 Pod가 현재 Secrets 상태에서 키 저장소 및 신뢰 저장소를 구성할 수 있습니다. 이 절차에 대한 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.

9.3.3. Cluster Operator에서 생성한 CA 인증서를 수동으로 갱신

각 인증서 갱신 기간이 시작될 때 Cluster Operator에서 생성한 클러스터 및 클라이언트 CA 인증서가 자동으로 갱신됩니다. 그러나 strimzi.io/force-renew 주석을 사용하여 인증서 갱신 기간이 시작되기 전에 이러한 인증서 중 하나 또는 둘 다를 수동으로 갱신할 수 있습니다. 보안상의 이유로 이 작업을 수행하거나 인증서에 대한 갱신 또는 유효 기간을 변경한 경우 이 작업을 수행할 수 있습니다.

갱신된 인증서는 이전 인증서와 동일한 개인 키를 사용합니다.

참고

자체 CA 인증서를 사용하는 경우 force-renew 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.

절차

  1. 갱신하려는 CA 인증서가 포함된 보안에 strimzi.io/force-renew 주석을 적용합니다.

    Expand
    표 9.13. 인증서 갱신을 강제 적용하는 보안에 대한 주석
    certificateSecret주석 명령

    클러스터 CA

    KAFKA-CLUSTER-NAME-cluster-ca-cert

    oc annotate secret KAFKA-CLUSTER-NAME-cluster-ca-cert strimzi.io/force-renew=true

    Clients CA

    KAFKA-CLUSTER-NAME-clients-ca-cert

    oc annotate secret KAFKA-CLUSTER-NAME-clients-ca-cert strimzi.io/force-renew=true

    다음 조정 시 Cluster Operator는 주석이 달린 보안에 대한 새 CA 인증서를 생성합니다. 유지 관리 시간 기간이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 내에 첫 번째 조정 시 새 CA 인증서를 생성합니다.

    클라이언트 애플리케이션은 Cluster Operator가 갱신한 클러스터 및 클라이언트 CA 인증서를 다시 로드해야 합니다.

  2. CA 인증서가 유효한 기간을 확인합니다.

    예를 들어 openssl 명령을 사용합니다.

    oc get secret CA-CERTIFICATE-SECRET -o 'jsonpath={.data.CA-CERTIFICATE}' | base64 -d | openssl x509 -subject -issuer -startdate -enddate -noout

    CA-CERTIFICATE-SECRET시크릿 의 이름입니다. 이는 클러스터 CA 인증서의 경우 KAFKA-CLUSTER-NAME-cluster-ca-cert 이고 클라이언트 CA 인증서에 대한 KAFKA-CLUSTER-NAME-clients-ca-cert 입니다.

    ca -CERTIFICATE 는 CA 인증서의 이름입니다(예: jsonpath={.data.ca\.crt} ).

    이 명령은 CA 인증서의 유효 기간인 notBeforenotAfter 날짜를 반환합니다.

    예를 들어 클러스터 CA 인증서의 경우 다음을 수행합니다.

    subject=O = io.strimzi, CN = cluster-ca v0
    issuer=O = io.strimzi, CN = cluster-ca v0
    notBefore=Jun 30 09:43:54 2020 GMT
    notAfter=Jun 30 09:43:54 2021 GMT
  3. 시크릿에서 이전 인증서를 삭제합니다.

    구성 요소가 새 인증서를 사용하는 경우 이전 인증서가 계속 활성화되어 있을 수 있습니다. 기존 인증서를 삭제하여 잠재적인 보안 위험을 제거합니다.

9.3.4. Cluster Operator에서 생성한 CA 인증서에서 사용하는 개인 키 교체

클러스터 CA 및 Cluster Operator에서 생성한 클라이언트 CA 인증서에서 사용하는 개인 키를 교체할 수 있습니다. 개인 키가 교체되면 Cluster Operator가 새 개인 키에 대한 새 CA 인증서를 생성합니다.

참고

자체 CA 인증서를 사용하는 경우 force-replace 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.

절차

  • 갱신하려는 개인 키가 포함된 보안에 strimzi.io/force-replace 주석을 적용합니다.

    Expand
    표 9.14. 개인 키 교체 명령
    개인 키Secret주석 명령

    클러스터 CA

    CLUSTER-NAME-cluster-ca

    oc annotate secret CLUSTER-NAME-cluster-ca strimzi.io/force-replace=true

    Clients 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 인증서를 다시 로드해야 합니다.

9.4. TLS 연결

9.4.1. zookeeper 통신

모든 포트의 ZooKeeper 노드와 클라이언트 간 통신은 TLS를 사용하여 암호화됩니다.

Kafka 브로커와 ZooKeeper 노드 간의 통신도 암호화됩니다.

9.4.2. Kafka inter-broker 통신

Kafka 브로커 간의 통신은 항상 TLS를 사용하여 암호화됩니다. Kafka 컨트롤러와 브로커 간 연결은 포트 9090에서 내부 컨트롤 플레인 리스너 를 사용합니다. 브로커 간 데이터 복제는 AMQ Streams Operator, Cruise Control 또는 Kafka Exporter의 내부 연결과 포트 9091에서 복제 리스너 를 사용합니다. 이러한 내부 리스너는 Kafka 클라이언트에서 사용할 수 없습니다.

9.4.3. 주제 및 사용자 Operator

모든 Operator는 Kafka 및 ZooKeeper와의 통신을 위해 암호화를 사용합니다. 주제 및 사용자 Operator에서 ZooKeeper와 통신할 때 TLS 사이드카가 사용됩니다.

9.4.4. 크루즈 컨트롤

크루즈 컨트롤은 Kafka 및 ZooKeeper와의 통신을 위해 암호화를 사용합니다. TLS 사이드카는 ZooKeeper와 통신할 때 사용됩니다.

9.4.5. Kafka 클라이언트 연결

Kafka 브로커와 클라이언트 간의 암호화 또는 암호화되지 않은 통신은 spec.kafka.listenerstls 속성을 사용하여 구성됩니다.

9.5. 클러스터 CA를 신뢰하도록 내부 클라이언트 구성

다음 절차에서는 OpenShift 클러스터 내부에 위치하는 Kafka 클라이언트를 구성하는 방법 - TLS 리스너에 연결 - 클러스터 CA 인증서를 신뢰하는 방법을 설명합니다.

내부 클라이언트에서 이를 수행하는 가장 쉬운 방법은 볼륨 마운트를 사용하여 필요한 인증서 및 키가 포함된 보안에 액세스하는 것입니다.

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를 사용할 때( mTLS 인증 포함 또는 없이) SSL 입니다.
      • security.protocol: TLS를 통해 SCRAM-SHA 인증을 사용할 때 SASL_SSL.
    • SSL.truststore.location 인증서를 가져온 신뢰 저장소 위치가 있습니다.
    • SSL.truststore.password 에는 신뢰 저장소에 액세스하기 위한 암호가 있습니다.
    • SSL.truststore.type=PKCS12: truststore 유형을 식별합니다.

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 연결을 구성하려면 추출된 인증서를 사용합니다.

9.6. 클러스터 CA를 신뢰하도록 외부 클라이언트 구성

다음 절차에서는 OpenShift 클러스터 외부에 있는 Kafka 클라이언트를 구성하는 방법 - 외부 리스너에 연결 - 클러스터 CA 인증서를 신뢰하는 방법을 설명합니다. 클라이언트를 설정하는 경우 및 갱신 기간 동안 이전 클라이언트 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 시크릿에서 클러스터 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.
    • SSL.truststore.location 인증서를 가져온 신뢰 저장소 위치가 있습니다.
    • SSL.truststore.password 에는 신뢰 저장소에 액세스하기 위한 암호가 있습니다. 이 속성은 신뢰 저장소에 필요하지 않은 경우 생략할 수 있습니다.
    • SSL.truststore.type=PKCS12: truststore 유형을 식별합니다.

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 연결을 구성하려면 추출된 인증서를 사용합니다.

9.7. 자체 CA 인증서 및 개인 키 사용

Cluster Operator에서 생성한 기본값을 사용하는 대신 자체 CA 인증서 및 개인 키를 설치하고 사용합니다. 클러스터 및 클라이언트 CA 인증서 및 개인 키를 교체할 수 있습니다.

다음과 같은 방법으로 자체 CA 인증서 및 개인 키를 사용하도록 전환할 수 있습니다.

  • Kafka 클러스터를 배포하기 전에 고유한 CA 인증서 및 개인 키를 설치합니다.
  • Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 직접 교체

Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 교체하는 단계는 자체 CA 인증서 및 개인 키를 갱신하는 데 사용되는 것과 동일합니다.

자체 인증서를 사용하는 경우 자동으로 갱신되지 않습니다. 만료되기 전에 CA 인증서 및 개인 키를 갱신해야 합니다.

갱신 옵션:

  • CA 인증서만 갱신
  • CA 인증서 및 개인 키 갱신 (또는 기본값 교체)

9.7.1. 자체 CA 인증서 및 개인 키 설치

클러스터 및 클라이언트 CA 인증서 및 Cluster Operator가 생성한 개인 키를 사용하는 대신 고유한 CA 인증서 및 개인 키를 설치합니다.

기본적으로 AMQ 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 또는 클라이언트 CA에 대해 PEM 형식의 자체 X.509 인증서 및 키입니다.

    • 루트 CA가 아닌 클러스터 또는 클라이언트 CA를 사용하려면 인증서 파일에 전체 체인을 포함해야 합니다. 체인은 다음 순서에 있어야 합니다.

      1. 클러스터 또는 클라이언트 CA
      2. 하나 이상의 중간 CA
      3. 루트 CA
    • 체인의 모든 CA는 X509v3 Basic Constraints 확장을 사용하여 구성해야 합니다. 기본 제한 조건은 인증서 체인의 경로 길이를 제한합니다.
  • 인증서를 변환하는 OpenSSL TLS 관리 툴입니다.

사전 준비 사항

Cluster Operator는 PEM(Privacy Enhanced>-<) 및 PKCS #12(Public-Key Cryptography Standards) 형식으로 키와 인증서를 생성합니다. 자체 인증서를 두 형식으로 추가할 수 있습니다.

일부 애플리케이션은 PEM 인증서를 사용할 수 없으며 PKCS #12 인증서만 지원합니다. PKCS #12 형식의 클러스터 인증서가 없는 경우 OpenSSL TLS 관리 도구를 사용하여 ca.crt 파일에서 생성합니다.

인증서 생성 명령 예

openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt

& lt;P12_password&gt;를 사용자 암호로 바꿉니다.

절차

  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

    & lt;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&gt;은 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 키 생성을 정의합니다.

      자체 CA 인증서에 대해 증분 값(strimzi.io/ca-cert-generation=0)으로 0(zero)부터 시작합니다. 인증서를 갱신할 때 더 높은 증분 값을 설정합니다.

  5. 생성된 CA를 사용하지 않도록 Kafka.spec.clusterCa 또는 Kafka.spec.clientsCa 오브젝트를 구성하여 클러스터의 Kafka 리소스를 생성합니다.

    사용자가 제공하는 인증서를 사용하도록 클러스터 CA를 구성하는 조각 Kafka 리소스의 예

    kind: Kafka
    version: kafka.strimzi.io/v1beta2
    spec:
      # ...
      clusterCa:
        generateCertificateAuthority: false

9.7.2. 자체 CA 인증서 갱신

자체 CA 인증서를 사용하는 경우 수동으로 인증서를 갱신해야 합니다. Cluster Operator는 자동으로 업데이트하지 않습니다. 만료되기 전에 갱신 기간에 CA 인증서를 갱신합니다.

CA 인증서를 갱신하고 동일한 개인 키를 계속할 때 이 절차의 단계를 수행합니다. 자체 CA 인증서 개인 키를 갱신하는 경우 9.7.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 로 변경합니다. Secret (시크릿)에 주석이 없으면 값은 0 으로 처리되므로 값이 1 인 주석을 추가합니다.

    AMQ 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는 ZooKeeper, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행하여 새 CA 인증서를 신뢰합니다.

유지 관리 시간이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 내에 첫 번째 조정 시 Pod를 롤오버합니다.

9.7.3. CA 인증서 및 개인 키를 별도로 갱신하거나 교체

자체 CA 인증서 및 개인 키를 사용하는 경우 수동으로 갱신해야 합니다. Cluster Operator는 자동으로 업데이트하지 않습니다. 만료되기 전에 갱신 기간에 CA 인증서를 갱신합니다. 동일한 절차를 사용하여 AMQ Streams Operator에서 생성한 CA 인증서 및 개인 키를 자체로 교체할 수도 있습니다.

CA 인증서 및 개인 키를 갱신하거나 교체할 때 이 절차의 단계를 수행합니다. 자체 CA 인증서만 갱신하는 경우 9.7.2절. “자체 CA 인증서 갱신” 를 참조하십시오.

이 절차에서는 CA 인증서 및 개인 키 갱신을 PEM 형식으로 설명합니다.

다음 단계를 진행하기 전에 새 CA 인증서의 CN(Common Name)이 현재 CA 인증서와 다른지 확인합니다. 예를 들어 Cluster Operator가 인증서를 자동으로 갱신하면 버전을 식별하기 위해 v<version_number > 접미사가 추가됩니다. 갱신할 때마다 다른 접미사를 추가하여 자체 CA 인증서와 동일하게 수행합니다. 다른 키를 사용하여 새 CA 인증서를 생성하면 시크릿에 저장된 현재 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-cluster 라는 Kafka 사용자 정의 리소스의 경우 :

      oc annotate Kafka my-cluster strimzi.io/pause-reconciliation="true"
    2. 사용자 정의 리소스의 상태 조건에 ReconciliationPaused 로 변경 사항이 표시되는지 확인합니다.

      oc describe Kafka <name_of_custom_resource>

      유형 조건은 lastTransitionTime 에서 ReconciliationPaused 로 변경됩니다.

  2. 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 >는 YECDHE -MONTH-DAYTHOUR-MINUTE-SECONDZ 형식의 인증서 만료 날짜입니다. 예: ca-2022-01-26T17-32-00Z.crt:. 현재 CA 인증서를 유지하기 위해 속성의 값을 그대로 둡니다.

    3. 새 CA 인증서를 base64로 인코딩합니다.

      cat <path_to_new_certificate> | base64
    4. CA 인증서를 업데이트합니다.

      데이터에ca.crt 속성을 생성하고 이전 단계의 base64로 ca.crt 속성 값으로 base64로 인코딩된 CA 인증서를 복사합니다.

    5. CA 인증서 생성 주석의 값을 늘립니다.

      strimzi.io/ca-cert-generation 주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어 strimzi.io/ca-cert-generation=0strimzi.io/ca-cert-generation = 1 로 변경합니다. Secret (시크릿)에 주석이 없으면 값은 0 으로 처리되므로 값이 1 인 주석을 추가합니다.

      AMQ 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-2022-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 인증서 생성 주석 값
  3. 새 CA 인증서에 서명하는 데 사용되는 CA 키의 Secret 을 업데이트합니다.

    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=0으로 변경하십시오. 시크릿에 주석이 없는 경우 0 으로 처리되므로 값이 1 인 주석을 추가합니다.

      AMQ Streams가 인증서를 생성하면 Cluster Operator에 의해 키 생성 주석이 자동으로 증가합니다. 고유한 CA 인증서와 새 CA 키의 경우 주석을 더 높은 증분 값으로 설정합니다. Cluster Operator가 Pod를 롤링하고 인증서와 키를 업데이트할 수 있도록 주석에 현재 보안의 값보다 높은 값이 필요합니다. strimzi.io/ca-key-generation 은 각 CA 인증서 갱신에 대해 증가해야 합니다.

  4. 새 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 키 생성 주석 값
  5. 일시 중지에서 다시 시작합니다.

    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는 ZooKeeper, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행하여 새 CA 인증서를 신뢰합니다. 롤링 업데이트가 완료되면 Cluster Operator가 새 CA 키로 서명한 새 서버 인증서를 생성하기 위해 새 업데이트를 시작합니다.

유지 관리 시간이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 내에 첫 번째 조정 시 Pod를 롤오버합니다.

10장. 브로커를 추가하거나 제거하여 클러스터 스케일링

브로커를 추가하여 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: 
1

      # ...
      default.replication.factor: 3
      min.insync.replicas: 2
 # ...

브로커를 추가하거나 제거해도 Kafka는 파티션을 자동으로 다시 할당하지 않습니다. 가장 좋은 방법은 Cruise Control을 사용하는 것입니다. 클러스터를 확장 또는 축소할 때 Cruise Control의 add-brokersremove-brokers 모드를 사용할 수 있습니다.

  • Kafka 클러스터를 확장한 후 add-brokers 모드를 사용하여 기존 브로커에서 새로 추가된 브로커로 파티션 복제본을 이동합니다.
  • Kafka 클러스터를 축소하기 전에 remove-brokers 모드를 사용하여 제거할 브로커에서 파티션 복제본을 이동합니다.
참고

브로커 축소 시 클러스터에서 제거할 특정 Pod를 지정할 수 없습니다. 대신 브로커 제거 프로세스는 가장 많은 번호가 지정된 Pod에서 시작됩니다.

11장. Cruise Control을 사용하여 클러스터 재조정

Cruise Control은 다음 Kafka 작업을 지원하는 오픈 소스 시스템입니다.

  • 클러스터 워크로드 모니터링
  • 사전 정의된 제약 조건을 기반으로 클러스터 재조정

이 작업은 브로커 Pod를 보다 효율적으로 사용하는 더 균형 있는 Kafka 클러스터를 실행하는 데 도움이 됩니다.

일반적인 클러스터는 시간이 지남에 따라 균등하게 로드될 수 있습니다. 대량의 메시지 트래픽을 처리하는 파티션이 사용 가능한 브로커에 균등하게 분배되지 않을 수 있습니다. 클러스터를 재조정하려면 관리자는 브로커의 부하를 모니터링하고 사용 중인 파티션을 여유 용량이 있는 브로커에 수동으로 다시 할당해야 합니다.

Cruise Control은 클러스터 재조정 프로세스를 자동화합니다. CPU, 디스크 및 네트워크 로드를 기반으로 클러스터의 리소스 사용률의 워크로드 모델을 구성하고 더 균형 있는 파티션 할당에 대한 최적화 제안(승인 또는 거부할 수 있음)을 생성합니다. 구성 가능한 최적화 목표 세트는 이러한 제안을 계산하는 데 사용됩니다.

특정 모드에서 최적화 제안을 생성할 수 있습니다. 기본 전체 모드는 모든 브로커에서 파티션을 재조정합니다. add-brokersremove-brokers 모드를 사용하여 클러스터를 확장 또는 축소할 때 변경 사항을 수용할 수도 있습니다.

최적화 제안을 승인하면 Cruise Control을 Kafka 클러스터에 적용합니다. KafkaRebalance 리소스를 사용하여 최적화 제안을 구성하고 생성합니다. 최적화 제안이 자동으로 또는 수동으로 승인되도록 주석을 사용하여 리소스를 구성할 수 있습니다.

참고

AMQ Streams는 Cruise Control에 대한 구성 파일 예제 를 제공합니다.

11.1. Cruise Control 구성 요소 및 기능

Cruise Control은 4가지 주요 구성 요소(Load Monitor, Analyzer, Anomaly Detector, Executor-및 클라이언트 상호 작용을 위한 REST API)로 구성됩니다. AMQ Streams는 REST API를 사용하여 다음 Cruise Control 기능을 지원합니다.

  • 최적화 목표에서 최적화 제안을 생성합니다.
  • 최적화 제안을 기반으로 Kafka 클러스터 재조정.
최적화 목표

최적화 목표는 리밸런스에서 달성하려는 특정 목적을 설명합니다. 예를 들어 목표는 주제 복제본을 브로커에 더 균등하게 배포하는 것입니다. 설정을 통해 포함할 목표를 변경할 수 있습니다. 목표는 하드 목표 또는 소프트 목표로 정의됩니다. Cruise Control 배포 구성을 통해 어려운 목표를 추가할 수 있습니다. 또한 각 카테고리에 적합한 기본, 기본 및 사용자 제공 목표를 보유하고 있습니다.

  • 어려운 목표는 사전 설정되며 최적화 제안에 만족해야합니다.
  • 최적화 제안에 성공하려면 소프트 목표를 충족할 필요가 없습니다. 즉, 모든 어려운 목표를 충족한다는 것을 의미하면 따로 설정할 수 있습니다.
  • 주요 목표는 Cruise Control에서 상속됩니다. 일부는 하드 목표로 사전 설정되어 있습니다. 주요 목표는 기본적으로 최적화 제안에 사용됩니다.
  • 기본 목표는 기본적으로 주요 목표와 동일합니다. 고유한 기본 목표 집합을 지정할 수 있습니다.
  • 사용자 제공 목표는 특정 최적화 제안을 생성하도록 구성된 기본 목표의 서브 세트입니다.
최적화 제안

최적화 제안은 리밸런스에서 달성하려는 목표를 포함합니다. 최적화 제안을 생성하여 제안된 변경 사항 및 리밸런스로 가능한 결과에 대한 요약을 생성합니다. 목표는 특정 우선 순위로 평가됩니다. 그런 다음 제안을 승인하거나 거부하도록 선택할 수 있습니다. 조정된 목표를 통해 다시 실행하도록 제안을 거부할 수 있습니다.

세 가지 모드 중 하나에서 최적화 제안을 생성할 수 있습니다.

  • full 은 기본 모드이며 전체 리밸런스를 실행합니다.
  • Add-brokers 는 Kafka 클러스터를 확장할 때 브로커를 추가한 후 사용하는 모드입니다.
  • remove-brokers 는 Kafka 클러스터를 축소할 때 브로커를 제거하기 전에 사용하는 모드입니다.

다른 Cruise Control 기능은 현재 지원되지 않습니다. 여기에는 자체 복구, 알림, 쓰기-자유 목표, 주제 복제 요소 변경을 포함하여 현재 지원되지 않습니다.

11.2. 최적화 목표 개요

최적화 목표는 Kafka 클러스터의 워크로드 재배포 및 리소스 사용률에 대한 제약입니다. Kafka 클러스터를 재조정하기 위해 Cruise Control은 최적화 목표를 사용하여 최적화 제안을 생성하며 승인 또는 거부할 수 있습니다.

11.2.1. 우선 순위의 목표 순서

AMQ Streams는 Cruise Control 프로젝트에서 개발한 대부분의 최적화 목표를 지원합니다. 지원되는 목표는 기본 우선 순위 순으로 다음과 같습니다.

  1. ack-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 10.0.0.1의 목표를 참조하십시오.

참고

"자신의" 목표를 쓰고 Kafka 할당자 목표는 아직 지원되지 않습니다.

11.2.2. AMQ Streams 사용자 정의 리소스의 목표 구성

KafkaKafkaRebalance 사용자 정의 리소스에서 최적화 목표를 구성합니다. Cruise Control에는 충족해야 하는 하드 최적화 목표 및 주요, 기본, 사용자 제공 최적화 목표를 위한 구성이 있습니다.

다음 설정에서 최적화 목표를 지정할 수 있습니다.

  • 주요 목표 ECDHE- Kafka.spec.cruiseControl.config.goals
  • 하드 목표 ECDHE- Kafka.spec.cruiseControl.config.hard.goals
  • 기본 목표 ECDHE- Kafka.spec.cruiseControl.config.default.goals
  • 사용자 제공 목표 ECDHE- KafkaRebalance.spec.goals
참고

리소스 배포 목표는 브로커 리소스에 대한 용량 제한 의 영향을 받습니다.

11.2.3. 하드 및 소프트 최적화 목표

어려운 목표는 최적화 제안에 충족해야 하는 목표입니다. 어려운 목표로 구성되지 않은 목표는 소프트 목표로 알려져 있습니다. 소프트 목표를 최선의 목표로 생각할 수 있습니다: 최적화 제안서에 충족할 필요는 없지만 최적화 계산에 포함됩니다. 하나 이상의 소프트 목표를 위반하지만 모든 어려운 목표를 충족하는 최적화 제안은 유효합니다.

크루즈 컨트롤은 모든 어려운 목표를 충족하고 가능한 한 많은 소프트 목표를 충족하는 최적화 제안을 계산합니다 (우선 순위에서). 모든 어려운 목표를 충족 하지 않는 최적화 제안은 Cruise Control에 의해 거부되고 승인을 위해 사용자에게 전송되지 않습니다.

참고

예를 들어, 주제의 복제본을 클러스터 전체에 균등하게 배포하는 소프트 목표를 가질 수 있습니다(대상 복제본 배포 목표). 크루즈 컨트롤은 설정된 모든 하드 목표를 충족할 수 있도록 하는 경우 이 목표를 무시합니다.

Cruise Control에서 다음과 같은 주요 최적화 목표는 하드 목표로 사전 설정됩니다.

RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal

Kafka.spec.cruiseControl.config 에서 hard.goals 속성을 편집하여 Cruise Control 배포 구성에서 하드 목표를 구성합니다.

  • Cruise Control에서 사전 설정된 하드 목표를 상속하려면 Kafka.spec.cruiseControl.config에서 hard.goals 속성을 지정하지 마십시오.
  • 사전 설정된 하드 목표를 변경하려면 정규화된 도메인 이름을 사용하여 hard.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 목록에 있지만 전부는 아니지만 skipHardGoalCheck: true 가 지정된 경우에도 Cruise Control은 하드 목표로 처리합니다.

11.2.4. 주요 최적화 목표

최적화 목표는 모든 사용자가 사용할 수 있습니다. 주요 최적화 목표에 나열되지 않은 목표는 Cruise Control 운영에서 사용할 수 없습니다.

Cruise Control 배포 구성을 변경하지 않는 한 AMQ Streams는 다음과 같은 주요 최적화 목표를 Cruise Control에서 우선 순위 순으로 상속합니다.

RackAwareGoal; 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 속성에 지정된 모든 하드 목표를 포함해야 합니다. 명확히하기 위해 주요 최적화 목표 및 기본 목표에 대해 어려운 목표 (subset로)를 지정해야 합니다.

11.2.5. 기본 최적화 목표

크루즈 컨트롤은 기본 최적화 목표를 사용하여 캐시된 최적화 제안을 생성합니다. 캐시된 최적화 제안에 대한 자세한 내용은 11.3절. “최적화 제안 개요” 을 참조하십시오.

KafkaRebalance 사용자 정의 리소스에서 사용자 제공 최적화 목표를 설정하여 기본 최적화 목표를 재정의할 수 있습니다.

Cruise Control 배포 구성에서 default.goals 를 지정하지 않으면 주요 최적화 목표는 기본 최적화 목표로 사용됩니다. 이 경우 캐시된 최적화 제안은 주요 최적화 목표를 사용하여 생성됩니다.

  • 기본 설정으로 기본 최적화 목표를 사용하려면 Kafka.spec.cruiseControl.config 에서 default.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
      # ...

기본 최적화 목표를 지정하지 않으면 주요 최적화 목표를 사용하여 캐시된 제안이 생성됩니다.

11.2.6. 사용자 제공 최적화 목표

사용자 제공 최적화 목표는 특정 최적화 제안에 대해 구성된 기본 목표를 좁힙니다. KafkaRebalance 사용자 정의 리소스의 spec.goals 에서 필요에 따라 설정할 수 있습니다.

KafkaRebalance.spec.goals

사용자 제공 최적화 목표는 다양한 시나리오에 대한 최적화 제안을 생성할 수 있습니다. 예를 들어 디스크 용량 또는 디스크 사용률을 고려하지 않고 Kafka 클러스터에서 리더 복제본 배포를 최적화할 수 있습니다. 따라서 리더 복제본 배포를 위한 단일 사용자 제공 목표를 포함하는 KafkaRebalance 사용자 정의 리소스를 생성합니다.

사용자 제공 최적화 목표는 다음과 같습니다.

  • 구성된 모든 하드 목표를 포함하거나 오류가 발생합니다.
  • 주요 최적화 목표의 서브 세트 표시

최적화 제안을 생성할 때 구성된 하드 목표를 무시하려면 skipHardGoalCheck: true 속성을 KafkaRebalance 사용자 정의 리소스에 추가합니다. 11.6절. “최적화 제안 생성”을 참조하십시오.

11.3. 최적화 제안 개요

최적화 제안을 생성하고 제안된 변경 사항을 적용하도록 KafkaRebalance 리소스를 구성합니다. 최적화 제안은 파티션 워크로드가 브로커 사이에 더욱 균등하게 분산되는 Kafka 클러스터를 생성할 수 있는 제안된 변경 사항에 대한 요약입니다.

각 최적화 제안은 브로커 리소스에 대한 구성된 용량 제한에 따라 이를 생성하는 데 사용된 최적화 목표 집합을 기반으로 합니다.

모든 최적화 제안은 제안된 리밸런스(Rebalance)의 영향에 대한 추정치 입니다. 제안을 승인하거나 거부할 수 있습니다. 최적화 제안을 먼저 생성하지 않고 클러스터 리밸런스를 승인할 수 없습니다.

다음 재조정 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.

  • full
  • add-brokers
  • remove-brokers

11.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 (in-sync replicas)이 발생할 수 있습니다. 이러한 잠재적인 문제를 방지하기 위해 remove-brokers 모드는 제거할 브로커에서 복제본을 이동합니다. 이러한 브로커가 더 이상 복제본을 호스팅하지 않으면 축소 작업을 안전하게 실행할 수 있습니다. KafkaRebalance 사용자 정의 리소스의 spec.brokers 속성의 목록으로 제거할 브로커를 지정합니다.

일반적으로 전체 리밸런스 모드를 사용하여 브로커에 부하를 분산하여 Kafka 클러스터를 재조정합니다. Add-brokersremove-brokers 모드를 사용하여 클러스터를 확장 또는 축소하고 그에 따라 복제본을 리밸런싱할 때만 사용합니다.

리밸런스를 실행하는 절차는 실제로 세 가지 모드에서 동일합니다. 유일한 차이점은 spec.mode 속성을 통해 모드를 지정하는 것이며, 필요한 경우 spec.brokers 속성을 통해 추가되거나 제거될 브로커를 나열하는 것입니다.

11.3.2. 최적화 제안의 결과

최적화 제안이 생성되면 요약 및 브로커 로드가 반환됩니다.

요약
요약은 KafkaRebalance 리소스에 포함되어 있습니다. 요약에서는 제안된 클러스터 재조정에 대한 개요를 제공하고 관련 변경 사항의 규모를 나타냅니다. 성공적으로 생성된 최적화 제안에 대한 요약은 KafkaRebalance 리소스의 Status.OptimizationResult 속성에 포함됩니다. 제공된 정보는 전체 최적화 제안의 요약입니다.
브로커 로드
브로커 로드는 데이터를 JSON 문자열로 포함하는 ConfigMap에 저장됩니다. 브로커 로드는 제안된 리밸런스 값 전후에 표시되므로 클러스터의 각 브로커에 미치는 영향을 확인할 수 있습니다.

11.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 주석을 설정하여 최적화 제안을 승인합니다. Cruise Control은 Kafka 클러스터에 제안을 적용하고 클러스터 재조정 작업을 시작합니다.
최적화 제안 거부
최적화 제안을 승인하지 않도록 선택하는 경우 최적화 목표를 변경하거나 성능 튜닝 옵션을 업데이트한 다음 다른 제안을 생성할 수 있습니다. strimzi.io/refresh 주석을 사용하여 KafkaRebalance 리소스에 대한 새로운 최적화 제안을 생성할 수 있습니다.

최적화 제안을 사용하여 리밸런스에 필요한 변동을 평가합니다. 예를 들어 요약은 브로커 간 및 intra-broker 동작에 대해 설명합니다. inter-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 개의 파티션 리더를 다른 브로커로 이동할 것입니다. 이렇게 하려면 성능에 낮은 영향을 미치는 ZooKeeper 구성을 변경해야 합니다.

균형 점수는 최적화 제안이 승인되기 전과 후에 Kafka 클러스터의 전반적인 균형을 측정한 것입니다. 균형 점수는 최적화 목표를 기반으로 합니다. 모든 목표를 충족하는 경우 점수는 100입니다. 충족되지 않는 각 목표에 대해 점수가 줄어듭니다. balancedness 점수를 비교하여 Kafka 클러스터가 리밸런스를 따르는 것보다 균형이 낮은지 확인합니다.

11.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 로 이동합니다.

11.3.5. 최적화 제안 요약 속성

다음 표에서는 최적화 제안의 요약 섹션에 포함된 속성을 설명합니다.

Expand
표 11.1. 최적화 제안 요약에 포함된 속성
JSON 속성설명

numIntraBrokerReplicaMovements

클러스터 브로커 디스크 간에 전송할 총 파티션 복제본 수입니다.

리밸런스 작업 중 성능에 미치는 영향: 비교적 높지만 numReplica goments보다 낮습니다.

excludedBrokersForLeadership

아직 지원되지 않습니다. 빈 목록이 반환됩니다.

numReplicaMovements

별도의 브로커 간에 이동할 파티션 복제본 수입니다.

리밸런스 작업 중 성능에 미치는 영향 (Relatively high).

onDemandBalancednessScoreBefore, onDemandBalancednessScoreAfter

최적화 제안이 생성되기 전과 후에 Kafka 클러스터의 전반적인 균형을 측정합니다.

점수는 각 소프트 목표의 BalancednessScore 합계를 100에서 제외하여 계산됩니다. 크루즈 컨트롤은 기본.goals 또는 사용자 제공 목표 목록에서 목표의 위치를 비롯한 여러 요인을 기반으로 모든 최적화 목표에 BalancednessScore 를 할당합니다.

Before 점수는 Kafka 클러스터의 현재 구성을 기반으로 합니다. 이후 점수는 생성된 최적화 제안을 기반으로 합니다.

intraBrokerDataToMoveMB

동일한 브로커의 디스크 간에 이동할 각 파티션 복제본의 크기 합계입니다( numIntraBrokerReplica>-<ments 라고도함).

리밸런스 작업 중 성능에 미치는 영향: 변수. 수가 클수록 클러스터 재조정에 걸리는 시간이 길어집니다. 동일한 브로커에서 디스크 간에 많은 양의 데이터를 이동하는 것은 별도의 브로커보다 낮은 영향을 미칠 수 있습니다( dataTo>-<MB참조).

recentWindows

최적화 제안이 기반이 되는 지표 창 수입니다.

dataToMoveMB

별도의 브로커로 이동할 각 파티션 복제본의 크기 합계( numReplica>-<ments도 참조하십시오).

리밸런스 작업 중 성능에 미치는 영향: 변수. 수가 클수록 클러스터 재조정에 걸리는 시간이 길어집니다.

monitoredPartitionsPercentage

최적화 제안에 따라 Kafka 클러스터의 파티션 백분율입니다. excludedTopics 의 수에 의해 영향을 받습니다.

excludedTopics

KafkaRebalance 리소스의 spec.excludedTopicsRegex 속성에 정규식을 지정한 경우 해당 표현식과 일치하는 모든 주제 이름이 여기에 나열됩니다. 이러한 주제는 최적화 제안서의 파티션 복제/리더 동작 계산에서 제외됩니다.

numLeaderMovements

리더가 서로 다른 복제본으로 전환될 파티션 수입니다. 여기에는 ZooKeeper 설정 변경이 포함됩니다.

리밸런스 작업 중 성능에 미치는 영향 (Relatively low).

excludedBrokersForReplicaMove

아직 지원되지 않습니다. 빈 목록이 반환됩니다.

11.3.6. 브로커 로드 속성

브로커 로드는 JSON 형식 문자열로 KafkaRebalance 사용자 정의 리소스와 이름이 동일한 ConfigMap에 저장됩니다. 이 JSON 문자열은 각 브로커 ID에 대한 키가 있는 JSON 오브젝트로 구성되며 각 브로커의 여러 지표에 연결됩니다. 각 메트릭은 세 가지 값으로 구성됩니다. 첫 번째는 최적화 제안이 적용되기 전에 지표 값이고, 두 번째는 제안이 적용된 후의 예상 지표 값이며, 세 번째는 처음 두 값(이전의 -) 간의 차이점입니다.

참고

ConfigMap은 KafkaRebalance 리소스가 ProposalReady 상태에 있을 때 표시되고 재조정이 완료된 후에도 유지됩니다.

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

이 브로커가 현재 호스팅하는 모든 복제본의 리더가 될 경우 실현되는 가상 최대 네트워크 출력 속도입니다.

11.3.7. 캐시된 최적화 제안

Cruise Control은 구성된 기본 최적화 목표에 따라 캐시된 최적화 제안을 유지합니다. 워크로드 모델에서 생성되는 캐시된 최적화 제안은 Kafka 클러스터의 현재 상태를 반영하도록 15분마다 업데이트됩니다. 기본 최적화 목표를 사용하여 최적화 제안을 생성하는 경우 Cruise Control은 최근 캐시된 제안을 반환합니다.

캐시된 최적화 제안 새로 고침 간격을 변경하려면 Cruise Control 배포 구성에서 proposal.expiration.ms 설정을 편집합니다. Cruise Control 서버의 로드가 증가해도 빠르게 변경되는 클러스터의 경우 더 짧은 간격을 고려해 보십시오.

11.4. 성능 튜닝 개요 리밸런스

클러스터 리밸런스에 대해 여러 성능 튜닝 옵션을 조정할 수 있습니다. 이러한 옵션은 리밸런스에서 파티션 복제 및 리더십 변동이 실행되는 방법과 리밸런스 작업에 할당된 대역폭을 제어합니다.

11.4.1. 파티션 재할당 명령

최적화 제안은 별도의 파티션 재할당 명령으로 구성됩니다. 제안을 승인 하면 Cruise Control 서버에서 이러한 명령을 Kafka 클러스터에 적용합니다.

파티션 재할당 명령은 다음 유형의 작업으로 구성됩니다.

  • 파티션 이동: 파티션 복제본과 해당 데이터를 새 위치로 전송합니다. 파티션 동작은 다음 두 가지 형식 중 하나를 취할 수 있습니다.

    • inter-broker 이동: 파티션 복제본이 다른 브로커의 로그 디렉터리로 이동됩니다.
    • intra-broker 이동: 파티션 복제본은 동일한 브로커의 다른 로그 디렉터리로 이동됩니다.
  • 리더십 이동: 파티션 복제본의 리더를 전환하는 작업이 포함됩니다.

cruise Control은 일괄 처리로 Kafka 클러스터에 파티션 재할당 명령을 다시 할당합니다. 재조정 중 클러스터 성능은 각 배치에 포함된 각 유형의 이동 수에 따라 영향을 받습니다.

11.4.2. 복제본 이동 전략

클러스터 재조정 성능은 파티션 재할당 명령의 배치에 적용되는 복제본 이동 전략 의 영향을 받습니다. 기본적으로 Cruise Control은 BaseReplica>-<mentStrategy 를 사용하여 생성된 순서대로 명령을 적용합니다. 그러나 제안 초기에 매우 큰 파티션 재할당이 있는 경우 이 전략은 다른 재할당을 적용하는 속도가 느려질 수 있습니다.

크루즈 컨트롤은 최적화 제안에 적용할 수 있는 네 가지 대체 복제 이동 전략을 제공합니다.

  • PrioritizeSmallReplica>-<mentStrategy: 크기 조정 순서에 따라 재할당을 수행합니다.
  • PrioritizeLargeReplica>-<mentStrategy: 크기 조정 순서에 따라 재할당을 수행합니다.
  • PostponeUrpReplica>-<mentStrategy: 동기화되지 않은 파티션 복제본에 대한 재할당을 우선합니다.
  • PrioritizeMinIrWithOfflineReplicasStrategy: 오프라인 복제본이 있는 (At/Under)MinISR 파티션을 사용하여 재할당합니다. Kafka 사용자 정의 리소스의 사양에서 cruiseControl.config.concurrency.adjuster.min.isr.check.enabledtrue 로 설정된 경우에만 이 전략이 작동합니다.

이러한 전략은 시퀀스로 구성할 수 있습니다. 첫 번째 전략은 내부 논리를 사용하여 두 파티션 재할당을 비교하려고 합니다. 재할당이 동일한 경우 순서를 결정하는 순서의 다음 전략으로 전달합니다.

11.4.3. Intra-broker 디스크 밸런싱

동일한 브로커에서 디스크 간에 많은 양의 데이터를 이동해도 별도의 브로커 간에 미치는 영향은 적습니다. 동일한 브로커에서 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포를 실행하는 경우 Cruise Control은 디스크 간에 파티션의 균형을 조정할 수 있습니다.

참고

단일 디스크와 함께 JBOD 스토리지를 사용하는 경우 intra-broker 디스크 밸런싱을 통해 파티션의 균형을 조정할 디스크가 없기 때문입니다.

intra-broker 디스크 균형을 수행하려면 KafkaRebalance.spec 에서 rebalanceDisktrue 로 설정합니다. rebalanceDisktrue 로 설정할 때 Cruise Control이 자동으로 intra-broker 목표를 설정하고 inter-broker 목표를 무시하므로 KafkaRebalance.spec 에서 goal 필드를 설정하지 마십시오. 크루즈 컨트롤은 동시에 inter-broker 및 intra-broker 밸런싱을 수행하지 않습니다.

11.4.4. 튜닝 옵션 재조정

cruise Control은 위에서 설명한 리밸런스 매개변수를 튜닝하기 위한 몇 가지 구성 옵션을 제공합니다. Kafka 또는 최적화 제안 수준을 사용하여 Cruise Control을 구성하고 배포 할 때 이러한 튜닝 옵션을 설정할 수 있습니다.

  • Cruise Control 서버 설정은 Kafka.spec.cruiseControl.config 아래의 Kafka 사용자 정의 리소스에서 설정할 수 있습니다.
  • 개별 리밸런스 성능 구성은 KafkaRebalance.spec 아래에 설정할 수 있습니다.

관련 구성은 다음 표에 요약되어 있습니다.

Expand
표 11.2. 성능 튜닝 구성 재조정
크루즈 컨트롤 속성KafkaRebalance 속성Default설명

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

동일한 브로커에서 디스크 공간 사용률의 균형을 조정하는 인브로커 디스크 밸런싱을 활성화합니다. 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포에만 적용됩니다.

기본 설정을 변경하면 재조정하는 데 걸리는 시간과 재조정 중에 Kafka 클러스터에 배치된 로드에 영향을 미칩니다. 낮은 값을 사용하면 부하가 줄어들지만 소요되는 시간이 증가하며 그 반대의 경우도 마찬가지입니다.

11.5. Kafka를 사용하여 Cruise Control 구성 및 배포

Kafka 클러스터와 함께 Cruise Control을 배포하도록 Kafka 리소스를 구성합니다. Kafka 리소스의 cruiseControl 속성을 사용하여 배포를 구성할 수 있습니다. Kafka 클러스터당 Cruise Control의 하나의 인스턴스를 배포합니다.

Cruise Control config 에서 목표 구성을 사용하여 최적화 제안을 생성하기 위한 최적화 목표를 지정합니다. brokerCapacity 를 사용하여 리소스 배포와 관련된 목표에 대한 기본 용량 제한을 변경할 수 있습니다. 브로커가 이기종 네트워크 리소스가 있는 노드에서 실행중인 경우 덮어쓰기 를 사용하여 각 브로커에 대한 네트워크 용량 제한을 설정할 수 있습니다.

cruiseControl 구성에 빈 개체({})를 사용하는 경우 모든 속성은 기본값을 사용합니다.

Cruise Control의 구성 옵션에 대한 자세한 내용은 사용자 정의 리소스 API 참조 를 참조하십시오.

사전 요구 사항

  • 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
    크루즈 제어 구성. 표준 크루즈 제어 구성을 제공할 수 있으며 AMQ Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
    4
    최적화 목표 구성: 기본 최적화 목표(default.goals), 주요 최적화 목표(대상) 및 하드목표(hard.goals)에 대한 구성을 포함할 수 있습니다.
    5
    Cruise Control API에 대한 읽기 전용 액세스에 대해 CORS를 활성화 및 구성합니다.
    6
    지원되는 리소스 예약, 현재 cpumemory 요청, 사용할 수 있는 최대 리소스를 지정하기 위한 제한입니다.
    7
    크루즈 제어 로거 및 로그 수준은 ConfigMap을 통해 직접 (인라인) 또는 간접적으로 (외부) 추가. 사용자 지정 ConfigMap을 log4j.properties 키에 배치해야 합니다. 크루즈 컨트롤에는 rootLogger.level 이라는 단일 로거가 있습니다. 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다.
    8
    템플릿 사용자 지정. 여기서는 추가 보안 속성으로 Pod가 예약됩니다.
    9
    컨테이너(liveness)를 다시 시작할 시기와 컨테이너가 트래픽을 수락할 수 있는 시기(가용성)를 확인할 수 있는 상태 점검입니다.
    10
    Prometheus 지표가 활성화되었습니다. 이 예에서는 Prometheus ScanSetting 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 에는 준비되거나 예상된 복제본 수가 표시됩니다. AVAILABLE 출력에 1 이 표시되면 배포가 성공적으로 수행됩니다.

자동 생성 주제

다음 표에서는 Cruise Control을 배포할 때 자동으로 생성되는 세 가지 주제를 보여줍니다. Cruise Control이 제대로 작동하려면 이러한 항목이 필요하며 삭제하거나 변경하지 않아야 합니다. 지정된 구성 옵션을 사용하여 주제의 이름을 변경할 수 있습니다.

Expand
표 11.3. 자동 생성 주제
자동 생성 주제 구성기본 주제 이름생성됨함수

metric.reporter.topic

strimzi.cruisecontrol.metrics

AMQ Streams Metrics Reporter

각 Kafka 브로커의 Metrics Reporter의 원시 지표를 저장합니다.

partition.metric.sample.store.topic

strimzi.cruisecontrol.partitionmetricsamples

크루즈 컨트롤

각 파티션에 대해 파생된 지표를 저장합니다. 이는 메트릭 샘플 집계기( Metric Sample Aggregator )에 의해 생성됩니다.

broker.metric.sample.store.topic

strimzi.cruisecontrol.modeltrainingsamples

크루즈 컨트롤

Cluster Workload 모델을 생성하는 데 사용되는 지표 샘플을 저장합니다.

Cruise Control에 필요한 레코드 제거를 방지하기 위해 자동 생성된 항목에서 로그 압축을 비활성화합니다.

참고

Cruise Control이 활성화된 Kafka 클러스터에서 자동 생성된 항목의 이름이 변경되면 이전 주제를 삭제하지 않고 수동으로 제거해야 합니다.

다음에 수행할 작업

Cruise Control을 구성하고 배포한 후 최적화 제안을 생성할 수 있습니다.

11.6. 최적화 제안 생성

KafkaRebalance 리소스를 생성하거나 업데이트할 때 Cruise Control은 구성된 최적화 목표에 따라 Kafka 클러스터에 대한 최적화 제안을 생성합니다. 최적화 제안서에서 정보를 분석하고 승인할지 여부를 결정합니다. 최적화 제안 결과를 사용하여 Kafka 클러스터를 재조정할 수 있습니다.

다음 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.

  • 전체 (기본값)
  • add-brokers
  • remove-brokers

사용하는 모드는 Kafka 클러스터에서 이미 실행 중인지 또는 Kafka 클러스터를 축소하기 전에 재조정할지 아니면 스케일링 후 재조정할지 여부에 따라 다릅니다. 자세한 내용은 브로커 스케일링을 사용하여 모드 리밸런싱 을 참조하십시오.

사전 요구 사항

  • AMQ Streams 클러스터에 Cruise Control을 배포 했습니다.
  • 최적화 목표를 구성하고 브로커 리소스에 대한 용량 제한(선택 사항)을 구성했습니다.

Cruise Control 구성에 대한 자세한 내용은 11.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. 기본 목표를 사용하는 대신 사용자 제공 최적화 목표를 구성하려면 목표 속성을 추가하고 하나 이상의 목표를 입력합니다.

    다음 예에서 랙 인식 및 복제본 용량은 사용자 제공 최적화 목표로 구성됩니다.

    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 수에 직접 매핑하지 않습니다. 이는 Kafka.spec.kafka.resources.limits.cpu 에 구성된 CPU의 사이클이 있는 브로커당 단일 가상 CPU를 갖는 것과 같습니다. CPU 사용률과 용량 사이의 비율은 동일하게 유지되므로 리밸런스 동작에는 영향을 미치지 않습니다.

다음에 수행할 작업

11.7절. “최적화 제안 승인”

11.7. 최적화 제안 승인

Cruise Control에서 생성한 최적화 제안을 승인할 수 있습니다. 상태가 ProposalReady 인 경우 그런 다음 크루즈 컨트롤은 최적화 제안 사항을 Kafka 클러스터에 적용하고 파티션을 브로커에 다시 할당하고 파티션 리더십을 변경합니다.

Important

이것은 드라이 뛰기가 아닙니다. 최적화 제안을 승인하기 전에 다음을 수행해야 합니다.

  • 제안서를 갱신한 경우 날짜가 만료되었습니다.
  • 제안서의 내용을 주의 깊게 검토합니다.

사전 요구 사항

절차

승인하려는 최적화 제안에 대해 다음 단계를 수행하십시오.

  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>
    리밸런싱
    Rebalancing status는 재조정이 진행 중임을 나타냅니다.
    Ready
    Ready 상태는 리밸런스가 완료되었음을 나타냅니다.
    NotReady
    NotReady 상태는 오류가 발생했음을 나타냅니다. KafkaRebalance 리소스의 문제 수정을 참조하십시오.

    상태가 Ready 로 변경되면 리밸런스가 완료됩니다.

    동일한 KafkaRebalance 사용자 정의 리소스를 사용하여 다른 최적화 제안을 생성하려면 refresh 주석을 사용자 정의 리소스에 적용합니다. 이렇게 하면 사용자 정의 리소스가 PendingProposal 또는 ProposalReady 상태로 이동합니다. 그런 다음 원하는 경우 최적화 제안을 검토하고 승인 할 수 있습니다.

11.8. 클러스터 리밸런스 중지

클러스터 재조정 작업이 시작되면 완료되고 Kafka 클러스터의 전반적인 성능에 영향을 줄 수 있습니다.

진행 중인 클러스터 리밸런스 작업을 중지하려면 KafkaRebalance 사용자 정의 리소스에 stop 주석을 적용합니다. 그러면 Cruise Control이 파티션 재할당의 현재 배치를 완료한 다음 리밸런스를 중지하도록 지시합니다. 리밸런스가 중지되면 완료된 파티션 재할당이 이미 적용되어 있으므로 리밸런스 작업을 시작하기 전에 Kafka 클러스터의 상태가 다를 때 다릅니다. 추가 재조정이 필요한 경우 새로운 최적화 제안을 생성해야 합니다.

참고

중간(중지됨) 상태에서 Kafka 클러스터의 성능이 초기 상태보다 저하될 수 있습니다.

사전 요구 사항

  • KafkaRebalance 사용자 정의 리소스에 승인하여 최적화 제안을 승인 했습니다.
  • KafkaRebalance 사용자 정의 리소스의 상태는 재조정 입니다.

절차

  1. OpenShift에서 KafkaRebalance 리소스에 주석을 답니다.

    oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance=stop
  2. KafkaRebalance 리소스의 상태를 확인합니다.

    oc describe kafkarebalance rebalance-cr-name
  3. 상태가 Stopped 로 변경될 때까지 기다립니다.

11.9. KafkaRebalance 리소스 문제 해결

KafkaRebalance 리소스를 생성하거나 Cruise Control과 상호 작용할 때 문제가 발생하면 오류를 리소스 상태에 보고하고 이를 수정하는 방법에 대한 세부 정보와 함께 오류가 보고됩니다. 리소스도 NotReady 상태로 이동합니다.

클러스터 리밸런스 작업을 계속 진행하려면 KafkaRebalance 리소스 자체 또는 전체 Cruise Control 배포에서 문제를 수정해야 합니다. 문제에는 다음이 포함될 수 있습니다.

  • KafkaRebalance 리소스의 잘못 구성된 매개변수입니다.
  • KafkaRebalance 리소스에 Kafka 클러스터를 지정하는 strimzi.io/cluster 레이블이 없습니다.
  • Cruise Control 서버는 Kafka 리소스의 cruiseControl 속성이 누락되어 있지 않습니다.
  • Cruise Control 서버에 연결할 수 없습니다.

문제를 해결한 후 KafkaRebalance 리소스에 refresh 주석을 추가해야 합니다. "새로 고침" 과정에서 Cruise Control Server에서 새로운 최적화 제안이 요청됩니다.

사전 요구 사항

절차

  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 로 변경될 때까지 기다립니다.

12장. 파티션 재할당 툴 사용

Kafka 클러스터를 스케일링할 때 브로커를 추가 또는 제거하고 파티션 분배 또는 주제 복제 요소를 업데이트해야 할 수 있습니다. 파티션 및 주제를 업데이트하려면 kafka-reassign-partitions.sh 도구를 사용할 수 있습니다.

AMQ Streams 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-34-rhel8:2.4.0 --rm=true --restart=Never -- bash

12.1. 파티션 재할당 툴 개요

파티션 재할당 툴은 Kafka 파티션 및 브로커를 관리하기 위한 다음과 같은 기능을 제공합니다.

파티션 복제본 재배포
브로커를 추가하거나 제거하여 클러스터를 확장 및 축소하고 Kafka 파티션을 많이 로드된 브로커에서 활용도가 낮은 브로커로 이동합니다. 이렇게 하려면 이동할 주제와 파티션과 이동 위치를 식별하는 파티션 재할당 계획을 만들어야 합니다. 클러스터 재조정 프로세스를 자동화 하므로 이러한 유형의 작업에 cruise Control이 권장됩니다.
상태 조정 주제 복제 요인 및 축소
Kafka 주제의 복제 요소를 늘리거나 줄입니다. 이렇게 하려면 파티션에서 기존 복제 할당을 식별하고 복제 요소가 변경된 업데이트된 할당을 식별하는 파티션 재할당 계획을 만들어야 합니다.
기본 리더 변경
Kafka 파티션의 기본 리더를 변경합니다. 현재 기본 리더를 사용할 수 없거나 클러스터의 브로커 전체에 로드를 재배포하려는 경우 유용할 수 있습니다. 이렇게 하려면 복제본 순서를 변경하여 각 파티션의 새로운 기본 리더를 지정하는 파티션 재할당 계획을 생성해야 합니다.
특정 JBOD 볼륨을 사용하도록 로그 디렉터리 변경
특정 JBOD 볼륨을 사용하도록 Kafka 브로커의 로그 디렉터리를 변경합니다. Kafka 데이터를 다른 디스크 또는 스토리지 장치로 이동하려는 경우 유용할 수 있습니다. 이렇게 하려면 각 항목에 대한 새 로그 디렉터리를 지정하는 파티션 재할당 계획을 만들어야 합니다.

12.1.1. 파티션 재할당 계획 생성

파티션 재할당 도구(kafka-reassign-partitions.sh)는 현재 브로커에서 새 브로커로 이동해야 하는 파티션을 지정하는 파티션 할당 계획을 생성하여 작동합니다.

이 계획에 만족하는 경우 이를 실행할 수 있습니다. 그런 다음 도구는 다음을 수행합니다.

  • 파티션 데이터를 새 브로커로 마이그레이션
  • Kafka 브로커에서 메타데이터를 업데이트하여 새 파티션 할당을 반영합니다.
  • Kafka 브로커를 롤링 재시작하여 새 할당이 적용되도록 트리거합니다.

파티션 재할당 툴에는 세 가지 모드가 있습니다.

--generate
일련의 주제와 브로커를 가져와서 JSON 파일을 다시 할당하면 해당 주제의 파티션이 해당 브로커에 할당됩니다. 이는 전체 주제에서 작동하기 때문에 일부 주제의 일부 파티션만 다시 할당하려는 경우에만 사용할 수 없습니다.
--execute
JSON 파일을 다시 할당하고 클러스터의 파티션과 브로커에 적용합니다. 결과적으로 파티션을 얻는 브로커는 파티션 리더의 비만족이됩니다. 지정된 파티션에 대해 새 브로커가 ISR (in-sync replicas)에 가입되어 참여하면 이전 브로커는 후속 조치를 중단하고 해당 복제본을 삭제합니다.
--verify
--execute 단계와 동일한 재 할당 JSON 파일을 사용하여 --verify 는 파일의 모든 파티션이 의도된 브로커로 이동되었는지 확인합니다. 재할당이 완료되면 --verify 는 적용되는 트래픽 제한 (--throttle)도 제거합니다. 제거되지 않는 한 throttles는 재할당이 완료된 후에도 클러스터에 계속 영향을 미칩니다.

지정된 시간에 클러스터에서 하나의 재할당을 실행할 수 있으며 실행 중인 재할당을 취소할 수 없습니다. 재할당을 취소해야 하는 경우 완료될 때까지 기다린 다음 다른 재할당을 수행하여 첫 번째 재할당의 영향을 되돌립니다. kafka-reassign-partitions.sh 는 출력의 일부로 이 reassignment JSON을 출력합니다. 매우 큰 reassignment는 in-progress reassignment를 중지해야 하는 경우 다수의 작은 재할당으로 분류해야 합니다.

12.1.2. 파티션 재할당 JSON 파일에서 주제 지정

툴은 다시 할당할 주제를 지정하는 재할당 JSON 파일을 사용합니다. 특정 파티션을 이동하려면 JSON 파일을 다시 할당하거나 파일을 수동으로 생성할 수 있습니다.

reassignment JSON 파일의 구조는 다음과 같습니다.

{
  "version": 1,
  "partitions": [
    <PartitionObjects>
  ]
}

여기서 <ECDHEObjects >는 다음과 같이 쉼표로 구분된 오브젝트 목록입니다.

{
  "topic": <TopicName>,
  "partition": <Partition>,
  "replicas": [ <AssignedBrokerIds> ]
}

다음은 topic-a 의 파티션 4 를 브로커 2,47 에 할당하고 topic-b 의 파티션 2 를 브로커 1,57 에 할당하는 예제입니다.

파티션 재할당 파일 예

{
  "version": 1,
  "partitions": [
    {
      "topic": "topic-a",
      "partition": 4,
      "replicas": [2,4,7]
    },
    {
      "topic": "topic-b",
      "partition": 2,
      "replicas": [1,5,7]
    }
  ]
}

JSON에 포함되지 않은 파티션은 변경되지 않습니다.

12.1.3. JBOD 볼륨 간 파티션 할당

Kafka 클러스터에서 JBOD 스토리지를 사용하는 경우 특정 볼륨과 해당 로그 디렉터리(각 볼륨에 단일 로그 디렉터리가 있음) 간에 파티션을 다시 할당하도록 선택할 수 있습니다. 특정 볼륨에 파티션을 다시 할당하려면 JSON 파일의 reassignment JSON 파일에서 log_dirs 옵션을 <ECDHE Objects >에 추가합니다.

{
  "topic": <TopicName>,
  "partition": <Partition>,
  "replicas": [ <AssignedBrokerIds> ],
  "log_dirs": [ <AssignedLogDirs> ]
}

log_dirs 오브젝트에는 replicas 오브젝트에 지정된 복제본 수와 동일한 수의 로그 디렉터리가 포함되어야 합니다. 값은 로그 디렉터리의 절대 경로 또는 any 키워드여야 합니다.

로그 디렉터리를 지정하는 파티션 재 할당 파일 예

{
      "topic": "topic-a",
      "partition": 4,
      "replicas": [2,4,7].
      "log_dirs": [ "/var/lib/kafka/data-0/kafka-log2", "/var/lib/kafka/data-0/kafka-log4", "/var/lib/kafka/data-0/kafka-log7" ]
}

12.1.4. 파티션 재할당 제한

파티션 재할당은 브로커 간에 대량의 데이터를 전송해야 하므로 프로세스가 느려질 수 있습니다. 클라이언트에 미치는 영향을 방지하려면 재할당 프로세스를 제한할 수 있습니다. kafka-reassign-partitions.sh 툴과 함께 --throttle 매개변수를 사용하여 재할당을 제한합니다. 브로커 간 파티션 이동에 대한 초당 최대 임계값을 바이트 단위로 지정합니다. 예를 들어 --throttle 5000000 은 50MBps의 파티션을 이동하는 최대 임계값을 설정합니다.

제한으로 인해 재할당이 완료되는 데 시간이 더 오래 걸릴 수 있습니다.

  • 목축이 너무 낮으면 새로 할당된 브로커는 게시 중인 레코드를 계속 유지할 수 없으며 재할당은 완료되지 않습니다.
  • 목회자가 너무 높으면 고객은 영향을 받습니다.

예를 들어 생산자의 경우 이는 일반 대기 시간보다 높은 것으로 확인 대기 중인 것으로 나타날 수 있습니다. 소비자의 경우 폴링 간 대기 시간이 길기 때문에 발생하는 처리량이 감소한 것으로 나타날 수 있습니다.

12.2. 파티션을 다시 할당하기 위한 JSON 파일 재 할당 생성

kafka-reassign-partitions.sh 도구를 사용하여 JSON 파일을 다시 할당하여 Kafka 클러스터를 확장한 후 파티션을 다시 할당합니다. 브로커를 추가하거나 제거해도 기존 파티션을 자동으로 재배포하지 않습니다. 파티션 배포의 균형을 조정하고 새 브로커를 최대한 활용하기 위해 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를 배포하면 Kafka 클러스터 이름( <cluster_name> -cluster-ca-cert )을 사용하여 클러스터CA 인증서가 있는 보안이 생성됩니다. 예: my-cluster-cluster-ca-cert.

  2. AMQ Streams Kafka 이미지를 사용하여 새 대화형 Pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.

    oc run --restart=Never --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.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 사용자를 생성하면 Kafka 사용자 이름으로 사용자 CA 인증서가 있는 시크릿이 생성됩니다. 예를 들면 my-user 입니다.

  5. 사용자 CA 인증서를 대화형 Pod 컨테이너에 복사합니다.

    oc cp user.p12 <interactive_pod_name>:/tmp

    CA 인증서를 사용하면 대화형 Pod 컨테이너가 TLS를 사용하여 Kafka 브로커에 연결할 수 있습니다.

  6. config.properties 파일을 생성하여 Kafka 클러스터에 대한 연결을 인증하는 데 사용되는 신뢰 저장소 및 키 저장소를 지정합니다.

    이전 단계에서 추출한 인증서와 암호를 사용합니다.

    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 클러스터 이름을 사용하여 < kafka_cluster_name>을 바꿉니다.
    2
    암호화에 TLS를 사용할 때 보안 프로토콜 옵션입니다.
    3
    신뢰 저장소 위치에는 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 명령을 사용하여 reassignment 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

12.3. 브로커를 추가한 후 파티션 할당

kafka-reassign-partitions.sh 툴로 생성된 재할당 파일을 사용하여 Kafka 클러스터의 브로커 수를 늘리면 파티션을 다시 할당합니다. 재할당 파일은 파티션이 확대된 Kafka 클러스터의 브로커에 다시 할당되는 방법을 설명해야 합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다.

다음 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.

참고

kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동화된 파티션 재할당 및 클러스터 재조정에는 Cruise Control이 권장됩니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.

사전 요구 사항

  • 내부 TLS 암호화 및 mTLS 인증으로 구성된 Kafka 리소스를 기반으로 실행 중인 Kafka 클러스터가 있습니다.
  • reassignment.json 이라는 reassignment JSON 파일을 생성했습니다.
  • 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
  • Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된 KafkaUser 로 연결됩니다.

JSON 파일 할당 생성을 참조하십시오.

절차

  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 간 제한 속도를 초당 바이트 단위로 --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

    이 명령은 두 개의 reassignment JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 저장해야 합니다. 두 번째 JSON 오브젝트는 reassignment JSON 파일에서 전달된 대상 재할당입니다.

    reassignment 중에 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을 저장한 경우 되돌리기 파일을 삭제할 수 있습니다.

12.4. 브로커를 제거하기 전에 파티션 다시 할당

kafka-reassign-partitions.sh 툴로 생성된 재할당 파일을 사용하여 Kafka 클러스터의 브로커 수를 줄이기 전에 파티션을 다시 할당합니다. 재할당 파일은 파티션을 Kafka 클러스터의 나머지 브로커에 다시 할당하는 방법을 설명해야 합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다. 번호가 많은 Pod의 브로커가 먼저 제거됩니다.

다음 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.

참고

kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동화된 파티션 재할당 및 클러스터 재조정에는 Cruise Control이 권장됩니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.

사전 요구 사항

  • 내부 TLS 암호화 및 mTLS 인증으로 구성된 Kafka 리소스를 기반으로 실행 중인 Kafka 클러스터가 있습니다.
  • reassignment.json 이라는 reassignment JSON 파일을 생성했습니다.
  • 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
  • Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된 KafkaUser 로 연결됩니다.

JSON 파일 할당 생성을 참조하십시오.

절차

  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 간 제한 속도를 초당 바이트 단위로 --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

    이 명령은 두 개의 reassignment JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 저장해야 합니다. 두 번째 JSON 오브젝트는 reassignment JSON 파일에서 전달된 대상 재할당입니다.

    reassignment 중에 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을 저장한 경우 되돌리기 파일을 삭제할 수 있습니다.
  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 속성을 편집하여 브로커 수를 줄일 수 있습니다.

12.5. 주제의 복제 요소 변경

Kafka 클러스터에서 주제의 복제 요소를 변경하려면 kafka-reassign-partitions.sh 도구를 사용합니다. 이 작업은 Kafka 클러스터에 연결된 대화형 Pod 컨테이너에서 툴을 실행하고 다시 할당 파일을 사용하여 주제 복제본 변경 방법을 설명하는 방식으로 수행할 수 있습니다.

다음 절차에서는 TLS를 사용하는 보안 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.

사전 요구 사항

  • 내부 TLS 암호화 및 mTLS 인증으로 구성된 Kafka 리소스를 기반으로 실행 중인 Kafka 클러스터가 있습니다.
  • 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
  • reassignment.json 이라는 reassignment 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 를 사용하여 주제의 각 파티션에 대한 목록의 마지막 복제본을 제거합니다.

    각 파티션에 대한 마지막 주제 복제본 제거

    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 스크립트를 사용하여 주제 복제를 변경합니다.

    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. --describe 옵션과 함께 bin/kafka-topics.sh 명령을 실행하여 주제 변경 결과를 확인합니다.

    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

13장. AMQ Streams Operator 사용

AMQ Streams Operator를 사용하여 Kafka 클러스터 및 Kafka 주제 및 사용자를 관리합니다.

13.1. AMQ Streams Operator를 사용하여 네임스페이스 모니터링

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

  • Cluster Operator는 Kafka 리소스를 감시합니다.
  • 주제 Operator는 KafkaTopic 리소스를 감시합니다.
  • User Operator는 KafkaUser 리소스를 조사합니다.

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

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

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

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

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

13.2. Cluster Operator 사용

Cluster Operator를 사용하여 Kafka 클러스터 및 기타 Kafka 구성 요소를 배포합니다.

13.2.1. RBAC(역할 기반 액세스 제어) 리소스

Cluster Operator는 OpenShift 리소스에 액세스해야 하는 AMQ Streams 구성 요소에 대한 RBAC 리소스를 생성하고 관리합니다.

Cluster Operator가 작동하려면 Kafka 및 KafkaConnect 와 같은 Kafka 리소스와 상호 작용하고 ConfigMap,Pod,배포,StatefulSetService 와 같은 관리형 리소스와 상호 작용하려면 OpenShift 클러스터 내 권한이 필요합니다.

권한은 OpenShift 역할 기반 액세스 제어(RBAC) 리소스를 통해 지정됩니다.

  • ServiceAccount
  • RoleClusterRole
  • RoleBindingClusterRoleBinding
13.2.1.1. AMQ Streams 구성 요소에 대한 권한 위임

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

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

다음 표에는 Cluster Operator가 생성한 RBAC 리소스에 대해 설명합니다.

Expand
표 13.1. ServiceAccount 리소스
이름사용 대상

<cluster_name>-kafka

Kafka 브로커 Pod

<cluster_name>-zookeeper

zookeeper Pod

<cluster_name>-cluster-connect

Kafka Connect Pod

<cluster_name>-mirror-maker

MirrorMaker Pod

<cluster_name>-mirrormaker2

MirrorMaker 2 Pod

<cluster_name>-bridge

Kafka 브리지 Pod

<cluster_name>-entity-operator

엔터티 Operator

Expand
표 13.2. ClusterRole 리소스
이름사용 대상

strimzi-cluster-operator-namespaced

Cluster Operator

strimzi-cluster-operator-global

Cluster Operator

strimzi-cluster-operator-leader-election

Cluster Operator

strimzi-kafka-broker

클러스터 Operator, 랙 기능(사용 시)

strimzi-entity-operator

Cluster Operator, Topic Operator, User Operator

strimzi-kafka-client

랙을 위한 Cluster Operator, Kafka 클라이언트

Expand
표 13.3. ClusterRoleBinding 리소스
이름사용 대상

strimzi-cluster-operator

Cluster Operator

strimzi-cluster-operator-kafka-broker-delegation

랙을 위한 Cluster Operator, Kafka 브로커

strimzi-cluster-operator-kafka-client-delegation

랙을 위한 Cluster Operator, Kafka 클라이언트

Expand
표 13.4. RoleBinding 리소스
이름사용 대상

strimzi-cluster-operator

Cluster Operator

strimzi-cluster-operator-kafka-broker-delegation

랙을 위한 Cluster Operator, Kafka 브로커

13.2.1.2. ServiceAccount를 사용하여 Cluster Operator 실행

ServiceAccount 를 사용하여 Cluster Operator를 실행하는 것이 가장 좋습니다.

Cluster Operator의 ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
  name: strimzi-cluster-operator
  labels:
    app: strimzi

그런 다음 Operator의 Deploymentspec.template.spec.serviceAccountName 에 이를 지정해야 합니다.

Cluster Operator의 부분 배포

apiVersion: apps/v1
kind: Deployment
metadata:
  name: strimzi-cluster-operator
  labels:
    app: strimzi
spec:
  replicas: 1
  selector:
    matchLabels:
      name: strimzi-cluster-operator
      strimzi.io/kind: cluster-operator
  template:
      # ...

12행입니다. 여기서 strimzi-cluster-operatorserviceAccountName 으로 지정됩니다.

13.2.1.3. ClusterRole 리소스

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

참고

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

ClusterRole 리소스는 최소 권한 원칙을 따르고 Kafka 구성 요소의 클러스터를 작동하기 위해 Cluster Operator에 필요한 권한만 포함합니다. 첫 번째 할당된 권한 세트를 사용하면 Cluster Operator에서 StatefulSet,Deployment,Pod, ConfigMap 과 같은 OpenShift 리소스를 관리할 수 있습니다.

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

Cluster Operator는 strimzi-cluster-operator-namespacedstrimzi-cluster-operator-global 클러스터 역할을 사용하여 네임스페이스 범위의 리소스 수준 및 클러스터 범위 리소스 수준에서 권한을 부여합니다.

Cluster Operator의 네임스페이스 리소스가 있는 ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: strimzi-cluster-operator-namespaced
  labels:
    app: strimzi
rules:
  # Resources in this role are used by the operator based on an operand being deployed in some namespace. When needed, you
  # can deploy the operator as a cluster-wide operator. But grant the rights listed in this role only on the namespaces
  # where the operands will be deployed. That way, you can limit the access the operator has to other namespaces where it
  # does not manage any clusters.
  - apiGroups:
      - "rbac.authorization.k8s.io"
    resources:
      # The cluster operator needs to access and manage rolebindings to grant Strimzi components cluster permissions
      - rolebindings
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - "rbac.authorization.k8s.io"
    resources:
      # The cluster operator needs to access and manage roles to grant the entity operator permissions
      - roles
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - ""
    resources:
      # The cluster operator needs to access and delete pods, this is to allow it to monitor pod health and coordinate rolling updates
      - pods
      # The cluster operator needs to access and manage service accounts to grant Strimzi components cluster permissions
      - serviceaccounts
      # The cluster operator needs to access and manage config maps for Strimzi components configuration
      - configmaps
      # The cluster operator needs to access and manage services and endpoints to expose Strimzi components to network traffic
      - services
      - endpoints
      # The cluster operator needs to access and manage secrets to handle credentials
      - secrets
      # The cluster operator needs to access and manage persistent volume claims to bind them to Strimzi components for persistent data
      - persistentvolumeclaims
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - "apps"
    resources:
      # The cluster operator needs to access and manage deployments to run deployment based Strimzi components
      - deployments
      - deployments/scale
      - deployments/status
      # The cluster operator needs to access and manage stateful sets to run stateful sets based Strimzi components
      - statefulsets
      # The cluster operator needs to access replica-sets to manage Strimzi components and to determine error states
      - replicasets
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - "" # legacy core events api, used by topic operator
      - "events.k8s.io" # new events api, used by cluster operator
    resources:
      # The cluster operator needs to be able to create events and delegate permissions to do so
      - events
    verbs:
      - create
  - apiGroups:
      # Kafka Connect Build on OpenShift requirement
      - build.openshift.io
    resources:
      - buildconfigs
      - buildconfigs/instantiate
      - builds
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - networking.k8s.io
    resources:
      # The cluster operator needs to access and manage network policies to lock down communication between Strimzi components
      - networkpolicies
      # The cluster operator needs to access and manage ingresses which allow external access to the services in a cluster
      - ingresses
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - route.openshift.io
    resources:
      # The cluster operator needs to access and manage routes to expose Strimzi components for external access
      - routes
      - routes/custom-host
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - image.openshift.io
    resources:
      # The cluster operator needs to verify the image stream when used for Kafka Connect image build
      - imagestreams
    verbs:
      - get
  - apiGroups:
      - policy
    resources:
      # The cluster operator needs to access and manage pod disruption budgets this limits the number of concurrent disruptions
      # that a Strimzi component experiences, allowing for higher availability
      - poddisruptionbudgets
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update

Cluster Operator의 클러스터 범위 리소스가 있는 ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: strimzi-cluster-operator-global
  labels:
    app: strimzi
rules:
  - apiGroups:
      - "rbac.authorization.k8s.io"
    resources:
      # The cluster operator needs to create and manage cluster role bindings in the case of an install where a user
      # has specified they want their cluster role bindings generated
      - clusterrolebindings
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update
  - apiGroups:
      - storage.k8s.io
    resources:
      # The cluster operator requires "get" permissions to view storage class details
      # This is because only a persistent volume of a supported storage class type can be resized
      - storageclasses
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      # The cluster operator requires "list" permissions to view all nodes in a cluster
      # The listing is used to determine the node addresses when NodePort access is configured
      # These addresses are then exposed in the custom resource states
      - nodes
    verbs:
      - list

strimzi-cluster-operator-leader-election 클러스터 역할은 리더 선택에 필요한 권한을 나타냅니다.

리더 선택 권한이 있는 ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: strimzi-cluster-operator-leader-election
  labels:
    app: strimzi
rules:
  - apiGroups:
      - coordination.k8s.io
    resources:
      # The cluster operator needs to access and manage leases for leader election
      # The "create" verb cannot be used with "resourceNames"
      - leases
    verbs:
      - create
  - apiGroups:
      - coordination.k8s.io
    resources:
      # The cluster operator needs to access and manage leases for leader election
      - leases
    resourceNames:
      # The default RBAC files give the operator only access to the Lease resource names strimzi-cluster-operator
      # If you want to use another resource name or resource namespace, you have to configure the RBAC resources accordingly
      - strimzi-cluster-operator
    verbs:
      - get
      - list
      - watch
      - delete
      - patch
      - update

strimzi-kafka-broker 클러스터 역할은 랙 인식을 사용하는 Kafka Pod의 init 컨테이너에서 필요한 액세스를 나타냅니다.

strimzi- <cluster_name> -kafka-init 라는 역할 바인딩은 strimzi -kafka-broker 역할을 사용하여 <cluster_name > -kafka 서비스 계정 액세스 권한을 부여합니다. rack 기능을 사용하지 않고 클러스터가 nodeport 를 통해 노출되지 않으면 바인딩이 생성되지 않습니다.

Cluster Operator의 ClusterRole 을 통해 OpenShift 노드에 대한 액세스를 Kafka 브로커 Pod에 위임할 수 있습니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: strimzi-kafka-broker
  labels:
    app: strimzi
rules:
  - apiGroups:
      - ""
    resources:
      # The Kafka Brokers require "get" permissions to view the node they are on
      # This information is used to generate a Rack ID that is used for High Availability configurations
      - nodes
    verbs:
      - get

strimzi-entity-operator 클러스터 역할은 Topic Operator 및 User Operator에 필요한 액세스를 나타냅니다.

Topic Operator는 상태 정보를 사용하여 OpenShift 이벤트를 생성하므로 < cluster_name> -entity-operator 서비스 계정이 strimzi-entity-operator 역할에 바인딩되어 strimzi-entity-operator 역할 바인딩을 통해 이 액세스 권한을 부여합니다.

Cluster Operator의 ClusterRole 을 통해 이벤트에 대한 액세스를 Topic 및 User Operator에 위임할 수 있습니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: strimzi-entity-operator
  labels:
    app: strimzi
rules:
  - apiGroups:
      - "kafka.strimzi.io"
    resources:
      # The entity operator runs the KafkaTopic assembly operator, which needs to access and manage KafkaTopic resources
      - kafkatopics
      - kafkatopics/status
      # The entity operator runs the KafkaUser assembly operator, which needs to access and manage KafkaUser resources
      - kafkausers
      - kafkausers/status
    verbs:
      - get
      - list
      - watch
      - create
      - patch
      - update
      - delete
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      # The entity operator needs to be able to create events
      - create
  - apiGroups:
      - ""
    resources:
      # The entity operator user-operator needs to access and manage secrets to store generated credentials
      - secrets
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - patch
      - update

strimzi-kafka-client 클러스터 역할은 랙 인식을 사용하는 Kafka 클라이언트가 필요로 하는 액세스를 나타냅니다.

Cluster Operator의 ClusterRole 을 통해 OpenShift 노드에 대한 액세스를 Kafka 클라이언트 기반 Pod에 위임할 수 있습니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: strimzi-kafka-client
  labels:
    app: strimzi
rules:
  - apiGroups:
      - ""
    resources:
      # The Kafka clients (Connect, Mirror Maker, etc.) require "get" permissions to view the node they are on
      # This information is used to generate a Rack ID (client.rack option) that is used for consuming from the closest
      # replicas when enabled
      - nodes
    verbs:
      - get

13.2.1.4. ClusterRoleBinding 리소스

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

Cluster Operator의 ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: strimzi-cluster-operator
  labels:
    app: strimzi
subjects:
  - kind: ServiceAccount
    name: strimzi-cluster-operator
    namespace: myproject
roleRef:
  kind: ClusterRole
  name: strimzi-cluster-operator-global
  apiGroup: rbac.authorization.k8s.io

권한 위임에 사용되는 클러스터 역할에도 클러스터 역할 바인딩이 필요합니다.

Cluster Operator 및 Kafka 브로커 랙 인식에 대한 ClusterRoleBinding 의 예

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: strimzi-cluster-operator-kafka-broker-delegation
  labels:
    app: strimzi
# The Kafka broker cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Kafka brokers.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
  - kind: ServiceAccount
    name: strimzi-cluster-operator
    namespace: myproject
roleRef:
  kind: ClusterRole
  name: strimzi-kafka-broker
  apiGroup: rbac.authorization.k8s.io

Cluster Operator 및 Kafka 클라이언트 랙 인식에 대한 ClusterRoleBinding 의 예

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: strimzi-cluster-operator-kafka-client-delegation
  labels:
    app: strimzi
# The Kafka clients cluster role must be bound to the cluster operator service account so that it can delegate the
# cluster role to the Kafka clients using it for consuming from closest replica.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
  - kind: ServiceAccount
    name: strimzi-cluster-operator
    namespace: myproject
roleRef:
  kind: ClusterRole
  name: strimzi-kafka-client
  apiGroup: rbac.authorization.k8s.io

네임스페이스된 리소스만 포함하는 클러스터 역할은 역할 바인딩만 사용하여 바인딩됩니다.

Cluster Operator의 RoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: strimzi-cluster-operator
  labels:
    app: strimzi
subjects:
  - kind: ServiceAccount
    name: strimzi-cluster-operator
    namespace: myproject
roleRef:
  kind: ClusterRole
  name: strimzi-cluster-operator-namespaced
  apiGroup: rbac.authorization.k8s.io

Cluster Operator 및 Kafka 브로커 랙 인식에 대한 RoleBinding 의 예

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: strimzi-cluster-operator-entity-operator-delegation
  labels:
    app: strimzi
# The Entity Operator cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Entity Operator.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
  - kind: ServiceAccount
    name: strimzi-cluster-operator
    namespace: myproject
roleRef:
  kind: ClusterRole
  name: strimzi-entity-operator
  apiGroup: rbac.authorization.k8s.io

13.2.2. Cluster Operator 로깅을 위한 ConfigMap

클러스터 Operator 로깅은 strimzi-cluster-operator 라는 ConfigMap 을 통해 구성됩니다.

Cluster Operator를 설치할 때 로깅 구성이 포함된 ConfigMap 이 생성됩니다. 이 ConfigMapinstall/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml 파일에 설명되어 있습니다. 이 ConfigMap 에서 data 필드 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

재로드 간격의 빈도를 변경하려면 생성된 ConfigMapmonitorInterval 옵션에서 시간(초)을 설정합니다.

Cluster Operator를 배포할 때 ConfigMap 이 누락되면 기본 로깅 값이 사용됩니다.

Cluster Operator가 배포된 후 ConfigMap 이 실수로 삭제되면 가장 최근에 로드된 로깅 구성이 사용됩니다. 새 ConfigMap 을 생성하여 새 로깅 구성을 로드합니다.

참고

ConfigMap 에서 monitorInterval 옵션을 제거하지 마십시오.

13.2.3. 환경 변수를 사용하여 Cluster Operator 구성

환경 변수를 사용하여 Cluster Operator를 구성할 수 있습니다. 지원되는 환경 변수는 여기에 나열되어 있습니다.

참고

환경 변수는 배포 구성 파일에서 Cluster Operator의 컨테이너 이미지에 대해 지정됩니다. (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
기본값은 120000ms입니다. 정기적인 조정 간격( 밀리초)입니다.
STRIMZI_OPERATION_TIMEOUT_MS
선택 사항: 기본 300000ms. 내부 작업 시간(밀리초)입니다. 일반 OpenShift 작업이 일반 OpenShift 작업보다 오래 걸리는 클러스터에서 AMQ Streams를 사용하면 이 값을 늘립니다(예: Docker 이미지 다운로드 속도가 느려짐).
STRIMZI_ZOOKEEPER_ADMIN_SESSION_TIMEOUT_MS
선택 사항: 기본 10000ms. Cluster Operator의 ZooKeeper admin 클라이언트에 대한 세션 제한 시간(밀리초)입니다. 클러스터 Operator의 ZooKeeper 요청이 시간 초과 문제로 인해 정기적으로 실패하는 경우 값을 늘립니다. ZooKeeper 서버 측에 maxSessionTimeout 구성을 통해 허용되는 최대 세션 시간이 있습니다. 기본적으로 최대 세션 시간 제한 값은 40000ms의 기본 tickTime (기본값은 2000)의 20배입니다. 더 높은 시간 초과가 필요한 경우 maxSessionTimeout ZooKeeper 서버 구성 값을 변경합니다.
STRIMZI_OPERATIONS_THREAD_POOL_SIZE
선택 사항: 기본값은 10입니다. Cluster Operator가 실행하는 다양한 비동기 및 차단 작업에 사용되는 작업자 스레드 풀 크기입니다.
STRIMZI_OPERATOR_NAME
선택 사항: 기본값은 Pod의 호스트 이름입니다. Operator 이름은 OpenShift 이벤트를 내보낼 때 AMQ Streams 인스턴스를 식별합니다.
STRIMZI_OPERATOR_NAMESPACE

Cluster Operator가 실행 중인 네임스페이스의 이름입니다. 이 변수를 수동으로 구성하지 마십시오. Downward API를 사용합니다.

env:
  - name: STRIMZI_OPERATOR_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
STRIMZI_OPERATOR_NAMESPACE_LABELS

선택 사항: AMQ Streams Cluster Operator가 실행 중인 네임스페이스의 레이블입니다. 네임스페이스 레이블을 사용하여 네트워크 정책에서 네임스페이스 선택기를 구성합니다. 네트워크 정책을 사용하면 AMQ Streams 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

선택 사항: {COMPONENT_NAME} 사용자 정의 리소스에서 생성한 모든 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,KafkaMirrorMaker, KafkaMirrorMaker2 리소스에 적용됩니다. KafkaRebalanceKafkaConnector 리소스는 해당 Kafka 및 Kafka Connect 클러스터에 일치하는 라벨이 있는 경우에만 작동합니다.

env:
  - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR
    value: label1=value1,label2=value2
STRIMZI_KAFKA_IMAGES
필수 항목입니다. Kafka 버전에서 해당 버전의 Kafka 브로커가 포함된 해당 Docker 이미지로 매핑됩니다. 필요한 구문은 공백 또는 쉼표로 구분된 < version> = <image> 쌍입니다. 예: 3.3.1=registry.redhat.io/amq-streams/kafka-33-rhel8:2.4.0, 3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0. 이는 Kafka 리소스의 Kafka.spec.kafka.version 속성이 지정되었지만 Kafka 리소스의 Kafka.spec.kafka.image 가 아닌 경우 사용됩니다.
STRIMZI_DEFAULT_KAFKA_INIT_IMAGE
Optional, default registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.4.0. Kafka 리소스에서 kafka-init-image 로 지정된 이미지가 없는 경우 init 컨테이너에 기본적으로 사용할 이미지 이름입니다. init 컨테이너는 랙 지원과 같은 초기 구성 작업을 위한 브로커보다 먼저 시작됩니다.
STRIMZI_KAFKA_CONNECT_IMAGES
필수 항목입니다. Kafka 버전에서 해당 버전에 대한 Kafka Connect의 해당 Docker 이미지로 매핑합니다. 필요한 구문은 공백 또는 쉼표로 구분된 < version> = <image> 쌍입니다. 예: 3.3.1=registry.redhat.io/amq-streams/kafka-33-rhel8:2.4.0, 3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0. 이는 KafkaConnect.spec.version 속성이 지정되었지만 KafkaConnect.spec.image 가 아닌 경우 사용됩니다.
STRIMZI_KAFKA_MIRROR_MAKER_IMAGES
필수 항목입니다. Kafka 버전에서 해당 버전의 MirrorMaker에 대한 해당 Docker 이미지로 매핑합니다. 필요한 구문은 공백 또는 쉼표로 구분된 < version> = <image> 쌍입니다. 예: 3.3.1=registry.redhat.io/amq-streams/kafka-33-rhel8:2.4.0, 3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0. 이는 KafkaMirrorMaker.spec.version 속성이 지정되었지만 KafkaMirrorMaker.spec.image 가 아닌 경우 사용됩니다.
STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE
Optional, default registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.4.0. Kafka 리소스에서 Kafka.spec.entityOperator.topicOperator.image 로 지정된 이미지가 없는 경우 Topic Operator를 배포할 때 사용할 이미지 이름입니다.
STRIMZI_DEFAULT_USER_OPERATOR_IMAGE
Optional, default registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.4.0. Kafka 리소스에서 Kafka.spec.entityOperator.userOperator.image 로 지정된 이미지가 없는 경우 User Operator를 배포할 때 사용할 이미지 이름입니다.
STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE
Optional, default registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0. Kafka 리소스에서 Kafka.spec.entityOperator.tlsSidecar.image 로 지정된 이미지가 없는 경우 Entity Operator에 대한 사이드카 컨테이너를 배포할 때 사용할 이미지 이름입니다. 사이드카는 TLS 지원을 제공합니다.
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 도메인 이름이 있습니다.

예를 들어, broker 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
선택 사항: 기본 300000ms. 추가 커넥터를 사용하여 새 Kafka Connect 이미지를 빌드하는 시간(밀리초)입니다. AMQ 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 클래스에 대한 구성입니다.
13.2.3.1. 리더 선택 환경 변수

추가 Cluster Operator 복제본을 실행할 때 리더 선택 환경 변수를 사용합니다. 주요 오류로 인한 중단 방지를 방지하기 위해 추가 복제본을 실행할 수 있습니다.

STRIMZI_LEADER_ELECTION_ENABLED
선택 사항, 비활성화됨(false)은 기본적으로 사용됩니다. 리더 선택을 활성화하거나 비활성화하여 추가 Cluster Operator 복제본을 CloudEvent에서 실행할 수 있습니다.
참고

리더 선택 기능은 기본적으로 비활성화되어 있습니다. 설치 시 이 환경 변수를 적용할 때만 활성화됩니다.

STRIMZI_LEADER_ELECTION_LEASE_NAME
리더 선택을 할 때 필요합니다. 리더 선택에 사용되는 OpenShift Lease 리소스의 이름입니다.
STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE

리더 선택을 할 때 필요합니다. 리더 선택에 사용된 OpenShift 리스 리소스가 생성되는 네임스페이스입니다. 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
선택 사항: 기본 15000ms. 인수된 임대 기간의 유효 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RENEW_DEADLINE_MS
선택 사항: 기본 10000ms. 리더가 리더십을 유지하기 위해 시도해야 하는 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RETRY_PERIOD_MS
선택 사항: 기본 2000ms. 리더에 의해 임대 잠금에 대한 업데이트 빈도를 지정합니다.
13.2.3.2. 네트워크 정책을 사용하여 Cluster Operator 액세스 제한

STRIMZI_OPERATOR_NAMESPACE_LABELS 환경 변수를 사용하여 네임스페이스 레이블을 사용하여 Cluster Operator의 네트워크 정책을 설정합니다.

Cluster Operator는 관리하는 리소스와 동일한 네임스페이스 또는 별도의 네임스페이스에서 실행할 수 있습니다. 기본적으로 STRIMZI_OPERATOR_NAMESPACE 환경 변수는 하향 API를 사용하여 Cluster Operator가 실행 중인 네임스페이스를 찾도록 구성됩니다. Cluster Operator가 리소스와 동일한 네임스페이스에서 실행 중인 경우 로컬 액세스만 필요하며 AMQ Streams에서 허용됩니다.

Cluster Operator가 관리하는 리소스에 대한 별도의 네임스페이스에서 실행 중인 경우 네트워크 정책을 구성하지 않는 한 OpenShift 클러스터의 모든 네임스페이스에 액세스할 수 있습니다. 네임스페이스 레이블을 추가하면 Cluster Operator에 대한 액세스가 지정된 네임스페이스로 제한됩니다.

Cluster Operator 배포에 구성된 네트워크 정책

#...
env:
  # ...
  - name: STRIMZI_OPERATOR_NAMESPACE_LABELS
    value: label1=value1,label2=value2
  #...

13.2.3.3. 정기적인 조정의 시간 간격 설정

STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 변수를 사용하여 정기적인 조정을 위한 시간 간격을 설정합니다.

Cluster Operator는 OpenShift 클러스터에서 수신한 적용 가능한 클러스터 리소스에 대한 모든 알림에 반응합니다. Operator가 실행되고 있지 않거나 어떠한 이유로 알림이 수신되지 않으면 리소스가 실행 중인 OpenShift 클러스터 상태와 동기화되지 않습니다. 장애 조치(failover)를 올바르게 처리하기 위해 Cluster Operator에서 정기적인 조정 프로세스를 실행하여 리소스 상태를 현재 클러스터 배포와 비교하여 모든 항목에 일관된 상태를 유지할 수 있습니다.

13.2.4. 기본 프록시 설정으로 Cluster Operator 구성

HTTP 프록시 뒤에서 Kafka 클러스터를 실행하는 경우 클러스터 내부 및 외부에서 데이터를 전달할 수 있습니다. 예를 들어 프록시 외부에서 데이터를 푸시하고 가져오는 커넥터를 사용하여 Kafka Connect를 실행할 수 있습니다. 또는 프록시를 사용하여 권한 부여 서버에 연결할 수 있습니다.

프록시 환경 변수를 지정하도록 Cluster Operator 배포를 구성합니다. Cluster Operator는 표준 프록시 구성(HTTP_PROXY,HTTPS_PROXY, NO_PROXY)을 환경 변수로 허용합니다. 프록시 설정은 모든 AMQ Streams 컨테이너에 적용됩니다.

프록시 주소 형식은 http://IP-ADDRESS:PORT-NUMBER 입니다. 이름 및 암호를 사용하여 프록시를 설정하려면 형식은 http://USERNAME:PASSWORD@IP-ADDRESS:PORT-NUMBER 입니다.

사전 요구 사항

  • CustomResourceDefinition 및 RBAC(ClusterRole, RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.

절차

  1. Cluster Operator에 프록시 환경 변수를 추가하려면 Deployment 구성 (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

13.2.5. 리더 선택을 사용하여 여러 Cluster Operator 복제본 실행

기본 Cluster Operator 구성을 사용하면 리더 선택을 수행할 수 있습니다. 리더 선택을 사용하여 Cluster Operator의 여러 병렬 복제본을 실행합니다. 하나의 복제본은 활성 리더로 선택되며 배포된 리소스를 운영합니다. 다른 복제본은 ReadWriteMany 모드에서 실행됩니다. 리더가 중지되거나 실패하면 새로운 리더로IR스 복제본 중 하나가 선택되고 배포된 리소스 운영을 시작합니다.

기본적으로 AMQ Streams는 항상 리더 복제본인 단일 Cluster Operator 복제본과 함께 실행됩니다. 단일 Cluster Operator 복제본이 중지되거나 실패하면 OpenShift에서 새 복제본을 시작합니다.

여러 복제본에서 Cluster Operator를 실행하는 것은 필수 사항은 아닙니다. 그러나 대규모 중단의 경우 복제본이 CloudEvent에 있는 것이 좋습니다. 예를 들어 여러 작업자 노드 또는 전체 가용성 영역이 실패했다고 가정합니다. 이로 인해 Cluster Operator Pod와 많은 Kafka Pod가 동시에 중단될 수 있습니다. 후속 Pod 예약으로 인해 리소스 부족이 발생하는 경우 단일 Cluster Operator를 실행할 때 작업이 지연될 수 있습니다.

13.2.5.1. Cluster Operator 복제본 구성

latency 모드에서 추가 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 리소스를 사용할 수 있는 권한을 제공합니다. 다른 리스 이름 또는 네임스페이스를 사용하는 경우 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

    사용 가능한 환경 변수에 대한 자세한 내용은 13.2.3.1절. “리더 선택 환경 변수” 을 참조하십시오.

    리더 선택에 사용된 Lease 리소스에 대해 다른 이름 또는 네임스페이스를 지정한 경우 RBAC 리소스를 업데이트합니다.

  3. (선택 사항) 022-ClusterRole-strimzi-cluster-operator-role.yaml 파일에서 ClusterRole 리소스를 편집합니다.

    resourceNamesLease 리소스 이름으로 업데이트합니다.

    임대에 대한 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 리소스를 편집합니다.

    Lease 리소스의 이름과 생성된 네임스페이스로 subjects.namesubjects.namespace 를 업데이트합니다.

    임대에 대한 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 에는 준비되거나 예상된 복제본 수가 표시됩니다. AVAILABLE 출력에 올바른 복제본 수가 표시되면 배포가 성공한 것입니다.

13.2.6. FIPS 지원

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

최소 암호 길이

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

중요

FIPS 지원 OpenShift 클러스터를 사용하는 경우 일반 OpenShift 클러스터에 비해 메모리 사용량이 증가할 수 있습니다. 문제를 방지하기 위해 최소 512Mi에 대한 메모리 요청을 늘리는 것이 좋습니다.

13.2.6.1. FIPS 모드 비활성화

FIPS 지원 OpenShift 클러스터에서 실행할 때 AMQ Streams가 FIPS 모드로 자동 전환합니다. Cluster Operator의 배포 구성에서 FIPS_MODE 환경 변수를 비활성화 하도록 설정하여 FIPS 모드를 비활성화합니다. FIPS 모드가 비활성화되면 AMQ Streams는 모든 구성 요소에 대해 OpenJDK에서 FIPS를 자동으로 비활성화합니다. FIPS 모드가 비활성화된 경우 AMQ Streams는 FIPS와 호환되지 않습니다. AMQ Streams 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

13.3. Topic Operator 사용

KafkaTopic 리소스를 사용하여 항목을 생성, 수정 또는 삭제할 때 Topic Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.

KafkaTopic 리소스에 대한 자세한 내용은 KafkaTopic 스키마 참조 를 참조하십시오.

Topic Operator 배포

Cluster Operator 또는 독립 실행형 Operator로 Topic Operator를 배포할 수 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 Topic Operator를 사용합니다.

배포 지침은 다음을 참조하십시오.

중요

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

13.3.1. Kafka 주제 리소스

KafkaTopic 리소스는 파티션 및 복제본 수를 포함한 주제를 구성하는 데 사용됩니다.

KafkaTopic 의 전체 스키마는 KafkaTopic 스키마 참조에 설명되어 있습니다.

13.3.1.1. 주제 처리를 위한 Kafka 클러스터 식별

KafkaTopic 리소스에는 해당 리소스가 속한 Kafka 클러스터 이름에서 파생된 Kafka 클러스터의 이름을 지정하는 레이블이 포함되어 있습니다.

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

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: topic-name-1
  labels:
    strimzi.io/cluster: my-cluster

레이블은 Topic Operator에서 KafkaTopic 리소스를 식별하고 새 주제를 생성하고 주제의 후속 처리에 사용됩니다.

레이블이 Kafka 클러스터와 일치하지 않으면 Topic Operator에서 KafkaTopic 을 식별할 수 없으며 항목이 생성되지 않습니다.

13.3.1.2. Kafka 주제 사용 권장 사항

주제로 작업할 때 일관성이 유지되어야 합니다. 항상 OpenShift에서 KafkaTopic 리소스 또는 주제에서 직접 작동합니다. 지정된 항목에 대해 두 방법 간에 정기적으로 전환하지 않도록 합니다.

주제의 특성을 반영하는 주제 이름을 사용하고 나중에 이름을 변경할 수 없다는 점에 유의하십시오.

Kafka에서 주제를 생성하는 경우 유효한 OpenShift 리소스 이름인 이름을 사용합니다. 그렇지 않으면 Topic Operator는 OpenShift 규칙을 준수하는 이름으로 해당 KafkaTopic 을 생성해야 합니다.

참고

OpenShift의 식별자 및 이름에 대한 요구 사항에 대한 자세한 내용은 오브젝트 이름 및 ID 를 참조하십시오.

13.3.1.3. Kafka 주제 이름 지정 규칙

Kafka 및 OpenShift는 Kafka 및 KafkaTopic.metadata.name 의 주제 이름 지정에 대해 자체 검증 규칙을 적용합니다. 서로 유효하지 않은 이름 각각에 대해 유효한 이름이 있습니다.

spec.topicName 속성을 사용하면 OpenShift의 Kafka 항목에 유효하지 않은 이름으로 Kafka에서 유효한 항목을 생성할 수 있습니다.

spec.topicName 속성은 Kafka 이름 지정 검증 규칙을 상속합니다.

  • 이름은 249자를 초과해서는 안 됩니다.
  • Kafka 주제의 유효한 문자는 ASCII 영숫자, . ., _, 및 - 입니다.
  • 이름은 . 또는 ....의 이름은 사용할 수 없습니다 . 하지만 이름이 exampleTopic. 또는 .exampleTopic 과 같은 이름으로 사용할 수 있습니다.

spec.topicName 은 변경되지 않아야 합니다.

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

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: topic-name-1
spec:
  topicName: topicName-1 
1

  # ...
1
OpenShift에서 대문자가 잘못되었습니다.

다음으로 변경할 수 없음:

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: topic-name-1
spec:
  topicName: name-2
  # ...
참고

Kafka Streams와 같은 일부 Kafka 클라이언트 애플리케이션은 Kafka에서 프로그래밍 방식으로 항목을 생성할 수 있습니다. 이러한 항목에 유효하지 않은 OpenShift 리소스 이름이 있는 경우 Topic Operator는 Kafka 이름을 기반으로 유효한 metadata.name 을 제공합니다. 유효하지 않은 문자가 교체되고 이름에 해시가 추가됩니다. 예를 들면 다음과 같습니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: mytopic---c55e57fe2546a33f9e603caf57165db4072e827e
spec:
  topicName: myTopic
  # ...

13.3.2. 주제 Operator 주제 저장소

Topic Operator는 Kafka를 사용하여 주제 구성을 키-값 쌍으로 설명하는 주제 메타데이터를 저장합니다. 주제 저장소는 Kafka 주제를 사용하여 상태를 유지하는 Kafka Streams 키-값 메커니즘을 기반으로 합니다.

주제 메타데이터는 메모리 내 캐시되며 Topic Operator 내에서 로컬로 액세스합니다. 로컬 메모리 내 캐시에 적용되는 작업에서의 업데이트는 디스크의 백업 주제 저장소에 유지됩니다. 주제 저장소는 Kafka 주제 또는 OpenShift KafkaTopic 사용자 정의 리소스의 업데이트와 지속적으로 동기화됩니다. 이러한 방식으로 설정된 주제 저장소를 사용하여 작업이 신속하게 처리되지만 메모리 내 캐시 충돌은 영구 스토리지에서 자동으로 다시 채워집니다.

13.3.2.1. 내부 주제 저장소 주제

내부 주제에서는 주제 저장소의 주제 메타데이터 처리를 지원합니다.

__strimzi_store_topic
주제 메타데이터를 저장하기 위한 입력 주제
__strimzi-topic-operator-kstreams-topic-store-changelog
컴팩트한 주제 저장소 값의 로그 유지
주의

주제 Operator를 실행하는 데 필수 항목이므로 이러한 주제를 삭제하지 마십시오.

13.3.2.2. ZooKeeper에서 주제 메타데이터 마이그레이션

AMQ Streams의 이전 릴리스에서는 주제 메타데이터가 ZooKeeper에 저장되었습니다. 새 프로세스에서는 이 요구 사항을 제거하여 Kafka 클러스터에 메타데이터를 가져오고 Topic Operator를 제어할 수 있습니다.

AMQ Streams 2.4로 업그레이드할 때 주제 저장소의 Topic Operator 제어로의 전환이 원활합니다. 메타데이터가 찾아 ZooKeeper에서 마이그레이션되며 이전 저장소는 삭제됩니다.

주제 메타데이터의 스토리지에 ZooKeeper를 사용하는 1.7 이전의 AMQ Streams 버전으로 되돌리는 경우 여전히 Cluster Operator를 이전 버전으로 다운그레이드한 다음 Kafka 브로커 및 클라이언트 애플리케이션을 이전 Kafka 버전으로 다운그레이드합니다.

그러나 Kafka 클러스터의 부트스트랩 주소를 지정하여 kafka-admin 명령을 사용하여 주제 저장소에 생성된 주제도 삭제해야 합니다. 예를 들면 다음과 같습니다.

oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.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의 주제 상태에서 ZooKeeper 주제 메타데이터를 재구성합니다.

13.3.2.4. Operator 주제 복제 및 스케일링 주제

Topic Operator에서 관리하는 항목에 대해 권장되는 구성은 3 항목 복제 요소와 최소 2 개의 동기화 복제본입니다.

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 구성은 메시지를 성공적으로 수신한 것으로 승인되기 전에 메시지를 복제해야 하는 후속 파티션의 수를 결정합니다. Topic Operator는 acks=all 로 실행되며, 여기서 모든 동기화 복제본에서 메시지를 확인해야 합니다.

브로커를 추가하거나 제거하여 Kafka 클러스터를 스케일링할 때 복제 요소 구성이 변경되지 않고 복제본이 자동으로 다시 할당되지 않습니다. 그러나 kafka-reassign-partitions.sh 도구를 사용하여 복제 요소를 변경하고 복제본을 브로커에 수동으로 다시 할당할 수 있습니다.

대안으로 Cruise Control for AMQ Streams의 통합은 주제의 복제 요소를 변경할 수는 없지만 Kafka를 재조정하기 위해 생성하는 최적화 제안에는 파티션 복제를 전송하고 파티션 리더십을 변경하는 명령이 포함됩니다.

13.3.2.5. 주제의 변경 사항 처리

Topic Operator가 해결해야 하는 근본적인 문제는 단일 정보 소스가 없다는 것입니다. KafkaTopic 리소스와 Kafka 주제 모두 Topic Operator와 독립적으로 수정할 수 있다는 것입니다. 이로 인해 Topic Operator가 각 끝에서 변경 사항을 실시간으로 관찰하지 못할 수 있습니다. 예를 들어 Topic Operator가 다운된 경우입니다.

이를 해결하기 위해 Topic Operator는 주제 저장소의 각 항목에 대한 정보를 유지합니다. Kafka 클러스터 또는 OpenShift에서 변경이 발생하면 다른 시스템 및 주제 저장소의 상태를 확인하여 모든 항목을 동기화 상태로 유지하기 위해 변경해야 하는 사항을 확인합니다. Topic Operator가 시작될 때마다 그리고 실행되는 동안 주기적으로 동일한 문제가 발생합니다.

예를 들어 Topic Operator가 실행되고 있지 않고 my-topic 라는 KafkaTopic 이 생성되었다고 가정합니다. 주제 Operator가 시작되면 주제 저장소에 my-topic에 대한 정보가 포함되어 있지 않으므로 마지막 실행 후 KafkaTopic 이 생성되었음을 추측할 수 있습니다. 주제 Operator는 my-topic에 해당하는 항목을 생성하고 주제 저장소에 my-topic의 메타데이터도 저장합니다.

Kafka 주제 구성을 업데이트하거나 KafkaTopic 사용자 정의 리소스를 통해 변경 사항을 적용하면 Kafka 클러스터 조정 후 주제 저장소가 업데이트됩니다.

또한 주제 저장소는 Topic Operator에서 주제 구성이 Kafka 주제에서 변경되고 변경 사항이 호환되지 않는 한 OpenShift KafkaTopic 사용자 정의 리소스를 통해 업데이트되는 시나리오를 관리할 수 있습니다. 예를 들어 동일한 주제 구성 키를 변경할 수 있지만 다른 값으로 변경할 수 있습니다. 호환되지 않는 변경의 경우 Kafka 구성이 우선하며 KafkaTopic 이 적절하게 업데이트됩니다.

참고

또한 KafkaTopic 리소스를 사용하여 oc delete -f KAFKA-TOPIC-CONFIG-FILE 명령을 사용하여 항목을 삭제할 수도 있습니다. 이 작업을 수행하려면 Kafka 리소스의 spec.kafka.config 에서 delete.topic.enabletrue (기본값)로 설정해야 합니다.

13.3.3. Kafka 주제 구성

KafkaTopic 리소스의 속성을 사용하여 Kafka 주제를 구성합니다.

oc apply 를 사용하여 주제를 만들거나 수정하고 oc delete 를 사용하여 기존 주제를 삭제할 수 있습니다.

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

  • oc apply -f <topic_config_file>
  • oc delete KafkaTopic <topic_name>

다음 절차에서는 10개의 파티션과 2개의 복제본으로 주제를 생성하는 방법을 설명합니다.

시작하기 전에

변경하기 전에 다음을 고려하는 것이 중요합니다.

  • Kafka는 파티션 수 감소를 지원하지 않습니다.
  • 키가 있는 항목에 대해 spec.partitions 를 늘리면 레코드 분할 방법이 변경되며, 주제에서 의미 있는 파티셔닝 을 사용할 때 특히 문제가 될 수 있습니다.
  • AMQ Streams는 KafkaTopic 리소스를 통해 다음과 같은 변경을 지원하지 않습니다.

    • spec.replicas 를 사용하여 처음에 지정된 복제본 수 변경
    • spec.topicName을 사용하여 주제 이름 변경

사전 요구 사항

  • mTLS 인증 및 TLS 암호화를 사용하는 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
  • 실행 중인 Topic Operator(일반적으로 Entity Operator를 사용하여 배포)
  • Kafka 리소스의 spec.kafka.config 에 있는 delete.topic.enable=true (default)를 삭제합니다.

절차

  1. KafkaTopic 리소스를 구성합니다.

    Kafka 주제 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: orders
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 10
      replicas: 2

    작은 정보

    주제를 수정할 때 oc get kafkatopic orders -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

13.3.4. 리소스 요청 및 제한을 사용하여 Topic Operator 구성

CPU 및 메모리와 같은 리소스를 Topic Operator에 할당하고 사용할 수 있는 리소스 양을 제한할 수 있습니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

절차

  1. 필요에 따라 편집기에서 Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka MY-CLUSTER
  2. Kafka 리소스의 spec.entityOperator.topicOperator.resources 속성에서 Topic Operator에 대한 리소스 요청 및 제한을 설정합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # Kafka and ZooKeeper sections...
      entityOperator:
        topicOperator:
          resources:
            requests:
              cpu: "1"
              memory: 500Mi
            limits:
              cpu: "1"
              memory: 500Mi
  3. 새 구성을 적용하여 리소스를 생성하거나 업데이트합니다.

    oc apply -f <kafka_configuration_file>

13.4. User Operator 사용

KafkaUser 리소스를 사용하여 사용자를 생성, 수정 또는 삭제할 때 User Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.

KafkaUser 리소스에 대한 자세한 내용은 KafkaUser 스키마 참조 를 참조하십시오.

User Operator 배포

Cluster Operator 또는 독립 실행형 Operator로 User Operator를 배포할 수 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 User Operator를 사용합니다.

배포 지침은 다음을 참조하십시오.

중요

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

13.4.1. Kafka 사용자 구성

KafkaUser 리소스의 속성을 사용하여 Kafka 사용자를 구성합니다.

oc apply 를 사용하여 사용자를 생성하거나 수정하고 oc delete 를 사용하여 기존 사용자를 삭제할 수 있습니다.

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

  • oc apply -f <user_config_file>
  • oc delete KafkaUser <user_name>

사용자는 Kafka 클라이언트를 나타냅니다. Kafka 사용자를 구성할 때 클라이언트가 Kafka에 액세스하기 위해 필요한 사용자 인증 및 권한 부여 메커니즘을 활성화합니다. 사용된 메커니즘은 동등한 Kafka 구성과 일치해야 합니다. KafkaKafkaUser 리소스를 사용하여 Kafka 브로커에 대한 액세스를 보호하는 방법에 대한 자세한 내용은 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
      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

13.4.2. 리소스 요청 및 제한을 사용하여 User Operator 구성

CPU 및 메모리와 같은 리소스를 User Operator에 할당하고 사용할 수 있는 리소스 양을 제한할 수 있습니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.

절차

  1. 필요에 따라 편집기에서 Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka MY-CLUSTER
  2. Kafka 리소스의 spec.entityOperator.userOperator.resources 속성에서 User Operator에 대한 리소스 요청 및 제한을 설정합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # Kafka and ZooKeeper sections...
      entityOperator:
        userOperator:
          resources:
            requests:
              cpu: "1"
              memory: 500Mi
            limits:
              cpu: "1"
              memory: 500Mi

    파일을 저장하고 편집기를 종료합니다. Cluster Operator는 변경 사항을 자동으로 적용합니다.

13.5. 기능 게이트 구성

AMQ Streams Operator는 기능 게이트 를 지원하여 특정 기능 및 기능을 활성화하거나 비활성화합니다. 기능 게이트를 활성화하면 관련 Operator의 동작이 변경되고 AMQ Streams 배포에 기능이 도입됩니다.

Feature gate에는 enabled 또는 disabled 의 기본 상태가 있습니다.

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

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

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

13.5.1. ControlPlaneListener 기능 게이트

ControlPlaneListener 기능 게이트가 GA로 이동했습니다. 즉, 이제 영구적으로 활성화되며 비활성화할 수 없습니다. ControlPlaneListener 를 활성화하면 Kafka 컨트롤러와 브로커 간 연결은 포트 9090에서 내부 컨트롤 플레인 리스너 를 사용합니다. 브로커 간 데이터 복제는 AMQ Streams Operator, Cruise Control 또는 Kafka Exporter의 내부 연결과 포트 9091에서 복제 리스너 를 사용합니다.

중요

ControlPlaneListener 기능 게이트가 영구적으로 활성화되면 AMQ Streams 1.7 및 이전 버전과 AMQ Streams 2.3 이상 간에 더 이상 직접 업그레이드하거나 다운그레이드할 수 없습니다. 먼저 AMQ Streams 버전 중 하나를 통해 먼저 업그레이드하거나 다운그레이드하고, ControlPlaneListener 기능 게이트를 비활성화한 다음 (기능 게이트가 활성화된 상태에서) 대상 버전으로 다운그레이드하거나 업그레이드해야 합니다.

13.5.2. ServiceAccountPatching 기능 게이트

ServiceAccountPatching 기능 게이트는 GA로 이동했으며 이는 이제 영구적으로 활성화되고 비활성화될 수 없음을 의미합니다. ServiceAccountPatching 을 활성화하면 Cluster Operator는 항상 서비스 계정을 조정하고 필요한 경우 업데이트합니다. 예를 들어 사용자 정의 리소스의 template 속성을 사용하여 서비스 계정 레이블 또는 주석을 변경하면 Operator는 기존 서비스 계정 리소스에서 자동으로 업데이트합니다.

13.5.3. UseStrimziPodSets 기능 게이트

UseStrimziPodSets 기능 게이트에는 기본 상태가 enabled 입니다.

UseStrimziPodSets 기능 게이트는 StrimziPodSet 이라는 Pod를 관리하기 위한 리소스를 도입합니다. 기능 게이트를 사용하면 이 리소스가 StatefulSets 대신 사용됩니다. AMQ Streams는 OpenShift 대신 포드 생성 및 관리를 처리합니다. StatefulSets 대신 StrimziPodSets를 사용하면 기능을 더 많이 제어할 수 있습니다.

이 기능 게이트가 비활성화되면 AMQ Streams는 StatefulSets를 사용하여 ZooKeeper 및 Kafka 클러스터에 대한 Pod를 생성하고 관리합니다. AMQ Streams는 StatefulSet을 생성하고 OpenShift는 StatefulSet 정의에 따라 Pod를 생성합니다. 포드가 삭제되면 OpenShift에서 다시 생성합니다. StatefulSets를 사용하려면 다음과 같은 제한 사항이 있습니다.

  • Pod는 항상 인덱스 번호에 따라 생성 또는 제거
  • StatefulSet의 모든 Pod에는 유사한 구성이 필요합니다.
  • StatefulSet에서 Pod의 스토리지 구성 변경은 복잡함

UseStrimziPodSets 기능 게이트 비활성화

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

중요

AMQ Streams 2.0 및 이전 버전으로 다운그레이드할 때 UseStrimziPodSets 기능 게이트를 비활성화해야 합니다.

13.5.4. (Preview) UseKRaft 기능 게이트

UseKRaft 기능 게이트는 기본 비활성 상태가 있습니다.

UseKRaft 기능 게이트는 ZooKeeper 없이 KRaft(Kafka Raft 메타데이터) 모드에서 Kafka 클러스터를 배포합니다. 이 기능 게이트는 현재 개발 및 테스트용으로만 사용됩니다.

중요

KRaft 모드는 Apache Kafka 또는 AMQ Streams의 프로덕션에 적합하지 않습니다.

UseKRaft 기능 게이트가 활성화되면 Kafka 클러스터는 ZooKeeper 없이 배포됩니다. Kafka 사용자 지정 리소스의 .spec.zookeeper 속성은 무시되지만 여전히 존재해야합니다. UseKRaft 기능 게이트는 Kafka 클러스터 노드 및 해당 역할을 구성하는 API를 제공합니다. API는 아직 개발 중이며 KRaft 모드가 production-ready가 되기 전에 변경될 것으로 예상됩니다.

현재 AMQ Streams의 KRaft 모드에는 다음과 같은 주요 제한 사항이 있습니다.

  • ZooKeeper가 있는 Kafka 클러스터에서 KRaft 클러스터로 이동하거나 다른 방법으로는 지원되지 않습니다.
  • Apache Kafka 버전 또는 AMQ Streams Operator의 업그레이드 및 다운그레이드는 지원되지 않습니다. 사용자가 클러스터를 삭제하고, Operator를 업그레이드하고 새 Kafka 클러스터를 배포해야 할 수 있습니다.
  • Topic Operator는 지원되지 않습니다. spec.entityOperator.topicOperator 속성은 Kafka 사용자 정의 리소스에서 제거해야 합니다.
  • SCRAM-SHA-512 인증은 지원되지 않습니다.
  • JBOD 스토리지는 지원되지 않습니다. type: jbod 스토리지를 사용할 수 있지만 JBOD 어레이는 하나의 디스크만 포함할 수 있습니다.
  • 모든 Kafka 노드에는 컨트롤러브로커 KRaft 역할이 모두 있습니다. 별도의 컨트롤러브로커 노드가 있는 Kafka 클러스터는 지원되지 않습니다.

UseKRaft 기능 게이트 활성화

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

중요

UseKRaft 기능 게이트는 UseStrimziPodSets 기능 게이트에 따라 다릅니다. UseKRaft 기능 게이트를 활성화할 때 UseStrimziPodSets 기능 게이트도 활성화되어 있는지 확인합니다.

13.5.5. (Preview) StableConnectIdentities 기능 게이트

StableConnectIdentities 기능 게이트는 비활성화됨의 기본 상태가 있습니다.

StableConnectIdentities 기능 게이트는 StrimziPodSet 리소스를 사용하여 OpenShift Deployment 리소스를 사용하는 대신 Kafka Connect 및 Kafka MirrorMaker 2 Pod를 관리합니다. StrimziPodSets 는 Pod에 안정적인 이름과 안정적인 주소를 제공하며 롤링 업그레이드 중에 변경되지 않습니다. 이를 통해 커넥터 작업 재조정 횟수를 최소화하는 데 도움이 됩니다.

StableConnectIdentities 기능 게이트 활성화

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

중요

AMQ Streams 2.3 및 이전 버전으로 다운그레이드할 때 StableConnectIdentities 기능 게이트를 비활성화해야 합니다.

13.5.6. 기능 게이트 릴리스

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

  • alpha - 일반적으로 비활성화됨
  • beta - 일반적으로 기본적으로 활성화됨
  • GA(General Availability) - 일반적으로 항상 사용 가능

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

  • ControlPlaneListener 기능 게이트는 AMQ Streams 2.3에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다.
  • ServiceAccountPatching 기능 게이트는 AMQ Streams 2.3에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다.
  • UseStrimziPodSets 기능 게이트는 AMQ Streams 2.3에서 베타 단계로 이동했습니다. StatefulSets에 대한 지원이 완전히 제거될 때 AMQ Streams의 향후 릴리스에서 GA로 이동합니다.
  • UseKRaft 기능 게이트는 개발 용도로만 사용할 수 있으며 현재 베타 단계로 이동할 계획이 없습니다.
  • StableConnectIdentities 기능 게이트는 알파 단계에 있으며 기본적으로 비활성화되어 있습니다.
참고

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

Expand
표 13.5. 알파, 베타 또는 GA로 이동할 때 기능 게이트 및 AMQ Streams 버전
기능 게이트alpha베타GA

ControlPlaneListener

1.8

2.0

2.3

ServiceAccountPatching

1.8

2.0

2.3

UseStrimziPodSets

2.1

2.3

향후 릴리스(예: 계획)

UseKRaft

2.2

-

-

StableConnectIdentities

2.4

향후 릴리스(예: 계획)

-

기능 게이트가 활성화된 경우 특정 AMQ Streams 버전에서 업그레이드 또는 다운그레이드하기 전에 이를 비활성화해야 할 수 있습니다. 다음 표는 AMQ Streams 버전을 업그레이드하거나 다운그레이드할 때 비활성화해야 하는 기능 게이트를 보여줍니다.

Expand
표 13.6. AMQ Streams 업그레이드 또는 다운그레이드 시 비활성화할 기능 게이트
Feature gate 비활성화AMQ Streams 버전에서 업그레이드AMQ Streams 버전으로 다운그레이드

ControlPlaneListener

1.7 이상

1.7 이상

UseStrimziPodSets

-

2.0 이상

StableConnectIdentities

-

2.3 이전 버전

13.6. Prometheus 지표를 사용하여 Operator 모니터링

AMQ Streams Operator는 Prometheus 지표를 노출합니다. 메트릭은 자동으로 활성화되며 다음에 대한 정보를 포함합니다.

  • 조정 수
  • Operator가 처리하는 Custom Resources 수
  • 조정 기간
  • Operator의 JVM 지표

또한 AMQ Streams는 Operator 에 대한 예제 Grafana 대시보드를 제공합니다.

14장. AMQ Streams에 대한 메트릭 및 대시보드 설정

Prometheus 및 Grafana를 사용하여 AMQ Streams 배포를 모니터링할 수 있습니다.

대시보드의 주요 메트릭을 보고 특정 조건에서 트리거되는 경고를 설정하여 AMQ Streams 배포를 모니터링할 수 있습니다. 메트릭은 AMQ Streams의 각 구성 요소에서 사용할 수 있습니다.

oauth 인증 및 opa 또는 keycloak 권한 부여와 관련된 메트릭을 수집할 수도 있습니다. Kafka 리소스의 리스너 구성에서 enableMetrics 속성을 true 로 설정하여 이 작업을 수행합니다. 예를 들어 spec.kafka.listeners.authenticationspec.kafka.authorization 에서 enableMetricstrue 로 설정합니다. 마찬가지로 KafkaBridge,KafkaConnect, KafkaMirrorMaker , KafkaMirrorMaker 2 사용자 정의 리소스에서 oauth 인증에 대한 지표를 활성화할 수 있습니다.

지표 정보를 제공하기 위해 AMQ Streams는 Prometheus 규칙 및 Grafana 대시보드를 사용합니다.

AMQ Streams의 각 구성 요소에 대한 규칙 세트로 구성된 경우 Prometheus는 클러스터에서 실행 중인 Pod의 주요 메트릭을 사용합니다. 그런 다음 Grafana는 대시보드에서 해당 지표를 시각화합니다. AMQ Streams에는 배포에 맞게 사용자 지정할 수 있는 Grafana 대시보드 예제가 포함되어 있습니다.

AMQ Streams는 사용자 정의 프로젝트(OpenShift 기능) 모니터링을 사용하여 Prometheus 설정 프로세스를 단순화합니다.

요구 사항에 따라 다음을 수행할 수 있습니다.

Prometheus 및 Grafana가 설정된 경우 모니터링을 위해 AMQ Streams에서 제공하는 Grafana 대시보드 예제를 사용할 수 있습니다.

또한 분산 추적을 설정하여 메시지를 엔드투엔드로 추적하도록 배포를 구성할 수 있습니다.

참고

AMQ Streams는 Prometheus 및 Grafana의 설치 파일 예를 제공합니다. AMQ Streams 모니터링을 시도할 때 이러한 파일을 시작점으로 사용할 수 있습니다. 추가 지원을 받으려면 Prometheus 및 Grafana 개발자 커뮤니티에 참여해 보십시오.

메트릭 및 모니터링 툴에 대한 지원 문서

메트릭 및 모니터링 툴에 대한 자세한 내용은 지원 문서를 참조하십시오.

14.1. Kafka 내보내기로 소비자 지연 모니터링

Kafka 내보내기 는 Apache Kafka 브로커 및 클라이언트의 모니터링을 개선하는 오픈 소스 프로젝트입니다. Kafka 클러스터와 함께 Kafka 내보내기를 배포하도록 Kafka 리소스를 구성할 수 있습니다. Kafka Exporter는 오프셋, 소비자 그룹, 소비자 지연 및 주제와 관련된 Kafka 브로커에서 추가 지표 데이터를 추출합니다. 예를 들어 지표 데이터가 느린 소비자를 식별하는 데 사용됩니다. 지연 데이터는 Prometheus 지표로 노출되며 분석을 위해 Grafana에 표시될 수 있습니다.

Kafka Exporter는 소비자 그룹에 대해 커밋된 오프셋에 대한 정보를 저장하는 __consumer_offsets 주제에서 읽습니다. Kafka 내보내기가 제대로 작동하려면 소비자 그룹을 사용 중이어야 합니다.

Kafka Exporter의 Grafana 대시보드는 AMQ Streams에서 제공하는 여러 가지 Grafana 대시보드 중 하나입니다.

중요

Kafka Exporter는 소비자 지연 및 소비자 오프셋과 관련된 추가 메트릭만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.

소비자 지연은 프로덕션 속도 및 메시지 소비 속도의 차이를 나타냅니다. 특히 지정된 소비자 그룹의 소비자 지연은 파티션의 마지막 메시지와 해당 소비자가 현재 선택 중인 메시지 간의 지연을 나타냅니다.

지연은 파티션 로그의 끝과 관련하여 소비자 오프셋의 위치를 반영합니다.

생산자와 소비자 오프셋 간의 소비자 지연

Consumer lag

이러한 차이점은 생산자 오프셋과 소비자 오프셋 간의 CloudEvent라고 합니다. Kafka 브로커 주제 파티션의 읽기 및 쓰기 위치입니다.

주제가 100개의 메시지 1초를 스트리밍한다고 가정합니다. 생산자 오프셋(주제 파티션 헤드)과 소비자가 읽은 마지막 오프셋 사이에 1000개의 메시지 지연은 10초 지연을 의미합니다.

소비자 지연 모니터링의 중요성

(near) 실시간 데이터 처리에 의존하는 애플리케이션의 경우 소비자 지연을 모니터링하여 너무 크지 않은지 확인하는 것이 중요합니다. 지연이 클수록 프로세스가 실시간 처리 목표에서 더 많이 이동합니다.

예를 들어 소비자 지연은 제거되지 않은 오래된 데이터를 너무 많이 소비하거나 계획되지 않은 종료를 통해 소비한 결과일 수 있습니다.

소비자 지연 감소

Grafana 차트를 사용하여 지연을 분석하고 작업을 줄이는 작업이 영향을 받는 소비자 그룹에 영향을 미치는지 확인합니다. 예를 들어 Kafka 브로커가 지연을 줄이기 위해 조정되면 대시보드에 소비자 그룹 차트가 내려가고 분별 차트가 소비되는 메시지가 표시됩니다.

지연을 줄이기 위한 일반적인 작업은 다음과 같습니다.

  • 새 소비자를 추가하여 확장 소비자 그룹
  • 메시지에 대한 보존 시간이 항목에 남아 있게 늘립니다.Increase the retention time for a message to remain in a topic.
  • 메시지 버퍼를 늘리기 위한 디스크 용량 추가

소비자 지연을 줄이기 위한 조치는 기본 인프라에 따라 다르며 AMQ Streams가 지원하는 사용 사례에 따라 다릅니다. 예를 들어 지연된 소비자는 브로커가 디스크 캐시에서 가져오기 요청을 처리할 수 있다는 이점이 적습니다. 그리고 특정 경우에는 소비자가 캡처될 때까지 메시지를 자동으로 삭제하는 것이 허용될 수 있습니다.

14.2. Cruise Control 작업 모니터링

cruise Control은 브로커, 주제 및 파티션의 사용률을 추적하기 위해 Kafka 브로커를 모니터링합니다. Cruise Control은 자체 성능을 모니터링하기 위한 일련의 메트릭도 제공합니다.

Cruise Control 지표 보고자는 Kafka 브로커에서 원시 메트릭 데이터를 수집합니다. 데이터는 Cruise Control에 의해 자동으로 생성되는 항목에 생성됩니다. 메트릭은 Kafka 클러스터에 대한 최적화 제안을 생성하는 데 사용됩니다.

Cruise Control 작업 실시간 모니터링에 대해 Cruise Control 메트릭을 사용할 수 있습니다. 예를 들어 Cruise Control 메트릭을 사용하여 실행 중인 재조정 작업의 상태를 모니터링하거나 작업 성능에서 감지된 모든 이상 사항에 대한 경고를 제공할 수 있습니다.

Cruise Control 구성에서 PrometheusECDHE Exporter 를 활성화하여 Cruise Control 메트릭을 노출합니다.

참고

센서로 알려진 사용 가능한 Cruise Control 지표의 전체 목록은 Cruise Control 문서를 참조하십시오.

14.2.1. Cruise Control 지표 노출

Cruise Control 작업에 지표를 노출하려면 Cruise Control을 배포하고 배포에 Prometheus 지표를 활성화하도록 Kafka 리소스를 구성합니다. 자체 구성을 사용하거나 AMQ Streams에서 제공하는 kafka-cruise-control-metrics.yaml 파일 예제를 사용할 수 있습니다.

Kafka 리소스에서 CruiseControl 속성의 metricsConfig 에 구성을 추가합니다. 이 구성을 사용하면 Prometheus>-< Exporter 에서 HTTP 끝점을 통해 Cruise Control 지표를 노출할 수 있습니다. HTTP 끝점은 Prometheus 서버에서 스크랩합니다.

Cruise Control의 메트릭 구성 예

  apiVersion: kafka.strimzi.io/v1beta2
  kind: Kafka
  metadata:
    name: my-cluster
  Spec:
    # ...
    cruiseControl:
      # ...
      metricsConfig:
        type: jmxPrometheusExporter
        valueFrom:
          configMapKeyRef:
            name: cruise-control-metrics
            key: metrics-config.yml
  ---
  kind: ConfigMap
  apiVersion: v1
  metadata:
    name: cruise-control-metrics
    labels:
      app: strimzi
  data:
    metrics-config.yml: |
    # metrics configuration...

14.2.2. Cruise Control 지표 보기

Cruise Control 메트릭을 노출하면 Prometheus 또는 다른 적절한 모니터링 시스템을 사용하여 메트릭 데이터에 대한 정보를 볼 수 있습니다. AMQ Streams는 Cruise Control 지표의 시각화를 표시하는 Grafana 대시보드 예제 를 제공합니다. 대시보드는 strimzi-cruise-control.json 이라는 JSON 파일입니다. Grafana 대시보드를 활성화할 때 노출된 지표는 모니터링 데이터를 제공합니다.

14.2.2.1. 균형 점수 모니터링

크루즈 컨트롤 메트릭에는 균형 점수가 포함됩니다. Balancedness는 Kafka 클러스터에 워크로드를 균등하게 분산하는 방법에 대한 척도입니다.

균형 점수(balanceness-score)에 대한 크루즈 컨트롤 메트릭은 KafkaRebalance 리소스의 balancedness 점수와 다를 수 있습니다. cruise Control은 KafkaRebalance 리소스에 사용되는 default .goals 와 동일하지 않을 수 있는omaly.detection.goals를 사용하여 각 점수를 계산합니다. oma ly.detection.goalsKafka 사용자 정의 리소스의 spec.cruiseControl.config 에 지정됩니다.

참고

KafkaRebalance 리소스를 새로 고침하면 최적화 제안을 가져옵니다. 다음 조건 중 하나가 적용되는 경우 최신 캐시된 최적화 제안을 가져옵니다.

  • KafkaRebalance 목표는 Kafka 리소스의 default.goals 섹션에 구성된 값과 일치합니다.
  • KafkaRebalance 목표는 지정되지 않습니다.

그렇지 않으면 Cruise Control은 KafkaRebalance 목표를 기반으로 새로운 최적화 제안을 생성합니다. 새로 고침할 때마다 새 제안이 생성되는 경우 성능 모니터링에 영향을 미칠 수 있습니다.

14.2.2.2. 이상 탐지에 대한 경고

크루즈 컨트롤의 이상성 탐지 는 브로커 실패와 같은 최적화 목표 생성을 차단하는 조건에 대한 메트릭 데이터를 제공합니다. 더 많은 가시성을 원한다면 anomaly detect에서 제공하는 메트릭을 사용하여 경고를 설정하고 알림을 보낼 수 있습니다. Cruise Control의 변명 도를 설정하여 지정된 알림 채널을 통해 이러한 메트릭을 기반으로 경고를 라우팅할 수 있습니다. 또는 이상 탐지기에서 제공하는 지표 데이터를 스크랩하고 경고를 생성하도록 Prometheus를 설정할 수 있습니다. 그런 다음 Prometheus Alertmanager는 Prometheus에서 생성한 경고를 라우팅할 수 있습니다.

Cruise Control 문서는 AnomalyDetector 메트릭 및 이상적으로 알림기에 대한 정보를 제공합니다.

14.3. 메트릭 파일 예

AMQ Streams에서 제공하는 예제 구성 파일에서 Grafana 대시보드 및 기타 메트릭 구성 파일 예제 를 찾을 수 있습니다.

AMQ 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
다른 AMQ 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>-< Exporter 재지정 규칙을 정의하는 지표 구성입니다.
11
Cruise Control에 대한 Prometheus ScanSetting Exporter 재지정 규칙을 정의하는 지표 구성입니다.
12
Prometheus ScanSetting Exporter를 정의하는 지표 구성에서는 Kafka 및 ZooKeeper에 대한 재지정 규칙 재지정 규칙입니다.
13
Kafka MirrorECDHE 2.0에 대한 Prometheus ScanSetting Exporter 재레이블 규칙을 정의하는 지표 구성입니다.

14.3.1. Prometheus 지표 구성의 예

AMQ Streams는 Prometheus>-< Exporter 를 사용하여 HTTP 끝점을 통해 지표를 노출합니다. 이 값은 Prometheus 서버에서 스크랩할 수 있습니다.

Grafana 대시보드는 사용자 정의 리소스 구성에서 AMQ Streams 구성 요소에 대해 정의된 Prometheus>-< Exporter 재레이블 규칙을 사용합니다.

레이블은 이름-값 쌍입니다. 레이블 재레이블은 레이블을 동적으로 작성하는 프로세스입니다. 예를 들어 레이블 값은 Kafka 서버 이름 및 클라이언트 ID에서 파생될 수 있습니다.

AMQ Streams는 사용자 정의 리소스 구성 YAML 파일의 예와 레이블 지정 규칙을 제공합니다. Prometheus 지표 구성을 배포할 때 사용자 정의 리소스 예제를 배포하거나 자체 사용자 정의 리소스 정의에 메트릭 구성을 복사할 수 있습니다.

Expand
표 14.1. 메트릭 구성이 있는 사용자 정의 리소스의 예
구성 요소사용자 정의 리소스YAML 파일 예

Kafka 및 ZooKeeper

Kafka

kafka-metrics.yaml

Kafka Connect

KafkaConnect

kafka-connect-metrics.yaml

Kafka MirrorMaker 2

KafkaMirrorMaker2

kafka-mirror-maker-2-metrics.yaml

Kafka 브리지

KafkaBridge

kafka-bridge-metrics.yaml

크루즈 컨트롤

Kafka

kafka-cruise-control-metrics.yaml

14.3.2. 경고 알림에 대한 Prometheus 규칙 예

경고 알림에 대한 Prometheus 규칙의 예는 AMQ Streams에서 제공하는 지표 구성 파일 예제와 함께 제공됩니다. 규칙은 Prometheus 배포에서 사용하기 위해 예제 prometheus-rules.yaml 파일에 지정됩니다.

경고 규칙은 메트릭에서 관찰되는 특정 조건에 대한 알림을 제공합니다. 규칙은 Prometheus 서버에 선언되지만 Prometheus Alertmanager는 경고 알림을 담당합니다.

Prometheus 경고 규칙은 지속적으로 평가되는 PromQL 표현식을 사용하여 조건을 설명합니다.

경고 표현식이 true가 되면 조건이 충족되고 Prometheus 서버는 경고 데이터를 Alertmanager로 보냅니다. 그런 다음 Alertmanager는 배포에 대해 구성된 통신 방법을 사용하여 알림을 보냅니다.

경고 규칙 정의에 대한 일반 지점:

  • for 속성을 규칙과 함께 사용하여 경고가 트리거되기 전에 조건이 지속되는 기간을 결정합니다.
  • 눈금은 기본 ZooKeeper 시간 단위이며, 밀리초 단위로 측정되고 Kafka.spec.zookeeper.configtickTime 매개변수를 사용하여 구성됩니다. 예를 들어, ZooKeeper tickTime=3000 인 경우 3 눈금 (3 x 3000)이 9000밀리초와 같습니다.
  • ZookeeperRunningOutOfSpace 및 경고의 가용성은 사용된 OpenShift 구성 및 스토리지 구현에 따라 달라집니다. 특정 플랫폼에 대한 스토리지 구현은 메트릭이 경고를 제공하는 데 필요한 사용 가능한 공간에 대한 정보를 제공하지 못할 수 있습니다.

Alertmanager는 이메일, 채팅 메시지 또는 기타 알림 방법을 사용하도록 구성할 수 있습니다. 특정 요구에 따라 예제 규칙의 기본 구성을 조정합니다.

14.3.2.1. 규칙 변경 예

prometheus-rules.yaml 파일에는 다음 구성 요소에 대한 예제 규칙이 포함되어 있습니다.

  • Kafka
  • ZooKeeper
  • 엔터티 Operator
  • Kafka Connect
  • Kafka 브리지
  • MirrorMaker
  • Kafka Exporter

각 예제 규칙에 대한 설명은 파일에서 제공됩니다.

14.3.3. Grafana 대시보드 예

메트릭을 제공하기 위해 Prometheus를 배포하는 경우 AMQ Streams와 함께 제공되는 Grafana 대시보드 예제를 사용하여 AMQ Streams 구성 요소를 모니터링할 수 있습니다.

예제 대시보드는 examples/metrics/grafana-dashboards 디렉터리에서 JSON 파일로 제공됩니다.

모든 대시보드는 JVM 메트릭과 구성 요소에 대한 지표를 제공합니다. 예를 들어, AMQ Streams Operator의 Grafana 대시보드는 처리하는 조정 또는 사용자 정의 리소스의 수에 대한 정보를 제공합니다.

예제 대시보드는 Kafka에서 지원하는 모든 메트릭을 표시하지 않습니다. 대시보드는 모니터링을 위한 대표 지표 세트로 채워집니다.

Expand
표 14.2. Grafana 대시보드 파일의 예
구성 요소JSON 파일 예

AMQ Streams 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 브리지

strimzi-kafka-bridge.json

크루즈 컨트롤

strimzi-cruise-control.json

Kafka Exporter

strimzi-kafka-exporter.json

참고

Kafka Exporter에 메트릭을 사용할 수 없는 경우 아직 클러스터에 트래픽이 없기 때문에 Kafka Exporter Grafana 대시보드에 숫자 필드에 대한 N/A 가 표시되고 그래프에 대한 데이터 없음이 표시됩니다.

14.4. Prometheus 지표 구성 배포

AMQ Streams와 함께 Prometheus를 사용하도록 Prometheus 지표 구성을 배포합니다. metricsConfig 속성을 사용하여 Prometheus 지표를 활성화하고 구성합니다.

자체 구성 또는 AMQ Streams와 함께 제공되는 사용자 정의 리소스 구성 파일 예제 를 사용할 수 있습니다.

  • kafka-metrics.yaml
  • kafka-connect-metrics.yaml
  • kafka-mirror-maker-2-metrics.yaml
  • kafka-bridge-metrics.yaml
  • kafka-cruise-control-metrics.yaml

예제 구성 파일에는 Prometheus 지표를 활성화하는 데 필요한 규칙 및 구성의 레이블이 다시 지정되었습니다. Prometheus는 대상 HTTP 끝점에서 메트릭을 스크랩합니다. 예제 파일은 AMQ Streams를 사용하여 Prometheus를 시도할 수 있는 좋은 방법입니다.

재레이블 규칙 및 메트릭 구성을 적용하려면 다음 중 하나를 수행하십시오.

  • 사용자 정의 리소스에 예제 구성을 복사
  • 메트릭 구성을 사용하여 사용자 정의 리소스 배포

Kafka Exporter 메트릭을 포함하려면 Kafka 리소스에 kafkaExporter 구성을 추가합니다.

중요

Kafka Exporter는 소비자 지연 및 소비자 오프셋과 관련된 추가 메트릭만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.

다음 절차에서는 Kafka 리소스에 Prometheus 지표 구성을 배포하는 방법을 설명합니다. 다른 리소스에 예제 파일을 사용할 때 프로세스는 동일합니다.

절차

  1. Prometheus 구성을 사용하여 예제 사용자 정의 리소스를 배포합니다.

    예를 들어 각 Kafka 리소스에 대해 kafka-metrics.yaml 파일을 적용합니다.

    예제 구성 배포

    oc apply -f kafka-metrics.yaml

    또는 kafka-metrics.yaml 의 예제 구성을 자체 Kafka 리소스에 복사할 수 있습니다.

    예제 구성 복사

    oc edit kafka <kafka-configuration-file>

    metricsConfig 속성 및 Kafka 리소스에 참조하는 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 을 복사합니다.
    참고

    Kafka Bridge의 경우 enableMetrics 속성을 지정하고 true 로 설정합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaBridge
    metadata:
      name: my-bridge
    spec:
      # ...
      bootstrapServers: my-cluster-kafka:9092
      http:
        # ...
      enableMetrics: true
      # ...
  2. Kafka Exporter를 배포하려면 kafkaExporter 구성을 추가합니다.

    kafkaExporter 구성은 Kafka 리소스에만 지정됩니다.

    Kafka Exporter를 배포하기 위한 구성 예

    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
    
        resources: 
    4
    
          requests:
            cpu: 200m
            memory: 64Mi
          limits:
            cpu: 500m
            memory: 128Mi
        logging: debug 
    5
    
        enableSaramaLogging: true 
    6
    
        template: 
    7
    
          pod:
            metadata:
              labels:
                label1: value1
            imagePullSecrets:
              - name: my-docker-credentials
            securityContext:
              runAsUser: 1000001
              fsGroup: 0
            terminationGracePeriodSeconds: 120
        readinessProbe: 
    8
    
          initialDelaySeconds: 15
          timeoutSeconds: 5
        livenessProbe: 
    9
    
          initialDelaySeconds: 15
          timeoutSeconds: 5
    # ...

    1
    ADVANCED OPTION: 컨테이너 이미지 구성 - 특별한 경우에만 권장됩니다.
    2
    메트릭에 포함할 소비자 그룹을 지정하는 정규식입니다.
    3
    메트릭에 포함할 주제를 지정하는 정규식입니다.
    4
    예약할 CPU 및 메모리 리소스입니다.
    5
    지정된 심각도(디버그, info, warn, error, fatal) 이상으로 메시지를 기록하기 위한 로깅 구성입니다.
    6
    Kafka Exporter에서 사용하는 Go 클라이언트 라이브러리인 Sarama 로깅을 활성화하는 부울입니다.
    7
    배포 템플릿 및 포드 사용자 지정.
    8
    상태 점검 준비 프로브.
    9
    상태 점검 활동성 프로브.
참고

Kafka 내보내기가 제대로 작동하려면 소비자 그룹을 사용 중이어야 합니다.

14.5. OpenShift에서 Kafka 메트릭 및 대시보드 보기

AMQ Streams가 OpenShift Container Platform에 배포되면 사용자 정의 프로젝트에 대한 모니터링을 통해 메트릭이 제공됩니다. 이 OpenShift 기능을 통해 개발자는 자체 프로젝트(예: Kafka 프로젝트)를 모니터링하기 위해 별도의 Prometheus 인스턴스에 액세스할 수 있습니다.

사용자 정의 프로젝트에 대한 모니터링이 활성화된 경우 openshift-user-workload-monitoring 프로젝트에는 다음 구성 요소가 포함됩니다.

  • Prometheus Operator
  • Prometheus 인스턴스(매개 Prometheus Operator가 자동으로 배포)
  • Thanos Ruler 인스턴스

AMQ Streams는 이러한 구성 요소를 사용하여 메트릭을 사용합니다.

클러스터 관리자는 사용자 정의 프로젝트에 대한 모니터링을 활성화한 다음 개발자 및 기타 사용자에게 자체 프로젝트 내에서 애플리케이션을 모니터링할 수 있는 권한을 부여해야 합니다.

Grafana 배포

Kafka 클러스터가 포함된 프로젝트에 Grafana 인스턴스를 배포할 수 있습니다. 그런 다음 Grafana 대시보드 예제를 사용하여 Grafana 사용자 인터페이스에서 AMQ Streams에 대한 Prometheus 지표를 시각화할 수 있습니다.

중요

openshift-monitoring 프로젝트는 코어 플랫폼 구성 요소에 대한 모니터링을 제공합니다. 이 프로젝트에서 Prometheus 및 Grafana 구성 요소를 사용하여 OpenShift Container Platform 4.x에서 AMQ Streams에 대한 모니터링을 구성하지 마십시오.

절차 개요

OpenShift Container Platform에서 AMQ Streams 모니터링을 설정하려면 다음 절차를 순서대로 따르십시오.

14.5.1. 사전 요구 사항

  • 예제 YAML 파일을 사용하여 Prometheus 지표 구성을 배포 했습니다.
  • 사용자 정의 프로젝트에 대한 모니터링 이 활성화됩니다. 클러스터 관리자가 OpenShift 클러스터에 cluster-monitoring-config 구성 맵을 생성했습니다.
  • 클러스터 관리자에게 monitoring-rules-edit 또는 monitoring-edit 역할이 할당되었습니다.

cluster-monitoring-config 구성 맵을 생성하고 사용자 정의 프로젝트를 모니터링할 수 있는 권한을 사용자에게 부여하는 방법에 대한 자세한 내용은 OpenShift Container Platform 모니터링을 참조하십시오. https://access.redhat.com/documentation/en-us/openshift_container_platform/4.13/html/monitoring/index

14.5.3. Prometheus 리소스 배포

Prometheus를 사용하여 Kafka 클러스터에서 모니터링 데이터를 가져옵니다.

자체 Prometheus 배포를 사용하거나 AMQ Streams에서 제공하는 예제 메트릭 구성 파일을 사용하여 Prometheus를 배포할 수 있습니다. 예제 파일을 사용하려면 PodMonitor 리소스를 구성하고 배포합니다. PodMonitors 는 Apache Kafka, ZooKeeper, Operator, 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가 반환되지 않으면 사용자 정의 프로젝트에 대한 모니터링이 비활성화됩니다. 14.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
    Kafka 와 같이 메트릭을 스크랩할 Pod가 실행 중인 프로젝트입니다.
  3. Kafka 클러스터가 실행 중인 프로젝트에 strimzi-pod-monitor.yaml 파일을 배포합니다.

    oc apply -f strimzi-pod-monitor.yaml -n MY-PROJECT
  4. 동일한 프로젝트에 예제 Prometheus 규칙을 배포합니다.

    oc apply -f prometheus-rules.yaml -n MY-PROJECT

14.5.4. Grafana의 서비스 계정 생성

AMQ 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. cluster-monitoring-view 역할을 Grafana ServiceAccount 에 할당하는 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를 배포할 때 액세스 토큰이 필요합니다.

14.5.5. 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:9.4.7
            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>

14.5.6. Grafana 서비스에 대한 경로 생성

Grafana 서비스를 노출하는 경로를 통해 Grafana 사용자 인터페이스에 액세스할 수 있습니다.

절차

  • grafana 서비스에 대한 엣지 경로를 생성합니다.

    oc create route edge <my-grafana-route> --service=grafana --namespace=KAFKA-NAMESPACE

14.5.7. Grafana 대시보드 예제 가져오기

Grafana를 사용하여 사용자 정의 대시보드에서 Prometheus 지표의 시각화를 제공합니다.

AMQ Streams는 JSON 형식의 Grafana에 대한 대시보드 구성 파일의 예를 제공합니다.

  • examples/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. 구성 > 데이터 소스에서 Prometheus 데이터 소스가 생성되었는지 확인합니다. 데이터 소스는 14.5.5절. “Prometheus 데이터 소스를 사용하여 Grafana 배포” 에서 생성되었습니다.
  5. + 아이콘을 클릭한 다음 가져오기 를 클릭합니다.
  6. examples/metrics/grafana-dashboards 에서 가져올 대시보드의 JSON을 복사합니다.
  7. JSON을 텍스트 상자에 붙여넣고 Load 를 클릭합니다.
  8. Grafana 대시보드 예제에 대해 5-7단계를 반복합니다.

가져온 Grafana 대시보드는 대시보드 홈 페이지에서 볼 수 있습니다.

15장. 분산 추적 소개

분산 추적은 분산 시스템의 애플리케이션 간 트랜잭션 진행 상황을 추적합니다. 마이크로 서비스 아키텍처에서 추적은 서비스 간 트랜잭션 진행 상황을 추적합니다. 추적 데이터는 애플리케이션 성능을 모니터링하고 대상 시스템 및 최종 사용자 애플리케이션 관련 문제를 조사하는 데 유용합니다.

AMQ Streams에서 추적을 사용하면 소스 시스템에서 Kafka로의 메시지 엔드 투 엔드 추적을 용이하게 하고 Kafka에서 시스템 및 애플리케이션을 대상으로 지정할 수 있습니다. 분산 추적은 Grafana 대시보드의 메트릭 모니터링과 구성 요소 로거를 보완합니다.

추적 지원은 다음 Kafka 구성 요소에 빌드됩니다.

  • 소스 클러스터에서 대상 클러스터로 메시지를 추적할 MirrorMaker
  • Kafka Connect에서 사용하고 생성한 메시지를 추적하기 위한 Kafka Connect
  • Kafka 및 HTTP 클라이언트 애플리케이션 간 메시지 추적을 위한 Kafka Bridge

Kafka 브로커에서는 추적이 지원되지 않습니다.

사용자 정의 리소스를 통해 이러한 구성 요소의 추적을 활성화하고 구성합니다. spec.template 속성을 사용하여 추적 구성을 추가합니다.

spec.tracing.type 속성을 사용하여 추적 유형을 지정하여 추적을 활성화합니다.

OpenTelemetry
type: opentelemetry 를 지정하여 OpenTelemetry를 사용합니다. 기본적으로 OpenTelemetry는 OTLP (OpenTelemetry Protocol) 내보내기 및 끝점을 사용하여 추적 데이터를 가져옵니다. Jaeger 추적을 포함하여 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. 이를 위해 추적 구성에서 OpenTelemetry 내보내기 및 끝점을 변경합니다.
jaeger
OpenTracing 및 Jaeger 클라이언트를 사용하여 추적 데이터를 가져오려면 type:jaeger 를 지정합니다.
참고

type: jaeger tracing에 대한 지원은 더 이상 사용되지 않습니다. 이제 Jaeger 클라이언트가 사용 중지되고 OpenTracing 프로젝트가 아카이브됩니다. 따라서 향후 Kafka 버전에 대한 지원을 보장할 수 없습니다. 가능한 경우 type: jaeger 추적은 2023년 6월까지 유지 관리하고 나중에 삭제합니다. 최대한 빨리 OpenTelemetry로 마이그레이션하십시오.

15.1. 추적 옵션

Jaeger 추적 시스템과 함께 OpenTelemetry 또는 OpenTracing (더 이상 사용되지 않음)을 사용합니다.

OpenTelemetry 및 OpenTracing은 추적 또는 모니터링 시스템과 독립적 인 API 사양을 제공합니다.

API를 사용하여 추적을 위한 애플리케이션 코드를 계측합니다.

  • 계측된 애플리케이션은 분산 시스템에서 개별 요청에 대한 추적을 생성합니다.
  • 추적은 시간 경과에 따른 특정 작업 단위를 정의하는 기간으로 구성됩니다.

Jaeger는 마이크로 서비스 기반 분산 시스템의 추적 시스템입니다.

  • Jaeger는 추적 API를 구현하고 조정을 위한 클라이언트 라이브러리를 제공합니다.
  • Jaeger 사용자 인터페이스를 사용하면 추적 데이터를 쿼리, 필터링 및 분석할 수 있습니다.

간단한 쿼리를 보여주는 Jaeger 사용자 인터페이스

The Jaeger user interface showing a simple query

15.2. 추적을 위한 환경 변수

Kafka 구성 요소에 대한 추적을 활성화하거나 Kafka 클라이언트의 추적기를 초기화하는 경우 환경 변수를 사용합니다.

환경 변수 추적은 변경될 수 있습니다. 최신 정보는 OpenTelemetry 문서 및 OpenTracing 설명서 를 참조하십시오.

다음 표에서는 추적 프로그램을 설정하기 위한 주요 환경 변수에 대해 설명합니다.

Expand
표 15.1. OpenTelemetry 환경 변수
속성필수 항목설명

OTEL_SERVICE_NAME

제공됨

OpenTelemetry의 Jaeger 추적 서비스의 이름입니다.

OTEL_EXPORTER_JAEGER_ENDPOINT

제공됨

추적에 사용되는 내보내기입니다.

OTEL_TRACES_EXPORTER

제공됨

추적에 사용되는 내보내기입니다. 기본적으로 otlp 로 설정합니다. Jaeger 추적을 사용하는 경우 이 환경 변수를 jaeger 로 설정해야 합니다. 다른 추적 구현을 사용하는 경우 사용된 내보내기를 지정합니다.

Expand
표 15.2. OpenTracing 환경 변수
속성필수 항목설명

JAEGER_SERVICE_NAME

제공됨

Jaeger 추적 프로그램의 이름입니다.

JAEGER_AGENT_HOST

없음

UDP(User Datagram Protocol)를 통해 jaeger-agent 와 통신하기 위한 호스트 이름입니다.

JAEGER_AGENT_PORT

없음

UDP를 통해 jaeger-agent 와 통신하는 데 사용되는 포트입니다.

15.3. 분산 추적 설정

사용자 정의 리소스에서 추적 유형을 지정하여 Kafka 구성 요소에서 분산 추적을 활성화합니다. 메시지의 엔드 투 엔드 추적을 위해 Kafka 클라이언트의 계측 추적기입니다.

분산 추적을 설정하려면 다음 절차를 순서대로 수행합니다.

15.3.1. 사전 요구 사항

분산 추적을 설정하기 전에 Jaeger 백엔드 구성 요소가 OpenShift 클러스터에 배포되었는지 확인합니다. OpenShift 클러스터에 Jaeger를 배포하는 데 Jaeger Operator를 사용하는 것이 좋습니다.

배포 지침은 Jaeger 문서를 참조하십시오.

참고

AMQ Streams 이외의 애플리케이션 및 시스템의 추적 설정은 이 콘텐츠의 범위를 벗어납니다.

15.3.2. MirrorMaker, Kafka Connect 및 Kafka Bridge 리소스에서 추적 활성화

MirrorMaker, MirrorMaker 2, Kafka Connect 및 AMQ Streams Kafka Bridge에서 분산 추적이 지원됩니다. 추적기 서비스를 지정하고 활성화하도록 구성 요소의 사용자 정의 리소스를 구성합니다.

리소스에서 추적을 활성화하면 다음 이벤트가 트리거됩니다.

  • 인터셉터 클래스는 구성 요소의 통합 소비자 및 생산자에서 업데이트됩니다.
  • MirrorMaker, MirrorMaker 2 및 Kafka Connect의 경우 추적 에이전트는 리소스에 정의된 추적 구성을 기반으로 추적기를 초기화합니다.
  • Kafka 브리지의 경우 리소스에 정의된 추적 구성을 기반으로 하는 추적자는 Kafka 브리지 자체에서 초기화합니다.

OpenTelemetry 또는 OpenTracing을 사용하는 추적을 활성화할 수 있습니다.

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 로 설정합니다.
    • OpenTracing의 경우 spec.tracing.type 속성을 jaeger 로 설정합니다.

    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
    #...

    OpenTracing을 사용하는 Kafka Connect의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: JAEGER_SERVICE_NAME
              value: my-jaeger-service
            - name: JAEGER_AGENT_HOST
              value: jaeger-agent-name
            - name: JAEGER_AGENT_PORT
              value: "6831"
      tracing:
        type: jaeger
      #...

    OpenTracing을 사용하는 MirrorMaker의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker
    metadata:
      name: my-mirror-maker
    spec:
      #...
      template:
        mirrorMakerContainer:
          env:
            - name: JAEGER_SERVICE_NAME
              value: my-jaeger-service
            - name: JAEGER_AGENT_HOST
              value: jaeger-agent-name
            - name: JAEGER_AGENT_PORT
              value: "6831"
      tracing:
        type: jaeger
    #...

    OpenTracing을 사용하는 MirrorMaker 2의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker2
    metadata:
      name: my-mm2-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: JAEGER_SERVICE_NAME
              value: my-jaeger-service
            - name: JAEGER_AGENT_HOST
              value: jaeger-agent-name
            - name: JAEGER_AGENT_PORT
              value: "6831"
      tracing:
        type: jaeger
    #...

    OpenTracing을 사용하는 Kafka 브리지의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaBridge
    metadata:
      name: my-bridge
    spec:
      #...
      template:
        bridgeContainer:
          env:
            - name: JAEGER_SERVICE_NAME
              value: my-jaeger-service
            - name: JAEGER_AGENT_HOST
              value: jaeger-agent-name
            - name: JAEGER_AGENT_PORT
              value: "6831"
      tracing:
        type: jaeger
    #...

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

    oc apply -f <resource_configuration_file>

15.3.3. Kafka 클라이언트의 추적 초기화

추적기를 초기화한 다음 분산 추적을 위해 클라이언트 애플리케이션을 계측합니다. Kafka 생산자 및 소비자 클라이언트 및 Kafka Streams API 애플리케이션을 조정할 수 있습니다. OpenTracing 또는 OpenTelemetry에 대해 추적기를 초기화할 수 있습니다.

추적 환경 변수 세트를 사용하여 추적 프로그램을 구성하고 초기화합니다.

절차

각 클라이언트 애플리케이션에서 추적기에 대한 종속성을 추가합니다.

  1. 클라이언트 애플리케이션의 pom.xml 파일에 Maven 종속성을 추가합니다.

    OpenTelemetry의 종속 항목

    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
        <version>1.18.0.redhat-00001</version>
    </dependency>
    <dependency>
      <groupId>io.opentelemetry.instrumentation</groupId>
      <artifactId>opentelemetry-kafka-clients-{OpenTelemetryKafkaClient}</artifactId>
      <version>1.18.0.redhat-00001</version>
    </dependency>
    <dependency>
      <groupId>io.opentelemetry</groupId>
      <artifactId>opentelemetry-exporter-otlp</artifactId>
      <version>1.18.0.redhat-00001</version>
    </dependency>

    OpenTracing의 종속 항목

    <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-client</artifactId>
        <version>1.8.1.redhat-00002</version>
    </dependency>
    <dependency>
      <groupId>io.opentracing.contrib</groupId>
      <artifactId>opentracing-kafka-client</artifactId>
      <version>0.1.15.redhat-00006</version>
    </dependency>

  2. 추적 환경 변수를 사용하여 추적 프로그램의 구성을 정의합니다.
  3. 환경 변수를 사용하여 초기화되는 추적기를 생성합니다.

    OpenTelemetry용 추적기 생성

    OpenTelemetry ot = GlobalOpenTelemetry.get();

    OpenTracing용 추적기 생성

    Tracer tracer = Configuration.fromEnv().getTracer();

  4. 추적기를 글로벌 추적기로 등록합니다.

    GlobalTracer.register(tracer);
  5. 클라이언트 사용 방법:

15.3.4. 추적을 위한 생산자 및 소비자 측정

Kafka 생산자 및 소비자에서 추적할 수 있는 장치 애플리케이션 코드를 제공합니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Java 생산자 및 소비자 애플리케이션 코드를 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.

OpenTelemetry 및 OpenTracing 계측 프로젝트는 생산자와 소비자의 계측을 지원하는 클래스를 제공합니다.

데코레이터 장치
데코레이터 계측의 경우 추적을 위한 수정된 생산자 또는 소비자 인스턴스를 생성합니다. 데코레이터 장치는 OpenTelemetry 및 OpenTracing과는 다릅니다.
인터셉터 계측
인터셉터 계측의 경우 소비자 또는 생산자 구성에 추적 기능을 추가합니다. 인터셉터 계측은 OpenTelemetry 및 OpenTracing의 경우 동일합니다.

사전 요구 사항

절차

각 생산자 및 소비자 애플리케이션의 애플리케이션 코드에서 다음 단계를 수행합니다. 데코레이터 패턴 또는 인터셉터를 사용하여 클라이언트 애플리케이션 코드를 계측합니다.

  • 데코레이터 패턴을 사용하려면 수정된 생산자 또는 소비자 인스턴스를 생성하여 메시지를 보내거나 받습니다.

    원래 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);

    OpenTracing을 위한 데코레이터 계측 예

    //producer instance
    KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps);
    TracingKafkaProducer<Integer, String> tracingProducer = new TracingKafkaProducer<>(producer, tracer);
    TracingKafkaProducer.send(...)
    
    //consumer instance
    KafkaConsumer<Integer, String> consumer = new KafkaConsumer<>(consumerProps);
    TracingKafkaConsumer<Integer, String> tracingConsumer = new TracingKafkaConsumer<>(consumer, tracer);
    tracingConsumer.subscribe(Collections.singletonList("mytopic"));
    ConsumerRecords<Integer, String> records = tracingConsumer.poll(1000);
    ConsumerRecord<Integer, String> record = ...
    SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);

  • 인터셉터를 사용하려면 생산자 또는 소비자 구성에서 인터셉터 클래스를 설정합니다.

    일반적인 방법으로 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);

15.3.5. 추적을 위한 Kafka Streams 애플리케이션 조정

Kafka Streams API 애플리케이션에서 추적을 활성화하는 장치 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Kafka Streams API 애플리케이션을 조정합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.

데코레이터 장치
데코레이터 계측의 경우 추적을 위해 수정된 Kafka Streams 인스턴스를 생성합니다. OpenTracing 계측 프로젝트는 Kafka Streams 계측을 지원하는 TracingKafkaClientSupplier 클래스를 제공합니다. Kafka Streams에 추적을 제공하는 TracingKafkaClientSupplier 공급업체 인터페이스의 래핑된 인스턴스를 생성합니다. OpenTelemetry의 경우 프로세스는 동일하지만 지원을 제공하기 위해 사용자 정의 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 생산자 및 소비자 구성에서 인터셉터 클래스를 설정합니다.

    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());

15.3.6. 다른 OpenTelemetry 추적 시스템 소개

기본 OTLP 시스템 대신 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. AMQ Streams와 함께 제공되는 Kafka 이미지에 필요한 아티팩트를 추가하여 이 작업을 수행합니다. 필요한 구현 특정 환경 변수도 설정해야 합니다. 그런 다음 OTEL_TRACES_EXPORTER 환경 변수를 사용하여 새 추적 구현을 활성화합니다.

다음 절차에서는 Zipkin 추적을 구현하는 방법을 설명합니다.

절차

  1. AMQ Streams Kafka 이미지의 /opt/kafka/libs/ 디렉터리에 추적 아티팩트를 추가합니다.

    Red Hat Ecosystem Catalog 에서 Kafka 컨테이너 이미지를 기본 이미지로 사용하여 새 사용자 지정 이미지를 생성할 수 있습니다.

    Zipkin에 대한 OpenTelemetry 아티팩트

    io.opentelemetry:opentelemetry-exporter-zipkin

  2. 새 추적 구현에 대한 추적 내보내기 및 끝점을 설정합니다.

    Zikpin tracer 구성의 예

    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 내보내기입니다.

15.3.7. 사용자 정의 범위 이름

추적 범위는 작업 이름, 시작 시간 및 기간이 있는 Jaeger의 논리 작업 단위입니다. 기간에는 이름이 기본 제공되지만, 사용하는 Kafka 클라이언트 계측에서 사용자 지정 범위 이름을 지정할 수 있습니다.

사용자 지정 범위 이름을 지정하는 것은 선택 사항이며 생산자 및 소비자 클라이언트 계측에서 데코레이터 패턴을 사용하는 경우에만 적용됩니다. ???

15.3.7.1. OpenTelemetry의 기간 이름 지정

사용자 지정 기간 이름은 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();

15.3.7.2. OpenTracing의 범위 이름 지정

OpenTracing에 대한 사용자 지정 범위 이름을 지정하려면 생산자와 소비자를 계측할 때 BiFunction 오브젝트를 추가 인수로 전달합니다.

기본 제공 이름에 대한 자세한 내용은 OpenTracing Apache Kafka 클라이언트 계측에서 클라이언트 애플리케이션 코드를 계측 하기 위해 사용자 지정 범위 이름을 지정합니다.

16장. AMQ Streams 업그레이드

AMQ Streams를 버전 2.4로 업그레이드하여 새로운 기능 및 개선 사항, 성능 개선 사항 및 보안 옵션을 활용할 수 있습니다.

업그레이드의 일부로 Kafka를 지원되는 최신 버전으로 업그레이드합니다. 각 Kafka 릴리스에는 AMQ Streams 배포에 새로운 기능, 개선 사항 및 버그 수정이 포함되어 있습니다.

최신 버전에 문제가 발생하면 AMQ Streams를 이전 버전으로 다운그레이드 할 수 있습니다.

AMQ Streams의 릴리스 버전은 AMQ Streams 소프트웨어 다운로드 페이지에서 사용할 수 있습니다.

다운타임 및 가용성 업그레이드

고가용성을 위해 주제를 구성하는 경우 AMQ Streams 업그레이드로 인해 해당 주제의 데이터를 게시 및 읽는 소비자 및 생산자의 다운타임이 발생하지 않습니다. 고가용성 주제는 최소 3가지 이상의 복제 요인과 브로커에 균등하게 분산된 파티션이 있습니다.

AMQ Streams를 업그레이드하면 프로세스의 다른 단계에서 모든 브로커가 다시 시작되는 롤링 업데이트를 트리거합니다. 롤링 업데이트 중에 일부 브로커가 온라인 상태가 아닌 전체 클러스터 가용성이 일시적으로 줄어듭니다. 클러스터 가용성이 감소하면 브로커 오류가 발생할 가능성이 증가하여 메시지가 손실될 수 있습니다.

16.1. AMQ Streams 업그레이드 경로

두 가지 업그레이드 경로가 가능합니다.

증분 업그레이드
이전 마이너 버전에서 AMQ Streams를 버전 2.4로 업그레이드
다중 버전 업그레이드

단일 업그레이드 내의 이전 버전에서 버전 2.4로 AMQ Streams 업그레이드( 하나 이상의 중간 버전 생략).

예를 들어 AMQ Streams 2.2에서 AMQ Streams 2.4로 직접 업그레이드할 수 있습니다.

16.1.1. 지원되는 Kafka 버전

AMQ Streams 업그레이드 프로세스를 시작하기 전에 업그레이드할 Kafka 버전을 결정합니다. AMQ Streams 지원 구성에서 지원되는 Kafka 버전을 검토할 수 있습니다.

  • Kafka 3.4.0은 프로덕션용으로 지원됩니다.
  • Kafka 3.3.1은 AMQ Streams 2.4로 업그레이드할 때만 지원됩니다.

사용 중인 AMQ Streams 버전에서 지원하는 Kafka 버전만 사용할 수 있습니다. AMQ Streams 버전에서 지원하는 경우 더 높은 Kafka 버전으로 업그레이드할 수 있습니다. 경우에 따라 이전에 지원되는 Kafka 버전으로 다운그레이드할 수도 있습니다.

16.1.2. 1.7 이전 AMQ Streams 버전에서 업그레이드

버전 1.7 이전 버전에서 AMQ Streams의 최신 버전으로 업그레이드하는 경우 다음을 수행하십시오.

  1. 표준 시퀀스에 따라 AMQ Streams를 버전 1.7으로 업그레이드합니다.
  2. AMQ Streams와 함께 제공되는 API 변환 툴 을 사용하여 AMQ Streams 사용자 정의 리소스를 v1beta2 로 변환합니다.
  3. 다음 중 하나를 수행합니다.

    • AMQ Streams 1.8로 업그레이드( ControlPlaneListener 기능 게이트가 기본적으로 비활성화되어 있는 경우)
    • ControlPlaneListener 기능 게이트가 비활성화되어 있는 AMQ Streams 2.0 또는 2.2( ControlPlaneListener 기능 게이트가 기본적으로 활성화되어 있는 위치)로 업그레이드
  4. ControlPlaneListener 기능 게이트를 활성화합니다.
  5. 표준 시퀀스에 따라 AMQ Streams 2.4로 업그레이드합니다.

AMQ Streams 사용자 정의 리소스는 릴리스 1.7에서 v1beta2 API 버전을 사용하기 시작했습니다. AMQ Streams 1.8 이상으로 업그레이드하기 전에 CRD 및 사용자 정의 리소스를 변환해야 합니다. API 변환 툴 사용에 대한 자세한 내용은 AMQ Streams 1.7 업그레이드 설명서 를 참조하십시오.

참고

버전 1.7로 처음 업그레이드하는 대신 버전 1.7에서 사용자 지정 리소스를 설치한 다음 리소스를 변환할 수 있습니다.

이제 AMQ Streams에서 ControlPlaneListener 기능이 영구적으로 활성화됩니다. 비활성화된 AMQ Streams 버전으로 업그레이드한 다음 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 사용하여 활성화해야 합니다.

ControlPlaneListener 기능 게이트 비활성화

env:
  - name: STRIMZI_FEATURE_GATES
    value: -ControlPlaneListener

ControlPlaneListener 기능 게이트 활성화

env:
  - name: STRIMZI_FEATURE_GATES
    value: +ControlPlaneListener

16.2. 필수 업그레이드 순서

다운타임 없이 브로커 및 클라이언트를 업그레이드하려면 AMQ Streams 업그레이드 절차를 순서대로 완료해야 합니다.

  1. OpenShift 클러스터 버전이 지원되는지 확인합니다.

    AMQ Streams 2.4는 OpenShift 4.10에서 4.13으로 지원됩니다.

    다운타임을 최소화하여 OpenShift를 업그레이드 할 수 있습니다.

  2. Cluster Operator 업그레이드.
  3. 모든 Kafka 브로커 및 클라이언트 애플리케이션을 지원되는 최신 Kafka 버전으로 업그레이드 합니다.
  4. 선택 사항: 소비자 및 Kafka Streams 애플리케이션을 업그레이드하여 파티션 재조정에 증분 협업 재조정 프로토콜을 사용합니다.

16.3. 다운타임을 최소화하여 OpenShift 업그레이드

OpenShift를 업그레이드하는 경우 OpenShift 업그레이드 설명서를 참조하여 업그레이드 경로와 노드를 올바르게 업그레이드하는 단계를 확인합니다. OpenShift를 업그레이드하기 전에 사용 중인 AMQ Streams 버전에 지원되는 버전을 확인하십시오.

업그레이드를 수행할 때 Kafka 클러스터를 계속 사용할 수 있어야 합니다.

다음 전략 중 하나를 사용할 수 있습니다.

  1. Pod 중단 예산 구성
  2. 다음 방법 중 하나로 Pod를 롤링합니다.

    1. AMQ Streams Drain cleaner 사용
    2. Pod에 주석을 수동으로 적용하여

Pod를 롤오버하는 방법 중 하나를 사용하기 전에 Pod 중단 예산을 구성해야 합니다.

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
    # ...

고가용성 환경에서 Cluster Operator는 다운타임이 발생하지 않도록 업그레이드 프로세스 중 항목에 대해 최소 수의 동기화 복제본을 유지 관리합니다.

16.3.1. AMQ Streams Drain cleaner를 사용하여 Pod 롤링

AMQ Streams DrainCleaner 툴을 사용하여 업그레이드 중에 노드를 제거할 수 있습니다. AMQ Streams DrainCleaner는 롤링 업데이트 Pod 주석으로 Pod에 주석을 답니다. 그러면 제거된 Pod의 롤링 업데이트를 수행하도록 Cluster Operator에 알립니다.

Pod 중단 예산을 사용하면 지정된 시간에 지정된 수의 Pod만 사용할 수 없습니다. Kafka 브로커 Pod의 계획된 유지 관리 기간 동안 Pod 중단 예산은 Kafka가 고가용성 환경에서 계속 실행되도록 합니다.

Kafka 구성 요소에 대한 템플릿 사용자 지정을 사용하여 Pod 중단 예산을 지정합니다. 기본적으로 Pod 중단 예산을 사용하면 지정된 시간에 단일 Pod만 사용할 수 없습니다.

이렇게 하려면 maxUnavailable0 (zero)으로 설정합니다. 최대 Pod 중단 예산을 0으로 줄이면 자발적으로 중단되는 것이 방지되므로 Pod를 수동으로 제거해야 합니다.

Pod 중단 예산 지정

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  namespace: myproject
spec:
  kafka:
    # ...
    template:
      podDisruptionBudget:
        maxUnavailable: 0
# ...

16.3.2. 주제를 사용 가능한 상태로 유지하면서 Pod 수동 롤링

업그레이드하는 동안 Cluster Operator를 통해 Pod 수동 롤링 업데이트를 트리거할 수 있습니다. Pod 리소스를 사용하여 롤링 업데이트를 통해 새 Pod로 리소스의 Pod를 재시작합니다. AMQ Streams DrainCleaner를 사용하는 것과 마찬가지로 Pod 중단 예산에 대해 maxUnavailable 값을 0으로 설정해야 합니다.

드레인해야 하는 Pod를 확인해야 합니다. 그런 다음 Pod 주석을 추가하여 업데이트합니다.

여기에서 주석은 Kafka 브로커를 업데이트합니다.

Kafka 브로커 Pod에서 수동 롤링 업데이트 수행

oc annotate pod <cluster_name>-kafka-<index> strimzi.io/manual-rolling-update=true

&lt ;cluster_name& gt;을 클러스터 이름으로 교체합니다. Kafka 브로커 Pod의 이름은 < cluster-name> -kafka- <index >입니다. 여기서 < index >는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다. 예: my-cluster-kafka-0.

16.4. Cluster Operator 업그레이드

동일한 방법을 사용하여 초기 배포 방법과 동일한 방법으로 Cluster Operator를 업그레이드합니다.

설치 파일 사용
설치 YAML 파일을 사용하여 Cluster Operator를 배포한 경우 설치 파일을 사용하여 Cluster Operator 업그레이드에 설명된 대로 Operator 설치 파일을 수정하여 업그레이드를 수행합니다.
OperatorHub 사용

OperatorHub에서 AMQ Streams를 배포한 경우 OLM(Operator Lifecycle Manager)을 사용하여 AMQ Streams Operator의 업데이트 채널을 새 AMQ Streams 버전으로 변경합니다.

채널을 업데이트하면 선택한 업그레이드 전략에 따라 다음 유형의 업그레이드 중 하나가 시작됩니다.

  • 자동 업그레이드가 시작됩니다.
  • 설치를 시작하기 전에 승인이 필요한 수동 업그레이드
참고

stable 채널에 가입하면 채널을 변경하지 않고 자동 업데이트를 받을 수 있습니다. 그러나 자동 업데이트 활성화는 사전 설치 업그레이드 단계가 누락될 가능성이 있기 때문에 권장되지 않습니다. 버전별 채널에서만 자동 업그레이드를 사용합니다.

OperatorHub를 사용하여 Operator 업그레이드에 대한 자세한 내용은 설치된 Operator(OpenShift 문서) 업그레이드를 참조하십시오.

16.4.1. Cluster Operator 업그레이드에서 Kafka 버전 오류를 반환합니다.

Cluster Operator를 업그레이드하고 지원되지 않는 Kafka 버전 오류를 가져오는 경우 Kafka 클러스터 배포에는 새 Operator 버전에서 지원하지 않는 이전 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를 사용하여 AMQ Streams 1.7 또는 이전 버전에서 업그레이드하는 경우 필요한 작업

AMQ Streams Operator 를 버전 2.4로 업그레이드하기 전에 다음 사항을 변경해야 합니다.

  • 사용자 정의 리소스 및 CRD를 v1beta2로 변환
  • ControlPlaneListener 기능 게이트가 비활성화된 AMQ Streams 버전으로 업그레이드

이러한 요구 사항은 16.1.2절. “1.7 이전 AMQ Streams 버전에서 업그레이드” 에 설명되어 있습니다.

AMQ Streams 1.7 이상에서 업그레이드하는 경우 다음을 수행하십시오.

  1. AMQ Streams 1.7로 업그레이드
  2. AMQ Streams 소프트웨어 다운로드 페이지에서 AMQ Streams 1.8과 함께 제공되는 Red Hat AMQ Streams API Conversion Tool 을 다운로드합니다.
  3. 사용자 정의 리소스 및 CRD를 v1beta2 로 변환합니다.

    자세한 내용은 AMQ Streams 1.7 업그레이드 설명서를 참조하십시오.

  4. OperatorHub에서 AMQ Streams Operator 의 1.7 버전을 삭제합니다.
  5. 또한 AMQ Streams Operator 버전 2.4를 삭제합니다.

    존재하지 않는 경우 다음 단계로 이동합니다.

    AMQ Streams Operator에 대한 승인 전략이 자동으로 설정된 경우 Operator의 2.4 버전이 클러스터에 이미 있을 수 있습니다. 사용자 정의 리소스 및 CRD를 릴리스 전에 v1beta2 API 버전으로 변환 하지 않은 경우 Operator에서 관리하는 사용자 정의 리소스 및 CRD는 이전 API 버전을 사용합니다. 결과적으로 2.4 Operator가 Pending 상태로 유지됩니다. 이 경우 AMQ Streams Operator 버전 2.4 및 버전 1.7을 삭제해야 합니다.

    두 Operator를 모두 삭제하면 새 Operator 버전이 설치될 때까지 조정이 일시 중지됩니다. 사용자 정의 리소스에 대한 변경 사항이 지연되지 않도록 다음 단계를 즉시 수행합니다.

  6. OperatorHub에서 다음 중 하나를 수행합니다.

    • AMQ Streams Operator 의 1.8 버전으로 업그레이드합니다(여기서 ControlPlaneListener 기능 게이트는 기본적으로 비활성화됨).
    • ControlPlaneListener 기능 게이트가 비활성화된 상태로 AMQ Streams Operator 의 버전 2.0 또는 2.2로 업그레이드(기본적으로 ControlPlaneListener 기능 게이트가 활성화된 경우)
  7. AMQ Streams Operator 버전 2.4로 즉시 업그레이드합니다.

    설치된 2.4 Operator는 클러스터를 감시하고 롤링 업데이트를 수행합니다. 이 프로세스 중에 클러스터 성능이 일시적으로 저하될 수 있습니다.

16.4.3. 설치 파일을 사용하여 Cluster Operator 업그레이드

다음 절차에서는 AMQ Streams 2.4를 사용하도록 Cluster Operator 배포를 업그레이드하는 방법을 설명합니다.

설치 YAML 파일을 사용하여 Cluster Operator를 배포한 경우 다음 절차를 따르십시오.

Cluster Operator에서 관리하는 Kafka 클러스터의 가용성은 업그레이드 작업의 영향을 받지 않습니다.

참고

해당 버전으로 업그레이드하는 방법에 대한 자세한 내용은 특정 버전의 AMQ Streams를 지원하는 설명서를 참조하십시오.

사전 요구 사항

절차

  1. 기존 Cluster Operator 리소스( /install/cluster-operator 디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. 새로운 Cluster Operator 버전에서 모든 변경 사항을 덮어씁니다.
  2. AMQ Streams 버전 2.4에서 사용할 수 있는 지원되는 구성 옵션을 반영하도록 사용자 정의 리소스를 업데이트합니다.
  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 Deployment 에서 하나 이상의 환경 변수를 수정한 경우 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}'

    이미지 태그는 새 Operator 버전을 표시합니다. 예를 들면 다음과 같습니다.

    registry.redhat.io/amq-streams/strimzi-kafka-34-rhel8:2.4.0

Cluster Operator가 버전 2.4로 업그레이드되었지만 관리하는 클러스터에서 실행 중인 Kafka 버전은 변경되지 않습니다.

Cluster Operator 업그레이드 후 Kafka 업그레이드를 수행해야 합니다.

16.5. AMQ Streams를 업그레이드할 때 FIPS 모드로 전환

FIPS 지원 OpenShift 클러스터에서 FIPS 모드에서 실행되도록 AMQ Streams를 업그레이드합니다. AMQ Streams 2.4까지 FIPS_MODE 환경 변수를 사용하여 FIPS 모드를 비활성화한 경우에만 FIPS 지원 OpenShift 클러스터에서 실행할 수 있었습니다. 릴리스 2.4에서 AMQ Streams는 FIPS 모드를 지원합니다. FIPS_MODE비활성화된 상태로 설정된 FIPS 지원 OpenShift 클러스터에서 AMQ Streams를 실행하는 경우 이 프로세스에 따라 활성화할 수 있습니다.

사전 요구 사항

  • FIPS 지원 OpenShift 클러스터
  • FIPS_MODE 환경 변수가 disabled로 설정된 기존 Cluster Operator 배포

절차

  1. Cluster Operator를 버전 2.4 이상으로 업그레이드하지만 FIPS_MODE 환경 변수를 disabled 로 설정합니다.
  2. 2.3 이전 AMQ 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 모드가 활성화된 상태에서 실행됩니다.

16.6. Kafka 업그레이드

Cluster Operator를 2.4로 업그레이드한 다음 다음 단계는 모든 Kafka 브로커를 지원되는 최신 Kafka 버전으로 업그레이드하는 것입니다.

Kafka 브로커의 롤링 업데이트를 통해 Kafka 업그레이드는 Cluster Operator에서 수행합니다.

Cluster Operator는 Kafka 클러스터 구성을 기반으로 롤링 업데이트를 시작합니다.

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.version입니다.

롤링 업데이트 2개

inter.broker.protocol.version 또는 log.message.format.version 에 대한 구성이 없습니다.

롤링 업데이트 2개

중요

Kafka 3.0.0에서 inter.broker.protocol.version3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다. 브로커의 log.message.format.version 속성과 토픽에 대한 message.format.version 속성은 더 이상 사용되지 않으며 Kafka의 향후 릴리스에서 제거됩니다.

Kafka 업그레이드의 일부로 Cluster Operator는 ZooKeeper에 대한 롤링 업데이트를 시작합니다.

  • 단일 롤링 업데이트는 ZooKeeper 버전이 변경되지 않은 경우에도 발생합니다.
  • 새로운 버전의 Kafka에 새로운 ZooKeeper 버전이 필요한 경우 추가 롤링 업데이트가 수행됩니다.

16.6.1. Kafka 버전

Kafka의 로그 메시지 형식 버전 및broker 간 프로토콜 버전은 각각 메시지에 추가된 로그 형식 버전 및 클러스터에 사용된 Kafka 프로토콜 버전을 지정합니다. 올바른 버전을 사용하려면 업그레이드 프로세스에는 기존 Kafka 브로커를 구성하고 클라이언트 애플리케이션(소유자 및 생산자)에 대한 코드를 변경해야 합니다.

다음 표는 Kafka 버전의 차이점을 보여줍니다.

Expand
표 16.1. Kafka 버전 차이점
AMQ Streams 버전Kafka 버전inter-broker 프로토콜 버전로그 메시지 형식 버전zookeeper 버전

2.4

3.4.0

3.4

3.4

3.6.3

2.3

3.3.1

3.3

3.3

3.6.3

참고

AMQ Streams 2.4에서는 Kafka 3.4.0을 사용하지만 업그레이드를 위해 Kafka 3.3.1도 지원됩니다.

inter-broker 프로토콜 버전

Kafka에서broker 간 통신에 사용되는 네트워크 프로토콜을 인스턴스 간 프로토콜 이라고 합니다. Kafka의 각 버전에는broker 간 프로토콜의 호환 버전이 있습니다. 프로토콜의 마이너 버전은 일반적으로 이전 표에 표시된 Kafka의 마이너 버전과 일치하도록 증가합니다.

inter-broker 프로토콜 버전은 Kafka 리소스에서 cluster wide을 설정합니다. 이를 변경하려면 Kafka.spec.kafka.config 에서 inter.broker.protocol.version 속성을 편집합니다.

로그 메시지 형식 버전

생산자가 Kafka 브로커에 메시지를 보내면 특정 형식을 사용하여 메시지가 인코딩됩니다. 형식은 Kafka 릴리스 간에 변경될 수 있으므로 메시지는 인코딩된 메시지 형식의 버전을 지정합니다.

특정 메시지 형식 버전을 설정하는 데 사용되는 속성은 다음과 같습니다.

  • topic의 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 에 의해 정의됩니다. 주제 구성을 수정하여 topic.version of a topic를 수동으로 설정할 수 있습니다.

16.6.2. 클라이언트 업그레이드 전략

Kafka 클라이언트를 업그레이드하면 새 버전의 Kafka에 도입된 기능, 수정 사항 및 개선 사항의 이점을 누릴 수 있습니다. 업그레이드된 클라이언트는 다른 업그레이드된 Kafka 구성 요소와의 호환성을 유지합니다. 클라이언트의 성능과 안정성도 향상될 수 있습니다.

Kafka 클라이언트 및 브로커를 업그레이드하여 원활하게 전환하는 데 가장 적합한 접근 방법을 고려하십시오. 선택한 업그레이드 전략은 브로커 또는 클라이언트를 먼저 업그레이드하는지 여부에 따라 달라집니다. Kafka 3.0부터 브로커와 클라이언트를 순서에 상관없이 독립적으로 업그레이드할 수 있습니다. 클라이언트 또는 브로커 업그레이드 결정은 먼저 업그레이드해야 하는 애플리케이션 수와 허용 가능한 다운타임과 같은 몇 가지 요인에 따라 달라집니다.

브로커 전에 클라이언트를 업그레이드하는 경우 일부 새로운 기능은 브로커가 아직 지원하지 않기 때문에 작동하지 않을 수 있습니다. 그러나 브로커는 다른 버전으로 실행되는 생산자 및 소비자를 처리하고 다른 로그 메시지 버전을 지원할 수 있습니다.

Kafka 3.0 이전 버전을 사용할 때 클라이언트 업그레이드

Kafka 3.0 이전에는 log.message.format.version 속성(또는 주제 수준의 message.format.version 속성)을 사용하여 브로커에 대해 특정 메시지 형식을 구성합니다. 이로 인해 브로커는 오래된 메시지 형식을 사용하는 이전 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]+) 는 일정 기간 동안 변환된 메시지 수에 대한 지표를 제공합니다.

16.6.3. Kafka 버전 및 이미지 매핑

Kafka를 업그레이드할 때 STRIMZI_KAFKA_IMAGES 환경 변수 및 Kafka.spec.kafka.version 속성에 대한 설정을 고려하십시오.

  • Kafka 리소스는 Kafka.spec.kafka.version 을 사용하여 구성할 수 있습니다.
  • Cluster Operator의 STRIMZI_KAFKA_IMAGES 환경 변수는 Kafka 버전과 해당 버전이 지정된 Kafka 리소스에서 요청할 때 사용할 이미지 간 매핑을 제공합니다.

    • Kafka.spec.kafka.image 가 구성되지 않은 경우 지정된 버전의 기본 이미지가 사용됩니다.
    • Kafka.spec.kafka.image 가 구성된 경우 기본 이미지가 재정의됩니다.
주의

Cluster Operator는 이미지에 실제로 예상 버전의 Kafka 브로커가 포함되어 있는지 확인할 수 없습니다. 지정된 이미지가 지정된 Kafka 버전에 해당하는지 확인합니다.

16.6.4. Kafka 브로커 및 클라이언트 애플리케이션 업그레이드

AMQ Streams Kafka 클러스터를 지원되는 최신 Kafka 버전 및 broker 간 프로토콜 버전으로 업그레이드합니다.

또한 클라이언트 업그레이드를 위한 전략을 선택해야 합니다. Kafka 클라이언트는 이 절차의 6단계에서 업그레이드됩니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • AMQ Streams Kafka 클러스터를 업그레이드하기 전에 Kafka 리소스의 Kafka.spec.kafka.config 속성에 새 Kafka 버전에서 지원되지 않는 설정 옵션이 포함되어 있지 않은지 확인합니다.

절차

  1. Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka <my_cluster>
  2. 구성된 경우 inter.broker.protocol.versionlog.message.format.version 속성이 현재 버전으로 설정되어 있는지 확인합니다.

    예를 들어 Kafka 버전 3.3.1에서 3.4.0으로 업그레이드하는 경우 현재 버전은 3.3입니다.

    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.3.1
        config:
          log.message.format.version: "3.3"
          inter.broker.protocol.version: "3.3"
          # ...

    log.message.format.versioninter.broker.protocol.version 이 구성되지 않은 경우 AMQ 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.3.1에서 3.4.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.4.0 
    1
    
        config:
          log.message.format.version: "3.3" 
    2
    
          inter.broker.protocol.version: "3.3" 
    3
    
          # ...
    1
    Kafka 버전이 새 버전으로 변경되었습니다.
    2
    메시지 형식 버전은 변경되지 않습니다.
    3
    inter-broker 프로토콜 버전은 변경되지 않습니다.
    주의

    새 Kafka 버전의 inter.broker.protocol.version 이 변경되면 Kafka를 다운그레이드할 수 없습니다. The inter-broker protocol version determines the schemas used for persistent metadata stored by the broker, including messages written to __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의 version 속성을 Kafka의 새 버전으로 설정합니다.

    1. Kafka Connect의 경우 KafkaConnect.spec.version 을 업데이트합니다.
    2. MirrorMaker의 경우 KafkaMirrorMaker.spec.version 을 업데이트합니다.
    3. MirrorMaker 2의 경우 KafkaMirrorMaker2.spec.version 을 업데이트합니다.
  7. 구성된 경우 새 inter.broker.protocol.version 버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 9 단계로 이동합니다.

    예를 들어 Kafka 3.4.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.4.0
        config:
          log.message.format.version: "3.3"
          inter.broker.protocol.version: "3.4"
          # ...
  8. Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
  9. 구성된 경우 새 log.message.format.version 버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 10 단계로 이동합니다.

    예를 들어 Kafka 3.4.0으로 업그레이드하는 경우 다음을 수행합니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.4.0
        config:
          log.message.format.version: "3.4"
          inter.broker.protocol.version: "3.4"
          # ...
    중요

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

  10. Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.

    • Kafka 클러스터 및 클라이언트는 이제 새 Kafka 버전을 사용합니다.
    • 브로커는 inter-broker 프로토콜 버전과 Kafka의 새 버전의 메시지 형식 버전을 사용하여 메시지를 전송하도록 구성됩니다.

필요한 경우 Kafka 업그레이드 후 증분 협력 재조정 프로토콜을 사용하도록 소비자를 업그레이드 할 수 있습니다.

16.7. 소비자를 협업 재조정으로 업그레이드

Kafka 소비자 및 Kafka Streams 애플리케이션을 업그레이드하여 기본 성능 재조정 프로토콜 대신 파티션 재조정에 증분 협업 재조정 프로토콜을 사용할 수 있습니다. 새 프로토콜은 Kafka 2.4.0에 추가되었습니다.

소비자는 파티션 할당을 협력적인 리밸런스(cooperative rebalance)로 유지하고, 균형 잡힌 클러스터를 달성하는 데 필요한 경우 프로세스의 마지막에만 파티션 할당을 취소합니다. 이렇게 하면 소비자 그룹 또는 Kafka Streams 애플리케이션의 사용할 수 없게 됩니다.

참고

증분 협업 재조정 프로토콜로 업그레이드하는 것은 선택 사항입니다. eager rebalance 프로토콜은 계속 지원됩니다.

절차

증분 협업 재조정 프로토콜을 사용하도록 Kafka 소비자를 업그레이드하려면 다음을 수행합니다.

  1. Kafka 클라이언트 .jar 파일을 새 버전으로 교체합니다.
  2. 소비자 구성에서 파티션.assignment.strategycooperative-sticky 를 추가합니다. 예를 들어 범위 전략이 설정된 경우 구성을 cooperative-sticky 로 변경합니다.
  3. 그룹의 각 소비자를 차례로 재시작하고 사용자가 다시 시작한 후 그룹에 다시 참여할 때까지 기다립니다.
  4. 소비자 구성에서 이전 partition.assignment.strategy 를 제거하여 그룹의 각 소비자를 재구성하고 cooperative-sticky 전략만 남습니다.
  5. 그룹의 각 소비자를 차례로 재시작하고 사용자가 다시 시작한 후 그룹에 다시 참여할 때까지 기다립니다.

증분 공동 조정 프로토콜을 사용하도록 Kafka Streams 애플리케이션을 업그레이드하려면 다음을 수행합니다.

  1. Kafka Streams .jar 파일을 새 버전으로 교체합니다.
  2. Kafka Streams 구성에서 upgrade.from 구성 매개변수를 업그레이드 중인 Kafka 버전(예: 2.3)으로 설정합니다.
  3. 각 스트림 프로세서(노드)를 차례로 다시 시작합니다.
  4. Kafka Streams 구성에서 upgrade.from 구성 매개변수를 제거합니다.
  5. 그룹의 각 소비자를 차례로 다시 시작합니다.

17장. AMQ Streams 다운그레이드

업그레이드한 AMQ Streams 버전에 문제가 발생하면 이전 버전으로 설치를 되돌릴 수 있습니다.

YAML 설치 파일을 사용하여 AMQ Streams를 설치한 경우 이전 릴리스의 YAML 설치 파일을 사용하여 다음 다운그레이드 절차를 수행할 수 있습니다.

이전 AMQ Streams 버전이 사용 중인 Kafka 버전을 지원하지 않는 경우 메시지에 추가된 로그 메시지 형식 버전이 일치하는 경우 Kafka를 다운그레이드할 수도 있습니다.

주의

다음 다운그레이드 지침은 설치 파일을 사용하여 AMQ Streams를 설치한 경우에만 적합합니다. OperatorHub와 같은 다른 방법을 사용하여 AMQ Streams를 설치한 경우 문서에 지정하지 않는 한 해당 방법으로 다운그레이드를 지원하지 않을 수 있습니다. 성공적으로 다운그레이드 프로세스를 유지하려면 지원되는 접근 방식을 사용해야 합니다.

17.1. Cluster Operator를 이전 버전으로 다운그레이드

AMQ Streams에 문제가 발생하면 설치를 되돌릴 수 있습니다.

다음 절차에서는 Cluster Operator 배포를 이전 버전으로 다운그레이드하는 방법을 설명합니다.

사전 요구 사항

사전 준비 사항

AMQ Streams 기능 게이트 의 다운그레이드 요구 사항을 확인합니다. 기능 게이트가 영구적으로 활성화되어 있는 경우 대상 버전으로 다운그레이드하기 전에 비활성화할 수 있는 버전으로 다운그레이드해야 할 수 있습니다.

절차

  1. 기존 Cluster Operator 리소스( /install/cluster-operator 디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. 이전 버전의 Cluster Operator에서 모든 변경 사항을 덮어씁니다.
  2. 사용자 정의 리소스를 복원하여 다운그레이드 중인 AMQ 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 Deployment 에서 하나 이상의 환경 변수를 수정한 경우 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}'

    이미지 태그는 새 AMQ Streams 버전과 Kafka 버전을 표시합니다. 예를 들어 NEW-STRIMZI-VERSION-kafka-CURRENT-KAFKA-VERSION 입니다.

Cluster Operator가 이전 버전으로 다운그레이드되었습니다.

17.2. Kafka 다운그레이드

Kafka 버전 다운그레이드는 Cluster Operator에서 수행합니다.

17.2.1. 다운그레이드에 대한 Kafka 버전 호환성

Kafka 다운그레이드는 호환 현재 및 대상 Kafka 버전 및 메시지가 기록된 상태에 따라 달라집니다.

해당 버전이 해당 클러스터에서 사용된 inter.broker.protocol.version 설정을 지원하지 않는 경우 이전 Kafka 버전으로 되돌리거나 최신 log.message.format.version 을 사용하는 메시지 로그에 메시지가 추가되었습니다.

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.3.1로 다운그레이드될 수 있습니다.

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  # ...
  kafka:
    version: 3.4.0
    config:
      log.message.format.version: "3.3"
      # ...

log.message.format.version"3.4" 로 설정하거나 값이 없는 경우 다운그레이드를 사용할 수 없으므로 매개변수가 3.4의 3.4.0 브로커에 대한 기본값을 가져왔습니다.

중요

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

17.2.2. Kafka 브로커 및 클라이언트 애플리케이션 다운그레이드

AMQ Streams Kafka 클러스터를 3.4.0에서 3.3.1로 다운그레이드하는 등 더 낮은 Kafka 버전으로 다운그레이드합니다.

사전 요구 사항

  • Cluster Operator가 실행 중입니다.
  • AMQ Streams Kafka 클러스터를 다운그레이드하기 전에 Kafka 리소스에 대해 다음을 확인합니다.

    • 중요: Kafka 버전의 호환성.
    • Kafka.spec.kafka.config 에는 다운그레이드된 Kafka 버전에서 지원하지 않는 옵션이 포함되어 있지 않습니다.
    • Kafka.spec.kafka.config 에는 log.message.format.versioninter.broker.protocol.version 이 있습니다. 이 버전은 다운그레이드된 Kafka 버전에서 지원합니다.

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

절차

  1. Kafka 클러스터 구성을 업데이트합니다.

    oc edit kafka KAFKA-CONFIGURATION-FILE
  2. Kafka.spec.kafka.version 을 변경하여 이전 버전을 지정합니다.

    예를 들어 Kafka 3.4.0에서 3.3.1으로 다운그레이드하는 경우:

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.3.1 
    1
    
        config:
          log.message.format.version: "3.3" 
    2
    
          inter.broker.protocol.version: "3.3" 
    3
    
          # ...
    1
    Kafka 버전이 이전 버전으로 변경되었습니다.
    2
    메시지 형식 버전은 변경되지 않습니다.
    3
    inter-broker 프로토콜 버전은 변경되지 않습니다.
    참고

    log.message.format.versioninter.broker.protocol.version 의 값은 해당 값이 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.

  3. Kafka 버전의 이미지가 Cluster Operator의 STRIMZI_KAFKA_IMAGES 에 정의된 이미지와 다른 경우 Kafka.spec.kafka.image 를 업데이트합니다.

    참조 16.6.3절. “Kafka 버전 및 이미지 매핑”

  4. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.

    로그 또는 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f CLUSTER-OPERATOR-POD-NAME | grep -E "Kafka version downgrade from [0-9.]+ to [0-9.]+, phase ([0-9]+) of \1 completed"
    oc get pod -w

    INFO 수준 메시지가 있는지 Cluster Operator 로그를 확인합니다.

    Reconciliation #NUM(watch) Kafka(NAMESPACE/NAME): Kafka version downgrade from FROM-VERSION to TO-VERSION, phase 1 of 1 completed
  5. 이전 버전의 클라이언트 바이너리를 사용하도록 모든 클라이언트 애플리케이션(소유자)을 다운그레이드합니다.

    Kafka 클러스터 및 클라이언트는 이제 이전 Kafka 버전을 사용합니다.

  6. 주제 메타데이터 스토리지에 ZooKeeper를 사용하는 1.7 이전의 AMQ Streams 버전으로 되돌리는 경우 Kafka 클러스터에서 내부 주제 저장소 주제를 삭제합니다.

    oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.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

18장. 대량의 메시지 처리

AMQ Streams 배포에서 대량의 메시지를 처리해야 하는 경우 구성 옵션을 사용하여 처리량과 대기 시간을 최적화할 수 있습니다.

생산자 및 소비자 구성은 Kafka 브로커에 대한 요청의 크기와 빈도를 제어하는 데 도움이 될 수 있습니다. 구성 옵션에 대한 자세한 내용은 다음을 참조하십시오.

Kafka Connect 런타임 소스 커넥터(MirrorMaker 2) 및 싱크 커넥터에서 사용하는 생산자 및 소비자와 동일한 구성 옵션을 사용할 수도 있습니다.

소스 커넥터
  • Kafka Connect 런타임의 생산자는 Kafka 클러스터로 메시지를 보냅니다.
  • MirrorMaker 2의 경우 소스 시스템이 Kafka이므로 소비자는 소스 Kafka 클러스터에서 메시지를 검색합니다.
싱크 커넥터
  • Kafka Connect 런타임의 소비자는 Kafka 클러스터에서 메시지를 검색합니다.

소비자의 경우 단일 가져오기 요청에서 가져온 데이터 양을 늘려 대기 시간을 줄일 수 있습니다. fetch.max.bytesmax.partition.fetch.bytes 속성을 사용하여 가져오기 요청 크기를 늘립니다. max.poll.records 속성을 사용하여 소비자 버퍼에서 반환된 메시지 수에 대한 최대 제한을 설정할 수도 있습니다.

MirrorMaker 2의 경우 소스의 메시지를 가져오는 특정 소비자와 관련된 소스 커넥터 수준(consumer.*)에서 fetch.max.bytes , max.poll.records 값을 구성합니다.

생산자의 경우 단일 생성 요청에 전송된 메시지 일괄 처리 크기를 늘릴 수 있습니다. batch.size 속성을 사용하여 배치 크기를 늘립니다. 배치 크기가 클수록 전송 준비가 된 미결 메시지 수와 메시지 큐의 백로그 크기를 줄일 수 있습니다. 동일한 파티션에 전송되는 메시지가 함께 배치됩니다. 배치 크기에 도달하면 생성 요청이 대상 클러스터로 전송됩니다. 배치 크기를 늘리면 생성 요청이 지연되고 더 많은 메시지가 일괄 처리에 추가되어 브로커에게 동시에 전송됩니다. 이렇게 하면 많은 수의 메시지를 처리하는 몇 가지 주제 파티션이 있는 경우 처리량이 향상될 수 있습니다.

생산자가 적절한 생산자 배치 크기에 대해 처리하는 레코드의 수와 크기를 고려합니다.

linger.ms 를 사용하여 생산자 로드가 감소할 때 요청을 지연하기 위해 대기 시간을 밀리초 단위로 추가합니다. 지연은 최대 배치 크기 미만인 경우 배치에 더 많은 레코드를 추가할 수 있음을 의미합니다.

대상 Kafka 클러스터로 메시지를 보내는 특정 생산자와 관련된 소스 커넥터 수준(producer.override.*)에서 batch.sizelinger.ms 값을 구성합니다.

Kafka Connect 소스 커넥터의 경우 대상 Kafka 클러스터에 대한 데이터 스트리밍 파이프라인은 다음과 같습니다.

Kafka Connect 소스 커넥터의 데이터 스트리밍 파이프라인

외부 데이터 소스 → (Kafka Connect 작업) 소스 메시지 큐 → 생산자 버퍼 → 대상 Kafka 주제

Kafka Connect 싱크 커넥터의 경우 대상 외부 데이터 소스에 대한 데이터 스트리밍 파이프라인은 다음과 같습니다.

Kafka Connect 싱크 커넥터의 데이터 스트리밍 파이프라인

소스 Kafka 주제 → (Kafka Connect 작업) 싱크 메시지 큐 → 소비자 버퍼 → 외부 데이터 소스

MirrorMaker 2의 경우 대상 Kafka 클러스터에 대한 데이터 미러링 파이프라인은 다음과 같습니다.

MirrorMaker 2의 데이터 미러링 파이프라인

소스 Kafka 주제 → (Kafka Connect 작업) 소스 메시지 큐 → 생산자 버퍼 → 대상 Kafka 주제

생산자는 버퍼의 메시지를 대상 Kafka 클러스터의 항목으로 보냅니다. 이러한 상황이 발생하는 동안 Kafka Connect 작업은 데이터 소스를 계속 폴링하여 소스 메시지 큐에 메시지를 추가합니다.

소스 커넥터의 생산자 버퍼 크기는 producer.override.buffer.memory 속성을 사용하여 설정됩니다. 작업은 버퍼가 플러시되기 전에 지정된 시간 초과 기간(offset.flush.timeout.ms)을 기다립니다. 이는 전송된 메시지가 브로커에 의해 승인되고 커밋된 데이터를 오프셋할 수 있는 충분한 시간이어야 합니다. 소스 작업에서는 종료 중을 제외하고 생산자가 오프셋을 커밋하기 전에 메시지 큐를 비우기를 기다리지 않습니다.

생산자가 소스 메시지 큐의 메시지 처리량을 유지할 수 없는 경우 max.block.ms 에 의해 바인딩된 시간 내에 버퍼에 사용 가능한 공간이 있을 때까지 버퍼가 차단됩니다. 이 기간 동안 버퍼에 아직 승인되지 않은 모든 메시지가 전송됩니다. 이러한 메시지가 승인되고 플러시될 때까지 새 메시지가 버퍼에 추가되지 않습니다.

다음 구성 변경을 시도하여 미해결 메시지의 기본 소스 메시지 대기열을 관리 가능한 크기로 유지할 수 있습니다.

  • offset.flush.timeout.ms의 기본값(밀리초)을 늘립니다.
  • CPU 및 메모리 리소스가 충분한지 확인
  • 다음을 수행하여 병렬로 실행되는 작업 수를 늘립니다.

    • tasksMax 속성을 사용하여 병렬로 실행되는 작업 수 늘리기
    • replicas 속성을 사용하여 작업을 실행하는 작업자 노드 수 늘리기

사용 가능한 CPU 및 메모리 리소스 및 작업자 노드 수에 따라 병렬로 실행할 수 있는 작업 수를 고려하십시오. 원하는 효과가 있을 때까지 구성 값을 계속 조정해야 할 수 있습니다.

18.1. 대용량 메시지에 대한 Kafka Connect 구성

Kafka Connect가 소스 외부 데이터 시스템에서 데이터를 가져와서 Kafka Connect 런타임 생산자에 전달하여 대상 클러스터에 복제되도록 합니다.

다음 예제는 KafkaConnect 사용자 정의 리소스를 사용하는 Kafka Connect 구성을 보여줍니다.

대량의 메시지를 처리하기 위한 Kafka Connect 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  replicas: 3
  config:
    offset.flush.timeout.ms: 10000
    # ...
  resources:
    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "2"
      memory: 2Gi
  # ...

KafkaConnector 사용자 정의 리소스를 사용하여 관리하는 소스 커넥터에 대한 생산자 구성이 추가됩니다.

대량의 메시지를 처리하기 위한 소스 커넥터 구성 예

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:
    producer.override.batch.size: 327680
    producer.override.linger.ms: 100
    # ...

참고

ScanSettingSourceConnectorScanSettingSinkConnector 는 예제 커넥터로 제공됩니다. KafkaConnector 리소스로 배포하는 방법에 대한 자세한 내용은 6.4.3.3절. “KafkaConnector 리소스 배포” 을 참조하십시오.

싱크 커넥터에 대한 소비자 구성이 추가되었습니다.

대량의 메시지를 처리하기 위한 싱크 커넥터 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
  name: my-sink-connector
  labels:
    strimzi.io/cluster: my-connect-cluster
spec:
  class: org.apache.kafka.connect.file.FileStreamSinkConnector
  tasksMax: 2
  config:
    consumer.fetch.max.bytes: 52428800
    consumer.max.partition.fetch.bytes: 1048576
    consumer.max.poll.records: 500
    # ...

KafkaConnector 사용자 지정 리소스 대신 Kafka Connect API를 사용하여 커넥터를 관리하는 경우 커넥터 구성을 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"
      "producer.override.batch.size": 327680
      "producer.override.linger.ms": 100
    }
}'

18.2. 대량의 메시지를 위한 MirrorMaker 2 구성

MirrorMaker 2는 소스 클러스터에서 데이터를 가져와서 Kafka Connect 런타임 생산자에 전달하여 대상 클러스터에 복제됩니다.

다음 예제에서는 KafkaMirrorMaker2 사용자 정의 리소스를 사용하는 MirrorMaker 2의 구성을 보여줍니다.

대량의 메시지를 처리하기 위한 MirrorMaker 2 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  version: 3.4.0
  replicas: 1
  connectCluster: "my-cluster-target"
  clusters:
  - alias: "my-cluster-source"
    bootstrapServers: my-cluster-source-kafka-bootstrap:9092
  - alias: "my-cluster-target"
    config:
      offset.flush.timeout.ms: 10000
    bootstrapServers: my-cluster-target-kafka-bootstrap:9092
  mirrors:
  - sourceCluster: "my-cluster-source"
    targetCluster: "my-cluster-target"
    sourceConnector:
      tasksMax: 2
      config:
        producer.override.batch.size: 327680
        producer.override.linger.ms: 100
        consumer.fetch.max.bytes: 52428800
        consumer.max.partition.fetch.bytes: 1048576
        consumer.max.poll.records: 500
    # ...
  resources:
    requests:
      cpu: "1"
      memory: Gi
    limits:
      cpu: "2"
      memory: 4Gi

18.3. MirrorMaker 2 메시지 흐름 확인

Prometheus 및 Grafana를 사용하여 배포를 모니터링하는 경우 MirrorMaker 2 메시지 흐름을 확인할 수 있습니다.

AMQ Streams와 함께 제공되는 MirrorMaker 2 Grafana 대시보드 예제에는 플러시 파이프라인과 관련된 다음 메트릭이 표시되어 있습니다.

  • Kafka Connect의 미결 메시지 큐의 메시지 수
  • 생산자 버퍼의 사용 가능한 바이트
  • 오프셋 커밋 타임아웃(밀리초)

이러한 메트릭을 사용하여 메시지 볼륨에 따라 구성을 조정할 필요가 있는지 여부를 평가할 수 있습니다.

19장. Kafka 재시작에 대한 정보 검색

Cluster Operator는 OpenShift 클러스터에서 Kafka Pod를 다시 시작한 후 Pod가 재시작되는 이유를 설명하는 Pod의 네임스페이스로 OpenShift 이벤트를 내보냅니다. 클러스터 동작을 이해하는 데 도움이 필요한 경우 명령줄에서 재시작 이벤트를 확인할 수 있습니다.

작은 정보

Prometheus와 같은 메트릭 수집 툴을 사용하여 재시작 이벤트를 내보내고 모니터링할 수 있습니다. 출력을 적절한 형식으로 내보낼 수 있는 이벤트 내보내기와 함께 메트릭 툴을 사용합니다.

19.1. 재시작 이벤트의 이유

Cluster Operator는 특정 이유로 재시작 이벤트를 시작합니다. 재시작 이벤트에 대한 정보를 가져와서 이유를 확인할 수 있습니다.

지정된 이유는 Pod 생성 및 관리에 StrimziPodSet 또는 StatefulSet 리소스를 사용 중인지 여부에 따라 달라집니다.

Expand
표 19.1. 재시작 이유
StrimziPodSetStatefulSet설명

CaCertHasOldGeneration

CaCertHasOldGeneration

Pod는 여전히 이전 CA로 서명된 서버 인증서를 사용하고 있으므로 인증서 업데이트의 일부로 다시 시작해야 합니다.

CaCertRemoved

CaCertRemoved

만료된 CA 인증서가 제거되었으며 Pod가 현재 인증서와 함께 실행되도록 다시 시작됩니다.

CaCertRenewed

CaCertRenewed

CA 인증서가 갱신되었으며 Pod가 업데이트된 인증서와 함께 실행되도록 다시 시작됩니다.

ClientCaCertKeyReplaced

ClientCaCertKeyReplaced

클라이언트 CA 인증서에 서명하는 데 사용된 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 다시 시작됩니다.

ClusterCaCertKeyReplaced

ClusterCaCertKeyReplaced

클러스터의 CA 인증서에 서명하는 데 사용된 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 재시작됩니다.

ConfigChangeRequiresRestart

ConfigChangeRequiresRestart

일부 Kafka 구성 속성은 동적으로 변경되지만 다른 값은 브로커를 다시 시작해야 합니다.

CustomListenerCaCertChanged

CustomListenerCaCertChanged

Kafka 네트워크 리스너를 보호하는 데 사용되는 CA 인증서가 변경되었으며 이를 사용하도록 Pod가 다시 시작됩니다.

FileSystemResizeNeeded

FileSystemResizeNeeded

파일 시스템 크기가 증가하고 이를 적용하려면 다시 시작해야 합니다.

KafkaCertificatesChanged

KafkaCertificatesChanged

Kafka 브로커가 사용하는 하나 이상의 TLS 인증서가 업데이트되었으며 이를 사용하려면 재시작이 필요합니다.

ManualRollingUpdate

ManualRollingUpdate

재시작을 트리거하기 위해 Pod 또는 StatefulSet 또는 StrimziPodSet 설정에 주석이 달린 사용자입니다.

PodForceRestartOnError

PodForceRestartOnError

Pod를 다시 시작하여 수정해야 하는 오류가 발생했습니다.

PodHasOldRevision

JbodVolumesChanged

Kafka 볼륨에서 디스크가 추가 또는 제거되었으며 변경 사항을 적용하려면 재시작이 필요합니다. StrimziPodSet 리소스를 사용하는 경우 Pod를 다시 생성해야 하는 경우 동일한 이유가 지정됩니다.

PodHasOldRevision

PodHasOldGeneration

Pod가 의 멤버인 StatefulSet 또는 StrimziPodSet 이 업데이트되었으므로 Pod를 다시 생성해야 합니다. StrimziPodSet 리소스를 사용하는 경우 Kafka 볼륨에서 디스크가 추가되거나 제거된 경우에도 동일한 이유가 지정됩니다.

PodStuck

PodStuck

Pod는 여전히 보류 중이며 예약되지 않았거나 예약할 수 없으므로 Operator에서 Pod를 마지막 시도에서 재시작했습니다.

PodUnresponsive

PodUnresponsive

AMQ Streams는 Pod에 연결할 수 없어 브로커가 올바르게 시작되지 않음을 나타낼 수 있으므로 Operator에서 문제를 해결하려고 시도합니다.

19.2. 이벤트 필터 재시작

명령줄에서 재시작 이벤트를 확인할 때 OpenShift 이벤트 필드에서 필터링할 필드 선택기 를 지정할 수 있습니다.

필드 선택기로 이벤트를 필터링하는 경우 다음 필드 를 사용할 수 있습니다.

regardingObject.kind
다시 시작한 오브젝트와 재시작 이벤트의 경우 kind는 항상 Pod 입니다.
regarding.namespace
Pod가 속한 네임스페이스입니다.
regardingObject.name
Pod의 이름입니다(예: strimzi-cluster-kafka-0 ).
regardingObject.uid
Pod의 고유 ID입니다.
reason
pod가 재시작된 이유(예: JbodVolumesChanged ).
reportingController
보고 구성 요소는 항상 AMQ Streams 재시작 이벤트용으로 strimzi.io/cluster-operator 입니다.
source
SourcereportingController 의 이전 버전입니다. 보고 구성 요소는 항상 AMQ Streams 재시작 이벤트용으로 strimzi.io/cluster-operator 입니다.
type
Warning 또는 Normal 인 이벤트 유형입니다. AMQ Streams 재시작 이벤트의 경우 유형은 Normal 입니다.
참고

이전 버전의 OpenShift에서는 접두사를 사용하는 필드에 대신 involvedObject 접두사가 사용될 수 있습니다. reportingController 는 이전에 reportingComponent 라고 했습니다.

19.3. Kafka 재시작 확인

oc 명령을 사용하여 Cluster Operator에서 시작한 재시작 이벤트를 나열합니다. reportingController 또는 소스 이벤트 필드를 사용하여 Cluster Operator를 보고 구성 요소로 설정하여 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
  • source

20장. AMQ Streams 관리

AMQ Streams를 관리하려면 Kafka 클러스터 및 관련 리소스를 원활하게 실행하기 위해 다양한 작업을 수행해야 합니다. oc 명령을 사용하여 리소스 상태를 확인하고, 롤링 업데이트를 위한 유지 관리 창을 구성하고, AMQ Streams Drain cleaner 및 Kafka Static Quota 플러그인과 같은 툴을 활용하여 배포를 효과적으로 관리합니다.

20.1. 사용자 정의 리소스 작업

oc 명령을 사용하여 AMQ Streams 사용자 정의 리소스에서 정보를 검색하고 다른 작업을 수행할 수 있습니다.

사용자 정의 리소스의 status 하위 리소스와 함께 oc 를 사용하면 리소스에 대한 정보를 가져올 수 있습니다.

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

get,describe,edit, delete 와 같은 oc 명령을 사용하여 리소스 유형에 대해 작업을 수행합니다. 예를 들어 oc get kafkatopics 는 모든 Kafka 주제 목록을 검색하고 oc get kafkas 는 배포된 모든 Kafka 클러스터를 검색합니다.

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

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

oc get k

NAME         DESIRED KAFKA REPLICAS   DESIRED ZK REPLICAS
my-cluster   3                        3
Expand
표 20.1. 각 AMQ Streams 리소스에 대한 긴 및 짧은 이름
AMQ Streams 리소스긴 이름짧은 이름

Kafka

kafka

k

Kafka Topic

kafkatopic

kt

Kafka 사용자

kafkauser

ku

Kafka Connect

kafkaconnect

kc

Kafka Connector

kafkaconnector

kctr

Kafka Mirror Maker

kafkamirrormaker

kmm

Kafka MirrorECDHE 2

kafkamirrormaker2

kmm2

Kafka 브리지

kafkabridge

kb

Kafka 리밸런스

kafkarebalance

kr

20.1.1.1. 리소스 카테고리

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

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

예를 들어 oc get strimzi 를 실행하면 지정된 네임스페이스에 모든 AMQ 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 옵션은 type/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

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

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

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

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

가장 유용한 옵션 중 하나는 JSONPath 지원 이며, Kubernetes API를 쿼리하기 위해 JSONPath 표현식을 전달할 수 있습니다. 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 를 사용하여 사용자 정의 리소스에서 다른 속성 또는 속성 그룹을 추출할 수 있습니다.

20.1.2. AMQ Streams 사용자 정의 리소스 상태 정보

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

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

스키마에 대한 자세한 내용은 사용자 정의 리소스 API 참조 를 참조하십시오.

Expand
표 20.2. 상태 정보를 제공하는 사용자 정의 리소스
AMQ Streams 리소스스키마 참조…​에 상태 정보를 게시합니다.

Kafka

KafkaStatus 스키마 참조

Kafka 클러스터

KafkaTopic

KafkaTopicStatus 스키마 참조

Kafka 클러스터의 Kafka 주제

KafkaUser

KafkaUserStatus 스키마 참조

Kafka 클러스터의 Kafka 사용자

KafkaConnect

KafkaConnectStatus schema reference

Kafka Connect 클러스터

KafkaConnector

KafkaConnectorStatus 스키마 참조

KafkaConnector 리소스

KafkaMirrorMaker2

KafkaMirrorMaker2Status 스키마 참조

Kafka MirrorMaker 2 클러스터

KafkaMirrorMaker

KafkaMirrorMakerStatus schema reference

Kafka MirrorMaker 클러스터

KafkaBridge

KafkaBridgeStatus 스키마 참조

AMQ Streams Kafka 브리지

KafkaRebalance

KafkaRebalance 스키마 참조

리밸런스 상태 및 결과

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

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

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

AMQ Streams는 사용자 정의 리소스의 상태를 생성하고 유지 관리하며, 주기적으로 사용자 정의 리소스의 현재 상태를 평가하고 그에 따라 해당 상태를 업데이트합니다. 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

  listeners: 
4

    - addresses:
        - host: my-cluster-kafka-bootstrap.prm-project.svc
          port: 9092
      bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9092'
      name: plain
      type: 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
      type: 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: external2
      type: external2
    - 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: external1
      type: external1
  observedGeneration: 3 
5

1
Kafka 클러스터 ID입니다.
2
상태 조건은 Kafka 클러스터의 현재 상태를 설명합니다.
3
Ready 조건은 Cluster Operator가 트래픽을 처리할 수 있는 Kafka 클러스터를 고려함을 나타냅니다.
4
리스너 는 유형별로 Kafka 부트스트랩 주소를 설명합니다.
5
observedGeneration 값은 Cluster Operator가 Kafka 사용자 정의 리소스의 마지막 조정을 나타냅니다.
참고

상태에 나열된 Kafka 부트스트랩 주소가 해당 끝점 또는 Kafka 클러스터가 Ready 상태에 있음을 나타내는 것은 아닙니다.

상태 정보에 액세스

명령줄에서 리소스의 상태 정보에 액세스할 수 있습니다. 자세한 내용은 20.1.3절. “사용자 정의 리소스의 상태 검색”의 내용을 참조하십시오.

20.1.3. 사용자 정의 리소스의 상태 검색

다음 절차에서는 사용자 정의 리소스의 상태를 찾는 방법을 설명합니다.

사전 요구 사항

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

절차

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

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

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

20.2. 사용자 정의 리소스 조정 일시 중지

수정 사항을 수행하거나 업데이트할 수 있도록 AMQ Streams Operator에서 관리하는 사용자 정의 리소스의 조정을 일시 중지하는 것이 유용한 경우도 있습니다. 조정이 일시 중지되면 Operator에서 일시 중지가 종료될 때까지 사용자 정의 리소스에 대한 변경 사항을 무시합니다.

사용자 정의 리소스의 조정을 일시 중지하려면 구성에서 strimzi.io/pause-reconciliation 주석을 true 로 설정합니다. 이렇게 하면 적절한 Operator가 사용자 정의 리소스의 조정을 일시 중지하도록 지시합니다. 예를 들어 KafkaConnect 리소스에 주석을 적용하여 Cluster Operator의 조정을 일시 중지할 수 있습니다.

pause 주석이 활성화된 사용자 정의 리소스도 생성할 수 있습니다. 사용자 정의 리소스가 생성되지만 무시됩니다.

사전 요구 사항

  • 사용자 정의 리소스를 관리하는 AMQ Streams 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 로 설정하거나 주석을 제거할 수 있습니다.

20.3. 롤링 업데이트를 위한 유지 관리 시간

유지 관리 시간 창을 사용하면 Kafka 및 ZooKeeper 클러스터의 특정 롤링 업데이트를 편리하게 시작할 수 있습니다.

20.3.1. 유지 관리 기간 개요

대부분의 경우 Cluster Operator는 해당 Kafka 리소스에 대한 변경 사항에 따라 Kafka 또는 ZooKeeper 클러스터만 업데이트합니다. 이를 통해 Kafka 리소스에 변경 사항을 적용할 시기를 계획하여 Kafka 클라이언트 애플리케이션에 미치는 영향을 최소화할 수 있습니다.

그러나 Kafka 및 ZooKeeper 클러스터에 대한 일부 업데이트는 Kafka 리소스에 대한 해당 변경없이 발생할 수 있습니다. 예를 들어 관리하는 CA(인증 기관) 인증서가 만료에 가까운 경우 Cluster Operator는 롤링 재시작을 수행해야 합니다.

Pod를 롤링 재시작하면(올바른 브로커 및 주제 구성 가정)의 가용성에 는 영향을 미치지 않지만 Kafka 클라이언트 애플리케이션의 성능에 영향을 미칠 수 있습니다. 유지 관리 시간 창을 사용하면 Kafka 및 ZooKeeper 클러스터의 다양한 롤링 업데이트를 편리하게 시작할 수 있습니다. 유지 관리 시간 창이 클러스터에 대해 구성되지 않은 경우 예측 가능한 높은 로드 기간 동안과 같이 불편한 시간에 이러한 spontaneous 롤링 업데이트가 발생할 수 있습니다.

20.3.2. 유지 관리 시간 창 정의

Kafka.spec.maintenanceTimeWindows 속성에 문자열 배열을 입력하여 유지 관리 시간 창을 구성합니다. 각 문자열은 UTC (Coordinated Universal Time)로 해석되는 cron 표현식 입니다. 실제 용도는 Greenwich Mean Time과 동일합니다.

다음 예는 자정에 시작하고 01:59am (UTC)에 종료되는 단일 유지 관리 기간을 구성합니다. 이 기간은 연중 무휴일, 월요일, 주거장, 수요일 및 추위에 있습니다.

# ...
maintenanceTimeWindows:
  - "* * 0-1 ? * SUN,MON,TUE,WED,THU *"
# ...

실제로, 구성된 유지 관리 기간 동안 필요한 CA 인증서 갱신을 완료할 수 있도록 Kafka 리소스의 Kafka.spec.clusterCa.renewalDaysKafka.spec.clientsCa.renewalDays 속성과 함께 유지 관리 창을 설정해야 합니다.

참고

AMQ Streams는 지정된 창에 따라 유지보수 작업을 정확하게 예약하지 않습니다. 대신 각 조정에 대해 유지 관리 기간이 현재 "열기"인지 확인합니다. 즉, 지정된 시간 내에 유지 관리 작업 시작이 Cluster Operator 조정 간격까지 지연될 수 있습니다. 따라서 유지 보수 시간은 적어도 이 기간이 길어야 합니다.

20.3.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>

20.4. Kafka 및 ZooKeeper 클러스터의 롤링 업데이트 수동 시작

AMQ Streams는 리소스의 주석을 사용하여 Cluster Operator를 통해 Kafka 및 ZooKeeper 클러스터의 롤링 업데이트를 수동으로 트리거할 수 있습니다. 롤링 업데이트는 새 리소스 Pod를 다시 시작합니다.

일반적으로 특정 Pod 또는 Pod 세트에서 롤링 업데이트를 수동으로 수행하는 것은 예외적인 경우에만 필요합니다. 그러나 Pod를 직접 삭제하는 대신 Cluster Operator를 통해 롤링 업데이트를 수행하는 경우 다음을 확인합니다.

  • Pod의 수동 삭제는 다른 Pod를 병렬로 삭제하는 등 동시 Cluster Operator 작업과 충돌하지 않습니다.
  • Cluster Operator 논리는 in-sync 복제본 수와 같은 Kafka 구성 사양을 처리합니다.

20.4.1. Pod 관리 주석을 사용하여 롤링 업데이트 수행

다음 절차에서는 Kafka 클러스터 또는 ZooKeeper 클러스터의 롤링 업데이트를 트리거하는 방법을 설명합니다.

업데이트를 트리거하려면 클러스터에서 실행 중인 Pod를 관리하는 데 사용 중인 리소스에 주석을 추가합니다. StatefulSet 또는 StrimziPodSet 리소스 ( UseStrimziPodSets 기능 게이트를 활성화한 경우)에 주석을 답니다.

사전 요구 사항

수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator 및 Kafka 클러스터가 필요합니다.

절차

  1. 수동으로 업데이트하려는 Kafka 또는 ZooKeeper Pod를 제어하는 리소스의 이름을 찾습니다.

    예를 들어 Kafka 클러스터의 이름이 my-cluster 인 경우 해당 이름은 my-cluster-kafkamy-cluster-zookeeper 입니다.

  2. oc annotate 을 사용하여 OpenShift에서 적절한 리소스에 주석을 답니다.

    StatefulSet에 주석을 달기

    oc annotate statefulset <cluster_name>-kafka strimzi.io/manual-rolling-update=true
    
    oc annotate statefulset <cluster_name>-zookeeper strimzi.io/manual-rolling-update=true

    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

  3. 다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다). 조정 프로세스에서 주석을 탐지한 한 주석이 감지되면 주석이 달린 리소스 내의 모든 Pod의 롤링 업데이트가 트리거됩니다. 모든 Pod의 롤링 업데이트가 완료되면 리소스에서 주석이 제거됩니다.

20.4.2. Pod 주석을 사용하여 롤링 업데이트 수행

다음 절차에서는 OpenShift Pod 주석을 사용하여 기존 Kafka 클러스터 또는 ZooKeeper 클러스터의 롤링 업데이트를 수동으로 트리거하는 방법을 설명합니다. 여러 Pod에 주석이 추가되면 동일한 조정 실행 내에서 연속 롤링 업데이트가 수행됩니다.

사전 요구 사항

수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator 및 Kafka 클러스터가 필요합니다.

사용된 주제 복제 요인에 관계없이 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. 수동으로 업데이트하려는 Kafka 또는 ZooKeeper Pod 이름을 찾습니다.

    예를 들어 Kafka 클러스터의 이름이 my-cluster 인 경우 해당 Pod 이름은 my-cluster-kafka-indexmy-cluster-zookeeper-index 입니다. 인덱스 는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다.

  2. OpenShift에서 포드 리소스에 주석을 답니다.

    oc annotate:

    oc annotate pod cluster-name-kafka-index strimzi.io/manual-rolling-update=true
    
    oc annotate pod cluster-name-zookeeper-index strimzi.io/manual-rolling-update=true
  3. 다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다). 조정 프로세스에서 주석을 탐지한 경우 주석이 있는 Pod 의 롤링 업데이트가 트리거됩니다. Pod의 롤링 업데이트가 완료되면 Pod 에서 주석이 제거됩니다.

20.5. AMQ Streams Drain cleaner를 사용하여 Pod 제거

OpenShift 업그레이드, 유지 관리 또는 Pod 일정 변경 중에 Kafka 및 ZooKeeper Pod가 제거될 수 있습니다. Kafka 브로커 및 ZooKeeper Pod가 AMQ Streams에 의해 배포된 경우 AMQ Streams DrainCleaner 툴을 사용하여 Pod 제거를 처리할 수 있습니다. AMQ Streams DrainCleaner는 OpenShift 대신 제거를 처리합니다. Kafka 배포의 podDisruptionBudget0 (0)으로 설정해야 합니다. 그러면 더 이상 OpenShift에서 포드를 자동으로 제거할 수 없습니다.

AMQ Streams DrainCleaner를 배포하면 Cluster Operator를 사용하여 OpenShift 대신 Kafka Pod를 이동할 수 있습니다. Cluster Operator는 항목이 복제되지 않도록 합니다. Kafka는 제거 프로세스 중에 계속 작동할 수 있습니다. OpenShift 작업자 노드가 연속으로 드레이닝되므로 Cluster Operator가 항목이 동기화될 때까지 기다립니다.

승인 Webhook는 Kubernetes API에 대한 Pod 제거 요청의 AMQ Streams Drain cleaner에게 알립니다. 그런 다음 AMQ Streams DrainCleaner는 드레인할 Pod에 롤링 업데이트 주석을 추가합니다. 그러면 제거된 Pod의 롤링 업데이트를 수행하도록 Cluster Operator에 알립니다.

참고

AMQ Streams DrainCleaner를 사용하지 않는 경우 Pod 주석을 추가하여 롤링 업데이트를 수동으로 수행할 수 있습니다.

Webhook 구성

AMQ Streams DrainCleaner 배포 파일에는 ValidatingWebhookConfiguration 리소스 파일이 포함되어 있습니다. 리소스는 Webhook를 Kubernetes API에 등록하기 위한 구성을 제공합니다.

이 구성은 Pod 제거 요청 시 실행할 Kubernetes API에 대한 규칙 을 정의합니다. 규칙은 pod/eviction 하위 리소스와 관련된 CREATE 작업만 가로채도록 지정합니다. 이러한 규칙이 충족되면 API에서 알림을 전달합니다.

clientConfig 는 웹 후크를 노출하는 AMQ Streams DrainCleaner 서비스 및 /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==
    # ...

20.5.1. AMQ Streams DrainCleaner 배포 파일 다운로드

AMQ Streams Drain cleaner를 배포하고 사용하려면 배포 파일을 다운로드해야 합니다.

AMQ Streams DrainCleaner 배포 파일은 AMQ Streams 소프트웨어 다운로드 페이지에서 사용할 수 있습니다.

20.5.2. 설치 파일을 사용하여 AMQ Streams DrainCleaner 배포

AMQ Streams DrainCleaner를 Cluster Operator 및 Kafka 클러스터가 실행 중인 OpenShift 클러스터에 배포합니다.

사전 요구 사항

  • AMQ Streams DrainCleaner 배포 파일을 다운로드 했습니다.
  • 업데이트하려는 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 또는 ZooKeeper 제외

Clearer 작업의 Kafka 또는 ZooKeeper Pod를 포함하지 않으려면 DrainCleaner 배포 구성 파일에서 기본 환경 변수를 변경하십시오.

  • Kafka Pod를 제외하려면 STRIMZI_DRAIN_KAFKAfalse 로 설정합니다.
  • ZooKeeper Pod를 제외하려면 STRIMZI_DRAIN_ZOOKEEPERfalse 로 설정합니다.

ZooKeeper Pod를 제외하는 설정 예

apiVersion: apps/v1
kind: Deployment
spec:
  # ...
  template:
    spec:
      serviceAccountName: strimzi-drain-cleaner
      containers:
        - name: strimzi-drain-cleaner
          # ...
          env:
            - name: STRIMZI_DRAIN_KAFKA
              value: "true"
            - name: STRIMZI_DRAIN_ZOOKEEPER
              value: "false"
          # ...

절차

  1. Kafka 리소스의 템플릿 설정을 사용하여 Kafka 배포에 대한 Pod 중단 예산을 구성합니다.

    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 중단 예산을 0으로 줄이면 자발적으로 중단되는 경우 OpenShift가 Pod를 자동으로 제거하지 못하도록 하여 AMQ Streams DrainCleaner 및 AMQ Streams Cluster Operator에서 다른 작업자 노드에서 OpenShift가 예약할 Pod를 롤포팅하도록 합니다.

    AMQ Streams DrainCleaner를 사용하여 ZooKeeper 노드를 드레인하려면 ZooKeeper에 대해 동일한 구성을 추가합니다.

  2. Kafka 리소스를 업데이트합니다.

    oc apply -f <kafka_configuration_file>
  3. AMQ Streams Drain cleaner를 배포합니다.

    • OpenShift에서 DrainCleaner를 실행하려면 /install/drain-cleaner/openshift 디렉터리에 리소스를 적용합니다.

      oc apply -f ./install/drain-cleaner/openshift

20.5.3. AMQ Streams Drain cleaner 사용

Cluster Operator와 함께 AMQ Streams DrainCleaner를 사용하여 드레인된 노드에서 Kafka 브로커 또는 ZooKeeper Pod를 이동합니다. AMQ Streams DrainCleaner를 실행하면 롤링 업데이트 Pod 주석이 있는 Pod에 주석을 추가합니다. Cluster Operator는 주석을 기반으로 롤링 업데이트를 수행합니다.

사전 요구 사항

절차

  1. Kafka 브로커 또는 ZooKeeper Pod를 호스팅하는 지정된 OpenShift 노드를 드레이닝합니다.

    oc get nodes
    oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --force
  2. AMQ Streams DrainCleaner 로그에서 제거 이벤트를 확인하여 Pod에 재시작을 위해 주석이 추가되었는지 확인합니다.

    AMQ Streams Drain cleaneder log show annotations of pods

    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 로그에서 조정 이벤트를 확인하여 롤링 업데이트를 확인합니다.

    클러스터 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

20.5.4. AMQ Streams DrainCleaner에서 사용하는 TLS 인증서 감시

기본적으로 DrainCleaner 배포는 인증에 사용하는 TLS 인증서가 포함된 시크릿을 감시합니다. Drain cleaner는 인증서 갱신과 같은 변경 사항을 조사합니다. 변경 사항을 감지하면 TLS 인증서를 다시 로드하도록 다시 시작합니다. Drain Clearer 설치 파일은 기본적으로 이 동작을 사용할 수 있습니다. 그러나 DrainCleaner 설치 파일의 배포 구성 (060- Deployment.yaml)에서 STRIMZI_CERTIFICATE_WATCH_ENABLED 환경 변수를 false 로 설정하여 인증서 감시를 비활성화할 수 있습니다.

STRIMZI_CERTIFICATE_WATCH_ENABLED 를 활성화하면 다음 환경 변수를 사용하여 TLS 인증서를 감시할 수도 있습니다.

Expand
표 20.3. TLS 인증서를 감시하기 위한 drainCleaner 환경 변수
환경 변수설명Default

STRIMZI_CERTIFICATE_WATCH_ENABLED

인증서 감시를 활성화하거나 비활성화합니다.

false

STRIMZI_CERTIFICATE_WATCH_NAMESPACE

DrainCleaner가 배포되고 인증서 보안이 존재하는 네임스페이스

strimzi-drain-cleaner

STRIMZI_CERTIFICATE_WATCH_POD_NAME

드레인 클리너 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 을 구성합니다.

20.6. 레이블 및 주석을 사용하여 서비스 검색

서비스 검색을 사용하면 AMQ Streams와 동일한 OpenShift 클러스터에서 실행되는 클라이언트 애플리케이션이 Kafka 클러스터와 상호 작용할 수 있습니다.

Kafka 클러스터에 액세스하는 데 사용되는 서비스에 대해 서비스 검색 레이블 및 주석이 생성됩니다.

  • 내부 Kafka 부트스트랩 서비스
  • HTTP 브리지 서비스

레이블은 서비스를 검색 가능하게 하는 데 도움이 되며, 주석은 클라이언트 애플리케이션에서 연결하는 데 사용할 수 있는 연결 세부 정보를 제공합니다.

서비스 검색 레이블인 strimzi.io/discovery서비스 리소스에 대해 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:
  #...
HTTP 브리지 서비스 예
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

20.6.1. 서비스에 대한 연결 세부 정보 반환

명령줄 또는 해당 API 호출에서 서비스를 가져올 때 검색 레이블을 지정하여 서비스를 찾을 수 있습니다.

oc get service -l strimzi.io/discovery=true

연결 세부 정보는 서비스 검색 레이블을 검색할 때 반환됩니다.

20.7. 영구 볼륨에서 클러스터 복구

PV(영구 볼륨)가 있는 경우 Kafka 클러스터를 복구할 수 있습니다.

예를 들어 다음과 같은 작업을 수행할 수 있습니다.

  • 실수로 네임스페이스가 삭제됨
  • 전체 OpenShift 클러스터가 손실되지만 PV는 인프라에 남아 있습니다.

20.7.1. 네임스페이스 삭제에서 복구

영구 볼륨과 네임스페이스 간의 관계로 인해 네임스페이스를 삭제할 수 있습니다. PV( PersistentVolume )는 네임스페이스 외부에 있는 스토리지 리소스입니다. PV는 네임스페이스 내에 있는 PVC( PersistentVolumeClaim )를 사용하여 Kafka Pod에 마운트됩니다.

PV의 회수 정책은 네임스페이스가 삭제될 때 작동하는 방법을 클러스터에 지시합니다. 회수 정책이 다음과 같이 설정된 경우:

  • 삭제 (기본값)는 네임스페이스 내에서 PVC가 삭제되면 PV가 삭제됩니다.
  • 유지 관리: 네임스페이스가 삭제되면 PV가 삭제되지 않습니다.

네임스페이스가 실수로 삭제되면 PV에서 복구할 수 있도록 persistentVolumeReclaimPolicy 속성을 사용하여 PV 사양에서 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를 수동으로 삭제해야 합니다. 그렇지 않으면 삭제되지 않으며 리소스에 불필요한 영향을 미칠 수 있습니다.

20.7.2. OpenShift 클러스터 손실에서 복구

클러스터가 손실되면 디스크/ 볼륨의 데이터를 사용하여 인프라 내에 보존된 경우 클러스터를 복구할 수 있습니다. 복구 절차는 PV가 복구되고 수동으로 생성될 수 있다고 가정하여 네임스페이스 삭제와 동일합니다.

20.7.3. 영구 볼륨에서 삭제된 클러스터 복구

다음 절차에서는 PV(영구 볼륨)에서 삭제된 클러스터를 복구하는 방법을 설명합니다.

이 경우 Topic Operator는 Kafka에 항목이 있는지 확인하지만 KafkaTopic 리소스는 존재하지 않습니다.

클러스터를 재생성하기 위해 단계에 도달하면 다음 두 가지 옵션이 있습니다.

  1. 모든 KafkaTopic 리소스를 복구할 수 있는 옵션 1 을 사용합니다.

    따라서 해당 주제를 Topic Operator에서 삭제하지 않도록 클러스터가 시작되기 전에 KafkaTopic 리소스를 복구해야 합니다.

  2. 모든 KafkaTopic 리소스를 복구할 수 없는 경우 옵션 2 를 사용합니다.

    이 경우 Topic Operator 없이 클러스터를 배포하고 Topic Operator 주제 저장소 메타데이터를 삭제한 다음 해당 주제에서 KafkaTopic 리소스를 재생성할 수 있도록 Topic Operator로 Kafka 클러스터를 재배포합니다.

참고

Topic Operator가 배포되지 않은 경우 PVC( PersistentVolumeClaim ) 리소스만 복구하면 됩니다.

사전 준비 사항

이 절차에서는 데이터 손상을 방지하려면 PV를 올바른 PVC에 마운트해야 합니다. PVC에 volumeName 이 지정되며 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를 적절한 PV에 연결하여 원래 PVC 리소스 사양을 다시 생성합니다.

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

    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-34-rhel8:2.4.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 클러스터를 재배포하여 Topic Operator를 활성화하여 KafkaTopic 리소스를 다시 생성합니다.

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

      apiVersion: kafka.strimzi.io/v1beta2
      kind: Kafka
      metadata:
        name: my-cluster
      spec:
        #...
        entityOperator:
          topicOperator: {} 
      1
      
          #...
    1
    여기서는 추가 속성이 없는 기본 구성을 보여줍니다. EntityTopicOperatorSpec 스키마 참조에 설명된 속성을 사용하여 필요한 구성을 지정합니다.
  7. KafkaTopic 리소스를 나열하여 복구를 확인합니다.

    oc get KafkaTopic

20.8. Kafka 정적 할당량 플러그인을 사용하여 브로커에 대한 제한 설정

Kafka 정적 할당량 플러그인을 사용하여 Kafka 클러스터의 브로커에 대한 처리량 및 스토리지 제한을 설정합니다. 플러그인을 활성화하고 Kafka 리소스를 구성하여 제한을 설정합니다. 브로커와 상호 작용하는 클라이언트에 제한을 두도록 바이트 비율 임계값 및 스토리지 할당량을 설정할 수 있습니다.

생산자 및 소비자 대역폭에 대한 바이트 비율 임계값을 설정할 수 있습니다. 총 제한은 브로커에 액세스하는 모든 클라이언트에 분배됩니다. 예를 들어, 생산자에 대해 40MBps의 바이트 비율 임계값을 설정할 수 있습니다. 두 생산자가 실행 중인 경우 각각 20MBps의 처리량으로 제한됩니다.

스토리지 할당량은 소프트 제한과 하드 제한 사이에 Kafka 디스크 스토리지 제한을 제한합니다. 제한은 사용 가능한 모든 디스크 공간에 적용됩니다. 생산자는 소프트 및 하드 제한 사이에 점진적으로 느려집니다. 제한으로 인해 디스크가 너무 빨리 채워지고 용량을 초과할 수 있습니다. 전체 디스크는 수정하기 어려운 문제로 이어질 수 있습니다. 하드 제한은 최대 스토리지 제한입니다.

참고

JBOD 스토리지의 경우 제한이 모든 디스크에 적용됩니다. 브로커가 두 개의 1TB 디스크를 사용하고 있고 할당량이 1.1TB인 경우 하나의 디스크가 채워지고 다른 디스크는 거의 비어 있습니다.

사전 요구 사항

  • Kafka 클러스터를 관리하는 Cluster Operator가 실행 중입니다.

절차

  1. Kafka 리소스의 구성에 plugin 속성을 추가합니다.

    plugin 속성은 이 설정 예제에 표시되어 있습니다.

    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
    소비자 바이트 비율 임계값을 설정합니다. 이 예에서는 1Mbps입니다.
    4
    스토리지에 대해 더 낮은 소프트 제한을 설정합니다. 이 예에서는 400GB입니다.
    5
    스토리지에 대해 더 높은 하드 제한을 설정합니다. 이 예에서는 500GB입니다.
    6
    스토리지 검사 간격(초)을 설정합니다. 이 예에서 5초. 검사를 비활성화하려면 이를 0으로 설정할 수 있습니다.
  2. 리소스를 업데이트합니다.

    oc apply -f <kafka_configuration_file>

20.9. AMQ Streams 설치 제거

OpenShift Container Platform 웹 콘솔 또는 CLI를 사용하여 OperatorHub에서 OpenShift 4.10에서 4.13으로 AMQ Streams를 설치 제거할 수 있습니다.

AMQ Streams를 설치하는 데 사용한 것과 동일한 방법을 사용합니다.

AMQ Streams를 설치 제거할 때 배포용으로 특별히 생성된 리소스를 식별하고 AMQ Streams 리소스에서 참조해야 합니다.

이러한 리소스는 다음과 같습니다.

  • 보안(사용자 정의 CA 및 인증서, Kafka Connect 시크릿 및 기타 Kafka 시크릿)
  • 로깅 ConfigMaps ( 외부유형의 경우)

Kafka , Kafka Connect,KafkaMirrorMaker 또는 KafkaBridge 구성에서 참조하는 리소스입니다.

주의

CustomResourceDefinitions 를 삭제하면 해당 사용자 정의 리소스(Kafka,KafkaConnect,KafkaMirrorMaker 또는 KafkaBridge)와 해당 리소스에 종속된 리소스(Deployments, StatefulSets 및 기타 종속 리소스)의 가비지 컬렉션이 생성됩니다.

20.9.1. 웹 콘솔을 사용하여 OperatorHub에서 AMQ Streams 설치 제거

다음 절차에서는 OperatorHub에서 AMQ Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.

콘솔에서 단계를 수행하거나 대체 CLI 명령을 사용할 수 있습니다.

사전 요구 사항

  • cluster-admin 또는 strimzi-admin 권한이 있는 계정을 사용하여 OpenShift Container Platform 웹 콘솔에 액세스합니다.
  • 삭제할 리소스를 식별했습니다.

    다음 oc CLI 명령을 사용하여 리소스를 찾고 AMQ Streams를 제거할 때 해당 리소스가 제거되었는지 확인할 수도 있습니다.

    AMQ Streams 배포와 관련된 리소스를 찾는 명령

    oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>

    & lt;resource_type >을 검사 중인 리소스 유형(예: secret 또는 configmap )으로 바꿉니다.

절차

  1. OpenShift 웹 콘솔에서 Operator > 설치된 Operator로 이동합니다.
  2. 설치된 AMQ Streams Operator의 경우 옵션 아이콘( 세 개의 수직점)을 선택하고 Uninstall Operator 를 클릭합니다.

    Operator는 설치된 Operator에서 제거됩니다.

  3. > 프로젝트로 이동하여 AMQ Streams 및 Kafka 구성 요소를 설치한 프로젝트를 선택합니다.
  4. 인벤토리 아래의 옵션을 클릭하여 관련 리소스를 삭제합니다.

    리소스는 다음과 같습니다.

    • 배포
    • StatefulSets
    • Pods
    • 서비스
    • ConfigMaps
    • 보안
    작은 정보

    검색을 사용하여 Kafka 클러스터의 이름으로 시작하는 관련 리소스를 찾습니다. 워크로드에서 리소스를 찾을 수도 있습니다.

대체 CLI 명령

CLI 명령을 사용하여 OperatorHub에서 AMQ Streams를 제거할 수 있습니다.

  1. AMQ 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

20.9.2. CLI를 사용하여 AMQ Streams 설치 제거

다음 절차에서는 oc 명령줄 툴을 사용하여 AMQ Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.

사전 요구 사항

  • cluster-admin 또는 strimzi-admin 권한이 있는 계정을 사용하여 OpenShift 클러스터에 액세스할 수 있습니다.
  • 삭제할 리소스를 식별했습니다.

    다음 oc CLI 명령을 사용하여 리소스를 찾고 AMQ Streams를 제거할 때 해당 리소스가 제거되었는지 확인할 수도 있습니다.

    AMQ Streams 배포와 관련된 리소스를 찾는 명령

    oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>

    & lt;resource_type >을 검사 중인 리소스 유형(예: secret 또는 configmap )으로 바꿉니다.

절차

  1. Cluster Operator 배포, 관련 CustomResourceDefinitions, RBAC 리소스를 삭제합니다.

    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 -n my-project

20.10. 자주하는 질문

21장. AMQ Streams에서 미터링 사용

OpenShift에서 사용할 수 있는 미터링 툴을 사용하여 다양한 데이터 소스에서 미터링 보고서를 생성할 수 있습니다. 클러스터 관리자는 미터링을 사용하여 클러스터에서 발생하는 상황을 분석할 수 있습니다. 자체적으로 작성하거나 사전 정의된 SQL 쿼리를 사용하여 사용 가능한 다양한 데이터 소스에서 데이터를 처리하는 방법을 정의할 수 있습니다. Prometheus를 기본 데이터 소스로 사용하여 Pod, 네임스페이스 및 대부분의 기타 OpenShift 리소스에 대한 보고서를 생성할 수 있습니다.

OpenShift Metering Operator를 사용하여 설치된 AMQ Streams 구성 요소를 분석하여 Red Hat 서브스크립션을 준수하는지 여부를 확인할 수도 있습니다.

AMQ Streams에서 미터링을 사용하려면 먼저 OpenShift Container Platform에 Metering Operator 를 설치하고 구성해야 합니다.

21.1. 미터링 리소스

미터링에는 많은 리소스가 있으며, 기능 미터링을 보고하는 기능과 함께 미터링 배포 및 설치를 관리하는 데 사용할 수 있습니다. 미터링은 다음 CRD를 사용하여 관리합니다.

Expand
표 21.1. 미터링 리소스
이름설명

MeteringConfig

배포에 대해 미터링 스택을 구성합니다. 미터링 스택을 구성하는 각 구성 요소를 제어하기 위한 사용자 정의 및 구성 옵션이 포함되어 있습니다.

Reports

사용할 쿼리, 쿼리를 실행할 빈도 및 결과를 저장할 위치를 제어합니다.

ReportQueries

ReportDataSources 에 포함된 데이터에서 분석을 수행하는 데 사용되는 SQL 쿼리를 포함합니다.

ReportDataSources

ReportQueries 및 Reports에서 사용할 수 있는 데이터를 제어합니다. 미터링 내에서 사용할 수 있도록 다양한 데이터베이스에 대한 액세스를 구성할 수 있습니다.

21.2. AMQ Streams의 미터링 라벨

다음 표에는 AMQ Streams 인프라 구성 요소 및 통합의 미터링 라벨이 나열되어 있습니다.

Expand
표 21.2. 미터링 라벨
레이블가능한 값

com.company

Red_Hat

rht.prod_name

Red_Hat_Application_Foundations

rht.prod_ver

2023.Q2

rht.comp

AMQ_Streams

rht.comp_ver

2.4

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=2023.Q2
    rht.comp=AMQ_Streams
    rht.comp_ver=2.4
    rht.subcomp=entity-operator
    rht.subcomp_t=infrastructure
  • 애플리케이션 예(통합 배포 이름이 kafka-bridge임)

    com.company=Red_Hat
    rht.prod_name=Red_Hat_Application_Foundations
    rht.prod_ver=2023.Q2
    rht.comp=AMQ_Streams
    rht.comp_ver=2.4
    rht.subcomp=kafka-bridge
    rht.subcomp_t=application

부록 A. 서브스크립션 사용

AMQ Streams는 소프트웨어 서브스크립션을 통해 제공됩니다. 서브스크립션을 관리하려면 Red Hat 고객 포털에서 계정에 액세스하십시오.

귀하의 계정에 액세스

  1. access.redhat.com 으로 이동합니다.
  2. 아직 계정이 없는 경우 계정을 생성합니다.
  3. 계정에 로그인합니다.

서브스크립션 활성화

  1. access.redhat.com 으로 이동합니다.
  2. 내 서브스크립션으로 이동합니다.
  3. 서브스크립션을 활성화하여 16자리 활성화 번호를 입력합니다.

Zip 및 Tar 파일 다운로드

zip 또는 tar 파일에 액세스하려면 고객 포털을 사용하여 다운로드할 관련 파일을 찾습니다. RPM 패키지를 사용하는 경우에는 이 단계가 필요하지 않습니다.

  1. 브라우저를 열고 access.redhat.com/downloads 에서 Red Hat 고객 포털 제품 다운로드 페이지에 로그인합니다.
  2. INTEGRAT ION 및 AUTOMATION 카테고리에서 Apache Kafka의 AMQ Streams 를 찾습니다.
  3. 원하는 AMQ Streams 제품을 선택합니다. Software Download 페이지가 열립니다.
  4. 구성 요소에 대한 다운로드 링크를 클릭합니다.

DNF로 패키지 설치

패키지 및 모든 패키지 종속 항목을 설치하려면 다음을 사용합니다.

dnf install <package_name>

로컬 디렉터리에서 이전에 다운로드한 패키지를 설치하려면 다음을 사용합니다.

dnf install <path_to_download_package>

2023-07-28에 최종 업데이트된 문서

법적 공지

Copyright © 2023 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
맨 위로 이동