OpenShift에서 Apache Kafka용 스트림 배포 및 관리
OpenShift Container Platform에서 Apache Kafka 2.7에 대한 Streams 배포 및 관리
초록
머리말 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat 문서에 관한 피드백 제공 링크 복사링크가 클립보드에 복사되었습니다!
문서 개선을 위한 의견에 감사드립니다.
개선 사항을 제안하려면 Jira 문제를 열고 제안된 변경 사항을 설명합니다. 귀하의 요청을 신속하게 처리할 수 있도록 가능한 한 자세한 정보를 제공하십시오.
사전 요구 사항
-
Red Hat 고객 포털 계정이 있어야 합니다. 이 계정을 사용하면 Red Hat Jira Software 인스턴스에 로그인할 수 있습니다.
계정이 없는 경우 계정을 생성하라는 메시지가 표시됩니다.
프로세스
- 다음: 생성 문제를 클릭합니다.
- 요약 텍스트 상자에 문제에 대한 간략한 설명을 입력합니다.
설명 텍스트 상자에 다음 정보를 입력합니다.
- 문제를 발견한 페이지의 URL입니다.
-
문제에 대한 자세한 설명입니다.
다른 필드에 있는 정보는 기본값에 따라 그대로 둘 수 있습니다.
- 보고자 이름을 추가합니다.
- 생성 을 클릭하여 Jira 문제를 문서 팀에 제출합니다.
피드백을 제공하기 위해 시간을 내어 주셔서 감사합니다.
1장. 배포 개요 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 스트림은 OpenShift 클러스터에서 Apache Kafka 를 실행하는 프로세스를 간소화합니다.
이 가이드에서는 Apache Kafka용 스트림 배포 및 관리를 위한 지침을 제공합니다. 배포 옵션 및 단계는 Apache Kafka용 Streams에 포함된 설치 파일 예제를 사용하여 다룹니다. 이 가이드에서는 중요한 구성 고려 사항을 강조하지만 사용 가능한 모든 옵션을 다루지는 않습니다. Kafka 구성 요소 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.
이 가이드에서는 배포 지침 외에도 사전 및 배포 후 지침을 제공합니다. Kafka 클러스터에 대한 클라이언트 액세스 설정 및 보안을 설명합니다. 또한 메트릭 통합, 분산 추적 및 Cruise Control과 같은 클러스터 관리 도구 및 Apache Kafka DrainCleaner용 Streams와 같은 추가 배포 옵션을 살펴봅니다. 또한 최적의 성능을 위해 Streams for Apache Kafka 관리 및 Kafka 구성 세부 조정에 대한 권장 사항을 찾을 수 있습니다.
배포를 최신 상태로 유지하는 데 도움이 되도록 Apache Kafka 및 Kafka용 Streams에 대한 업그레이드 지침이 제공됩니다.
Apache Kafka용 스트림은 배포에 관계없이 모든 유형의 OpenShift 클러스터와 호환되도록 설계되었습니다. 배포에 공용 클라우드 또는 프라이빗 클라우드가 포함되었는지, 로컬 개발 환경을 설정하는 경우 이 가이드의 지침을 모든 경우에 적용할 수 있습니다.
1.1. Apache Kafka 사용자 정의 리소스의 스트림 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams를 사용하여 OpenShift 클러스터에 Kafka 구성 요소를 배포하는 것은 사용자 정의 리소스를 사용하여 구성할 수 있습니다. 이러한 리소스는 OpenShift 리소스를 확장하는 CRD(Custom Resource Definitions)에서 도입한 API 인스턴스로 생성됩니다.
CRD는 OpenShift 클러스터의 사용자 정의 리소스를 설명하는 구성 지침으로 작동하며 배포에 사용되는 각 Kafka 구성 요소와 사용자 및 주제에 대해 Streams for Apache Kafka에 제공됩니다. CRD 및 사용자 정의 리소스는 YAML 파일로 정의됩니다. YAML 파일의 예는 Apache Kafka 배포를 위한 스트림과 함께 제공됩니다.
CRD를 사용하면 Apache Kafka 리소스의 Streams가 CLI 접근성 및 구성 검증과 같은 기본 OpenShift 기능을 활용할 수 있습니다.
1.1.1. Apache Kafka 사용자 정의 리소스 스트림 예 링크 복사링크가 클립보드에 복사되었습니다!
CRD는 Apache Kafka 관련 리소스의 스트림을 인스턴스화하고 관리하는 데 사용되는 스키마를 정의하려면 클러스터에 일회성 설치가 필요합니다.
CRD를 설치하여 새 사용자 정의 리소스 유형을 클러스터에 추가한 후 사양에 따라 리소스의 인스턴스를 생성할 수 있습니다.
클러스터 설정에 따라 설치에는 일반적으로 클러스터 관리자 권한이 필요합니다.
사용자 정의 리소스 관리에 대한 액세스는 Apache Kafka 관리자의 Streams로 제한됩니다. 자세한 내용은 4.6절. “Apache Kafka 관리자용 Streams 지정”의 내용을 참조하십시오.
CRD는 OpenShift 클러스터 내에서 와 같은 새로운 유형의 리소스를 정의합니다.
kind:Kafka
Kubernetes API 서버를 사용하면 유형에 따라 사용자 정의 리소스를 생성할 수 있으며 OpenShift 클러스터에 추가할 때 사용자 정의 리소스를 검증하고 저장하는 방법을 CRD에서 이해할 수 있습니다.
Apache Kafka 관련 사용자 정의 리소스의 각 Streams는 리소스 종류의 CRD에서 정의한 스키마를 준수합니다. Apache Kafka 구성 요소의 Streams에 대한 사용자 정의 리소스에는 spec 에서 정의되는 일반적인 구성 속성이 있습니다.
CRD와 사용자 정의 리소스 간의 관계를 이해하려면 Kafka 주제의 CRD 샘플을 살펴보겠습니다.
Kafka 주제 CRD
apiVersion: kafka.strimzi.io/v1beta2
kind: CustomResourceDefinition
metadata:
name: kafkatopics.kafka.strimzi.io
labels:
app: strimzi
spec:
group: kafka.strimzi.io
versions:
v1beta2
scope: Namespaced
names:
# ...
singular: kafkatopic
plural: kafkatopics
shortNames:
- kt
additionalPrinterColumns:
# ...
subresources:
status: {}
validation:
openAPIV3Schema:
properties:
spec:
type: object
properties:
partitions:
type: integer
minimum: 1
replicas:
type: integer
minimum: 1
maximum: 32767
# ...
- 1
- CRD를 식별하는 주제 CRD의 메타데이터, 이름 및 레이블입니다.
- 2
- 주제의 API에 액세스하는 데 사용되는 그룹(도메인) 이름, 복수 이름 및 지원되는 스키마 버전을 포함하여 이 CRD의 사양입니다. 다른 이름은 CLI에서 인스턴스 리소스를 식별하는 데 사용됩니다. 예를 들어
oc get kafkatopic my-topic또는oc get kafkatopics. - 3
- 단축 이름은 CLI 명령에서 사용할 수 있습니다. 예를 들어
oc get kt는oc get kafkatopic대신 약어로 사용할 수 있습니다. - 4
- 사용자 정의 리소스에서
get명령을 사용할 때 표시되는 정보입니다. - 5
- 리소스의 스키마 참조에 설명된 대로 CRD의 현재 상태입니다.
- 6
- openAPIV3Schema 검증에서는 주제 사용자 정의 리소스 생성에 대한 검증을 제공합니다. 예를 들어 항목에는 하나 이상의 파티션과 복제본이 필요합니다.
파일 이름에 인덱스 번호 뒤에 'Crd'가 포함되어 있으므로 Streams for Apache Kafka 설치 파일과 함께 제공되는 CRD YAML 파일을 식별할 수 있습니다.
다음은 KafkaTopic 사용자 정의 리소스의 해당 예입니다.
Kafka 주제 사용자 정의 리소스
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 1
replicas: 1
config:
retention.ms: 7200000
segment.bytes: 1073741824
status:
conditions:
lastTransitionTime: "2019-08-20T11:37:00.706Z"
status: "True"
type: Ready
observedGeneration: 1
/ ...
- 1
kind및apiVersion은 사용자 정의 리소스가 인스턴스인 CRD를 식별합니다.- 2
- 주제 또는 사용자가 속한
Kafka클러스터의 이름( Kafka 리소스 이름과 동일)을 정의하는KafkaTopic및KafkaUser리소스에만 적용되는 레이블입니다. - 3
- 사양은 주제의 파티션 및 복제본 수와 주제 자체의 구성 매개변수를 보여줍니다. 이 예에서는 메시지가 항목에 남아 있고 로그의 세그먼트 파일 크기가 지정됩니다.
- 4
KafkaTopic리소스의 상태 상태입니다.유형조건이lastTransitionTime에서Ready로 변경되었습니다.
플랫폼 CLI를 통해 사용자 정의 리소스를 클러스터에 적용할 수 있습니다. 사용자 정의 리소스가 생성되면 Kubernetes API의 기본 제공 리소스와 동일한 검증을 사용합니다.
KafkaTopic 사용자 정의 리소스가 생성되면 Topic Operator에 알림이 표시되고 해당 Kafka 주제는 Apache Kafka용 Streams에서 생성됩니다.
1.1.2. 사용자 정의 리소스에서 oc 작업 수행 링크 복사링크가 클립보드에 복사되었습니다!
oc 명령을 사용하여 Apache Kafka 사용자 정의 리소스의 Streams에서 정보를 검색하고 다른 작업을 수행할 수 있습니다. get,describe,edit 또는 delete 등의 oc 명령을 사용하여 리소스 유형에 대한 작업을 수행합니다. 예를 들어 oc get kafkatopics 는 모든 Kafka 주제 목록을 검색하고 oc get kafkas 는 배포된 모든 Kafka 클러스터를 검색합니다.
리소스 유형을 참조할 때 단일 이름과 복수 이름을 모두 사용할 수 있습니다. oc get kafkas 는 oc get kafka 와 동일한 결과를 가져옵니다.
리소스의 짧은 이름을 사용할 수도 있습니다. 짧은 이름을 학습하면 Apache Kafka의 Streams를 관리할 때 시간을 절약할 수 있습니다. Kafka 의 짧은 이름은 k 이므로 oc get k 를 실행하여 모든 Kafka 클러스터를 나열할 수도 있습니다.
Kafka 클러스터 나열
oc get k
NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS
my-cluster 3 3
| Apache Kafka 리소스의 스트림 | 긴 이름 | 짧은 이름 |
|---|---|---|
| Kafka | kafka | k |
| Kafka 노드 풀 | kafkanodepool | knp |
| Kafka Topic | kafkatopic | kt |
| Kafka 사용자 | kafkauser | ku |
| Kafka Connect | kafkaconnect | kc |
| Kafka 커넥터 | kafkaconnector | kctr |
| Kafka 미러 메이커 | kafkamirrormaker | kmm |
| Kafka 미러 메이커 2 | kafkamirrormaker2 | kmm2 |
| Kafka Bridge | kafkabridge | kb |
| Kafka 리밸런스 | kafkarebalance | kr |
1.1.2.1. 리소스 카테고리 링크 복사링크가 클립보드에 복사되었습니다!
사용자 정의 리소스의 카테고리는 oc 명령에서도 사용할 수 있습니다.
Apache Kafka 사용자 정의 리소스의 모든 Streams는 strimzi 카테고리에 속하므로 strimzi 를 사용하여 하나의 명령으로 Apache Kafka 리소스의 모든 Streams를 가져올 수 있습니다.
예를 들어 oc get strimzi 를 실행하면 지정된 네임스페이스에서 Apache Kafka 사용자 정의 리소스의 모든 Streams가 나열됩니다.
모든 사용자 정의 리소스 나열
oc get strimzi
NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS
kafka.kafka.strimzi.io/my-cluster 3 3
NAME PARTITIONS REPLICATION FACTOR
kafkatopic.kafka.strimzi.io/kafka-apps 3 3
NAME AUTHENTICATION AUTHORIZATION
kafkauser.kafka.strimzi.io/my-user tls simple
oc get strimzi -o name 명령은 모든 리소스 유형 및 리소스 이름을 반환합니다. -o name 옵션은 유형/이름 형식으로 출력을 가져옵니다.
모든 리소스 유형 및 이름 나열
oc get strimzi -o name
kafka.kafka.strimzi.io/my-cluster
kafkatopic.kafka.strimzi.io/kafka-apps
kafkauser.kafka.strimzi.io/my-user
이 strimzi 명령을 다른 명령과 결합할 수 있습니다. 예를 들어 oc delete 명령에 전달하여 단일 명령의 모든 리소스를 삭제할 수 있습니다.
모든 사용자 정의 리소스 삭제
oc delete $(oc get strimzi -o name)
kafka.kafka.strimzi.io "my-cluster" deleted
kafkatopic.kafka.strimzi.io "kafka-apps" deleted
kafkauser.kafka.strimzi.io "my-user" deleted
예를 들어 Apache Kafka 기능에 대해 새 Streams를 테스트할 때 단일 작업에서 모든 리소스를 삭제하는 것이 유용할 수 있습니다.
1.1.2.2. 하위 리소스의 상태 쿼리 링크 복사링크가 클립보드에 복사되었습니다!
-o 옵션으로 전달할 수 있는 다른 값이 있습니다. 예를 들어 -o yaml 을 사용하면 YAML 형식으로 출력을 얻을 수 있습니다. -o json 을 사용하면 JSON으로 반환됩니다.
oc get --help 에서 모든 옵션을 볼 수 있습니다.
가장 유용한 옵션 중 하나는 JSONPath 지원 이므로 JSONPath 표현식을 전달하여 Kubernetes API를 쿼리할 수 있습니다. JSONPath 표현식은 리소스의 특정 부분을 추출하거나 탐색할 수 있습니다.
예를 들어 JSONPath 표현식 {.status.listeners[?(@.name=="tls")].bootstrapServers} 를 사용하여 Kafka 사용자 정의 리소스의 상태에서 부트스트랩 주소를 가져와서 Kafka 클라이언트에서 사용할 수 있습니다.
여기에서 이 명령은 tls:이라는 리스너의 bootstrapServers 값을 검색합니다.
부트스트랩 주소 검색
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="tls")].bootstrapServers}{"\n"}'
my-cluster-kafka-bootstrap.myproject.svc:9093
이름 조건을 변경하면 다른 Kafka 리스너의 주소를 가져올 수도 있습니다.
jsonpath 를 사용하여 사용자 정의 리소스에서 다른 속성 또는 속성 그룹을 추출할 수 있습니다.
1.1.3. Apache Kafka 사용자 정의 리소스 상태 정보 스트림 링크 복사링크가 클립보드에 복사되었습니다!
상태 속성은 특정 사용자 정의 리소스에 대한 상태 정보를 제공합니다.
다음 표에는 상태 정보(배포 시) 및 상태 속성을 정의하는 스키마를 제공하는 사용자 지정 리소스가 나열되어 있습니다.
스키마에 대한 자세한 내용은 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.
| Apache Kafka 리소스의 스트림 | 스키마 참조 | …에 상태 정보를 게시합니다. |
|---|---|---|
|
|
| Kafka 클러스터, 리스너 및 노드 풀 |
|
|
| 노드 풀, 해당 역할 및 관련 Kafka 클러스터의 노드 |
|
|
| Kafka 클러스터의 Kafka 주제 |
|
|
| Kafka 클러스터의 Kafka 사용자 |
|
|
| Kafka Connect 클러스터 및 커넥터 플러그인 |
|
|
|
|
|
|
| Kafka MirrorMaker 2 클러스터 및 내부 커넥터 |
|
|
| Kafka MirrorMaker 클러스터 |
|
|
| Apache Kafka 브리지용 스트림 |
|
|
| 리밸런스의 상태 및 결과 |
|
|
| 현재 버전 및 준비 상태의 Pod 수 |
리소스의 status 속성은 리소스 상태에 대한 정보를 제공합니다. status.conditions 및 status.observedGeneration 속성은 모든 리소스에 공통입니다.
status.conditions-
상태 조건은 리소스의 현재 상태를 설명합니다. 상태 조건 속성은
사양에지정된 구성에 정의된 대로 원하는 상태를 달성하는 리소스와 관련된 진행 상황을 추적하는 데 유용합니다. 상태 조건 속성은 리소스 상태가 변경된 시간 및 이유와 Operator가 원하는 상태를 실현하지 못하도록 하는 이벤트 세부 정보를 제공합니다. status.observedGeneration-
마지막으로 관찰된 생성은 Cluster Operator의 리소스의 최신 조정을 나타냅니다.
observedGeneration의 값이metadata.generation(현재 배포 버전) 값과 다른 경우 Operator에서 리소스에 대한 최신 업데이트를 아직 처리하지 않았습니다. 이러한 값이 동일한 경우 상태 정보는 리소스에 대한 최신 변경 사항을 반영합니다.
상태 속성은 리소스 관련 정보도 제공합니다. 예를 들어 KafkaStatus 는 리스너 주소 및 Kafka 클러스터의 ID에 대한 정보를 제공합니다.
KafkaStatus 는 사용 중인 Apache Kafka 버전의 Kafka 및 Streams에 대한 정보도 제공합니다. operatorLastSuccessfulVersion 및 kafkaVersion 의 값을 확인하여 Apache Kafka 또는 Kafka의 스트림 업그레이드가 완료되었는지 확인할 수 있습니다.
Apache Kafka의 스트림은 사용자 지정 리소스의 상태를 생성 및 유지 관리하고, 사용자 정의 리소스의 현재 상태를 주기적으로 평가하고 그에 따라 상태를 업데이트합니다. oc edit 를 사용하여 사용자 정의 리소스에서 업데이트를 수행할 때 (예: 해당 상태 ) 편집할 수 없습니다. 또한 상태를 변경하면 Kafka 클러스터 구성에 영향을 미치지 않습니다.
여기에서 Kafka 사용자 정의 리소스의 상태 속성이 표시됩니다.
Kafka 사용자 정의 리소스 상태
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
spec:
# ...
status:
clusterId: XP9FP2P-RByvEy0W4cOEUA
conditions:
- lastTransitionTime: '2023-01-20T17:56:29.396588Z'
status: 'True'
type: Ready
kafkaMetadataState: KRaft
kafkaVersion: 3.7.0
kafkaNodePools:
- name: broker
- name: controller
listeners:
- addresses:
- host: my-cluster-kafka-bootstrap.prm-project.svc
port: 9092
bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9092'
name: plain
- addresses:
- host: my-cluster-kafka-bootstrap.prm-project.svc
port: 9093
bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9093'
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: tls
- addresses:
- host: >-
2054284155.us-east-2.elb.amazonaws.com
port: 9095
bootstrapServers: >-
2054284155.us-east-2.elb.amazonaws.com:9095
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: external3
- addresses:
- host: ip-10-0-172-202.us-east-2.compute.internal
port: 31644
bootstrapServers: 'ip-10-0-172-202.us-east-2.compute.internal:31644'
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: external4
observedGeneration: 3
operatorLastSuccessfulVersion: 2.7
- 1
- Kafka 클러스터 ID입니다.
- 2
- 상태
조건은Kafka 클러스터의 현재 상태를 설명합니다. - 3
Ready조건은 Cluster Operator가 트래픽을 처리할 수 있는 Kafka 클러스터를 간주함을 나타냅니다.- 4
- Kafka 메타데이터 및 조정 작업을 관리하는 데 사용되는 메커니즘(KRaft 또는 Zoo Cryostat)을 표시하는 Kafka 메타데이터 상태입니다.
- 5
- Kafka 클러스터에서 사용하는 Kafka 버전입니다.
- 6
- Kafka 클러스터에 속하는 노드 풀입니다.
- 7
리스너는 유형별로 Kafka 부트스트랩 주소를 설명합니다.- 8
observedGeneration값은 Cluster Operator의Kafka사용자 정의 리소스의 마지막 조정을 나타냅니다.- 9
- 마지막 조정을 성공적으로 완료한 Operator의 버전입니다.
상태에 나열된 Kafka 부트스트랩 주소는 해당 끝점 또는 Kafka 클러스터가 Ready 상태에 있음을 표시하지 않습니다.
1.1.4. 사용자 정의 리소스의 상태 찾기 링크 복사링크가 클립보드에 복사되었습니다!
oc 를 사용자 정의 리소스의 status 하위 리소스와 함께 사용하여 리소스에 대한 정보를 검색합니다.
사전 요구 사항
- OpenShift 클러스터입니다.
- Cluster Operator가 실행 중입니다.
프로세스
사용자 정의 리소스를 지정하고
-o jsonpath옵션을 사용하여 표준 JSONPath 표현식을 적용하여status속성을 선택합니다.oc get kafka <kafka_resource_name> -o jsonpath='{.status}' | jq이 표현식은 지정된 사용자 정의 리소스에 대한 모든 상태 정보를 반환합니다.
status.listeners또는status.observedGeneration과 같은 점 표기법을 사용하여 표시하려는 상태 정보를 미세 조정할 수 있습니다.jq명령줄 JSON 구문 분석 툴 을 사용하면 출력을 더 쉽게 읽을 수 있습니다.
1.2. Apache Kafka Operator용 스트림 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka Operator용 스트림은 OpenShift에서 Kafka를 효과적으로 관리하기 위해 전문 운영 지식을 갖추고 있습니다. 각 Operator는 고유한 기능을 수행합니다.
- Cluster Operator
- Cluster Operator는 OpenShift에서 Apache Kafka 클러스터의 배포 및 관리를 처리합니다. Kafka 브로커 및 기타 Kafka 구성 요소 및 리소스의 설정을 자동화합니다.
- 주제 Operator
- Topic Operator는 Kafka 클러스터 내의 주제 생성, 구성 및 삭제를 관리합니다.
- 사용자 Operator
- User Operator는 Kafka 브로커에 액세스해야 하는 Kafka 사용자를 관리합니다.
Apache Kafka용 Streams를 배포할 때 먼저 Cluster Operator를 배포합니다. 그런 다음 Cluster Operator가 Kafka 배포를 처리할 준비가 되었습니다. Cluster Operator(권장) 또는 독립 실행형 Operator를 사용하여 Topic Operator 및 User Operator를 배포할 수도 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터와 함께 독립 실행형 Operator를 사용합니다.
Topic Operator 및 User Operator는 Entity Operator의 일부입니다. Cluster Operator는 Entity Operator 구성에 따라 Operator를 하나 또는 둘 다 배포할 수 있습니다.
독립 실행형 Operator를 배포하려면 Kafka 클러스터에 연결할 환경 변수를 설정해야 합니다. Cluster Operator에 의해 설정되므로 Operator를 배포하는 경우 이러한 환경 변수를 설정할 필요가 없습니다.
1.2.1. OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 스트림 감시 링크 복사링크가 클립보드에 복사되었습니다!
Operator는 OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 Streams를 감시하고 관리합니다. Cluster Operator는 OpenShift 클러스터의 단일 네임스페이스, 여러 네임스페이스 또는 모든 네임스페이스를 조사할 수 있습니다. Topic Operator 및 User Operator는 단일 네임스페이스를 조사할 수 있습니다.
-
Cluster Operator에서
Kafka리소스 감시 -
Topic Operator는
KafkaTopic리소스 감시 -
User Operator는
KafkaUser리소스 감시
Topic Operator 및 User Operator는 네임스페이스에서 단일 Kafka 클러스터만 조사할 수 있습니다. 또한 단일 Kafka 클러스터에만 연결할 수 있습니다.
여러 Topic Operator가 동일한 네임스페이스를 조사하는 경우 이름 충돌 및 주제 삭제가 발생할 수 있습니다. 이는 각 Kafka 클러스터에서 이름이 동일한 Kafka 주제(예: __consumer_offsets)를 사용하기 때문입니다. 하나의 Topic Operator만 지정된 네임스페이스를 감시하는지 확인합니다.
단일 네임스페이스가 있는 여러 User Operator를 사용하는 경우 지정된 사용자 이름이 있는 사용자가 두 개 이상의 Kafka 클러스터에 존재할 수 있습니다.
Cluster Operator를 사용하여 Topic Operator 및 User Operator를 배포하는 경우 기본적으로 Cluster Operator에서 배포한 Kafka 클러스터를 확인합니다. Operator 구성에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다.
각 Operator의 독립 실행형 배포의 경우 구성에서 조사할 Kafka 클러스터에 대한 네임스페이스 및 연결을 지정합니다.
1.2.2. RBAC 리소스 관리 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 OpenShift 리소스에 액세스해야 하는 Apache Kafka 구성 요소용 Streams에 대한 RBAC(역할 기반 액세스 제어) 리소스를 생성하고 관리합니다.
Cluster Operator가 작동하려면 Kafka 및 KafkaConnect 와 같은 Kafka 리소스와 상호 작용하기 위해 ConfigMap,Pod,Deployment, Service 와 같은 관리형 리소스와 상호 작용하려면 OpenShift 클러스터 내에서 권한이 필요합니다.
권한은 다음 OpenShift RBAC 리소스를 통해 지정됩니다.
-
ServiceAccount -
Role및ClusterRole -
RoleBinding및ClusterRoleBinding
1.2.2.1. Apache Kafka 구성 요소에 대한 Streams에 권한 위임 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 strimzi-cluster-operator 라는 서비스 계정에서 실행됩니다. Apache Kafka 구성 요소에 대한 Streams에 대한 RBAC 리소스를 생성할 수 있는 권한을 부여하는 클러스터 역할이 할당됩니다. 역할 바인딩은 클러스터 역할을 서비스 계정과 연결합니다.
OpenShift는 하나의 ServiceAccount 에서 작동하는 구성 요소가 ServiceAccount 에 없는 다른 ServiceAccount 권한을 부여하지 못하도록 합니다. Cluster Operator는 관리하는 리소스에 필요한 RoleBinding 및 ClusterRoleBinding RBAC 리소스를 생성하므로 동일한 권한을 부여하는 역할이 필요합니다.
다음 섹션에서는 Cluster Operator에 필요한 RBAC 리소스에 대해 설명합니다.
1.2.2.2. ClusterRole 리소스 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 ClusterRole 리소스를 사용하여 리소스에 필요한 액세스 권한을 제공합니다. OpenShift 클러스터 설정에 따라 클러스터 관리자가 클러스터 역할을 생성해야 할 수 있습니다.
클러스터 관리자 권한은 ClusterRole 리소스 생성에만 필요합니다. Cluster Operator는 클러스터 관리자 계정에서 실행되지 않습니다.
RBAC 리소스는 최소 권한 원칙을 따르고 Kafka 구성 요소의 클러스터를 작동하는 데 Cluster Operator에 필요한 권한만 포함합니다.
권한을 위임하려면 모든 클러스터 역할이 Cluster Operator에 필요합니다.
| 이름 | 설명 |
|---|---|
|
| 피연산자를 배포 및 관리하기 위해 Cluster Operator에서 사용하는 네임스페이스 범위 리소스에 대한 액세스 권한입니다. |
|
| 피연산자를 배포 및 관리하기 위해 Cluster Operator에서 사용하는 클러스터 범위 리소스에 대한 액세스 권한. |
|
| 리더 선택을 위해 Cluster Operator가 사용하는 액세스 권한 |
|
| Cluster Operator가 Apache Kafka 사용자 정의 리소스에 대한 Streams를 감시하고 관리하는 데 사용하는 액세스 권한. |
|
| 랙 인식이 사용되는 경우 Kafka 브로커가 OpenShift 작업자 노드에서 토폴로지 레이블을 가져올 수 있도록 허용하는 액세스 권한입니다. |
|
| Kafka 사용자 및 주제를 관리하기 위해 Topic 및 User Operators에서 사용하는 권한에 액세스합니다. |
|
| 랙 인식이 사용될 때 Kafka Connect,MirrorMaker(1 및 2) 및 Kafka Bridge를 허용하여 OpenShift 작업자 노드에서 토폴로지 레이블을 가져올 수 있는 액세스 권한입니다. |
1.2.2.3. ClusterRoleBinding 리소스 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 ClusterRoleBinding 및 RoleBinding 리소스를 사용하여 ClusterRole 을 ServiceAccount 와 연결합니다. 클러스터 역할 바인딩은 클러스터 범위 리소스가 포함된 클러스터 역할에 필요합니다.
| 이름 | 설명 |
|---|---|
|
|
|
|
|
Cluster Operator에 |
|
|
|
| 이름 | 설명 |
|---|---|
|
|
|
|
|
Cluster Operator에 |
|
|
|
|
|
Cluster Operator에 |
1.2.2.4. ServiceAccount 리소스 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 strimzi-cluster-operator ServiceAccount 를 사용하여 실행됩니다. 이 서비스 계정은 피연산자를 관리하는 데 필요한 권한을 부여합니다. Cluster Operator는 추가 ClusterRoleBinding 및 RoleBinding 리소스를 생성하여 이러한 RBAC 권한 중 일부를 피연산자에 위임합니다.
각 피연산자는 Cluster Operator가 생성한 자체 서비스 계정을 사용합니다. 이를 통해 Cluster Operator는 최소 권한 원칙을 따르고 피연산자가 실제로 필요한 액세스 권한만 부여할 수 있습니다.
| 이름 | 사용자 |
|---|---|
|
| Zookeeper Pod |
|
| Kafka 브로커 Pod |
|
| Entity Operator |
|
| cruise Control Pod |
|
| Kafka Exporter Pod |
|
| Kafka Connect Pod |
|
| MirrorMaker Pod |
|
| MirrorMaker 2 Pod |
|
| Kafka 브리지 Pod |
1.2.3. Pod 리소스 관리 링크 복사링크가 클립보드에 복사되었습니다!
StrimziPodSet 사용자 정의 리소스는 Streams for Apache Kafka에서 Kafka, Kafka Connect 및 MirrorMaker 2 Pod를 생성하고 관리하는 데 사용됩니다. Zoo Cryostat를 사용하는 경우, Zoo Cryostat Pod도 StrimziPodSet 리소스를 사용하여 생성 및 관리됩니다.
StrimziPodSet 리소스를 생성, 업데이트 또는 삭제할 수 없습니다. StrimziPodSet 사용자 정의 리소스는 내부적으로 사용되며 리소스는 Cluster Operator에 의해서만 관리됩니다. 결과적으로 Pod를 시작하지 않고 Kafka 클러스터를 사용할 수 없는 가능성을 방지하려면 Cluster Operator가 제대로 실행되고 있어야 합니다.
OpenShift 배포 리소스는 Kafka Bridge, Kafka Exporter, Cruise Control, (precated) MirrorMaker 1, User Operator 및 Topic Operator의 Pod를 생성하고 관리하는 데 사용됩니다.
1.3. Kafka 브리지를 사용하여 Kafka 클러스터 연결 링크 복사링크가 클립보드에 복사되었습니다!
Streams for Apache Kafka Bridge API를 사용하여 소비자를 생성 및 관리하고 기본 Kafka 프로토콜 대신 HTTP를 통해 레코드를 보내고 받을 수 있습니다.
Kafka 브리지를 설정하면 Kafka 클러스터에 대한 HTTP 액세스를 구성합니다. 그런 다음 Kafka Bridge를 사용하여 클러스터에서 메시지를 생성 및 사용하고 REST 인터페이스를 통해 다른 작업을 수행할 수 있습니다.
1.4. Seamless FIPS 지원 링크 복사링크가 클립보드에 복사되었습니다!
연방 정보 처리 표준(FIPS)은 컴퓨터 보안 및 상호 운용성을 위한 표준입니다. FIPS 지원 OpenShift 클러스터에서 Apache Kafka용 Streams를 실행하면 Apache Kafka 컨테이너 이미지의 Streams에 사용된 OpenJDK가 FIPS 모드로 자동 전환됩니다. 버전 2.3에서 Apache Kafka용 Streams는 변경 또는 특수 구성 없이 FIPS 지원 OpenShift 클러스터에서 실행할 수 있습니다. OpenJDK의 FIPS 호환 보안 라이브러리만 사용합니다.
FIPS 지원 OpenShift 클러스터를 사용하는 경우 일반 OpenShift 클러스터에 비해 메모리 사용량이 증가할 수 있습니다. 문제가 발생하지 않도록 하려면 메모리 요청을 512Mi 이상으로 늘리는 것이 좋습니다.
NIST 검증 프로그램 및 검증된 모듈에 대한 자세한 내용은 NIST 웹 사이트의 암호화 모듈 유효성 검사 프로그램을 참조하십시오.
Apache Kafka Proxy 및 Apache Kafka Console용 Streams의 기술 프리뷰와의 호환성은 FIPS 지원과 관련하여 테스트되지 않았습니다. 제대로 작동할 것으로 예상되지만 현재 완전 지원을 보장할 수는 없습니다.
1.4.1. 최소 암호 길이 링크 복사링크가 클립보드에 복사되었습니다!
FIPS 모드에서 실행하는 경우 SCRAM-SHA-512 암호는 32자 이상이어야 합니다. Streams for Apache Kafka 2.3에서 Apache Kafka User Operator의 Streams의 기본 암호 길이도 32자로 설정됩니다. 암호 길이 32자 미만의 사용자 지정 구성이 있는 Kafka 클러스터가 있는 경우 구성을 업데이트해야 합니다. 암호가 32자보다 짧은 사용자가 있는 경우 필요한 길이로 암호를 다시 생성해야 합니다. 예를 들어 사용자 시크릿을 삭제하고 User Operator가 적절한 길이로 새 암호를 생성할 때까지 기다린 후 이를 수행할 수 있습니다.
1.5. 문서 포함 링크 복사링크가 클립보드에 복사되었습니다!
user-replaced 값
교체 가능 값이라고도 하는 사용자 교체 값은 굵은 대괄호(< >)로 표시됩니다. 밑줄( _)은 다중 단어 값에 사용됩니다. 값이 코드 또는 명령을 참조하는 경우 monospace 도 사용됩니다.
예를 들어 다음 코드는 < my_namespace >가 올바른 네임스페이스 이름으로 교체해야 한다는 것을 보여줍니다.
sed -i 's/namespace: .*/namespace: <my_namespace>/' install/cluster-operator/*RoleBinding*.yaml
2장. Apache Kafka 설치 방법용 스트림 링크 복사링크가 클립보드에 복사되었습니다!
다음 두 가지 방법으로 OpenShift 4.12에 Apache Kafka용 Streams를 4.15로 설치할 수 있습니다.
| 설치 방법 | 설명 |
|---|---|
|
Apache Kafka용 Red Hat Streams 2.7 OpenShift 설치 및 예제 파일을 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 다운로드합니다.
| |
| OperatorHub에서 Streams for Apache Kafka 를 사용하여 단일 네임스페이스 또는 모든 네임스페이스에 Streams for Apache Kafka를 배포합니다. |
가장 큰 유연성을 위해 설치 아티팩트 방법을 선택합니다. OperatorHub 방법은 표준 구성을 제공하고 자동 업데이트를 활용할 수 있습니다.
Helm을 사용하여 Apache Kafka용 스트림 설치는 지원되지 않습니다.
3장. Apache Kafka용 Streams와 함께 배포됨 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 구성 요소는 Apache Kafka 배포를 위한 Streams를 사용하여 OpenShift에 배포하기 위해 제공됩니다. Kafka 구성 요소는 일반적으로 가용성을 위해 클러스터로 실행됩니다.
Kafka 구성 요소를 통합하는 일반적인 배포에는 다음이 포함될 수 있습니다.
- 브로커 노드의 Kafka 클러스터
- 복제된 Zoo Cryostat 인스턴스의 Zookeeper 클러스터
- 외부 데이터 연결을 위한 Kafka Connect 클러스터
- 보조 클러스터에서 Kafka 클러스터를 미러링하는 Kafka 미러 메이커 클러스터
- 모니터링을 위한 추가 Kafka 메트릭 데이터를 추출하는 Kafka Exporter
- Kafka 클러스터에 HTTP 기반 요청을 만드는 Kafka 브리지
- cruise Control 을 통해 브로커 노드 간에 주제 파티션을 재조정
이러한 구성 요소는 모두 필수는 아니지만 Kafka 및 Zoo Cryostat가 필요합니다. 일부 구성 요소는 MirrorMaker 또는 Kafka Connect와 같은 Kafka 없이 배포할 수 있습니다.
3.1. 배포 순서 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 클러스터에 필요한 배포 순서는 다음과 같습니다.
- Kafka 클러스터를 관리하기 위해 Cluster Operator 배포
- Zoo Cryostat 클러스터를 사용하여 Kafka 클러스터를 배포하고 배포에 Topic Operator 및 User Operator를 포함합니다.
필요한 경우 배포:
- Kafka 클러스터에 배포하지 않은 경우 Topic Operator 및 User Operator 독립 실행형
- Kafka Connect
- Kafka MirrorMaker
- Kafka Bridge
- 메트릭 모니터링을 위한 구성 요소
Cluster Operator는 Deployment,Service 및 Pod 리소스와 같은 구성 요소에 대한 OpenShift 리소스를 생성합니다. OpenShift 리소스의 이름은 배포 시 구성 요소에 지정된 이름이 추가됩니다. 예를 들어 my-kafka-cluster 라는 Kafka 클러스터에는 my-kafka-cluster-kafka 라는 서비스가 있습니다.
3.2. (Preview) Apache Kafka 프록시용 스트림 배포 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 프록시용 스트림은 Kafka 기반 시스템을 개선하도록 설계된 Apache Kafka 프로토콜 인식 프록시입니다. 필터 메커니즘을 통해 애플리케이션 또는 Kafka 클러스터 자체를 변경할 필요 없이 Kafka 기반 시스템에 추가 동작을 도입할 수 있습니다.
Apache Kafka 프록시용 Streams에 연결하고 사용하는 방법에 대한 자세한 내용은 Apache Kafka 용 Streams 설명서의 프록시 가이드를 참조하십시오.
Apache Kafka Proxy용 Streams는 현재 기술 프리뷰로 사용할 수 있습니다.
3.3. (Preview) Apache Kafka 콘솔용 스트림 배포 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams에서 관리하는 Kafka 클러스터를 배포한 후 Apache Kafka Console용 Streams를 배포하고 클러스터를 연결할 수 있습니다. Apache Kafka 콘솔의 Streams for Apache Kafka Console을 사용하면 Kafka 클러스터 관리를 용이하게 하여 사용자 인터페이스에서 각 클러스터를 모니터링, 관리 및 최적화할 수 있습니다.
Apache Kafka Console용 Streams에 연결하고 사용하는 방법에 대한 자세한 내용은 Apache Kafka 용 스트림 설명서의 콘솔 가이드를 참조하십시오.
Apache Kafka Console의 Streams는 현재 기술 프리뷰로 사용할 수 있습니다.
4장. Apache Kafka 배포를 위한 스트림 준비 링크 복사링크가 클립보드에 복사되었습니다!
필요한 사전 배포 작업을 완료하여 Apache Kafka용 Streams 배포를 준비합니다. 다음과 같은 특정 요구 사항에 따라 필요한 준비 단계를 수행합니다.
이 가이드에서 명령을 실행하려면 클러스터 사용자에게 RBAC(역할 기반 액세스 제어) 및 CRD를 관리할 수 있는 권한이 있어야 합니다.
4.1. 배포 사전 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams를 배포하려면 다음이 필요합니다.
OpenShift 4.12에서 4.15 클러스터입니다.
Apache Kafka의 스트림은 Strimzi 0.40.x를 기반으로 합니다.
-
실행 중인 클러스터에 연결하도록
oc명령줄 툴이 설치 및 구성되어 있습니다.
4.2. Operator 배포 모범 사례 링크 복사링크가 클립보드에 복사되었습니다!
특히 다른 버전을 사용하는 경우 동일한 OpenShift 클러스터에 Apache Kafka Operator에 대해 두 개 이상의 Streams를 설치하면 잠재적인 문제가 발생할 수 있습니다. 각 Streams for Apache Kafka Operator는 OpenShift 클러스터에서 리소스 세트를 관리합니다. Apache Kafka Operator용 Streams를 여러 개 설치할 때 동일한 리소스를 동시에 관리하려고 할 수 있습니다. 이로 인해 클러스터 내에서 충돌과 예기치 않은 동작이 발생할 수 있습니다. 동일한 OpenShift 클러스터 내의 다른 네임스페이스에 Apache Kafka Operator용 Streams를 배포하는 경우에도 충돌이 계속 발생할 수 있습니다. 네임스페이스는 어느 정도의 리소스 격리를 제공하지만, Streams for Apache Kafka Operator에서 관리하는 특정 리소스(예: CRD(Custom Resource Definitions) 및 역할)에는 클러스터 전체 범위가 있습니다.
또한 다른 버전으로 여러 Operator를 설치하면 관리하는 Operator와 Kafka 클러스터 간에 호환성 문제가 발생할 수 있습니다. Apache Kafka Operator용 Streams의 다른 버전에서는 이전 버전과 호환되지 않는 변경, 버그 수정 또는 개선 사항이 발생할 수 있습니다.
OpenShift 클러스터에서 Apache Kafka Operator에 대한 여러 Streams 설치와 관련된 문제를 방지하려면 다음 지침을 사용하는 것이 좋습니다.
- 리소스 및 구성을 명확히 분리하기 위해 Kafka 클러스터 및 관리하는 기타 Kafka 구성 요소와 별도의 네임스페이스에 Apache Kafka Operator를 설치합니다.
- 단일 Streams for Apache Kafka Operator를 사용하여 OpenShift 클러스터 내의 모든 Kafka 인스턴스를 관리합니다.
- 최신 기능 및 개선 사항을 반영하도록 Apache Kafka Operator 및 지원되는 Kafka 버전을 가능한 한 자주 업데이트합니다.
이러한 모범 사례를 따르고 Apache Kafka Operator의 단일 Streams에 대한 일관된 업데이트를 보장하면 OpenShift 클러스터에서 Kafka 인스턴스 관리의 안정성을 향상시킬 수 있습니다. 이 방법을 사용하면 Apache Kafka의 최신 기능 및 기능에 대한 Streams를 최대한 활용할 수 있습니다.
Apache Kafka용 Streams는 Strimzi를 기반으로 하므로 OpenShift 클러스터에서 Apache Kafka Operator의 Streams를 Strimzi Operator와 결합할 때 동일한 문제가 발생할 수 있습니다.
4.3. Apache Kafka 릴리스 아티팩트용 스트림 다운로드 링크 복사링크가 클립보드에 복사되었습니다!
배포 파일을 사용하여 Apache Kafka용 Streams를 설치하려면 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 파일을 다운로드 하여 추출합니다.
Apache Kafka 릴리스 아티팩트의 스트림에는 Apache Kafka의 스트림 구성 요소를 OpenShift에 배포하고, 일반적인 작업을 수행하고 Kafka 클러스터를 구성하는 데 도움이 되는 샘플 YAML 파일이 포함되어 있습니다.
oc 를 사용하여 다운로드한 ZIP 파일의 install/cluster-operator 폴더에서 Cluster Operator를 배포합니다. Cluster Operator 배포 및 구성에 대한 자세한 내용은 6.2절. “Cluster Operator 배포” 을 참조하십시오.
또한 Apache Kafka Cluster Operator의 Streams에서 관리하지 않는 Kafka 클러스터와 함께 Topic 및 User Operator의 독립형 설치를 사용하려면 install/topic-operator 에서 배포하고 install/user-operator 폴더에서 배포할 수 있습니다.
Apache Kafka 컨테이너 이미지의 스트림은 Red Hat Ecosystem Catalog 를 통해 사용할 수도 있습니다. 그러나 제공된 YAML 파일을 사용하여 Apache Kafka용 Streams를 배포하는 것이 좋습니다.
4.4. 컨테이너 이미지를 자체 레지스트리로 푸시 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 스트림 컨테이너 이미지는 Red Hat Ecosystem Catalog 에서 사용할 수 있습니다. Apache Kafka용 Streams에서 제공하는 설치 YAML 파일은 Red Hat Ecosystem Catalog 에서 직접 이미지를 가져옵니다.
Red Hat Ecosystem Catalog 에 액세스할 수 없거나 자체 컨테이너 리포지토리를 사용하려면 다음을 수행하십시오.
- 여기에 나열된 모든 컨테이너 이미지를 가져옵니다.
- 자체 레지스트리로 푸시
- 설치 YAML 파일에서 이미지 이름을 업데이트
릴리스에 지원되는 각 Kafka 버전에는 별도의 이미지가 있습니다.
| 컨테이너 이미지 | namespace/Repository | 설명 |
|---|---|---|
| Kafka |
| Kafka 실행을 위한 Apache Kafka 이미지 스트림(예:
|
| Operator |
| Operator를 실행하기 위한 Apache Kafka 이미지 스트림
|
| Kafka Bridge |
| Apache Kafka 브리지용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림 |
| Apache Kafka Drain cleaner 스트림 |
| Apache Kafka Drain cleaner용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림 |
| Apache Kafka 프록시용 스트림 |
| Apache Kafka 프록시용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림 |
| Apache Kafka 콘솔 스트림 |
| Apache Kafka 콘솔용 Streams를 실행하기 위한 Apache Kafka 이미지 스트림 |
4.5. 컨테이너 이미지 레지스트리에 대한 인증을 위한 풀 시크릿 생성 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams에서 제공하는 설치 YAML 파일은 Red Hat Ecosystem Catalog 에서 직접 컨테이너 이미지를 가져옵니다. Apache Kafka 배포의 Streams에 인증이 필요한 경우 시크릿에 인증 자격 증명을 구성하고 설치 YAML에 추가합니다.
인증은 일반적으로 필요하지 않지만 특정 플랫폼에서 요청할 수 있습니다.
사전 요구 사항
- Red Hat 사용자 이름과 암호 또는 Red Hat 레지스트리 서비스 계정의 로그인 정보가 필요합니다.
Red Hat 서브스크립션을 사용하여 Red Hat 고객 포털에서 레지스트리 서비스 계정을 생성할 수 있습니다.
프로세스
로그인 세부 정보와 Apache Kafka 이미지의 Streams를 가져오는 컨테이너 레지스트리가 포함된 풀 시크릿을 생성합니다.
oc create secret docker-registry <pull_secret_name> \ --docker-server=registry.redhat.io \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>사용자 이름과 암호를 추가합니다. 이메일 주소는 선택 사항입니다.
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml배포 파일을 편집하여STRIMZI_IMAGE_PULL_SECRETS환경 변수를 사용하여 풀 시크릿을 지정합니다.apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: - name: STRIMZI_IMAGE_PULL_SECRETS value: "<pull_secret_name>" # ...시크릿은 Cluster Operator가 생성한 모든 Pod에 적용됩니다.
4.6. Apache Kafka 관리자용 Streams 지정 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 배포 구성에 대한 사용자 지정 리소스를 제공합니다. 기본적으로 이러한 리소스를 확인, 생성, 편집 및 삭제할 수 있는 권한은 OpenShift 클러스터 관리자로 제한됩니다. Apache Kafka의 스트림은 이러한 권한을 다른 사용자에게 할당하는 데 사용할 수 있는 두 가지 클러스터 역할을 제공합니다.
-
Strimzi-view를 사용하면 Apache Kafka 리소스의 Streams를 보고 나열할 수 있습니다. -
Strimzi-admin을 사용하면 Apache Kafka 리소스의 Streams를 생성, 편집 또는 삭제할 수도 있습니다.
이러한 역할을 설치하면 기본 OpenShift 클러스터 역할에 이러한 권한을 자동으로 집계(추가)합니다. Strimzi-view 는 view 역할에 집계되고 strimzi-admin 집계는 edit 및 admin 역할에 집계됩니다. 집계로 인해 이미 유사한 권한이 있는 사용자에게 이러한 역할을 할당할 필요가 없습니다.
다음 절차에서는 비 클러스터 관리자가 Apache Kafka 리소스의 Streams를 관리할 수 있는 strimzi-admin 역할을 할당하는 방법을 보여줍니다.
시스템 관리자는 Cluster Operator를 배포한 후 Apache Kafka 관리자용 Streams를 지정할 수 있습니다.
사전 요구 사항
- CRD를 관리하기 위해 Apache Kafka CRD(Custom Resource Definitions) 및 RBAC(역할 기반 액세스 제어) 리소스의 Streams가 Cluster Operator와 함께 배포 되었습니다.
프로세스
OpenShift에서
strimzi-view및strimzi-admin클러스터 역할을 만듭니다.oc create -f install/strimzi-admin필요한 경우 액세스 권한이 필요한 사용자에게 액세스 권한을 제공하는 역할을 할당합니다.
oc create clusterrolebinding strimzi-admin --clusterrole=strimzi-admin --user=user1 --user=user2
5장. 웹 콘솔을 사용하여 OperatorHub에서 Apache Kafka용 스트림 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔의 OperatorHub에서 Streams for Apache Kafka Operator를 설치합니다.
이 섹션의 절차에서는 다음을 수행하는 방법을 보여줍니다.
5.1. OperatorHub에서 Apache Kafka Operator용 Streams 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔에서 OperatorHub를 사용하여 Apache Kafka Operator의 Streams를 설치하고 구독할 수 있습니다.
다음 절차에서는 프로젝트를 생성하고 Apache Kafka Operator의 Streams를 해당 프로젝트에 설치하는 방법을 설명합니다. 프로젝트는 네임스페이스를 나타냅니다. 관리를 위해 네임스페이스를 사용하여 함수를 분리하는 것이 좋습니다.
적절한 업데이트 채널을 사용해야 합니다. 지원되는 OpenShift 버전에 있는 경우 기본 stable 채널에서 Apache Kafka용 Streams를 설치하는 것이 일반적으로 안전합니다. 그러나 stable 채널에서 자동 업데이트를 활성화하지 않는 것이 좋습니다. 자동 업그레이드는 업그레이드하기 전에 필요한 단계를 건너뜁니다. 버전별 채널에서만 자동 업그레이드를 사용합니다.
사전 요구 사항
-
cluster-admin또는strimzi-admin권한이 있는 계정을 사용하여 OpenShift Container Platform 웹 콘솔에 액세스합니다.
프로세스
OpenShift 웹 콘솔에서 홈 > 프로젝트 페이지로 이동하여 설치를 위한 프로젝트(네임스페이스)를 생성합니다.
이 예제에서는
amq-streams-kafka라는 프로젝트를 사용합니다.- Operators > OperatorHub 페이지로 이동합니다.
키워드로 필터링 상자에 키워드 를 스크롤하거나 입력하여 Apache Kafka Operator의 Streams를 찾습니다.
Operator는 Streaming & Messaging 카테고리에 있습니다.
- Apache Kafka용 Streams 를 클릭하여 Operator 정보를 표시합니다.
- Operator에 대한 정보를 읽고 설치를 클릭합니다.
Operator 설치 페이지에서 다음 설치 및 업데이트 옵션 중에서 선택합니다.
Update Channel: Operator의 업데이트 채널을 선택합니다.
- (기본값) stable 채널에는 메이저, 마이너 및 마이크로 릴리스를 포함한 모든 최신 업데이트 및 릴리스가 포함되어 있으며 이는 잘 테스트되고 안정적인 것으로 간주됩니다.
- amq-streams-X.x 채널에는 주요 릴리스의 마이너 및 마이크로 릴리스 업데이트가 포함되어 있습니다. 여기서 X 는 주요 릴리스 버전 번호입니다.
- amq-streams-X.Y.x 채널에는 마이너 릴리스의 마이크로 릴리스 업데이트가 포함되어 있습니다. 여기서 X 는 주요 릴리스 버전 번호이고 Y 는 마이너 릴리스 버전 번호입니다.
설치 모드: 생성한 프로젝트를 선택하여 특정 네임스페이스에 Operator를 설치합니다.
클러스터의 모든 네임스페이스(기본 옵션) 또는 특정 네임스페이스에 Apache Kafka Operator의 Streams를 설치할 수 있습니다. 특정 네임스페이스를 Kafka 클러스터 및 Apache Kafka 구성 요소의 다른 Streams에 전용으로 사용하는 것이 좋습니다.
- 업데이트 승인: 기본적으로 Apache Kafka Operator의 Streams는 OLM(Operator Lifecycle Manager)에 의해 Apache Kafka 버전의 최신 스트림으로 자동 업그레이드됩니다. 선택적으로 향후 업그레이드를 수동으로 승인하려면 Manual 을 선택합니다. Operator에 대한 자세한 내용은 OpenShift 설명서 를 참조하십시오.
설치를 클릭하여 선택한 네임스페이스에 Operator를 설치합니다.
Streams for Apache Kafka Operator는 선택한 네임스페이스에 Cluster Operator, CRD 및 역할 기반 액세스 제어(RBAC) 리소스를 배포합니다.
Operator를 사용할 준비가 되면 Operator > Installed Operators 로 이동하여 Operator가 선택한 네임스페이스에 설치되어 있는지 확인합니다.
상태가 성공으로 표시됩니다.
이제 Kafka 클러스터부터 Kafka 구성 요소를 배포하는 Apache Kafka Operator용 Streams를 사용할 수 있습니다.
워크로드 > Deployments로 이동하는 경우 Cluster Operator 및 Entity Operator에 대한 배포 세부 정보를 확인할 수 있습니다. Cluster Operator의 이름에는 amq-streams-cluster-operator-<version>이라는 버전 번호가 포함됩니다. 이 이름은 Apache Kafka 설치 아티팩트용 Streams를 사용하여 Cluster Operator를 배포할 때 다릅니다. 이 경우 이름은 strimzi-cluster-operator 입니다.
5.2. Apache Kafka Operator용 Streams를 사용하여 Kafka 구성 요소 배포 링크 복사링크가 클립보드에 복사되었습니다!
Openshift에 설치할 때 Apache Kafka Operator용 Streams를 사용하면 사용자 인터페이스에서 Kafka 구성 요소를 설치할 수 있습니다.
다음 Kafka 구성 요소를 설치할 수 있습니다.
- Kafka
- Kafka Connect
- Kafka MirrorMaker
- Kafka MirrorMaker 2
- Kafka Topic
- Kafka 사용자
- Kafka Bridge
- Kafka 커넥터
- Kafka 리밸런스
구성 요소를 선택하고 인스턴스를 생성합니다. 최소한 Kafka 인스턴스를 생성합니다. 다음 절차에서는 기본 설정을 사용하여 Kafka 인스턴스를 생성하는 방법을 설명합니다. 설치를 수행하기 전에 기본 설치 사양을 구성할 수 있습니다.
이 프로세스는 다른 Kafka 구성 요소의 인스턴스를 생성하는 것과 동일합니다.
사전 요구 사항
- Streams for Apache Kafka Operator 는 OpenShift 클러스터에 설치됩니다.
프로세스
웹 콘솔에서 Operator > Installed Operators 페이지로 이동하고 Apache Kafka의 Streams를 클릭하여 Operator 세부 정보를 표시합니다.
제공된 API 에서 Kafka 구성 요소의 인스턴스를 생성할 수 있습니다.
Kafka 아래에 인스턴스 생성 을 클릭하여 Kafka 인스턴스를 생성합니다.
기본적으로 3개의 Kafka 브로커 노드와 3개의 Zoo Cryostat 노드를 사용하여
my-cluster라는 Kafka 클러스터를 생성합니다. 클러스터는 임시 스토리지를 사용합니다.생성 을 클릭하여 Kafka 설치를 시작합니다.
상태가 Ready 로 변경될 때까지 기다립니다.
6장. 설치 아티팩트를 사용하여 Apache Kafka용 스트림 배포 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 용 Streams 배포를 위한 환경을 준비하면 Apache Kafka 용 Streams를 OpenShift 클러스터에 배포할 수 있습니다. 릴리스 아티팩트와 함께 제공되는 설치 파일을 사용합니다.
Apache Kafka의 스트림은 Strimzi 0.40.x를 기반으로 합니다. OpenShift 4.12에서 4.15로 Apache Kafka 2.7의 Streams를 배포할 수 있습니다.
설치 파일을 사용하여 Apache Kafka용 Streams를 배포하는 단계는 다음과 같습니다.
- Cluster Operator 배포
Cluster Operator를 사용하여 다음을 배포합니다.
필요한 경우 요구 사항에 따라 다음 Kafka 구성 요소를 배포합니다.
이 가이드에서 명령을 실행하려면 OpenShift 사용자에게 RBAC(역할 기반 액세스 제어) 및 CRD를 관리할 수 있는 권한이 있어야 합니다.
6.1. 기본 배포 경로 링크 복사링크가 클립보드에 복사되었습니다!
Streams for Apache Kafka가 동일한 네임스페이스에서 단일 Kafka 클러스터를 관리하는 배포를 설정할 수 있습니다. 이 구성을 개발 또는 테스트에 사용할 수 있습니다. 또는 프로덕션 환경에서 Apache Kafka용 Streams를 사용하여 다른 네임스페이스의 여러 Kafka 클러스터를 관리할 수 있습니다.
Apache Kafka용 Streams를 배포하는 첫 번째 단계는 install/cluster-operator 파일을 사용하여 Cluster Operator를 설치하는 것입니다.
단일 명령은 cluster-operator 폴더의 모든 설치 파일을 적용합니다. oc apply -f ./install/cluster-operator.
이 명령은 다음을 포함하여 Kafka 배포를 생성하고 관리하는 데 필요한 모든 것을 설정합니다.
-
Cluster Operator(
배포,ConfigMap) -
Apache Kafka CRD용 스트림 (
CustomResourceDefinition) -
RBAC 리소스(
ClusterRole,ClusterRoleBinding,RoleBinding) -
서비스 계정(
ServiceAccount)
기본 배포 경로는 다음과 같습니다.
- 릴리스 아티팩트 다운로드
- Cluster Operator를 배포할 OpenShift 네임스페이스를 생성합니다.
-
Cluster Operator용으로 생성된 네임스페이스를 사용하도록
install/cluster-operator파일을 업데이트 - Cluster Operator를 설치하여 하나, 여러 개 또는 모든 네임스페이스를 조사합니다.
-
Cluster Operator용으로 생성된 네임스페이스를 사용하도록
- Kafka 클러스터 생성
그러면 다른 Kafka 구성 요소를 배포하고 배포 모니터링을 설정할 수 있습니다.
6.2. Cluster Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 OpenShift 클러스터 내에서 Kafka 클러스터를 배포 및 관리합니다.
Cluster Operator가 실행되면 Kafka 리소스의 업데이트를 감시하기 시작합니다.
기본적으로 Cluster Operator의 단일 복제본이 배포됩니다. 리더 선택 항목이 있는 복제본을 추가하여 중단 시 추가 Cluster Operator가 대기 상태가 되도록 할 수 있습니다. 자세한 내용은 9.5.4절. “리더 선택으로 여러 Cluster Operator 복제본 실행”의 내용을 참조하십시오.
6.2.1. Cluster Operator에서 감시하는 네임스페이스 지정 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 Kafka 리소스가 배포된 네임스페이스의 업데이트를 감시합니다. Cluster Operator를 배포할 때 OpenShift 클러스터에서 조사할 네임스페이스를 지정합니다. 다음 네임스페이스를 지정할 수 있습니다.
- 선택한 단일 네임스페이스 (Cluster Operator를 포함하는 동일한 네임스페이스)
- 선택한 여러 네임스페이스
- 클러스터의 모든 네임스페이스
여러 선택한 네임스페이스를 조사하면 처리 오버헤드가 증가하여 성능에 가장 큰 영향을 미칩니다. 네임스페이스 모니터링에 대한 성능을 최적화하려면 일반적으로 단일 네임스페이스를 조사하거나 전체 클러스터를 모니터링하는 것이 좋습니다. 단일 네임스페이스를 모니터링하면 네임스페이스별 리소스를 집중적으로 모니터링할 수 있지만 모든 네임스페이스를 모니터링하면 모든 네임스페이스에서 클러스터의 리소스를 포괄적으로 볼 수 있습니다.
Cluster Operator는 다음 리소스의 변경 사항을 감시합니다.
-
Kafka클러스터용 Kafka입니다. -
Kafka Connect클러스터용 KafkaConnect입니다. -
Kafka Connect 클러스터에서 커넥터를 생성하고 관리하기 위한
KafkaConnector입니다. -
Kafka MirrorMaker인스턴스용 KafkaMirrorMaker. -
Kafka MirrorMaker 2인스턴스의 KafkaMirrorMaker2입니다. -
Kafka 브리지인스턴스용 KafkaBridge. -
Cruise Control 최적화 요청에 대한
KafkaRebalance.
OpenShift 클러스터에서 이러한 리소스 중 하나가 생성되면 Operator가 리소스에서 클러스터 설명을 가져오고 Deployments, Pods, Services 및 ConfigMaps와 같은 필요한 OpenShift 리소스를 생성하여 리소스에 대한 새 클러스터 생성을 시작합니다.
Kafka 리소스가 업데이트될 때마다 Operator는 리소스의 클러스터를 구성하는 OpenShift 리소스에서 해당 업데이트를 수행합니다.
리소스가 패치 또는 삭제된 다음 다시 생성되어 리소스의 클러스터를 클러스터의 원하는 상태를 반영하도록 합니다. 이 작업으로 인해 롤링 업데이트가 발생하여 서비스가 중단될 수 있습니다.
리소스가 삭제되면 Operator는 클러스터 배포를 취소하고 관련 OpenShift 리소스를 모두 삭제합니다.
Cluster Operator는 OpenShift 클러스터에서 하나, 여러 또는 모든 네임스페이스를 조사할 수 있지만 Topic Operator 및 User Operator는 단일 네임스페이스에서 KafkaTopic 및 KafkaUser 리소스를 조사합니다. 자세한 내용은 1.2.1절. “OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 스트림 감시”의 내용을 참조하십시오.
6.2.2. 단일 네임스페이스를 조사하기 위해 Cluster Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 클러스터의 단일 네임스페이스에서 Streams for Apache Kafka 리소스를 조사하기 위해 Cluster Operator를 배포하는 방법을 보여줍니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.
프로세스
Cluster Operator를 설치할 네임스페이스를 사용하도록 Apache Kafka 설치 파일의 Streams를 편집합니다.
예를 들어 이 절차에서는 Cluster Operator가 네임스페이스
my-cluster-operator-namespace에 설치됩니다.Linux에서 다음을 사용하십시오.
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlMacOS에서 다음을 사용하십시오.
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlCluster Operator를 배포합니다.
oc create -f install/cluster-operator -n my-cluster-operator-namespace배포 상태를 확인합니다.
oc get deployments -n my-cluster-operator-namespace출력에 배포 이름 및 준비 상태 표시
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1READY는 ready/expected 복제본 수를 표시합니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.2.3. 여러 네임스페이스를 조사하기 위해 Cluster Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 클러스터의 여러 네임스페이스에서 Apache Kafka 리소스의 스트림을 조사하기 위해 Cluster Operator를 배포하는 방법을 보여줍니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.
프로세스
Cluster Operator를 설치할 네임스페이스를 사용하도록 Apache Kafka 설치 파일의 Streams를 편집합니다.
예를 들어 이 절차에서는 Cluster Operator가 네임스페이스
my-cluster-operator-namespace에 설치됩니다.Linux에서 다음을 사용하십시오.
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlMacOS에서 다음을 사용하십시오.
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlinstall/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml파일을 편집하여 Cluster Operator가STRIMZI_NAMESPACE환경 변수에 감시하는 모든 네임스페이스 목록을 추가합니다.예를 들어 이 절차에서 Cluster Operator는 네임스페이스
watched-namespace-1,watched-namespace-2,watched-namespace-3을 확인합니다.apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: watched-namespace-1,watched-namespace-2,watched-namespace-3나열된 각 네임스페이스에 대해
RoleBinding을설치합니다.이 예제에서는 이러한 명령에서
watched-namespace-namespace를 이전 단계에 나열된 네임스페이스로 교체하여 watched-namespace-1,,watched-namespace-2watched-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>Cluster Operator를 배포합니다.
oc create -f install/cluster-operator -n my-cluster-operator-namespace배포 상태를 확인합니다.
oc get deployments -n my-cluster-operator-namespace출력에 배포 이름 및 준비 상태 표시
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1READY는 ready/expected 복제본 수를 표시합니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.2.4. 모든 네임스페이스를 조사하기 위해 Cluster Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 클러스터의 모든 네임스페이스에서 Apache Kafka 리소스에 대한 Streams를 조사하기 위해 Cluster Operator를 배포하는 방법을 보여줍니다.
이 모드에서 실행하면 Cluster Operator가 생성된 새 네임스페이스의 클러스터를 자동으로 관리합니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.
프로세스
Cluster Operator를 설치할 네임스페이스를 사용하도록 Apache Kafka 설치 파일의 Streams를 편집합니다.
예를 들어 이 절차에서는 Cluster Operator가 네임스페이스
my-cluster-operator-namespace에 설치됩니다.Linux에서 다음을 사용하십시오.
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlMacOS에서 다음을 사용하십시오.
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlinstall/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml파일을 편집하여STRIMZI_NAMESPACE환경 변수의 값을*로 설정합니다.apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: # ... serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: "*" # ...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-operatorOpenShift 클러스터에 Cluster Operator를 배포합니다.
oc create -f install/cluster-operator -n my-cluster-operator-namespace배포 상태를 확인합니다.
oc get deployments -n my-cluster-operator-namespace출력에 배포 이름 및 준비 상태 표시
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1READY는 ready/expected 복제본 수를 표시합니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.3. Kafka 배포 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator를 사용하여 Kafka 클러스터를 관리하려면 Kafka 리소스로 배포해야 합니다. Apache Kafka의 스트림은 이 작업을 수행하기 위해 예제 배포 파일을 제공합니다. 이러한 파일을 사용하여 Topic Operator 및 User Operator를 동시에 배포할 수 있습니다.
Cluster Operator를 배포한 후 Kafka 리소스를 사용하여 다음 구성 요소를 배포합니다.
KRaft 또는 Zoo Cryostat를 사용하는 Kafka 클러스터:
- 주제 Operator
- 사용자 Operator
노드 풀은 Kafka 노드 세트에 대한 구성을 제공합니다. 노드 풀을 사용하면 노드가 동일한 Kafka 클러스터 내에서 다른 구성을 가질 수 있습니다.
Kafka 클러스터를 Kafka 리소스로 배포하지 않은 경우 Cluster Operator를 사용하여 관리할 수 없습니다. 예를 들어 OpenShift 외부에서 실행되는 Kafka 클러스터에 적용됩니다. 그러나 독립 실행형 구성 요소로 배포하여 Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터와 함께 Topic Operator 및 User Operator를 사용할 수 있습니다. Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터와 함께 다른 Kafka 구성 요소를 배포하고 사용할 수도 있습니다.
6.3.1. 노드 풀을 사용하여 Kafka 클러스터 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 노드 풀이 있는 Kafka를 OpenShift 클러스터에 배포하는 방법을 보여줍니다. 노드 풀은 동일한 구성을 공유하는 Kafka 클러스터 내의 고유한 Kafka 노드 그룹을 나타냅니다. 노드 풀의 각 Kafka 노드에 대해 노드 풀에 정의되지 않은 구성은 kafka 리소스의 클러스터 구성에서 상속됩니다.
배포에서는 YAML 파일을 사용하여 KafkaNodePool 리소스를 생성하는 사양을 제공합니다. KRaft(Kafka Raft 메타데이터) 모드를 사용하는 Kafka 클러스터에서 노드 풀을 사용하거나 클러스터 관리에 Zoo Cryostat를 사용할 수 있습니다. KRaft 모드에서 Kafka 클러스터를 배포하려면 KafkaNodePool 리소스를 사용해야 합니다.
Apache Kafka의 스트림은 노드 풀을 사용하는 Kafka 클러스터를 생성하는 데 사용할 수 있는 다음 예제 파일을 제공합니다.
kafka-with-dual-role-kraft-nodes.yaml- 브로커 및 컨트롤러 역할을 공유하는 하나의 KRaft 노드 풀을 사용하여 Kafka 클러스터를 배포합니다.
kafka-with-kraft.yaml- 컨트롤러 노드 풀과 브로커 노드 한 개로 구성된 영구 Kafka 클러스터를 배포합니다.
kafka-with-kraft-ephemeral.yaml- 컨트롤러 노드 풀과 브로커 노드 한 개로 이루어진 임시 Kafka 클러스터를 배포합니다.
kafka.yaml- 3개의 노드와 Kafka 브로커의 두 개의 다른 풀을 사용하여 Zoo Cryostat를 배포합니다. 각 풀에는 3 개의 브로커가 있습니다. 이 예제의 풀은 다른 스토리지 구성을 사용합니다.
여기에 설명된 단계를 수행하여 KafkaNodePool 리소스를 사용하여 새 Kafka 클러스터를 배포하거나 기존 Kafka 클러스터를 마이그레이션할 수 있습니다.
사전 요구 사항
프로세스
KRaft 기반 Kafka 클러스터를 배포합니다.
이중 역할 노드를 사용하는 단일 노드 풀을 사용하여 KRaft 모드에서 Kafka 클러스터를 배포하려면 다음을 수행합니다.
oc apply -f examples/kafka/kraft/kafka-with-dual-role-nodes.yaml브로커 및 컨트롤러 노드에 대해 별도의 노드 풀을 사용하여 KRaft 모드에서 영구 Kafka 클러스터를 배포하려면 다음을 수행합니다.
oc apply -f examples/kafka/kraft/kafka.yaml브로커 및 컨트롤러 노드에 대해 별도의 노드 풀을 사용하여 KRaft 모드에서 임시 Kafka 클러스터를 배포하려면 다음을 수행합니다.
oc apply -f examples/kafka/kraft/kafka-ephemeral.yaml3개의 브로커로 구성된 두 개의 노드 풀을 사용하여 Kafka 클러스터 및 Zoo Cryostat 클러스터를 배포하려면 다음을 수행합니다.
oc apply -f examples/kafka/kafka-with-node-pools.yaml
배포 상태를 확인합니다.
oc get pods -n <my_cluster_operator_namespace>출력에 노드 풀 이름 및 준비 상태가 표시됩니다.
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-4 1/1 Running 0-
my-cluster는 Kafka 클러스터의 이름입니다. pool-a는 노드 풀의 이름입니다.0으로 시작하는 순차적 인덱스 번호는 생성된 각 Kafka Pod를 식별합니다. Zoo Cryostat를 사용하는 경우 Zoo Cryostat Pod도 표시됩니다.READY는 ready/expected 복제본 수를 표시합니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.배포에 대한 정보는 풀에 있는 노드의 ID 목록을 포함하여
KafkaNodePool리소스의 상태에도 표시됩니다.참고노드 ID는 클러스터 내의 모든 노드 풀에서 0(0)부터 순차적으로 할당됩니다. 즉, 노드 ID가 특정 노드 풀 내에서 순차적으로 실행되지 않을 수 있습니다. 클러스터 전체의 노드 ID 시퀀스에 차이가 있는 경우 추가할 다음 노드에는 격차를 채우는 ID가 할당됩니다. 축소하면 풀 내에서 노드 ID가 가장 높은 노드가 제거됩니다.
-
6.3.2. 노드 풀 없이 Zoo Cryostat 기반 Kafka 클러스터 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Zoo Cryostat 기반 Kafka 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.
배포에서는 YAML 파일을 사용하여 Kafka 리소스를 생성할 사양을 제공합니다.
Apache Kafka용 스트림은 다음 예제 파일을 제공하여 클러스터 관리에 Zoo Cryostat를 사용하는 Kafka 클러스터를 생성합니다.
kafka-persistent.yaml- 3개의 Zoo Cryostat 및 3개의 Kafka 노드로 영구 클러스터를 배포합니다.
kafka-jbod.yaml- 3개의 Zoo Cryostat 및 3개의 Kafka 노드로 영구 클러스터를 배포합니다(각각 여러 영구 볼륨을 사용).
kafka-persistent-single.yaml- 단일 Zoo Cryostat 노드와 단일 Kafka 노드로 영구 클러스터를 배포합니다.
kafka-ephemeral.yaml- 3개의 Zoo Cryostat 및 3개의 Kafka 노드로 임시 클러스터를 배포합니다.
kafka-ephemeral-single.yaml- 3개의 Zoo Cryostat 노드와 단일 Kafka 노드로 임시 클러스터를 배포합니다.
이 절차에서는 임시 및 영구 Kafka 클러스터 배포에 대한 예제를 사용합니다.
- 임시 클러스터
-
일반적으로 임시(또는 임시) Kafka 클러스터는 프로덕션이 아닌 개발 및 테스트 목적에 적합합니다. 이 배포에서는
emptyDir볼륨을 사용하여 브로커 정보(Opache의 경우) 및 주제 또는 파티션( Kafka용)을 저장합니다.emptyDir볼륨을 사용하면 해당 콘텐츠가 Pod 라이프 사이클과 엄격하게 관련되어 있으며 Pod가 중단될 때 삭제됩니다. - 영구 클러스터
영구 Kafka 클러스터는 영구 볼륨을 사용하여 Zoo Cryostat 및 Kafka 데이터를 저장합니다.
PersistentVolume은PersistentVolumeClaim을 사용하여 취득하여PersistentVolume의 실제 유형과 무관하게 만듭니다.PersistentVolumeClaim은StorageClass를 사용하여 자동 볼륨 프로비저닝을 트리거할 수 있습니다.StorageClass를 지정하지 않으면 OpenShift에서 기본StorageClass를 사용하려고 합니다.다음 예제에서는 몇 가지 일반적인 영구 볼륨 유형을 보여줍니다.
- OpenShift 클러스터가 Amazon AWS에서 실행되는 경우 OpenShift는 Amazon EBS 볼륨을 프로비저닝할 수 있습니다.
- OpenShift 클러스터가 Microsoft Azure에서 실행되는 경우 OpenShift는 Azure Disk Storage 볼륨을 프로비저닝할 수 있습니다.
- OpenShift 클러스터가 Google Cloud에서 실행되는 경우 OpenShift는 영구 디스크 볼륨을 프로비저닝할 수 있습니다.
- OpenShift 클러스터가 베어 메탈에서 실행되는 경우 OpenShift는 로컬 영구 볼륨을 프로비저닝할 수 있습니다.
예제 YAML 파일은 지원되는 최신 Kafka 버전 및 지원되는 로그 메시지 형식 버전 및 상호 브랜드 프로토콜 버전에 대한 구성을 지정합니다. Kafka 구성 의 inter.broker.protocol.version 속성은 지정된 Kafka 버전 (spec.kafka.version)에서 지원하는 버전이어야 합니다. 속성은 Kafka 클러스터에서 사용되는 Kafka 프로토콜 버전을 나타냅니다.
Kafka 3.0.0에서 inter.broker.protocol.version 이 3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다.
예제 클러스터의 이름은 기본적으로 my-cluster 로 지정됩니다. 클러스터 이름은 리소스 이름으로 정의되며 클러스터를 배포한 후에는 변경할 수 없습니다. 클러스터를 배포하기 전에 클러스터 이름을 변경하려면 관련 YAML 파일에서 Kafka 리소스의 Kafka.metadata.name 속성을 편집합니다.
기본 클러스터 이름 및 지정된 Kafka 버전
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.7.0
#...
config:
#...
log.message.format.version: "3.7"
inter.broker.protocol.version: "3.7"
# ...
사전 요구 사항
프로세스
Zoo Cryostat 기반 Kafka 클러스터를 배포합니다.
임시 클러스터를 배포하려면 다음을 수행합니다.
oc apply -f examples/kafka/kafka-ephemeral.yaml영구 클러스터를 배포하려면 다음을 수행합니다.
oc apply -f examples/kafka/kafka-persistent.yaml
배포 상태를 확인합니다.
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 0my-cluster는 Kafka 클러스터의 이름입니다.0으로 시작하는 순차적 인덱스 번호는 생성된 각 Kafka 및 Zoo Cryostat Pod를 식별합니다.기본 배포를 통해 Entity Operator 클러스터, 3 Kafka Pod 및 3 Zoo Cryostat Pod를 생성합니다.
READY는 ready/expected 복제본 수를 표시합니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.3.3. Cluster Operator를 사용하여 Topic Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Topic Operator를 배포하는 방법을 설명합니다. Topic Operator는 양방향 모드 또는 unidirectional 모드에서 사용하기 위해 배포할 수 있습니다. 양방향 및 단방향 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 에서 참조하십시오.
topicOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 구성합니다. 기본적으로 Topic Operator는 Cluster Operator가 배포한 Kafka 클러스터의 네임스페이스에서 KafkaTopic 리소스를 감시합니다. Topic Operator 사양에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다. 단일 Topic Operator는 단일 네임스페이스를 조사할 수 있습니다. Topic Operator는 하나의 네임스페이스만 조사해야 합니다.
Apache Kafka의 Streams를 사용하여 동일한 네임스페이스에 여러 Kafka 클러스터를 배포하는 경우 하나의 Kafka 클러스터에 대해서만 Topic Operator를 활성화하거나 watchedNamespace 속성을 사용하여 다른 네임스페이스를 조사하도록 Topic Operator를 구성합니다.
Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터에서 Topic Operator를 사용하려면 독립 실행형 구성 요소로 Topic Operator를 배포해야 합니다.
entityOperator 및 topicOperator 속성 구성에 대한 자세한 내용은 Entity Operator 구성을 참조하십시오.
사전 요구 사항
프로세스
topicOperator를 포함하도록Kafka리소스의entityOperator속성을 편집합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}EntityTopicOperatorSpec스키마 참조에 설명된 속성을 사용하여 Topic Operator사양을 구성합니다.모든 속성에서 기본값을 사용하려면 빈 오브젝트(
{})를 사용합니다.리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>배포 상태를 확인합니다.
oc get pods -n <my_cluster_operator_namespace>출력에 Pod 이름 및 준비 상태 표시
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...my-cluster는 Kafka 클러스터의 이름입니다.READY는 ready/expected 복제본 수를 표시합니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.3.4. Cluster Operator를 사용하여 User Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 User Operator를 배포하는 방법을 설명합니다.
userOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 구성합니다. 기본적으로 User Operator는 Kafka 클러스터 배포의 네임스페이스에서 KafkaUser 리소스를 감시합니다. User Operator 사양에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다. 단일 User Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임 스페이스는 하나의 User Operator에서만 조사해야 합니다.
Apache Kafka용 Streams에서 관리하지 않는 Kafka 클러스터에서 User Operator를 사용하려면 User Operator를 독립 실행형 구성 요소로 배포해야 합니다.
entityOperator 및 userOperator 속성을 구성하는 방법에 대한 자세한 내용은 Entity Operator 구성을 참조하십시오.
사전 요구 사항
프로세스
userOperator를 포함하도록Kafka리소스의entityOperator속성을 편집합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}EntityUserOperatorSpec스키마 참조에 설명된 속성을 사용하여 User Operator사양을 구성합니다.모든 속성에서 기본값을 사용하려면 빈 오브젝트(
{})를 사용합니다.리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>배포 상태를 확인합니다.
oc get pods -n <my_cluster_operator_namespace>출력에 Pod 이름 및 준비 상태 표시
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...my-cluster는 Kafka 클러스터의 이름입니다.READY는 ready/expected 복제본 수를 표시합니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.3.5. 터미널에서 Zoo Cryostat에 연결 링크 복사링크가 클립보드에 복사되었습니다!
Zookeeper 서비스는 암호화 및 인증으로 보호되며 Apache Kafka용 Streams에 포함되지 않은 외부 애플리케이션에서 사용할 수 없습니다.
그러나 Zoo Cryostat에 대한 연결이 필요한 CLI 도구를 사용하려면 Zoo Cryostat Pod 내에서 터미널을 사용하여 localhost:12181 에 연결할 수 있습니다.
사전 요구 사항
- OpenShift 클러스터를 사용할 수 있습니다.
- Kafka 클러스터가 실행 중입니다.
- Cluster Operator가 실행 중입니다.
프로세스
OpenShift 콘솔을 사용하여 터미널을 열거나 CLI에서
exec명령을 실행합니다.예를 들면 다음과 같습니다.
oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181 ls /localhost:12181을 사용해야 합니다.
6.3.6. Kafka 클러스터 리소스 목록 링크 복사링크가 클립보드에 복사되었습니다!
다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.
공유 리소스
<kafka_cluster_name>-cluster-ca- 클러스터 통신을 암호화하는 데 사용되는 클러스터 CA 개인 키가 있는 시크릿입니다.
<kafka_cluster_name>-cluster-ca-cert- 클러스터 CA 공개 키가 있는 시크릿입니다. 이 키를 사용하여 Kafka 브로커의 ID를 확인할 수 있습니다.
<kafka_cluster_name>-clients-ca- 사용자 인증서에 서명하는 데 사용되는 클라이언트 CA 개인 키가 있는 시크릿
<kafka_cluster_name>-clients-ca-cert- 클라이언트 CA 공개 키가 있는 시크릿입니다. 이 키를 사용하여 Kafka 사용자의 ID를 확인할 수 있습니다.
<kafka_cluster_name>-cluster-operator-certs- Kafka 및 Zoo Cryostat와의 통신을 위한 클러스터 운영자 키가 있는 시크릿입니다.
Zookeeper 노드
<kafka_cluster_name>-zookeeper다음 Zoo Cryostat 리소스에 지정된 이름입니다.
- Zoo Cryostat 노드 Pod를 관리하기 위한 StrimziPodSet.
- Zoo Cryostat 노드에서 사용하는 서비스 계정입니다.
- PodDisruptionBudget은 Zoo Cryostat 노드에 대해 구성되어 있습니다.
<kafka_cluster_name>-zookeeper-<pod_id>- StrimziPodSet에서 생성한 Pod입니다.
<kafka_cluster_name>-zookeeper-nodes- 헤드리스 서비스는 DNS가 Zoo Cryostat Pod IP 주소를 직접 확인해야 했습니다.
<kafka_cluster_name>-zookeeper-client- Kafka 브로커가 클라이언트로 Zoo Cryostat 노드에 연결하는 데 사용하는 서비스입니다.
<kafka_cluster_name>-zookeeper-config- ConfigMap은 Zoo Cryostat ancillary 구성이 포함되어 있고 Zoo Cryostat 노드 Pod에 의해 볼륨으로 마운트됩니다.
<kafka_cluster_name>-zookeeper-nodes- secret with Zoo Cryostat 노드 키입니다.
<kafka_cluster_name>-network-policy-zookeeper- Zoo Cryostat 서비스에 대한 액세스를 관리하는 네트워크 정책입니다.
data-<kafka_cluster_name>-zookeeper-<pod_id>- 특정 Zoo Cryostat 노드의 데이터를 저장하는 데 사용되는 볼륨에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장하기 위한 영구 볼륨 프로비저닝용으로 영구 스토리지를 선택한 경우에만 생성됩니다.
Kafka 브로커
<kafka_cluster_name>-kafka다음 Kafka 리소스에 지정된 이름입니다.
- Kafka 브로커 Pod를 관리하기 위한 StrimziPodSet.
- Kafka Pod에서 사용하는 서비스 계정입니다.
- Kafka 브로커에 대해 구성된 PodDisruptionBudget.
<kafka_cluster_name>-kafka-<pod_id>다음 Kafka 리소스에 지정된 이름입니다.
- StrimziPodSet에서 생성한 Pod입니다.
- Kafka 브로커 구성이 포함된 ConfigMap입니다.
<kafka_cluster_name>-kafka-brokers- DNS에서 Kafka 브로커 포드 IP 주소를 직접 확인하는 데 필요한 서비스입니다.
<kafka_cluster_name>-kafka-bootstrap- 서비스는 OpenShift 클러스터 내에서 연결하는 Kafka 클라이언트의 부트스트랩 서버로 사용할 수 있습니다.
<kafka_cluster_name>-kafka-external-bootstrap-
OpenShift 클러스터 외부에서 연결하는 클라이언트를 위한 부트스트랩 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 리스너 이름이
외부이고 포트가9094인 경우 이전 서비스 이름은 이전 버전과의 호환성에 사용됩니다. <kafka_cluster_name>-kafka-<pod_id>-
OpenShift 클러스터 외부에서 개별 포드로 트래픽을 라우팅하는 데 사용되는 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 리스너 이름이
외부이고 포트가9094인 경우 이전 서비스 이름은 이전 버전과의 호환성에 사용됩니다. <kafka_cluster_name>-kafka-external-bootstrap-
OpenShift 클러스터 외부에서 연결하는 클라이언트의 부트스트랩 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type
route로 설정됩니다. 리스너 이름이외부이고 포트가9094인 경우 이전 경로 이름은 이전 버전과의 호환성에 사용됩니다. <kafka_cluster_name>-kafka-<pod_id>-
OpenShift 클러스터 외부에서 개별 포드로의 트래픽 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type
route로 설정됩니다. 리스너 이름이외부이고 포트가9094인 경우 이전 경로 이름은 이전 버전과의 호환성에 사용됩니다. <kafka_cluster_name>-kafka-<listener_name>-bootstrap- OpenShift 클러스터 외부에서 연결하는 클라이언트를 위한 부트스트랩 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 새 서비스 이름은 다른 모든 외부 리스너에 사용됩니다.
<kafka_cluster_name>-kafka-<listener_name>-<pod_id>- OpenShift 클러스터 외부에서 개별 포드로 트래픽을 라우팅하는 데 사용되는 서비스입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성됩니다. 새 서비스 이름은 다른 모든 외부 리스너에 사용됩니다.
<kafka_cluster_name>-kafka-<listener_name>-bootstrap-
OpenShift 클러스터 외부에서 연결하는 클라이언트의 부트스트랩 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type
route로 설정됩니다. 새 경로 이름은 다른 모든 외부 리스너에 사용됩니다. <kafka_cluster_name>-kafka-<listener_name>-<pod_id>-
OpenShift 클러스터 외부에서 개별 포드로의 트래픽 경로입니다. 이 리소스는 외부 리스너가 활성화된 경우에만 생성되고 type
route로 설정됩니다. 새 경로 이름은 다른 모든 외부 리스너에 사용됩니다. <kafka_cluster_name>-kafka-config-
UseStrimziPodSets기능 게이트를 비활성화할 때 브로커 Pod에 의해 볼륨으로 마운트되는 Kafka 보조 구성이 포함된 ConfigMap입니다. <kafka_cluster_name>-kafka-brokers- Kafka 브로커 키가 있는 시크릿입니다.
<kafka_cluster_name>-network-policy-kafka- Kafka 서비스에 대한 액세스를 관리하는 네트워크 정책입니다.
strimzi-namespace-name-<kafka_cluster_name>-kafka-init- Kafka 브로커에서 사용하는 클러스터 역할 바인딩입니다.
<kafka_cluster_name>-jmx- Kafka 브로커 포트를 보호하는 데 사용되는 secret 및 password가 있는 secret입니다. 이 리소스는 Kafka에서 Cryostat가 활성화된 경우에만 생성됩니다.
data-<kafka_cluster_name>-kafka-<pod_id>- 특정 Kafka 브로커의 데이터를 저장하는 데 사용되는 볼륨에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장하기 위한 영구 볼륨 프로비저닝용으로 영구 스토리지를 선택한 경우에만 생성됩니다.
data-<id>-<kafka_cluster_name>-kafka-<pod_id>-
특정 Kafka 브로커의 데이터를 저장하는
데사용되는 볼륨 ID에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장할 영구 볼륨을 프로비저닝할 때 JBOD 볼륨에 영구 스토리지를 선택한 경우에만 생성됩니다.
Kafka 노드 풀
Kafka 노드 풀을 사용하는 경우 생성된 리소스는 브로커, 컨트롤러 또는 둘 다로 작동하는지 노드 풀에서 관리되는 노드에 적용됩니다. 이름 지정 규칙에는 Kafka 클러스터의 이름과 노드 풀: < kafka_cluster_name>-<pool_name > 이 포함됩니다.
<kafka_cluster_name>-<pool_name>- Kafka 노드 풀을 관리하기 위해 StrimziPodSet에 지정된 이름입니다.
<kafka_cluster_name>-<pool_name>-<pod_id>다음 Kafka 노드 풀 리소스에 지정된 이름입니다.
- StrimziPodSet에서 생성한 Pod입니다.
- Kafka 노드 구성이 포함된 ConfigMap입니다.
data-<kafka_cluster_name>-<pool_name>-<pod_id>- 특정 노드의 데이터를 저장하는 데 사용되는 볼륨에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장하기 위한 영구 볼륨 프로비저닝용으로 영구 스토리지를 선택한 경우에만 생성됩니다.
data-<id>-<kafka_cluster_name>-<pool_name>-<pod_id>-
특정 노드의 데이터를 저장하는 데
사용되는볼륨 ID에 대한 영구 볼륨 클레임입니다. 이 리소스는 데이터를 저장할 영구 볼륨을 프로비저닝할 때 JBOD 볼륨에 영구 스토리지를 선택한 경우에만 생성됩니다.
Entity Operator
이러한 리소스는 Entity Operator가 Cluster Operator를 사용하여 배포된 경우에만 생성됩니다.
<kafka_cluster_name>-entity-operator다음 Entity Operator 리소스에 지정된 이름입니다.
- 주제 및 사용자 Operator를 사용한 배포.
- Entity Operator에서 사용하는 서비스 계정입니다.
- Entity Operator 지표에 대한 액세스를 관리하는 네트워크 정책입니다.
<kafka_cluster_name>-entity-operator-<random_string>- Entity Operator 배포에 의해 생성된 Pod입니다.
<kafka_cluster_name>-entity-topic-operator-config- Topic Operators에 대한 보조 구성이 포함된 ConfigMap입니다.
<kafka_cluster_name>-entity-user-operator-config- 사용자 Operator에 대한 보조 구성이 포함된 ConfigMap입니다.
<kafka_cluster_name>-entity-topic-operator-certs- Kafka 및 Zoo Cryostat와의 통신을 위한 주제 Operator 키와의 비밀.
<kafka_cluster_name>-entity-user-operator-certs- Kafka 및 Zoo Cryostat와의 통신을 위한 사용자 Operator 키와의 시크릿.
strimzi-<kafka_cluster_name>-entity-topic-operator- Entity Topic Operator에서 사용하는 역할 바인딩입니다.
strimzi-<kafka_cluster_name>-entity-user-operator- Entity User Operator에서 사용하는 역할 바인딩입니다.
Kafka Exporter
이러한 리소스는 Kafka Exporter가 Cluster Operator를 사용하여 배포된 경우에만 생성됩니다.
<kafka_cluster_name>-kafka-exporter다음 Kafka Exporter 리소스에 지정된 이름입니다.
- Kafka Exporter를 사용한 배포.
- 소비자 지연 메트릭을 수집하는 데 사용되는 서비스입니다.
- Kafka Exporter에서 사용하는 서비스 계정입니다.
- Kafka 내보내기 메트릭에 대한 액세스를 관리하는 네트워크 정책입니다.
<kafka_cluster_name>-kafka-exporter-<random_string>- Kafka Exporter 배포에서 생성된 Pod입니다.
크루즈 제어
이러한 리소스는 Cruise Control이 Cluster Operator를 사용하여 배포된 경우에만 생성됩니다.
<kafka_cluster_name>-cruise-control다음 Cruise Control 리소스에 지정된 이름입니다.
- Cruise Control을 사용한 배포.
- Cruise Control과 통신하는 데 사용되는 서비스입니다.
- Cruise Control에서 사용하는 서비스 계정입니다.
<kafka_cluster_name>-cruise-control-<random_string>- Cruise Control 배포에서 생성된 포드입니다.
<kafka_cluster_name>-cruise-control-config- Cruise Control 익명 구성이 포함되어 있고 Cruise Control Pod에 의해 볼륨으로 마운트되는 ConfigMap입니다.
<kafka_cluster_name>-cruise-control-certs- Kafka 및 Zoo Cryostat와의 통신을 위한 Cruise Control 키와의 비밀.
<kafka_cluster_name>-network-policy-cruise-control- Cruise Control 서비스에 대한 액세스를 관리하는 네트워크 정책입니다.
6.4. Kafka Connect 배포 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect 는 커넥터 플러그인을 사용하여 Kafka 브로커와 기타 시스템 간에 데이터를 스트리밍하기 위한 통합 툴킷입니다. Kafka Connect는 커넥터를 사용하여 데이터를 가져오거나 내보낼 수 있도록 데이터베이스 또는 메시징 시스템과 같은 외부 데이터 소스 또는 대상을 통합하기 위한 프레임워크를 제공합니다. Connectors는 필요한 연결 구성을 제공하는 플러그인입니다.
Apache Kafka용 Streams에서 Kafka Connect는 분산 모드로 배포됩니다. Kafka Connect는 독립형 모드에서도 작동할 수 있지만 Apache Kafka용 Streams에서는 지원되지 않습니다.
Kafka Connect는 커넥터 의 개념을 사용하여 대량의 데이터를 Kafka 클러스터로 전환하면서 확장성 및 안정성을 유지하기 위한 프레임워크를 제공합니다.
Cluster Operator는 KafkaConnector 리소스를 사용하여 생성된 KafkaConnect 리소스 및 커넥터를 사용하여 배포된 Kafka Connect 클러스터를 관리합니다.
Kafka Connect를 사용하려면 다음을 수행해야 합니다.
커넥터 라는 용어는 Kafka Connect 클러스터 또는 커넥터 클래스 내에서 실행되는 커넥터 인스턴스를 의미하기 위해 서로 바꿔 사용할 수 있습니다. 이 가이드에서는 커넥터 라는 용어가 컨텍스트에서 의미가 명확할 때 사용됩니다.
6.4.1. OpenShift 클러스터에 Kafka Connect 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Kafka Connect 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.
Kafka Connect 클러스터 배포는 커넥터의 워크로드를 작업으로 분배하여 메시지 흐름을 높은 확장 가능하고 안정적으로 배포하는 구성 가능한 수( 작업자라고도 함)로 구현됩니다.
배포에서는 YAML 파일을 사용하여 KafkaConnect 리소스를 생성하는 사양을 제공합니다.
Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.
-
examples/connect/kafka-connect.yaml
병렬로 실행되도록 Kafka Connect 클러스터를 배포하는 경우 각 인스턴스에서 내부 Kafka Connect 항목에 고유한 이름을 사용해야 합니다. 이렇게 하려면 기본값을 대체하도록 각 Kafka Connect 인스턴스를 구성합니다.
프로세스
OpenShift 클러스터에 Kafka Connect를 배포합니다.
examples/connect/kafka-connect.yaml파일을 사용하여 Kafka Connect를 배포합니다.oc apply -f examples/connect/kafka-connect.yaml배포 상태를 확인합니다.
oc get pods -n <my_cluster_operator_namespace>출력에 배포 이름 및 준비 상태 표시
NAME READY STATUS RESTARTS my-connect-cluster-connect-<pod_id> 1/1 Running 0my-connect-cluster는 Kafka Connect 클러스터의 이름입니다.Pod ID는 생성된 각 pod를 식별합니다.
기본 배포를 사용하면 단일 Kafka Connect Pod를 생성합니다.
READY는 ready/expected 복제본 수를 표시합니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.4.2. Kafka Connect 클러스터 리소스 목록 링크 복사링크가 클립보드에 복사되었습니다!
다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.
- <connect_cluster_name>-connect
다음 Kafka Connect 리소스에 지정된 이름입니다.
- Kafka Connect 작업자 노드 Pod를 생성하는 StrimziPodSet.
- Kafka Connect Pod에 안정적인 DNS 이름을 제공하는 헤드리스 서비스입니다.
- Kafka Connect Pod에서 사용하는 서비스 계정입니다.
- Kafka Connect 작업자 노드에 대해 구성된 Pod 중단 예산입니다.
- Kafka Connect REST API에 대한 액세스를 관리하는 네트워크 정책입니다.
- <connect_cluster_name>-connect-<pod_id>
- Kafka Connect StrimziPodSet에서 생성된 Pod
- <connect_cluster_name>-connect-api
- Kafka Connect 클러스터 관리를 위한 REST 인터페이스를 노출하는 서비스입니다.
- <connect_cluster_name>-connect-config
- Kafka Connect ancillary 구성이 포함된 ConfigMap은 Kafka Connect Pod를 통해 볼륨으로 마운트됩니다.
- strimzi-<namespace-name>-<connect_cluster_name>-connect-init
- Kafka Connect 클러스터에서 사용하는 클러스터 역할 바인딩입니다.
- <connect_cluster_name>-connect-build
- 추가 커넥터 플러그인으로 새 컨테이너 이미지를 빌드하는 데 사용되는 Pod는 Kafka Connect Build 기능을 사용하는 경우에만 사용됩니다.
- <connect_cluster_name>-connect-dockerfile
- 추가 커넥터 플러그인을 사용하여 새 컨테이너 이미지를 빌드하기 위해 Dockerfile이 생성된 ConfigMap( Kafka Connect 빌드 기능이 사용되는 경우에만).
6.5. Kafka Connect 커넥터 추가 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect는 커넥터를 사용하여 데이터를 스트리밍하기 위해 다른 시스템과 통합합니다. 커넥터는 Kafka Connector 클래스의 인스턴스이며 다음 유형 중 하나일 수 있습니다.
- 소스 커넥터
- 소스 커넥터는 외부 시스템에서 데이터를 가져와서 Kafka에 메시지로 제공하는 런타임 엔티티입니다.
- 싱크 커넥터
- 싱크 커넥터는 Kafka 주제에서 메시지를 가져와서 외부 시스템에 제공하는 런타임 엔티티입니다.
Kafka Connect는 플러그인 아키텍처를 사용하여 커넥터에 구현 아티팩트를 제공합니다. 플러그인을 사용하면 다른 시스템에 대한 연결을 허용하고 데이터를 조작하기 위한 추가 구성을 제공합니다. 플러그인에는 커넥터 및 데이터 변환기 및 변환과 같은 기타 구성 요소가 포함됩니다. 커넥터는 특정 유형의 외부 시스템에서 작동합니다. 각 커넥터는 구성에 사용할 스키마를 정의합니다. Kafka Connect에 구성을 제공하여 Kafka Connect 내에서 커넥터 인스턴스를 생성합니다. 그런 다음 Connector 인스턴스는 시스템 간에 데이터를 이동하기 위한 일련의 작업을 정의합니다.
다음 방법 중 하나로 Kafka Connect에 커넥터 플러그인을 추가합니다.
컨테이너 이미지에 플러그인을 추가한 후 다음과 같은 방법으로 커넥터 인스턴스를 시작, 중지 및 관리할 수 있습니다.
이러한 옵션을 사용하여 새 커넥터 인스턴스를 생성할 수도 있습니다.
6.5.1. 커넥터 플러그인을 사용하여 새 컨테이너 이미지 빌드 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams가 추가 커넥터를 사용하여 새 컨테이너 이미지를 자동으로 빌드하도록 Kafka Connect를 구성합니다. KafkaConnect 사용자 정의 리소스의 .spec.build.plugins 속성을 사용하여 커넥터 플러그인을 정의합니다. Apache Kafka의 스트림은 커넥터 플러그인을 자동으로 다운로드하고 새 컨테이너 이미지에 추가합니다. 컨테이너는 .spec.build.output 에 지정된 컨테이너 리포지토리로 푸시되고 Kafka Connect 배포에서 자동으로 사용됩니다.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- 컨테이너 레지스트리.
이미지를 푸시, 저장 및 가져올 수 있는 자체 컨테이너 레지스트리를 제공해야 합니다. Apache Kafka의 스트림은 Quay 또는 Docker Hub 와 같은 공개 레지스트리뿐만 아니라 개인 컨테이너 레지스트리를 지원합니다.
프로세스
.spec.build.output에 컨테이너 레지스트리를 지정하고.spec.build.plugins: 추가 커넥터를 지정하여KafkaConnect사용자 지정 리소스를 구성합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec:1 #... build: output:2 type: docker image: my-registry.io/my-org/my-connect-cluster:latest pushSecret: my-registry-credentials plugins:3 - name: connector-1 artifacts: - type: tgz url: <url_to_download_connector_1_artifact> sha512sum: <SHA-512_checksum_of_connector_1_artifact> - name: connector-2 artifacts: - type: jar url: <url_to_download_connector_2_artifact> sha512sum: <SHA-512_checksum_of_connector_2_artifact> #...리소스를 생성하거나 업데이트합니다.
$ oc apply -f <kafka_connect_configuration_file>- 새 컨테이너 이미지가 빌드되고 Kafka Connect 클러스터가 배포될 때까지 기다립니다.
-
추가한 커넥터 플러그인을 사용하려면 Kafka Connect REST API 또는
KafkaConnector사용자 정의 리소스를 사용합니다.
6.5.2. Kafka Connect 기본 이미지의 커넥터 플러그인을 사용하여 새 컨테이너 이미지 빌드 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect 기본 이미지의 커넥터 플러그인을 사용하여 사용자 지정 Docker 이미지를 생성합니다. 사용자 지정 이미지를 /opt/kafka/plugins 디렉터리에 추가합니다.
Red Hat Ecosystem Catalog 에서 Kafka 컨테이너 이미지를 추가 커넥터 플러그인으로 자체 사용자 정의 이미지를 생성하기 위한 기본 이미지로 사용할 수 있습니다.
시작 시 Kafka Connect의 Kafka Kafka 버전의 Streams는 /opt/kafka/plugins 디렉터리에 포함된 타사 커넥터 플러그인을 로드합니다.
사전 요구 사항
프로세스
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0을 기본 이미지로 사용하여 새Dockerfile을 생성합니다.FROM registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 USER root:root COPY ./my-plugins/ /opt/kafka/plugins/ USER 1001플러그인 파일 예
$ tree ./my-plugins/ ./my-plugins/ ├── debezium-connector-mongodb │ ├── bson-<version>.jar │ ├── CHANGELOG.md │ ├── CONTRIBUTE.md │ ├── COPYRIGHT.txt │ ├── debezium-connector-mongodb-<version>.jar │ ├── debezium-core-<version>.jar │ ├── LICENSE.txt │ ├── mongodb-driver-core-<version>.jar │ ├── README.md │ └── # ... ├── debezium-connector-mysql │ ├── CHANGELOG.md │ ├── CONTRIBUTE.md │ ├── COPYRIGHT.txt │ ├── debezium-connector-mysql-<version>.jar │ ├── debezium-core-<version>.jar │ ├── LICENSE.txt │ ├── mysql-binlog-connector-java-<version>.jar │ ├── mysql-connector-java-<version>.jar │ ├── README.md │ └── # ... └── debezium-connector-postgres ├── CHANGELOG.md ├── CONTRIBUTE.md ├── COPYRIGHT.txt ├── debezium-connector-postgres-<version>.jar ├── debezium-core-<version>.jar ├── LICENSE.txt ├── postgresql-<version>.jar ├── protobuf-java-<version>.jar ├── README.md └── # ...COPY 명령은 컨테이너 이미지에 복사할 플러그인 파일을 가리킵니다.
이 예제에서는 Debezium 커넥터(MongoDB, MySQL 및 PostgreSQL)용 플러그인을 추가하지만 모든 파일이 간결하게 나열되지는 않습니다. Kafka Connect에서 실행되는 Debezium은 다른 Kafka Connect 작업과 동일합니다.
- 컨테이너 이미지를 빌드합니다.
- 사용자 정의 이미지를 컨테이너 레지스트리로 내보냅니다.
새 컨테이너 이미지를 가리킵니다.
다음 방법 중 하나로 이미지를 가리킬 수 있습니다.
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-image2 config:3 #...-
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml파일에서STRIMZI_KAFKA_CONNECT_IMAGES환경 변수를 편집한 다음 Cluster Operator를 다시 설치합니다.
6.5.3. KafkaConnector 리소스 배포 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 배포하여 커넥터를 관리합니다. KafkaConnector 사용자 정의 리소스는 Cluster Operator의 커넥터 관리에 대한 OpenShift 네이티브 접근 방식을 제공합니다. Kafka Connect REST API와 마찬가지로 커넥터를 관리하기 위해 HTTP 요청을 보낼 필요가 없습니다. 해당 KafkaConnector 리소스를 업데이트한 다음 업데이트를 적용하여 실행 중인 커넥터 인스턴스를 관리합니다. Cluster Operator는 실행 중인 커넥터 인스턴스의 구성을 업데이트합니다. 해당 KafkaConnector 를 삭제하여 커넥터를 제거합니다.
KafkaConnector 리소스는 연결된 Kafka Connect 클러스터와 동일한 네임스페이스에 배포해야 합니다.
이 절차에 표시된 구성에서 실패한 커넥터 및 작업을 자동으로 다시 시작하기 위해 autoRestart 기능이 활성화됨(enabled: true)입니다. KafkaConnector 리소스에 주석을 추가하여 커넥터 를 다시 시작하거나 커넥터 작업을 수동으로 다시 시작할 수도 있습니다.
커넥터 예
자체 커넥터를 사용하거나 Apache Kafka용 Streams에서 제공하는 예제를 시도할 수 있습니다. Apache Kafka 3.1.0까지 파일 커넥터 플러그인 예제가 Apache Kafka에 포함되었습니다. Apache Kafka의 3.1.1 및 3.2.0 릴리스부터는 다른 커넥터로 플러그인 경로에 예제를 추가해야 합니다.
Apache Kafka의 스트림은 예제 파일 커넥터 플러그인에 대한 KafkaConnector 구성 파일 (examples/connect/source-connector.yaml)을 제공합니다. 이 파일은 KafkaConnector 리소스로 다음 커넥터 인스턴스를 생성합니다.
-
Kafka 라이센스 파일(소스)에서 각 행을 읽고 데이터를 하나의 Kafka 항목에 메시지로 쓰는
FileStreamSourceConnector인스턴스입니다. -
Kafka 주제에서 메시지를 읽고 메시지를 임시 파일( sink)에 쓰는
FileStreamSinkConnector인스턴스입니다.
이 절차에서는 예제 파일을 사용하여 커넥터를 만듭니다.
예제 커넥터는 프로덕션 환경에서 사용하기 위한 것이 아닙니다.
사전 요구 사항
- Kafka Connect 배포
- Cluster Operator가 실행 중입니다
프로세스
다음 방법 중 하나로 Kafka Connect에
FileStreamSourceConnector및FileStreamSinkConnector플러그인을 추가합니다.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는 이를 감시합니다.examples/connect/source-connector.yaml파일을 편집합니다.KafkaConnector 소스 커넥터 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector1 labels: strimzi.io/cluster: my-connect-cluster2 spec: class: org.apache.kafka.connect.file.FileStreamSourceConnector3 tasksMax: 24 autoRestart:5 enabled: true config:6 file: "/opt/kafka/LICENSE"7 topic: my-topic8 # ...- 1
- 커넥터의 이름으로 사용되는
KafkaConnector리소스의 이름입니다. OpenShift 리소스에 유효한 모든 이름을 사용합니다. - 2
- 커넥터 인스턴스를 생성하는 Kafka Connect 클러스터의 이름입니다. 커넥터는 연결된 Kafka Connect 클러스터와 동일한 네임스페이스에 배포해야 합니다.
- 3
- 커넥터 클래스의 전체 이름입니다. Kafka Connect 클러스터에서 사용하는 이미지에 있어야 합니다.
- 4
- 커넥터가 생성할 수 있는 최대 Kafka Connect 작업 수입니다.
- 5
- 실패한 커넥터 및 작업을 자동으로 다시 시작할 수 있습니다. 기본적으로 재시작 수는 indefinite이지만
maxRestarts속성을 사용하여 자동 재시작 횟수에 대해 최대값을 설정할 수 있습니다. - 6
- 연결을 키 -값 쌍으로 연결합니다.
- 7
- 외부 데이터 파일의 위치입니다. 이 예제에서는
/opt/kafka/LICENSE파일에서 읽을 수 있도록FileStreamSourceConnector를 구성하고 있습니다. - 8
- 소스 데이터를 게시하는 Kafka 주제입니다.
OpenShift 클러스터에서 소스
KafkaConnector를 생성합니다.oc apply -f examples/connect/source-connector.yamlexamples/connect/sink-connector.yaml파일을 생성합니다.touch examples/connect/sink-connector.yaml다음 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.FileStreamSinkConnector1 tasksMax: 2 config:2 file: "/tmp/my-file"3 topics: my-topic4 OpenShift 클러스터에서 싱크
KafkaConnector를 생성합니다.oc apply -f examples/connect/sink-connector.yaml커넥터 리소스가 생성되었는지 확인합니다.
oc get kctr --selector strimzi.io/cluster=<my_connect_cluster> -o name my-source-connector my-sink-connector<my_connect_cluster>를 Kafka Connect 클러스터 이름으로 바꿉니다.
컨테이너에서
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 속성에 정의됩니다.
FileStreamSourceConnector 및 FileStreamSinkConnector 클래스는 Kafka Connect REST API와 동일한 구성 옵션을 지원합니다. 기타 커넥터는 다양한 구성 옵션을 지원합니다.
| 이름 | 유형 | 기본값 | 설명 |
|---|---|---|---|
|
| 문자열 | null | 메시지를 작성할 소스 파일입니다. 지정하지 않으면 표준 입력이 사용됩니다. |
|
| list | null | 데이터를 게시하는 Kafka 주제입니다. |
| 이름 | 유형 | 기본값 | 설명 |
|---|---|---|---|
|
| 문자열 | null | 메시지를 쓸 대상 파일입니다. 지정하지 않으면 표준 출력이 사용됩니다. |
|
| list | null | 데이터를 읽을 하나 이상의 Kafka 주제입니다. |
|
| 문자열 | null | 데이터를 읽을 하나 이상의 Kafka 주제와 일치하는 정규식입니다. |
6.5.4. Kafka Connect API 노출 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect REST API를 KafkaConnector 리소스를 사용하여 커넥터를 관리하는 대신 사용합니다. Kafka Connect REST API는 < connect_cluster_name> -connect-api:8083 에서 실행되는 서비스로 사용할 수 있습니다. 여기서 < connect_cluster_name >은 Kafka Connect 클러스터의 이름입니다. 이 서비스는 Kafka Connect 인스턴스를 생성할 때 생성됩니다.
Kafka Connect REST API에서 지원하는 작업은 Apache Kafka Connect API 설명서에 설명되어 있습니다.
strimzi.io/use-connector-resources 주석은 KafkaConnectors를 활성화합니다. KafkaConnect 리소스 구성에 주석을 적용한 경우 Kafka Connect API를 사용하도록 제거해야 합니다. 그러지 않으면 Kafka Connect REST API를 사용하여 직접 변경한 수동 변경 사항은 Cluster Operator에서 되돌립니다.
커넥터 구성을 JSON 오브젝트로 추가할 수 있습니다.
커넥터 구성을 추가하기 위한 curl 요청 예
curl -X POST \
http://my-connect-cluster-connect-api:8083/connectors \
-H 'Content-Type: application/json' \
-d '{ "name": "my-source-connector",
"config":
{
"connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector",
"file": "/opt/kafka/LICENSE",
"topic":"my-topic",
"tasksMax": "4",
"type": "source"
}
}'
API는 OpenShift 클러스터 내에서만 액세스할 수 있습니다. OpenShift 클러스터 외부에서 실행되는 애플리케이션에 Kafka Connect API를 액세스하려면 다음 기능 중 하나를 생성하여 수동으로 노출할 수 있습니다.
-
LoadBalancer또는NodePort유형 서비스 -
Ingress리소스(Kubernetes만 해당) - OpenShift 경로(OpenShift만 해당)
연결이 안전하지 않으므로 외부 액세스를 권장합니다.
서비스를 생성하려면 < connect_cluster_name> -connect-api 서비스의 선택기 에서 레이블을 사용하여 서비스가 트래픽을 라우팅할 Pod를 구성합니다.
서비스의 선택기 구성
# ...
selector:
strimzi.io/cluster: my-connect-cluster
strimzi.io/kind: KafkaConnect
strimzi.io/name: my-connect-cluster-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:
matchLabels:
app: my-connector-manager
ports:
- port: 8083
protocol: TCP
podSelector:
matchLabels:
strimzi.io/cluster: my-connect-cluster
strimzi.io/kind: KafkaConnect
strimzi.io/name: my-connect-cluster-connect
policyTypes:
- Ingress
- 1
- API에 연결할 수 있는 Pod의 레이블입니다.
클러스터 외부에 커넥터 구성을 추가하려면 curl 명령에 API를 노출하는 리소스의 URL을 사용합니다.
6.5.5. Kafka Connect API에 대한 액세스 제한 링크 복사링크가 클립보드에 복사되었습니다!
무단 조치 및 잠재적인 보안 문제를 방지하기 위해 Kafka Connect API에 대한 액세스를 신뢰할 수 있는 사용자에게만 제한하는 것이 중요합니다. Kafka Connect API는 커넥터 구성을 변경하기 위한 광범위한 기능을 제공하므로 보안 예방 조치를 취하는 것이 더 중요합니다. Kafka Connect API에 대한 액세스 권한이 있는 사용자는 관리자가 안전한 것으로 가정할 수 있는 중요한 정보를 얻을 수 있습니다.
Kafka Connect REST API는 OpenShift 클러스터에 대한 액세스 권한이 있고 호스트 이름/IP 주소 및 포트 번호를 포함하는 엔드포인트 URL을 알고 있는 모든 사용자가 액세스할 수 있습니다.
예를 들어 조직이 Kafka Connect 클러스터 및 커넥터를 사용하여 고객 데이터베이스에서 중앙 데이터베이스로 중요한 데이터를 스트리밍한다고 가정합니다. 관리자는 구성 공급자 플러그인을 사용하여 고객 데이터베이스 및 데이터베이스 연결 세부 정보 및 인증 자격 증명과 같은 중앙 데이터베이스를 연결하는 것과 관련된 중요한 정보를 저장합니다. 구성 공급자는 이러한 민감한 정보가 권한이 없는 사용자에게 노출되지 않도록 보호합니다. 그러나 Kafka Connect API에 액세스할 수 있는 사용자는 관리자의 동의 없이 고객 데이터베이스에 대한 액세스 권한을 계속 받을 수 있습니다. 페이크 데이터베이스를 설정하고 연결하도록 커넥터를 구성하여 이 작업을 수행할 수 있습니다. 그런 다음 고객 데이터베이스를 가리키도록 커넥터 구성을 수정하지만 데이터를 중앙 데이터베이스로 전송하는 대신 페이크 데이터베이스로 보냅니다. 페이크 데이터베이스에 연결하도록 커넥터를 구성하면 구성 공급자에 안전하게 저장되더라도 고객 데이터베이스에 연결하기 위한 로그인 세부 정보와 인증 정보가 가로채어집니다.
KafkaConnector 사용자 지정 리소스를 사용하는 경우 기본적으로 OpenShift RBAC 규칙에 따라 OpenShift 클러스터 관리자만 커넥터를 변경할 수 있습니다. 비 클러스터 관리자를 지정하여 Apache Kafka 리소스의 Streams를 관리할 수도 있습니다. Kafka Connect 구성에서 KafkaConnector 리소스를 활성화하면 Cluster Operator에서 Kafka Connect REST API를 사용하여 직접 변경한 내용을 되돌립니다. KafkaConnector 리소스를 사용하지 않는 경우 기본 RBAC 규칙에서 Kafka Connect API에 대한 액세스를 제한하지 않습니다. OpenShift RBAC를 사용하여 Kafka Connect REST API에 대한 직접 액세스를 제한하려면 KafkaConnector 리소스를 활성화하고 사용해야 합니다.
보안을 강화하려면 Kafka Connect API에 대해 다음 속성을 구성하는 것이 좋습니다.
org.apache.kafka.disallowed.login.modules(Kafka 3.4 이상) 비보안 로그인 모듈을 사용하지 않도록
org.apache.kafka.disallowed.login.modulesJava 시스템 속성을 설정합니다. 예를 들어com.sun.security.auth.module.JndiLoginModule을 지정하면 KafkaJndiLoginModule을 사용할 수 없습니다.로그인 모듈 비활성화를 위한 설정 예
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 # ...
6.5.6. Kafka Connect API를 사용하여 KafkaConnector 사용자 정의 리소스 사용으로 전환 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect API를 사용하여 KafkaConnector 사용자 정의 리소스를 사용하여 커넥터를 관리할 수 있습니다. 전환하려면 표시된 순서대로 다음을 수행합니다.
-
구성과 함께
KafkaConnector리소스를 배포하여 커넥터 인스턴스를 생성합니다. -
strimzi.io/use-connector-resources주석을true로 설정하여 Kafka Connect 구성에서KafkaConnector리소스를 활성화합니다.
KafkaConnector 리소스를 생성하기 전에 활성화하면 모든 커넥터를 삭제합니다.
KafkaConnector 리소스를 사용하여 Kafka Connect API를 사용하여 전환하려면 먼저 Kafka Connect 구성에서 KafkaConnector 리소스를 활성화하는 주석을 제거합니다. 그러지 않으면 Kafka Connect REST API를 사용하여 직접 변경한 수동 변경 사항은 Cluster Operator에서 되돌립니다.
전환을 수행할 때 KafkaConnect 리소스의 상태를 확인합니다. metadata.generation (현재 배포 버전)의 값은 status.observedGeneration (리소스의 최신 조정)과 일치해야 합니다. Kafka Connect 클러스터가 준비 되면 KafkaConnector 리소스를 삭제할 수 있습니다.
6.6. Kafka MirrorMaker 배포 링크 복사링크가 클립보드에 복사되었습니다!
Kafka MirrorMaker는 데이터 센터 내의 두 개 이상의 Kafka 클러스터 간에 데이터를 복제합니다. 이 프로세스를 Kafka 파티션 복제 개념과 혼동하지 않도록 미러링이라고 합니다. MirrorMaker는 소스 클러스터의 메시지를 사용하고 해당 메시지를 대상 클러스터에 다시 게시합니다.
클러스터 간에 데이터 복제는 다음이 필요한 시나리오를 지원합니다.
- 시스템 장애 발생 시 데이터 복구
- 중앙 집중식 분석을 위해 여러 소스 클러스터에서 데이터 통합
- 특정 클러스터에 대한 데이터 액세스 제한
- 대기 시간을 개선하기 위해 특정 위치에서 데이터 제공
6.6.1. OpenShift 클러스터에 Kafka MirrorMaker 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Kafka MirrorMaker 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.
배포에서는 YAML 파일을 사용하여 배포된 MirrorMaker 버전에 따라 KafkaMirrorMaker 또는 KafkaMirrorMaker2 리소스를 생성하는 사양을 제공합니다. MirrorMaker 2는 Kafka Connect를 기반으로 하며 구성 속성을 사용합니다.
Kafka MirrorMaker 1 (문서에서 MirrorMaker 라고도 함)은 Apache Kafka 3.0.0에서 더 이상 사용되지 않으며 Apache Kafka 4.0.0에서 제거됩니다. 결과적으로 Kafka MirrorMaker 1을 배포하는 데 사용되는 KafkaMirrorMaker 사용자 정의 리소스는 Apache Kafka용 Streams에서도 더 이상 사용되지 않습니다. KafkaMirrorMaker 리소스는 Apache Kafka 4.0.0을 채택할 때 Apache Kafka용 Streams에서 제거됩니다. 대신 KafkaMirrorMaker2 사용자 정의 리소스를 IdentityReplicationPolicy 와 함께 사용합니다.
Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.
-
examples/mirror-maker/kafka-mirror-maker.yaml -
examples/mirror-maker/kafka-mirror-maker-2.yaml
동일한 대상 Kafka 클러스터를 사용하여 병렬로 실행되도록 MirrorMaker 2 클러스터를 배포하는 경우 각 인스턴스에서 내부 Kafka Connect 항목에 고유한 이름을 사용해야 합니다. 이렇게 하려면 기본값을 대체하도록 각 MirrorMaker 2 인스턴스를 구성합니다.
사전 요구 사항
프로세스
Kafka MirrorMaker를 OpenShift 클러스터에 배포합니다.
MirrorMaker의 경우:
oc apply -f examples/mirror-maker/kafka-mirror-maker.yamlMirrorMaker 2:
oc apply -f examples/mirror-maker/kafka-mirror-maker-2.yaml배포 상태를 확인합니다.
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 1my-mirror-maker는 Kafka MirrorMaker 클러스터의 이름입니다.my-mm2-cluster는 Kafka MirrorMaker 2 클러스터의 이름입니다.Pod ID는 생성된 각 pod를 식별합니다.
기본 배포를 사용하면 단일 MirrorMaker 또는 MirrorMaker 2 Pod를 설치합니다.
READY는 ready/expected 복제본 수를 표시합니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.6.2. Kafka MirrorMaker 2 클러스터 리소스 목록 링크 복사링크가 클립보드에 복사되었습니다!
다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.
- <mirrormaker2_cluster_name>-mirrormaker2
다음 MirrorMaker 2 리소스에 지정된 이름입니다.
- MirrorMaker 2 작업자 노드 Pod를 생성하는 StrimziPodSet.
- MirrorMaker 2 Pod에 안정적인 DNS 이름을 제공하는 헤드리스 서비스입니다.
- MirrorMaker 2 Pod에서 사용하는 서비스 계정입니다.
- MirrorMaker 2 작업자 노드에 대해 구성된 Pod 중단 예산입니다.
- MirrorMaker 2 REST API에 대한 액세스를 관리하는 네트워크 정책입니다.
- <mirrormaker2_cluster_name>-mirrormaker2-<pod_id>
- MirrorMaker 2 StrimziPodSet에서 생성된 Pod
- <mirrormaker2_cluster_name>-mirrormaker2-api
- MirrorMaker 2 클러스터를 관리하기 위해 REST 인터페이스를 노출하는 서비스입니다.
- <mirrormaker2_cluster_name>-mirrormaker2-config
- MirrorMaker 2 보조 구성이 포함되어 있으며 MirrorMaker 2 Pod에서 볼륨으로 마운트되는 ConfigMap입니다.
- strimzi-<namespace-name>-<mirrormaker2_cluster_name>-mirrormaker2-init
- MirrorMaker 2 클러스터에서 사용하는 클러스터 역할 바인딩입니다.
6.6.3. Kafka MirrorMaker 클러스터 리소스 목록 링크 복사링크가 클립보드에 복사되었습니다!
다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.
- <mirrormaker_cluster_name>-mirror-maker
다음 MirrorMaker 리소스에 지정된 이름입니다.
- MirrorMaker Pod 생성을 담당하는 배포입니다.
- MirrorMaker 노드에서 사용하는 서비스 계정입니다.
- MirrorMaker 작업자 노드에 대해 구성된 Pod 중단 예산입니다.
- <mirrormaker_cluster_name>-mirror-maker-config
- MirrorMaker의 보조 구성이 포함된 ConfigMap은 MirrorMaker Pod에서 볼륨으로 마운트됩니다.
6.7. Kafka 브리지 배포 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브리지는 HTTP 기반 클라이언트를 Kafka 클러스터와 통합하는 API를 제공합니다.
6.7.1. OpenShift 클러스터에 Kafka 브리지 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Kafka Bridge 클러스터를 OpenShift 클러스터에 배포하는 방법을 보여줍니다.
배포에서는 YAML 파일을 사용하여 KafkaBridge 리소스를 생성하는 사양을 제공합니다.
Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.
-
examples/bridge/kafka-bridge.yaml
사전 요구 사항
프로세스
OpenShift 클러스터에 Kafka 브리지를 배포합니다.
oc apply -f examples/bridge/kafka-bridge.yaml배포 상태를 확인합니다.
oc get pods -n <my_cluster_operator_namespace>출력에 배포 이름 및 준비 상태 표시
NAME READY STATUS RESTARTS my-bridge-bridge-<pod_id> 1/1 Running 0my-bridge는 Kafka Bridge 클러스터의 이름입니다.Pod ID는 생성된 각 pod를 식별합니다.
기본 배포를 사용하면 단일 Kafka Bridge Pod를 설치합니다.
READY는 ready/expected 복제본 수를 표시합니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.7.2. 로컬 머신에 Kafka 브리지 서비스 노출 링크 복사링크가 클립보드에 복사되었습니다!
포트 전달을 사용하여 Apache Kafka Bridge 서비스의 스트림을 http://localhost:8080 의 로컬 머신에 노출합니다.
포트 전달은 개발 및 테스트 목적으로만 적합합니다.
프로세스
OpenShift 클러스터에 있는 포드 이름을 나열합니다.
oc get pods -o name pod/kafka-consumer # ... pod/my-bridge-bridge-<pod_id>포트
8080의 Kafka 브리지 Pod에 연결합니다.oc port-forward pod/my-bridge-bridge-<pod_id> 8080:8080 &참고로컬 시스템의 포트 8080이 이미 사용 중인 경우
8008과 같은 대체 HTTP 포트를 사용합니다.
이제 API 요청이 로컬 머신의 포트 8080에서 Kafka Bridge Pod의 포트 8080으로 전달됩니다.
6.7.3. OpenShift 외부에서 Kafka 브리지 액세스 링크 복사링크가 클립보드에 복사되었습니다!
배포 후 동일한 OpenShift 클러스터에서 실행되는 애플리케이션에서만 Apache Kafka 브리지의 Streams에 액세스할 수 있습니다. 이러한 애플리케이션은 < kafka_bridge_name> -bridge-service 서비스를 사용하여 API에 액세스합니다.
OpenShift 클러스터 외부에서 실행 중인 애플리케이션에 Kafka 브리지를 액세스하려면 다음 기능 중 하나를 생성하여 수동으로 노출할 수 있습니다.
-
LoadBalancer또는NodePort유형 서비스 -
Ingress리소스(Kubernetes만 해당) - OpenShift 경로(OpenShift만 해당)
서비스를 생성하려면 < kafka_bridge_name> -bridge-service 서비스 의 선택기 에서 레이블을 사용하여 서비스에서 트래픽을 라우팅할 Pod를 구성합니다.
# ...
selector:
strimzi.io/cluster: kafka-bridge-name
strimzi.io/kind: KafkaBridge
#...
- 1
- OpenShift 클러스터의 Kafka Bridge 사용자 정의 리소스의 이름입니다.
6.7.4. Kafka Bridge 클러스터 리소스 목록 링크 복사링크가 클립보드에 복사되었습니다!
다음 리소스는 OpenShift 클러스터의 Cluster Operator에 의해 생성됩니다.
- <bridge_cluster_name>-bridge
- Kafka Bridge 작업자 노드 Pod를 생성합니다.
- <bridge_cluster_name>-bridge-service
- Kafka Bridge 클러스터의 REST 인터페이스를 노출하는 서비스입니다.
- <bridge_cluster_name>-bridge-config
- Kafka Bridge ancillary 구성이 포함되어 Kafka 브로커 Pod를 통해 볼륨으로 마운트되는 ConfigMap입니다.
- <bridge_cluster_name>-bridge
- Kafka Bridge 작업자 노드에 대해 구성된 Pod 중단 예산입니다.
6.8. Apache Kafka Operator용 Streams에 대한 대체 독립 실행형 배포 옵션 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator 및 User Operator의 독립 실행형 배포를 수행할 수 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터를 사용하는 경우 이러한 Operator의 독립 실행형 배포를 고려하십시오.
Operator를 OpenShift에 배포합니다. Kafka는 OpenShift 외부에서 실행할 수 있습니다. 예를 들어 Kafka를 관리 서비스로 사용할 수 있습니다. 독립 실행형 Operator의 배포 구성을 Kafka 클러스터의 주소와 일치하도록 조정합니다.
6.8.1. 독립 실행형 Topic Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 주제 관리를 위한 독립 실행형 구성 요소로 topic Operator를 unidirectional 모드로 배포하는 방법을 보여줍니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 Topic Operator를 사용할 수 있습니다. Unidirectional 주제 관리에서는 KafkaTopic 리소스를 통해서만 주제를 유지 관리합니다. 리디렉션되지 않은 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 을 참조하십시오. 또한 Topic Operator를 양방향 모드로 배포하기 위한 대체 구성도 표시됩니다.
독립 실행형 배포 파일은 Apache Kafka용 Streams와 함께 제공됩니다. 05-Deployment-strimzi-topic-operator.yaml 배포 파일을 사용하여 Topic Operator를 배포합니다. Kafka 클러스터에 연결하는 데 필요한 환경 변수를 추가하거나 설정합니다.
Topic Operator는 단일 네임스페이스에서 KafkaTopic 리소스를 감시합니다. Topic Operator 구성에서 조사할 네임스페이스 및 Kafka 클러스터에 대한 연결을 지정합니다. 단일 Topic Operator는 단일 네임스페이스를 조사할 수 있습니다. Topic Operator는 하나의 네임스페이스만 조사해야 합니다. 둘 이상의 Topic Operator를 사용하려면 각각 다른 네임스페이스를 조사하도록 구성합니다. 이러한 방식으로 다양한 Kafka 클러스터와 함께 Topic Operator를 사용할 수 있습니다.
사전 요구 사항
Topic Operator가 연결할 Kafka 클러스터를 실행하고 있습니다.
독립 실행형 Topic Operator가 연결에 대해 올바르게 구성된 경우 Kafka 클러스터는 베어 메탈 환경, 가상 머신 또는 관리형 클라우드 애플리케이션 서비스에서 실행할 수 있습니다.
프로세스
install/topic-operator/05-Deployment-strimzi-operator.yaml독립 실행형 배포 파일에서env속성을 편집합니다.독립 실행형 Topic Operator 배포 구성 예
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE1 valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS2 value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS3 value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS4 value: "120000" - name: STRIMZI_LOG_LEVEL5 value: INFO - name: STRIMZI_TLS_ENABLED6 value: "false" - name: STRIMZI_JAVA_OPTS7 value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES8 value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA9 value: "false" - name: STRIMZI_TLS_AUTH_ENABLED10 value: "false" - name: STRIMZI_SASL_ENABLED11 value: "false" - name: STRIMZI_SASL_USERNAME12 value: "admin" - name: STRIMZI_SASL_PASSWORD13 value: "password" - name: STRIMZI_SASL_MECHANISM14 value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL15 value: "SSL" - name: STRIMZI_USE_FINALIZERS value: "false"16 - 1
- Topic Operator에서
KafkaTopic리소스를 조사하는 OpenShift 네임스페이스입니다. Kafka 클러스터의 네임스페이스를 지정합니다. - 2
- Kafka 클러스터의 모든 브로커를 검색하고 연결할 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 다운된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
- 3
- Topic Operator에서 관리하는
KafkaTopic리소스를 식별하는 레이블입니다. 이는 Kafka 클러스터의 이름일 필요는 없습니다.KafkaTopic리소스에 할당된 레이블일 수 있습니다. Topic Operator를 두 개 이상 배포하는 경우 레이블은 각각 고유해야 합니다. 즉, 운영자는 동일한 리소스를 관리할 수 없습니다. - 4
- 주기적 조정 간격(밀리초)입니다. 기본값은
120000(2분)입니다. - 5
- 로깅 메시지를 출력하는 수준입니다. 수준을
ERROR,WARNING,INFO,DEBUG또는TRACE로 설정할 수 있습니다. - 6
- Kafka 브로커와 암호화된 통신에 대한 TLS 지원을 활성화합니다.
- 7
- (선택 사항) Topic Operator를 실행하는 JVM에서 사용하는 Java 옵션입니다.
- 8
- (선택 사항) Topic Operator에 설정된 디버깅(
-D) 옵션. - 9
- (선택 사항) TLS가
STRIMZI_TLS_ENABLED를 통해 활성화된 경우 신뢰 저장소 인증서 생성을 건너뜁니다. 이 환경 변수가 활성화된 경우 브로커는 TLS 인증서에 대해 신뢰할 수 있는 공개 인증 기관을 사용해야 합니다. 기본값은false입니다. - 10
- (선택 사항) mTLS 인증을 위한 키 저장소 인증서를 생성합니다. 이를
false로 설정하면 mTLS를 사용한 클라이언트 인증이 Kafka 브로커에 대해 비활성화됩니다. 기본값은true입니다. - 11
- (선택 사항) Kafka 브로커에 연결할 때 클라이언트 인증에 대해 SASL 지원을 활성화합니다. 기본값은
false입니다. - 12
- (선택 사항) 클라이언트 인증에 대한 SASL 사용자 이름입니다. SASL이
STRIMZI_SASL_ENABLED를 통해 활성화된 경우에만 필수입니다. - 13
- (선택 사항) 클라이언트 인증에 대한 SASL 암호입니다. SASL이
STRIMZI_SASL_ENABLED를 통해 활성화된 경우에만 필수입니다. - 14
- (선택 사항) 클라이언트 인증을 위한 SASL 메커니즘입니다. SASL이
STRIMZI_SASL_ENABLED를 통해 활성화된 경우에만 필수입니다. 값을일반,scram-sha-256또는scram-sha-512로 설정할 수 있습니다. - 15
- (선택 사항) Kafka 브로커와의 통신에 사용되는 보안 프로토콜입니다. 기본값은 "PLAINTEXT"입니다. 값을
PLAINTEXT,SSL,SASL_PLAINTEXT또는SASL_SSL로 설정할 수 있습니다. - 16
-
공용 인증 기관의 인증서를 사용하는 Kafka 브로커에 연결하려면
STRIMZI_PUBLIC_CA를true로 설정합니다. 예를 들어 Amazon AWS MSK 서비스를 사용하는 경우 이 속성을true로 설정합니다. STRIMZI_TLS_ENABLED환경 변수를 사용하여 mTLS를 활성화한 경우 Kafka 클러스터에 대한 연결을 인증하는 데 사용되는 키 저장소 및 신뢰 저장소를 지정합니다.mTLS 구성의 예
# .... env: - name: STRIMZI_TRUSTSTORE_LOCATION1 value: "/path/to/truststore.p12" - name: STRIMZI_TRUSTSTORE_PASSWORD2 value: "TRUSTSTORE-PASSWORD" - name: STRIMZI_KEYSTORE_LOCATION3 value: "/path/to/keystore.p12" - name: STRIMZI_KEYSTORE_PASSWORD4 value: "KEYSTORE-PASSWORD" # ...-
배포구성에 변경 사항을 적용하여 Topic Operator를 배포합니다. 배포 상태를 확인합니다.
oc get deployments출력에 배포 이름 및 준비 상태 표시
NAME READY UP-TO-DATE AVAILABLE strimzi-topic-operator 1/1 1 1READY는 ready/expected 복제본 수를 표시합니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.8.1.1. 양방향 주제 관리를 위한 독립 실행형 Topic Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
양방향 주제 관리에는 클러스터 관리를 위한 Zoo Cryostat가 필요하며 KafkaTopic 리소스와 Kafka 클러스터 내에서 주제를 유지 관리합니다. 이 모드에서 Topic Operator를 사용하여 전환하려면 다음 단계에 따라 독립 실행형 Topic Operator를 배포합니다.
Topic Operator가 단방향 모드로 실행되도록 하는 기능 게이트가 일반 가용성으로 진행되므로 양방향 모드가 단계적으로 표시됩니다. 이 전환은 특히 KRaft 모드에서 Kafka를 지원하는 데 사용되는 사용자 환경을 개선하기 위한 것입니다.
현재 독립 실행형 Topic Operator 배포를 취소합니다.
Topic Operator가 다시 배포할 때 선택한
KafkaTopic리소스를 유지합니다.독립 실행형 Topic Operator의
배포구성을 편집하여 Zoo Cryostat 관련 환경 변수를 포함합니다.-
STRIMZI_ZOOKEEPER_CONNECT -
STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS -
TC_ZK_CONNECTION_TIMEOUT_MS STRIMZI_USE_ZOOKEEPER_TOPIC_STORE이는 양방향 주제 Operator가 사용되는지 여부를 정의하는 Zoo Cryostat 변수의 존재 또는 부재입니다. Unidirectional 주제 관리에서는 Zoo Cryostat를 사용하지 않습니다. Zoo Cryostat 환경 변수가 없으면 리디렉션되지 않은 주제 Operator가 사용됩니다. 그렇지 않으면 양방향 주제 Operator가 사용됩니다.
단방향 모드에서 사용되지 않는 기타 환경 변수는 필요한 경우 추가할 수 있습니다.
-
STRIMZI_REASSIGN_THROTTLE -
STRIMZI_REASSIGN_VERIFY_INTERVAL_MS -
STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS -
STRIMZI_TOPICS_PATH -
STRIMZI_STORE_TOPIC -
STRIMZI_STORE_NAME -
STRIMZI_APPLICATION_ID STRIMZI_STALE_RESULT_TIMEOUT_MS양방향 주제 관리를 위한 독립 실행형 Topic Operator 배포 구성의 예
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_ZOOKEEPER_CONNECT1 value: my-cluster-zookeeper-client:2181 - name: STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS2 value: "18000" - name: STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS3 value: "6" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" - name: STRIMZI_LOG_LEVEL value: INFO - name: STRIMZI_TLS_ENABLED value: "false" - name: STRIMZI_JAVA_OPTS value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA value: "false" - name: STRIMZI_TLS_AUTH_ENABLED value: "false" - name: STRIMZI_SASL_ENABLED value: "false" - name: STRIMZI_SASL_USERNAME value: "admin" - name: STRIMZI_SASL_PASSWORD value: "password" - name: STRIMZI_SASL_MECHANISM value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL value: "SSL"- 1
- (zookeeper) Zoo Cryostat 클러스터에 연결할 주소의 호스트 및 포트 쌍입니다. Kafka 클러스터가 사용 중인 것과 동일한 Zoo Cryostat 클러스터여야 합니다.
- 2
- (zookeeper) Zoo Cryostat 세션 시간 제한 시간(밀리초)입니다. 기본값은
18000(18초)입니다. - 3
- Kafka에서 주제 메타데이터를 가져오는 시도 횟수입니다. 각 시도 사이의 시간은 지수 백오프로 정의됩니다. 파티션 또는 복제본 수로 인해 주제 생성에 더 많은 시간이 걸리는 경우 이 값을 늘리는 것이 좋습니다. 기본값은
6번 시도입니다.
-
-
배포구성에 변경 사항을 적용하여 Topic Operator를 배포합니다.
6.8.2. 독립 실행형 User Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 사용자 관리를 위한 독립 실행형 구성 요소로 User Operator를 배포하는 방법을 보여줍니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 User Operator를 사용할 수 있습니다.
독립 실행형 배포는 모든 Kafka 클러스터에서 작동할 수 있습니다.
독립 실행형 배포 파일은 Apache Kafka용 Streams와 함께 제공됩니다. 05-Deployment-strimzi-user-operator.yaml 배포 파일을 사용하여 User Operator를 배포합니다. Kafka 클러스터에 연결하는 데 필요한 환경 변수를 추가하거나 설정합니다.
User Operator는 단일 네임스페이스에서 KafkaUser 리소스를 감시합니다. User Operator 구성에서 조사할 네임스페이스 및 Kafka 클러스터에 대한 연결을 지정합니다. 단일 User Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임 스페이스는 하나의 User Operator에서만 조사해야 합니다. 두 개 이상의 User Operator를 사용하려면 각각 다른 네임스페이스를 조사하도록 구성합니다. 이렇게 하면 여러 Kafka 클러스터에서 User Operator를 사용할 수 있습니다.
사전 요구 사항
User Operator가 연결할 수 있도록 Kafka 클러스터를 실행하고 있습니다.
독립 실행형 User Operator가 연결에 대해 올바르게 구성된 경우 Kafka 클러스터는 베어 메탈 환경, 가상 머신 또는 관리형 클라우드 애플리케이션 서비스에서 실행할 수 있습니다.
프로세스
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_NAMESPACE1 valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS2 value: my-kafka-bootstrap-address:9092 - name: STRIMZI_CA_CERT_NAME3 value: my-cluster-clients-ca-cert - name: STRIMZI_CA_KEY_NAME4 value: my-cluster-clients-ca - name: STRIMZI_LABELS5 value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS6 value: "120000" - name: STRIMZI_WORK_QUEUE_SIZE7 value: 10000 - name: STRIMZI_CONTROLLER_THREAD_POOL_SIZE8 value: 10 - name: STRIMZI_USER_OPERATIONS_THREAD_POOL_SIZE9 value: 4 - name: STRIMZI_LOG_LEVEL10 value: INFO - name: STRIMZI_GC_LOG_ENABLED11 value: "true" - name: STRIMZI_CA_VALIDITY12 value: "365" - name: STRIMZI_CA_RENEWAL13 value: "30" - name: STRIMZI_JAVA_OPTS14 value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES15 value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_SECRET_PREFIX16 value: "kafka-" - name: STRIMZI_ACLS_ADMIN_API_SUPPORTED17 value: "true" - name: STRIMZI_MAINTENANCE_TIME_WINDOWS18 value: '* * 8-10 * * ?;* * 14-15 * * ?' - name: STRIMZI_KAFKA_ADMIN_CLIENT_CONFIGURATION19 value: | default.api.timeout.ms=120000 request.timeout.ms=60000- 1
- User Operator가
KafkaUser리소스를 조사하는 OpenShift 네임스페이스입니다. 하나의 네임스페이스만 지정할 수 있습니다. - 2
- Kafka 클러스터의 모든 브로커를 검색하고 연결할 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 다운된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
- 3
- mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA(인증 기관)의 공개 키(
ca.crt) 값이 포함된 OpenShiftSecret. - 4
- mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA의 개인 키(
ca.key) 값이 포함된 OpenShift 보안입니다. - 5
- User Operator에서 관리하는
KafkaUser리소스를 식별하는 레이블입니다. 이는 Kafka 클러스터의 이름일 필요는 없습니다.KafkaUser리소스에 할당된 레이블일 수 있습니다. User Operator를 두 개 이상 배포하는 경우 레이블은 각각 고유해야 합니다. 즉, 운영자는 동일한 리소스를 관리할 수 없습니다. - 6
- 주기적 조정 간격(밀리초)입니다. 기본값은
120000(2분)입니다. - 7
- 컨트롤러 이벤트 큐의 크기입니다. 큐 크기는 User Operator가 작동할 것으로 예상되는 최대 사용자 수만큼 커야 합니다. 기본값은
1024입니다. - 8
- 사용자를 조정하기 위한 작업자 풀의 크기입니다. 더 큰 풀에는 더 많은 리소스가 필요할 수 있지만 더 많은
KafkaUser리소스도 처리합니다. 기본값은50입니다. - 9
- Kafka Admin API 및 OpenShift 작업의 작업자 풀 크기입니다. 더 큰 풀에는 더 많은 리소스가 필요할 수 있지만 더 많은
KafkaUser리소스도 처리합니다. 기본값은4입니다. - 10
- 로깅 메시지를 출력하는 수준입니다. 수준을
ERROR,WARNING,INFO,DEBUG또는TRACE로 설정할 수 있습니다. - 11
- 가비지 컬렉션(GC) 로깅을 활성화합니다. 기본값은
true입니다. - 12
- CA의 유효 기간입니다. 기본값은
365일입니다. - 13
- CA의 갱신 기간입니다. 갱신 기간은 현재 인증서의 만료 날짜로부터 역순으로 측정됩니다. 이전 인증서가 만료되기 전에 인증서 갱신을 시작하는 기본값은
30일입니다. - 14
- (선택 사항) User Operator를 실행하는 JVM에서 사용하는 Java 옵션
- 15
- (선택 사항) User Operator에 설정된 디버깅(
-D) 옵션 - 16
- (선택 사항) User Operator가 생성한 OpenShift 시크릿 이름에 대한 접두사입니다.
- 17
- (선택 사항) Kafka 클러스터가 Kafka 관리자 API를 사용하여 권한 부여 ACL 규칙 관리를 지원하는지 여부를 나타냅니다.
false로 설정하면 User Operator에서간단한권한 부여 ACL 규칙이 있는 모든 리소스를 거부합니다. 이렇게 하면 Kafka 클러스터 로그에서 불필요한 예외를 방지할 수 있습니다. 기본값은true입니다. - 18
- (선택 사항) 사용자 인증서가 갱신되는 유지 관리 시간을 정의하는 세미로 구분된 Cron Expression 목록입니다.
- 19
- (선택 사항) User Operator에서 사용하는 Kafka 관리 클라이언트를 속성 형식으로 구성하는 구성 옵션입니다.
mTLS를 사용하여 Kafka 클러스터에 연결하는 경우 연결을 인증하는 데 사용되는 보안을 지정합니다. 그렇지 않으면 다음 단계로 이동합니다.
mTLS 구성의 예
# .... env: - name: STRIMZI_CLUSTER_CA_CERT_SECRET_NAME1 value: my-cluster-cluster-ca-cert - name: STRIMZI_EO_KEY_SECRET_NAME2 value: my-cluster-entity-operator-certs # ..."User Operator를 배포합니다.
oc create -f install/user-operator배포 상태를 확인합니다.
oc get deployments출력에 배포 이름 및 준비 상태 표시
NAME READY UP-TO-DATE AVAILABLE strimzi-user-operator 1/1 1 1READY는 ready/expected 복제본 수를 표시합니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
7장. 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 운영자의 스트림은 기능 게이트를 사용하여 특정 기능 및 기능을 활성화하거나 비활성화합니다. 기능 게이트를 활성화하면 연결된 Operator의 동작이 변경되어 Apache Kafka 배포용 Streams에 해당 기능이 도입됩니다.
기능 게이트의 목적은 완전히 채택되기 전에 기능의 평가판 및 테스트를 용이하게 하는 것입니다. 기능 게이트의 상태(활성화 또는 비활성화)는 완성 수준에 따라 기본적으로 다를 수 있습니다.
기능 게이트 자격으로, 일반 가용성(GA)에 도달하여 기본적으로 활성화된 상태로 전환되며 Apache Kafka 배포를 위한 Streams의 영구 일부가 됩니다. GA 단계의 기능 게이트는 비활성화할 수 없습니다.
7.1. 숙련된 기능 게이트(GA) 링크 복사링크가 클립보드에 복사되었습니다!
중개 기능 게이트는 GA(General Availability)에 도달했으며 영구적으로 활성화된 기능입니다.
7.1.1. ControlPlaneListener 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
ControlPlaneListener 기능 게이트는 데이터 복제 및 조정을 위해 리스너를 구분합니다.
- Kafka 컨트롤러와 브로커 간 연결은 포트 9090에서 내부 컨트롤 플레인 리스너 를 사용합니다.
- 브로커 간 데이터와 Apache Kafka Operator, Cruise Control 또는 Kafka Exporter의 스트림 간 내부 연결 복제는 포트 9091에서 복제 리스너 를 사용합니다.
ControlPlaneListener 기능 게이트를 영구적으로 활성화하면 Apache Kafka 1.7 및 이전 버전의 Streams와 Apache Kafka 2.3 이상의 스트림 간 직접 업그레이드 또는 다운그레이드를 사용할 수 없습니다. 먼저 Apache Kafka 버전용 Streams for Apache Kafka 버전 중 하나를 통해 ControlPlaneListener 기능 게이트를 비활성화한 다음, 기능 게이트가 활성화된 상태에서 대상 버전으로 다운그레이드 또는 업그레이드해야 합니다.
7.1.2. ServiceAccountPatching 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
ServiceAccountPatching 기능 게이트를 사용하면 Cluster Operator가 항상 서비스 계정을 조정하고 필요한 경우 이를 업데이트합니다. 예를 들어 사용자 지정 리소스의 template 속성을 사용하여 서비스 계정 레이블 또는 주석을 변경하면 Operator가 기존 서비스 계정 리소스에서 해당 레이블을 자동으로 업데이트합니다.
7.1.3. UseStrimziPodSets 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
UseStrimziPodSets 기능 게이트는 Kafka 및 Zoo Cryostat Pod를 관리하기 위한 StrimziPodSet 사용자 정의 리소스를 도입하여 OpenShift StatefulSet 리소스의 사용을 대체합니다.
UseStrimziPodSets 기능 게이트를 영구적으로 활성화하면 Apache Kafka 2.5 이상에서 Apache Kafka 2.0 또는 이전 버전의 Streams로 다운그레이드할 수 없습니다. 먼저 Apache Kafka 버전용 Streams for Apache Kafka 버전 중 하나를 다운로드하고, UseStrimziPodSets 기능 게이트를 비활성화한 다음 Apache Kafka 2.0 또는 이전 버전의 Streams로 다운그레이드해야 합니다.
7.1.4. StableConnectIdentities 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
StableConnectIdentities 기능 게이트는 Kafka Connect 및 Kafka MirrorMaker 2 Pod를 관리하기 위한 StrimziPodSet 사용자 정의 리소스를 도입하여 OpenShift 배포 리소스 사용을 대체합니다.
StrimziPodSet 리소스는 Pod에 롤링 업그레이드 중에 변경되지 않는 안정적인 이름과 안정적인 주소를 제공하여 OpenShift Deployment 리소스 사용을 대체합니다.
StableConnectIdentities 기능 게이트를 영구적으로 활성화하면 Apache Kafka 2.7 이상에서 Apache Kafka 2.7 이상에서 Apache Kafka 2.3 또는 이전 버전의 Streams로 다운그레이드를 직접 다운그레이드할 수 없습니다. 먼저 Apache Kafka 버전용 Streams for Apache Kafka 버전 중 하나를 통해 StableConnectIdentities 기능 게이트를 비활성화한 다음 Apache Kafka 2.3 또는 이전 버전의 Streams로 다운그레이드해야 합니다.
7.2. 안정적인 기능 게이트(베타) 링크 복사링크가 클립보드에 복사되었습니다!
안정적인 기능 게이트는 베타 수준의 완성도에 도달했으며 일반적으로 모든 사용자에 대해 기본적으로 활성화됩니다. 안정적인 기능 게이트는 프로덕션 환경에서 사용할 수 있지만 여전히 비활성화할 수 있습니다.
7.2.1. UseKRaft 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
UseKRaft 기능 게이트의 기본 상태가 enabled.
UseKRaft 기능 게이트는 Zoo Cryostat 없이 KRaft(Kafka Raft 메타데이터) 모드에 Kafka 클러스터를 배포합니다. Zookeeper 및 KRaft는 Kafka 클러스터에서 메타데이터 및 조정 작업을 관리하는 데 사용되는 메커니즘입니다. Kraft 모드에서는 Zoo Cryostat와 같은 외부 조정 서비스가 필요하지 않습니다. KRaft 모드에서 Kafka 노드는 브로커, 컨트롤러 또는 둘 다의 역할을 수행합니다. 파티션 간에 복제되는 메타데이터를 집합적으로 관리합니다. 컨트롤러는 작업을 조정하고 클러스터 상태를 유지보수해야 합니다.
UseKRaft 기능 게이트를 사용하려면 KafkaNodePools 기능 게이트도 활성화해야 합니다. KRaft 모드에서 Kafka 클러스터를 배포하려면 KafkaNodePool 리소스를 사용해야 합니다. 자세한 내용 및 예제는 6.3.1절. “노드 풀을 사용하여 Kafka 클러스터 배포” 에서 참조하십시오. KRaft 모드를 사용하는 Kafka 사용자 정의 리소스에는 주석 strimzi.io/kraft="enabled" 도 있어야 합니다.
현재 Apache Kafka 스트림의 KRaft 모드에는 다음과 같은 주요 제한 사항이 있습니다.
-
Unidirectional Topic Operator만 KRaft 모드에서 지원됩니다. Bidirectional Topic Operator는 지원되지 않으며
UnidirectionalTopicOperator기능 게이트를 비활성화하면spec.entityOperator.topicOperator속성을Kafka사용자 정의 리소스에서 제거해야 합니다. -
JBOD 스토리지는 지원되지 않습니다.
유형: jbod스토리지를 사용할 수 있지만 JBOD 배열은 하나의 디스크만 포함할 수 있습니다. - KRaft 컨트롤러 전용 노드 확장은 지원되지 않습니다.
UseKRaft 기능 게이트 비활성화
UseKRaft 기능 게이트를 비활성화하려면 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 지정합니다.
7.2.2. KafkaNodePools 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
KafkaNodePools 기능 게이트의 기본 상태가 enabled 입니다.
KafkaNodePools 기능 게이트는 Apache Kafka 노드의 다양한 풀 을 구성할 수 있는 새로운 KafkaNodePool 사용자 정의 리소스를 도입합니다.
노드 풀은 Kafka 클러스터 내의 별도의 Kafka 노드 그룹을 나타냅니다. 각 풀에는 복제본 수, 스토리지 구성 및 할당된 역할 목록과 같은 필수 설정이 포함된 고유한 구성이 있습니다. 컨트롤러 역할, 브로커 역할 또는 두 역할을 .spec.roles 필드의 풀의 모든 노드에 할당할 수 있습니다. Zoo Cryostat 기반 Apache Kafka 클러스터와 함께 사용하는 경우 브로커 역할로 설정해야 합니다. UseKRaft 기능 게이트와 함께 사용하면 브로커,컨트롤러 또는 둘 다로 설정할 수 있습니다.
또한 노드 풀은 리소스 요청 및 제한, Java JVM 옵션 및 리소스 템플릿을 자체적으로 구성할 수 있습니다. KafkaNodePool 리소스에 설정되지 않은 구성 옵션은 Kafka 사용자 정의 리소스에서 상속됩니다.
KafkaNodePool 리소스는 strimzi.io/cluster 레이블을 사용하여 속하는 Kafka 클러스터를 나타냅니다. 레이블은 Kafka 사용자 정의 리소스의 이름으로 설정해야 합니다.
KafkaNodePool 리소스의 예는 Apache Kafka용 Streams에서 제공하는 구성 파일 예제에서 확인할 수 있습니다.
KafkaNodePools 기능 게이트 비활성화
KafkaNodePools 기능 게이트를 비활성화하려면 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 지정합니다. 노드 풀을 사용하는 Kafka 사용자 정의 리소스에는 주석 strimzi.io/node-pools: enabled 도 있어야 합니다.
KafkaNodePools에서 다운그레이드
클러스터가 이미 사용자 정의 리소스를 사용하고 있으며 이를 지원하지 않거나 Kafka NodePoolKafkaNodePools 기능 게이트를 비활성화하여 이전 버전의 Apache Kafka로 다운그레이드하려면 먼저 KafkaNodePool 사용자 정의 리소스만 사용하여 KafkaNodePool 사용자 정의 리소스 관리로 마이그레이션해야 합니다.
7.2.3. UnidirectionalTopicOperator 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
UnidirectionalTopicOperator 기능 게이트의 기본 상태가 enabled 입니다.
UnidirectionalTopicOperator 기능 게이트는 KafkaTopic 리소스를 사용하여 Kafka 주제를 생성하기 위한 단방향 주제 관리 모드를 도입합니다. Unidirectional 모드는 클러스터 관리를 위해 KRaft를 사용하는 것과 호환됩니다. unidirectional 모드에서는 KafkaTopic 리소스를 사용하여 Kafka 주제를 생성한 다음 Topic Operator에서 관리합니다. KafkaTopic 리소스 외부의 항목에 대한 구성이 취소됩니다. 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 을 참조하십시오.
UnidirectionalTopicOperator 기능 게이트 비활성화
UnidirectionalTopicOperator 기능 게이트를 비활성화하려면 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수에 -UnidirectionalTopicOperator 를 지정합니다.
7.3. 초기 액세스 기능 게이트(Alpha) 링크 복사링크가 클립보드에 복사되었습니다!
초기 액세스 기능 게이트는 아직 베타 단계에 도달하지 않았으며 기본적으로 비활성화되어 있습니다. 초기 액세스 기능 게이트는 기능이 Apache Kafka용 Streams에 영구적으로 통합되기 전에 평가를 수행할 수 있는 기회를 제공합니다.
현재 알파 단계에 기능 게이트가 없습니다.
7.4. 기능 게이트 활성화 링크 복사링크가 클립보드에 복사되었습니다!
기능 게이트의 기본 상태를 수정하려면 Operator의 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 사용합니다. 이 단일 환경 변수를 사용하여 여러 기능 게이트를 수정할 수 있습니다. 쉼표로 구분된 기능 게이트 이름 및 접두사 목록을 지정합니다. + 접두사는 기능 게이트와 - 접두사를 활성화합니다.
FeatureGate1 을 활성화하고 FeatureGate2를 비활성화하는 기능 게이트 구성의 예
env:
- name: STRIMZI_FEATURE_GATES
value: +FeatureGate1,-FeatureGate2
7.5. 기능 게이트 릴리스 링크 복사링크가 클립보드에 복사되었습니다!
기능 게이트에는 3 단계의 완성 단계가 있습니다.
- alpha - 일반적으로 기본적으로 비활성화되어 있습니다.
- 베타 - 일반적으로 기본적으로 사용 가능
- GA(GA) - 일반적으로 항상 활성화되어 있음
알파 스테이지 기능은 실험적이거나 불안정할 수 있고, 변경될 수 있거나, 프로덕션 사용을 위해 충분히 테스트되지 않을 수 있습니다. 베타 단계 기능은 잘 테스트되었으며 해당 기능은 변경되지 않습니다. GA 단계 기능은 안정적이며 향후에는 변경되지 않아야 합니다. 알파 및 베타 단계 기능은 유용할 수 없는 경우 제거됩니다.
-
ControlPlaneListener기능 게이트는 Apache Kafka 2.3의 Streams의 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다. -
ServiceAccountPatching기능 게이트는 Apache Kafka 2.3의 Streams에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다. -
UseStrimziPodSets기능 게이트가 Apache Kafka 2.5용 Streams의 GA 단계로 이동했으며 StatefulSets에 대한 지원이 완전히 제거됩니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다. -
StableConnectIdentities기능 게이트는 Apache Kafka 2.7의 Streams에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다. -
UseKRaft기능 게이트는 베타 단계에 있으며 기본적으로 활성화되어 있습니다. -
KafkaNodePools기능 게이트는 베타 단계에 있으며 기본적으로 활성화되어 있습니다. -
UnidirectionalTopicOperator기능 게이트는 베타 단계에 있으며 기본적으로 활성화되어 있습니다.
기능 게이트는 GA에 도달하면 제거될 수 있습니다. 즉, 이 기능은 Apache Kafka 코어용 Streams에 통합되었으며 더 이상 비활성화할 수 없습니다.
| 기능 게이트 | Alpha | beta | GA |
|---|---|---|---|
|
| 1.8 | 2.0 | 2.3 |
|
| 1.8 | 2.0 | 2.3 |
|
| 2.1 | 2.3 | 2.5 |
|
| 2.2 | 2.7 | - |
|
| 2.4 | 2.6 | 2.7 |
|
| 2.5 | 2.7 | - |
|
| 2.5 | 2.7 | - |
기능 게이트가 활성화된 경우 Apache Kafka 버전의 특정 스트림에서 업그레이드하거나 다운그레이드하기 전에 비활성화해야 할 수 있습니다(또는 먼저 비활성화할 수 있는 Apache Kafka의 Streams 버전으로 업그레이드 / 다운그레이드). 다음 표는 Apache Kafka 버전의 Streams를 업그레이드하거나 다운그레이드할 때 비활성화해야 하는 기능 게이트를 보여줍니다.
| 기능 게이트 비활성화 | Apache Kafka 버전의 Streams에서 업그레이드 | Apache Kafka 버전의 Streams로 다운그레이드 |
|---|---|---|
|
| 1.7 및 이전 버전 | 1.7 및 이전 버전 |
|
| - | 2.0 및 이전 버전 |
|
| - | 2.3 및 이전 버전 |
8장. KRaft 모드로 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 메타데이터 관리에 Zoo Cryostat를 사용하는 경우 KRaft 모드에서 Kafka를 사용하여 마이그레이션할 수 있습니다. Kraft 모드는 분산 조정을 위해 Zoo Cryostat를 대체하여 향상된 안정성, 확장성 및 처리량을 제공합니다.
마이그레이션 중에 컨트롤러 노드의 쿼럼을 노드 풀로 설치하여 클러스터 관리를 위해 Zoo Cryostat를 대체합니다. strimzi.io/kraft="migration" 주석을 적용하여 클러스터 구성에서 KRaft 마이그레이션을 활성화합니다. 마이그레이션이 완료되면 strimzi.io/kraft="enabled" 주석을 사용하여 브로커를 KRaft를 사용하여 마이그레이션 모드로 전환합니다.
마이그레이션을 시작하기 전에 여러 제한 사항이 있으므로 환경에서 KRaft 모드에서 Kafka를 지원할 수 있는지 확인합니다. 또한 다음과 같습니다.
- 마이그레이션은 브로커 및 컨트롤러로 이중 역할을 하는 노드에서는 전용 컨트롤러 노드에서만 지원됩니다.
- 마이그레이션 프로세스 전반에 걸쳐 Zoo Cryostat 및 컨트롤러 노드는 일정 기간 동안 병렬로 작동하므로 클러스터에 충분한 컴퓨팅 리소스가 필요합니다.
사전 요구 사항
- Kafka 3.7.0 이상에서는 Apache Kafka 2.7 이상용 Streams를 사용해야 합니다. 이전 버전의 Apache Kafka 또는 Apache Kafka를 사용하는 경우 KRaft 모드로 마이그레이션하기 전에 업그레이드하십시오.
KRaft 모드에서 지원되지 않으므로 Zoo Cryostat 기반 배포가 다음 없이 작동하는지 확인합니다.
- 양방향 모드로 실행되는 Topic Operator입니다. 이 모드는 unidirectional 모드이거나 비활성화되어 있어야 합니다.
-
JBOD 스토리지.
jbod스토리지 유형을 사용할 수 있지만 JBOD 배열에는 하나의 디스크만 포함되어야 합니다.
- Kafka 클러스터를 관리하는 Cluster Operator가 실행 중입니다.
Kafka 클러스터 배포는 Kafka 노드 풀을 사용합니다.
Zoo Cryostat 기반 클러스터에서 노드 풀을 이미 사용 중인 경우 마이그레이션할 준비가 된 것입니다. 그렇지 않은 경우 노드 풀을 사용하도록 클러스터를 마이그레이션할 수 있습니다. 클러스터가 노드 풀을 사용하지 않을 때 마이그레이션하려면 브로커 역할이 할당되고 이름이
kafka인KafkaNodePool리소스 구성에브로커를 포함해야 합니다. 노드 풀 지원은strimzi.io/node-pools: enabled주석을 사용하여Kafka리소스 구성에서 활성화됩니다.
이 절차에서 Kafka 클러스터 이름은 my-project 네임스페이스에 있는 my-cluster 입니다. 생성된 컨트롤러 노드 풀의 이름은 controller 입니다. 브로커의 노드 풀을 kafka 라고 합니다.
프로세스
Kafka 클러스터의 경우
컨트롤러역할을 사용하여 노드 풀을 생성합니다.노드 풀은 컨트롤러 노드의 쿼럼을 클러스터에 추가합니다.
컨트롤러 노드 풀에 대한 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: controller labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"참고마이그레이션의 경우 브로커 및 컨트롤러 역할을 공유하는 노드 풀을 사용할 수 없습니다.
새
KafkaNodePool리소스를 적용하여 컨트롤러를 생성합니다.Cluster Operator 로그에서 Zoo Cryostat 기반 환경에서 컨트롤러 사용과 관련된 오류는 Cluster Operator 로그에서 확인할 수 있습니다. 오류는 조정을 차단할 수 있습니다. 이를 방지하려면 다음 단계를 즉시 수행합니다.
strimzi.io/kraft주석을 migration로 설정하여Kafka리소스에서 KRaft마이그레이션을 활성화합니다.oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwriteKRaft 마이그레이션 활성화
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="migration" # ...Kafka리소스 구성에 주석을 적용하면 마이그레이션이 시작됩니다.컨트롤러가 시작되고 브로커가 롤아웃되었는지 확인합니다.
oc get pods -n my-project출력에 브로커 및 컨트롤러 노드 풀의 노드가 표시됩니다.
NAME READY STATUS RESTARTS my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-controller-3 1/1 Running 0 my-cluster-controller-4 1/1 Running 0 my-cluster-controller-5 1/1 Running 0 # ...마이그레이션 상태를 확인합니다.
oc get kafka my-cluster -n my-project -w메타데이터 상태 업데이트
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigrationMETADATA STATE는 Kafka 메타데이터 및 조정 작업을 관리하는 데 사용되는 메커니즘을 보여줍니다. 마이그레이션이 시작될 때이는 Zoo Cryostat입니다.-
Zookeeper는 메타데이터가 Zoo Cryostat에만 저장되는 초기 상태입니다. -
KRaftMigration은 마이그레이션이 진행 중인 상태입니다. Zoo Cryostat를 KRaft로 마이그레이션하는 플래그( Zookeeper.metadata.migration.enable)가 브로커에 추가되어 컨트롤러에 등록하도록 롤아웃됩니다. 이 시점에서 마이그레이션은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다. -
KRaftDualWriting은 Kafka 클러스터가 KRaft 클러스터로 작동할 때 상태이지만 메타데이터가 Kafka 및 Zoo Cryostat 모두에 저장됩니다. 브로커는 마이그레이션을 활성화하기 위해 플래그를 제거하기 위해 두 번 롤아웃됩니다. -
KRaftPostMigration은 브로커에 대해 KRaft 모드가 활성화된 경우의 상태입니다. 메타데이터는 여전히 Kafka 및 Zoo Cryostat에 저장됩니다.
마이그레이션 상태는
Kafka리소스의status.kafkaMetadataState속성에서도 표시됩니다.주의이 시점에서 Zoo Cryostat를 사용하여 롤백 할 수 있습니다. 다음 단계는 KRaft를 활성화하는 것입니다. KRaft를 활성화한 후에는 롤백을 수행할 수 없습니다.
-
메타데이터 상태가
KRaftPostMigration에 도달하면strimzi.io/kraft주석을enabled로 설정하여Kafka리소스 구성에서 KRaft를 활성화합니다.oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwriteKRaft 마이그레이션 활성화
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="enabled" # ...전체 KRaft 모드로 이동 상태를 확인합니다.
oc get kafka my-cluster -n my-project -w메타데이터 상태 업데이트
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration my-cluster ... PreKRaft my-cluster ... KRaft-
PreKRaft는 모든 Zoo Cryostat 관련 리소스가 자동으로 삭제되는 상태입니다. -
Kraft는
KRaft마이그레이션이 완료되면 최종 상태(컨트롤러가 롤아웃된 후)입니다.
참고Zoo Cryostat에 대해
deleteClaim을 구성하는 방법에 따라 PVC(영구 볼륨 클레임) 및 PV(영구 볼륨)는 삭제되지 않을 수 있습니다.deleteClaim은 클러스터가 제거될 때 PVC가 삭제되는지 여부를 지정합니다. 기본값은false입니다.-
Kafka리소스에서 모든 Zoo Cryostat 관련 구성을 제거합니다.존재하는 경우 다음을 제거할 수 있습니다.
-
log.message.format.version -
inter.broker.protocol.version spec.zookeeper.*속성log.message.format.version및inter.broker.protocol.version을 제거하면 브로커와 컨트롤러가 다시 롤백됩니다. Zoo Cryostat 속성을 제거하면 KRaft-operated 클러스터에 존재하는 Zoo Cryostat 구성과 관련된 경고 메시지가 제거됩니다.
-
마이그레이션에서 롤백 수행
Kafka 리소스에서 KRaft를 활성화하여 마이그레이션이 완료되고 상태가 KRaft 상태로 이동하기 전에 다음과 같이 롤백 작업을 수행할 수 있습니다.
strimzi.io/kraft="rollback"주석을Kafka리소스에 적용하여 브로커를 롤백합니다.oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwriteKRaft 마이그레이션 롤백
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="rollback" # ...이를 수행하려면 마이그레이션 프로세스가
KRaftPostMigration상태에 있어야 합니다. 브로커가 롤백되어 Zoo Cryostat에 다시 연결할 수 있으며 상태가KRaftDualWriting으로 돌아갑니다.컨트롤러 노드 풀을 삭제합니다.
oc delete KafkaNodePool controller -n my-projectstrimzi.io/kraft="disabled"주석을Kafka리소스에 적용하여 메타데이터 상태를 Zoo Cryostat로반환합니다.oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwriteZoo Cryostat를 사용하여 다시 전환
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="disabled" # ...
9장. 배포 구성 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 사용자 정의 리소스의 Streams를 사용하여 정확한 요구 사항에 맞게 Apache Kafka 배포를 위한 Streams를 구성하고 관리합니다. Apache Kafka의 스트림은 각 릴리스와 함께 사용자 정의 리소스의 예를 제공하여 지원되는 Kafka 구성 요소의 인스턴스를 구성하고 생성할 수 있습니다. 특정 요구 사항에 따라 추가 기능을 포함하도록 사용자 정의 리소스를 구성하여 배포를 미세 조정합니다. Kafka Connect 커넥터의 특정 구성 영역, 즉 메트릭, 로깅 및 외부 구성의 경우 ConfigMap 리소스를 사용할 수도 있습니다. ConfigMap 리소스를 사용하여 구성을 통합하면 유지 관리를 중앙에서 관리할 수 있습니다. 구성 공급자를 사용하여 Kafka Connect 커넥터 구성에 대한 인증 정보를 제공하는 것이 좋습니다. 외부 소스에서 구성을 로드할 수도 있습니다.
사용자 지정 리소스를 사용하여 다음 구성 요소의 인스턴스를 구성하고 생성합니다.
- Kafka 클러스터
- Kafka Connect 클러스터
- Kafka MirrorMaker
- Kafka Bridge
- 크루즈 제어
사용자 지정 리소스 구성을 사용하여 인스턴스를 관리하거나 배포를 수정하여 추가 기능을 도입할 수도 있습니다. 여기에는 다음을 지원하는 구성이 포함될 수 있습니다.
- 노드 풀 지정
- Kafka 브로커에 대한 클라이언트 액세스 보안
- 클러스터 외부에서 Kafka 브로커에 액세스
- 주제 생성
- 사용자 생성(클라이언트)
- 기능 게이트 제어
- 로깅 빈도 변경
- 리소스 제한 및 요청 할당
- Streams for Apache Kafka Drain cleaner, Cruise Control 또는 distributed tracing과 같은 기능을 소개합니다.
Apache Kafka 사용자 정의 리소스 API 참조 는 구성에서 사용할 수 있는 속성을 설명합니다.
사용자 지정 리소스에 적용되는 레이블은 클러스터를 구성하는 OpenShift 리소스에도 적용됩니다. 필요에 따라 리소스에 레이블을 지정할 수 있는 편리한 메커니즘을 제공합니다.
사용자 정의 리소스 구성 파일에 변경 사항 적용
spec 속성을 사용하여 사용자 정의 리소스에 구성을 추가합니다. 구성을 추가한 후 oc 를 사용하여 사용자 정의 리소스 구성 파일에 변경 사항을 적용할 수 있습니다.
oc apply -f <kafka_configuration_file>
9.1. 설정 파일 예제 사용 링크 복사링크가 클립보드에 복사되었습니다!
지원되는 추가 구성을 통합하여 배포를 추가로 개선합니다. 구성 파일의 예는 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 다운로드할 수 있는 릴리스 아티팩트와 함께 제공됩니다.
예제 파일에는 기본적으로 사용자 정의 리소스의 필수 속성 및 값만 포함됩니다. oc 명령줄 툴을 사용하여 예제를 다운로드하고 적용할 수 있습니다. 예제는 배포에 대한 자체 Kafka 구성 요소 구성을 빌드할 때 시작점 역할을 할 수 있습니다.
Operator를 사용하여 Apache Kafka용 Streams를 설치한 경우에도 예제 파일을 다운로드하여 구성을 업로드하는 데 사용할 수 있습니다.
릴리스 아티팩트에는 구성 예제가 포함된 예제 디렉터리가 포함되어 있습니다.
Apache Kafka용 Streams와 함께 제공되는 구성 파일의 예
examples
├── user
├── topic
├── security
│ ├── tls-auth
│ ├── scram-sha-512-auth
│ └── keycloak-authorization
├── mirror-maker
├── metrics
├── kafka
│ └── nodepools
├── cruise-control
├── connect
└── bridge
- 1
- 사용자 Operator가 관리하는
KafkaUser사용자 정의 리소스 구성 - 2
- Topic Operator에서 관리하는
KafkaTopic사용자 정의 리소스 구성 - 3
- Kafka 구성 요소에 대한 인증 및 권한 부여 구성입니다. TLS 및 SCRAM-SHA-512 인증에 대한 예제 구성을 포함합니다. Red Hat Single Sign-On 예제에는
Kafka사용자 정의 리소스 구성 및 Red Hat Single Sign-On 영역 사양이 포함되어 있습니다. 이 예제를 사용하여 Red Hat Single Sign-On 권한 부여 서비스를 시도할 수 있습니다.oauth인증 및keycloak인증 메트릭이 있는 예도 있습니다. - 4
- Mirror Maker 배포에 대한
Kafka사용자 정의 리소스 구성 복제 정책 및 동기화 빈도에 대한 구성 예를 포함합니다. - 5
- Prometheus 설치 및 Grafana 대시보드 파일을 포함한 지표 구성입니다.
- 6
Kafka배포에 대한 Kafka 사용자 정의 리소스 구성입니다. 임시 또는 영구 단일 또는 다중 노드 배포에 대한 예제 구성이 포함됩니다.- 7
- Kafka 클러스터의 Kafka 노드에 대한
KafkaNodePool구성 KRaft(Kafka Raft 메타데이터) 모드 또는 Zoo Cryostat를 사용하는 클러스터의 노드 구성 예를 포함합니다. - 8
- Cruise Control에 대한 배포 구성이 포함된
Kafka사용자 정의 리소스 Cruise Control에서 최적화 제안을 생성하기 위해KafkaRebalance사용자 정의 리소스를 포함하며, 기본 또는 사용자 최적화 목표를 사용하는 예제 구성입니다. - 9
Kafka Connect배포에 대한 KafkaConnect 및KafkaConnector사용자 지정 리소스 구성입니다. 단일 또는 다중 노드 배포에 대한 예제 구성이 포함됩니다.- 10
Kafka Bridge배포에 대한 KafkaBridge 사용자 정의 리소스 구성
9.2. Kafka 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 사용자 정의 리소스의 사양 속성을 업데이트하여 Kafka 배포를 구성합니다.
Kafka를 구성할 뿐만 아니라 Zoo Cryostat 및 Apache Kafka Operator용 Streams에 대한 구성을 추가할 수 있습니다. 로깅 및 상태 점검과 같은 일반적인 구성 속성은 각 구성 요소에 대해 독립적으로 구성됩니다.
특히 중요한 구성 옵션은 다음과 같습니다.
- 리소스 요청(CPU / 메모리)
- 최대 및 최소 메모리 할당을 위한 JVM 옵션
- Kafka 브로커에 클라이언트를 연결하는 리스너(및 클라이언트 인증)
- 인증
- 스토리지
- Rack 인식
- 지표
- 클러스터 재조정을 위한 cruise Control
- KRaft 기반 Kafka 클러스터의 메타데이터 버전
- Zoo Cryostat 기반 Kafka 클러스터의 브랜드 간 프로토콜 버전
config의 .spec.kafka.metadataVersion 속성 또는 config 의 inter.broker.protocol.version 속성은 지정된 Kafka 버전 (spec.kafka.version)에서 지원하는 버전이어야 합니다. 속성은 Kafka 클러스터에서 사용되는 Kafka 메타데이터 또는 inter-broker 프로토콜 버전을 나타냅니다. 이러한 속성 중 하나가 구성에 설정되지 않은 경우 Cluster Operator는 버전을 사용된 Kafka 버전의 기본값으로 업데이트합니다.
지원되는 가장 오래된 메타데이터 버전은 3.3입니다. Kafka 버전보다 오래된 메타데이터 버전을 사용하면 일부 기능이 비활성화될 수 있습니다.
Kafka 클러스터 구성 옵션에 대한 자세한 내용은 Apache Kafka 사용자 정의 리소스 API 참조의 Streams 를 참조하십시오.
TLS 인증서 관리
Kafka를 배포할 때 Cluster Operator는 클러스터 내에서 암호화 및 인증을 활성화하기 위해 TLS 인증서를 자동으로 설정하고 갱신합니다. 필요한 경우 갱신 기간이 시작되기 전에 클러스터 및 클라이언트 CA 인증서를 수동으로 갱신할 수 있습니다. 클러스터 및 클라이언트 CA 인증서에서 사용하는 키를 교체할 수도 있습니다. 자세한 내용은 수동으로 CA 인증서 갱신 및 개인 키 교체를 참조하십시오.
Kafka 사용자 정의 리소스 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
replicas: 3
version: 3.7.0
logging:
type: inline
loggers:
kafka.root.logger.level: INFO
resources:
requests:
memory: 64Gi
cpu: "8"
limits:
memory: 64Gi
cpu: "12"
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
jvmOptions:
-Xms: 8192m
-Xmx: 8192m
image: my-org/my-image:latest
listeners:
- name: plain
port: 9092
type: internal
tls: false
configuration:
useServiceDnsDomain: true
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external1
port: 9094
type: route
tls: true
configuration:
brokerCertChainAndKey:
secretName: my-secret
certificate: my-certificate.crt
key: my-key.key
authorization:
type: simple
config:
auto.create.topics.enable: "false"
offsets.topic.replication.factor: 3
transaction.state.log.replication.factor: 3
transaction.state.log.min.isr: 2
default.replication.factor: 3
min.insync.replicas: 2
inter.broker.protocol.version: "3.7"
storage:
type: persistent-claim
size: 10000Gi
rack:
topologyKey: topology.kubernetes.io/zone
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
# ...
zookeeper:
replicas: 3
logging:
type: inline
loggers:
zookeeper.root.logger: INFO
resources:
requests:
memory: 8Gi
cpu: "2"
limits:
memory: 8Gi
cpu: "2"
jvmOptions:
-Xms: 4096m
-Xmx: 4096m
storage:
type: persistent-claim
size: 1000Gi
metricsConfig:
# ...
entityOperator:
tlsSidecar:
resources:
requests:
cpu: 200m
memory: 64Mi
limits:
cpu: 500m
memory: 128Mi
topicOperator:
watchedNamespace: my-topic-namespace
reconciliationIntervalSeconds: 60
logging:
type: inline
loggers:
rootLogger.level: INFO
resources:
requests:
memory: 512Mi
cpu: "1"
limits:
memory: 512Mi
cpu: "1"
userOperator:
watchedNamespace: my-topic-namespace
reconciliationIntervalSeconds: 60
logging:
type: inline
loggers:
rootLogger.level: INFO
resources:
requests:
memory: 512Mi
cpu: "1"
limits:
memory: 512Mi
cpu: "1"
kafkaExporter:
# ...
cruiseControl:
# ...
- 1
- 복제본 노드 수입니다.
- 2
- 업그레이드 절차에 따라 지원되는 버전으로 변경할 수 있는 Kafka 버전입니다.
- 3
- Kafka 로거 및 로그 수준은 ConfigMap을 통해 직접(
인라인) 또는 간접적으로(외부)에 추가됩니다. 사용자 정의 Log4j 구성은 ConfigMap의log4j.properties키 아래에 배치해야 합니다. Kafkakafka.root.logger.level로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다. - 4
- 지원되는 리소스(현재
cpu및memory) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다. - 5
- 컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
- 6
- Kafka를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
- 7
- ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
- 8
- 리스너는 클라이언트가 부트스트랩 주소를 통해 Kafka 클러스터에 연결하는 방법을 구성합니다. 리스너는 OpenShift 클러스터 내부 또는 외부에서 연결을 위해 내부 또는 외부 리스너로 구성됩니다.
- 9
- 리스너를 식별하는 이름입니다. Kafka 클러스터 내에서 고유해야 합니다.
- 10
- Kafka 내의 리스너에서 사용하는 포트 번호입니다. 포트 번호는 지정된 Kafka 클러스터 내에서 고유해야 합니다. 허용되는 포트 번호는 9092 이상이며, 이는 Prometheus 및 Cryostat에 이미 사용되는 포트 9404 및 9999를 제외하고 사용합니다. 리스너 유형에 따라 Kafka 클라이언트를 연결하는 포트 번호와 포트 번호가 동일하지 않을 수 있습니다.
- 11
internal또는cluster-ip로 지정된 리스너 유형(brokerClusterIP서비스를 사용하여 Kafka를 노출) 또는 외부 리스너의 경우경로(OpenShift만),로드 밸런서,nodeport또는ingress(Kubernetes만 해당)로 표시됩니다.- 12
- 각 리스너에 대해 TLS 암호화를 활성화합니다. 기본값은
false입니다.경로및수신유형 리스너의 경우true로 설정하여 TLS 암호화를 활성화해야 합니다. - 13
- 클러스터 서비스 접미사(일반적으로
.cluster.local)를 포함하여 정규화된 DNS 이름을 정의합니다. - 14
- mTLS, SCRAM-SHA-512 또는 토큰 기반 OAuth 2.0으로 지정된 리스너 인증 메커니즘
- 15
- 외부 리스너 구성은
경로,로드 밸런서또는nodeport를 통해 Kafka 클러스터가 OpenShift 외부에 노출되는 방법을 지정합니다. - 16
- 외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서에 대한 선택적 구성입니다.
brokerCert CryostatAndKey는 서버 인증서와 개인 키가 포함된 보안을 지정합니다.활성화된 TLS 암호화를 사용하여 모든 리스너에서 Kafka 리스너 인증서를 구성할 수 있습니다. - 17
- 권한 부여를 사용하면 Kafka 브로커에서 간단한 OAUTH 2.0 또는 OPA 인증을 사용할 수 있습니다. 간단한 인증에서는
AclAuthorizer및StandardAuthorizerKafka 플러그인을 사용합니다. - 18
- 브로커 구성. 표준 Apache Kafka 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
- 19
- 영구 볼륨의 스토리지 크기가 증가할 수 있으며 추가 볼륨이 JBOD 스토리지에 추가될 수 있습니다.
- 20
- 영구 스토리지에는 동적 볼륨 프로비저닝을 위한 스토리지 ID 및
와 같은 추가 구성 옵션이 있습니다.클래스 - 21
- 다양한 랙, 데이터 센터 또는 가용성 영역에 복제본을 분산하기 위한 랙 인식 구성입니다.
topologyKey는 랙 ID가 포함된 노드 레이블과 일치해야 합니다. 이 구성에 사용된 예제에서는 표준topology.kubernetes.io/zone레이블을 사용하는 영역을 지정합니다. - 22
- Prometheus 지표가 활성화되어 있습니다. 이 예에서는 Prometheus Cryostat Exporter(기본 지표 내보내기)에 대한 메트릭이 구성됩니다.
- 23
- Prometheus Cryostat 내보내기에 대한 구성이 포함된 ConfigMap을 참조하여 활성화되는 Prometheus 형식의 Grafana 대시보드로 메트릭을 내보내는 규칙입니다.
metricsConfig.valueFrom.configMapKeyRef.key아래에 빈 파일이 포함된 ConfigMap에 대한 참조를 사용하여 추가 구성 없이 메트릭을 활성화할 수 있습니다. - 24
- Kafka 구성과 유사한 속성을 포함하는 Zookeeper별 구성입니다.
- 25
- Zoo Cryostat 노드 수입니다. Zookeeper 클러스터 또는 ensembles는 일반적으로 홀수의 노드(일반적으로 3, 5 또는 7)로 실행됩니다. 유효한 쿼럼을 유지하려면 대부분의 노드를 사용할 수 있어야 합니다. Zoo Cryostat 클러스터가 쿼럼을 끊을 경우 클라이언트에 대한 응답이 중지되고 Kafka 브로커가 작동하지 않습니다. Apache Kafka의 Streams에 안정적이고 가용성이 높은 Zoo Cryostat 클러스터를 보유하는 것이 중요합니다.
- 26
- Zookeeper 로거 및 로그 수준.
- 27
- Entity Operator 구성 - Topic Operator 및 User Operator에 대한 구성을 지정합니다.
- 28
- 엔터티 Operator TLS 사이드카 구성. 엔터티 Operator는 Zoo Cryostat와의 보안 통신을 위해 TLS 사이드카를 사용합니다.
- 29
- Topic Operator 로거 및 로그 수준을 지정합니다. 이 예에서는
인라인로깅을 사용합니다. - 30
- 지정된 사용자 Operator 로거 및 로그 수준입니다.
- 31
- Kafka 내보내기 구성. Kafka 내보내기는 특히 소비자 지연 데이터의 Kafka 브로커에서 메트릭 데이터를 추출하기 위한 선택적 구성 요소입니다. Kafka Exporter가 제대로 작동하려면 소비자 그룹이 사용 중이어야 합니다.
- 32
- Kafka 클러스터를 재조정하는 데 사용되는 Cruise Control에 대한 선택적 구성입니다.
9.2.1. Kafka 정적 할당량 플러그인을 사용하여 브로커에 제한 설정 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 정적 할당량 플러그인을 사용하여 Kafka 클러스터의 브로커에 처리량 및 스토리지 제한을 설정합니다. Kafka 리소스를 구성하여 플러그인을 활성화하고 제한을 설정합니다. 브로커와 상호 작용하는 클라이언트에 제한을 두도록 바이트 비율 임계값 및 스토리지 할당량을 설정할 수 있습니다.
생산자 및 소비자 대역폭에 대한 바이트 비율 임계값을 설정할 수 있습니다. 총 제한은 브로커에 액세스하는 모든 클라이언트에 분산됩니다. 예를 들어 생산자를 위해 바이트 비율 임계값을 40MBps로 설정할 수 있습니다. 두 생산자가 실행 중인 경우 각각 처리량이 20MB로 제한됩니다.
스토리지 할당량은 소프트 제한과 하드 제한 간에 Kafka 디스크 스토리지 제한을 제한합니다. 제한은 사용 가능한 모든 디스크 공간에 적용됩니다. 생산자는 소프트 제한과 하드 제한 사이에 점진적으로 느려집니다. 제한을 통해 디스크가 너무 빨리 채워지고 용량을 초과할 수 있습니다. 전체 디스크로 인해 수정하기 어려운 문제가 발생할 수 있습니다. 하드 제한은 최대 스토리지 제한입니다.
JBOD 스토리지의 경우 제한이 모든 디스크에 적용됩니다. 브로커가 두 개의 1TB 디스크를 사용하고 할당량이 1.1TB인 경우 하나의 디스크가 채워지고 다른 디스크는 거의 비어 있습니다.
사전 요구 사항
- Kafka 클러스터를 관리하는 Cluster Operator가 실행 중입니다.
프로세스
Kafka리소스의 구성에 플러그인 속성을 추가합니다.플러그인 속성은 이 예제 구성에 표시됩니다.
Kafka 고정 할당량 플러그인 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... config: client.quota.callback.class: io.strimzi.kafka.quotas.StaticQuotaCallback1 client.quota.callback.static.produce: 10000002 client.quota.callback.static.fetch: 10000003 client.quota.callback.static.storage.soft: 4000000000004 client.quota.callback.static.storage.hard: 5000000000005 client.quota.callback.static.storage.check-interval: 56 리소스를 업데이트합니다.
oc apply -f <kafka_configuration_file>
9.2.2. 기본 Zoo Cryostat 구성 값 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams를 사용하여 Zoo Cryostat를 배포할 때 Apache Kafka에 대해 Streams에서 설정한 기본 구성 중 일부는 표준 Zoo Cryostat 기본값과 다릅니다. 이는 Apache Kafka용 Streams가 OpenShift 환경 내에서 Zoo Cryostat를 실행하는 데 최적화된 값을 사용하여 여러 Zoo Cryostat 속성을 설정하기 때문입니다.
Apache Kafka용 Streams의 키 Zoo Cryostat 속성에 대한 기본 구성은 다음과 같습니다.
| 속성 | 기본값 | 설명 |
|---|---|---|
|
| 2000 | 세션 시간 제한을 결정하는 단일 틱(밀리초)입니다. |
|
| 5 | 팔로워가 Zoo Cryostat 클러스터에서 리더로 대체될 수 있는 최대 틱 수입니다. |
|
| 2 | follower가 Zoo Cryostat 클러스터의 리더와 동기화되지 않을 수 있는 최대 틱 수입니다. |
|
| 1 |
|
|
| false | Zoo Cryostat 관리자 서버를 비활성화하려면 플래그를 지정합니다. admin 서버는 Apache Kafka용 Streams에서 사용되지 않습니다. |
Kafka 사용자 정의 리소스에서 zookeeper.config 로 기본값을 수정하면 Zoo Cryostat 클러스터의 동작 및 성능에 영향을 미칠 수 있습니다.
9.2.3. 주석을 사용하여 Kafka 노드 삭제 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 주석을 사용하여 기존 Kafka 노드를 삭제하는 방법을 설명합니다. Kafka 노드를 삭제하면 Kafka 브로커가 실행 중인 Pod 와 관련 PersistentVolumeClaim (클러스터가 영구 스토리지와 함께 배포된 경우)을 모두 삭제하는 것으로 구성됩니다. 삭제 후 Pod 및 관련 PersistentVolumeClaim 이 자동으로 다시 생성됩니다.
PersistentVolumeClaim 을 삭제하면 영구 데이터 손실이 발생할 수 있으며 클러스터의 가용성은 보장할 수 없습니다. 다음 절차는 스토리지 문제가 발생한 경우에만 수행해야 합니다.
사전 요구 사항
- 실행중인 Cluster Operator
프로세스
삭제할
Pod의 이름을 찾습니다.Kafka 브로커 Pod의 이름은 <
cluster_name>-kafka-<index_number>로 지정됩니다. 여기서 <index_number>는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다. 예를 들면my-cluster-kafka-0입니다.oc annotate를 사용하여 OpenShift에서Pod리소스에 주석을 답니다.oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/delete-pod-and-pvc="true"- 기본 영구 볼륨 클레임이 있는 주석이 달린 Pod가 삭제될 때 다음 조정을 기다린 후 다시 생성합니다.
9.2.4. 주석을 사용하여 Zoo Cryostat 노드 삭제 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 주석을 사용하여 기존 Zoo Cryostat 노드를 삭제하는 방법을 설명합니다. Zoo Cryostat 노드를 삭제하면 Zoo Cryostat가 실행 중인 Pod 와 관련 PersistentVolumeClaim (클러스터가 영구 스토리지와 함께 배포된 경우)을 모두 삭제하는 것으로 구성됩니다. 삭제 후 Pod 및 관련 PersistentVolumeClaim 이 자동으로 다시 생성됩니다.
PersistentVolumeClaim 을 삭제하면 영구 데이터 손실이 발생할 수 있으며 클러스터의 가용성은 보장할 수 없습니다. 다음 절차는 스토리지 문제가 발생한 경우에만 수행해야 합니다.
사전 요구 사항
- 실행중인 Cluster Operator
프로세스
삭제할
Pod의 이름을 찾습니다.Zookeeper Pod의 이름은 <
cluster_name>-zookeeper-<index_number>로 지정됩니다. 여기서 <index_number>는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다. 예를 들면my-cluster-zookeeper-0입니다.oc annotate를 사용하여 OpenShift에서Pod리소스에 주석을 답니다.oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/delete-pod-and-pvc="true"- 기본 영구 볼륨 클레임이 있는 주석이 달린 Pod가 삭제될 때 다음 조정을 기다린 후 다시 생성합니다.
9.3. 노드 풀 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaNodePool 사용자 정의 리소스의 spec 속성을 업데이트하여 노드 풀 배포를 구성합니다.
노드 풀은 Kafka 클러스터 내의 별도의 Kafka 노드 그룹을 나타냅니다. 각 풀에는 복제본, 역할 및 스토리지 할당 수에 대한 필수 설정이 포함된 고유한 구성이 있습니다.
선택적으로 다음 속성의 값을 지정할 수도 있습니다.
-
메모리 및 cpu 요청 및 제한을 지정하는
리소스 -
Pod 및 기타 OpenShift 리소스에 대한 사용자 정의 구성을 지정하는
템플릿 -
힙 크기, 런타임 및 기타 옵션에 대한 사용자 정의 JVM 구성을 지정하는
jvmOptions
Kafka 리소스는 Kafka 클러스터의 모든 노드에 대한 구성을 나타냅니다. KafkaNodePool 리소스는 노드 풀에서만 노드의 구성을 나타냅니다. 구성 속성이 KafkaNodePool 에 지정되지 않은 경우 Kafka 리소스에서 상속됩니다. 두 리소스에 모두 설정된 경우 KafkaNodePool 리소스에 지정된 구성이 우선합니다. 예를 들어 노드 풀과 Kafka 구성에 모두 jvmOptions 가 포함된 경우 노드 풀 구성에 지정된 값이 사용됩니다. -Xmx: 1024m 이 KafkaNodePool.spec.jvmOptions 및 -Xms: 512m 에 설정된 경우 Kafka.spec.kafka.jvmOptions 에서 노드는 노드 풀 구성의 값을 사용합니다.
Kafka 및 KafkaNodePool 스키마의 속성은 결합되지 않습니다. 명확히 하기 위해 KafkaNodePool.spec.template 에 podSet.metadata.labels 만 포함되어 있고 Kafka.spec.kafka.template 에 podSet.metadata.annotations 및 pod.metadata.labels 가 포함된 경우 노드 풀 구성에 템플릿 값이 있기 때문에 Kafka 구성의 템플릿 값이 무시됩니다.
노드 풀 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.
KRaft 모드를 사용하는 클러스터의 노드 풀 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: kraft-dual-role
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- controller
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
resources:
requests:
memory: 64Gi
cpu: "8"
limits:
memory: 64Gi
cpu: "12"
Kafka 리소스의 구성은 KRaft 모드에 적합해야 합니다. 현재 KRaft 모드에 는 여러 가지 제한 사항이 있습니다.
Zoo Cryostat를 사용하여 클러스터의 노드 풀 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-a
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
resources:
requests:
memory: 64Gi
cpu: "8"
limits:
memory: 64Gi
cpu: "12"
- 1
- 노드 풀의 노드에 대한 역할로, Zoo Cryostat와 함께 Kafka를 사용할 때만
브로커일 수 있습니다.
9.3.1. 확장 작업을 위해 노드 풀에 ID 할당 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 노드 풀에서 스케일링 작업을 수행할 때 Cluster Operator에서 고급 노드 ID 처리에 주석을 사용하는 방법을 설명합니다. 다음 ID를 사용하여 Cluster Operator 대신 사용할 노드 ID를 지정합니다. 이러한 방식으로 노드 ID를 관리하면 제어가 향상됩니다.
ID 범위를 추가하려면 KafkaNodePool 리소스에 다음 주석을 할당합니다.
-
Strimzi.io/next-node-ids는 새 브로커에 사용되는 다양한 ID를 추가합니다. -
Strimzi.io/remove-node-ids: 기존 브로커를 제거하기 위한 ID 범위 추가
개별 노드 ID, ID 범위 또는 둘 다의 조합을 지정할 수 있습니다. 예를 들어 Kafka 노드 풀을 확장하기 위해 [0, 1, 2, 10-20, 30] 의 범위를 지정할 수 있습니다. 이 형식을 사용하면 개별 노드 ID(0,1,2,30)와 다양한 ID(10-20)의 조합을 지정할 수 있습니다.
일반적인 시나리오에서는 스케일링을 위한 ID 범위와 축소 시 특정 노드를 제거하기 위해 단일 노드 ID를 지정할 수 있습니다.
이 절차에서는 다음과 같이 노드 풀에 확장 주석을 추가합니다.
-
pool-a에는 확장하기 위한 ID 범위가 할당됩니다. -
pool-b에는 축소를 위한 ID 범위가 할당됩니다.
스케일링 작업 중에 ID는 다음과 같이 사용됩니다.
- 스케일 업은 새 노드의 범위에서 사용 가능한 가장 낮은 ID를 선택합니다.
- 축소는 범위에서 사용 가능한 ID가 가장 높은 노드를 제거합니다.
노드 풀에서 할당된 노드 ID 시퀀스에 차이가 있는 경우 추가할 다음 노드에 격차를 채우는 ID가 할당됩니다.
주석은 모든 확장 작업 후에 업데이트할 필요가 없습니다. 사용되지 않는 ID는 다음 확장 이벤트에서 계속 유효합니다.
Cluster Operator를 사용하면 오름차순 또는 내림차순으로 ID 범위를 지정할 수 있으므로 노드가 스케일링되는 순서대로 정의할 수 있습니다. 예를 들어 확장 시 [1000-1999] 와 같은 범위를 지정할 수 있으며 새 노드에는 가장 낮은 ID 1000,1001,1002,1003 등이 할당됩니다. 반대로 축소할 때 [1999-1000] 과 같은 범위를 지정하여 다음 ID가 가장 높은 노드가 제거되도록 할 수 있습니다: 1003,1002,1001,1000 등.
주석을 사용하여 ID 범위를 지정하지 않으면 Cluster Operator는 스케일링 작업 중에 ID를 처리하기 위해 기본 동작을 따릅니다. 노드 ID는 0(영)에서 시작하고 Kafka 클러스터에서 순차적으로 실행됩니다. 다음으로 가장 낮은 ID가 새 노드에 할당됩니다. 노드 ID의 격차는 클러스터 전체에서 채워집니다. 즉 노드 풀 내에서 순차적으로 실행되지 않을 수 있습니다. 확장의 기본 동작은 클러스터에서 사용 가능한 다음 노드 ID를 추가하고 축소의 경우 사용 가능한 노드 ID가 가장 높은 노드 풀에서 노드를 제거하는 것입니다. 기본 접근 방식은 할당된 ID 범위가 잘못 포맷되거나 확장 범위가 ID가 부족하거나 축소 범위가 사용 중인 노드에 적용되지 않는 경우에도 적용됩니다.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
-
(선택 사항)
reserved.broker-max.id구성 속성을 사용하여 노드 풀 내에서 허용 가능한 노드 ID 범위를 확장합니다.
기본적으로 Apache Kafka는 노드 ID를 0에서 999 사이의 숫자로 제한합니다. 999보다 큰 노드 ID 값을 사용하려면 reserved.broker-max.id 구성 속성을 Kafka 사용자 정의 리소스에 추가하고 필요한 최대 노드 ID 값을 지정합니다.
이 예에서 최대 노드 ID는 10000으로 설정됩니다. 그러면 노드 ID를 해당 값까지 할당할 수 있습니다.
최대 노드 ID 번호 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
config:
reserved.broker.max.id: 10000
# ...
프로세스
다음 예와 같이 확장 또는 축소할 때 사용할 ID로 노드 풀에 주석을 답니다.
확장의 ID는 노드 풀
pool-a에 할당됩니다.확장에 ID 할당
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"이 범위에서 사용 가능한 가장 낮은 ID는
pool-a에 노드를 추가할 때 사용됩니다.축소할 ID는 노드 풀
pool-b에 할당됩니다.축소를 위한 ID 할당
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"pool-b를 축소할 때 이 범위에서 사용 가능한 가장 높은 ID가 제거됩니다.참고특정 노드를 제거하려면 축소 주석에 단일 노드 ID를 할당할 수 있습니다.
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[3]".이제 노드 풀을 확장할 수 있습니다.
자세한 내용은 다음을 참조하십시오.
조정 시 주석이 잘못 포맷되면 경고가 표시됩니다.
확장 작업을 수행한 후 더 이상 필요하지 않은 경우 주석을 제거할 수 있습니다.
확장을 위한 주석 제거
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids-축소할 주석 제거
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids-
9.3.2. 노드 풀에서 노드를 이동할 때 랙에 미치는 영향 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 랙 인식이 활성화된 경우 복제본을 다양한 랙, 데이터 센터 또는 가용성 영역에 분산할 수 있습니다. 노드 풀에서 노드를 이동할 때 특히 랙 인식과 관련하여 클러스터 토폴로지에 미치는 영향을 고려하십시오. 노드 풀(특히 순서가 부족)에서 특정 Pod를 제거하면 클러스터 토폴로지가 손상되거나 랙 간에 분산이 발생할 수 있습니다. 불균형은 노드 자체의 배포와 클러스터 내의 파티션 복제본 모두에 영향을 미칠 수 있습니다. 랙에서 노드 및 파티션이 균일하게 배포되면 Kafka 클러스터의 성능과 복원력에 영향을 미칠 수 있습니다.
랙에서 필요한 균형과 탄력성을 유지하기 위해 전략적으로 노드 제거를 계획합니다. strimzi.io/remove-node-ids 주석을 사용하여 특정 ID가 있는 노드를 주의해서 이동합니다. 랙에 파티션 복제본을 분배하고 가장 가까운 복제본에서 사용할 클라이언트가 손상되지 않도록 구성해야 합니다.
RackAwareGoal 과 함께 Cruise Control 및 KafkaRebalance 리소스를 사용하여 복제본을 다른 랙에 분산 상태로 유지합니다.
9.3.3. 노드 풀에 노드 추가 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 노드 풀을 확장하여 새 노드를 추가하는 방법을 설명합니다. 현재 확장은 전용 브로커로 실행되는 노드를 포함하는 브로커 전용 노드 풀에만 가능합니다.
이 절차에서는 노드 풀 풀에 대한 세 개의 노드로 시작합니다.
노드 풀의 Kafka 노드
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
노드 ID는 생성 시 노드 이름에 추가됩니다. 노드 ID가 3 인 my-cluster-pool-a-3 노드를 추가합니다.
이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- cruise Control은 Kafka와 함께 배포됩니다.
(선택 사항) 작업을 확장하려면 작업에서 사용할 노드 ID를 지정할 수 있습니다.
작업에 노드 ID 범위를 할당한 경우 추가되는 노드의 ID는 지정된 노드 순서에 따라 결정됩니다. 단일 노드 ID를 할당한 경우 노드가 지정된 ID로 추가됩니다. 그렇지 않으면 클러스터에서 사용 가능한 최소 노드 ID가 사용됩니다.
프로세스
노드 풀에 새 노드를 생성합니다.
예를 들어 노드 풀
pool-a에는 세 개의 복제본이 있습니다. 복제본 수를 늘려 노드를 추가합니다.oc scale kafkanodepool pool-a --replicas=4배포 상태를 확인하고 노드 풀의 포드가 생성되고 준비될 때까지 기다립니다(
1/1).oc get pods -n <my_cluster_operator_namespace>출력에 노드 풀의 Kafka 노드 4개가 표시됩니다.
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-a-3 1/1 Running 0노드 풀의 노드 수를 늘린 후 파티션을 다시 할당합니다.
노드 풀을 확장한 후 Cruise Control
add-brokers모드를 사용하여 기존 브로커에서 새로 추가된 브로커로 파티션 복제본을 이동합니다.Cruise Control을 사용하여 파티션 복제본 재할당
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: add-brokers brokers: [3]my-cluster-pool-a-3노드에 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.
9.3.4. 노드 풀에서 노드 제거 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 노드 풀을 축소하여 노드를 제거하는 방법을 설명합니다. 현재 축소는 전용 브로커로 실행되는 노드를 포함하는 브로커 전용 노드 풀에만 가능합니다.
이 절차에서는 노드 풀 풀 의 경우 4개의 노드로 시작합니다.
노드 풀의 Kafka 노드
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
my-cluster-pool-a-3 1/1 Running 0
노드 ID는 생성 시 노드 이름에 추가됩니다. 노드 ID가 3 인 my-cluster-pool-a-3 노드를 삭제합니다.
이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- cruise Control은 Kafka와 함께 배포됩니다.
(선택 사항) 작업 축소의 경우 작업에서 사용할 노드 ID를 지정할 수 있습니다.
작업에 노드 ID 범위를 할당한 경우 제거 중인 노드의 ID는 지정된 노드 순서에 따라 결정됩니다. 단일 노드 ID를 할당한 경우 지정된 ID가 있는 노드가 제거됩니다. 그렇지 않으면 노드 풀에서 사용 가능한 ID가 가장 높은 노드가 제거됩니다.
프로세스
노드 풀의 노드 수를 줄이기 전에 파티션을 다시 할당합니다.
노드 풀을 축소하기 전에 Cruise Control
remove-brokers모드를 사용하여 제거할 브로커에서 파티션 복제본을 이동합니다.Cruise Control을 사용하여 파티션 복제본 재할당
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [3]my-cluster-pool-a-3노드에서 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.재할당 프로세스가 완료되고 제거 중인 노드에 실시간 파티션이 없으면 노드 풀의 Kafka 노드 수를 줄입니다.
예를 들어 노드 풀
pool-a에는 4개의 복제본이 있습니다. 복제본 수를 줄여 노드를 제거합니다.oc scale kafkanodepool pool-a --replicas=3출력에 노드 풀의 Kafka 노드 3개가 표시되어 있습니다.
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-0 1/1 Running 0 my-cluster-pool-b-kafka-1 1/1 Running 0 my-cluster-pool-b-kafka-2 1/1 Running 0
9.3.5. 노드 풀 간에 노드 이동 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 다운타임 없이 소스와 대상 Kafka 노드 풀 간에 노드를 이동하는 방법을 설명합니다. 대상 노드 풀에 새 노드를 생성하고 파티션을 다시 할당하여 소스 노드 풀의 이전 노드에서 데이터를 이동합니다. 새 노드의 복제본이 동기화되면 이전 노드를 삭제할 수 있습니다.
이 절차에서는 두 개의 노드 풀로 시작합니다.
-
pool-a(복제 3개)는 대상 노드 풀입니다. -
pool-b에 4개의 복제본이 있는 것은 소스 노드 풀입니다.
풀 을 확장하고 파티션을 다시 할당하고 pool-b 를 축소하면 다음이 생성됩니다.
-
pool-a및 4개의 복제본 -
pool-b및 세 개의 복제본
이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- cruise Control은 Kafka와 함께 배포됩니다.
(선택 사항) 작업 확장 및 축소 의 경우 사용할 노드 ID 범위를 지정할 수 있습니다.
작업에 노드 ID를 할당한 경우 추가 또는 제거 중인 노드의 ID는 지정된 노드 순서에 따라 결정됩니다. 그렇지 않으면 클러스터에서 사용 가능한 최소 노드 ID가 사용되고 노드 풀에서 사용 가능한 ID가 가장 높은 노드가 제거됩니다.
프로세스
대상 노드 풀에 새 노드를 생성합니다.
예를 들어 노드 풀
pool-a에는 세 개의 복제본이 있습니다. 복제본 수를 늘려 노드를 추가합니다.oc scale kafkanodepool pool-a --replicas=4배포 상태를 확인하고 노드 풀의 포드가 생성되고 준비될 때까지 기다립니다(
1/1).oc get pods -n <my_cluster_operator_namespace>출력에는 소스 및 대상 노드 풀의 Kafka 노드 4개가 표시됩니다.
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-4 1/1 Running 0 my-cluster-pool-a-7 1/1 Running 0 my-cluster-pool-b-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0 my-cluster-pool-b-6 1/1 Running 0노드 ID는 생성 시 노드 이름에 추가됩니다. 노드 ID가
7인my-cluster-pool-a-7노드를 추가합니다.이전 노드의 파티션을 새 노드에 다시 할당합니다.
소스 노드 풀을 축소하기 전에 Cruise Control
remove-brokers모드를 사용하여 제거할 브로커에서 파티션 복제본을 이동합니다.Cruise Control을 사용하여 파티션 복제본 재할당
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [6]my-cluster-pool-b-6노드에서 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.재할당 프로세스가 완료되면 소스 노드 풀의 Kafka 노드 수를 줄입니다.
예를 들어 노드 풀
pool-b에는 4개의 복제본이 있습니다. 복제본 수를 줄여 노드를 제거합니다.oc scale kafkanodepool pool-b --replicas=3풀 내에서 ID가 가장 높은 (6) 노드가 제거됩니다.
출력에 소스 노드 풀의 Kafka 노드 3개가 표시되어 있습니다.
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-2 1/1 Running 0 my-cluster-pool-b-kafka-3 1/1 Running 0 my-cluster-pool-b-kafka-5 1/1 Running 0
9.3.6. 노드 풀 역할 변경 링크 복사링크가 클립보드에 복사되었습니다!
노드 풀은 KRaft 모드에서 작동하는 Kafka 클러스터( Kafka Raft 메타데이터 사용)와 함께 사용하거나 메타데이터 관리에 Zoo Cryostat를 사용할 수 있습니다. KRaft 모드를 사용하는 경우 노드 풀의 모든 노드가 브로커, 컨트롤러 또는 둘 다로 작동하도록 역할을 지정할 수 있습니다. Zoo Cryostat를 사용하는 경우 노드는 브로커로만 설정해야 합니다.
특정 상황에서는 노드 풀에 할당된 역할을 변경해야 할 수 있습니다. 예를 들어 이중 브로커 및 컨트롤러 역할을 수행하는 노드가 포함된 노드 풀이 있고 두 노드 풀 간에 역할을 분할하도록 결정할 수 있습니다. 이 경우 브로커로만 작동하는 노드를 사용하여 새 노드 풀을 생성한 다음 이중 역할 노드의 파티션을 새 브로커에 다시 할당합니다. 그런 다음 기존 노드 풀을 컨트롤러 전용 역할로 전환할 수 있습니다.
컨트롤러 전용 및 브로커 전용 역할이 있는 노드 풀에서 이중 브로커 및 컨트롤러 역할을 수행하는 노드가 포함된 노드 풀로 이동하여 역방향 작업을 수행할 수도 있습니다. 이 경우 기존 컨트롤러 전용 노드 풀에 broker 역할을 추가하고 브로커 전용 노드의 파티션을 듀얼 역할 노드에 다시 할당한 다음 broker-only 노드 풀을 삭제합니다.
노드 풀 구성에서 브로커 역할을 제거할 때 Kafka에서 파티션을 자동으로 다시 할당하지 않습니다. 브로커 역할을 제거하기 전에 노드가 컨트롤러 전용 역할로 변경해도 파티션이 할당되지 않았는지 확인합니다. 파티션이 할당되면 변경 사항이 발생하지 않습니다. 브로커 역할을 제거하기 전에 노드에 복제본이 남아 있지 않아야 합니다. 역할을 변경하기 전에 파티션을 다시 할당하는 가장 좋은 방법은 remove-brokers 모드에서 Cruise Control 최적화 제안을 적용하는 것입니다. 자세한 내용은 19.6절. “최적화 제안 생성”의 내용을 참조하십시오.
9.3.7. 별도의 브로커 및 컨트롤러 역할로 전환 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 별도의 역할이 있는 노드 풀 사용으로 전환하는 방법을 설명합니다. Kafka 클러스터에서 컨트롤러 및 브로커 역할이 결합된 노드 풀을 사용하는 경우 별도의 역할이 있는 두 개의 노드 풀을 사용하여 전환할 수 있습니다. 이렇게 하려면 브로커 전용 역할이 있는 노드 풀로 파티션 복제본을 이동하도록 클러스터를 재조정한 다음 이전 노드 풀을 컨트롤러 전용 역할로 전환합니다.
이 절차에서는 controller 및 broker 역할이 있는 노드 풀 풀(a )으로 시작합니다.
듀얼 역할 노드 풀
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-a
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- controller
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 20Gi
deleteClaim: false
# ...
노드 풀에는 세 개의 노드가 있습니다.
노드 풀의 Kafka 노드
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
각 노드는 브로커 및 컨트롤러의 결합된 역할을 수행합니다. 브로커로만 작동하는 노드 3개를 사용하여 pool-b 라는 두 번째 노드 풀을 생성합니다.
이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.
프로세스
브로커역할을 사용하여 노드 풀을 생성합니다.노드 풀 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-b labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ...새 노드 풀에는 세 개의 노드도 있습니다. 브로커 전용 노드 풀이 이미 있는 경우 이 단계를 건너뛸 수 있습니다.
-
새
KafkaNodePool리소스를 적용하여 브로커를 생성합니다. 배포 상태를 확인하고 노드 풀의 포드가 생성되고 준비될 때까지 기다립니다(
1/1).oc get pods -n <my_cluster_operator_namespace>출력에서 두 노드 풀에서 실행 중인 Pod 표시
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-4 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0노드 ID는 생성 시 노드 이름에 추가됩니다.
Cruise Control
remove-brokers모드를 사용하여 이중 역할 노드에서 새로 추가된 브로커에 파티션 복제본을 다시 할당합니다.Cruise Control을 사용하여 파티션 복제본 재할당
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [0, 1, 2]재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.
참고노드가 컨트롤러 전용 역할로 변경되면 파티션이 할당되지 않습니다.
Kafka리소스의status.conditions는 변경을 방지하는 이벤트에 대한 세부 정보를 제공합니다.원래 결합된 역할이 있는 노드 풀에서
브로커역할을 제거합니다.컨트롤러로 전환된 듀얼 역할 노드
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false # ...- 노드 풀이 컨트롤러 전용 역할로 전환되도록 구성 변경을 적용합니다.
9.3.8. 이중 역할 노드로 전환 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 broker-only 및 controller-only 역할이 있는 별도의 노드 풀에서 듀얼 역할 노드 풀을 사용하는 방법을 설명합니다. Kafka 클러스터에서 전용 컨트롤러 및 브로커 노드가 있는 노드 풀을 사용하는 경우 두 역할이 모두 있는 단일 노드 풀을 사용하도록 전환할 수 있습니다. 이렇게 하려면 controller 전용 노드 풀에 broker 역할을 추가하고 파티션 복제본을 듀얼 역할 노드 풀로 이동한 다음 이전 브로커 전용 노드 풀을 삭제하도록 클러스터를 재조정합니다.
이 절차에서는 브로커 역할만 있는 controller 역할과 )으로 시작합니다.
pool-b 만 있는 두 개의 노드 풀 풀(a
단일 역할 노드 풀
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-a
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- controller
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-b
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
Kafka 클러스터에는 6개의 노드가 있습니다.
노드 풀의 Kafka 노드
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
my-cluster-pool-b-3 1/1 Running 0
my-cluster-pool-b-4 1/1 Running 0
my-cluster-pool-b-5 1/1 Running 0
pool-a 노드는 controller 역할을 수행합니다. pool-b 노드는 브로커 역할을 수행합니다.
이 프로세스 중에 파티션 복제본이 있는 노드의 ID가 변경됩니다. 노드 ID를 참조하는 종속 항목을 고려하십시오.
프로세스
노드 풀
pool-a를 편집하고broker역할을 추가합니다.노드 풀 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ...상태를 확인하고 노드 풀의 포드가 재시작될 때까지 기다린 후 준비합니다(
1/1).oc get pods -n <my_cluster_operator_namespace>출력에서 두 노드 풀에서 실행 중인 Pod 표시
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-4 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0노드 ID는 생성 시 노드 이름에 추가됩니다.
Cruise Control
remove-brokers모드를 사용하여 브로커 전용 노드에서 듀얼 역할 노드에 파티션 복제본을 다시 할당합니다.Cruise Control을 사용하여 파티션 복제본 재할당
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [3, 4, 5]재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.
이전 브로커 전용 노드가 있는
pool-b노드 풀을 제거합니다.oc delete kafkanodepool pool-b -n <my_cluster_operator_namespace>
9.3.9. 노드 풀을 사용하여 스토리지 관리 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams의 스토리지 관리는 일반적으로 간단하며 설정할 때 거의 변경되지 않아도 되지만 스토리지 구성을 수정해야 하는 상황이 있을 수 있습니다. 노드 풀은 새 스토리지 요구 사항을 지정하는 별도의 노드 풀을 설정할 수 있으므로 이 프로세스를 단순화합니다.
이 절차에서는 세 개의 노드가 포함된 pool-a 노드 풀의 스토리지를 생성하고 관리합니다. 사용하는 영구 스토리지 유형을 정의하는 스토리지 클래스(volume.class)를 변경하는 방법을 보여줍니다. 동일한 단계를 사용하여 스토리지 크기(volume.size )를 변경할 수 있습니다.
블록 스토리지를 사용하는 것이 좋습니다. Apache Kafka의 스트림은 블록 스토리지에서만 사용하도록 테스트됩니다.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- cruise Control은 Kafka와 함께 배포됩니다.
- 동적 볼륨 할당에 영구 볼륨 클레임을 사용하는 스토리지의 경우 필요한 스토리지 솔루션에 해당하는 OpenShift 클러스터에서 스토리지 클래스를 정의하고 사용할 수 있습니다.
프로세스
자체 스토리지 설정으로 노드 풀을 생성합니다.
예를 들어 노드
풀은 영구 볼륨에서JBOD 스토리지를 사용합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: gp2-ebs # ...pool-a의 노드는 Amazon EBS (Elastic Block Store) GP2 볼륨을 사용하도록 구성되어 있습니다.-
pool-a에 대한 노드 풀 구성을 적용합니다. 배포 상태를 확인하고
pool-a의 포드가 생성되고 준비될 때까지 기다립니다(1/1).oc get pods -n <my_cluster_operator_namespace>출력에 노드 풀의 Kafka 노드 3개가 표시되어 있습니다.
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0새 스토리지 클래스로 마이그레이션하려면 필요한 스토리지 구성을 사용하여 새 노드 풀을 생성합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-b labels: strimzi.io/cluster: my-cluster spec: roles: - broker replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 1Ti class: gp3-ebs # ...pool-b의 노드는 Amazon EBS (Elastic Block Store) GP3 볼륨을 사용하도록 구성됩니다.-
pool-b에 대한 노드 풀 구성을 적용합니다. -
배포 상태를 확인하고
pool-b의 포드가 생성되고 준비될 때까지 기다립니다. pool-a의 파티션을pool-b에 다시 할당합니다.새 스토리지 구성으로 마이그레이션할 때 Cruise Control
remove-brokers모드를 사용하여 제거하려는 브로커에서 파티션 복제본을 이동합니다.Cruise Control을 사용하여 파티션 복제본 재할당
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [0, 1, 2]pool-a에서 파티션을 다시 할당합니다. 재할당은 클러스터의 주제 및 파티션 수에 따라 다소 시간이 걸릴 수 있습니다.재할당 프로세스가 완료되면 이전 노드 풀을 삭제합니다.
oc delete kafkanodepool pool-a
9.3.10. 노드 풀을 사용하여 스토리지 유사성 관리 링크 복사링크가 클립보드에 복사되었습니다!
로컬 영구 볼륨과 같은 스토리지 리소스가 특정 작업자 노드 또는 가용성 영역으로 제한되는 경우 스토리지 선호도를 구성하면 올바른 노드를 사용하도록 Pod를 예약하는 데 도움이 됩니다.
노드 풀을 사용하면 선호도를 독립적으로 구성할 수 있습니다. 이 절차에서는 zone-1 및 zone-2 의 두 가용 영역에 대한 스토리지 선호도를 생성하고 관리합니다.
별도의 가용성 영역에 대해 노드 풀을 구성할 수 있지만 동일한 스토리지 클래스를 사용합니다. 각 영역에서 사용 가능한 스토리지 리소스를 나타내는 all-zones 영구 스토리지 클래스를 정의합니다.
또한 .spec.template.pod 속성을 사용하여 노드 유사성을 구성하고 zone-1 및 zone-2 작업자 노드에서 Kafka Pod를 예약합니다.
스토리지 클래스 및 유사성은 각 가용성 영역의 노드를 나타내는 노드 풀에 지정됩니다.
-
pool-zone-1 -
pool-zone-2.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- 유사성 개념에 익숙하지 않은 경우 Kubernetes 노드 및 Pod 유사성 설명서를 참조하십시오.
프로세스
각 가용성 영역에 사용할 스토리지 클래스를 정의합니다.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: all-zones provisioner: kubernetes.io/my-storage parameters: type: ssd volumeBindingMode: WaitForFirstConsumerall-zones스토리지 클래스와 각 영역의 선호도를 지정하여 두 가용 영역을 나타내는 노드 풀을 생성합니다.zone-1의 노드 풀 구성
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-zone-1 labels: strimzi.io/cluster: my-cluster spec: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: all-zones template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-1 # ...zone-2에 대한 노드 풀 구성
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-zone-2 labels: strimzi.io/cluster: my-cluster spec: replicas: 4 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: all-zones template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-2 # ...- 노드 풀 구성을 적용합니다.
배포 상태를 확인하고 노드 풀의 Pod가 생성되고 준비될 때까지 기다립니다(
1/1).oc get pods -n <my_cluster_operator_namespace>output은
pool-zone-1의 Kafka 노드 3개와pool-zone-2의 Kafka 노드 4개를 보여줍니다.NAME READY STATUS RESTARTS my-cluster-pool-zone-1-kafka-0 1/1 Running 0 my-cluster-pool-zone-1-kafka-1 1/1 Running 0 my-cluster-pool-zone-1-kafka-2 1/1 Running 0 my-cluster-pool-zone-2-kafka-3 1/1 Running 0 my-cluster-pool-zone-2-kafka-4 1/1 Running 0 my-cluster-pool-zone-2-kafka-5 1/1 Running 0 my-cluster-pool-zone-2-kafka-6 1/1 Running 0
9.3.11. Kafka 노드 풀을 사용하도록 기존 Kafka 클러스터 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Kafka 노드 풀을 사용하도록 기존 Kafka 클러스터를 마이그레이션하는 방법을 설명합니다. Kafka 클러스터를 업데이트한 후 노드 풀을 사용하여 각 풀 내의 노드 구성을 관리할 수 있습니다.
현재 KafkaNodePool 리소스의 복제본 및 스토리지 구성도 Kafka 리소스에 있어야 합니다. 노드 풀이 사용 중인 경우 구성이 무시됩니다.
사전 요구 사항
프로세스
새
KafkaNodePool리소스를 생성합니다.-
리소스 이름을
kafka로 지정합니다. -
strimzi.io/cluster레이블을 기존Kafka리소스를 지정합니다. - 현재 Kafka 클러스터와 일치하도록 복제본 수 및 스토리지 구성을 설정합니다.
-
역할을
브로커로설정합니다.
Kafka 클러스터 마이그레이션에 사용되는 노드 풀 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: kafka labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false주의클러스터 데이터와 해당 노드 및 리소스의 이름을 유지하려면 노드 풀 이름은
kafka여야 하며strimzi.io/cluster레이블은 Kafka 리소스 이름과 일치해야 합니다. 그렇지 않으면 노드에서 사용하는 영구 볼륨 스토리지를 포함하여 새 이름으로 노드 및 리소스가 생성됩니다. 따라서 이전 데이터를 사용할 수 없습니다.-
리소스 이름을
KafkaNodePool리소스를 적용합니다.oc apply -f <node_pool_configuration_file>이 리소스를 적용하면 노드 풀을 사용하여 Kafka를 로 전환합니다.
변경 또는 롤링 업데이트가 없으며 리소스는 이전과 동일합니다.
strimzi.io/node-pools: enabled주석을 사용하여Kafka리소스에서 노드 풀에 대한 지원을 활성화합니다.Zoo Cryostat를 사용하여 클러스터의 노드 풀 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster annotations: strimzi.io/node-pools: enabled spec: kafka: # ... zookeeper: # ...Kafka리소스를 적용합니다.oc apply -f <kafka_configuration_file>변경 또는 롤링 업데이트가 없습니다. 리소스는 이전과 동일하게 유지됩니다.
-
Kafka사용자 정의 리소스에서 복제된 속성을 제거합니다.KafkaNodePool리소스를 사용 중인 경우.spec.kafka.replicas및.spec.kafka.storage속성과 같이KafkaNodePool리소스에 복사한 속성을 제거할 수 있습니다.
마이그레이션 전환
Kafka 사용자 정의 리소스만 사용하여 Kafka 노드를 관리하려면 다음을 수행합니다.
-
노드 풀이 여러 개인 경우 노드 ID가 0에서 N(여기서 N은 복제본 수)을 사용하여
kafka라는 단일KafkaNodePool에 통합합니다. -
Kafka리소스의.spec.kafka구성이 스토리지, 리소스 및 복제본을 포함하여KafkaNodePool구성과 일치하는지 확인합니다. -
strimzi.io/node-pools: disabled주석을 사용하여Kafka리소스에서 노드 풀에 대한 지원을 비활성화합니다. -
kafka라는 Kafka 노드 풀을 삭제합니다.
9.4. Entity Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka.spec 에서 entityOperator 속성을 사용하여 Entity Operator를 구성합니다. Entity Operator는 실행 중인 Kafka 클러스터에서 Kafka 관련 엔터티를 관리합니다. 다음과 같은 연산자로 구성됩니다.
- Kafka 주제를 관리하는 주제 Operator
- Kafka 사용자를 관리하는 사용자 Operator
Kafka 리소스를 구성하면 Cluster Operator는 하나 또는 두 Operator를 포함하여 Entity Operator를 배포할 수 있습니다. 배포되면 Kafka 클러스터의 주제 및 사용자를 처리하도록 Operator가 자동으로 구성됩니다.
각 Operator는 단일 네임스페이스만 모니터링할 수 있습니다. 자세한 내용은 1.2.1절. “OpenShift 네임스페이스에서 Apache Kafka 리소스에 대한 스트림 감시”의 내용을 참조하십시오.
entityOperator 속성은 여러 하위 속성을 지원합니다.
-
tlsSidecar -
topicOperator -
userOperator -
템플릿
tlsSidecar 속성에는 Zoo Cryostat와 통신하는 데 사용되는 TLS 사이드카 컨테이너 구성이 포함되어 있습니다.
template 속성에는 레이블, 주석, 유사성 및 허용 오차와 같은 Entity Operator Pod 구성이 포함되어 있습니다. 템플릿 구성에 대한 자세한 내용은 9.16절. “OpenShift 리소스 사용자 정의” 을 참조하십시오.
topicOperator 속성에는 Topic Operator의 구성이 포함되어 있습니다. 이 옵션이 없으면 Topic Operator 없이 Entity Operator가 배포됩니다.
userOperator 속성에는 User Operator의 구성이 포함되어 있습니다. 이 옵션이 없으면 User Operator 없이 Entity Operator가 배포됩니다.
Entity Operator를 구성하는 데 사용되는 속성에 대한 자세한 내용은 EntityOperatorSpec 스키마 참조를 참조하십시오.
두 Operator를 모두 활성화하는 기본 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
topicOperator: {}
userOperator: {}
topicOperator 및 userOperator 에 빈 오브젝트({})를 사용하는 경우 모든 속성은 기본값을 사용합니다.
topicOperator 및 userOperator 속성이 모두 누락되면 Entity Operator가 배포되지 않습니다.
9.4.1. Topic Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka.spec.entityOperator 의 topicOperator 속성을 사용하여 Topic Operator를 구성합니다.
기본적으로 활성화된 단방향 주제 관리를 사용하는 경우 다음 속성이 사용되지 않으며 무시됩니다. Kafka.spec.entityOperator.topicOperator.zookeeperSessionTimeoutSeconds 및 Kafka.spec.entityOperator.topicMetadataMaxAttempts. 리디렉션되지 않은 주제 관리에 대한 자세한 내용은 10.1절. “주제 관리 모드” 을 참조하십시오.
지원되는 속성은 다음과 같습니다.
watchedNamespace-
Topic Operator가
KafkaTopic리소스를 감시하는 OpenShift 네임스페이스입니다. default는 Kafka 클러스터가 배포된 네임스페이스입니다. reconciliationIntervalSeconds-
주기적 조정(초) 사이의 간격입니다. 기본값
120입니다. zookeeperSessionTimeoutSeconds-
Zoo Cryostat 세션 시간(초)입니다. 기본값
18. topicMetadataMaxAttempts-
Kafka에서 주제 메타데이터를 가져오는 시도 횟수입니다. 각 시도 사이의 시간은 지수 백오프로 정의됩니다. 파티션 또는 복제본 수로 인해 주제 생성에 더 많은 시간이 걸릴 수 있는 경우 이 값을 늘리는 것이 좋습니다. 기본
6. image-
image속성은 사용되는 컨테이너 이미지를 구성하는 데 사용할 수 있습니다. 자세한 내용은image속성 구성에 제공된 정보를 참조하십시오. resources-
resources속성은 Topic Operator에 할당된 리소스 양을 구성합니다.메모리및cpu리소스에 대한 요청 및 제한을 지정할 수 있습니다. 요청은 Operator의 안정적인 성능을 보장하기에 충분해야 합니다. logging-
logging속성은 Topic Operator의 로깅을 구성합니다. 자세한 내용은 Topic Operator 로깅 에 있는 정보를 참조하십시오.
Topic Operator 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
# ...
topicOperator:
watchedNamespace: my-topic-namespace
reconciliationIntervalSeconds: 60
resources:
requests:
cpu: "1"
memory: 500Mi
limits:
cpu: "1"
memory: 500Mi
# ...
9.4.2. User Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka.spec.entityOperator 에서 userOperator 속성을 사용하여 User Operator를 구성합니다. 지원되는 속성은 다음과 같습니다.
watchedNamespace-
User Operator가
KafkaUser리소스를 감시하는 OpenShift 네임스페이스입니다. default는 Kafka 클러스터가 배포된 네임스페이스입니다. reconciliationIntervalSeconds-
주기적 조정(초) 사이의 간격입니다. 기본값
120입니다. image-
image속성은 사용할 컨테이너 이미지를 구성하는 데 사용할 수 있습니다. 자세한 내용은image속성 구성에 제공된 정보를 참조하십시오. resources-
resources속성은 User Operator에 할당된 리소스 양을 구성합니다.메모리및cpu리소스에 대한 요청 및 제한을 지정할 수 있습니다. 요청은 Operator의 안정적인 성능을 보장하기에 충분해야 합니다. logging-
logging속성은 User Operator의 로깅을 구성합니다. 자세한 내용은 User Operator 로깅 에 제공된 정보를 참조하십시오. secretPrefix-
secretPrefix속성은 KafkaUser 리소스에서 생성된 모든 시크릿의 이름에 접두사를 추가합니다. 예를 들어secretPrefix: kafka-는 모든 시크릿 이름 앞에kafka-를 추가합니다. 따라서my-user라는 KafkaUser는kafka-my-user라는 시크릿을 생성합니다.
User Operator 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
# ...
userOperator:
watchedNamespace: my-user-namespace
reconciliationIntervalSeconds: 60
resources:
requests:
cpu: "1"
memory: 500Mi
limits:
cpu: "1"
memory: 500Mi
# ...
9.5. Cluster Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
환경 변수를 사용하여 Cluster Operator를 구성합니다. 배포 구성 파일에서 Cluster Operator의 컨테이너 이미지에 대한 환경 변수를 지정합니다. 다음 환경 변수를 사용하여 Cluster Operator를 구성할 수 있습니다. 대기 모드에서 Cluster Operator 복제본을 실행하는 경우 리더 선택을 활성화하는 추가 환경 변수가 있습니다.
Kafka, Kafka Connect 및 Kafka MirrorMaker는 여러 버전을 지원합니다. STRIMZI_<COMPONENT_NAME>_IMAGES 환경 변수를 사용하여 각 버전에 사용되는 기본 컨테이너 이미지를 구성합니다. 구성은 버전과 이미지 간의 매핑을 제공합니다. 필수 구문은 공백 또는 쉼표로 구분된 < version> = <image > 쌍으로 되어 지정된 버전에 사용할 이미지를 결정합니다. 예: 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0. 구성 요소의 구성에 image 속성 값이 지정된 경우 기본 이미지가 재정의됩니다. 구성 요소의 이미지 구성에 대한 자세한 내용은 Apache Kafka 사용자 정의 리소스 API 참조 에서 참조하십시오.
Apache Kafka 릴리스 아티팩트용 Streams와 함께 제공되는 배포 구성 파일은 install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml 입니다.
STRIMZI_NAMESPACEOperator가 작동하는 쉼표로 구분된 네임스페이스 목록입니다. 설정되지 않거나 빈 문자열로 설정하거나
*로 설정하면 Cluster Operator가 모든 네임스페이스에서 작동합니다.Cluster Operator 배포에서는 Downward API를 사용하여 Cluster Operator가 배포된 네임스페이스로 자동으로 설정할 수 있습니다.
Cluster Operator 네임스페이스 구성 예
env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespaceSTRIMZI_FULL_RECONCILIATION_INTERVAL_MS- 선택 사항이며 기본값은 120000 ms입니다. 주기적 조정 간격(밀리초)입니다.
STRIMZI_OPERATION_TIMEOUT_MS- 선택 사항인 기본 300000 ms. 내부 작업에 대한 제한 시간(밀리초)입니다. 일반 OpenShift 작업이 일반 OpenShift 작업보다 오래 걸리는 클러스터에서 Apache Kafka에 Streams를 사용할 때 (예: 컨테이너 이미지의 긴 다운로드 시간과 같은 요인으로 인해) 이 값을 늘립니다.
STRIMZI_ZOOKEEPER_ADMIN_SESSION_TIMEOUT_MS-
선택 사항인 기본 10000 ms. Cluster Operator의 Zoo Cryostat 관리자 클라이언트의 세션 제한 시간(밀리초)입니다. 시간 초과 문제로 인해 Cluster Operator의 Zoo Cryostat 요청이 정기적으로 실패하는 경우 값을 늘립니다.
maxSessionTimeout구성을 통해 Zoo Cryostat 서버 측에 허용되는 최대 세션 시간이 설정됩니다. 기본적으로 최대 세션 시간 제한 값은 40000ms의 기본tickTime(기본값은 2000초)의 20배입니다. 시간 초과가 더 필요한 경우maxSessionTimeoutZoo Cryostat 서버 구성 값을 변경합니다. STRIMZI_OPERATIONS_THREAD_POOL_SIZE- 선택 사항, 기본 10. 작업자 스레드 풀 크기: Cluster Operator에서 실행하는 다양한 비동기 및 차단 작업에 사용됩니다.
STRIMZI_OPERATOR_NAME- 선택 사항이며 기본값은 Pod의 호스트 이름입니다. Operator 이름은 OpenShift 이벤트를 발송 할 때 Apache Kafka 인스턴스의 Streams를 식별합니다.
STRIMZI_OPERATOR_NAMESPACECluster Operator가 실행 중인 네임스페이스의 이름입니다. 이 변수를 수동으로 구성하지 마십시오. Downward API를 사용합니다.
env: - name: STRIMZI_OPERATOR_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespaceSTRIMZI_OPERATOR_NAMESPACE_LABELS선택 사항: Apache Kafka Cluster Operator의 Streams가 실행 중인 네임스페이스의 레이블입니다. 네임스페이스 레이블을 사용하여 네트워크 정책에서 네임스페이스 선택기를 구성합니다. 네트워크 정책을 사용하면 Apache Kafka Cluster Operator의 Streams for Apache Kafka Cluster Operator가 이러한 레이블이 있는 네임스페이스에서 피연산자에만 액세스할 수 있습니다. 설정되지 않은 경우 OpenShift 클러스터의 네임스페이스에서 Cluster Operator에 액세스할 수 있도록 네트워크 정책의 네임스페이스 선택기가 구성됩니다.
env: - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2STRIMZI_LABELS_EXCLUSION_PATTERN선택 사항인 기본 regex 패턴은
^app.kubernetes.io/(?!part-of).*입니다. 기본 사용자 정의 리소스의 레이블 전파를 해당 하위 리소스로 필터링하는 데 사용되는 regex 제외 패턴입니다. 레이블 제외 필터는spec.kafka.template.pod.metadata.labels와 같은 템플릿 섹션의 레이블에는 적용되지 않습니다.env: - name: STRIMZI_LABELS_EXCLUSION_PATTERN value: "^key1.*"STRIMZI_CUSTOM_<COMPONENT_NAME>_LABELS선택 사항: 구성 요소의 사용자 정의 리소스에서 생성한 모든 Pod에 적용할 하나 이상의 사용자 지정 레이블입니다. 사용자 정의 리소스가 생성되거나 다음에 조정될 때 Cluster Operator에서 Pod에 레이블을 지정합니다.
라벨은 다음 구성 요소에 적용할 수 있습니다.
-
KAFKA -
KAFKA_CONNECT -
KAFKA_CONNECT_BUILD -
ZOOKEEPER -
ENTITY_OPERATOR -
KAFKA_MIRROR_MAKER2 -
KAFKA_MIRROR_MAKER -
CRUISE_CONTROL -
KAFKA_BRIDGE -
KAFKA_EXPORTER
-
STRIMZI_CUSTOM_RESOURCE_SELECTOR선택 사항: Cluster Operator에서 처리하는 사용자 정의 리소스를 필터링하는 라벨 선택기입니다. Operator는 지정된 라벨이 설정된 사용자 정의 리소스에서만 작동합니다. 이러한 레이블이 없는 리소스는 Operator에서 볼 수 없습니다. 라벨 선택기는 Kafka ,
,KafkaConnectKafkaBridge,KafkaMirrorMaker및KafkaMirrorMaker2리소스에 적용됩니다.KafkaRebalance및KafkaConnector리소스는 해당 Kafka 및 Kafka Connect 클러스터에 일치하는 라벨이 있는 경우에만 작동합니다.env: - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR value: label1=value1,label2=value2STRIMZI_KAFKA_IMAGES-
필수 항목입니다. Kafka 버전에서 해당 버전의 Kafka 브로커가 포함된 해당 이미지로 매핑됩니다. 예:
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0. STRIMZI_KAFKA_CONNECT_IMAGES-
필수 항목입니다. Kafka 버전에서 해당 버전의 Kafka Connect 이미지로의 매핑입니다. 예:
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0. STRIMZI_KAFKA_MIRROR_MAKER2_IMAGES-
필수 항목입니다. Kafka 버전에서 해당 버전의 MirrorMaker 2 이미지로의 매핑입니다. 예:
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0. - (더 이상 사용되지 않음)
STRIMZI_KAFKA_MIRROR_MAKER_IMAGES -
필수 항목입니다. Kafka 버전에서 해당 버전의 MirrorMaker 이미지로의 매핑입니다. 예:
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0, 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0. STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE-
선택 사항: 기본값은
registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0입니다.Kafka리소스에서 이미지가Kafka.spec.entityOperator.topicOperator.image로 지정되지 않은 경우 Topic Operator를 배포할 때 기본값으로 사용할 이미지 이름입니다. STRIMZI_DEFAULT_USER_OPERATOR_IMAGE-
선택 사항: 기본값은
registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0입니다. 이미지가Kafka리소스에Kafka.spec.entityOperator.userOperator.image로 지정되지 않은 경우 User Operator를 배포할 때 사용할 이미지 이름입니다. STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE-
선택 사항: 기본값은
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0입니다.Kafka리소스의Kafka.spec.entityOperator.tlsSidecar.image로 지정되지 않은 경우 Entity Operator에 사이드카 컨테이너를 배포할 때 사용할 이미지 이름입니다. 사이드카는 TLS 지원을 제공합니다. STRIMZI_DEFAULT_KAFKA_EXPORTER_IMAGE-
선택 사항: 기본값은
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0입니다. 이미지가Kafka리소스에서Kafka.spec.kafkaExporter.image로 지정되지 않은 경우 Kafka Exporter를 배포할 때 사용할 이미지 이름입니다. STRIMZI_DEFAULT_CRUISE_CONTROL_IMAGE-
선택 사항: 기본값은
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0입니다.Kafka리소스에서 이미지가Kafka.spec.cruiseControl.image로 지정되지 않은 경우 Cruise Control을 배포할 때 기본값으로 사용할 이미지 이름입니다. STRIMZI_DEFAULT_KAFKA_BRIDGE_IMAGE-
선택 사항: 기본값은
registry.redhat.io/amq-streams/bridge-rhel9:2.7.0입니다.Kafka리소스에서 이미지가Kafka.spec.kafkaBridge.image로 지정되지 않은 경우 Kafka 브리지를 배포할 때 사용할 이미지 이름입니다. STRIMZI_DEFAULT_KAFKA_INIT_IMAGE-
선택 사항: 기본값은
registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0입니다. Kafka 리소스의brokerRackInitImage또는 Kafka Connect 리소스의clientRackInitImage에 이미지가 지정되지 않은 경우Kafka이니셜라이저 컨테이너의 기본값으로 사용할 이미지 이름입니다. init 컨테이너는 랙 지원과 같은 초기 구성 작업을 위해 Kafka 클러스터보다 먼저 시작됩니다. STRIMZI_IMAGE_PULL_POLICY-
선택 사항: Cluster Operator가 관리하는 모든 Pod의 컨테이너에 적용되는
ImagePullPolicy입니다. 유효한 값은Always,IfNotPresent및Never입니다. 지정하지 않으면 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/amd64KUBERNETES_SERVICE_DNS_DOMAIN선택 사항: 기본 OpenShift DNS 도메인 이름 접미사를 덮어씁니다.
기본적으로 OpenShift 클러스터에 할당된 서비스에는 기본 접미사
cluster.local을 사용하는 DNS 도메인 이름이 있습니다.예를 들어 브로커 kafka-0 의 경우 다음과 같습니다.
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc.cluster.localDNS 도메인 이름은 호스트 이름 확인에 사용되는 Kafka 브로커 인증서에 추가됩니다.
클러스터에서 다른 DNS 도메인 이름 접미사를 사용하는 경우 Kafka 브로커와의 연결을 구축하기 위해
KUBERNETES_SERVICE_DNS_DOMAIN환경 변수를 기본값에서 사용 중인 환경으로 변경합니다.STRIMZI_CONNECT_BUILD_TIMEOUT_MS- 선택 사항인 기본 300000 ms. 추가 커넥터를 사용하여 새 Kafka Connect 이미지를 빌드하는 시간 제한 시간(밀리초)입니다. Apache Kafka에 Streams를 사용하여 많은 커넥터가 포함된 컨테이너 이미지를 빌드하거나 느린 컨테이너 레지스트리를 사용할 때 이 값을 늘리는 것이 좋습니다.
STRIMZI_NETWORK_POLICY_GENERATION선택 사항, 기본
true. 리소스에 대한 네트워크 정책입니다. 네트워크 정책은 Kafka 구성 요소 간 연결을 허용합니다.네트워크 정책 생성을 비활성화하려면 이 환경 변수를
false로 설정합니다. 예를 들어 사용자 지정 네트워크 정책을 사용하려는 경우 이 작업을 수행할 수 있습니다. 사용자 지정 네트워크 정책을 사용하면 구성 요소 간 연결 유지 관리를 더 많이 제어할 수 있습니다.STRIMZI_DNS_CACHE_TTL-
선택 사항인 기본
30입니다. 로컬 DNS 확인기에서 성공적인 이름 조회를 캐시하는 시간(초)입니다. 모든 음수 값은 캐시를 영구적으로 의미합니다. 0은 캐시가 없으므로 긴 캐싱 정책이 적용되어 연결 오류를 방지하는 데 유용할 수 있습니다. STRIMZI_POD_SET_RECONCILIATION_ONLY-
선택 사항, 기본
false.true로 설정하면 Cluster Operator가StrimziPodSet리소스 및 기타 사용자 정의 리소스(Kafka,KafkaConnect등)에 대한 변경 사항만 무시됩니다. 이 모드는 필요한 경우 Pod가 다시 생성되지만 클러스터에 다른 변경 사항은 발생하지 않도록 하는 데 유용합니다. STRIMZI_FEATURE_GATES- 선택 사항: 기능 게이트 에 의해 제어되는 기능 및 기능을 활성화하거나 비활성화합니다.
STRIMZI_POD_SECURITY_PROVIDER_CLASS-
선택 사항: Pod 및 컨테이너에 대한 보안 컨텍스트 구성을 제공하는 데 사용할 수 있는 플러그형
PodSecurityProvider클래스에 대한 구성입니다.
9.5.1. 네트워크 정책을 사용하여 Cluster Operator에 대한 액세스 제한 링크 복사링크가 클립보드에 복사되었습니다!
STRIMZI_OPERATOR_NAMESPACE_LABELS 환경 변수를 사용하여 네임스페이스 레이블을 사용하여 Cluster Operator의 네트워크 정책을 설정합니다.
Cluster Operator는 관리하는 리소스 또는 별도의 네임스페이스에서 동일한 네임스페이스에서 실행할 수 있습니다. 기본적으로 STRIMZI_OPERATOR_NAMESPACE 환경 변수는 Downward API를 사용하여 Cluster Operator가 실행 중인 네임스페이스를 찾도록 구성됩니다. Cluster Operator가 리소스와 동일한 네임스페이스에서 실행 중인 경우 로컬 액세스만 필요하며 Apache Kafka용 Streams에서 허용합니다.
Cluster Operator가 관리하는 리소스에 대해 별도의 네임스페이스에서 실행 중인 경우 네트워크 정책이 구성되지 않은 경우 OpenShift 클러스터의 모든 네임스페이스가 Cluster Operator에 액세스할 수 있습니다. 네임스페이스 레이블을 추가하면 Cluster Operator에 대한 액세스 권한이 지정된 네임스페이스로 제한됩니다.
Cluster Operator 배포에 대해 구성된 네트워크 정책
#...
env:
# ...
- name: STRIMZI_OPERATOR_NAMESPACE_LABELS
value: label1=value1,label2=value2
#...
9.5.2. 사용자 정의 리소스의 정기적인 조정 설정 링크 복사링크가 클립보드에 복사되었습니다!
STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 변수를 사용하여 Cluster Operator의 정기적인 조정을 위한 시간 간격을 설정합니다. 해당 값을 필요한 간격(밀리초)으로 바꿉니다.
Cluster Operator 배포에 구성된 조정 기간
#...
env:
# ...
- name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
value: "120000"
#...
Cluster Operator는 OpenShift 클러스터에서 수신한 적용 가능한 클러스터 리소스에 대한 모든 알림에 응답합니다. Operator가 실행 중이 아니거나 어떤 이유로든 알림이 수신되지 않으면 리소스가 실행 중인 OpenShift 클러스터 상태와 동기화되지 않습니다. 페일오버를 올바르게 처리하기 위해 Cluster Operator가 정기적으로 조정 프로세스를 실행하여 리소스 상태를 현재 클러스터 배포와 비교하여 모든 노드에서 일관된 상태를 유지할 수 있습니다.
9.5.3. 주석을 사용하여 사용자 정의 리소스 조정 일시 중지 링크 복사링크가 클립보드에 복사되었습니다!
수정 사항을 수행하거나 업데이트할 수 있도록 Streams for Apache Kafka Operator에서 관리하는 사용자 정의 리소스의 조정을 일시 중지하는 것이 유용한 경우도 있습니다. 조정이 일시 중지되면 일시 중지가 종료될 때까지 Operator가 사용자 정의 리소스에 대한 변경 사항을 무시합니다.
사용자 정의 리소스의 조정을 일시 중지하려면 구성에서 strimzi.io/pause-reconciliation 주석을 true 로 설정합니다. 이렇게 하면 적절한 Operator가 사용자 정의 리소스의 조정을 일시 중지하도록 지시합니다. 예를 들어 Cluster Operator의 조정이 일시 중지되도록 KafkaConnect 리소스에 주석을 적용할 수 있습니다.
pause 주석이 활성화된 사용자 정의 리소스를 생성할 수도 있습니다. 사용자 정의 리소스가 생성되지만 무시됩니다.
사전 요구 사항
- 사용자 정의 리소스를 관리하는 Apache Kafka Operator의 Streams for Apache Kafka Operator가 실행 중입니다.
프로세스
OpenShift에서 사용자 정의 리소스에 주석을 달고
pause-reconciliation을true로 설정합니다.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"사용자 정의 리소스의 상태 조건에
ReconciliationPaused: 변경 사항이 표시되는지 확인합니다.oc describe <kind_of_custom_resource> <name_of_custom_resource>유형조건은lastTransitionTime에서ReconciliationPaused로 변경됩니다.일시 중지된 조정 조건 유형이 있는 사용자 정의 리소스의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: annotations: strimzi.io/pause-reconciliation: "true" strimzi.io/use-connector-resources: "true" creationTimestamp: 2021-03-12T10:47:11Z #... spec: # ... status: conditions: - lastTransitionTime: 2021-03-12T10:47:41.689249Z status: "True" type: ReconciliationPaused
일시 중지에서 재시작
-
조정을 다시 시작하려면 주석을
false로 설정하거나 주석을 제거할 수 있습니다.
9.5.4. 리더 선택으로 여러 Cluster Operator 복제본 실행 링크 복사링크가 클립보드에 복사되었습니다!
기본 Cluster Operator 구성을 사용하면 리더 선택을 통해 Cluster Operator의 여러 병렬 복제본을 실행할 수 있습니다. 하나의 복제본이 활성 리더로 선택되고 배포된 리소스를 작동합니다. 다른 복제본은 standby 모드에서 실행됩니다. 리더가 중지되거나 실패하면 대기 복제본 중 하나가 새 리더로 선택되고 배포된 리소스 운영을 시작합니다.
기본적으로 Apache Kafka의 Streams는 항상 리더 복제본인 단일 Cluster Operator 복제본으로 실행됩니다. 단일 Cluster Operator 복제본이 중지되거나 실패하면 OpenShift에서 새 복제본을 시작합니다.
여러 복제본으로 Cluster Operator를 실행하는 것은 필수 사항은 아닙니다. 그러나 주요 오류로 인한 대규모 중단의 경우 복제본이 대기 상태에 있는 것이 좋습니다. 예를 들어 여러 작업자 노드 또는 전체 가용성 영역이 실패한다고 가정합니다. 이러한 오류로 인해 Cluster Operator Pod 및 여러 Kafka Pod가 동시에 중단될 수 있습니다. 후속 Pod 예약으로 인해 리소스 부족으로 인해 혼잡이 발생하는 경우 단일 Cluster Operator를 실행할 때 작업이 지연될 수 있습니다.
9.5.4.1. Cluster Operator 복제본의 리더 선택 활성화 링크 복사링크가 클립보드에 복사되었습니다!
추가 Cluster Operator 복제본을 실행할 때 리더 선택 환경 변수를 구성합니다. 지원되는 환경 변수는 다음과 같습니다.
STRIMZI_LEADER_ELECTION_ENABLED-
선택 사항, disabled(
false)는 기본적으로 비활성화되어 있습니다. 리더 선택을 활성화하거나 비활성화하여 추가 Cluster Operator 복제본을 대기 상태로 실행할 수 있습니다.
리더 선택이 기본적으로 비활성화되어 있습니다. 이 환경 변수를 설치에 적용하는 경우에만 활성화됩니다.
STRIMZI_LEADER_ELECTION_LEASE_NAME-
리더 선택을 활성화할 때 필요합니다. 리더 선택에 사용되는 OpenShift
Lease리소스의 이름입니다. STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE리더 선택을 활성화할 때 필요합니다. 리더 선택에 사용되는 OpenShift
Lease리소스가 생성되는 네임스페이스입니다. Downward API를 사용하여 Cluster Operator가 배포된 네임스페이스로 구성할 수 있습니다.env: - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespaceSTRIMZI_LEADER_ELECTION_IDENTITY리더 선택을 활성화할 때 필요합니다. 리더 선택 중에 사용되는 지정된 Cluster Operator 인스턴스의 ID를 구성합니다. ID는 각 Operator 인스턴스에 대해 고유해야 합니다. Downward API를 사용하여 Cluster Operator가 배포된 Pod의 이름으로 구성할 수 있습니다.
env: - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.nameSTRIMZI_LEADER_ELECTION_LEASE_DURATION_MS- 선택 사항인 기본 15000 ms. 리스가 유효한 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RENEW_DEADLINE_MS- 선택 사항인 기본 10000 ms. 리더가 리더십을 유지하려고 시도하는 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RETRY_PERIOD_MS- 선택 사항인 기본 2000 ms입니다. 리더의 리스 잠금에 대한 업데이트 빈도를 지정합니다.
9.5.4.2. Cluster Operator 복제본 구성 링크 복사링크가 클립보드에 복사되었습니다!
대기 모드에서 추가 Cluster Operator 복제본을 실행하려면 복제본 수를 늘리고 리더 선택을 활성화해야 합니다. 리더 선택을 구성하려면 리더 선택 환경 변수를 사용합니다.
필요한 변경을 수행하려면 install/cluster-operator/:에 있는 다음 Cluster Operator 설치 파일을 구성합니다.
- 060-Deployment-strimzi-cluster-operator.yaml
- 022-ClusterRole-strimzi-cluster-operator-role.yaml
- 022-RoleBinding-strimzi-cluster-operator.yaml
리더 선택에는 조사 중인 네임스페이스가 아니라 Cluster Operator가 실행 중인 네임스페이스를 대상으로 하는 자체 ClusterRole 및 RoleBinding RBAC 리소스가 있습니다.
기본 배포 구성은 Cluster Operator와 동일한 네임스페이스에 strimzi-cluster-operator 라는 Lease 리소스를 생성합니다. Cluster Operator는 리스를 사용하여 리더 선택을 관리합니다. RBAC 리소스는 Lease 리소스를 사용할 수 있는 권한을 제공합니다. 다른 Lease 이름 또는 네임스페이스를 사용하는 경우 그에 따라 ClusterRole 및 RoleBinding 파일을 업데이트합니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.
프로세스
060- 파일에 정의된 Cluster Operator를 배포하는 데 사용되는 Deployment 리소스를 편집합니다.
Deployment -strimzi-cluster-operator.yaml
replicas속성을 기본 (1)에서 필요한 복제본 수와 일치하는 값으로 변경합니다.Cluster Operator 복제본 수 증가
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator labels: app: strimzi spec: replicas: 3리더 선택
env속성이 설정되어 있는지 확인합니다.설정되지 않은 경우 구성합니다.
리더 선택을 활성화하려면
STRIMZI_LEADER_ELECTION_ENABLED를true(기본값)로 설정해야 합니다.이 예에서 리스는
my-strimzi-cluster-operator로 변경됩니다.Cluster Operator의 리더 선택 환경 변수 구성
# ... spec containers: - name: strimzi-cluster-operator # ... env: - name: STRIMZI_LEADER_ELECTION_ENABLED value: "true" - name: STRIMZI_LEADER_ELECTION_LEASE_NAME value: "my-strimzi-cluster-operator" - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.name사용 가능한 환경 변수에 대한 설명은 9.5.4.1절. “Cluster Operator 복제본의 리더 선택 활성화” 을 참조하십시오.
리더 선택에 사용된
Lease리소스의 다른 이름 또는 네임스페이스를 지정한 경우 RBAC 리소스를 업데이트합니다.(선택 사항)
022-ClusterRole-strimzi-cluster-operator-role.yaml파일에서ClusterRole리소스를 편집합니다.Lease리소스의 이름으로resourceNames를 업데이트합니다.리스에 대한 ClusterRole 참조 업데이트
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi rules: - apiGroups: - coordination.k8s.io resourceNames: - my-strimzi-cluster-operator # ...(선택 사항)
022-RoleBinding-strimzi-cluster-operator.yaml파일에서RoleBinding리소스를 편집합니다.subject.name및 subject.namespace를Lease리소스의 이름과 생성된 네임스페이스로 업데이트합니다.lease에 대한 RoleBinding 참조 업데이트
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi subjects: - kind: ServiceAccount name: my-strimzi-cluster-operator namespace: myproject # ...Cluster Operator를 배포합니다.
oc create -f install/cluster-operator -n myproject배포 상태를 확인합니다.
oc get deployments -n myproject출력에 배포 이름 및 준비 상태 표시
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 3/3 3 3READY는 ready/expected 복제본 수를 표시합니다.AVAILABLE출력에 올바른 복제본 수가 표시되면 배포가 성공적으로 수행됩니다.
9.5.5. Cluster Operator HTTP 프록시 설정 구성 링크 복사링크가 클립보드에 복사되었습니다!
HTTP 프록시 뒤에서 Kafka 클러스터를 실행 중인 경우에도 클러스터에서 데이터를 계속 전달할 수 있습니다. 예를 들어 프록시 외부에서 데이터를 푸시하고 가져오는 커넥터와 함께 Kafka Connect를 실행할 수 있습니다. 또는 프록시를 사용하여 권한 부여 서버와 연결할 수 있습니다.
프록시 환경 변수를 지정하도록 Cluster Operator 배포를 구성합니다. Cluster Operator는 표준 프록시 구성(HTTP_PROXY,HTTPS_PROXY 및 NO_PROXY)을 환경 변수로 허용합니다. 프록시 설정은 Apache Kafka 컨테이너의 모든 스트림에 적용됩니다.
프록시 주소 형식은 http://<ip_address>:<port_number>입니다. 이름과 암호를 사용하여 프록시를 설정하려면 형식은 http://<username>:<password>@<ip-address>:<port_number>입니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 만들고 관리할 수 있는 권한이 있는 계정이 필요합니다.
프로세스
Cluster Operator에 프록시 환경 변수를 추가하려면
배포구성을 업데이트합니다(install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml).Cluster Operator의 프록시 설정 예
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "HTTP_PROXY" value: "http://proxy.com"1 - name: "HTTPS_PROXY" value: "https://proxy.com"2 - name: "NO_PROXY" value: "internal.com, other.domain.com"3 # ...또는 배포를 직접
편집합니다.oc edit deployment strimzi-cluster-operator배포를 직접 편집하는 대신 YAML 파일을 업데이트한 경우 변경 사항을 적용합니다.
oc create -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
9.5.6. Cluster Operator 구성을 사용하여 FIPS 모드 비활성화 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 FIPS 지원 OpenShift 클러스터에서 실행할 때 FIPS 모드로 자동 전환합니다. Cluster Operator의 배포 구성에서 FIPS_MODE 환경 변수를 비활성화 하여 FIPS 모드를 비활성화합니다. FIPS 모드가 비활성화되면 Apache Kafka의 Streams는 모든 구성 요소에 대해 OpenJDK에서 FIPS를 자동으로 비활성화합니다. FIPS 모드가 비활성화되면 Apache Kafka의 Streams가 FIPS와 호환되지 않습니다. Streams for Apache Kafka Operator 및 모든 피연산자는 FIPS를 활성화하지 않고 OpenShift 클러스터에서 실행 중인 것과 동일한 방식으로 실행됩니다.
프로세스
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배포를 직접 편집하는 대신 YAML 파일을 업데이트한 경우 변경 사항을 적용합니다.
oc apply -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
9.6. Kafka Connect 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnect 사용자 정의 리소스의 spec 속성을 업데이트하여 Kafka Connect 배포를 구성합니다.
Kafka Connect를 사용하여 Kafka 클러스터에 대한 외부 데이터 연결을 설정합니다. KafkaConnect 리소스의 속성을 사용하여 Kafka Connect 배포를 구성합니다.
Kafka Connect 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.
KafkaConnector 구성
KafkaConnector 리소스를 사용하면 OpenShift 네이티브 방식으로 Kafka Connect의 커넥터 인스턴스를 생성하고 관리할 수 있습니다.
Kafka Connect 구성에서 strimzi.io/use-connector-resources 주석을 추가하여 Kafka Connect 클러스터에 대한 KafkaConnectors를 활성화합니다. Apache Kafka용 Streams가 데이터 연결에 필요한 커넥터 플러그인으로 컨테이너 이미지를 자동으로 빌드하도록 빌드 구성을 추가할 수도 있습니다. Kafka Connect 커넥터에 대한 외부 구성은 externalConfiguration 속성을 통해 지정됩니다.
커넥터를 관리하려면 KafkaConnector 사용자 정의 리소스 또는 Kafka Connect REST API를 사용할 수 있습니다. KafkaConnector 리소스는 연결된 Kafka Connect 클러스터와 동일한 네임스페이스에 배포해야 합니다. 이러한 방법을 사용하여 커넥터를 생성, 재구성 또는 삭제하는 방법에 대한 자세한 내용은 커넥터 추가 를 참조하십시오.
커넥터 구성은 HTTP 요청의 일부로 Kafka Connect에 전달되어 Kafka 자체에 저장됩니다. ConfigMaps 및 Secrets는 구성 및 기밀 데이터를 저장하는 데 사용되는 표준 OpenShift 리소스입니다. ConfigMaps 및 Secrets를 사용하여 커넥터의 특정 요소를 구성할 수 있습니다. 그런 다음 필요한 경우 구성을 분리하고 더 안전하게 유지하는 HTTP REST 명령에서 구성 값을 참조할 수 있습니다. 이 방법은 특히 사용자 이름, 암호 또는 인증서와 같은 기밀 데이터에 적용됩니다.
대량의 메시지 처리
많은 양의 메시지를 처리하도록 구성을 조정할 수 있습니다. 자세한 내용은 많은 양의 메시지 처리를 참조하십시오.
KafkaConnect 사용자 정의 리소스 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect-cluster
annotations:
strimzi.io/use-connector-resources: "true"
spec:
replicas: 3
authentication:
type: tls
certificateAndKey:
certificate: source.crt
key: source.key
secretName: my-user-source
bootstrapServers: my-cluster-kafka-bootstrap:9092
tls:
trustedCertificates:
- secretName: my-cluster-cluster-cert
certificate: ca.crt
- secretName: my-cluster-cluster-cert
certificate: ca2.crt
config:
group.id: my-connect-cluster
offset.storage.topic: my-connect-cluster-offsets
config.storage.topic: my-connect-cluster-configs
status.storage.topic: my-connect-cluster-status
key.converter: org.apache.kafka.connect.json.JsonConverter
value.converter: org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable: true
value.converter.schemas.enable: true
config.storage.replication.factor: 3
offset.storage.replication.factor: 3
status.storage.replication.factor: 3
build:
output:
type: docker
image: my-registry.io/my-org/my-connect-cluster:latest
pushSecret: my-registry-credentials
plugins:
- name: connector-1
artifacts:
- type: tgz
url: <url_to_download_connector_1_artifact>
sha512sum: <SHA-512_checksum_of_connector_1_artifact>
- name: connector-2
artifacts:
- type: jar
url: <url_to_download_connector_2_artifact>
sha512sum: <SHA-512_checksum_of_connector_2_artifact>
externalConfiguration:
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-creds
key: awsAccessKey
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-creds
key: awsSecretAccessKey
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
log4j.rootLogger: INFO
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
image: my-org/my-image:latest
rack:
topologyKey: topology.kubernetes.io/zone
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
connectContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
- 1
KafkaConnect를 사용합니다.- 2
- Kafka Connect 클러스터의 KafkaConnectors를 활성화합니다.
- 3
- 작업을 실행하는 작업자의 복제본 노드 수입니다.
- 4
- mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 Kafka Connect 클러스터에 대한 인증입니다. 기본적으로 Kafka Connect는 일반 텍스트 연결을 사용하여 Kafka 브로커에 연결합니다.
- 5
- Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다.
- 6
- TLS 인증서가 클러스터의 X.509 형식으로 저장되는 키 이름으로 TLS 암호화 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
- 7
- 작업자의 Kafka Connect 구성(연결이 아님). 표준 Apache Kafka 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
- 8
- 커넥터 플러그인을 사용하여 컨테이너 이미지를 빌드하기 위한 구성 속성을 자동으로 빌드합니다.
- 9
- (필수) 새 이미지를 내보내는 컨테이너 레지스트리의 구성입니다.
- 10
- (필수) 새 컨테이너 이미지에 추가할 커넥터 플러그인 및 해당 아티팩트 목록입니다. 각 플러그인은 하나 이상의
아티팩트로 구성해야 합니다. - 11
- 다음과 같이 환경 변수를 사용하는 커넥터의 외부 구성 또는 볼륨. 구성 공급자 플러그인을 사용하여 외부 소스에서 구성 값을 로드할 수도 있습니다.
- 12
- 지원되는 리소스(현재
cpu및memory) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다. - 13
- 지정된 Kafka Connect 로거 및 로그 수준이 직접(
인라인) 또는 ConfigMap을 통해 간접적으로(외부)됩니다. 사용자 정의 Log4j 구성은 ConfigMap의log4j.properties또는log4j2.properties키 아래에 배치해야 합니다. Kafka Connectlog4j.rootLogger로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다. - 14
- 컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
- 15
- Prometheus 지표: 이 예제에서 Prometheus Cryostat 내보내기에 대한 구성이 포함된 ConfigMap을 참조하여 활성화됩니다.
metricsConfig.valueFrom.configMapKeyRef.key아래에 빈 파일이 포함된 ConfigMap에 대한 참조를 사용하여 추가 구성 없이 메트릭을 활성화할 수 있습니다. - 16
- Kafka Connect를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
- 17
- ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
- 18
- SPECIALIZED OPTION: 배포에 대한 Rack 인식 구성입니다. 이는 지역이 아닌 동일한 위치 내의 배포를 위한 특수 옵션입니다. 리더 복제본 대신 커넥터가 가장 가까운 복제본에서 사용할 수 있도록 하려면 이 옵션을 사용합니다. 경우에 따라 가장 가까운 복제본에서 소비하면 네트워크 사용률을 개선하거나 비용을 절감할 수 있습니다.
topologyKey는 랙 ID가 포함된 노드 레이블과 일치해야 합니다. 이 구성에 사용된 예제에서는 표준topology.kubernetes.io/zone레이블을 사용하는 영역을 지정합니다. 가장 가까운 복제본에서 사용하려면 Kafka 브로커 구성에서RackAwareReplicaSelector를 활성화합니다. - 19
- 템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
- 20
- 환경 변수는 분산 추적에 대해 설정됩니다.
- 21
- OpenTelemetry를 사용하여 분산 추적을 활성화합니다.
9.6.1. 여러 인스턴스에 대한 Kafka Connect 구성 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 Apache Kafka의 Streams는 Kafka Connect에서 사용하는 내부 주제의 그룹 ID와 이름을 구성합니다. Kafka Connect의 여러 인스턴스를 실행하는 경우 다음 구성 속성을 사용하여 이러한 기본 설정을 변경해야 합니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect
spec:
config:
group.id: my-connect-cluster
offset.storage.topic: my-connect-cluster-offsets
config.storage.topic: my-connect-cluster-configs
status.storage.topic: my-connect-cluster-status
# ...
# ...
세 주제의 값은 동일한 group.id 가 있는 모든 인스턴스에 대해 동일해야 합니다.
이러한 기본 설정을 수정하지 않으면 동일한 Kafka 클러스터에 연결하는 각 인스턴스가 동일한 값으로 배포됩니다. 실제로 모든 인스턴스가 클러스터를 형성하고 동일한 내부 주제를 사용합니다.
동일한 내부 주제를 사용하려는 여러 인스턴스가 예기치 않은 오류가 발생하므로 각 인스턴스에 대한 이러한 속성 값을 변경해야 합니다.
9.6.2. Kafka Connect 사용자 권한 부여 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka에서 권한을 사용하는 경우 Kafka Connect 사용자는 클러스터 그룹 및 Kafka Connect의 내부 항목에 대한 읽기/쓰기 액세스 권한이 필요합니다. 다음 절차에서는 간단한 권한 부여 및 ACL을 사용하여 액세스 권한을 부여하는 방법을 간략하게 설명합니다.
Kafka Connect 클러스터 그룹 ID 및 내부 주제의 속성은 기본적으로 Apache Kafka용 Streams에 의해 구성됩니다. 또는 KafkaConnect 리소스의 사양에 명시적으로 정의할 수 있습니다. 이 기능은 그룹 ID 및 주제의 값이 여러 Kafka Connect 인스턴스를 실행할 때 달라야 하므로 여러 인스턴스에 대해 Kafka Connect를 구성할 때 유용합니다.
간단한 인증에서는 Kafka AclAuthorizer 및 StandardAuthorizer 플러그인에서 관리하는 ACL 규칙을 사용하여 적절한 액세스 수준을 보장합니다. 간단한 인증을 사용하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 AclRule 스키마 참조를 참조하십시오.
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
프로세스
KafkaUser리소스에서권한 부여속성을 편집하여 사용자에게 액세스 권한을 제공합니다.액세스 권한은
리터럴이름 값을 사용하여 Kafka Connect 주제 및 클러스터 그룹에 대해 구성됩니다. 다음 표에서는 주제 및 클러스터 그룹 ID에 대해 구성된 기본 이름을 보여줍니다.Expand 표 9.2. 액세스 권한 구성의 이름 속성 이름 offset.storage.topicconnect-cluster-offsetsstatus.storage.topicconnect-cluster-statusconfig.storage.topicconnect-cluster-configsgroupconnect-cluster이 예제 구성에서 기본 이름은 액세스 권한을 지정하는 데 사용됩니다. Kafka Connect 인스턴스에 다른 이름을 사용하는 경우 ACL 구성에서 해당 이름을 사용합니다.
간단한 권한 부여를 위한 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: # ... authorization: type: simple acls: # access to offset.storage.topic - resource: type: topic name: connect-cluster-offsets patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to status.storage.topic - resource: type: topic name: connect-cluster-status patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to config.storage.topic - resource: type: topic name: connect-cluster-configs patternType: literal operations: - Create - Describe - Read - Write host: "*" # cluster group - resource: type: group name: connect-cluster patternType: literal operations: - Read host: "*"리소스를 생성하거나 업데이트합니다.
oc apply -f KAFKA-USER-CONFIG-FILE
9.6.3. Kafka Connect 커넥터를 수동으로 중지하거나 일시 중지 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 사용하여 커넥터를 구성하는 경우 상태 구성을 사용하여 커넥터를 중지하거나 일시 중지합니다. 커넥터 및 작업이 인스턴스화되는 일시 중지된 상태와 달리 커넥터를 중지하면 활성 프로세스가 없는 구성만 유지됩니다. 실행으로부터 커넥터를 중지하는 것은 단순히 일시 중지하는 것보다 장기간에 더 적합할 수 있습니다. 일시 중지된 커넥터를 다시 시작하는 속도가 빨라지지만 중지된 커넥터는 메모리와 리소스를 확보할 수 있는 이점이 있습니다.
상태 구성은 KafkaConnectorSpec 스키마의 (더 이상 사용되지 않음) 일시 중지 구성을 교체하여 커넥터를 일시 중지할 수 있습니다. 이전에 일시 중지 구성을 사용하여 커넥터를 일시 중지한 경우 충돌을 방지하기 위해 상태 구성만 사용하도록 전환하는 것이 좋습니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
프로세스
일시 중지 또는 중지하려는 커넥터를 제어하는
KafkaConnector사용자 정의 리소스의 이름을 찾습니다.oc get KafkaConnectorKafkaConnector리소스를 편집하여 커넥터를 중지하거나 일시 중지합니다.Kafka Connect 커넥터를 중지하는 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: org.apache.kafka.connect.file.FileStreamSourceConnector tasksMax: 2 config: file: "/opt/kafka/LICENSE" topic: my-topic state: stopped # ...상태구성을중지 또는 일시중지하도록 변경합니다. 이 속성이실행 중이아닌 경우 커넥터의 기본 상태입니다.KafkaConnector구성에 변경 사항을 적용합니다.상태를실행중이거나 구성을 제거하여 커넥터를 다시 시작할 수 있습니다.
또는 Kafka Connect API를 노출 하고 중지 및 일시 중지 를 사용하여 커넥터가 실행되지 않도록 중지할 수 있습니다. 예를 들어 PUT /connectors/<connector_name>/stop. 그런 다음 resume 끝점을 사용하여 다시 시작할 수 있습니다.
9.6.4. Kafka Connect 커넥터 수동 재시작 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 strimzi.io/restart 주석을 사용하여 커넥터 재시작을 수동으로 트리거합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
프로세스
재시작할 Kafka 커넥터를 제어하는
KafkaConnector사용자 정의 리소스의 이름을 찾습니다.oc get KafkaConnectorOpenShift에서
KafkaConnector리소스에 주석을 달아 커넥터를 다시 시작합니다.oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart="true"재시작주석은true로 설정됩니다.다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).
조정 프로세스에서 주석을 감지한 한 Kafka 커넥터가 다시 시작됩니다. Kafka Connect에서 재시작 요청을 수락하면
KafkaConnector사용자 정의 리소스에서 주석이 제거됩니다.
9.6.5. Kafka Connect 커넥터 작업 수동 재시작 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 strimzi.io/restart-task 주석을 사용하여 커넥터 작업 재시작을 수동으로 트리거합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
프로세스
재시작할 Kafka 커넥터 작업을 제어하는
KafkaConnector사용자 정의 리소스의 이름을 찾습니다.oc get KafkaConnectorKafkaConnector사용자 정의 리소스에서 재시작할 작업의 ID를 찾습니다.oc describe KafkaConnector <kafka_connector_name>작업 ID는 0부터 시작하여 음수가 아닌 정수입니다.
OpenShift에서
KafkaConnector리소스에 주석을 달아 커넥터 작업을 다시 시작하려면 ID를 사용합니다.oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart-task="0"이 예에서는 작업
0이 다시 시작됩니다.다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).
조정 프로세스에서 주석을 감지한 한 Kafka 커넥터 작업이 다시 시작됩니다. Kafka Connect에서 재시작 요청을 수락하면
KafkaConnector사용자 정의 리소스에서 주석이 제거됩니다.
9.7. Kafka MirrorMaker 2 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaMirrorMaker2 사용자 정의 리소스의 사양 속성을 업데이트하여 MirrorMaker 2 배포를 구성합니다. MirrorMaker 2는 데이터 사용에 소스 클러스터 구성을 사용하고 데이터 출력에 대한 대상 클러스터 구성을 사용합니다.
MirrorMaker 2는 Kafka Connect 프레임워크를 기반으로 하며 클러스터 간 데이터 전송을 관리하는 커넥터 를 기반으로 합니다.
소스 및 대상 클러스터의 연결 세부 정보를 포함하여 Kafka Connect 배포를 정의하도록 MirrorMaker 2를 구성한 다음 MirrorMaker 2 커넥터 세트를 실행하여 연결을 설정합니다.
MirrorMaker 2는 소스 클러스터와 대상 클러스터 간의 구성 동기화를 지원합니다. MirrorMaker 2 구성에서 소스 주제를 지정합니다. MirrorMaker 2는 소스 주제를 모니터링합니다. MirrorMaker 2는 소스 주제를 탐지하고 변경 사항을 원격 주제로 전파합니다. 변경 사항에는 누락된 주제 및 파티션 생성이 포함될 수 있습니다.
대부분의 경우 로컬 항목에 작성하고 원격 주제를 읽습니다. 원격 항목에서는 쓰기 작업을 방지할 수 없지만 피해야 합니다.
구성은 다음을 지정해야 합니다.
- 각 Kafka 클러스터
- 인증을 포함하여 각 클러스터에 대한 연결 정보
복제 흐름 및 방향
- 클러스터 간 클러스터
- 주제 주제
Kafka MirrorMaker 2 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.
MirrorMaker 2 리소스 구성은 더 이상 사용되지 않는 이전 버전의 MirrorMaker와 다릅니다. 현재 레거시 지원이 없으므로 모든 리소스를 수동으로 새 형식으로 변환해야 합니다.
기본 구성
MirrorMaker 2는 복제 요인과 같은 속성의 기본 구성 값을 제공합니다. 기본값이 변경되지 않은 최소 구성은 다음과 같습니다.
MirrorMaker 2의 최소 구성
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
version: 3.7.0
connectCluster: "my-cluster-target"
clusters:
- alias: "my-cluster-source"
bootstrapServers: my-cluster-source-kafka-bootstrap:9092
- alias: "my-cluster-target"
bootstrapServers: my-cluster-target-kafka-bootstrap:9092
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector: {}
mTLS 또는 SASL 인증을 사용하여 소스 및 대상 클러스터에 대한 액세스 제어를 구성할 수 있습니다. 이 절차에서는 소스 및 대상 클러스터에 TLS 암호화 및 mTLS 인증을 사용하는 구성을 보여줍니다.
KafkaMirrorMaker2 리소스의 소스 클러스터에서 복제하려는 주제 및 소비자 그룹을 지정할 수 있습니다. 이 작업을 수행하려면 topicsPattern 및 groupsPattern 속성을 사용합니다. 이름 목록을 제공하거나 정규식을 사용할 수 있습니다. 기본적으로 topicsPattern 및 groupsPattern 속성을 설정하지 않으면 모든 주제와 소비자 그룹이 복제됩니다. 정규식으로 ".*" 를 사용하여 모든 주제 및 소비자 그룹을 복제할 수도 있습니다. 그러나 클러스터에 불필요한 추가 로드를 유발하지 않도록 하는 데 필요한 주제 및 소비자 그룹만 지정합니다.
대량의 메시지 처리
많은 양의 메시지를 처리하도록 구성을 조정할 수 있습니다. 자세한 내용은 많은 양의 메시지 처리를 참조하십시오.
KafkaMirrorMaker2 사용자 정의 리소스 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
version: 3.7.0
replicas: 3
connectCluster: "my-cluster-target"
clusters:
- alias: "my-cluster-source"
authentication:
certificateAndKey:
certificate: source.crt
key: source.key
secretName: my-user-source
type: tls
bootstrapServers: my-cluster-source-kafka-bootstrap:9092
tls:
trustedCertificates:
- certificate: ca.crt
secretName: my-cluster-source-cluster-ca-cert
- alias: "my-cluster-target"
authentication:
certificateAndKey:
certificate: target.crt
key: target.key
secretName: my-user-target
type: tls
bootstrapServers: my-cluster-target-kafka-bootstrap:9092
config:
config.storage.replication.factor: 1
offset.storage.replication.factor: 1
status.storage.replication.factor: 1
tls:
trustedCertificates:
- certificate: ca.crt
secretName: my-cluster-target-cluster-ca-cert
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector:
tasksMax: 10
autoRestart:
enabled: true
config
replication.factor: 1
offset-syncs.topic.replication.factor: 1
sync.topic.acls.enabled: "false"
refresh.topics.interval.seconds: 60
replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
heartbeatConnector:
autoRestart:
enabled: true
config:
heartbeats.topic.replication.factor: 1
replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
checkpointConnector:
autoRestart:
enabled: true
config:
checkpoints.topic.replication.factor: 1
refresh.groups.interval.seconds: 600
sync.group.offsets.enabled: true
sync.group.offsets.interval.seconds: 60
emit.checkpoints.interval.seconds: 60
replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
topicsPattern: "topic1|topic2|topic3"
groupsPattern: "group1|group2|group3"
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
connect.root.logger.level: INFO
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
image: my-org/my-image:latest
rack:
topologyKey: topology.kubernetes.io/zone
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
connectContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
externalConfiguration:
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-creds
key: awsAccessKey
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-creds
key: awsSecretAccessKey
- 1
- Kafka Connect 및 MirrorMaker 2 버전은 항상 동일합니다.
- 2
- 작업을 실행하는 작업자의 복제본 노드 수입니다.
- 3
- Kafka Connect의 Kafka 클러스터 별칭은 대상 Kafka 클러스터를 지정해야 합니다. Kafka 클러스터는 내부 주제로 Kafka Connect에서 사용합니다.
- 4
- 동기화되는 Kafka 클러스터에 대한 사양입니다.
- 5
- 소스 Kafka 클러스터의 클러스터 별칭입니다.
- 6
- mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 소스 클러스터에 대한 인증입니다.
- 7
- 소스 Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다.
- 8
- TLS 인증서가 소스 Kafka 클러스터의 X.509 형식으로 저장되는 키 이름이 있는 TLS 암호화입니다. 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
- 9
- 대상 Kafka 클러스터의 클러스터 별칭입니다.
- 10
- 대상 Kafka 클러스터에 대한 인증은 소스 Kafka 클러스터와 동일한 방식으로 구성됩니다.
- 11
- 대상 Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다.
- 12
- Kafka Connect 구성. 표준 Apache Kafka 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
- 13
- 대상 Kafka 클러스터의 TLS 암호화는 소스 Kafka 클러스터와 동일한 방식으로 구성됩니다.
- 14
- MirrorMaker 2 커넥터.
- 15
- MirrorMaker 2 커넥터에서 사용하는 소스 클러스터의 클러스터 별칭입니다.
- 16
- MirrorMaker 2 커넥터에서 사용하는 대상 클러스터의 클러스터 별칭입니다.
- 17
- 원격 주제를 생성하는
MirrorSourceConnector에 대한 구성입니다. 구성이 기본 구성 옵션을 덮어씁니다. - 18
- 커넥터가 생성할 수 있는 최대 작업 수입니다. 작업은 데이터 복제를 처리하고 병렬로 실행됩니다. 인프라가 처리 오버헤드를 지원하는 경우 이 값을 늘리면 처리량이 향상될 수 있습니다. Kafka Connect는 클러스터 구성원 간에 작업을 배포합니다. 작업자보다 많은 작업이 있는 경우 작업자에 여러 작업이 할당됩니다. 싱크 커넥터의 경우 소비되는 각 주제 파티션에 대해 하나의 작업을 수행하는 것을 목표로 합니다. 소스 커넥터의 경우 병렬로 실행할 수 있는 작업 수도 외부 시스템에 따라 달라질 수 있습니다. 커넥터는 병렬 처리를 수행할 수 없는 경우 최대 작업 수보다 적은 수를 생성합니다.
- 19
- 실패한 커넥터 및 작업을 자동으로 다시 시작할 수 있습니다. 기본적으로 재시작 수는 indefinite이지만
maxRestarts속성을 사용하여 자동 재시작 횟수에 대해 최대값을 설정할 수 있습니다. - 20
- 대상 클러스터에서 생성된 미러링된 항목의 복제 인수입니다.
- 21
- 소스 및 대상 클러스터의 오프셋을 매핑하는
MirrorSourceConnectoroffset-syncs내부 주제의 복제 인수입니다. - 22
- ACL 규칙 동기화가 활성화되면 ACL이 동기화된 항목에 적용됩니다. 기본값은
true입니다. 이 기능은 User Operator와 호환되지 않습니다. User Operator를 사용하는 경우 이 속성을false로 설정합니다. - 23
- 새 주제의 검사 빈도를 변경하는 선택적 설정입니다. 기본값은 10분마다 확인용입니다.
- 24
- 원격 주제의 자동 이름을 재정의하는 정책을 추가합니다. 소스 클러스터 이름이 있는 이름을 보류하는 대신 주제는 원래 이름을 유지합니다. 이 선택적 설정은 활성/수동 백업 및 데이터 마이그레이션에 유용합니다. 모든 커넥터에 대해 속성을 지정해야 합니다. 양방향(active/active) 복제의 경우
DefaultReplicationPolicy클래스를 사용하여 원격 주제의 이름을 자동으로 변경하고 모든 커넥터의replication.policy.separator속성을 지정하여 사용자 지정 구분자를 추가합니다. - 25
- 연결 검사를 수행하는
MirrorHeartbeatConnector에 대한 구성입니다. 구성이 기본 구성 옵션을 덮어씁니다. - 26
- 대상 클러스터에서 생성된 하트비트 주제의 복제 요인입니다.
- 27
- 오프셋을 추적하는
MirrorCheckpointConnector에 대한 구성입니다. 구성이 기본 구성 옵션을 덮어씁니다. - 28
- 대상 클러스터에서 생성된 체크포인트 주제의 복제 요인입니다.
- 29
- 새 소비자 그룹의 점검 빈도를 변경하는 선택적 설정입니다. 기본값은 10분마다 확인용입니다.
- 30
- 활성/수동 구성의 복구에 유용한 소비자 그룹 오프셋을 동기화하는 선택적 설정입니다. 동기화는 기본적으로 활성화되어 있지 않습니다.
- 31
- 소비자 그룹 오프셋의 동기화가 활성화된 경우 동기화 빈도를 조정할 수 있습니다.
- 32
- 오프셋 추적의 검사 빈도를 조정합니다. 오프셋 동기화의 빈도를 변경하는 경우 이러한 검사의 빈도를 조정해야 할 수도 있습니다.
- 33
- 쉼표로 구분된 목록 또는 정규식 패턴으로 정의된 소스 클러스터의 복제를 주제로 지정합니다. 소스 커넥터는 지정된 항목을 복제합니다. 체크포인트 커넥터는 지정된 항목에 대한 오프셋을 추적합니다. 여기에서는 이름으로 세 가지 주제를 요청합니다.
- 34
- 쉼표로 구분된 목록 또는 정규식 패턴으로 정의된 소스 클러스터의 소비자 그룹 복제. 체크포인트 커넥터는 지정된 소비자 그룹을 복제합니다. 여기에서는 이름으로 세 개의 소비자 그룹을 요청합니다.
- 35
- 지원되는 리소스(현재
cpu및memory) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다. - 36
- 지정된 Kafka Connect 로거 및 로그 수준이 직접(
인라인) 또는 ConfigMap을 통해 간접적으로(외부)됩니다. 사용자 정의 Log4j 구성은 ConfigMap의log4j.properties또는log4j2.properties키 아래에 배치해야 합니다. Kafka Connectlog4j.rootLogger로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다. - 37
- 컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
- 38
- Kafka MirrorMaker를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
- 39
- ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
- 40
- SPECIALIZED OPTION: 배포에 대한 Rack 인식 구성입니다. 이는 지역이 아닌 동일한 위치 내의 배포를 위한 특수 옵션입니다. 리더 복제본 대신 커넥터가 가장 가까운 복제본에서 사용할 수 있도록 하려면 이 옵션을 사용합니다. 경우에 따라 가장 가까운 복제본에서 소비하면 네트워크 사용률을 개선하거나 비용을 절감할 수 있습니다.
topologyKey는 랙 ID가 포함된 노드 레이블과 일치해야 합니다. 이 구성에 사용된 예제에서는 표준topology.kubernetes.io/zone레이블을 사용하는 영역을 지정합니다. 가장 가까운 복제본에서 사용하려면 Kafka 브로커 구성에서RackAwareReplicaSelector를 활성화합니다. - 41
- 템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
- 42
- 환경 변수는 분산 추적에 대해 설정됩니다.
- 43
- OpenTelemetry를 사용하여 분산 추적을 활성화합니다.
- 44
- Kafka MirrorMaker에 환경 변수로 마운트된 OpenShift Secret의 외부 구성입니다. 구성 공급자 플러그인을 사용하여 외부 소스에서 구성 값을 로드할 수도 있습니다.
9.7.1. 활성/활성 또는 활성/패시브 모드 구성 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker 2를 활성/패시브 또는 활성 / 활성 클러스터 구성에서 사용할 수 있습니다.
- 활성/활성 클러스터 구성
- 활성/활성 구성에는 데이터를 양방향으로 복제하는 두 개의 활성 클러스터가 있습니다. 애플리케이션은 둘 중 하나의 클러스터를 사용할 수 있습니다. 각 클러스터는 동일한 데이터를 제공할 수 있습니다. 이렇게 하면 서로 다른 지리적 위치에서 동일한 데이터를 사용할 수 있습니다. 소비자 그룹이 두 클러스터에서 모두 활성화되므로 복제된 항목에 대한 소비자 오프셋은 소스 클러스터와 다시 동기화되지 않습니다.
- 활성/수동 클러스터 구성
- 활성/수동 구성에는 수동 클러스터에 데이터를 복제하는 활성 클러스터 복제가 있습니다. 패시브 클러스터는 대기 상태로 유지됩니다. 시스템 장애 시 데이터 복구에 수동 클러스터를 사용할 수 있습니다.
생산자와 소비자는 활성 클러스터에만 연결할 것으로 예상됩니다. 각 대상 대상에 MirrorMaker 2 클러스터가 필요합니다.
9.7.1.1. 양방향 복제(활성/활성) 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker 2 아키텍처는 활성/활성 클러스터 구성에서 양방향 복제를 지원합니다.
각 클러스터는 소스 및 원격 주제의 개념을 사용하여 다른 클러스터의 데이터를 복제합니다. 각 클러스터에 동일한 항목이 저장되므로 원격 주제는 MirrorMaker 2로 이름이 자동으로 변경되어 소스 클러스터를 나타냅니다. 원래 클러스터의 이름 앞에 주제 이름 앞에 추가됩니다.
그림 9.1. 주제 이름 변경
원래 클러스터에 플래그를 지정하면 주제가 해당 클러스터로 다시 복제되지 않습니다.
원격 주제를 통한 복제 개념은 데이터 집계가 필요한 아키텍처를 구성할 때 유용합니다. 소비자는 별도의 집계 클러스터 없이도 동일한 클러스터 내의 소스 및 원격 주제를 구독할 수 있습니다.
9.7.1.2. Unidirectional replication (active/passive) 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker 2 아키텍처는 활성/수동 클러스터 구성에서 비방향 복제를 지원합니다.
활성/수동 클러스터 구성을 사용하여 백업을 수행하거나 데이터를 다른 클러스터로 마이그레이션할 수 있습니다. 이 경우 원격 주제의 자동 이름 변경을 원하지 않을 수 있습니다.
소스 커넥터 구성에 IdentityReplicationPolicy 를 추가하여 자동 이름 변경을 덮어쓸 수 있습니다. 이 구성을 적용하면 주제는 원래 이름을 유지합니다.
9.7.2. 여러 인스턴스의 MirrorMaker 2 구성 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 Streams for Apache Kafka는 MirrorMaker 2가 실행되는 Kafka Connect 프레임워크에서 사용하는 내부 주제의 그룹 ID와 이름을 구성합니다. MirrorMaker 2의 여러 인스턴스를 실행하고 동일한 connectCluster 값을 공유하는 경우 다음 구성 속성을 사용하여 이러한 기본 설정을 변경해야 합니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
connectCluster: "my-cluster-target"
clusters:
- alias: "my-cluster-target"
config:
group.id: my-connect-cluster
offset.storage.topic: my-connect-cluster-offsets
config.storage.topic: my-connect-cluster-configs
status.storage.topic: my-connect-cluster-status
# ...
# ...
세 주제의 값은 동일한 group.id 가 있는 모든 인스턴스에 대해 동일해야 합니다.
connectCluster 설정은 내부 주제용으로 Kafka Connect에서 사용하는 대상 Kafka 클러스터의 별칭을 지정합니다. 결과적으로 connectCluster, 그룹 ID 및 내부 주제 이름 지정 구성에 대한 수정은 대상 Kafka 클러스터에 따라 다릅니다. 두 개의 MirrorMaker 2 인스턴스가 동일한 소스 Kafka 클러스터 또는 각 MirrorMaker 2 인스턴스에 다른 connectCluster 설정 및 대상 클러스터가 있는 활성 활성 모드에서 변경할 필요가 없습니다.
그러나 여러 MirrorMaker 2 인스턴스가 동일한 connectCluster 를 공유하는 경우 동일한 대상 Kafka 클러스터에 연결하는 각 인스턴스가 동일한 값으로 배포됩니다. 실제로 모든 인스턴스가 클러스터를 형성하고 동일한 내부 주제를 사용합니다.
동일한 내부 주제를 사용하려는 여러 인스턴스가 예기치 않은 오류가 발생하므로 각 인스턴스에 대한 이러한 속성 값을 변경해야 합니다.
9.7.3. MirrorMaker 2 커넥터 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터 간 데이터 동기화를 오케스트레이션하는 내부 커넥터에 대해 MirrorMaker 2 커넥터 구성을 사용합니다.
MirrorMaker 2는 다음 커넥터로 구성됩니다.
MirrorSourceConnector-
소스 커넥터는 소스 클러스터에서 대상 클러스터로 주제를 복제합니다. 또한 ACL을 복제하고
MirrorCheckpointConnector를 실행하는 데 필요합니다. MirrorCheckpointConnector- 체크포인트 커넥터는 주기적으로 오프셋을 추적합니다. 활성화하면 소스 클러스터와 대상 클러스터 간에 소비자 그룹 오프셋도 동기화합니다.
MirrorHeartbeatConnector- 하트비트 커넥터는 소스 클러스터와 대상 클러스터 간의 연결을 주기적으로 확인합니다.
다음 표에서는 커넥터 속성과 이를 사용하도록 구성된 커넥터에 대해 설명합니다.
| 속성 | sourceConnector | checkpointConnector | heartbeatConnector |
|---|---|---|---|
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | |
| ✓ | ✓ | |
| ✓ | ✓ | |
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ |
9.7.3.1. 소비자 그룹 오프셋 주제의 위치 변경 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker 2는 내부 주제를 사용하여 소비자 그룹의 오프셋을 추적합니다.
offset-syncs주제-
offset-syncs주제는 레코드 메타데이터에서 복제된 주제 파티션의 소스 및 대상 오프셋을 매핑합니다. Checkpoints주제-
Checkpoints주제는 각 소비자 그룹의 복제된 주제 파티션에 대해 소스 및 대상 클러스터에 마지막으로 커밋된 오프셋을 매핑합니다.
MirrorMaker 2에서 내부적으로 사용하므로 이러한 주제와 직접 상호 작용하지 않습니다.
MirrorCheckpointConnector 는 오프셋 추적을 위한 체크포인트 를 내보냅니다. 체크포인트 항목에 대한 오프셋은 구성을 통해 미리 정해진 간격으로 추적됩니다. 두 항목 모두 장애 조치의 올바른 오프셋 위치에서 복제를 완전히 복원할 수 있습니다.
offset-syncs 주제의 위치는 기본적으로 소스 클러스터입니다. offset-syncs.topic.location 커넥터 구성을 사용하여 이를 대상 클러스터로 변경할 수 있습니다. 주제가 포함된 클러스터에 대한 읽기/쓰기 액세스 권한이 필요합니다. 대상 클러스터를 offset-syncs 주제의 위치로 사용하면 소스 클러스터에 대한 읽기 권한만 있는 경우에도 MirrorMaker 2를 사용할 수 있습니다.
9.7.3.2. 소비자 그룹 오프셋 동기화 링크 복사링크가 클립보드에 복사되었습니다!
__consumer_offsets 주제는 각 소비자 그룹에 대해 커밋된 오프셋에 대한 정보를 저장합니다. 오프셋 동기화는 소스 클러스터의 소비자 그룹에 대한 소비자 오프셋을 대상 클러스터의 소비자 오프셋 주제로 주기적으로 전송합니다.
오프셋 동기화는 특히 활성/수동 구성에서 유용합니다. 활성 클러스터가 다운되면 소비자 애플리케이션은 패시브(standby) 클러스터로 전환하고 마지막으로 전송된 오프셋 위치에서 선택할 수 있습니다.
주제 오프셋 동기화를 사용하려면 체크포인트 커넥터 구성에 sync.group.offsets.enabled 를 추가하고 속성을 true 로 설정하여 동기화를 활성화합니다. 동기화는 기본적으로 비활성화되어 있습니다.
소스 커넥터에서 IdentityReplicationPolicy 를 사용하는 경우 Checkpoint 커넥터 구성에서도 구성해야 합니다. 이렇게 하면 미러링된 소비자 오프셋이 올바른 항목에 적용됩니다.
소비자 오프셋은 대상 클러스터에서 활성 상태가 아닌 소비자 그룹에 대해서만 동기화됩니다. 소비자 그룹이 대상 클러스터에 있는 경우 동기화를 수행할 수 없으며 UNKNOWN_MEMBER_ID 오류가 반환됩니다.
활성화하면 소스 클러스터의 오프셋 동기화가 주기적으로 수행됩니다. checkpoint 커넥터 구성에 sync.group.offsets.interval.seconds 및 emit.checkpoints.interval.seconds 를 추가하여 빈도를 변경할 수 있습니다. 속성은 소비자 그룹 오프셋이 동기화되는 빈도(초)와 오프셋 추적을 위해 내보낸 체크포인트의 빈도를 지정합니다. 두 속성의 기본값은 60초입니다. 기본적으로 10분마다 수행되는 refresh.groups.interval.seconds 속성을 사용하여 새 소비자 그룹의 점검 빈도를 변경할 수도 있습니다.
동기화는 시간 기반이므로 소비자가 수동 클러스터로 전환하면 메시지가 중복될 수 있습니다.
Java로 작성된 애플리케이션이 있는 경우 RemoteClusterUtils.java 유틸리티를 사용하여 애플리케이션을 통해 오프셋을 동기화할 수 있습니다. 유틸리티는 체크포인트 항목에서 소비자 그룹의 원격 오프셋을 가져옵니다.
9.7.3.3. 하트비트 커넥터 사용 시기 결정 링크 복사링크가 클립보드에 복사되었습니다!
하트비트 커넥터는 하트비트를 내보내 소스와 대상 Kafka 클러스터 간의 연결을 확인합니다. 내부 하트비트 주제는 소스 클러스터에서 복제되므로 하트비트 커넥터를 소스 클러스터에 연결해야 합니다. 하트비트 주제는 대상 클러스터에 있으며 이를 통해 다음을 수행할 수 있습니다.
- 데이터를 미러링하고 있는 모든 소스 클러스터 식별
- 미러링 프로세스의 활성 및 대기 시간 확인
이로 인해 프로세스가 중단되거나 어떤 이유로든 중지되었는지 확인하는 데 도움이 됩니다. 하트비트 커넥터는 Kafka 클러스터 간의 미러링 프로세스를 모니터링하는 데 중요한 도구가 될 수 있지만 항상 사용할 필요는 없습니다. 예를 들어 배포에 네트워크 대기 시간이 짧고 또는 적은 수의 주제가 있는 경우 로그 메시지 또는 기타 모니터링 툴을 사용하여 미러링 프로세스를 모니터링하는 것이 좋습니다. 하트비트 커넥터를 사용하지 않으려면 MirrorMaker 2 구성에서 생략하면 됩니다.
9.7.3.4. MirrorMaker 2 커넥터 구성 조정 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker 2 커넥터가 제대로 작동하도록 하려면 커넥터 간에 특정 구성 설정을 조정해야 합니다. 특히 다음 속성이 모든 적용 가능한 커넥터에서 동일한 값을 갖도록 합니다.
-
replication.policy.class -
replication.policy.separator -
offset-syncs.topic.location -
topic.filter.class
예를 들어 replication.policy.class 의 값은 source, checkpoint, heartbeat 커넥터에 대해 동일해야 합니다. 설정이 일치하지 않거나 누락되면 데이터 복제 또는 오프셋 동기화에 문제가 발생하므로 동일한 설정으로 구성된 모든 관련 커넥터를 유지해야 합니다.
9.7.4. MirrorMaker 2 커넥터 생산자 및 소비자 구성 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker 2 커넥터는 내부 생산자와 소비자를 사용합니다. 필요한 경우 이러한 생산자 및 소비자를 구성하여 기본 설정을 덮어쓸 수 있습니다.
예를 들어 많은 양의 메시지를 더 잘 수용하도록 대상 Kafka 클러스터에 주제를 보내는 소스 생산자의 batch.size 를 늘릴 수 있습니다.
생산자 및 소비자 구성 옵션은 MirrorMaker 2 구현에 따라 다르며 변경될 수 있습니다.
다음 표에서는 각 커넥터의 생산자 및 소비자와 구성을 추가할 수 있는 위치를 설명합니다.
| 유형 | 설명 | 설정 |
|---|---|---|
| 생산자 | 대상 Kafka 클러스터로 주제 메시지를 보냅니다. 대량의 데이터를 처리할 때 이 생산자의 구성을 조정하는 것이 좋습니다. |
|
| 생산자 |
복제된 주제 파티션에 대한 소스 및 대상 오프셋을 매핑하는 |
|
| 소비자 | 소스 Kafka 클러스터에서 주제 메시지를 검색합니다. |
|
| 유형 | 설명 | 설정 |
|---|---|---|
| 생산자 | 소비자 오프셋 체크포인트를 내보냅니다. |
|
| 소비자 |
|
|
target Kafka 클러스터를 offset-syncs 주제의 위치로 사용하도록 offset-syncs.topic.location 을 설정할 수 있습니다.
| 유형 | 설명 | 설정 |
|---|---|---|
| 생산자 | 하트비트를 내보냅니다. |
|
다음 예제에서는 생산자와 소비자를 구성하는 방법을 보여줍니다.
커넥터 생산자 및 소비자를 위한 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
version: 3.7.0
# ...
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector:
tasksMax: 5
config:
producer.override.batch.size: 327680
producer.override.linger.ms: 100
producer.request.timeout.ms: 30000
consumer.fetch.max.bytes: 52428800
# ...
checkpointConnector:
config:
producer.override.request.timeout.ms: 30000
consumer.max.poll.interval.ms: 300000
# ...
heartbeatConnector:
config:
producer.override.request.timeout.ms: 30000
# ...
9.7.5. 최대 데이터 복제 작업 수 지정 링크 복사링크가 클립보드에 복사되었습니다!
Connectors는 Kafka 내외로 데이터를 이동하는 작업을 생성합니다. 각 커넥터는 작업을 실행하는 작업자 Pod 그룹에 분산된 하나 이상의 작업으로 구성됩니다. 많은 수의 파티션을 복제하거나 많은 수의 소비자 그룹의 오프셋을 동기화할 때 작업 수를 늘리는 데 도움이 될 수 있습니다.
작업은 병렬로 실행됩니다. 작업자에는 하나 이상의 작업이 할당됩니다. 단일 작업은 하나의 작업자 Pod에서 처리하므로 작업보다 더 많은 작업자 Pod가 필요하지 않습니다. 작업자보다 많은 작업이 있는 경우 작업자는 여러 작업을 처리합니다.
tasksMax 속성을 사용하여 MirrorMaker 구성에서 최대 커넥터 작업 수를 지정할 수 있습니다. 최대 작업 수를 지정하지 않으면 기본 설정은 단일 작업입니다.
하트비트 커넥터는 항상 단일 작업을 사용합니다.
소스 및 체크포인트 커넥터에 대해 시작된 작업 수는 가능한 최대 작업 수와 tasksMax 값 사이의 낮은 값입니다. 소스 커넥터의 경우 가능한 최대 작업 수가 소스 클러스터에서 복제되는 각 파티션에 대해 1개입니다. 체크포인트 커넥터의 경우 가능한 최대 작업 수는 소스 클러스터에서 복제되는 각 소비자 그룹에 대해 하나씩입니다. 최대 작업 수를 설정할 때 프로세스를 지원하는 파티션 수와 하드웨어 리소스를 고려하십시오.
인프라가 처리 오버헤드를 지원하는 경우 작업 수를 늘리면 처리량과 대기 시간이 개선될 수 있습니다. 예를 들어 작업을 더 추가하면 많은 수의 파티션 또는 소비자 그룹이 있는 경우 소스 클러스터를 폴링하는 데 걸리는 시간이 줄어듭니다.
소스 커넥터의 작업 수를 늘리면 파티션 수가 많은 경우에 유용합니다.
소스 커넥터의 작업 수 증가
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
# ...
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector:
tasksMax: 10
# ...
체크포인트 커넥터에 대한 작업 수를 늘리면 많은 수의 소비자 그룹이 있을 때 유용합니다.
체크포인트 커넥터의 작업 수 증가
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
# ...
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
checkpointConnector:
tasksMax: 10
# ...
기본적으로 MirrorMaker 2는 10분마다 새 소비자 그룹을 확인합니다. refresh.groups.interval.seconds 구성을 조정하여 빈도를 변경할 수 있습니다. 더 낮게 조정할 때 주의하십시오. 더 자주 검사하면 성능에 부정적인 영향을 미칠 수 있습니다.
9.7.5.1. 커넥터 작업 확인 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus 및 Grafana를 사용하여 배포를 모니터링하는 경우 MirrorMaker 2 성능을 확인할 수 있습니다. Apache Kafka용 Streams와 함께 제공되는 MirrorMaker 2 Grafana 대시보드 예제에서는 작업 및 대기 시간과 관련된 다음 메트릭을 보여줍니다.
- 작업 수
- 복제 대기 시간
- 오프셋 동기화 대기 시간
9.7.6. 원격 주제에 대한 ACL 규칙 동기화 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams와 함께 MirrorMaker 2를 사용하는 경우 원격 주제에 대한 ACL 규칙을 동기화할 수 있습니다. 그러나 이 기능은 User Operator를 사용하지 않는 경우에만 사용할 수 있습니다.
User Operator 없이 type: 간단한 권한 부여를 사용하는 경우 브로커에 대한 액세스를 관리하는 ACL 규칙은 원격 주제에도 적용됩니다. 즉, 소스 항목에 대한 읽기 액세스 권한이 있는 사용자도 해당하는 원격 항목을 읽을 수 있습니다.
OAuth 2.0 인증에서는 이러한 방식으로 원격 항목에 대한 액세스를 지원하지 않습니다.
9.7.7. Kafka MirrorMaker 2 배포 보안 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 MirrorMaker 2 배포를 보호하는 데 필요한 구성을 간략하게 설명합니다.
소스 Kafka 클러스터 및 대상 Kafka 클러스터에 대한 별도의 구성이 필요합니다. 또한 소스 및 대상 Kafka 클러스터에 연결하기 위해 MirrorMaker에 필요한 인증 정보를 제공하려면 별도의 사용자 구성이 필요합니다.
Kafka 클러스터의 경우 OpenShift 클러스터 내에서 보안 연결을 위해 내부 리스너를 지정하고 OpenShift 클러스터 외부의 연결에 대한 외부 리스너를 지정합니다.
인증 및 권한 부여 메커니즘을 구성할 수 있습니다. 소스 및 대상 Kafka 클러스터에 대해 구현된 보안 옵션은 MirrorMaker 2에 구현된 보안 옵션과 호환되어야 합니다.
클러스터 및 사용자 인증 인증 정보를 생성한 후 보안 연결을 위해 MirrorMaker 구성에 지정합니다.
이 절차에서는 Cluster Operator가 생성한 인증서를 사용하지만 자체 인증서를 설치하여 교체할 수 있습니다. 외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서를 사용하도록 리스너를 구성할 수도 있습니다.
시작하기 전
이 절차를 시작하기 전에 Streams for Apache Kafka에서 제공하는 구성 파일 예제 를 살펴보십시오. 여기에는 mTLS 또는 SCRAM-SHA-512 인증을 사용하여 MirrorMaker 2 배포 보안을 위한 예제가 포함됩니다. 예제에서는 OpenShift 클러스터 내에서 연결하기 위한 내부 리스너를 지정합니다.
이 예제에서는 소스 및 대상 Kafka 클러스터에서 사용자 작업을 허용하는 ACL을 포함하여 전체 권한 부여 구성을 제공합니다.
소스 및 대상 Kafka 클러스터에 대한 사용자 액세스를 구성할 때 ACL은 내부 MirrorMaker 2 커넥터에 대한 액세스 권한을 부여하고 대상 클러스터의 기본 Kafka Connect 프레임워크에서 사용하는 클러스터 그룹 및 내부 항목에 대한 읽기/쓰기 액세스 권한을 부여해야 합니다. 클러스터 그룹 또는 내부 주제의 이름이 여러 인스턴스에 대해 MirrorMaker 2를 구성하는 경우 ACL 구성에 해당 이름을 사용합니다.
간단한 인증에서는 Kafka AclAuthorizer 및 StandardAuthorizer 플러그인에서 관리하는 ACL 규칙을 사용하여 적절한 액세스 수준을 보장합니다. 간단한 인증을 사용하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 AclRule 스키마 참조를 참조하십시오.
사전 요구 사항
- Apache Kafka 스트림이 실행 중입니다.
- 소스 및 대상 클러스터의 별도의 네임스페이스
이 절차에서는 소스 및 대상 Kafka 클러스터가 별도의 네임스페이스에 설치되어 있다고 가정합니다. Topic Operator를 사용하려면 이 작업을 수행해야 합니다. Topic Operator는 지정된 네임스페이스의 단일 클러스터만 감시합니다.
클러스터를 네임스페이스로 분리하면 네임스페이스 외부에서 액세스할 수 있도록 클러스터 시크릿을 복사해야 합니다. MirrorMaker 구성에서 시크릿을 참조해야 합니다.
프로세스
대상
Kafka클러스터를 보호하는 두 개의 Kafka 리소스와 소스 Kafka 클러스터를 보호하도록 구성합니다.인증에 대한 리스너 구성을 추가하고 권한을 활성화할 수 있습니다.
이 예에서 내부 리스너는 TLS 암호화 및 mTLS 인증을 사용하여 Kafka 클러스터에 대해 구성됩니다. Kafka
간단한승인이 활성화되어 있습니다.TLS 암호화 및 mTLS 인증을 사용한 소스 Kafka 클러스터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-source-cluster spec: kafka: version: 3.7.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.7" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}TLS 암호화 및 mTLS 인증을 사용한 대상 Kafka 클러스터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-target-cluster spec: kafka: version: 3.7.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.7" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}별도의 네임스페이스에서
Kafka리소스를 생성하거나 업데이트합니다.oc apply -f <kafka_configuration_file> -n <namespace>Cluster Operator는 리스너를 생성하고 Kafka 클러스터 내에서 인증을 활성화하기 위해 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정합니다.
인증서는 시크릿 <
cluster_name> -cluster-ca-cert에 생성됩니다.두 개의
Kafka리소스를 구성합니다. 하나는 소스 Kafka 클러스터의 사용자용이고 하나는 대상 Kafka 클러스터 사용자용입니다.-
해당 소스 및 대상 Kafka 클러스터와 동일한 인증 및 권한 부여 유형을 구성합니다. 예를 들어 소스 Kafka 클러스터의
Kafka구성에tls인증 및간단한인증 유형을 사용한 경우KafkaUser구성에서 동일하게 사용합니다. - 소스 및 대상 Kafka 클러스터에서 작업을 허용하도록 MirrorMaker 2에 필요한 ACL을 구성합니다.
mTLS 인증을 위한 소스 사용자 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-source-user labels: strimzi.io/cluster: my-source-cluster spec: authentication: type: tls authorization: type: simple acls: # MirrorSourceConnector - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - Create - DescribeConfigs - Read - Write - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - DescribeConfigs - Read # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: # Needed for every group for which offsets are synced type: group name: "*" operations: - Describe - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - ReadmTLS 인증을 위한 대상 사용자 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-target-user labels: strimzi.io/cluster: my-target-cluster spec: authentication: type: tls authorization: type: simple acls: # cluster group - resource: type: group name: mirrormaker2-cluster operations: - Read # access to config.storage.topic - resource: type: topic name: mirrormaker2-cluster-configs operations: - Create - Describe - DescribeConfigs - Read - Write # access to status.storage.topic - resource: type: topic name: mirrormaker2-cluster-status operations: - Create - Describe - DescribeConfigs - Read - Write # access to offset.storage.topic - resource: type: topic name: mirrormaker2-cluster-offsets operations: - Create - Describe - DescribeConfigs - Read - Write # MirrorSourceConnector - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - Create - Alter - AlterConfigs - Write # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: type: topic name: my-source-cluster.checkpoints.internal operations: - Create - Describe - Read - Write - resource: # Needed for every group for which the offset is synced type: group name: "*" operations: - Read - Describe # MirrorHeartbeatConnector - resource: type: topic name: heartbeats operations: - Create - Describe - Write참고type을tls-external로 설정하여 User Operator 외부에서 발급된 인증서를 사용할 수 있습니다. 자세한 내용은KafkaUserSpec스키마 참조를 참조하십시오.-
해당 소스 및 대상 Kafka 클러스터와 동일한 인증 및 권한 부여 유형을 구성합니다. 예를 들어 소스 Kafka 클러스터의
소스 및 대상 Kafka 클러스터에 대해 생성한 각 네임스페이스에서
KafkaUser리소스를 생성하거나 업데이트합니다.oc apply -f <kafka_user_configuration_file> -n <namespace>User Operator는 선택한 인증 유형에 따라 클라이언트(MirrorMaker)를 나타내는 사용자와 클라이언트 인증에 사용되는 보안 인증 정보를 생성합니다.
User Operator는
KafkaUser리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 mTLS 인증을 위한 개인 및 공개 키가 포함되어 있습니다. 공개 키는 클라이언트 CA에서 서명한 사용자 인증서에 포함됩니다.소스 및 대상 Kafka 클러스터에 연결하기 위해 인증 세부 정보를 사용하여
KafkaMirrorMaker2리소스를 구성합니다.TLS 암호화 및 mTLS 인증을 사용한 MirrorMaker 2 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker-2 spec: version: 3.7.0 replicas: 1 connectCluster: "my-target-cluster" clusters: - alias: "my-source-cluster" bootstrapServers: my-source-cluster-kafka-bootstrap:9093 tls:1 trustedCertificates: - secretName: my-source-cluster-cluster-ca-cert certificate: ca.crt authentication:2 type: tls certificateAndKey: secretName: my-source-user certificate: user.crt key: user.key - alias: "my-target-cluster" bootstrapServers: my-target-cluster-kafka-bootstrap:9093 tls:3 trustedCertificates: - secretName: my-target-cluster-cluster-ca-cert certificate: ca.crt authentication:4 type: tls certificateAndKey: secretName: my-target-user certificate: user.crt key: user.key config: # -1 means it will use the default replication factor configured in the broker config.storage.replication.factor: -1 offset.storage.replication.factor: -1 status.storage.replication.factor: -1 mirrors: - sourceCluster: "my-source-cluster" targetCluster: "my-target-cluster" sourceConnector: config: replication.factor: 1 offset-syncs.topic.replication.factor: 1 sync.topic.acls.enabled: "false" heartbeatConnector: config: heartbeats.topic.replication.factor: 1 checkpointConnector: config: checkpoints.topic.replication.factor: 1 sync.group.offsets.enabled: "true" topicsPattern: "topic1|topic2|topic3" groupsPattern: "group1|group2|group3"대상 Kafka 클러스터와 동일한 네임스페이스에서
KafkaMirrorMaker2리소스를 생성하거나 업데이트합니다.oc apply -f <mirrormaker2_configuration_file> -n <namespace_of_target_cluster>
9.7.8. 수동으로 MirrorMaker 2 커넥터를 중지하거나 일시 중지 링크 복사링크가 클립보드에 복사되었습니다!
KafkaMirrorMaker2 리소스를 사용하여 내부 MirrorMaker 커넥터를 구성하는 경우 상태 구성을 사용하여 커넥터를 중지하거나 일시 중지합니다. 커넥터 및 작업이 인스턴스화되는 일시 중지된 상태와 달리 커넥터를 중지하면 활성 프로세스가 없는 구성만 유지됩니다. 실행으로부터 커넥터를 중지하는 것은 단순히 일시 중지하는 것보다 장기간에 더 적합할 수 있습니다. 일시 중지된 커넥터를 다시 시작하는 속도가 빨라지지만 중지된 커넥터는 메모리와 리소스를 확보할 수 있는 이점이 있습니다.
상태 구성은 KafkaMirrorMaker2ConnectorSpec 스키마의 (더 이상 사용되지 않음) 일시 중지 구성을 교체하여 커넥터를 일시 중지할 수 있습니다. 이전에 일시 중지 구성을 사용하여 커넥터를 일시 중지한 경우 충돌을 방지하기 위해 상태 구성만 사용하도록 전환하는 것이 좋습니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
프로세스
일시 중지 또는 중지하려는 MirrorMaker 2 커넥터를 제어하는
KafkaMirrorMaker2사용자 정의 리소스의 이름을 찾습니다.oc get KafkaMirrorMaker2KafkaMirrorMaker2리소스를 편집하여 커넥터를 중지하거나 일시 중지합니다.MirrorMaker 2 커넥터를 중지하는 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.7.0 replicas: 3 connectCluster: "my-cluster-target" clusters: # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 10 autoRestart: enabled: true state: stopped # ...상태구성을중지 또는 일시중지하도록 변경합니다. 이 속성이실행 중이아닌 경우 커넥터의 기본 상태입니다.KafkaMirrorMaker2구성에 변경 사항을 적용합니다.상태를실행중이거나 구성을 제거하여 커넥터를 다시 시작할 수 있습니다.
또는 Kafka Connect API를 노출 하고 중지 및 일시 중지 를 사용하여 커넥터가 실행되지 않도록 중지할 수 있습니다. 예를 들어 PUT /connectors/<connector_name>/stop. 그런 다음 resume 끝점을 사용하여 다시 시작할 수 있습니다.
9.7.9. 수동으로 MirrorMaker 2 커넥터 다시 시작 링크 복사링크가 클립보드에 복사되었습니다!
strimzi.io/restart-connector 주석을 사용하여 MirrorMaker 2 커넥터의 재시작을 수동으로 트리거합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
프로세스
재시작하려는
Kafka MirrorMaker 2커넥터를 제어하는 KafkaMirrorMaker2 사용자 정의 리소스의 이름을 찾습니다.oc get KafkaMirrorMaker2KafkaMirrorMaker2 사용자 정의 리소스에서 다시 시작할
Kafka MirrorMaker 2커넥터의 이름을 찾습니다.oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>OpenShift에서
KafkaMirrorMaker2리소스에 주석을 달아 커넥터 이름을 사용하여 커넥터를 다시 시작합니다.oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector=<mirrormaker_connector_name>"이 예에서는
my-mirror-maker-2클러스터의my-connector커넥터가 다시 시작됩니다.oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector=my-connector"다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).
조정 프로세스에서 주석을 감지한 경우 MirrorMaker 2 커넥터가 다시 시작됩니다. MirrorMaker 2가 요청을 수락하면
KafkaMirrorMaker2사용자 정의 리소스에서 주석이 제거됩니다.
9.7.10. 수동으로 MirrorMaker 2 커넥터 작업 다시 시작 링크 복사링크가 클립보드에 복사되었습니다!
strimzi.io/restart-connector-task 주석을 사용하여 MirrorMaker 2 커넥터의 재시작을 수동으로 트리거합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
프로세스
다시 시작하려는 MirrorMaker 2 커넥터 작업을 제어하는
KafkaMirrorMaker2사용자 정의 리소스의 이름을 찾습니다.oc get KafkaMirrorMaker2KafkaMirrorMaker2사용자 정의 리소스에서 다시 시작할 커넥터 이름 및 작업 ID를 찾습니다.oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>작업 ID는 0부터 시작하여 음수가 아닌 정수입니다.
OpenShift에서
KafkaMirrorMaker2리소스에 주석을 달아 name 및 ID를 사용하여 커넥터 작업을 다시 시작합니다.oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector-task=<mirrormaker_connector_name>:<task_id>"이 예에서는
my-mirror-maker-2클러스터의 my-mirror-maker-2 클러스터의 커넥터my-connector작업0이 다시 시작됩니다.oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector-task=my-connector:0"다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다).
조정 프로세스에서 주석을 감지한 경우 MirrorMaker 2 커넥터 작업이 다시 시작됩니다. MirrorMaker 2가 요청을 수락하면
KafkaMirrorMaker2사용자 정의 리소스에서 주석이 제거됩니다.
9.8. Kafka MirrorMaker 구성 (더 이상 사용되지 않음) 링크 복사링크가 클립보드에 복사되었습니다!
KafkaMirrorMaker 사용자 정의 리소스의 사양 속성을 업데이트하여 Kafka MirrorMaker 배포를 구성합니다.
TLS 또는 SASL 인증을 사용하여 생산자 및 소비자에 대한 액세스 제어를 구성할 수 있습니다. 이 절차에서는 소비자 및 생산자 측에서 TLS 암호화 및 mTLS 인증을 사용하는 구성을 보여줍니다.
Kafka MirrorMaker 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka 사용자 정의 리소스 API 참조를 참조하십시오.
Kafka MirrorMaker 1 (문서에서 MirrorMaker 라고도 함)은 Apache Kafka 3.0.0에서 더 이상 사용되지 않으며 Apache Kafka 4.0.0에서 제거됩니다. 결과적으로 Kafka MirrorMaker 1을 배포하는 데 사용되는 KafkaMirrorMaker 사용자 정의 리소스는 Apache Kafka용 Streams에서도 더 이상 사용되지 않습니다. KafkaMirrorMaker 리소스는 Apache Kafka 4.0.0을 채택할 때 Apache Kafka용 Streams에서 제거됩니다. 대신 KafkaMirrorMaker2 사용자 정의 리소스를 IdentityReplicationPolicy 와 함께 사용합니다.
KafkaMirrorMaker 사용자 정의 리소스 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker
metadata:
name: my-mirror-maker
spec:
replicas: 3
consumer:
bootstrapServers: my-source-cluster-kafka-bootstrap:9092
groupId: "my-group"
numStreams: 2
offsetCommitInterval: 120000
tls:
trustedCertificates:
- secretName: my-source-cluster-ca-cert
certificate: ca.crt
authentication:
type: tls
certificateAndKey:
secretName: my-source-secret
certificate: public.crt
key: private.key
config:
max.poll.records: 100
receive.buffer.bytes: 32768
producer:
bootstrapServers: my-target-cluster-kafka-bootstrap:9092
abortOnSendFailure: false
tls:
trustedCertificates:
- secretName: my-target-cluster-ca-cert
certificate: ca.crt
authentication:
type: tls
certificateAndKey:
secretName: my-target-secret
certificate: public.crt
key: private.key
config:
compression.type: gzip
batch.size: 8192
include: "my-topic|other-topic"
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
mirrormaker.root.logger: INFO
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
image: my-org/my-image:latest
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
mirrorMakerContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
- 1
- 복제본 노드 수입니다.
- 2
- 소비자 및 생산자를 위한 부트스트랩 서버.
- 3
- 소비자의 그룹 ID입니다.
- 4
- 소비자 스트림 수입니다.
- 5
- 오프셋 자동 커밋 간격(밀리초)입니다.
- 6
- TLS 인증서가 소비자 또는 생산자를 위해 X.509 형식으로 저장되는 키 이름이 있는 TLS 암호화입니다. 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
- 7
- mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 소비자 또는 생산자에 대한 인증입니다.
- 8
- 소비자 및 생산자에 대한 Kafka 구성 옵션입니다.
- 9
abortOnSendFailure속성이true로 설정된 경우 Kafka MirrorMaker가 종료되고 메시지 전송 실패 후 컨테이너가 다시 시작됩니다.- 10
- 소스에서 대상 Kafka 클러스터로 미러링된 포함된 주제 목록입니다.
- 11
- 지원되는 리소스(현재
cpu및memory) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다. - 12
- 지정된 로거 및 로그 수준이 직접(
인라인) 또는 ConfigMap을 통해 간접적으로(외부) 추가됩니다. 사용자 정의 Log4j 구성은 ConfigMap의log4j.properties또는log4j2.properties키 아래에 배치해야 합니다. mirrorMaker에는mirrormaker.root.logger라는 단일 로거가 있습니다. 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다. - 13
- 컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
- 14
- Prometheus 지표: 이 예제에서 Prometheus Cryostat 내보내기에 대한 구성이 포함된 ConfigMap을 참조하여 활성화됩니다.
metricsConfig.valueFrom.configMapKeyRef.key아래에 빈 파일이 포함된 ConfigMap에 대한 참조를 사용하여 추가 구성 없이 메트릭을 활성화할 수 있습니다. - 15
- Kafka MirrorMaker를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
- 16
- ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
- 17
- 템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
- 18
- 환경 변수는 분산 추적에 대해 설정됩니다.
- 19
- OpenTelemetry를 사용하여 분산 추적을 활성화합니다.주의
abortOnSendFailure속성을false로 설정하면 생산자가 주제에서 다음 메시지를 보냅니다. 실패한 메시지를 다시 전송하려는 시도가 없기 때문에 원래 메시지가 손실될 수 있습니다.
9.9. Kafka 브리지 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaBridge 사용자 정의 리소스의 spec 속성을 업데이트하여 Kafka Bridge 배포를 구성합니다.
클라이언트 소비자 요청이 다른 Kafka Bridge 인스턴스에서 처리할 때 발생하는 문제를 방지하려면 요청이 올바른 Kafka Bridge 인스턴스로 라우팅되도록 주소 기반 라우팅을 사용해야 합니다. 또한 각 독립적인 Kafka Bridge 인스턴스에는 복제본이 있어야 합니다. Kafka 브리지 인스턴스에는 다른 인스턴스와 공유되지 않는 자체 상태가 있습니다.
Kafka Bridge 클러스터 구성 옵션을 자세히 이해하려면 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.
KafkaBridge 사용자 정의 리소스 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaBridge
metadata:
name: my-bridge
spec:
replicas: 3
bootstrapServers: <cluster_name>-cluster-kafka-bootstrap:9092
tls:
trustedCertificates:
- secretName: my-cluster-cluster-cert
certificate: ca.crt
- secretName: my-cluster-cluster-cert
certificate: ca2.crt
authentication:
type: tls
certificateAndKey:
secretName: my-secret
certificate: public.crt
key: private.key
http:
port: 8080
cors:
allowedOrigins: "https://strimzi.io"
allowedMethods: "GET,POST,PUT,DELETE,OPTIONS,PATCH"
consumer:
config:
auto.offset.reset: earliest
producer:
config:
delivery.timeout.ms: 300000
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
logger.bridge.level: INFO
# enabling DEBUG just for send operation
logger.send.name: "http.openapi.operation.send"
logger.send.level: DEBUG
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
image: my-org/my-image:latest
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
bridgeContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
- 1
- 복제본 노드 수입니다.
- 2
- 대상 Kafka 클러스터에 연결하기 위한 부트스트랩 서버입니다. Kafka 클러스터 이름을 < cluster_name>으로 사용합니다.
- 3
- TLS 인증서가 소스 Kafka 클러스터의 X.509 형식으로 저장되는 키 이름이 있는 TLS 암호화입니다. 인증서가 동일한 시크릿에 저장된 경우 여러 번 나열할 수 있습니다.
- 4
- mTLS, 토큰 기반 OAuth, SASL 기반 SCRAM-SHA-256/SCRAM-SHA-512 또는 PLAIN으로 지정된 Kafka Bridge 클러스터에 대한 인증입니다. 기본적으로 Kafka 브리지는 인증 없이 Kafka 브로커에 연결합니다.
- 5
- Kafka 브로커에 대한 HTTP 액세스
- 6
- CORS 액세스는 선택한 리소스 및 액세스 방법을 지정합니다. 요청의 추가 HTTP 헤더는 Kafka 클러스터에 액세스할 수 있는 원본을 설명합니다.
- 7
- 소비자 구성 옵션.
- 8
- 생산자 구성 옵션.
- 9
- 지원되는 리소스(현재
cpu및memory) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다. - 10
- 지정된 Kafka 브리지 로거 및 로그 수준이 직접(
인라인) 또는 ConfigMap을 통해 간접적으로(외부)됩니다. 사용자 정의 Log4j 구성은 ConfigMap의log4j.properties또는log4j2.properties키 아래에 배치해야 합니다. Kafka 브리지 로거의 경우 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다. - 11
- Kafka 브리지를 실행하는 VM(가상 머신)의 성능을 최적화하는 JVM 구성 옵션입니다.
- 12
- 컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
- 13
- 선택 사항: 특정 상황에서만 권장되는 컨테이너 이미지 구성입니다.
- 14
- 템플릿 사용자 지정. 여기에서 Pod는 유사성 방지를 사용하여 예약되므로 이름이 동일한 노드에 Pod가 예약되지 않습니다.
- 15
- 환경 변수는 분산 추적에 대해 설정됩니다.
- 16
- OpenTelemetry를 사용하여 분산 추적을 활성화합니다.
9.10. Kafka 및 Zoo Cryostat 스토리지 구성 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 스트림은 Kafka 및 Zoo Cryostat의 데이터 스토리지 옵션을 구성하는 유연성을 제공합니다.
지원되는 스토리지 유형은 다음과 같습니다.
- ephemeral (개발에만 권장)
- persistent
- JBOD(Kafka만 해당; Zoo Cryostat에서는 사용할 수 없음)
- 계층화된 스토리지(Early Access)
스토리지를 구성하려면 구성 요소의 사용자 지정 리소스에서 스토리지 속성을 지정합니다. 스토리지 유형은 storage.type 속성을 사용하여 설정됩니다. 노드 풀을 사용하는 경우 Kafka 클러스터에서 사용되는 각 노드 풀에 고유한 스토리지 구성을 지정할 수 있습니다. Kafka 리소스에서 사용할 수 있는 동일한 스토리지 속성도 풀 리소스에서 사용할 수 있습니다.
Kafka NodePool
계층화된 스토리지는 다양한 특성을 가진 스토리지 유형의 병렬 사용을 활용하여 데이터 관리에 더 많은 유연성을 제공합니다. 예를 들어 계층화된 스토리지는 다음을 포함할 수 있습니다.
- 성능 향상 및 높은 비용 블록 스토리지
- 성능 절감 및 비용 객체 스토리지
계층화된 스토리지는 Kafka의 초기 액세스 기능입니다. 계층화된 스토리지를 구성하려면 tieredStorage 속성을 지정합니다. 계층화된 스토리지는 Kafka 사용자 정의 리소스를 사용하여 클러스터 수준에서만 구성됩니다.
스토리지 관련 스키마 참조는 스토리지 구성 속성에 대한 자세한 정보를 제공합니다.
Kafka 클러스터를 배포한 후에는 스토리지 유형을 변경할 수 없습니다.
9.10.1. 데이터 스토리지 고려 사항 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림이 제대로 작동하려면 효율적인 데이터 스토리지 인프라가 필요합니다. 블록 스토리지를 사용하는 것이 좋습니다. Apache Kafka의 스트림은 블록 스토리지에서만 사용하도록 테스트됩니다. NFS와 같은 파일 스토리지는 테스트되지 않으며 작동한다고 보장할 수 없습니다.
블록 스토리지에 대해 다음 옵션 중 하나를 선택합니다.
- Amazon Elastic Block Store(EBS)와 같은 클라우드 기반 블록 스토리지 솔루션
- 로컬 영구 볼륨을 사용하는 영구스토리지
- 파이버 채널 또는 iSCSI와 같은 프로토콜에서 액세스하는 SAN(Storage Area Network) 볼륨
Apache Kafka의 스트림에는 OpenShift 원시 블록 볼륨이 필요하지 않습니다.
9.10.1.1. 파일 시스템 링크 복사링크가 클립보드에 복사되었습니다!
Kafka는 메시지를 저장하기 위해 파일 시스템을 사용합니다. Apache Kafka의 스트림은 Kafka와 함께 일반적으로 사용되는 XFS 및 ext4 파일 시스템과 호환됩니다. 파일 시스템을 선택하고 설정할 때 배포의 기본 아키텍처 및 요구 사항을 고려하십시오.
자세한 내용은 Kafka 문서 의 파일 시스템 선택을 참조하십시오.
9.10.1.2. 디스크 사용량 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 및 Zoo Cryostat에 대해 별도의 디스크를 사용합니다.
SSD(Solid-State Drive)는 필수는 아니지만 여러 주제로 데이터를 보내고 비동기적으로 수신하는 대규모 클러스터에서 Kafka의 성능을 향상시킬 수 있습니다. SSD는 Zoo Cryostat에서 특히 효과적이며 빠르고 짧은 대기 시간 데이터 액세스가 필요합니다.
Kafka 및 Zoo Cryostat 둘 다 데이터 복제가 내장되어 있기 때문에 복제된 스토리지를 프로비저닝할 필요가 없습니다.
9.10.2. 임시 스토리지 링크 복사링크가 클립보드에 복사되었습니다!
임시 데이터 스토리지는 일시적인 것입니다. 노드의 모든 Pod는 로컬 임시 스토리지 공간을 공유합니다. 데이터를 사용하는 Pod가 실행 중인 동안 데이터가 유지됩니다. Pod가 삭제되면 데이터가 손실됩니다. Pod는 고가용성 환경에서 데이터를 복구할 수 있습니다.
일시적인 특성으로 인해 임시 스토리지는 개발 및 테스트에만 권장됩니다.
임시 스토리지는 emptyDir 볼륨을 사용하여 데이터를 저장합니다. 노드에 Pod가 할당되면 emptyDir 볼륨이 생성됩니다. sizeLimit 속성을 사용하여 emptyDir 의 총 스토리지 양을 설정할 수 있습니다.
임시 스토리지는 복제 인수가 1인 단일 노드 Zoo Cryostat 클러스터 또는 Kafka 항목에 적합하지 않습니다.
임시 스토리지를 사용하려면 Kafka 또는 Zoo Cryostat 리소스의 스토리지 유형 구성을 임시 로 설정합니다. 노드 풀을 사용하는 경우 개별 노드 풀의 스토리지 구성에서 임시 를 지정할 수도 있습니다.
임시 스토리지 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
storage:
type: ephemeral
# ...
zookeeper:
storage:
type: ephemeral
# ...
9.10.2.1. Kafka 로그 디렉터리의 마운트 경로 링크 복사링크가 클립보드에 복사되었습니다!
임시 볼륨은 Kafka 브로커가 다음 경로에 마운트된 로그 디렉터리로 사용합니다.
/var/lib/kafka/data/kafka-logIDX
여기서 IDX 는 Kafka 브로커 Pod 인덱스입니다. 예: /var/lib/kafka/data/kafka-log0.
9.10.3. 영구 스토리지 링크 복사링크가 클립보드에 복사되었습니다!
영구 데이터 스토리지는 시스템 중단 시 데이터를 유지합니다. 영구 데이터 스토리지를 사용하는 Pod의 경우 Pod 오류가 발생하고 다시 시작할 때마다 데이터가 유지됩니다. 영구 특성으로 인해 프로덕션 환경에 영구 스토리지를 사용하는 것이 좋습니다.
Apache Kafka용 Streams에서 영구 스토리지를 사용하려면 Kafka 또는 Zoo Cryostat 리소스의 스토리지 구성에 persistent-claim 을 지정합니다. 노드 풀을 사용하는 경우 개별 노드 풀의 스토리지 구성에 persistent-claim 을 지정할 수도 있습니다.
Pod에서 PVC( 영구 볼륨 클레임 )를 사용하여 PV(영구 볼륨)에서 스토리지 요청을 수행하도록 리소스를 구성합니다. PV는 필요에 따라 생성되며 이를 사용하는 Pod와 독립적인 스토리지 볼륨을 나타냅니다. PVC는 Pod를 생성할 때 필요한 스토리지 양을 요청합니다. PV의 기본 스토리지 인프라를 이해할 필요가 없습니다. PV가 스토리지 기준과 일치하면 PVC가 PV에 바인딩됩니다.
스토리지 유형을 지정하는 방법은 다음 두 가지가 있습니다.
storage.type: persistent-claim-
persistent-claim을 스토리지 유형으로 선택하면 단일 영구 스토리지 볼륨이 정의됩니다. storage.type: jbod-
스토리지 유형으로
jbod를 선택하면 고유한 ID를 사용하여 영구 스토리지 볼륨 배열을 정의할 수 있는 유연성이 있습니다.
프로덕션 환경에서는 다음을 구성하는 것이 좋습니다.
-
Kafka 또는 노드 풀의 경우
storage.type을 하나 이상의 영구 볼륨이 있는jbod로 설정합니다. -
Zoo Cryostat의 경우
storage.type을 단일영구볼륨에 대한 영구 클레임으로 설정합니다.
영구 스토리지에는 다음과 같은 구성 옵션도 있습니다.
ID(선택 사항)-
저장 ID 번호입니다. 이 옵션은 JBOD 스토리지 선언에 정의된 스토리지 볼륨에 필요합니다. 기본값은
0입니다. 크기(필수)- 영구 볼륨 클레임의 크기(예: "1000Gi").
클래스(선택 사항)- PVC는 StorageClass 를 지정하여 다양한 유형의 영구 스토리지를 요청할 수 있습니다. 스토리지 클래스는 스토리지 프로필을 정의하고 해당 프로필을 기반으로 PV를 동적으로 프로비저닝합니다. 스토리지 클래스를 지정하지 않으면 OpenShift 클러스터에서 기본값으로 표시된 스토리지 클래스가 사용됩니다. 영구 스토리지 옵션에는 SAN 스토리지 유형 또는 로컬 영구 볼륨이 포함될 수 있습니다.
선택기(선택 사항)- 특정 PV를 지정하는 구성입니다. 선택한 볼륨의 레이블을 나타내는 키:값 쌍을 제공합니다.
DeleteClaim(선택 사항)-
클러스터가 제거될 때 PVC가 삭제되었는지 여부를 지정하는 부울 값입니다. 기본값은
false입니다.
Apache Kafka 클러스터의 기존 Streams에서 영구 볼륨 크기를 늘리는 것은 영구 볼륨 크기 조정을 지원하는 OpenShift 버전에서만 지원됩니다. 크기를 조정할 영구 볼륨은 볼륨 확장을 지원하는 스토리지 클래스를 사용해야 합니다. 볼륨 확장을 지원하지 않는 다른 OpenShift 버전 및 스토리지 클래스의 경우 클러스터를 배포하기 전에 필요한 스토리지 크기를 결정해야 합니다. 기존 영구 볼륨의 크기를 줄일 수 없습니다.
Kafka 및 Zoo Cryostat에 대한 영구 스토리지 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
- id: 1
type: persistent-claim
size: 100Gi
deleteClaim: false
- id: 2
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
zookeeper:
storage:
type: persistent-claim
size: 1000Gi
# ...
특정 스토리지 클래스가 있는 영구 스토리지 구성의 예
# ...
storage:
type: persistent-claim
size: 500Gi
class: my-storage-class
# ...
선택기 를 사용하여 SSD와 같은 특정 기능을 제공하는 레이블이 지정된 영구 볼륨을 지정합니다.
selector가 있는 영구 스토리지 구성의 예
# ...
storage:
type: persistent-claim
size: 1Gi
selector:
hdd-type: ssd
deleteClaim: true
# ...
9.10.3.1. 스토리지 클래스 덮어쓰기 링크 복사링크가 클립보드에 복사되었습니다!
기본 스토리지 클래스를 사용하는 대신 Kafka 또는 Zoo Cryostat 노드에 대해 다른 스토리지 클래스를 지정할 수 있습니다. 예를 들어 스토리지 클래스가 다른 가용성 영역 또는 데이터 센터로 제한되는 경우 유용합니다. 이 목적을 위해 overrides 필드를 사용할 수 있습니다.
이 예에서 기본 스토리지 클래스의 이름은 my-storage-class:입니다.
클래스 덮어쓰기가 포함된 스토리지 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
labels:
app: my-cluster
name: my-cluster
namespace: myproject
spec:
# ...
kafka:
replicas: 3
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
class: my-storage-class
overrides:
- broker: 0
class: my-storage-class-zone-1a
- broker: 1
class: my-storage-class-zone-1b
- broker: 2
class: my-storage-class-zone-1c
# ...
# ...
zookeeper:
replicas: 3
storage:
deleteClaim: true
size: 100Gi
type: persistent-claim
class: my-storage-class
overrides:
- broker: 0
class: my-storage-class-zone-1a
- broker: 1
class: my-storage-class-zone-1b
- broker: 2
class: my-storage-class-zone-1c
# ...
구성된 overrides 속성의 결과로 볼륨은 다음 스토리지 클래스를 사용합니다.
-
Zoo Cryostat 노드 0의 영구 볼륨은
my-storage-class-zone-1a를 사용합니다. -
Zoo Cryostat 노드 1의 영구 볼륨은
my-storage-class-zone-1b를 사용합니다. -
Zoo Cryostat 노드 2의 영구 볼륨은
my-storage-class-zone-1c를 사용합니다. -
Kafka 브로커 0의 영구 볼륨은
my-storage-class-zone-1a를 사용합니다. -
Kafka 브로커 1의 영구 볼륨은
my-storage-class-zone-1b를 사용합니다. -
Kafka 브로커 2의 영구 볼륨은
my-storage-class-zone-1c를 사용합니다.
overrides 속성은 현재 스토리지 클래스 를 재정의하는 데만 사용됩니다. 다른 스토리지 구성 속성에 대한 재정의는 현재 지원되지 않습니다.
9.10.3.2. 영구 스토리지를 위한 PVC 리소스 링크 복사링크가 클립보드에 복사되었습니다!
영구 스토리지를 사용하면 다음 이름으로 PVC를 생성합니다.
data-cluster-name-kafka-idx-
Kafka 브로커 Pod
idx의 데이터를 저장하는 데 사용되는 볼륨의 PVC입니다. data-cluster-name-zookeeper-idx-
Zoo Cryostat 노드 Pod
idx의 데이터를 저장하는 데 사용되는 볼륨의 PVC입니다.
9.10.3.3. Kafka 로그 디렉터리의 마운트 경로 링크 복사링크가 클립보드에 복사되었습니다!
영구 볼륨은 Kafka 브로커가 다음 경로에 마운트된 로그 디렉터리로 사용합니다.
/var/lib/kafka/data/kafka-logIDX
여기서 IDX 는 Kafka 브로커 Pod 인덱스입니다. 예: /var/lib/kafka/data/kafka-log0.
9.10.4. 영구 볼륨 크기 조정 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에서 사용하는 영구 볼륨은 스토리지 인프라에서 지원하는 한 데이터 손실 위험없이 크기를 조정할 수 있습니다. 구성 업데이트에 따라 스토리지 크기를 변경하면 Apache Kafka의 Streams는 스토리지 인프라에 변경하도록 지시합니다. 스토리지 확장은 persistent-claim 볼륨을 사용하는 Apache Kafka 클러스터의 Streams에서 지원됩니다.
스토리지 감소는 브로커당 여러 디스크를 사용하는 경우에만 가능합니다. 디스크의 모든 파티션을 동일한 브로커(intra-broker) 내의 다른 볼륨으로 이동하거나 동일한 클러스터 내의 다른 브로커(클러스터 내)로 이동한 후 디스크를 제거할 수 있습니다.
현재 OpenShift에서 지원되지 않으므로 영구 볼륨의 크기를 줄일 수 없습니다.
사전 요구 사항
- 볼륨 크기 조정을 지원하는 OpenShift 클러스터입니다.
- Cluster Operator가 실행 중입니다.
- 볼륨 확장을 지원하는 스토리지 클래스를 사용하여 생성된 영구 볼륨을 사용하는 Kafka 클러스터입니다.
프로세스
클러스터의
Kafka리소스를 편집합니다.Kafka 클러스터, Zoo Cryostat 클러스터 또는 둘 다에 할당된 영구 볼륨의 크기를 늘리려면
size속성을 변경합니다.-
Kafka 클러스터의 경우
spec.kafka.storage에서size속성을 업데이트합니다. -
Zoo Cryostat 클러스터의 경우
spec.zookeeper.storage에서size속성을 업데이트합니다.
볼륨 크기를
2000Gi로 늘리는 Kafka 구성apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: persistent-claim size: 2000Gi class: my-storage-class # ... zookeeper: # ...-
Kafka 클러스터의 경우
리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>OpenShift는 Cluster Operator의 요청에 대한 응답으로 선택한 영구 볼륨의 용량을 늘립니다. 크기 조정이 완료되면 Cluster Operator는 크기가 조정된 영구 볼륨을 사용하는 모든 Pod를 재시작합니다. 이 작업은 자동으로 수행됩니다.
클러스터의 관련 Pod에 대해 스토리지 용량이 증가했는지 확인합니다.
oc get pv스토리지가 증가된 Kafka 브로커 Pod
NAME CAPACITY CLAIM pvc-0ca459ce-... 2000Gi my-project/data-my-cluster-kafka-2 pvc-6e1810be-... 2000Gi my-project/data-my-cluster-kafka-0 pvc-82dc78c9-... 2000Gi my-project/data-my-cluster-kafka-1출력에는 브로커 Pod와 연결된 각 PVC의 이름이 표시됩니다.
9.10.5. JBOD 스토리지 링크 복사링크가 클립보드에 복사되었습니다!
JBOD 스토리지를 사용하면 여러 디스크 또는 볼륨을 사용하도록 Kafka 클러스터를 구성할 수 있습니다. 이 접근 방식은 Kafka 브로커의 데이터 스토리지 용량이 증가하여 성능이 향상될 수 있습니다. JBOD 구성은 하나 이상의 볼륨으로 정의되며, 각 볼륨은 임시 또는 영구 일 수 있습니다. JBOD 볼륨 선언의 규칙 및 제약 조건은 임시 및 영구 스토리지의 규칙과 제약 조건과 동일합니다. 예를 들어 프로비저닝된 후에는 영구 스토리지 볼륨의 크기를 줄일 수 없으며 유형이 임시 인 경우 sizeLimit 값을 변경할 수 없습니다.
JBOD 스토리지는 Kafka에서만 지원되며 Zoo Cryostat에서는 지원되지 않습니다.
JBOD 스토리지를 사용하려면 Kafka 리소스의 스토리지 유형 구성을 jbod 로 설정합니다. 노드 풀을 사용하는 경우 개별 노드 풀의 스토리지 구성에 jbod 를 지정할 수도 있습니다.
volumes 속성을 사용하면 JBOD 스토리지 어레이 또는 구성을 구성하는 디스크를 설명할 수 있습니다.
JBOD 스토리지 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
- id: 1
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
JBOD 볼륨이 생성되면 ID를 변경할 수 없습니다. JBOD 구성에서 볼륨을 추가하거나 제거할 수 있습니다.
9.10.5.1. JBOD 스토리지용 PVC 리소스 링크 복사링크가 클립보드에 복사되었습니다!
영구 스토리지를 사용하여 JBOD 볼륨을 선언하면 다음 이름으로 PVC를 생성합니다.
data-id-cluster-name-kafka-idx-
Kafka 브로커 Pod
idx의 데이터를 저장하는 데 사용되는 볼륨의 PVC입니다.id는 Kafka 브로커 pod에 대한 데이터를 저장하는 데 사용되는 볼륨의 ID입니다.
9.10.5.2. Kafka 로그 디렉터리의 마운트 경로 링크 복사링크가 클립보드에 복사되었습니다!
JBOD 볼륨은 Kafka 브로커가 다음 경로에 마운트된 로그 디렉터리로 사용합니다.
/var/lib/kafka/data-id/kafka-logidx
여기서 id 는 Kafka 브로커 포드 idx 에 대한 데이터를 저장하는 데 사용되는 볼륨의 ID입니다. 예: /var/lib/kafka/data-0/kafka-log0.
9.10.6. JBOD 스토리지에 볼륨 추가 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 JBOD 스토리지를 사용하도록 구성된 Kafka 클러스터에 볼륨을 추가하는 방법을 설명합니다. 다른 스토리지 유형을 사용하도록 구성된 Kafka 클러스터에 적용할 수 없습니다.
과거 및 제거된 ID 아래에 새 볼륨을 추가할 때 이전에 사용한 PersistentVolumeClaims 가 삭제되었는지 확인해야 합니다.
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
- JBOD 스토리지가 있는 Kafka 클러스터
프로세스
Kafka리소스에서spec.kafka.storage.volumes속성을 편집합니다.volumes배열에 새 볼륨을 추가합니다. 예를 들어 ID2를 사용하여 새 볼륨을 추가합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>새 주제를 만들거나 기존 파티션을 새 디스크에 다시 할당합니다.
작은 정보크루즈 컨트롤은 파티션을 다시 할당하는 효과적인 도구입니다. intra-broker 디스크 균형을 수행하려면
KafkaRebalance.spec아래에서rebalanceDisk를true로 설정합니다.
9.10.7. JBOD 스토리지에서 볼륨 제거 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 JBOD 스토리지를 사용하도록 구성된 Kafka 클러스터에서 볼륨을 제거하는 방법을 설명합니다. 다른 스토리지 유형을 사용하도록 구성된 Kafka 클러스터에 적용할 수 없습니다. JBOD 스토리지에는 항상 하나 이상의 볼륨이 포함되어야 합니다.
데이터 손실을 방지하려면 볼륨을 제거하기 전에 모든 파티션을 이동해야 합니다.
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
- 두 개 이상의 볼륨이 있는 JBOD 스토리지가 있는 Kafka 클러스터
프로세스
제거하려는 디스크에서 모든 파티션을 다시 할당합니다. 제거하려는 디스크에 여전히 할당된 파티션의 데이터가 손실될 수 있습니다.
작은 정보kafka-reassign-partitions.sh툴을 사용하여 파티션을 다시 할당할 수 있습니다.Kafka리소스에서spec.kafka.storage.volumes속성을 편집합니다.volumes배열에서 하나 이상의 볼륨을 제거합니다. 예를 들어 ID가1인 볼륨을 제거합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>
9.10.8. 계층화된 스토리지(주요 액세스) 링크 복사링크가 클립보드에 복사되었습니다!
계층화된 스토리지는 로그 세그먼트가 별도의 스토리지 시스템으로 이동하는 Kafka 데이터를 관리하는 유연한 접근 방식을 도입합니다. 예를 들어 자주 액세스하는 데이터를 위해 브로커에서 블록 스토리지 사용을 결합하고 데이터 접근성 및 지속성을 손상시키지 않고 블록 스토리지에서 더 비용 효율적이고 확장 가능한 원격 스토리지 솔루션으로 이전 또는 더 적은 액세스 가능한 데이터를 오프로드할 수 있습니다.
계층화된 스토리지는 초기 액세스 Kafka 기능이며, Apache Kafka용 Streams에서도 사용할 수 있습니다. 현재 제한 사항으로 인해 프로덕션 환경에는 권장되지 않습니다.
계층화된 스토리지에는 Kafka와 원격 스토리지 시스템 간의 통신을 처리하기 위해 Kafka의 RemoteStorageManager 인터페이스를 구현해야 하며 Kafka 리소스 구성을 통해 활성화됩니다. Apache Kafka용 스트림은 사용자 정의 계층 스토리지가 활성화된 경우 RLMM(Remote Log Metadata Management)에 Kafka의 TopicBasedRemoteLogMetadataManager 를 사용합니다. RLMM은 원격 스토리지와 관련된 메타데이터를 관리합니다.
사용자 정의 계층 스토리지를 사용하려면 다음을 수행합니다.
- 사용자 지정 컨테이너 이미지를 빌드하여 Streams for Apache Kafka 이미지에 Kafka의 계층화된 스토리지 플러그인을 포함합니다. 플러그인은 계층화된 스토리지 솔루션과 상호 작용하기 위해 Apache Kafka의 Streams에서 관리하는 Kafka 클러스터에 필요한 기능을 제공해야 합니다.
-
Kafka 리소스의
tieredStorage속성을 사용하여 계층화된 스토리지에Kafka를 구성합니다. 사용자 정의RemoteStorageManager구현의 클래스 이름 및 경로와 추가 구성을 지정합니다. - 필요한 경우 RLMM 특정 계층 스토리지 구성을 지정합니다.
Kafka에 대한 사용자 정의 계층 스토리지 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
tieredStorage:
type: custom
remoteStorageManager:
className: com.example.kafka.tiered.storage.s3.S3RemoteStorageManager
classPath: /opt/kafka/plugins/tiered-storage-s3/*
config:
storage.bucket.name: my-bucket
# ...
config:
rlmm.config.remote.log.metadata.topic.replication.factor: 1
# ...
- 1
유형을custom로 설정해야 합니다.- 2
- 클래스 이름 및 경로를 포함하여 사용자 정의
RemoteStorageManager구현의 구성입니다. - 3
- Apache Kafka용 Streams가
rsm.config를 자동으로 접두사로 지정하는 사용자 지정.RemoteStorageManager구현에 전달할 구성입니다 - 4
rlmm.config.접두사가 필요한 RLMM에 전달할 계층화된 스토리지 구성입니다. 계층화된 스토리지 구성에 대한 자세한 내용은 Apache Kafka 설명서 를 참조하십시오.
9.11. CPU 및 메모리 리소스 제한 및 요청 구성 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 Streams for Apache Kafka Cluster Operator는 배포된 피연산자에 대한 CPU 및 메모리 리소스 요청 및 제한을 지정하지 않습니다. Kafka에서 안정성을 유지하고 최적의 성능을 달성하는 데 중요한 리소스를 할당하는 것이 중요합니다. 이상적인 리소스 할당은 특정 요구 사항 및 사용 사례에 따라 다릅니다.
적절한 요청 및 제한을 설정하여 각 컨테이너의 CPU 및 메모리 리소스를 구성하는 것이 좋습니다.
9.12. Pod 예약 구성 링크 복사링크가 클립보드에 복사되었습니다!
동일한 OpenShift 노드에서 예약된 애플리케이션 간 리소스 충돌로 인한 성능 저하를 방지하기 위해 Kafka Pod를 중요한 워크로드와 별도로 예약할 수 있습니다. 이를 위해 특정 노드를 선택하거나 Kafka 전용 노드 세트를 약화할 수 있습니다.
9.12.1. 유사성, 허용 오차 및 토폴로지 분배 제약 조건 지정 링크 복사링크가 클립보드에 복사되었습니다!
유사성, 허용 오차 및 토폴로지 분배 제약 조건을 사용하여 노드에 kafka 리소스의 Pod를 예약합니다. 유사성, 허용 오차 및 토폴로지 분배 제약 조건은 다음 리소스의 유사성,허용 오차 및 topologySpreadConstraint 속성을 사용하여 구성됩니다.
-
Kafka.spec.kafka.template.pod -
Kafka.spec.zookeeper.template.pod -
Kafka.spec.entityOperator.template.pod -
KafkaConnect.spec.template.pod -
KafkaBridge.spec.template.pod -
KafkaMirrorMaker.spec.template.pod -
KafkaMirrorMaker2.spec.template.pod
선호도,허용 오차 및 topologySpreadConstraint 속성 형식의 형식은 OpenShift 사양을 따릅니다. 선호도 구성에는 다양한 유형의 선호도가 포함될 수 있습니다.
- Pod 유사성 및 유사성 방지
- 노드 유사성
9.12.1.1. Pod 유사성 방지를 사용하여 중요한 애플리케이션 공유 노드를 방지합니다. 링크 복사링크가 클립보드에 복사되었습니다!
Pod 유사성 방지를 사용하여 중요한 애플리케이션이 동일한 디스크에 예약되지 않도록 합니다. Kafka 클러스터를 실행할 때는 Pod 유사성 방지를 사용하여 Kafka 브로커가 데이터베이스와 같은 다른 워크로드와 노드를 공유하지 않도록 하는 것이 좋습니다.
9.12.1.2. 노드 유사성을 사용하여 특정 노드에 워크로드 예약 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 클러스터는 일반적으로 다양한 유형의 작업자 노드로 구성됩니다. 일부는 CPU가 많은 워크로드, 일부 메모리에 최적화되어 있고 다른 일부는 스토리지(빠른 로컬 SSD) 또는 네트워크에 최적화될 수 있습니다. 다른 노드를 사용하면 비용과 성능을 모두 최적화하는 데 도움이 됩니다. 최상의 성능을 얻으려면 Apache Kafka 구성 요소가 올바른 노드를 사용할 수 있도록 스트림 예약을 허용하는 것이 중요합니다.
OpenShift는 노드 유사성을 사용하여 특정 노드에 워크로드를 예약합니다. 노드 유사성을 사용하면 Pod를 예약할 노드에 대한 스케줄링 제약 조건을 생성할 수 있습니다. 제약 조건은 라벨 선택기로 지정됩니다. 올바른 노드를 선택하려면 beta.kubernetes.io/instance-type 또는 사용자 정의 레이블과 같은 기본 제공 노드 레이블을 사용하여 라벨을 지정할 수 있습니다.
9.12.1.3. 전용 노드에 노드 유사성 및 허용 오차 사용 링크 복사링크가 클립보드에 복사되었습니다!
테인트를 사용하여 전용 노드를 생성한 다음 노드 유사성 및 허용 오차를 구성하여 전용 노드에서 Kafka Pod를 예약합니다.
클러스터 관리자는 선택한 OpenShift 노드를 테인트로 표시할 수 있습니다. 테인트가 있는 노드는 일반 스케줄링에서 제외되며 일반 Pod는 해당 노드에서 실행되도록 예약되지 않습니다. 노드에 테인트를 설정할 수 있는 서비스만 예약할 수 있습니다. 이러한 노드에서 실행되는 유일한 다른 서비스는 로그 수집기 또는 소프트웨어 정의 네트워크와 같은 시스템 서비스입니다.
전용 노드에서 Kafka 및 해당 구성 요소를 실행하면 많은 이점이 있을 수 있습니다. 동일한 노드에서 실행 중인 다른 애플리케이션은 없으며 Kafka에 필요한 리소스를 방해하거나 사용할 수 있습니다. 이로 인해 성능 및 안정성이 향상될 수 있습니다.
9.12.2. 각 Kafka 브로커를 다른 작업자 노드에 예약하도록 Pod 유사성 방지 구성 링크 복사링크가 클립보드에 복사되었습니다!
많은 Kafka 브로커 또는 Zoo Cryostat 노드는 동일한 OpenShift 작업자 노드에서 실행할 수 있습니다. 작업자 노드가 실패하면 모두 동시에 사용할 수 없게 됩니다. 안정성을 개선하기 위해 podAntiAffinity 구성을 사용하여 다른 OpenShift 작업자 노드에서 각 Kafka 브로커 또는 Zoo Cryostat 노드를 예약할 수 있습니다.
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
프로세스
클러스터 배포를 지정하는 리소스에서
affinity속성을 편집합니다. Kafka 브로커 또는 Zoo Cryostat 노드에서 작업자 노드를 공유하지 않도록 하려면strimzi.io/name레이블을 사용합니다.topologyKey를kubernetes.io/hostname으로 설정하여 선택한 Pod가 동일한 호스트 이름이 있는 노드에서 예약되지 않도록 지정합니다. 이렇게 하면 단일 Kafka 브로커 및 단일 Zoo Cryostat 노드에서 동일한 작업자 노드를 공유할 수 있습니다. 예를 들면 다음과 같습니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-kafka topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-zookeeper topologyKey: "kubernetes.io/hostname" # ...여기서
CLUSTER-NAME은 Kafka 사용자 정의 리소스의 이름입니다.Kafka 브로커와 Zoo Cryostat 노드가 동일한 작업자 노드를 공유하지 않도록 하려면
strimzi.io/cluster레이블을 사용합니다. 예를 들면 다음과 같습니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ...여기서
CLUSTER-NAME은 Kafka 사용자 정의 리소스의 이름입니다.리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>
9.12.3. Kafka 구성 요소에서 Pod 유사성 방지 구성 링크 복사링크가 클립보드에 복사되었습니다!
Pod 유사성 방지 구성은 Kafka 브로커의 안정성 및 성능에 도움이 됩니다. podAntiAffinity 를 사용하면 OpenShift에서 다른 워크로드와 동일한 노드에 Kafka 브로커를 예약하지 않습니다. 일반적으로 Kafka가 다른 네트워크 또는 스토리지 집약적인 애플리케이션과 동일한 작업자 노드에서 실행되지 않도록 해야 합니다(예: 데이터베이스, 스토리지 또는 기타 메시징 플랫폼).
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
프로세스
클러스터 배포를 지정하는 리소스에서
affinity속성을 편집합니다. 라벨을 사용하여 동일한 노드에서 예약해서는 안 되는 Pod를 지정합니다. 선택한 Pod를 호스트 이름이 동일한 노드에서 예약하지 않도록topologyKey를kubernetes.io/hostname으로 설정해야 합니다. 예를 들면 다음과 같습니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
이 작업은
oc apply를 사용하여 수행할 수 있습니다.oc apply -f <kafka_configuration_file>
9.12.4. Kafka 구성 요소에서 노드 유사성 구성 링크 복사링크가 클립보드에 복사되었습니다!
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
프로세스
Streams for Apache Kafka 구성 요소를 예약해야 하는 노드에 레이블을 지정합니다.
이 작업은
oc label:을 사용하여 수행할 수 있습니다.oc label node NAME-OF-NODE node-type=fast-network또는 일부 기존 레이블을 재사용할 수 있습니다.
클러스터 배포를 지정하는 리소스에서
affinity속성을 편집합니다. 예를 들면 다음과 같습니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - fast-network # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
이 작업은
oc apply를 사용하여 수행할 수 있습니다.oc apply -f <kafka_configuration_file>
9.12.5. 전용 노드 설정 및 Pod 예약 링크 복사링크가 클립보드에 복사되었습니다!
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
프로세스
- 전용으로 사용할 노드를 선택합니다.
- 이러한 노드에 예약된 워크로드가 없는지 확인합니다.
선택한 노드에서 테인트를 설정합니다.
이 작업은
oc adm taint를 사용하여 수행할 수 있습니다.oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule또한 선택한 노드에 레이블을 추가합니다.
이 작업은
oc label:을 사용하여 수행할 수 있습니다.oc label node NAME-OF-NODE dedicated=Kafka클러스터 배포를 지정하는 리소스에서
유사성및허용 오차속성을 편집합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: tolerations: - key: "dedicated" operator: "Equal" value: "Kafka" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - Kafka # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
이 작업은
oc apply를 사용하여 수행할 수 있습니다.oc apply -f <kafka_configuration_file>
9.13. 로깅 수준 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 구성 요소의 사용자 지정 리소스와 Apache Kafka Operator의 Streams에서 로깅 수준을 구성합니다. 사용자 정의 리소스의 spec.logging 속성에서 직접 로깅 수준을 지정할 수 있습니다. 또는 configMapKeyRef 속성을 사용하여 사용자 정의 리소스에서 참조되는 ConfigMap에서 로깅 속성을 정의할 수 있습니다.
ConfigMap을 사용하면 로깅 속성이 한 곳에서 유지 관리되고 두 개 이상의 리소스에서 액세스할 수 있다는 이점이 있습니다. 둘 이상의 리소스에 ConfigMap을 재사용할 수도 있습니다. ConfigMap을 사용하여 Apache Kafka Operator의 Streams에 대한 로거를 지정하는 경우 로깅 사양을 추가하여 필터를 추가할 수도 있습니다.
로깅 사양에 로깅 유형을 지정합니다.
-
로깅 수준을 직접 지정할 때
인라인 -
ConfigMap을 참조할 때
외부
인라인 로깅 구성 예
# ...
logging:
type: inline
loggers:
kafka.root.logger.level: INFO
# ...
외부 로깅 구성 예
# ...
logging:
type: external
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-config-map-key
# ...
ConfigMap의 이름 및 키 값은 필수입니다. 이름 또는 키가 설정되지 않은 경우 기본 로깅이 사용됩니다.
9.13.1. Kafka 구성 요소 및 Operator의 로깅 옵션 링크 복사링크가 클립보드에 복사되었습니다!
특정 Kafka 구성 요소 또는 Operator의 로깅 구성에 대한 자세한 내용은 다음 섹션을 참조하십시오.
Kafka 구성 요소 로깅
Operator 로깅
9.13.2. 로깅을 위한 ConfigMap 생성 링크 복사링크가 클립보드에 복사되었습니다!
ConfigMap을 사용하여 로깅 속성을 정의하려면 ConfigMap을 생성한 다음 리소스 사양에 있는 로깅 정의의 일부로 참조합니다.
ConfigMap에는 적절한 로깅 구성이 포함되어야 합니다.
-
Kafka 구성 요소, Zoo Cryostat 및 Kafka 브리지의
log4j.properties -
Topic Operator 및 User Operator의
log4j2.properties
이러한 속성 아래에 구성을 배치해야 합니다.
이 절차에서 ConfigMap은 Kafka 리소스에 대한 루트 로거를 정의합니다.
프로세스
ConfigMap을 생성합니다.
ConfigMap을 YAML 파일 또는 속성 파일에서 생성할 수 있습니다.
Kafka에 대한 루트 로거 정의가 있는 ConfigMap 예:
kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j.properties: kafka.root.logger.level="INFO"속성 파일을 사용하는 경우 명령줄에서 파일을 지정합니다.
oc create configmap logging-configmap --from-file=log4j.properties속성 파일은 로깅 구성을 정의합니다.
# Define the logger kafka.root.logger.level="INFO" # ...리소스
사양에외부 로깅을 정의하고logging.valueFrom.configMapKeyRef.name을 ConfigMap의 이름으로 설정하고logging.valueFrom.configMapKeyRef.key를 이 ConfigMap의 키로 설정합니다.# ... logging: type: external valueFrom: configMapKeyRef: name: logging-configmap key: log4j.properties # ...리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>
9.13.3. Cluster Operator 로깅 구성 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 Operator 로깅은 strimzi-cluster-operator 라는 ConfigMap 을 통해 구성됩니다. Cluster Operator를 설치할 때 로깅 구성이 포함된 ConfigMap 이 생성됩니다. 이 ConfigMap 은 install/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
이 ConfigMap을 사용하면 다양한 구성 요소의 루트 로거 수준, 로그 출력 형식 및 로그 수준을 포함하여 로깅의 다양한 측면을 제어할 수 있습니다. monitorInterval 설정은 로깅 구성이 다시 로드되는 빈도를 결정합니다. Kafka AdminClient, Zoo Cryostat ZKTrustManager, Netty 및 OkHttp 클라이언트의 로깅 수준을 제어할 수도 있습니다. Netty는 네트워크 통신을 위해 Streams for Apache Kafka에 사용되는 프레임워크이며 OkHttp는 HTTP 요청을 만드는 데 사용되는 라이브러리입니다.
Cluster Operator가 배포될 때 ConfigMap 이 없는 경우 기본 로깅 값이 사용됩니다.
Cluster Operator가 배포된 후 ConfigMap 이 실수로 삭제된 경우 가장 최근에 로드된 로깅 구성이 사용됩니다. 새 로깅 구성을 로드할 새 ConfigMap 을 생성합니다.
ConfigMap 에서는 monitorInterval 옵션을 제거하지 마십시오.
9.13.4. Apache Kafka Operator의 Streams에 로깅 필터 추가 링크 복사링크가 클립보드에 복사되었습니다!
ConfigMap을 사용하여 Apache Kafka Operator의 Streams에 대한 (log4j2) 로깅 수준을 구성하는 경우 로깅 필터를 정의하여 로그에 반환되는 항목을 제한할 수도 있습니다.
로깅 필터는 많은 수의 로깅 메시지가 있는 경우에 유용합니다. 로거의 로그 수준을 DEBUG(rootLogger.level="DEBUG")로 설정한다고 가정합니다. 로깅 필터는 해당 수준에서 로거에 대해 반환된 로그 수를 줄이므로 특정 리소스에 집중할 수 있습니다. 필터가 설정되면 필터와 일치하는 로그 메시지만 기록됩니다.
필터는 마커 를 사용하여 로그에 포함할 항목을 지정합니다. 마커의 종류, 네임스페이스 및 이름을 지정합니다. 예를 들어 Kafka 클러스터가 실패하는 경우 kind를 Kafka 로 지정하여 로그를 분리하고 실패한 클러스터의 네임스페이스와 이름을 사용할 수 있습니다.
이 예에서는 my-kafka-cluster 라는 Kafka 클러스터의 마커 필터를 보여줍니다.
기본 로깅 필터 구성
rootLogger.level="INFO"
appender.console.filter.filter1.type=MarkerFilter
appender.console.filter.filter1.onMatch=ACCEPT
appender.console.filter.filter1.onMismatch=DENY
appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)
하나 이상의 필터를 만들 수 있습니다. 여기에서 로그는 두 개의 Kafka 클러스터로 필터링됩니다.
여러 로깅 필터 구성
appender.console.filter.filter1.type=MarkerFilter
appender.console.filter.filter1.onMatch=ACCEPT
appender.console.filter.filter1.onMismatch=DENY
appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster-1)
appender.console.filter.filter2.type=MarkerFilter
appender.console.filter.filter2.onMatch=ACCEPT
appender.console.filter.filter2.onMismatch=DENY
appender.console.filter.filter2.marker=Kafka(my-namespace/my-kafka-cluster-2)
Cluster Operator에 필터 추가
Cluster Operator에 필터를 추가하려면 로깅 ConfigMap YAML 파일 (install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml)을 업데이트합니다.
프로세스
050-ConfigMap-strimzi-cluster-operator.yaml파일을 업데이트하여 ConfigMap에 필터 속성을 추가합니다.이 예에서 필터 속성은
my-kafka-clusterKafka 클러스터에 대해서만 로그를 반환합니다.kind: ConfigMap apiVersion: v1 metadata: name: strimzi-cluster-operator data: log4j2.properties: #... appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)또는
ConfigMap을 직접 편집합니다.oc edit configmap strimzi-cluster-operatorConfigMap을 직접 편집하는 대신 YAML 파일을 업데이트한 경우
ConfigMap을 배포하여 변경 사항을 적용합니다.oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
Topic Operator 또는 User Operator에 필터 추가
Topic Operator 또는 User Operator에 필터를 추가하려면 로깅 ConfigMap을 생성하거나 편집합니다.
이 절차에서는 Topic Operator에 대한 필터를 사용하여 로깅 ConfigMap이 생성됩니다. User Operator에도 동일한 접근 방식이 사용됩니다.
프로세스
ConfigMap을 생성합니다.
ConfigMap을 YAML 파일 또는 속성 파일에서 생성할 수 있습니다.
이 예제에서 필터 속성은
my-topic항목에 대해서만 로그를 반환합니다.kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j2.properties: rootLogger.level="INFO" appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic)속성 파일을 사용하는 경우 명령줄에서 파일을 지정합니다.
oc create configmap logging-configmap --from-file=log4j2.properties속성 파일은 로깅 구성을 정의합니다.
# Define the logger rootLogger.level="INFO" # Set the filters appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic) # ...리소스
사양에외부 로깅을 정의하고logging.valueFrom.configMapKeyRef.name을 ConfigMap의 이름으로 설정하고logging.valueFrom.configMapKeyRef.key를 이 ConfigMap의 키로 설정합니다.Topic Operator의 경우
Kafka리소스의topicOperator구성에 로깅이 지정됩니다.spec: # ... entityOperator: topicOperator: logging: type: external valueFrom: configMapKeyRef: name: logging-configmap key: log4j2.properties- Cluster Operator를 배포하여 변경 사항을 적용합니다.
create -f install/cluster-operator -n my-cluster-operator-namespace
9.14. ConfigMap을 사용하여 구성 추가 링크 복사링크가 클립보드에 복사되었습니다!
ConfigMap 리소스를 사용하여 Apache Kafka 배포의 Streams에 특정 구성을 추가합니다. ConfigMaps는 키-값 쌍을 사용하여 기밀이 아닌 데이터를 저장합니다. ConfigMap에 추가된 구성 데이터는 한 곳에서 유지 관리되며 구성 요소 간에 재사용할 수 있습니다.
ConfigMaps는 다음 유형의 구성 데이터만 저장할 수 있습니다.
- 로깅 구성
- 메트릭 구성
- Kafka Connect 커넥터에 대한 외부 구성
다른 구성 영역에는 ConfigMap을 사용할 수 없습니다.
구성 요소를 구성할 때 configMapKeyRef 속성을 사용하여 ConfigMap에 참조를 추가할 수 있습니다.
예를 들어 configMapKeyRef 를 사용하여 로깅 구성을 제공하는 ConfigMap을 참조할 수 있습니다. ConfigMap을 사용하여 Log4j 구성 파일을 전달할 수 있습니다. 로깅 구성에 참조를 추가합니다.
로깅을 위한 ConfigMap 예
# ...
logging:
type: external
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-config-map-key
# ...
지표 구성에 ConfigMap을 사용하려면 구성 요소의 metricsConfig 구성에 동일한 방식으로 참조를 추가합니다.
ExternalConfiguration 속성은 환경 변수 또는 볼륨으로 사용할 수 있는 Pod에 마운트된 ConfigMap(또는 시크릿)의 데이터를 만듭니다. Kafka Connect에서 사용하는 커넥터의 외부 구성 데이터를 사용할 수 있습니다. 데이터는 외부 데이터 소스와 관련되어 커넥터가 해당 데이터 소스와 통신하는 데 필요한 값을 제공할 수 있습니다.
예를 들어 configMapKeyRef 속성을 사용하여 ConfigMap에서 구성 데이터를 환경 변수로 전달할 수 있습니다.
환경 변수 값을 제공하는 ConfigMap의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect
spec:
# ...
externalConfiguration:
env:
- name: MY_ENVIRONMENT_VARIABLE
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
외부에서 관리하는 ConfigMap을 사용하는 경우 구성 공급자를 사용하여 ConfigMap에 데이터를 로드합니다.
9.14.1. 사용자 정의 ConfigMap 이름 지정 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 스트림은 OpenShift에 배포할 때 자체 ConfigMap 및 기타 리소스를 생성합니다. ConfigMap에는 구성 요소를 실행하는 데 필요한 데이터가 포함되어 있습니다. Streams for Apache Kafka에서 생성한 ConfigMap은 편집할 수 없습니다.
생성하는 사용자 정의 ConfigMap에 이러한 기본 ConfigMap과 동일한 이름이 없는지 확인합니다. 동일한 이름이 있는 경우 덮어씁니다. 예를 들어 ConfigMap의 이름이 Kafka 클러스터의 ConfigMap과 동일한 경우 Kafka 클러스터 업데이트가 있을 때 덮어씁니다.
9.15. 외부 소스에서 구성 값 로드 링크 복사링크가 클립보드에 복사되었습니다!
구성 공급자를 사용하여 외부 소스에서 구성 데이터를 로드합니다. 공급자는 Apache Kafka의 Streams와 독립적으로 작동합니다. 생산자 및 소비자를 포함하여 모든 Kafka 구성 요소에 대한 구성 데이터를 로드하는 데 사용할 수 있습니다. 구성 요소 구성에서 외부 소스를 참조하고 액세스 권한을 제공합니다. 공급자는 새 외부 소스를 참조하는 경우에도 Kafka 구성 요소를 다시 시작하거나 파일을 추출하지 않고도 데이터를 로드합니다. 예를 들어 provider를 사용하여 Kafka Connect 커넥터 구성의 인증 정보를 제공합니다. 구성에는 외부 소스에 대한 모든 액세스 권한이 포함되어야 합니다.
9.15.1. 구성 공급자 활성화 링크 복사링크가 클립보드에 복사되었습니다!
구성 요소의 사양 구성에서 config.providers 속성을 사용하여 하나 이상의 구성 공급자를 활성화할 수 있습니다.
구성 공급자를 활성화하는 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect
annotations:
strimzi.io/use-connector-resources: "true"
spec:
# ...
config:
# ...
config.providers: env
config.providers.env.class: org.apache.kafka.common.config.provider.EnvVarConfigProvider
# ...
- KubernetesSecretConfigProvider
- OpenShift 시크릿에서 구성 데이터를 로드합니다. 구성 데이터가 저장된 시크릿 내 키와 시크릿의 이름을 지정합니다. 이 공급자는 암호 또는 기타 사용자 자격 증명과 같은 중요한 구성 데이터를 저장하는 데 유용합니다.
- KubernetesConfigMapConfigProvider
- OpenShift 구성 맵에서 구성 데이터를 로드합니다. 구성 맵의 이름과 구성 데이터가 저장된 구성 맵 내의 키를 지정합니다. 이 공급자는 중요하지 않은 구성 데이터를 저장하는 데 유용합니다.
- EnvVarConfigProvider
- 환경 변수에서 구성 데이터를 로드합니다. 구성 데이터가 저장된 환경 변수의 이름을 지정합니다. 이 공급자는 예를 들어 시크릿에서 매핑된 환경 변수에서 인증서 또는 JAAS 구성을 로드하기 위해 컨테이너에서 실행 중인 애플리케이션을 구성하는 데 유용합니다.
- FileConfigProvider
- 파일에서 구성 데이터를 로드합니다. 구성 데이터가 저장되는 파일의 경로를 지정합니다. 이 공급자는 컨테이너에 마운트된 파일에서 구성 데이터를 로드하는 데 유용합니다.
- DirectoryConfigProvider
- 디렉터리 내의 파일에서 구성 데이터를 로드합니다. 구성 파일이 저장되는 디렉터리의 경로를 지정합니다. 이 공급자는 여러 구성 파일을 로드하고 구성 데이터를 별도의 파일로 구성하는 데 유용합니다.
OpenShift 구성 공급자 플러그인의 일부인 KubernetesSecretConfigProvider 및 KubernetesConfigMapConfigProvider 를 사용하려면 구성 파일이 포함된 네임스페이스에 대한 액세스 권한을 설정해야 합니다.
액세스 권한을 설정하지 않고 다른 공급자를 사용할 수 있습니다. 다음을 수행하여 Kafka Connect 또는 MirrorMaker 2에 대한 커넥터 구성을 이러한 방식으로 제공할 수 있습니다.
- Kafka Connect Pod에 환경 변수 또는 볼륨으로 구성 맵 또는 시크릿 마운트
-
Kafka Connect 또는 MirrorMaker 2 구성에서
EnvVarConfigProvider,FileConfigProvider또는DirectoryConfigProvider활성화 -
KafkaConnect또는KafkaMirrorMaker2리소스의사양에externalConfiguration속성을 사용하여 커넥터 구성 전달
공급자를 사용하면 Kafka Connect REST 인터페이스를 통해 제한된 정보가 전달되는 것을 방지할 수 있습니다. 다음 시나리오에서는 이 방법을 사용할 수 있습니다.
- 커넥터가 데이터 소스에 연결하고 통신하는 데 사용하는 값으로 환경 변수 마운트
- Kafka Connect 커넥터를 구성하는 데 사용되는 값으로 속성 파일 마운트
- 커넥터에서 사용하는 TLS 신뢰 저장소 및 키 저장소 값이 포함된 디렉터리에 파일 마운트
커넥터에 새 Secret 또는 ConfigMap 을 사용할 때 다시 시작해야 하므로 다른 커넥터가 중단될 수 있습니다.
9.15.2. 보안 또는 구성 맵에서 구성 값 로드 링크 복사링크가 클립보드에 복사되었습니다!
KubernetesSecretConfigProvider 를 사용하여 시크릿 또는 KubernetesConfigMapConfigProvider 에서 구성 속성을 제공하여 구성 맵에서 구성 속성을 제공합니다.
이 절차에서 구성 맵은 커넥터에 대한 구성 속성을 제공합니다. 속성은 구성 맵의 키 값으로 지정됩니다. 구성 맵은 Kafka Connect Pod에 볼륨으로 마운트됩니다.
사전 요구 사항
- Kafka 클러스터가 실행 중입니다.
- Cluster Operator가 실행 중입니다.
- 커넥터 구성이 포함된 구성 맵이 있습니다.
커넥터 속성이 있는 구성 맵의 예
apiVersion: v1
kind: ConfigMap
metadata:
name: my-connector-configuration
data:
option1: value1
option2: value2
프로세스
KafkaConnect리소스를 구성합니다.-
KubernetesConfigMapConfigProvider활성화
여기에 표시된 사양은 구성 맵 및 시크릿의 값 로드를 지원할 수 있습니다.
구성 맵과 시크릿을 사용하는 Kafka Connect 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: secrets,configmaps1 config.providers.configmaps.class: io.strimzi.kafka.KubernetesConfigMapConfigProvider2 config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider3 # ...-
공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_connect_configuration_file>외부 구성 맵의 값에 대한 액세스를 허용하는 역할을 생성합니다.
구성 맵에서 값에 액세스하는 역할의 예
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: connector-configuration-role rules: - apiGroups: [""] resources: ["configmaps"] resourceNames: ["my-connector-configuration"] verbs: ["get"] # ...규칙은
my-connector-configuration구성 맵에 액세스할 수 있는 역할 권한을 제공합니다.구성 맵이 포함된 네임스페이스에 대한 액세스를 허용하는 역할 바인딩을 생성합니다.
구성 맵이 포함된 네임스페이스에 액세스하기 위한 역할 바인딩의 예
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: connector-configuration-role-binding subjects: - kind: ServiceAccount name: my-connect-connect namespace: my-project roleRef: kind: Role name: connector-configuration-role apiGroup: rbac.authorization.k8s.io # ...역할 바인딩은
my-project네임스페이스에 액세스할 수 있는 역할 권한을 제공합니다.서비스 계정은 Kafka Connect 배포에서 사용하는 것과 동일해야 합니다. 서비스 계정 이름 형식은 <
cluster_name>-connect입니다. 여기서 <cluster_name>은KafkaConnect사용자 정의 리소스의 이름입니다.커넥터 구성의 구성 맵을 참조합니다.
구성 맵을 참조하는 커넥터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-connector labels: strimzi.io/cluster: my-connect spec: # ... config: option: ${configmaps:my-project/my-connector-configuration:option1} # ... # ...자리 표시자 구조는
configmaps:<path_and_file_name>:<property> 입니다.KubernetesConfigMapConfigProvider는 외부 구성 맵에서option1속성 값을 읽고 추출합니다.
9.15.3. 환경 변수에서 구성 값 로드 링크 복사링크가 클립보드에 복사되었습니다!
EnvVarConfigProvider 를 사용하여 구성 속성을 환경 변수로 제공합니다. 환경 변수는 구성 맵 또는 시크릿의 값을 포함할 수 있습니다.
이 절차에서 환경 변수는 커넥터가 Amazon AWS와 통신할 수 있도록 구성 속성을 제공합니다. 커넥터는 AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY 를 읽을 수 있어야 합니다. 환경 변수의 값은 Kafka Connect Pod에 마운트된 보안에서 파생됩니다.
사용자 정의 환경 변수의 이름은 KAFKA_ 또는 STRIMZI_ 로 시작할 수 없습니다.
사전 요구 사항
- Kafka 클러스터가 실행 중입니다.
- Cluster Operator가 실행 중입니다.
- 커넥터 구성이 포함된 시크릿이 있습니다.
환경 변수 값이 있는 시크릿의 예
apiVersion: v1
kind: Secret
metadata:
name: aws-creds
type: Opaque
data:
awsAccessKey: QUtJQVhYWFhYWFhYWFhYWFg=
awsSecretAccessKey: Ylhsd1lYTnpkMjl5WkE=
프로세스
KafkaConnect리소스를 구성합니다.-
EnvVarConfigProvider활성화 -
externalConfiguration속성을 사용하여 환경 변수를 지정합니다.
외부 환경 변수를 사용하는 Kafka Connect 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: env1 config.providers.env.class: org.apache.kafka.common.config.provider.EnvVarConfigProvider2 # ... externalConfiguration: env: - name: AWS_ACCESS_KEY_ID3 valueFrom: secretKeyRef: name: aws-creds4 key: awsAccessKey5 - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey # ...참고secretKeyRef속성은 시크릿의 키를 참조합니다. 보안 대신 구성 맵을 사용하는 경우configMapKeyRef속성을 사용합니다.-
공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_connect_configuration_file>커넥터 구성의 환경 변수를 참조합니다.
환경 변수를 참조하는 커넥터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-connector labels: strimzi.io/cluster: my-connect spec: # ... config: option: ${env:AWS_ACCESS_KEY_ID} option: ${env:AWS_SECRET_ACCESS_KEY} # ... # ...자리 표시자 구조는
env:<environment_variable_name>입니다.EnvVarConfigProvider는 마운트된 보안에서 환경 변수 값을 읽고 추출합니다.
9.15.4. 디렉터리 내에서 파일에서 구성 값 로드 링크 복사링크가 클립보드에 복사되었습니다!
FileConfigProvider 를 사용하여 디렉터리 내의 파일에서 구성 속성을 제공합니다. 파일은 구성 맵 또는 시크릿일 수 있습니다.
이 절차에서 파일은 커넥터에 대한 구성 속성을 제공합니다. 데이터베이스 이름과 암호는 시크릿의 속성으로 지정됩니다. 시크릿은 Kafka Connect Pod에 볼륨으로 마운트됩니다. 볼륨은 경로 /opt/kafka/external-configuration/<volume-name> 에 마운트됩니다.
사전 요구 사항
- Kafka 클러스터가 실행 중입니다.
- Cluster Operator가 실행 중입니다.
- 커넥터 구성이 포함된 시크릿이 있습니다.
데이터베이스 속성이 있는 시크릿 예
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
connector.properties: |-
dbUsername: my-username
dbPassword: my-password
프로세스
KafkaConnect리소스를 구성합니다.-
FileConfigProvider활성화 -
externalConfiguration속성을 사용하여 파일을 지정합니다.
외부 속성 파일을 사용하는 Kafka Connect 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: config.providers: file1 config.providers.file.class: org.apache.kafka.common.config.provider.FileConfigProvider2 #... externalConfiguration: volumes: - name: connector-config3 secret: secretName: mysecret4 -
공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_connect_configuration_file>커넥터 구성의 파일 속성을 자리 표시자로 참조합니다.
파일을 참조하는 커넥터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: io.debezium.connector.mysql.MySqlConnector tasksMax: 2 config: database.hostname: 192.168.99.1 database.port: "3306" database.user: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbUsername}" database.password: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbPassword}" database.server.id: "184054" #...자리 표시자 구조는
file:<path_and_file_name>:<property> 입니다.FileConfigProvider는 마운트된 보안에서 데이터베이스 사용자 이름 및 암호 속성 값을 읽고 추출합니다.
9.15.5. 디렉터리 내에서 여러 파일에서 구성 값 로드 링크 복사링크가 클립보드에 복사되었습니다!
DirectoryConfigProvider 를 사용하여 디렉터리 내의 여러 파일에서 구성 속성을 제공합니다. 파일은 구성 맵 또는 시크릿일 수 있습니다.
이 절차에서 시크릿은 커넥터에 대한 TLS 키 저장소 및 신뢰 저장소 사용자 인증 정보를 제공합니다. 자격 증명은 별도의 파일에 있습니다. 시크릿은 Kafka Connect Pod에 볼륨으로 마운트됩니다. 볼륨은 경로 /opt/kafka/external-configuration/<volume-name> 에 마운트됩니다.
사전 요구 사항
- Kafka 클러스터가 실행 중입니다.
- Cluster Operator가 실행 중입니다.
- 사용자 인증 정보가 포함된 시크릿이 있습니다.
사용자 인증 정보가 있는 시크릿 예
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
ca.crt: <public_key> # Public key of the clients CA
user.crt: <user_certificate> # Public key of the user
user.key: <user_private_key> # Private key of the user
user.p12: <store> # PKCS #12 store for user certificates and keys
user.password: <password_for_store> # Protects the PKCS #12 store
my-user 시크릿은 커넥터에 대한 키 저장소 인증 정보(user.crt 및 user.key)를 제공합니다.
Kafka 클러스터를 배포할 때 생성된 < cluster_name>-cluster-ca-cert 시크릿은 클러스터 CA 인증서를 신뢰 저장소 인증 정보(ca.crt)로 제공합니다.
프로세스
KafkaConnect리소스를 구성합니다.-
DirectoryConfigProvider활성화 -
externalConfiguration속성을 사용하여 파일을 지정합니다.
외부 속성 파일을 사용하는 Kafka Connect 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: config.providers: directory1 config.providers.directory.class: org.apache.kafka.common.config.provider.DirectoryConfigProvider2 #... externalConfiguration: volumes:3 - name: cluster-ca4 secret: secretName: my-cluster-cluster-ca-cert5 - name: my-user secret: secretName: my-user6 -
공급자를 활성화하도록 리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_connect_configuration_file>커넥터 구성의 파일 속성을 자리 표시자로 참조합니다.
파일을 참조하는 커넥터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: io.debezium.connector.mysql.MySqlConnector tasksMax: 2 config: # ... database.history.producer.security.protocol: SSL database.history.producer.ssl.truststore.type: PEM database.history.producer.ssl.truststore.certificates: "${directory:/opt/kafka/external-configuration/cluster-ca:ca.crt}" database.history.producer.ssl.keystore.type: PEM database.history.producer.ssl.keystore.certificate.chain: "${directory:/opt/kafka/external-configuration/my-user:user.crt}" database.history.producer.ssl.keystore.key: "${directory:/opt/kafka/external-configuration/my-user:user.key}" #...자리 표시자 구조는
directory:<path>:<file_name>입니다.DirectoryConfigProvider는 마운트된 보안에서 인증 정보를 읽고 추출합니다.
9.16. OpenShift 리소스 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 배포를 위한 Streams는 Deployment,Pod, Service 리소스와 같은 OpenShift 리소스를 생성합니다. 이러한 리소스는 Apache Kafka Operator용 Streams에서 관리합니다. 특정 OpenShift 리소스를 관리하는 Operator만 해당 리소스를 변경할 수 있습니다. operator-managed OpenShift 리소스를 수동으로 변경하려고 하면 Operator가 변경 사항을 다시 되돌립니다.
운영자 관리 OpenShift 리소스를 변경하면 다음과 같은 특정 작업을 수행하려는 경우 유용할 수 있습니다.
-
Istio 또는 기타 서비스에서
Pod를 처리하는 방법을 제어하는 사용자 정의 레이블 또는 주석 추가 -
Manage how
Loadbalancer-type Services are created by the cluster
OpenShift 리소스를 변경하려면 Apache Kafka 사용자 정의 리소스에 대한 다양한 Streams의 spec 섹션에서 template 속성을 사용할 수 있습니다.
다음은 변경 사항을 적용할 수 있는 사용자 정의 리소스 목록입니다.
-
Kafka.spec.kafka -
Kafka.spec.zookeeper -
Kafka.spec.entityOperator -
Kafka.spec.kafkaExporter -
Kafka.spec.cruiseControl -
KafkaNodePool.spec -
KafkaConnect.spec -
KafkaMirrorMaker.spec -
KafkaMirrorMaker2.spec -
KafkaBridge.spec -
KafkaUser.spec
이러한 속성에 대한 자세한 내용은 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.
Apache Kafka 사용자 정의 리소스 API 참조에서는 사용자 지정 가능한 필드에 대한 자세한 정보를 제공합니다.
다음 예에서 template 속성은 Kafka 브로커의 Pod에서 레이블을 수정하는 데 사용됩니다.
템플릿 사용자 정의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
labels:
app: my-cluster
spec:
kafka:
# ...
template:
pod:
metadata:
labels:
mylabel: myvalue
# ...
9.16.1. 이미지 가져오기 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림을 사용하면 Cluster Operator가 배포한 모든 Pod의 컨테이너에 대한 이미지 가져오기 정책을 사용자 지정할 수 있습니다. 이미지 가져오기 정책은 Cluster Operator 배포에서 환경 변수 STRIMZI_IMAGE_PULL_POLICY 를 사용하여 구성됩니다. STRIMZI_IMAGE_PULL_POLICY 환경 변수는 다음 세 가지 값으로 설정할 수 있습니다.
Always- Pod를 시작하거나 다시 시작할 때마다 레지스트리에서 컨테이너 이미지를 가져옵니다.
IfNotPresent- 컨테이너 이미지는 이전에 가져오지 않은 경우에만 레지스트리에서 가져옵니다.
Never- 컨테이너 이미지는 레지스트리에서 가져오지 않습니다.
현재 이미지 가져오기 정책은 모든 Kafka, Kafka Connect 및 Kafka MirrorMaker 클러스터에 대해 한 번에만 사용자 지정할 수 있습니다. 정책을 변경하면 모든 Kafka, Kafka Connect 및 Kafka MirrorMaker 클러스터가 롤링 업데이트됩니다.
9.16.2. 종료 유예 기간 적용 링크 복사링크가 클립보드에 복사되었습니다!
종료 유예 기간을 적용하여 Kafka 클러스터를 완전히 종료할 수 있는 충분한 시간을 제공합니다.
terminationGracePeriodSeconds 속성을 사용하여 시간을 지정합니다. Kafka 사용자 정의 리소스의 template.pod 구성에 속성을 추가합니다.
추가하는 시간은 Kafka 클러스터의 크기에 따라 달라집니다. 종료 유예 기간의 OpenShift 기본값은 30초입니다. 클러스터가 완전히 종료되지 않는 것을 관찰하면 종료 유예 기간을 늘릴 수 있습니다.
Pod가 재시작될 때마다 종료 유예 기간이 적용됩니다. 이 기간은 OpenShift에서 pod에서 실행되는 프로세스에 용어 (사전) 신호를 보낼 때 시작됩니다. 기간은 종료 Pod의 프로세스를 중지하기 전에 다른 Pod로 전송하는 데 필요한 시간을 반영해야 합니다. 기간이 종료되면 종료 신호가 Pod에서 계속 실행 중인 모든 프로세스를 중지합니다.
다음 예제에서는 Kafka 사용자 정의 리소스에 120초의 종료 유예 기간을 추가합니다. 다른 Kafka 구성 요소의 사용자 정의 리소스에 구성을 지정할 수도 있습니다.
종료 유예 기간 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
template:
pod:
terminationGracePeriodSeconds: 120
# ...
# ...
10장. Topic Operator를 사용하여 Kafka 주제 관리 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스는 파티션 및 복제 요소 설정을 포함하여 주제를 구성합니다. KafkaTopic 을 사용하여 주제를 생성, 수정 또는 삭제할 때 Topic Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.
KafkaTopic 리소스에 대한 자세한 내용은 KafkaTopic 스키마 참조를 참조하십시오.
10.1. 주제 관리 모드 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스는 Kafka 클러스터 내에서 단일 주제를 관리합니다. Topic Operator는 KafkaTopic 리소스 및 Kafka 주제를 관리하기 위한 두 가지 모드를 제공합니다.
- Unidirectional 모드(기본값)
- Unidirectional 모드에서는 클러스터 관리를 위해 Zoo Cryostat가 필요하지 않습니다. 이는 KRaft 모드에서 Apache Kafka용 Streams를 사용하는 것과 호환됩니다.
- 양방향 모드
- 양방향 모드를 사용하려면 클러스터 관리를 위해 Zoo Cryostat가 필요합니다. KRaft 모드에서 Apache Kafka용 Streams 사용과 호환되지 않습니다.
Topic Operator가 단방향 모드로 실행되도록 하는 기능 게이트가 일반 가용성으로 진행되므로 양방향 모드가 단계적으로 표시됩니다. 이 전환은 특히 KRaft 모드에서 Kafka를 지원하는 데 사용되는 사용자 환경을 개선하기 위한 것입니다.
10.1.1. Unidirectional 주제 관리 링크 복사링크가 클립보드에 복사되었습니다!
unidirectional 모드에서 Topic Operator는 다음과 같이 작동합니다.
-
KafkaTopic이 생성, 삭제 또는 변경되면 Topic Operator가 Kafka 주제에서 해당 작업을 수행합니다.
해당 KafkaTopic 리소스가 없으면 Kafka 클러스터 내에서 직접 생성, 삭제 또는 수정된 주제가 있는 경우 Topic Operator는 해당 주제를 관리하지 않습니다. Topic Operator는 KafkaTopic 리소스와 관련된 Kafka 주제만 관리하고 Kafka 클러스터 내에서 독립적으로 관리되는 주제를 방해하지 않습니다. Kafka 항목에 대한 KafkaTopic 이 있는 경우 리소스 외부에서 수행된 구성 변경 사항이 되돌아갑니다.
Topic Operator는 동일한 .spec.topicName 을 사용하여 여러 KafkaTopic 리소스가 Kafka 주제를 관리하려고 하는 경우를 감지할 수 있습니다. 가장 오래된 리소스만 조정되지만 다른 리소스는 리소스 충돌 오류와 함께 실패합니다.
10.1.2. 양방향 주제 관리 링크 복사링크가 클립보드에 복사되었습니다!
양방향 모드에서 Topic Operator는 다음과 같이 작동합니다.
-
KafkaTopic이 생성, 삭제 또는 변경되면 Topic Operator가 Kafka 주제에서 해당 작업을 수행합니다. -
마찬가지로 Kafka 클러스터 내에서 주제를 생성, 삭제 또는 변경할 때 Topic Operator는
KafkaTopic리소스에서 해당 작업을 수행합니다.
KafkaTopic 리소스를 통해 또는 Kafka에서 직접 주제 관리 방법을 유지합니다. 지정된 항목에 대한 두 방법 모두 정기적으로 전환하지 않도록 합니다.
10.2. 주제 이름 지정 규칙 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스에는 주제의 이름과 해당 Kafka 클러스터의 이름을 식별하는 레이블이 포함되어 있습니다.
주제 처리를 위해 Kafka 클러스터를 식별하는 레이블
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: topic-name-1
labels:
strimzi.io/cluster: my-cluster
spec:
topicName: topic-name-1
레이블은 Kafka 리소스의 클러스터 이름을 제공합니다. Topic Operator는 레이블을 관리할 KafkaTopic 리소스를 결정하는 메커니즘으로 사용합니다. 라벨이 Kafka 클러스터와 일치하지 않으면 Topic Operator에서 KafkaTopic 을 볼 수 없으며 주제는 생성되지 않습니다.
Kafka 및 OpenShift에는 고유한 이름 지정 검증 규칙이 있으며 Kafka 주제 이름은 OpenShift에서 유효한 리소스 이름이 아닐 수 있습니다. 가능한 경우 두 가지 모두에 대해 작동하는 이름 지정 규칙을 사용해 보십시오.
다음 지침을 고려하십시오.
- 주제의 특성을 반영하는 주제 이름을 사용합니다.
- 간결하게 하고 63자 아래에 이름을 유지합니다.
- 모든 소문자 및 하이픈 사용
- 특수 문자, 공백 또는 기호 방지
KafkaTopic 리소스를 사용하면 metadata.name 필드를 사용하여 Kafka 주제 이름을 지정할 수 있습니다. 그러나 원하는 Kafka 주제 이름이 유효한 OpenShift 리소스 이름이 아닌 경우 spec.topicName 속성을 사용하여 실제 이름을 지정할 수 있습니다. spec.topicName 필드는 선택 사항이며, 없는 경우 Kafka 주제 이름은 기본적으로 주제의 metadata.name 으로 설정됩니다. 주제가 생성되면 나중에 주제 이름을 변경할 수 없습니다.
유효한 Kafka 주제 이름을 제공하는 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic-1
spec:
topicName: My.Topic.1
# ...
둘 이상의 KafkaTopic 리소스가 동일한 Kafka 주제를 참조하는 경우 먼저 생성된 리소스는 주제를 관리하는 것으로 간주됩니다. 최신 리소스의 상태가 충돌을 나타내도록 업데이트되고 Ready 상태가 False 로 변경됩니다.
Kafka Streams와 같은 Kafka 클라이언트 애플리케이션이 잘못된 OpenShift 리소스 이름으로 주제를 자동으로 생성하는 경우 Topic Operator는 양방향 모드에서 사용할 때 유효한 metadata.name 을 생성합니다. 유효하지 않은 문자를 교체하고 이름에 해시를 추가합니다. 그러나 이 동작은 단방향 모드에서는 적용되지 않습니다.
잘못된 주제 이름을 교체하는 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic---c55e57fe2546a33f9e603caf57165db4072e827e
# ...
클러스터의 식별자 및 이름에 대한 요구 사항에 대한 자세한 내용은 OpenShift 문서 오브젝트 이름 및 ID를 참조하십시오.
10.3. 주제에 대한 변경 사항 처리 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator에서 주제의 변경 사항을 처리하는 방법은 주제 관리 모드에 따라 다릅니다.
-
비방향 주제 관리의 경우 구성 변경은
KafkaTopic리소스에서 Kafka 주제로 한 방향으로만 이동합니다.KafkaTopic리소스 외부에서 관리되는 Kafka 주제의 모든 변경 사항이 취소됩니다. -
양방향 주제 관리의 경우 구성 변경 사항은 Kafka 주제와
KafkaTopic리소스 간에 동기화됩니다. 호환되지 않는 변경 사항은 Kafka 구성에 우선하며KafkaTopic리소스는 그에 따라 조정됩니다.
10.3.1. 양방향 주제 관리를 위한 주제 저장소 링크 복사링크가 클립보드에 복사되었습니다!
양방향 주제 관리의 경우 Topic Operator는 단일 정보 소스가 없는 경우 주제 변경 사항을 처리할 수 있습니다. KafkaTopic 리소스 및 Kafka 주제는 특히 Topic Operator가 작동하지 않는 경우 변경 사항에 대한 실시간 관찰이 항상 가능한 것은 아닙니다. 이를 처리하기 위해 Topic Operator는 각 주제에 대한 주제 구성 정보를 저장하는 주제 저장소를 유지 관리합니다. Kafka 클러스터 및 OpenShift의 상태를 주제 저장소와 비교하여 동기화에 필요한 변경 사항을 결정합니다. 이 평가는 시작 중에 그리고 정기적으로 Topic Operator가 활성화되어 있는 동안 수행됩니다.
예를 들어 Topic Operator가 비활성화되고 my-topic 이라는 새 KafkaTopic 이 생성되면 Topic Operator는 주제 저장소에 my-topic 이 없음을 인식합니다. KafkaTopic 은 마지막 작업 후에 생성된 것을 인식합니다. 결과적으로 Topic Operator는 해당 Kafka 주제를 생성하고 주제 저장소에 메타데이터를 저장합니다.
주제 저장소를 사용하면 Topic Operator에서 변경 사항이 호환되는 경우 Kafka 주제 및 KafkaTopic 리소스에서 주제 구성이 변경되는 상황을 관리할 수 있습니다. Kafka 주제 구성이 업데이트되거나 KafkaTopic 사용자 정의 리소스가 변경되면 변경 사항이 호환되는 경우 Kafka 클러스터와 조정한 후 주제 저장소가 업데이트됩니다.
주제 저장소 는 Kafka 주제를 사용하여 상태를 유지하는 Kafka Streams 키-값 메커니즘을 기반으로 합니다. 주제 메타데이터는 메모리 내 캐시되고 Topic Operator 내에서 로컬에 액세스합니다. 로컬 메모리 내 캐시에 적용된 작업에서 업데이트는 디스크의 백업 주제 저장소에 유지됩니다. 주제 저장소는 Kafka 주제 또는 OpenShift KafkaTopic 사용자 정의 리소스의 업데이트와 지속적으로 동기화됩니다. 주제 저장소가 이러한 방식으로 설정된 상태에서 신속하게 처리되지만 메모리 내 캐시가 충돌하면 영구 스토리지에서 자동으로 다시 채워집니다.
내부 주제는 주제 저장소의 주제 메타데이터 처리를 지원합니다.
__strimzi_store_topic- 주제 메타데이터 저장을 위한 입력 주제
__strimzi-topic-operator-kstreams-topic-store-changelog- 컴팩트한 주제 저장소 값의 로그 유지
Topic Operator 실행에 필수이므로 이러한 주제를 삭제하지 마십시오.
10.3.2. Zoo Cryostat에서 주제 저장소로 주제 메타데이터 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
이전 버전의 Apache Kafka에서는 주제 메타데이터가 Zoo Cryostat에 저장되었습니다. 주제 저장소는 이 요구 사항을 제거하여 Kafka 클러스터에 메타데이터를 가져오고 Topic Operator를 제어합니다.
Apache Kafka 2.7용 Streams로 업그레이드할 때 주제 저장소의 Topic Operator 제어로 전환이 원활합니다. 메타 데이터가 Zoo Cryostat에서 찾아 마이그레이션되고 이전 저장소가 삭제됩니다.
10.3.3. Zoo Cryostat를 사용하여 주제 메타데이터를 저장하는 Apache Kafka용 Streams로 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
주제 메타데이터 스토리지에 Zoo Cryostat를 사용하는 1.7 이전의 Streams 버전으로 되돌리는 경우 Cluster Operator를 이전 버전으로 다운그레이드한 다음 Kafka 브로커 및 클라이언트 애플리케이션을 표준으로 다운그레이드합니다.
그러나 Kafka 클러스터의 부트스트랩 주소를 지정하여 kafka-topics 명령을 사용하여 주제 저장소에 대해 생성된 주제를 삭제해야 합니다. 예를 들면 다음과 같습니다.
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
명령은 Kafka 클러스터에 액세스하는 데 사용되는 리스너 및 인증 유형에 해당해야 합니다.
Topic Operator는 Kafka의 주제 상태에서 Zoo Cryostat 주제 메타데이터를 재구성합니다.
10.3.4. 주제 자동 생성 링크 복사링크가 클립보드에 복사되었습니다!
애플리케이션은 Kafka 클러스터에서 주제 자동 생성을 트리거할 수 있습니다. 기본적으로 Kafka 브로커 구성 auto.create.topics.enable 은 true 로 설정되어 브로커가 애플리케이션이 존재하지 않는 주제를 생성하거나 사용하려고 할 때 자동으로 주제를 생성할 수 있습니다. 애플리케이션에서는 Kafka AdminClient 를 사용하여 자동으로 주제를 생성할 수도 있습니다. 애플리케이션이 KafkaTopic 리소스와 함께 배포되면 Topic Operator가 KafkaTopic 에 반응하기 전에 클러스터에서 자동 주제 생성이 발생할 수 있습니다.
양방향 주제 관리를 위해 Topic Operator는 주제와 KafkaTopic 리소스 간의 변경 사항을 동기화합니다.
단방향 주제 관리를 사용하는 경우 애플리케이션 배포를 위해 생성된 주제가 처음에 기본 주제 구성으로 생성됨을 의미합니다. Topic Operator가 애플리케이션 배포에 포함된 KafkaTopic 리소스 사양에 따라 주제를 재구성하려고 하면 구성에 필요한 변경이 허용되지 않기 때문에 작업이 실패할 수 있습니다. 예를 들어 변경 시 주제 파티션 수를 줄이는 경우입니다. 따라서 리디렉션되지 않은 주제 관리를 사용할 때 Kafka 클러스터 구성에서 auto.create.topics.enable 을 비활성화하는 것이 좋습니다.
10.4. Kafka 주제 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스의 속성을 사용하여 Kafka 주제를 구성합니다. KafkaTopic 의 주제 구성 변경 사항은 Kafka로 전파됩니다.
oc apply 를 사용하여 주제를 만들거나 수정하고 oc delete 를 사용하여 기존 주제를 삭제할 수 있습니다.
예를 들면 다음과 같습니다.
-
oc apply -f <topic_config_file> -
oc delete KafkaTopic <topic_name>
주제를 삭제할 수 있으려면 Kafka 리소스의 spec.kafka.config 에서 delete.topic.enable 을 true (기본값)로 설정해야 합니다.
다음 절차에서는 10개의 파티션과 2개의 복제본이 있는 주제를 생성하는 방법을 설명합니다.
이 절차는 주제 관리의 단방향 및 양방향 모드와 동일합니다.
사전 준비 사항
KafkaTopic 리소스는 다음 변경을 허용하지 않습니다.
-
spec.topicName에 정의된 주제의 이름을 변경합니다.spec.topicName과status.topicName간의 불일치가 감지됩니다. -
spec.partitions를 사용하여 파티션 수를 줄입니다( Kafka에서 지원되지 않음). -
spec.replicas에 지정된 복제본 수 수정
키가 있는 주제의 spec.partitions 를 늘리면 레코드 파티셔닝이 변경되어 특히 주제에서 시맨틱 파티셔닝을 사용하는 경우 문제가 발생할 수 있습니다.
사전 요구 사항
- mTLS 인증 및 TLS 암호화를 사용하여 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
- 실행 중인 Topic Operator(일반적으로 Entity Operator와 함께 배포됨).
-
주제를 삭제하려면
Kafka리소스의spec.kafka.config에서delete.topic.enable=true(기본값)를 삭제합니다.
프로세스
KafkaTopic리소스를 구성합니다.Kafka 주제 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2작은 정보주제를 수정할 때
oc get kafkatopic my-topic-1 -o yaml을 사용하여 현재 버전의 리소스를 가져올 수 있습니다.OpenShift에서
KafkaTopic리소스를 생성합니다.oc apply -f <topic_config_file>주제의 준비 상태가
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 TrueREADY출력에True가 표시되면 주제 생성이 성공합니다.READY열이 비어 있는 경우 리소스 YAML 또는 Topic Operator 로그에서 상태에 대한 자세한 정보를 가져옵니다.상태 메시지는 현재 상태의 이유에 대한 세부 정보를 제공합니다.
oc get kafkatopics my-topic-2 -o yamlNotReady상태의 주제 세부 정보# ... 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 yamlREADY상태의 주제 세부 정보# ... status: conditions: - lastTransitionTime: '2022-06-13T10:15:03.761084Z' status: 'True' type: Ready
10.5. 복제 및 파티션 수에 대한 주제 구성 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator에서 관리하는 항목에 권장되는 구성은 3가지의 복제 요소이며 최소 2개의 in-sync 복제본입니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 10
replicas: 3
config:
min.insync.replicas: 2
#...
동기화 내 복제본은 생산자 애플리케이션에 대한 acks 구성과 함께 사용됩니다. acks 구성에 따라 메시지가 성공적으로 수신되는 것으로 확인되기 전에 메시지를 복제해야 하는 후속 파티션 수가 결정됩니다. 양방향 주제 Operator는 내부 주제의 경우 acks=all 과 함께 실행됩니다. 여기서by 메시지는 모든 동기화 복제본에서 승인해야 합니다.
브로커를 추가하거나 제거하여 Kafka 클러스터를 스케일링하는 경우 복제 요인 구성이 변경되지 않고 복제본이 자동으로 다시 할당되지 않습니다. 그러나 kafka-reassign-partitions.sh 툴을 사용하여 복제 요소를 변경하고 브로커에 복제본을 수동으로 다시 할당할 수 있습니다.
또는 Cruise Control for Streams for Streams for Streams를 통합하면 주제의 복제 요소를 변경할 수 없지만 Kafka 재조정을 위해 생성하는 최적화 제안에는 파티션 복제본을 전송하고 파티션 리더십을 변경하는 명령이 포함됩니다.
10.6. Kafka 주제에 영향을 미치지 않고 Kafka 리소스 관리 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 KafkaTopic 리소스를 통해 현재 관리되는 Kafka 주제를 비관리 주제로 변환하는 방법을 설명합니다. 이 기능은 다양한 시나리오에서 유용할 수 있습니다. 예를 들어 KafkaTopic 리소스의 metadata.name 을 업데이트할 수 있습니다. 원래 KafkaTopic 리소스를 삭제하고 새 리소스를 다시 생성하는 경우에만 이 작업을 수행할 수 있습니다.
strimzi.io/managed=false 를 사용하여 KafkaTopic 리소스에 주석을 달면 Topic Operator에서 더 이상 특정 주제를 관리하지 않아야 함을 나타냅니다. 이를 통해 리소스의 구성 또는 기타 관리 작업을 변경하는 동안 Kafka 주제를 유지할 수 있습니다.
단방향 주제 관리를 사용하는 경우 이 작업을 수행할 수 있습니다.
사전 요구 사항
프로세스
OpenShift에서
KafkaTopic리소스에 주석을 답니다.strimzi.io/managed를false로 설정합니다.oc annotate kafkatopic my-topic-1 strimzi.io/managed="false"KafkaTopic리소스에서 topic의metadata.name을 지정합니다(이 예제에서는my-topic-1).KafkaTopic리소스의 상태를 확인하여 요청이 성공했는지 확인합니다.oc get kafkatopics my-topic-1 -o yamlReady상태의 항목 예apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 124 name: my-topic-1 finalizer: strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 1241 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z- 1
- 리소스를 성공적으로 조정하면 주제를 더 이상 관리하지 않습니다.
metadata.generation(현재 배포 버전)의 값은status.observedGeneration(리소스의 최신 조정)과 일치해야합니다.이제 관리 중인 Kafka 항목에 영향을 미치지 않고
KafkaTopic리소스를 변경할 수 있습니다.예를 들어
metadata.name을 변경하려면 다음과 같이 수행합니다.원래
KafkTopic리소스를 삭제합니다.oc delete kafkatopic <kafka_topic_name>-
다른
metadata.name을 사용하여KafkTopic리소스를 재생성하지만spec.topicName을 사용하여 원본에서 관리하는 것과 동일한 주제를 참조합니다.
-
원래
KafkaTopic리소스를 삭제하지 않았으며 Kafka 주제 관리를 다시 시작하려는 경우strimzi.io/managed주석을true로 설정하거나 주석을 제거합니다.
10.7. 기존 Kafka 주제의 주제 관리 활성화 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 KafkaTopic 리소스를 통해 현재 관리되지 않는 주제의 주제 관리를 활성화하는 방법을 설명합니다. 일치하는 KafkaTopic 리소스를 생성하여 이 작업을 수행합니다.
단방향 주제 관리를 사용하는 경우 이 작업을 수행할 수 있습니다.
사전 요구 사항
프로세스
Kafka 주제와 동일한
metadata.name을 사용하여KafkaTopic리소스를 생성합니다.또는 Kafka의 주제 이름이 법적 OpenShift 리소스 이름이 아닌 경우
spec.topicName을 사용합니다.Kafka 주제 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2이 예제에서 Kafka 주제의 이름은
my-topic-1입니다.Topic Operator는 주제를 다른
KafkaTopic리소스에서 관리하는지 확인합니다. 이 경우 이전 리소스가 우선하며 리소스 충돌 오류가 새 리소스의 상태로 반환됩니다.KafkaTopic리소스를 적용합니다.oc apply -f <topic_configuration_file>Operator가 Kafka의 주제를 업데이트할 때까지 기다립니다.
Operator는 이름이 동일한
KafkaTopic의사양을 사용하여 Kafka 주제를 업데이트합니다.KafkaTopic리소스의 상태를 확인하여 요청이 성공했는지 확인합니다.oc get kafkatopics my-topic-1 -o yamlReady상태의 항목 예apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 11 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z- 1
- 리소스를 성공적으로 조정하는 것은 이제 주제를 관리하는 것을 의미합니다.
metadata.generation(현재 배포 버전)의 값은status.observedGeneration(리소스의 최신 조정)과 일치해야합니다.
10.8. 관리되는 주제 삭제 링크 복사링크가 클립보드에 복사되었습니다!
Unidirectional 주제 관리에서는 OpenShift 종료자를 사용하거나 사용하지 않고 KafkaTopic 리소스를 통해 관리되는 주제를 삭제할 수 있도록 지원합니다. 이는 STRIMZI_USE_FINALIZERS Topic Operator 환경 변수에 따라 결정됩니다. 기본적으로 이 값은 true 로 설정되지만 Topic Operator에서 종료자를 추가하지 않으려면 Topic Operator env 구성에서 false 로 설정할 수 있습니다.
종료자를 사용하면 KafkaTopic 리소스의 순서가 지정되고 제어됩니다. Topic Operator의 종료자가 KafkaTopic 리소스의 메타데이터에 추가됩니다.
주제 삭제를 제어하는 종료자
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
generation: 1
name: my-topic-1
finalizers:
- strimzi.io/topic-operator
labels:
strimzi.io/cluster: my-cluster
이 예제에서는 my-topic-1 항목에 대해 종료자가 추가되었습니다. 종료자를 사용하면 종료 프로세스가 완료될 때까지 주제를 완전히 삭제할 수 없습니다. 그런 다음 oc delete kafkatopic my-topic-1 을 사용하여 주제를 삭제하면 메타데이터에 타임스탬프가 추가됩니다.
삭제 시 종료 종료 타임스탬프
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
generation: 1
name: my-topic-1
finalizers:
- strimzi.io/topic-operator
labels:
strimzi.io/cluster: my-cluster
deletionTimestamp: 20230301T000000.000
리소스가 여전히 존재합니다. 삭제에 실패하면 리소스 상태에 표시됩니다.
종료 작업이 성공적으로 실행되면 종료자가 메타데이터에서 제거되고 리소스가 완전히 삭제됩니다.
종료자는 관련 리소스가 삭제되지 않도록 하는 기능도 제공합니다. unidirectional Topic Operator가 실행 중이 아닌 경우 metadata.finalizers 에서 종료자를 제거할 수 없습니다. 그리고 KafkaTopic 리소스 또는 네임스페이스를 직접 삭제하려고 하면 실패하거나 시간 초과되어 네임스페이스가 중단된 상태가 됩니다. 이 경우 주제의 종료자를 제거하여 종료 프로세스를 바이패스할 수 있습니다.
10.9. Topic Operator 모드 간 전환 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams를 업그레이드하거나 다운그레이드할 때 또는 해당 버전에서 모드가 지원되는 한 Apache Kafka용 스트림의 동일한 버전을 사용할 때 주제 관리 모드를 전환할 수 있습니다.
양방향에서 단방향 주제 관리 모드로 전환
UnidirectionalTopicOperator기능 게이트를 활성화합니다.Cluster Operator는 Topic Operator를 리디렉션되지 않은 주제 관리 모드로 사용하여 Entity Operator를 배포합니다.
양방향 주제 관리 모드에서 실행되는 Topic Operator를 지원하는 내부 주제는 더 이상 필요하지 않으므로
KafkaTopic리소스를 삭제하여 관리할 수 있습니다.oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-store-topic) \ && oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-topic-operator)이 명령은
strimzi-store-topic및strimzi-topic-operator를 시작하는 이름이 있는 내부 주제를 삭제합니다.소비자 오프셋 및 트랜잭션 상태를 저장하기 위한 내부 주제는 Kafka에 유지되어야 합니다. 따라서
KafkaTopic리소스를 삭제하기 전에 Topic Operator에서 관리를 중단해야 합니다.주제 관리 중단:
oc annotate $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) strimzi.io/managed="false" \ && oc annotate $(oc get kt -n <namespace_name> -o name | grep transaction-state) strimzi.io/managed="false"strimzi.io/managed="false"를 사용하여KafkaTopic리소스에 주석을 달면 Topic Operator에서 해당 주제를 더 이상 관리하지 않아야 함을 나타냅니다. 이 경우consumer-offsets및transaction-state라는 이름으로 내부 주제를 관리하기 위한 리소스에 주석을 추가하고 있습니다.관리가 중단되면
Kafka 내부의 주제를 삭제하지 않고 Kafka 리소스를 삭제합니다.oc delete $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) \ && oc delete $(oc get kt -n <namespace_name> -o name | grep transaction-state)
단방향에서 양방향 주제 관리 모드로 전환
UnidirectionalTopicOperator기능 게이트를 비활성화합니다.Cluster Operator는 Topic Operator를 양방향 주제 관리 모드로 사용하여 Entity Operator를 배포합니다.
양방향 주제 관리 모드에서 실행되는 Topic Operator에 필요한 내부 주제가 생성됩니다.
종료자가 주제 삭제를 제어하는 데 사용 중인지 확인합니다.
KafkaTopic리소스가 종료자를 사용하는 경우 전환 후 다음 중 하나를 수행해야 합니다.- 주제에서 모든 종료자를 제거합니다.
Topic Operator
env구성에서STRIMZI_USE_FINALIZERS환경 변수를false로 설정하여 종료자를 비활성화합니다.Apache Kafka 관리 클러스터 또는 독립 실행형 배포로 Streams for Apache Kafka 관리 클러스터에서 실행 중인 Topic Operator에 대해 동일한 구성을 사용합니다.
Apache Kafka 관리 클러스터의 Streams에서 주제 종료자 비활성화
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... entityOperator: topicOperator: {} userOperator: {} template: topicOperatorContainer: env: - name: STRIMZI_USE_FINALIZERS value: "false" # ...독립 실행형 배포에서 주제 종료자 비활성화
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator spec: template: spec: containers: - name: STRIMZI_USE_FINALIZERS value: "false" # ...Topic Operator는 양방향 모드에서 종료자를 사용하지 않습니다. 비방향 모드에서 전환한 후 유지되는 경우
KafkaTopic및 관련 리소스를 삭제할 수 없습니다.
Topic Operator 모드 간에 전환한 후 주제를 생성하여 Operator가 올바르게 실행되고 있는지 확인합니다. 자세한 내용은 10.4절. “Kafka 주제 구성”의 내용을 참조하십시오.
10.10. 주제에서 종료자 제거 링크 복사링크가 클립보드에 복사되었습니다!
대상 Operator가 실행되지 않고 관리 항목을 삭제할 때 종료 프로세스를 바이패스하려면 종료자를 제거해야 합니다. 리소스를 직접 편집하거나 명령을 사용하여 수동으로 이 작업을 수행할 수 있습니다.
모든 주제에서 종료자를 제거하려면 다음 명령을 사용합니다.
주제에서 종료자 제거
oc get kt -o=json | jq '.items[].metadata.finalizers = null' | oc apply -f -
이 명령은 jq 명령줄 JSON 구문 분석 도구를 사용하여 종료자를 null 로 설정하여 KafkaTopic (kt) 리소스를 수정합니다. 특정 항목에 대해 명령을 사용할 수도 있습니다.
특정 주제에서 종료자 제거
oc get kt <topic_name> -o=json | jq '.metadata.finalizers = null' | oc apply -f -
명령을 실행한 후 주제를 삭제하고 삭제할 수 있습니다. 또는 항목이 이미 삭제되었지만 미해결 종료자로 인해 차단된 경우 삭제가 완료됩니다.
Topic Operator가 실행되지 않는 경우 종료자 프로세스와 관련된 정리 작업이 수행되지 않으므로 종료자를 제거할 때는 주의해야 합니다. 예를 들어 KafkaTopic 리소스에서 종료자를 제거하고 나중에 리소스를 삭제하면 관련 Kafka 항목이 삭제되지 않습니다.
10.11. 주제 삭제를 비활성화할 때 고려 사항 링크 복사링크가 클립보드에 복사되었습니다!
Kafka의 delete.topic.enable 구성이 false 로 설정된 경우 주제를 삭제할 수 없습니다. 특정 시나리오에서는 이 작업이 필요할 수 있지만 Topic Operator를 unidirectional 모드에서 사용할 때 고려해야 할 사항이 있습니다.
주제를 삭제할 수 없으므로 주제 삭제를 제어하기 위해 KafkaTopic 리소스의 메타데이터에 추가되는 종료자는 Topic Operator에서 제거되지 않습니다( 수동으로 제거할수 있음). 마찬가지로 CRD(Custom Resource Definitions) 또는 주제와 연결된 네임스페이스는 삭제할 수 없습니다.
delete.topic.enable=false 를 구성하기 전에 이러한 영향을 평가하여 특정 요구 사항과 일치하는지 확인합니다.
종료자를 사용하지 않으려면 STRIMZI_USE_FINALIZERS Topic Operator 환경 변수를 false 로 설정할 수 있습니다.
10.12. 주제 작업에 대한 요청 배치 튜닝 링크 복사링크가 클립보드에 복사되었습니다!
고정 모드인 Topic Operator는 Kafka Admin API의 요청 일괄 처리 기능을 주제 리소스에 대한 작업에 사용합니다. 다음 Operator 구성 속성을 사용하여 일괄 처리 메커니즘을 미세 조정할 수 있습니다.
-
STRIMZI_MAX_QUEUE_SIZE는 주제 이벤트 큐의 최대 크기를 설정합니다. 기본값은 1024입니다. -
STRIMZI_MAX_BATCH_SIZE는 단일 일괄 처리에서 허용되는 최대 주제 이벤트 수를 설정합니다. 기본값은 100입니다. -
MAX_BATCH_LINGER_MS는 일괄 처리가 처리되기 전에 항목을 누적할 때까지 대기하는 최대 시간을 지정합니다. 기본값은 100밀리초입니다.
요청 일괄 처리 대기열의 최대 크기를 초과하면 Topic Operator가 종료되고 다시 시작됩니다. 빈번한 재시작을 방지하려면 일반적인 부하를 수용하도록 STRIMZI_MAX_QUEUE_SIZE 속성을 조정하는 것이 좋습니다.
11장. User Operator를 사용하여 Kafka 사용자 관리 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스를 사용하여 사용자를 생성, 수정 또는 삭제할 때 User Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.
KafkaUser 리소스에 대한 자세한 내용은 KafkaUser 스키마 참조를 참조하십시오.
11.1. Kafka 사용자 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스의 속성을 사용하여 Kafka 사용자를 구성합니다.
oc apply 를 사용하여 사용자를 만들거나 수정하고 oc delete 를 사용하여 기존 사용자를 삭제할 수 있습니다.
예를 들면 다음과 같습니다.
-
oc apply -f <user_config_file> -
oc delete KafkaUser < ;user_name>
사용자는 Kafka 클라이언트를 나타냅니다. Kafka 사용자를 구성할 때 클라이언트가 Kafka에 액세스하는 데 필요한 사용자 인증 및 권한 부여 메커니즘을 활성화합니다. 사용되는 메커니즘은 동등한 Kafka 구성과 일치해야 합니다. Kafka 브로커에 대한 액세스를 보호하기 위해 Kafka 및 KafkaUser 리소스를 사용하는 방법에 대한 자세한 내용은 Kafka 브로커에 대한 액세스 보안 을 참조하십시오.
사전 요구 사항
- mTLS 인증 및 TLS 암호화를 사용하여 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
- 실행 중인 User Operator(일반적으로 Entity Operator와 함께 배포됨)
프로세스
KafkaUser리소스를 구성합니다.이 예제에서는 ACL을 사용하여 mTLS 인증 및 간단한 권한 부여를 지정합니다.
Kafka 사용자 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user-1 labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: # Example consumer Acls for topic my-topic using consumer group my-group - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read host: "*" - resource: type: group name: my-group patternType: literal operations: - Read host: "*" # Example Producer Acls for topic my-topic - resource: type: topic name: my-topic patternType: literal operations: - Create - Describe - Write host: "*"OpenShift에서
KafkaUser리소스를 생성합니다.oc apply -f <user_config_file>사용자의 준비 상태가
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 TrueREADY출력에True가 표시되면 사용자 생성이 성공합니다.READY열이 비어 있으면 리소스 YAML 또는 User Operator 로그에서 상태에 대한 자세한 정보를 가져옵니다.메시지는 현재 상태의 이유에 대한 세부 정보를 제공합니다.
oc get kafkausers my-user-2 -o yamlNotReady상태의 사용자 세부 정보# ... 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: simpleKafka 구성을 업데이트하면 상태가 사용자가 준비되었음을 표시합니다.
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 yamlREADY상태의 사용자 세부 정보# ... status: conditions: - lastTransitionTime: "2022-06-10T10:33:40.166846Z" status: "True" type: Ready
12장. Red Hat build of Apicurio Registry를 사용하여 스키마 검증 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat build of Apicurio Registry를 Apache Kafka용 Streams와 함께 사용할 수 있습니다.
Apicurio Registry는 API 및 이벤트 중심 아키텍처에서 표준 이벤트 스키마 및 API 설계를 공유하기 위한 데이터 저장소입니다. Apicurio Registry를 사용하여 클라이언트 애플리케이션에서 데이터 구조를 분리하고, REST 인터페이스를 사용하여 런타임에 데이터 유형 및 API 설명을 공유 및 관리할 수 있습니다.
Apicurio 레지스트리는 클라이언트 애플리케이션에서 메시지를 직렬화 및 역직렬화하는 데 사용되는 스키마를 저장하여 보내는 메시지가 해당 스키마와 호환되는지 확인합니다. Apicurio Registry는 Kafka 생산자 및 소비자 애플리케이션에 대한 Kafka 클라이언트 serializers/deserializers를 제공합니다. Kafka 생산자 애플리케이션은 직렬화기를 사용하여 특정 이벤트 스키마를 준수하는 메시지를 인코딩합니다. Kafka 소비자 애플리케이션은 특정 스키마 ID에 따라 메시지가 올바른 스키마를 사용하여 직렬화되었는지 확인하는 deserialize기를 사용합니다.
애플리케이션에서 레지스트리의 스키마를 사용하도록 설정할 수 있습니다. 이렇게 하면 일관된 스키마 사용이 보장되고 런타임 시 데이터 오류를 방지하는 데 도움이 됩니다.
13장. 변경 데이터 캡처를 위한 Red Hat 빌드 Debezium 통합 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat build of Debezium은 분산 변경 데이터 캡처 플랫폼입니다. 데이터베이스의 행 수준 변경 사항을 캡처하고 변경 이벤트 레코드를 생성하며 Kafka 주제로 레코드를 스트리밍합니다. Debezium은 Apache Kafka를 기반으로 합니다. Red Hat build of Debezium을 Apache Kafka용 Streams와 통합할 수 있습니다. Apache Kafka용 Streams를 배포한 후 Kafka Connect를 통해 Debezium을 커넥터 구성으로 배포합니다. Debezium은 OpenShift의 Apache Kafka용 Streams로 변경 이벤트 레코드를 전달합니다. 애플리케이션은 이러한 변경 이벤트 스트림을 읽고 해당 스트림이 발생한 순서대로 변경 이벤트에 액세스할 수 있습니다.
Debezium은 다음을 포함하여 여러 가지 용도가 있습니다.
- 데이터 복제
- 캐시 및 검색 인덱스 업데이트
- 모놀리식 애플리케이션 간소화
- 데이터 통합
- 스트리밍 쿼리 활성화
데이터베이스 변경 사항을 캡처하려면 Debezium 데이터베이스 커넥터를 사용하여 Kafka Connect를 배포합니다. 커넥터 인스턴스를 정의하도록 KafkaConnector 리소스를 구성합니다.
Apache Kafka용 Streams를 사용하여 Red Hat build of Debezium을 배포하는 방법에 대한 자세한 내용은 제품 설명서 를 참조하십시오. 이 문서에는 데이터베이스 업데이트에 대한 변경 이벤트 레코드를 보는 데 필요한 서비스 및 커넥터 설정 프로세스를 안내하는 Debezium 가이드가 포함되어 있습니다.
14장. Kafka 클러스터에 대한 클라이언트 액세스 설정 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 용 Streams를 배포한 후 Kafka 클러스터에 대한 클라이언트 액세스를 설정할 수 있습니다. 배포를 확인하려면 예제 생산자 및 소비자 클라이언트를 배포할 수 있습니다. 그렇지 않으면 OpenShift 클러스터 내부 또는 외부의 클라이언트 액세스를 제공하는 리스너를 생성합니다.
14.1. 예제 클라이언트 배포 링크 복사링크가 클립보드에 복사되었습니다!
메시지를 보내고 받기 위해 생산자 및 소비자 클라이언트 예제를 배포합니다. 이러한 클라이언트를 사용하여 Apache Kafka용 Streams 배포를 확인할 수 있습니다.
사전 요구 사항
- Kafka 클러스터는 클라이언트에서 사용할 수 있습니다.
프로세스
Kafka 생산자를 배포합니다.
oc run kafka-producer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic- 생산자가 실행 중인 콘솔에 메시지를 입력합니다.
- Enter 를 눌러 메시지를 보냅니다.
Kafka 소비자를 배포합니다.
oc run kafka-consumer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic --from-beginning- 소비자 콘솔에 들어오는 메시지가 표시되는지 확인합니다.
14.2. Kafka 브로커에 연결하도록 리스너 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커에 대한 클라이언트 연결에 리스너를 사용합니다. Apache Kafka의 스트림은 Kafka 리소스를 통해 리스너를 구성하는 속성이 포함된 일반 GenericKafkaListener 스키마를 제공합니다. GenericKafkaListener 는 리스너 구성에 대한 유연한 접근 방식을 제공합니다. 속성을 지정하여 OpenShift 클러스터 내에서 연결하기 위해 내부 리스너를 구성하거나 OpenShift 클러스터 외부에서 연결하기 위한 외부 리스너를 구성할 수 있습니다.
리스너 구성에 Kafka를 노출할 연결 유형을 지정합니다. 선택한 유형은 요구 사항과 사용자 환경 및 인프라에 따라 다릅니다. 다음과 같은 리스너 유형이 지원됩니다.
- 내부 리스너
-
동일한 OpenShift 클러스터 내에서 연결할
내부 -
broker
ClusterIP서비스를 사용하여 Kafka 노출
-
동일한 OpenShift 클러스터 내에서 연결할
- 외부 리스너
-
OpenShift
노드에서 포트를 사용하는 NodePort -
loadbalancer서비스를 사용하는 LoadBalancer -
Kubernetes
인그레스및 쿠버네티스 용IngressNGINX Controller (Kubernetes 전용)를 사용하는 Ingress -
OpenShift
및 기본 HAProxy 라우터(OpenShift만 해당)를 사용하는 경로경로
-
OpenShift
OpenShift에서 Ingress를 사용하지 마십시오. 대신 경로 유형을 사용합니다. Ingress NGINX 컨트롤러는 Kubernetes에서만 사용하기 위한 것입니다. 경로 유형은 OpenShift에서만 지원됩니다.
내부 유형 리스너 구성은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. OpenShift 네트워크를 외부 네트워크에 결합할 수 있습니다. 이 경우 OpenShift 서비스 DNS 도메인(일반적으로 .cluster.local)이 사용되지 않도록 내부 유형 리스너( useServiceDnsDomain 속성 사용)를 구성할 수 있습니다. broker ClusterIP 서비스를 기반으로 Kafka 클러스터를 노출하는 cluster-ip 유형의 리스너를 구성할 수도 있습니다. 이 옵션은 헤드리스 서비스를 통해 라우팅할 수 없거나 사용자 정의 액세스 메커니즘을 통합하려는 경우 유용합니다. 예를 들어 특정 Ingress 컨트롤러 또는 OpenShift Gateway API에 대한 자체 유형의 외부 리스너를 빌드할 때 이 리스너를 사용할 수 있습니다.
외부 리스너는 다른 인증 메커니즘이 필요한 네트워크에서 Kafka 클러스터에 대한 액세스를 처리합니다. 로드 밸런서 또는 경로와 같은 지정된 연결 메커니즘을 사용하여 OpenShift 환경 외부의 클라이언트에 액세스할 수 있도록 외부 리스너를 구성할 수 있습니다. 예를 들어, 노드 포트가 더 나은 옵션을 제공하는 베어 메탈과 같은 특정 인프라에 로드 밸런서가 적합하지 않을 수 있습니다.
각 리스너는 Kafka 리소스에서 배열로 정의됩니다.
리스너 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
listeners:
- name: plain
port: 9092
type: internal
tls: false
configuration:
useServiceDnsDomain: true
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external1
port: 9094
type: route
tls: true
configuration:
brokerCertChainAndKey:
secretName: my-secret
certificate: my-certificate.crt
key: my-key.key
# ...
이름과 포트가 고유하면 필요한 만큼 많은 리스너를 구성할 수 있습니다. 인증을 사용하여 보안 연결을 위해 리스너를 구성할 수도 있습니다.
각 연결 유형의 장단점에 대해 자세히 알아보려면 Strimzi에서 Apache Kafka 액세스를 참조하십시오.
외부 리스너를 사용하는 동안 Kafka 클러스터를 확장하는 경우 모든 Kafka 브로커의 롤링 업데이트가 트리거될 수 있습니다. 이는 구성에 따라 다릅니다.
14.3. 리스너 이름 지정 규칙 링크 복사링크가 클립보드에 복사되었습니다!
리스너 구성에서 결과 리스너 부트스트랩 및 per-broker 서비스 이름은 다음 명명 규칙에 따라 구성됩니다.
| 리스너 유형 | 부트스트랩 서비스 이름 | Broker 서비스 이름별 |
|---|---|---|
|
| <cluster_name>-kafka-bootstrap | 해당 없음 |
|
| <cluster_name>-kafka-<listener-name>-bootstrap | <cluster_name>-kafka-<listener-name>-<idx> |
예를 들어 my-cluster-kafka-bootstrap,my-cluster-kafka-external1-bootstrap, my-cluster-kafka-external1-0. 이름은 리스너 구성을 통해 생성된 서비스, 경로, 로드 밸런서 및 수신에 할당됩니다.
이전 버전과 호환되는 특정 이름 및 포트 번호를 사용하여 처음 사용 중단된 KafkaListeners 스키마에서 구성된 리스너를 전환할 수 있습니다. 결과 외부 리스너 이름 지정 규칙은 약간 다릅니다. 리스너 이름 및 포트 구성 값의 특정 조합은 이전 버전과 호환됩니다.
| 리스너 이름 | 포트 | 부트스트랩 서비스 이름 | Broker 서비스 이름별 |
|---|---|---|---|
|
|
| <cluster_name>-kafka-bootstrap | 해당 없음 |
|
|
| <cluster-name>-kafka-bootstrap | 해당 없음 |
|
|
| <cluster_name>-kafka-bootstrap | <cluster_name>-kafka-bootstrap-<idx> |
14.4. 리스너를 사용하여 Kafka 클러스터에 대한 클라이언트 액세스 설정 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터의 주소를 사용하여 동일한 OpenShift 클러스터의 클라이언트에 대한 액세스를 제공하거나 다른 OpenShift 네임스페이스 또는 외부 OpenShift의 클라이언트에 대한 외부 액세스를 제공할 수 있습니다. 다음 절차에서는 외부 OpenShift 또는 다른 OpenShift 클러스터에서 Kafka 클러스터에 대한 클라이언트 액세스를 구성하는 방법을 보여줍니다.
Kafka 리스너는 Kafka 클러스터에 대한 액세스를 제공합니다. 클라이언트 액세스는 다음 구성을 사용하여 보호됩니다.
-
외부 리스너는 TLS 암호화 및 mTLS 인증과 Kafka
간단한권한 부여가 활성화된 Kafka 클러스터에 대해 구성됩니다. -
mTLS 인증을 사용하여 클라이언트에 대해
KafkaUser가 생성되고간단한승인을 위해 정의된 ACL(액세스 제어 목록)이 생성됩니다.
상호 tls,scram-sha-512 또는 oauth 인증을 사용하도록 리스너를 구성할 수 있습니다. mTLS는 항상 암호화를 사용하지만 SCRAM-SHA-512 및 OAuth 2.0 인증을 사용하는 경우에도 암호화를 사용하는 것이 좋습니다.
Kafka 브로커에 대한 간단한,oauth,opa 또는 사용자 정의 권한을 구성할 수 있습니다. 활성화하면 활성화된 모든 리스너에 권한 부여가 적용됩니다.
KafkaUser 인증 및 권한 부여 메커니즘을 구성할 때 동등한 Kafka 구성과 일치하는지 확인합니다.
-
KafkaUser.spec.authentication은Kafka.spec.kafka.listeners[*].authentication과 일치합니다. -
KafkaUser.spec.authorization은Kafka.spec.kafka.authorization과 일치합니다.
KafkaUser 에 사용할 인증을 지원하는 리스너가 하나 이상 있어야 합니다.
Kafka 사용자와 Kafka 브로커 간의 인증은 각각에 대한 인증 설정에 따라 다릅니다. 예를 들어 Kafka 구성에서도 활성화되지 않은 경우 mTLS로 사용자를 인증할 수 없습니다.
Apache Kafka Operator의 스트림은 구성 프로세스를 자동화하고 인증에 필요한 인증서를 생성합니다.
- Cluster Operator는 리스너를 생성하고 Kafka 클러스터로 인증을 활성화하기 위해 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정합니다.
- User Operator는 선택한 인증 유형에 따라 클라이언트 및 클라이언트 인증에 사용되는 보안 인증 정보를 나타내는 사용자를 생성합니다.
클라이언트 구성에 인증서를 추가합니다.
이 절차에서는 Cluster Operator에서 생성한 CA 인증서를 사용하지만 자체 인증서를 설치하여 대체할 수 있습니다. 외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서를 사용하도록 리스너를 구성할 수도 있습니다.
인증서는 PEM(.crt) 및 PKCS #12(.p12) 형식으로 사용할 수 있습니다. 이 절차에서는 PEM 인증서를 사용합니다. X.509 형식의 인증서를 사용하는 클라이언트와 함께 PEM 인증서를 사용합니다.
동일한 OpenShift 클러스터 및 네임스페이스의 내부 클라이언트의 경우 Pod 사양에 클러스터 CA 인증서를 마운트할 수 있습니다. 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.
사전 요구 사항
- Kafka 클러스터는 OpenShift 클러스터 외부에서 실행 중인 클라이언트에서 연결할 수 있습니다.
- Cluster Operator 및 User Operator가 클러스터에서 실행 중입니다.
프로세스
Kafka 리스너를 사용하여 Kafka 클러스터를 구성합니다.
- 리스너를 통해 Kafka 브로커에 액세스하는 데 필요한 인증을 정의합니다.
Kafka 브로커에서 인증을 활성화합니다.
리스너 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... listeners:1 - name: external12 port: 90943 type: <listener_type>4 tls: true5 authentication: type: tls6 configuration:7 #... authorization:8 type: simple superUsers: - super-user-name9 # ...- 1
- 외부 리스너를 활성화하는 구성 옵션은 일반 Kafka 리스너 스키마 참조에 설명되어 있습니다.
- 2
- 리스너를 식별하는 이름입니다. Kafka 클러스터 내에서 고유해야 합니다.
- 3
- Kafka 내의 리스너에서 사용하는 포트 번호입니다. 포트 번호는 지정된 Kafka 클러스터 내에서 고유해야 합니다. 허용되는 포트 번호는 9092 이상이며, 이는 Prometheus 및 Cryostat에 이미 사용되는 포트 9404 및 9999를 제외하고 사용합니다. 리스너 유형에 따라 Kafka 클라이언트를 연결하는 포트 번호와 포트 번호가 동일하지 않을 수 있습니다.
- 4
경로(OpenShift만),로드 밸런서,nodeport또는ingress(Kubernetes만 해당)로 지정된 외부 리스너 유형입니다. 내부 리스너는internal또는cluster-ip로 지정됩니다.- 5
- 필수 항목입니다. 리스너의 TLS 암호화입니다.
경로및수신유형 리스너의 경우true로 설정해야 합니다. mTLS 인증의 경우인증속성도 사용합니다. - 6
- 리스너의 클라이언트 인증 메커니즘. mTLS를 사용한 서버 및 클라이언트 인증의 경우
tls: true및authentication.type: tls를 지정합니다. - 7
- (선택 사항) 리스너 유형의 요구 사항에 따라 추가 리스너 구성 을 지정할 수 있습니다.
- 8
AclAuthorizer및StandardAuthorizerKafka 플러그인을 사용하는간단한인증으로 지정됩니다.- 9
- (선택 사항) 슈퍼 사용자는 ACL에 정의된 액세스 제한에 관계없이 모든 브로커에 액세스할 수 있습니다.
주의OpenShift 경로 주소는 Kafka 클러스터 이름, 리스너 이름, 프로젝트 이름, 라우터 도메인으로 구성됩니다. 예를 들어
my-cluster-kafka-external1-bootstrap-my-project.domain.com(<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>). 각 DNS 레이블(".")은 63자를 초과해서는 안 되며 주소의 총 길이는 255자를 초과해서는 안 됩니다.
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 브로커의 롤링 업데이트가 트리거될 수 있습니다. 이는 구성에 따라 다릅니다.
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 클러스터에 연결합니다.
Kafka 클러스터에 액세스해야 하는 클라이언트를 나타내는 사용자를 생성하거나 수정합니다.
-
Kafka리스너와 동일한 인증 유형을 지정합니다. 간단한승인을 위해 권한 부여 ACL을 지정합니다.사용자 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster1 spec: authentication: type: tls2 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
-
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 storeKafka 클러스터의 <
cluster_name> -cluster-ca-cert시크릿에서 클러스터 CA 인증서를 추출합니다.oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt<user
_name> 보안에서 사용자 CA 인증서를추출합니다.oc get secret <user_name> -o jsonpath='{.data.user\.crt}' | base64 -d > user.crt<user
_name> 시크릿에서 사용자의 개인 키를추출합니다.oc get secret <user_name> -o jsonpath='{.data.user\.key}' | base64 -d > user.keyKafka 클러스터에 연결하기 위한 부트스트랩 주소 호스트 이름 및 포트로 클라이언트를 구성합니다.
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "<hostname>:<port>");Kafka 클러스터의 ID를 확인하도록 truststore 자격 증명으로 클라이언트를 구성합니다.
공용 클러스터 CA 인증서를 지정합니다.
truststore 구성의 예
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_TRUSTSTORE_CERTIFICATES_CONFIG, "<ca.crt_file_content>");SSL은 mTLS 인증을 위해 지정된 보안 프로토콜입니다. TLS를 통한 SCRAM-SHA-512 인증에 대해
SASL_SSL을 지정합니다. PEM은 truststore의 파일 형식입니다.Kafka 클러스터에 연결할 때 사용자를 확인하도록 키 저장소 인증 정보로 클라이언트를 구성합니다.
공개 인증서 및 개인 키를 지정합니다.
키 저장소 구성 예
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "<user.crt_file_content>"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "<user.key_file_content>");키 저장소 인증서와 개인 키를 구성에 직접 추가합니다. 를 한 줄 형식으로 추가합니다.
BEGIN CERTIFICATE및END CERTIFICATE구분 기호 간에 줄 바꿈 문자(\n)로 시작합니다. 원래 인증서의 각 행을\n으로 종료합니다.키 저장소 구성 예
props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "-----BEGIN CERTIFICATE----- \n<user_certificate_content_line_1>\n<user_certificate_content_line_n>\n-----END CERTIFICATE---"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "----BEGIN PRIVATE KEY-----\n<user_key_content_line_1>\n<user_key_content_line_n>\n-----END PRIVATE KEY-----");
14.5. 노드 포트를 사용하여 Kafka에 액세스 링크 복사링크가 클립보드에 복사되었습니다!
노드 포트를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 Apache Kafka 클러스터의 Streams에 액세스합니다.
브로커에 연결하려면 Kafka 부트스트랩 주소에 대한 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.
이 절차에서는 기본 nodeport 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성 을 추가합니다. 예를 들어 nodeport 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.
preferredNodePortAddressType- 노드 주소로 확인되는 첫 번째 주소 유형을 지정합니다.
externalTrafficPolicy- 서비스가 외부 트래픽을 node-local 또는 클러스터 전체 엔드포인트로 라우팅하는지 여부를 지정합니다.
nodePort- 부트 스트랩 및 브로커 서비스에 할당된 노드 포트 번호를 덮어씁니다.
리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.
사전 요구 사항
- 실행중인 Cluster Operator
이 절차에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너 이름은 external4 입니다.
프로세스
nodeport유형으로 설정된 외부 리스너를 사용하여Kafka리소스를 구성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external4 port: 9094 type: nodeport tls: true authentication: type: tls # ... # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>kafka 브로커의 ID를 확인하기 위한 클러스터 CA 인증서가 시크릿
my-cluster-cluster-ca-cert에 생성됩니다.NodePort유형 서비스는 각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해 생성됩니다.부트스트랩 및 브로커용으로 생성된 노드 포트 서비스
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external4-0 NodePort 172.30.55.13 9094:31789/TCP my-cluster-kafka-external4-1 NodePort 172.30.250.248 9094:30028/TCP my-cluster-kafka-external4-2 NodePort 172.30.115.81 9094:32650/TCP my-cluster-kafka-external4-bootstrap NodePort 172.30.30.23 9094:32650/TCP클라이언트 연결에 사용되는 부트스트랩 주소는
Kafka리소스의상태로전파됩니다.부트스트랩 주소의 상태 예
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready kafkaVersion: 3.7.0 listeners: # ... - addresses: - host: ip-10-0-224-199.us-west-2.compute.internal port: 32650 bootstrapServers: 'ip-10-0-224-199.us-west-2.compute.internal:32650' certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external4 observedGeneration: 2 operatorLastSuccessfulVersion: 2.7 # ...Kafka리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external4")].bootstrapServers}{"\n"}' ip-10-0-224-199.us-west-2.compute.internal:32650클러스터 CA 인증서를 추출합니다.
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt브로커에 연결하도록 클라이언트를 구성합니다.
-
Kafka 클라이언트에 연결할 부트스트랩 주소로 부트스트랩 호스트 및 포트를 지정합니다. 예를 들어
ip-10-0-224-199.us-west-2.compute.internal:32650입니다. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.
클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.
-
Kafka 클라이언트에 연결할 부트스트랩 주소로 부트스트랩 호스트 및 포트를 지정합니다. 예를 들어
자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소 구성에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 추가할 필요가 없습니다.
14.6. 로드 밸런서를 사용하여 Kafka에 액세스 링크 복사링크가 클립보드에 복사되었습니다!
로드 밸런서를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 Apache Kafka 클러스터의 Streams에 액세스합니다.
브로커에 연결하려면 Kafka 부트스트랩 주소에 대한 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.
절차에서는 기본 로드 밸런서 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성 을 추가합니다. 예를 들어 로드 밸런서 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.
loadBalancerSourceRanges- 트래픽을 지정된 CIDR(Classless Inter-Domain Routing) 범위로 제한합니다.
externalTrafficPolicy- 서비스가 외부 트래픽을 node-local 또는 클러스터 전체 엔드포인트로 라우팅하는지 여부를 지정합니다.
loadBalancerIP- 로드 밸런서를 생성할 때 특정 IP 주소를 요청합니다.
리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.
사전 요구 사항
- 실행중인 Cluster Operator
이 절차에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너 이름은 external3 입니다.
프로세스
로드 밸런서 유형으로 설정된 외부 리스너를 사용하여구성합니다.Kafka리소스를예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: tls # ... # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>kafka 브로커의 ID를 확인하는 클러스터 CA 인증서도 시크릿
my-cluster-cluster-ca-cert에 생성됩니다.LoadBalancer유형 서비스 및 로드 밸런서는 각 Kafka 브로커와 외부 부트스트랩 서비스에 대해 생성됩니다.부트스트랩 및 브로커용으로 생성된 LoadBalancer 서비스 및 로드 밸런서
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external3-0 LoadBalancer 172.30.204.234 9094:30011/TCP my-cluster-kafka-external3-1 LoadBalancer 172.30.164.89 9094:32544/TCP my-cluster-kafka-external3-2 LoadBalancer 172.30.73.151 9094:32504/TCP my-cluster-kafka-external3-bootstrap LoadBalancer 172.30.30.228 9094:30371/TCP NAME EXTERNAL-IP (loadbalancer) my-cluster-kafka-external3-0 a8a519e464b924000b6c0f0a05e19f0d-1132975133.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-1 ab6adc22b556343afb0db5ea05d07347-611832211.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-2 a9173e8ccb1914778aeb17eca98713c0-777597560.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-bootstrap a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com클라이언트 연결에 사용되는 부트스트랩 주소는
Kafka리소스의상태로전파됩니다.부트스트랩 주소의 상태 예
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready kafkaVersion: 3.7.0 listeners: # ... - addresses: - host: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com port: 9094 bootstrapServers: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094 certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external3 observedGeneration: 2 operatorLastSuccessfulVersion: 2.7 # ...클라이언트 연결에 사용되는 DNS 주소는 각 로드 밸런서 서비스의
상태로전파됩니다.부트스트랩 로드 밸런서의 상태 예
status: loadBalancer: ingress: - hostname: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com # ...Kafka리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external3")].bootstrapServers}{"\n"}' a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094클러스터 CA 인증서를 추출합니다.
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt브로커에 연결하도록 클라이언트를 구성합니다.
-
Kafka 클라이언트에 연결할 부트스트랩 주소로 부트스트랩 호스트 및 포트를 지정합니다. 예를 들어
a8d4a6fb363bfb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.
클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.
-
Kafka 클라이언트에 연결할 부트스트랩 주소로 부트스트랩 호스트 및 포트를 지정합니다. 예를 들어
자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소 구성에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 추가할 필요가 없습니다.
14.7. OpenShift 경로를 사용하여 Kafka에 액세스 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 경로를 사용하여 OpenShift 클러스터 외부의 클라이언트에서 Apache Kafka 클러스터의 Streams에 액세스합니다.
경로를 사용할 수 있으려면 Kafka 사용자 정의 리소스에서 경로 유형 리스너에 대한 구성을 추가합니다. 이 구성을 적용하면 구성에서 외부 부트스트랩 및 클러스터의 각 브로커에 대한 전용 경로 및 서비스를 생성합니다. 클라이언트는 부트스트랩 경로에 연결하여 브로커에 연결할 부트스트랩 서비스를 통해 라우팅합니다. 그런 다음 브로커별 경로 및 서비스를 통해 클라이언트의 트래픽을 브로커로 라우팅하는 DNS 이름을 사용하여broker 연결이 설정됩니다.
브로커에 연결하려면 경로 부트스트랩 주소의 호스트 이름과 TLS 암호화에 사용되는 인증서를 지정합니다. 경로를 사용한 액세스의 경우 포트는 항상 443입니다.
OpenShift 경로 주소는 Kafka 클러스터 이름, 리스너 이름, 프로젝트 이름, 라우터 도메인으로 구성됩니다. 예를 들어 my-cluster-kafka-external1-bootstrap-my-project.domain.com (<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>). 각 DNS 레이블(".")은 63자를 초과해서는 안 되며 주소의 총 길이는 255자를 초과해서는 안 됩니다.
절차에서는 기본 리스너 구성을 보여줍니다. TLS 암호화(tls)를 활성화해야 합니다. 클라이언트 인증 메커니즘(인증)을 지정할 수도 있습니다. 구성 속성을 사용하여 추가 구성 을 추가합니다. 예를 들어 host 구성 속성을 경로 리스너와 함께 사용하여 부트스트랩 및broker 서비스에서 사용하는 호스트 이름을 지정할 수 있습니다.
리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.
TLS 패스스루
TLS 패스스루는 Apache Kafka용 Streams에서 생성한 경로에 대해 활성화됩니다. Kafka는 TCP를 통해 바이너리 프로토콜을 사용하지만 경로는 HTTP 프로토콜을 사용하도록 설계되었습니다. 경로를 통해 TCP 트래픽을 라우팅할 수 있도록 Apache Kafka의 Streams는 TLS 통과를 SNI(Server Name Indication)와 함께 사용합니다.
SNI는 Kafka 브로커에 연결을 식별하고 전달하는 데 도움이 됩니다. passthrough 모드에서는 TLS 암호화가 항상 사용됩니다. 연결은 브로커에 전달되므로 리스너는 수신 인증서가 아닌 내부 클러스터 CA에서 서명한 TLS 인증서를 사용합니다. 자체 리스너 인증서를 사용하도록 리스너를 구성하려면 brokerCert CryostatAndKey 속성을 사용합니다.
사전 요구 사항
- 실행중인 Cluster Operator
이 절차에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너 이름은 external1 입니다.
프로세스
경로유형으로 설정된 외부 리스너를 사용하여Kafka리소스를 구성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external1 port: 9094 type: route tls: true1 authentication: type: tls # ... # ... zookeeper: # ...- 1
경로유형 리스너의 경우 TLS 암호화를 활성화해야 합니다(true).
리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>kafka 브로커의 ID를 확인하기 위한 클러스터 CA 인증서가 시크릿
my-cluster-cluster-ca-cert에 생성됩니다.ClusterIP유형 서비스는 각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해 생성됩니다.기본 OpenShift HAProxy 라우터를 사용하여 노출하는 DNS 주소(호스트/포트)를 사용하여 각 서비스에 대해
경로도 생성됩니다.경로는 TLS 패스스루로 사전 구성됩니다.
부트스트랩 및 브로커용으로 생성된 경로
NAME HOST/PORT SERVICES PORT TERMINATION my-cluster-kafka-external1-0 my-cluster-kafka-external1-0-my-project.router.com my-cluster-kafka-external1-0 9094 passthrough my-cluster-kafka-external1-1 my-cluster-kafka-external1-1-my-project.router.com my-cluster-kafka-external1-1 9094 passthrough my-cluster-kafka-external1-2 my-cluster-kafka-external1-2-my-project.router.com my-cluster-kafka-external1-2 9094 passthrough my-cluster-kafka-external1-bootstrap my-cluster-kafka-external1-bootstrap-my-project.router.com my-cluster-kafka-external1-bootstrap 9094 passthrough클라이언트 연결에 사용되는 DNS 주소는 각 경로의
상태로전파됩니다.부트스트랩 경로의 상태 예
status: ingress: - host: >- my-cluster-kafka-external1-bootstrap-my-project.router.com # ...대상 브로커를 사용하여 OpenSSL
s_client를 사용하여 포트 443에서 클라이언트-서버 TLS 연결을 확인합니다.openssl s_client -connect my-cluster-kafka-external1-0-my-project.router.com:443 -servername my-cluster-kafka-external1-0-my-project.router.com -showcerts서버 이름은 브로커에 연결을 전달하는 SNI(Server Name Indication)입니다.
연결에 성공하면 브로커의 인증서가 반환됩니다.
브로커의 인증서
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0Kafka리소스의 상태에서 부트스트랩 서비스의 주소를 검색합니다.oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external1")].bootstrapServers}{"\n"}' my-cluster-kafka-external1-bootstrap-my-project.router.com:443주소는 Kafka 클러스터 이름, 리스너 이름, 프로젝트 이름 및 라우터 도메인(이 예에서는
router.com)으로 구성됩니다.클러스터 CA 인증서를 추출합니다.
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt브로커에 연결하도록 클라이언트를 구성합니다.
- Kafka 클라이언트에 있는 부트스트랩 서비스 및 포트 443을 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다.
추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.
클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.
자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소 구성에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 추가할 필요가 없습니다.
14.8. 서비스에 대한 연결 세부 정보 반환 링크 복사링크가 클립보드에 복사되었습니다!
서비스 검색을 사용하면 Apache Kafka의 Streams와 동일한 OpenShift 클러스터에서 실행되는 클라이언트 애플리케이션이 Kafka 클러스터와 상호 작용할 수 있습니다.
Kafka 클러스터에 액세스하는 데 사용되는 서비스에 대해 서비스 검색 레이블 및 주석이 생성됩니다.
- 내부 Kafka 부트스트랩 서비스
- Kafka 브리지 서비스
레이블은 서비스를 검색할 수 있도록 하는 데 도움이 되고, 주석은 클라이언트 애플리케이션이 연결을 설정하는 데 필요한 연결 세부 정보를 제공합니다.
서비스 검색 레이블인 strimzi.io/discovery 는 Service 리소스에 대해 true 로 설정됩니다. 서비스 검색 주석에는 동일한 키가 있어 각 서비스에 대한 연결 세부 정보를 JSON 형식으로 제공합니다.
내부 Kafka 부트스트랩 서비스의 예
apiVersion: v1
kind: Service
metadata:
annotations:
strimzi.io/discovery: |-
[ {
"port" : 9092,
"tls" : false,
"protocol" : "kafka",
"auth" : "scram-sha-512"
}, {
"port" : 9093,
"tls" : true,
"protocol" : "kafka",
"auth" : "tls"
} ]
labels:
strimzi.io/cluster: my-cluster
strimzi.io/discovery: "true"
strimzi.io/kind: Kafka
strimzi.io/name: my-cluster-kafka-bootstrap
name: my-cluster-kafka-bootstrap
spec:
#...
Kafka 브리지 서비스 예
apiVersion: v1
kind: Service
metadata:
annotations:
strimzi.io/discovery: |-
[ {
"port" : 8080,
"tls" : false,
"auth" : "none",
"protocol" : "http"
} ]
labels:
strimzi.io/cluster: my-bridge
strimzi.io/discovery: "true"
strimzi.io/kind: KafkaBridge
strimzi.io/name: my-bridge-bridge-service
명령줄 또는 해당 API 호출에서 서비스를 가져올 때 검색 레이블을 지정하여 서비스를 찾습니다.
검색 레이블을 사용하여 서비스 반환
oc get service -l strimzi.io/discovery=true
연결 세부 정보는 서비스 검색 레이블을 검색할 때 반환됩니다.
15장. Kafka에 대한 액세스 보안 링크 복사링크가 클립보드에 복사되었습니다!
클라이언트가 Kafka 브로커에 대한 액세스를 관리하여 Kafka 클러스터를 보호합니다. Kafka 브로커와 클라이언트 간의 보안 연결은 다음을 포함할 수 있습니다.
- 데이터 교환을 위한 암호화
- ID를 증명하기 위한 인증
- 사용자가 실행하는 작업을 허용하거나 거부할 수 있는 권한 부여
Apache Kafka의 Streams에서 연결을 보호하려면 리스너 및 사용자 계정을 구성해야 합니다.
- 리스너 구성
Kafka리소스를 사용하여 Kafka 브로커에 대한 클라이언트 연결에 대한 리스너를 구성합니다. 리스너는 mTLS, SCRAM-SHA-512, OAuth 2.0 또는 사용자 지정 인증 방법과 같이 클라이언트가 인증하는 방법을 정의합니다. 보안을 강화하려면 Kafka 브로커와 클라이언트 간의 통신을 보호하도록 TLS 암호화를 구성합니다. Kafka 브로커 구성에서 지원되는 TLS 버전 및 암호화 제품군을 지정하여 TLS 기반 통신을 추가로 보호할 수 있습니다.추가된 보호 계층의 경우
Kafka리소스를 사용하여 간단한 OAuth 2.0, OPA 또는 사용자 정의 권한과 같은 Kafka 클러스터에 대한 권한 부여 방법을 지정합니다.- 사용자 계정
Apache Kafka의 Streams에서
KafkaUser리소스를 사용하여 사용자 계정 및 인증 정보를 설정합니다. 사용자는 클라이언트를 나타내며 Kafka 클러스터를 인증하고 권한을 부여하는 방법을 결정합니다. 사용자 구성에 지정된 인증 및 권한 부여 메커니즘은 Kafka 구성과 일치해야 합니다. 또한 ACL(액세스 제어 목록)을 정의하여 보다 세분화된 권한 부여를 위해 특정 주제 및 작업에 대한 사용자 액세스를 제어합니다. 보안을 강화하기 위해 바이트 속도 또는 CPU 사용률을 기반으로 Kafka 브로커에 대한 클라이언트 액세스를 제한하려면 사용자 할당량을 지정합니다.사용하는 TLS 버전 및 암호화 제품군을 제한하려면 클라이언트에 생산자 또는 소비자 구성을 추가할 수도 있습니다. 클라이언트의 구성은 브로커에서 활성화된 프로토콜 및 암호화 제품군만 사용해야 합니다.
OAuth 2.0을 사용하여 클라이언트 액세스를 관리하는 경우 사용자 인증 및 권한 부여 인증 정보는 권한 부여 서버를 통해 관리됩니다.
Apache Kafka Operator의 스트림은 구성 프로세스를 자동화하고 인증에 필요한 인증서를 생성합니다. Cluster Operator는 클러스터 내에서 데이터 암호화 및 인증을 위한 TLS 인증서를 자동으로 설정합니다.
15.1. Kafka의 보안 옵션 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 리소스를 사용하여 Kafka 인증 및 권한 부여에 사용되는 메커니즘을 구성합니다.
15.1.1. 리스너 인증 링크 복사링크가 클립보드에 복사되었습니다!
리스너를 생성할 때 Kafka 브로커에 대한 클라이언트 인증을 구성합니다. Kafka 리소스의 Kafka.spec.kafka.listeners.authentication 속성을 사용하여 리스너 인증 유형을 지정합니다.
OpenShift 클러스터 내부의 클라이언트의 경우 일반 (암호 없이) 또는 tls 내부 리스너를 생성할 수 있습니다. 내부 리스너 유형은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. 헤드리스 서비스 대신broker ClusterIP 서비스를 사용하여 Kafka를 노출하는 내부 리스너의 cluster-ip 유형을 생성할 수도 있습니다. OpenShift 클러스터 외부의 클라이언트의 경우 외부 리스너를 생성하고 노드 포트,로드 밸런서,인그레스 (Kubernetes만 해당) 또는 경로 (OpenShift만 해당)일 수 있는 연결 메커니즘을 지정합니다.
외부 클라이언트 연결을 위한 구성 옵션에 대한 자세한 내용은 14장. Kafka 클러스터에 대한 클라이언트 액세스 설정 을 참조하십시오.
지원되는 인증 옵션:
- mTLS 인증(TLS가 활성화된 리스너에서만)
- SCRAM-SHA-512 인증
- OAuth 2.0 토큰 기반 인증
- 사용자 정의 인증
- TLS 버전 및 암호화 제품군
선택한 인증 옵션은 Kafka 브로커에 대한 클라이언트 액세스를 인증하는 방법에 따라 다릅니다.
사용자 지정 인증을 사용하기 전에 표준 인증 옵션을 살펴봅니다. 사용자 정의 인증을 사용하면 Kafka에서 지원하는 모든 유형의 인증을 사용할 수 있습니다. 더 많은 유연성을 제공할 수 있지만 복잡성도 추가할 수 있습니다.
그림 15.1. Kafka 리스너 인증 옵션
리스너 인증 속성은 해당 리스너와 관련된 인증 메커니즘을 지정하는 데 사용됩니다.
인증 속성을 지정하지 않으면 리스너에서 해당 리스너를 통해 연결하는 클라이언트를 인증하지 않습니다. 리스너는 인증 없이 모든 연결을 허용합니다.
User Operator를 사용하여 KafkaUsers 를 관리할 때 인증을 구성해야 합니다.
다음 예제에서는 다음을 보여줍니다.
-
SCRAM-SHA-512 인증을 위해 구성된
일반리스너 -
mTLS 인증을 사용하는
tls리스너 -
mTLS 인증을 사용하는
외부리스너
각 리스너는 Kafka 클러스터 내에서 고유한 이름과 포트로 구성됩니다.
브로커에 대한 클라이언트 액세스를 위해 리스너를 구성할 때 포트 9092 이상(9093, 9094 등)을 사용할 수 있지만 몇 가지 예외가 있습니다. 리스너는 인터브로커 통신(9090 및 9091), Prometheus 지표(9404) 및 Cryostat(Java Management Extensions) 모니터링(9999)을 위해 예약된 포트를 사용하도록 구성할 수 없습니다.
리스너 인증 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
listeners:
- name: plain
port: 9092
type: internal
tls: true
authentication:
type: scram-sha-512
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external3
port: 9094
type: loadbalancer
tls: true
authentication:
type: tls
# ...
15.1.1.1. mTLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
mTLS 인증은 항상 Kafka 브로커와 Zoo Cryostat Pod 간의 통신에 사용됩니다.
Apache Kafka의 스트림은 TLS(Transport Layer Security)를 사용하도록 Kafka를 구성하여 상호 인증이 있거나 없는 Kafka 브로커와 클라이언트 간에 암호화된 통신을 제공할 수 있습니다. 상호 또는 양방향 인증의 경우 서버와 클라이언트 모두 인증서를 제공합니다. mTLS 인증을 구성하면 브로커는 클라이언트(클라이언트 인증)를 인증하고 클라이언트는 브로커(서버 인증)를 인증합니다.
Kafka 리소스의 mTLS 리스너 구성은 다음과 같습니다.
-
TLS 암호화 및 서버 인증을 지정하는 TLS
: true -
authentication.type: tls를 사용하여 클라이언트 인증을 지정합니다.
Cluster Operator가 Kafka 클러스터를 생성할 때 <cluster _name>-cluster-ca-cert라는 이름으로 새 시크릿을 생성합니다. 보안에는 CA 인증서가 포함되어 있습니다. CA 인증서는 PEM 및 PKCS #12 형식입니다. Kafka 클러스터를 확인하려면 클라이언트 구성의 신뢰 저장소에 CA 인증서를 추가합니다. 클라이언트를 확인하려면 사용자 인증서와 키를 클라이언트 구성의 키 저장소에 추가합니다. mTLS용 클라이언트 구성에 대한 자세한 내용은 15.2.2절. “사용자 인증” 을 참조하십시오.
TLS 인증은 한 당사자가 다른 사람의 ID를 인증하는 더 일반적으로 단방향입니다. 예를 들어 웹 브라우저와 웹 서버 간에 HTTPS를 사용하면 브라우저가 웹 서버의 ID 증명을 가져옵니다.
15.1.1.2. SCRAM-SHA-512 인증 링크 복사링크가 클립보드에 복사되었습니다!
SCRAM(Salted Challenge Response Authentication Mechanism)은 암호를 사용하여 상호 인증을 설정할 수 있는 인증 프로토콜입니다. Apache Kafka의 스트림은 암호화되지 않은 클라이언트 연결 및 암호화된 클라이언트 연결에 대한 인증을 제공하기 위해 SCRAM-SHA-512를 사용하도록 Kafka를 구성할 수 있습니다.
SCRAM-SHA-512 인증을 TLS 연결과 함께 사용하는 경우 TLS 프로토콜은 암호화를 제공하지만 인증에는 사용되지 않습니다.
SCRAM의 다음 속성은 암호화되지 않은 연결에서도 SCRAM-SHA-512를 안전하게 사용할 수 있도록 합니다.
- 암호는 통신 채널을 통해 명확하게 전송되지 않습니다. 대신 클라이언트와 서버는 인증 사용자의 암호를 알고 있음을 증명하기 위해 서로 챌린지가 됩니다.
- 서버와 클라이언트는 각각 인증 교환에 대해 새로운 문제를 생성합니다. 즉, 교환은 재생 공격에 대해 탄력적입니다.
KafkaUser.spec.authentication.type 이 scram-sha-512 로 구성된 경우 User Operator는 대문자 및 소문자 ASCII 문자 및 숫자로 구성된 임의의 12자 암호를 생성합니다.
15.1.1.3. 네트워크 정책 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 Streams for Apache Kafka는 Kafka 브로커에서 활성화된 모든 리스너에 대한 NetworkPolicy 리소스를 자동으로 생성합니다. 이 NetworkPolicy 를 사용하면 애플리케이션이 모든 네임스페이스의 리스너에 연결할 수 있습니다. 네트워크 정책을 리스너 구성의 일부로 사용합니다.
네트워크 수준에서 리스너에 대한 액세스를 선택한 애플리케이션 또는 네임스페이스로 제한하려면 networkPolicyPeers 속성을 사용합니다. 각 리스너에는 다른 networkPolicyPeers 구성이 있을 수 있습니다. 네트워크 정책 피어에 대한 자세한 내용은 NetworkPolicyPeer API 참조를 참조하십시오.
사용자 정의 네트워크 정책을 사용하려면 Cluster Operator 구성에서 STRIMZI_NETWORK_POLICY_GENERATION 환경 변수를 false 로 설정할 수 있습니다. 자세한 내용은 9.5절. “Cluster Operator 구성”의 내용을 참조하십시오.
OpenShift 구성은 Apache Kafka용 Streams에서 네트워크 정책을 사용하려면 ingress NetworkPolicies 를 지원해야 합니다.
15.1.1.4. 리스너 인증서 제공 링크 복사링크가 클립보드에 복사되었습니다!
TLS 암호화가 활성화된 TLS 리스너 또는 외부 리스너에 대해 Kafka 리스너 인증서 라는 자체 서버 인증서를 제공할 수 있습니다. 자세한 내용은 15.3.4절. “TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공”의 내용을 참조하십시오.
15.1.2. Kafka 권한 부여 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 리소스에서 Kafka.spec.kafka.authorization 속성을 사용하여 Kafka 브로커에 대한 인증을 구성합니다. 권한 부여 속성이 없으면 권한 부여가 활성화되지 않으며 클라이언트에 제한이 없습니다. 활성화하면 활성화된 모든 리스너에 권한 부여가 적용됩니다. 권한 부여 방법은 type 필드에 정의됩니다.
지원되는 권한 부여 옵션:
- 간단한 권한 부여
- OAuth 2.0 인증 ( OAuth 2.0 토큰 기반 인증을 사용하는 경우)
- OCI(Open Policy Agent) 권한 부여
- 사용자 정의 권한 부여
그림 15.2. Kafka 클러스터 권한 부여 옵션
15.1.2.1. 슈퍼유저 링크 복사링크가 클립보드에 복사되었습니다!
슈퍼 사용자는 액세스 제한에 관계없이 Kafka 클러스터의 모든 리소스에 액세스할 수 있으며 모든 권한 부여 메커니즘에서 지원됩니다.
Kafka 클러스터의 슈퍼 사용자를 지정하려면 사용자 주체 목록을 SuperUsers 속성에 추가합니다. 사용자가 mTLS 인증을 사용하는 경우 사용자 이름은 CN= 접두사가 붙은 TLS 인증서 제목의 일반 이름입니다. User Operator를 사용하지 않고 mTLS에 자체 인증서를 사용하지 않는 경우 사용자 이름은 전체 인증서 제목입니다. 전체 인증서 주체는 CN=user,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=my_country_code. 존재하지 않는 필드를 생략합니다.
슈퍼 유저를 사용하는 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
authorization:
type: simple
superUsers:
- CN=client_1
- user_2
- CN=client_3
- CN=client_4,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=US
- CN=client_5,OU=my_ou,O=my_org,C=GB
- CN=client_6,O=my_org
# ...
15.2. Kafka 클라이언트의 보안 옵션 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스를 사용하여 Kafka 클라이언트에 대한 인증 메커니즘, 권한 부여 메커니즘 및 액세스 권한을 구성합니다. 보안 구성 측면에서 클라이언트는 사용자로 표시됩니다.
Kafka 브로커에 대한 사용자 액세스 권한을 인증하고 인증할 수 있습니다. 인증을 사용하면 액세스를 허용하고 권한 부여가 허용되는 작업에 대한 액세스를 제한합니다.
Kafka 브로커에 대한 무제한 액세스 권한이 있는 슈퍼 사용자를 생성할 수도 있습니다.
인증 및 권한 부여 메커니즘은 Kafka 브로커에 액세스하는 데 사용되는 리스너의 사양 과 일치해야 합니다.
Kafka 브로커에 안전하게 액세스하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 14.4절. “리스너를 사용하여 Kafka 클러스터에 대한 클라이언트 액세스 설정” 을 참조하십시오.
15.2.1. 사용자 처리를 위한 Kafka 클러스터 식별 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스에는 해당 리소스가 속한 Kafka 리소스의 이름에서 파생되는 Kafka 클러스터의 적절한 이름을 정의하는 레이블이 포함됩니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
이 레이블은 User Operator에서 KafkaUser 리소스를 식별하고 새 사용자를 생성하고 후속 처리를 수행하는 데 사용됩니다.
레이블이 Kafka 클러스터와 일치하지 않으면 User Operator에서 KafkaUser 를 식별할 수 없으며 사용자가 생성되지 않습니다.
KafkaUser 리소스의 상태가 비어 있으면 레이블을 확인합니다.
15.2.2. 사용자 인증 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 사용자 지정 리소스를 사용하여 Kafka 클러스터에 액세스해야 하는 사용자(클라이언트)에 대한 인증 자격 증명을 구성합니다. KafkaUser.spec 의 인증 속성을 사용하여 인증 정보를 구성합니다. 유형을 지정하면 생성되는 인증 정보를 제어할 수 있습니다.
지원되는 인증 유형:
-
mTLS 인증용 TLS
-
외부 인증서를 사용한 mTLS 인증에 대한 TLS-external -
SCRAM-SHA-512 인증을 위한 SCRAM-sha-512
tls 또는 scram-sha-512 가 지정된 경우 User Operator는 사용자를 생성할 때 인증 인증 정보를 생성합니다. tls-external 가 지정된 경우에도 사용자는 mTLS를 계속 사용하지만 인증 인증 정보는 생성되지 않습니다. 자체 인증서를 제공할 때 이 옵션을 사용합니다. 인증 유형을 지정하지 않으면 User Operator에서 사용자 또는 인증 정보를 생성하지 않습니다.
tls-external 를 사용하여 User Operator 외부에서 발행된 인증서를 사용하여 mTLS로 인증할 수 있습니다. User Operator는 TLS 인증서 또는 보안을 생성하지 않습니다. tls 메커니즘을 사용하는 경우와 동일한 방식으로 User Operator를 통해 ACL 규칙 및 할당량을 계속 관리할 수 있습니다. 즉, ACL 규칙 및 할당량을 지정할 때 CN=USER-NAME 형식을 사용합니다. USER-NAME 은 TLS 인증서에 지정된 일반적인 이름입니다.
15.2.2.1. mTLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
mTLS 인증을 사용하려면 KafkaUser 리소스의 type 필드를 tls 로 설정합니다.
mTLS 인증이 활성화된 사용자 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls
# ...
인증 유형은 Kafka 클러스터에 액세스하는 데 사용되는 Kafka 리스너의 동등한 구성과 일치해야 합니다.
User Operator에 의해 사용자를 생성하면 KafkaUser 리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 mTLS의 개인 및 공개 키가 포함됩니다. 공개 키는 사용자 인증서에 포함되어 있으며 클라이언트 CA(인증 기관)가 이를 생성할 때 서명합니다. 모든 키는 X.509 형식으로 되어 있습니다.
Cluster Operator에서 생성한 클라이언트 CA를 사용하는 경우 Cluster Operator에 의해 클라이언트 CA를 갱신할 때 User Operator에서 생성한 사용자 인증서도 갱신됩니다.
사용자 시크릿 은 PEM 및 PKCS #12 형식의 키와 인증서를 제공합니다.
사용자 인증 정보가 있는 시크릿 예
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
ca.crt: <public_key> # Public key of the clients CA
user.crt: <user_certificate> # Public key of the user
user.key: <user_private_key> # Private key of the user
user.p12: <store> # PKCS #12 store for user certificates and keys
user.password: <password_for_store> # Protects the PKCS #12 store
클라이언트를 구성할 때 다음을 지정합니다.
- Kafka 클러스터의 ID를 확인하기 위한 공용 클러스터 CA 인증서의 truststore 속성
- 클라이언트를 확인하기 위한 사용자 인증 자격 증명의 키 저장소 속성
구성은 파일 형식(PEM 또는 PKCS #12)에 따라 다릅니다. 이 예에서는 PKCS #12 저장소와 저장소의 자격 증명에 액세스하는 데 필요한 암호를 사용합니다.
PKCS #12 형식의 mTLS를 사용하는 클라이언트 구성 예
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093
security.protocol=SSL
ssl.truststore.location=/tmp/ca.p12
ssl.truststore.password=<truststore_password>
ssl.keystore.location=/tmp/user.p12
ssl.keystore.password=<keystore_password>
- 1
- Kafka 클러스터에 연결할 부트스트랩 서버 주소입니다.
- 2
- 암호화에 TLS를 사용할 때 보안 프로토콜 옵션입니다.
- 3
- truststore 위치에는 Kafka 클러스터의 공개 키 인증서(
ca.p12)가 포함되어 있습니다. 클러스터 CA 인증서 및 암호는 Kafka 클러스터가 생성될 때 <cluster_name>-cluster-ca-cert시크릿의 Cluster Operator에 의해 생성됩니다. - 4
- 신뢰 저장소에 액세스하기 위한 암호(
ca.password)입니다. - 5
- 키 저장소 위치에는 Kafka 사용자의 공개 키 인증서(
user.p12)가 포함되어 있습니다. - 6
- 키 저장소에 액세스하기 위한 암호(
user.password)입니다.
15.2.2.2. User Operator 외부에서 발급된 인증서를 사용한 mTLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
User Operator 외부에서 발행된 인증서를 사용하여 mTLS 인증을 사용하려면 KafkaUser 리소스의 type 필드를 tls-external 로 설정합니다. 사용자에 대한 시크릿 및 인증 정보는 생성되지 않습니다.
User Operator 외부에서 발행된 인증서를 사용하는 mTLS 인증이 있는 사용자의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls-external
# ...
15.2.2.3. SCRAM-SHA-512 인증 링크 복사링크가 클립보드에 복사되었습니다!
SCRAM-SHA-512 인증 메커니즘을 사용하려면 KafkaUser 리소스의 type 필드를 scram-sha-512 로 설정합니다.
SCRAM-SHA-512 인증이 활성화된 사용자 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
# ...
User Operator에 의해 사용자를 생성하면 KafkaUser 리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 base64로 인코딩되는 password 키에 생성된 암호가 포함되어 있습니다. 암호를 사용하려면 디코딩해야 합니다.
사용자 인증 정보가 있는 시크릿 예
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
password: Z2VuZXJhdGVkcGFzc3dvcmQ=
sasl.jaas.config: b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkuc2NyYW0uU2NyYW1Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT0ibXktdXNlciIgcGFzc3dvcmQ9ImdlbmVyYXRlZHBhc3N3b3JkIjsK
생성된 암호를 디코딩합니다.
echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
15.2.2.3.1. 사용자 정의 암호 구성 링크 복사링크가 클립보드에 복사되었습니다!
사용자가 생성되면 Apache Kafka용 Streams가 임의의 암호를 생성합니다. Apache Kafka용 Streams에서 생성한 암호 대신 고유한 암호를 사용할 수 있습니다. 이렇게 하려면 암호를 사용하여 시크릿을 생성하고 KafkaUser 리소스에서 참조합니다.
SCRAM-SHA-512 인증에 대한 암호가 설정된 사용자 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
password:
valueFrom:
secretKeyRef:
name: my-secret
key: my-password
# ...
15.2.3. 사용자 권한 부여 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 사용자 지정 리소스를 사용하여 Kafka 클러스터에 액세스해야 하는 사용자(클라이언트)에 대한 권한 부여 규칙을 구성합니다. KafkaUser.spec 에서 권한 부여 속성을 사용하여 규칙을 구성합니다. 유형을 지정하면 사용되는 규칙을 제어할 수 있습니다.
간단한 인증을 사용하려면 KafkaUser.spec.authorization 에서 type 속성을 simple 로 설정합니다. 간단한 인증에서는 Kafka Admin API를 사용하여 Kafka 클러스터 내부의 ACL 규칙을 관리합니다. User Operator의 ACL 관리가 활성화되어 있는지 여부는 Kafka 클러스터의 권한 부여 구성에 따라 다릅니다.
- 간단한 승인을 위해 ACL 관리는 항상 활성화됩니다.
- OPA 권한 부여의 경우 ACL 관리는 항상 비활성화되어 있습니다. 권한 부여 규칙은 OPA 서버에서 구성됩니다.
- Red Hat Single Sign-On 권한 부여의 경우 Red Hat Single Sign-On에서 ACL 규칙을 직접 관리할 수 있습니다. 구성의 대체 옵션으로 간단한 인증자에게 권한을 위임할 수도 있습니다. 간단한 인증자로 위임할 때 User Operator는 ACL 규칙도 관리할 수 있습니다.
-
사용자 정의 권한 부여 플러그인을 사용하는 사용자 정의 인증의 경우
Kafka사용자 정의 리소스의.spec.kafka.authorization구성에서supportsAdminApi속성을 사용하여 지원을 활성화하거나 비활성화합니다.
권한 부여는 클러스터 전체입니다. 권한 부여 유형은 Kafka 사용자 정의 리소스의 동등한 구성과 일치해야 합니다.
ACL 관리가 활성화되지 않은 경우 Apache Kafka의 Streams는 ACL 규칙이 포함된 경우 리소스를 거부합니다.
User Operator의 독립 실행형 배포를 사용하는 경우 기본적으로 ACL 관리가 활성화됩니다. STRIMZI_ACLS_ADMIN_API_SUPPORTED 환경 변수를 사용하여 비활성화할 수 있습니다.
권한 부여가 지정되지 않은 경우 User Operator는 사용자에 대한 액세스 권한을 프로비저닝하지 않습니다. 이러한 KafkaUser 가 리소스에 계속 액세스할 수 있는지 여부는 사용 중인 인증자에 따라 다릅니다. 예를 들어 간단한 승인을 위해 Kafka 클러스터의 allow.everyone.if.no.acl.found 구성에 의해 결정됩니다.
15.2.3.1. ACL 규칙 링크 복사링크가 클립보드에 복사되었습니다!
간단한 인증에서는 ACL 규칙을 사용하여 Kafka 브로커에 대한 액세스를 관리합니다.
ACL 규칙은 acls 속성에서 지정하는 사용자에게 액세스 권한을 부여합니다.
AclRule 오브젝트에 대한 자세한 내용은 AclRule 스키마 참조를 참조하십시오.
15.2.3.2. Kafka 브로커에 대한 슈퍼 사용자 액세스 링크 복사링크가 클립보드에 복사되었습니다!
사용자가 Kafka 브로커 구성의 슈퍼 사용자 목록에 추가되면 KafkaUser 의 ACL에 정의된 권한 부여 제약 조건에 관계없이 클러스터에 대한 무제한 액세스가 허용됩니다.
브로커에 대한 슈퍼유저 액세스를 구성하는 방법에 대한 자세한 내용은 Kafka 권한 부여를 참조하십시오.
15.2.3.3. 사용자 할당량 링크 복사링크가 클립보드에 복사되었습니다!
사용자가 Kafka 브로커에 대한 구성된 액세스 수준을 초과하지 않도록 KafkaUser 리소스의 사양 을 구성하여 할당량을 적용할 수 있습니다. 크기 기반 네트워크 사용량과 시간 기반 CPU 사용률 임계값을 설정할 수 있습니다. 파티션 변경 할당량을 추가하여 사용자 요청에 대해 파티션 변경 요청을 허용하는 속도를 제어할 수도 있습니다.
사용자 할당량이 있는 KafkaUser 의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
# ...
quotas:
producerByteRate: 1048576
consumerByteRate: 2097152
requestPercentage: 55
controllerMutationRate: 10
이러한 속성에 대한 자세한 내용은 KafkaUserQuotas 스키마 참조를 참조하십시오.
15.3. Kafka 브로커에 대한 액세스 보안 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커에 대한 보안 액세스를 설정하려면 다음을 구성하고 적용합니다.
다음을 수행할
Kafka리소스입니다.- 지정된 인증 유형을 사용하여 리스너 생성
- 전체 Kafka 클러스터에 대한 권한 부여 구성
-
리스너를 통해 Kafka 브로커에 안전하게 액세스할 수 있는
KafkaUser리소스
설정하도록 Kafka 리소스를 구성합니다.
- 리스너 인증
- Kafka 리스너에 대한 액세스를 제한하는 네트워크 정책
- Kafka 권한 부여
- 브로커에 대한 제한없이 액세스 할 수있는 슈퍼 사용자
인증은 각 리스너마다 독립적으로 구성됩니다. 권한 부여는 항상 전체 Kafka 클러스터에 대해 구성됩니다.
Cluster Operator는 리스너를 생성하고 Kafka 클러스터 내에서 인증을 활성화하기 위해 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정합니다.
자체 인증서를 설치하여 Cluster Operator에서 생성한 인증서 를 교체할 수 있습니다.
TLS 암호화가 활성화된 모든 리스너에 대한 자체 서버 인증서 및 개인 키를 제공할 수도 있습니다. 이러한 사용자 제공 인증서를 Kafka 리스너 인증서 라고 합니다. Kafka 리스너 인증서를 제공하면 조직의 개인 CA 또는 공용 CA와 같은 기존 보안 인프라를 활용할 수 있습니다. Kafka 클라이언트는 리스너 인증서에 서명하는 데 사용된 CA를 신뢰해야 합니다. 필요한 경우 Kafka 리스너 인증서를 수동으로 갱신해야 합니다. 인증서는 PKCS #12 형식(.p12) 및 PEM(.crt) 형식으로 사용할 수 있습니다.
KafkaUser 를 사용하여 특정 클라이언트가 Kafka에 액세스하는 데 사용하는 인증 및 권한 부여 메커니즘을 활성화합니다.
설정하도록 KafkaUser 리소스를 구성합니다.
- 활성화된 리스너 인증과 일치하도록 인증
- 활성화된 Kafka 권한 부여와 일치하도록 권한 부여
- 클라이언트의 리소스 사용을 제어하는 할당량
User Operator는 선택한 인증 유형에 따라 클라이언트 및 클라이언트 인증에 사용되는 보안 인증 정보를 나타내는 사용자를 생성합니다.
액세스 구성 속성에 대한 자세한 내용은 스키마 참조를 참조하십시오.
15.3.1. Kafka 브로커 보안 링크 복사링크가 클립보드에 복사되었습니다!
이 절차에서는 Apache Kafka용 Streams를 실행할 때 Kafka 브로커 보안과 관련된 단계를 보여줍니다.
Kafka 브로커에 구현된 보안은 액세스가 필요한 클라이언트에 대해 구현된 보안과 호환되어야 합니다.
-
Kafka.spec.kafka.listeners[*].authentication은KafkaUser.spec.authentication과 일치합니다. -
Kafka.spec.kafka.authorization은KafkaUser.spec.authorization과 일치합니다.
이 단계에서는 간단한 권한 부여 및 mTLS 인증을 사용하는 리스너에 대한 구성을 보여줍니다. 리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.
또는 리스너 인증에 SCRAM-SHA 또는 OAuth 2.0을 사용하고 Kafka 인증 에는 OAuth 2.0 또는 OPA를 사용할 수 있습니다.
프로세스
Kafka리소스를 구성합니다.-
권한 부여에 대한 권한 부여 속성을 구성합니다. 인증을 사용하여 리스너를 생성하도록
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: tls3 # ... zookeeper: # ...- 1
- 2
- Kafka에 무제한 액세스가 가능한 사용자 주체 목록입니다. CN 은 mTLS 인증이 사용될 때 클라이언트 인증서의 일반적인 이름입니다.
- 3
- 각 리스너에 대해 리스너 인증 메커니즘을 구성하고 mTLS, SCRAM-SHA-512 또는 토큰 기반 OAuth 2.0으로 지정할 수 있습니다.
외부 리스너를 구성하는 경우 구성은 선택한 연결 메커니즘에 따라 달라집니다.
-
Kafka리소스를 생성하거나 업데이트합니다.oc apply -f <kafka_configuration_file>Kafka 클러스터는 mTLS 인증을 사용하여 Kafka 브로커 리스너로 구성됩니다.
각 Kafka 브로커 Pod에 대한 서비스가 생성됩니다.
Kafka 클러스터 연결에 대한 부트스트랩 주소 역할을 하는 서비스가 생성됩니다.
kafka 브로커의 ID를 확인하는 클러스터 CA 인증서도 시크릿 <
cluster_name> -cluster-ca-cert에 생성됩니다.
15.3.2. Kafka에 대한 사용자 액세스 보안 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에 대한 보안 액세스 권한이 필요한 클라이언트를 나타내도록 KafkaUser 를 생성하거나 수정합니다.
KafkaUser 인증 및 권한 부여 메커니즘을 구성할 때 동등한 Kafka 구성과 일치하는지 확인합니다.
-
KafkaUser.spec.authentication은Kafka.spec.kafka.listeners[*].authentication과 일치합니다. -
KafkaUser.spec.authorization은Kafka.spec.kafka.authorization과 일치합니다.
다음 절차에서는 mTLS 인증을 사용하여 사용자를 생성하는 방법을 보여줍니다. SCRAM-SHA 인증을 사용하여 사용자를 생성할 수도 있습니다.
필요한 인증은 Kafka 브로커 리스너에 대해 구성된 인증 유형에 따라 다릅니다.
Kafka 사용자와 Kafka 브로커 간의 인증은 각각에 대한 인증 설정에 따라 다릅니다. 예를 들어 Kafka 구성에서도 활성화되지 않은 경우 mTLS로 사용자를 인증할 수 없습니다.
사전 요구 사항
- mTLS 인증 및 TLS 암호화를 사용하여 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
- 실행 중인 User Operator(일반적으로 Entity Operator와 함께 배포됨)
KafkaUser 의 인증 유형은 Kafka 브로커에 구성된 인증 유형과 일치해야 합니다.
프로세스
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: simple2 acls: - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read - resource: type: group name: my-group patternType: literal operations: - ReadKafkaUser리소스를 생성하거나 업데이트합니다.oc apply -f <user_config_file>사용자는
KafkaUser리소스와 동일한 이름의 Secret과 함께 생성됩니다. 보안에는 mTLS 인증을 위한 개인 및 공개 키가 포함되어 있습니다.
Kafka 브로커에 대한 보안 연결을 위해 속성을 사용하여 Kafka 클라이언트를 구성하는 방법에 대한 자세한 내용은 14.4절. “리스너를 사용하여 Kafka 클러스터에 대한 클라이언트 액세스 설정” 을 참조하십시오.
15.3.3. 네트워크 정책을 사용하여 Kafka 리스너에 대한 액세스 제한 링크 복사링크가 클립보드에 복사되었습니다!
networkPolicyPeers 속성을 사용하여 리스너에 대한 액세스를 선택한 애플리케이션으로만 제한할 수 있습니다.
사전 요구 사항
- Ingress NetworkPolicies를 지원하는 OpenShift 클러스터입니다.
- Cluster Operator가 실행 중입니다.
프로세스
-
Kafka리소스를 엽니다. networkPolicyPeers속성에서 Kafka 클러스터에 액세스할 수 있는 애플리케이션 Pod 또는 네임스페이스를 정의합니다.예를 들어
app레이블이kafka-client로 설정된 애플리케이션 Pod에서만 연결을 허용하도록tls리스너를 구성하려면 다음을 수행합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls networkPolicyPeers: - podSelector: matchLabels: app: kafka-client # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply:oc apply -f your-file
15.3.4. TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공 링크 복사링크가 클립보드에 복사되었습니다!
리스너는 Kafka 브로커에 대한 클라이언트 액세스를 제공합니다. TLS를 사용하여 클라이언트 액세스에 필요한 구성을 포함하여 Kafka 리소스에서 리스너를 구성합니다.
기본적으로 리스너는 Apache Kafka용 Streams에서 생성한 내부 CA(인증 기관) 인증서에서 서명한 인증서를 사용합니다. CA 인증서는 Kafka 클러스터를 생성할 때 Cluster Operator에 의해 생성됩니다. TLS용 클라이언트를 구성할 때 CA 인증서를 신뢰 저장소 구성에 추가하여 Kafka 클러스터를 확인합니다. 자체 CA 인증서를 설치하고 사용할 수도 있습니다. 또는 brokerCert CryostatAndKey 속성을 사용하여 리스너를 구성하고 사용자 지정 서버 인증서를 사용할 수 있습니다.
brokerCert CryostatAndKey 속성을 사용하면 리스너 수준에서 자체 사용자 지정 인증서를 사용하여 Kafka 브로커에 액세스할 수 있습니다. 고유한 개인 키 및 서버 인증서를 사용하여 보안을 생성한 다음 리스너의 brokerCert CryostatAndKey 구성에 키와 인증서를 지정합니다. 공용(외부) CA 또는 개인 CA에서 서명한 인증서를 사용할 수 있습니다. 공용 CA에서 서명한 경우 일반적으로 클라이언트의 신뢰 저장소 구성에 추가할 필요가 없습니다. 사용자 지정 인증서는 Apache Kafka용 Streams에서 관리되지 않으므로 수동으로 업데이트해야 합니다.
리스너 인증서는 TLS 암호화 및 서버 인증에만 사용됩니다. TLS 클라이언트 인증에 사용되지 않습니다. TLS 클라이언트 인증에 자체 인증서를 사용하려면 자체 클라이언트 CA를 설치하고 사용해야 합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
각 리스너에는 다음이 필요합니다.
외부 CA에서 서명한 호환되는 서버 인증서입니다. (X.509 인증서를 PEM 형식으로 제공)
여러 리스너에 하나의 리스너 인증서를 사용할 수 있습니다.
- 제목 대체 이름(SAN)은 각 리스너의 인증서에 지정됩니다. 자세한 내용은 15.3.5절. “Kafka 리스너에 대한 서버 인증서의 대체 대상”의 내용을 참조하십시오.
자체 서명된 인증서를 사용하지 않는 경우 인증서에 전체 CA 체인을 포함하는 인증서를 제공할 수 있습니다.
TLS 암호화(tls: true)가 리스너에 대해 구성된 경우에만 brokerCert CryostatAndKey 속성을 사용할 수 있습니다.
Apache Kafka의 스트림은 TLS에 암호화된 개인 키 사용을 지원하지 않습니다. 이 작업이 작동하려면 시크릿에 저장된 개인 키를 암호화되지 않아야 합니다.
프로세스
개인 키와 서버 인증서가 포함된 보안을 생성합니다.
oc create secret generic my-secret --from-file=my-listener-key.key --from-file=my-listener-certificate.crt클러스터의
Kafka리소스를 편집합니다.configuration.brokerCertAndKey속성에서Secret, 인증서 파일 및 개인 키 파일을 사용하도록 리스너를 구성합니다.TLS 암호화가 활성화된
로드 밸런서외부 리스너 구성 예# ... listeners: - name: plain port: 9092 type: internal tls: false - name: external3 port: 9094 type: loadbalancer tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...TLS 리스너 구성 예
# ... listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...새 구성을 적용하여 리소스를 생성하거나 업데이트합니다.
oc apply -f kafka.yamlCluster Operator는 Kafka 클러스터의 롤링 업데이트를 시작하여 리스너 구성을 업데이트합니다.
참고리스너에서 이미 사용하고 있는
Secret에서 Kafka 리스너 인증서를 업데이트하는 경우에도 롤링 업데이트가 시작됩니다.
15.3.5. Kafka 리스너에 대한 서버 인증서의 대체 대상 링크 복사링크가 클립보드에 복사되었습니다!
자체 Kafka 리스너 인증서와 함께 TLS 호스트 이름 확인을 사용하려면 각 리스너 에 올바른 주체 대체 이름(SAN)을 사용해야 합니다. 인증서 SAN은 다음에 대한 호스트 이름을 지정해야 합니다.
- 클러스터의 모든 Kafka 브로커
- Kafka 클러스터 부트스트랩 서비스
CA에서 지원하는 와일드카드 인증서를 사용할 수 있습니다.
15.3.5.1. 내부 리스너를 위한 SAN의 예 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제를 사용하면 내부 리스너에 대한 인증서에 SAN의 호스트 이름을 지정하는 데 도움이 됩니다.
< cluster-name >을 Kafka 클러스터의 이름으로 바꾸고 < namespace >를 클러스터가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
유형의 와일드카드 예: 내부 리스너
//Kafka brokers
*.<cluster-name>-kafka-brokers
*.<cluster-name>-kafka-brokers.<namespace>.svc
// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc
type: 내부 리스너에 대한 와일드카드가 아닌 예
// Kafka brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers.<namespace>.svc
# ...
// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc
유형: cluster-ip 리스너의 와일드카드가 아닌 예
// Kafka brokers
<cluster-name>-kafka-<listener-name>-0
<cluster-name>-kafka-<listener-name>-0.<namespace>.svc
<cluster-name>-kafka-<listener-name>-1
<cluster-name>-kafka-<listener-name>-1.<namespace>.svc
# ...
// Bootstrap service
<cluster-name>-kafka-<listener-name>-bootstrap
<cluster-name>-kafka-<listener-name>-bootstrap.<namespace>.svc
15.3.5.2. 외부 리스너를 위한 SAN의 예 링크 복사링크가 클립보드에 복사되었습니다!
TLS 암호화가 활성화된 외부 리스너의 경우 인증서에 지정해야 하는 호스트 이름은 외부 리스너 유형에 따라 다릅니다.
| 외부 리스너 유형 | SAN에서…을 지정합니다. |
|---|---|
|
|
모든 Kafka 브로커 일치하는 와일드카드 이름을 사용할 수 있습니다. |
|
|
모든 Kafka 브로커 일치하는 와일드카드 이름을 사용할 수 있습니다. |
|
|
모든 Kafka 브로커 일치하는 와일드카드 이름을 사용할 수 있습니다. |
|
| Kafka 브로커 Pod를 예약할 수 있는 모든 OpenShift 작업자 노드의 주소입니다. 일치하는 와일드카드 이름을 사용할 수 있습니다. |
15.4. OAuth 2.0 토큰 기반 인증 사용 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 OAUTHBEARER 및 PLAIN 메커니즘을 사용한 OAuth 2.0 인증 사용을 지원합니다.
OAuth 2.0은 중앙 권한 부여 서버를 사용하여 리소스에 대한 제한된 액세스 권한을 부여하는 토큰을 발행하여 애플리케이션 간에 표준화된 토큰 기반 인증과 권한을 부여할 수 있습니다.
OAuth 2.0 인증을 구성한 다음 OAuth 2.0 인증을 구성할 수 있습니다.
Kafka 브로커 및 클라이언트는 모두 OAuth 2.0을 사용하도록 구성해야 합니다. OAuth 2.0 인증은 단순 또는 OPA 기반 Kafka 권한 과 함께 사용할 수도 있습니다.
OAuth 2.0 토큰 기반 인증을 사용하여 애플리케이션 클라이언트는 계정 자격 증명을 노출하지 않고 애플리케이션 서버( 리소스 서버라고 함)의 리소스에 액세스할 수 있습니다.
애플리케이션 클라이언트는 인증 수단으로 액세스 토큰을 전달합니다. 이 방법으로 부여할 액세스 수준을 결정하는 데 사용할 애플리케이션 서버가 사용할 수 있습니다. 권한 부여 서버는 액세스 권한 부여 및 액세스 관련 문의를 처리합니다.
Apache Kafka 스트림 컨텍스트에서 다음을 수행합니다.
- Kafka 브로커는 OAuth 2.0 리소스 서버 역할을 합니다.
- Kafka 클라이언트가 OAuth 2.0 애플리케이션 클라이언트 역할을 합니다.
Kafka 클라이언트는 Kafka 브로커에 인증합니다. 브로커 및 클라이언트는 필요에 따라 OAuth 2.0 권한 부여 서버와 통신하여 액세스 토큰을 얻거나 검증합니다.
Apache Kafka용 Streams 배포를 위해 OAuth 2.0 통합은 다음을 제공합니다.
- Kafka 브로커에 대한 서버 측 OAuth 2.0 지원
- Kafka MirrorMaker, Kafka Connect 및 Kafka Bridge에 대한 클라이언트 측 OAuth 2.0 지원
15.4.1. OAuth 2.0 인증 메커니즘 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 OAuth 2.0 인증을 위한 OAUTHBEARER 및 PLAIN 메커니즘을 지원합니다. 두 메커니즘을 통해 Kafka 클라이언트가 Kafka 브로커를 사용하여 인증된 세션을 설정할 수 있습니다. 클라이언트, 권한 부여 서버 및 Kafka 브로커 간의 인증 흐름은 각 메커니즘마다 다릅니다.
가능한 경우 OAUTHBEARER를 사용하도록 클라이언트를 구성하는 것이 좋습니다. OAUTHBEARER는 클라이언트 인증 정보가 Kafka 브로커와 공유 되지 않기 때문에 PLAIN보다 높은 수준의 보안을 제공합니다. OAUTHBEARER를 지원하지 않는 Kafka 클라이언트에서만 PLAIN을 사용하는 것이 좋습니다.
클라이언트 연결에 OAuth 2.0 인증을 사용하도록 Kafka 브로커 리스너를 구성합니다. 필요한 경우 동일한 oauth 리스너에서 OAUTHBEARER 및 PLAIN 메커니즘을 사용할 수 있습니다. 각 메커니즘을 지원하는 속성은 oauth 리스너 구성에 명시적으로 지정해야 합니다.
OAUTHBEARER 개요
OAUTHBEARER는 Kafka 브로커의 oauth 리스너 구성에서 자동으로 활성화됩니다. enableOauthBearer 속성을 true 로 설정할 수 있지만 필수는 아닙니다.
# ...
authentication:
type: oauth
# ...
enableOauthBearer: true
많은 Kafka 클라이언트 툴은 프로토콜 수준에서 OAUTHBEARER에 대한 기본 지원을 제공하는 라이브러리를 사용합니다. 애플리케이션 개발을 지원하기 위해 Apache Kafka용 Streams는 업스트림 Kafka 클라이언트 Java 라이브러리에 대한 OAuth 콜백 처리기 를 제공합니다(다른 라이브러리는 아님). 따라서 자체 콜백 처리기를 작성할 필요가 없습니다. 애플리케이션 클라이언트는 콜백 처리기를 사용하여 액세스 토큰을 제공할 수 있습니다. Go와 같은 다른 언어로 작성된 클라이언트는 사용자 지정 코드를 사용하여 권한 부여 서버에 연결하고 액세스 토큰을 받아야 합니다.
클라이언트는 OAUTHBEARER를 사용하여 인증 정보 교환을 위해 Kafka 브로커로 세션을 시작합니다. 여기서 인증 정보는 콜백 처리기에서 제공하는 전달자 토큰의 형태를 취합니다. 콜백을 사용하면 다음 세 가지 방법 중 하나로 토큰 프로비저닝을 구성할 수 있습니다.
- 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
- 구성 시 수동으로 얻은 장기 액세스 토큰
- 구성 시 수동으로 가져온 장기 새로 고침 토큰
OAUTHBEARER 인증은 프로토콜 수준에서 OAUTHBEARER 메커니즘을 지원하는 Kafka 클라이언트에서만 사용할 수 있습니다.
PLAIN 개요
PLAIN을 사용하려면 Kafka 브로커의 oauth 리스너 구성에서 활성화해야 합니다.
다음 예제에서는 기본적으로 활성화되어 있는 OAUTHBEARER 외에도 PLAIN이 활성화됩니다. PLAIN만 사용하려면 enableOauthBearer 를 false 로 설정하여 OAUTHBEARER를 비활성화할 수 있습니다.
# ...
authentication:
type: oauth
# ...
enablePlain: true
tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token
PLAIN은 모든 Kafka 클라이언트 툴에서 사용하는 간단한 인증 메커니즘입니다. OAuth 2.0 인증에 사용할 PLAIN을 활성화하려면 Apache Kafka의 Streams는 PLAIN 서버 측 콜백을 통해 OAuth 2.0 을 제공합니다.
PLAIN의 Streams for Apache Kafka 구현을 사용하면 클라이언트 인증 정보가 Zoo Cryostat에 저장되지 않습니다. 대신 OAUTHBEARER 인증이 사용되는 경우와 유사하게 클라이언트 자격 증명은 호환 권한 부여 서버 뒤에서 중앙에서 처리됩니다.
PLAIN 콜백을 통해 OAuth 2.0과 함께 사용하면 Kafka 클라이언트가 다음 방법 중 하나를 사용하여 Kafka 브로커로 인증합니다.
- 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
- 구성 시 수동으로 얻은 장기 액세스 토큰
두 방법 모두 클라이언트는 Kafka 브로커에 인증 정보를 전달하기 위해 PLAIN 사용자 이름과 암호 속성을 제공해야 합니다. 클라이언트는 이러한 속성을 사용하여 클라이언트 ID와 시크릿 또는 사용자 이름 및 액세스 토큰을 전달합니다.
클라이언트 ID와 시크릿은 액세스 토큰을 가져오는 데 사용됩니다.
액세스 토큰은 암호 속성 값으로 전달됩니다. $accessToken: 접두사를 사용하거나 사용하지 않고 액세스 토큰을 전달합니다.
-
리스너 구성에서 토큰 끝점(
tokenEndpointUri)을 구성하는 경우 접두사가 필요합니다. -
리스너 구성에서 토큰 끝점(
tokenEndpointUri)을 구성하지 않으면 접두사가 필요하지 않습니다. Kafka 브로커는 암호를 원시 액세스 토큰으로 해석합니다.
암호 가 액세스 토큰으로 설정된 경우 사용자 이름은 Kafka 브로커가 액세스 토큰에서 얻는 것과 동일한 주체 이름으로 설정해야 합니다. userNameClaim,fallbackUserNameClaim,fallbackUsernamePrefix, userInfoEndpointUri 속성을 사용하여 리스너에서 사용자 이름 추출 옵션을 지정할 수 있습니다. 사용자 이름 추출 프로세스는 권한 부여 서버(특히 클라이언트 ID를 계정 이름에 매핑하는 방법)에 따라 다릅니다.
PLAIN을 통한 OAuth는 암호 부여 메커니즘을 지원하지 않습니다. 위에서 설명한 대로 클라이언트 인증 정보(client Id + secret) 또는 액세스 토큰을 통해 SASL PLAIN 메커니즘을 통해 'proxy'만 수행할 수 있습니다.
15.4.2. OAuth 2.0 Kafka 브로커 구성 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0에 대한 Kafka 브로커 구성은 다음과 같습니다.
- 권한 부여 서버에서 OAuth 2.0 클라이언트 생성
- Kafka 사용자 정의 리소스에서 OAuth 2.0 인증 구성
권한 부여 서버와 관련하여 Kafka 브로커 및 Kafka 클라이언트는 모두 OAuth 2.0 클라이언트로 간주됩니다.
15.4.2.1. 권한 부여 서버의 OAuth 2.0 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
세션 시작 중에 수신된 토큰을 확인하도록 Kafka 브로커를 구성하려면 다음 클라이언트 인증 정보가 활성화된 권한 부여 서버로 구성된 OAuth 2.0 클라이언트 정의를 생성하는 것이 좋습니다.
-
kafka의 클라이언트 ID(예:) - 인증 메커니즘으로 클라이언트 ID 및 시크릿
권한 부여 서버의 비공개 인트로스펙션 엔드포인트를 사용하는 경우에만 클라이언트 ID와 시크릿을 사용해야 합니다. 인증 정보는 빠른 로컬 JWT 토큰 검증과 마찬가지로 공용 권한 부여 서버 끝점을 사용할 때 필요하지 않습니다.
15.4.2.2. Kafka 클러스터의 OAuth 2.0 인증 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 OAuth 2.0 인증을 사용하려면 인증 방법 oauth:을 사용하여 Kafka 클러스터 사용자 정의 리소스에 대한 tls 리스너 구성을 지정합니다.
OAuth 2.0의 인증 방법 유형 확인
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
# ...
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
#...
리스너에서 OAuth 2.0 인증을 구성할 수 있습니다. TLS 암호화와 함께 OAuth 2.0 인증을 사용하는 것이 좋습니다(tls: true). 암호화 없이 연결은 토큰 도난을 통해 네트워크 도청 및 무단 액세스에 취약합니다.
보안 전송 계층이 클라이언트와 통신할 수 있도록 type: oauth 를 사용하여 외부 리스너를 구성합니다.
외부 리스너와 함께 OAuth 2.0 사용
# ...
listeners:
- name: external3
port: 9094
type: loadbalancer
tls: true
authentication:
type: oauth
#...
tls 속성은 기본적으로 false 이므로 활성화해야 합니다.
인증 유형을 OAuth 2.0으로 정의한 경우 인트로스펙션 엔드포인트를 사용하여 빠른 로컬 JWT 검증 또는 토큰 검증으로 검증 유형에 따라 구성을 추가합니다.
설명 및 예제를 사용하여 리스너에 대해 OAuth 2.0 을 구성하는 절차는 Kafka 브로커에 대한 OAuth 2.0 지원 구성에 설명되어 있습니다.
15.4.2.3. 빠른 로컬 JWT 토큰 검증 구성 링크 복사링크가 클립보드에 복사되었습니다!
빠른 로컬 JWT 토큰 검증은 JWT 토큰 서명을 로컬로 확인합니다.
로컬 검사에서는 토큰이 있는지 확인합니다.
-
액세스 토큰에 대한
Bearer의 (typ) 클레임 값을 포함하여 유형 준수 - 유효함 (종료되지 않음)
-
유효한IssuerURI와 일치하는 발행자가 있음
리스너를 구성할 때 권한 부여 서버가 발행하지 않은 모든 토큰이 거부되도록 유효한IssuerURI 속성을 지정합니다.
빠른 로컬 JWT 토큰 검증 중에 권한 부여 서버에 연결할 필요가 없습니다. OAuth 2.0 권한 부여 서버에서 노출하는 끝점인 jwksEndpointUri 속성을 지정하여 빠른 로컬 JWT 토큰 검증을 활성화합니다. 엔드포인트에는 Kafka 클라이언트가 인증 정보로 전송되는 서명된 JWT 토큰의 유효성을 검사하는 데 사용되는 공개 키가 포함되어 있습니다.
권한 부여 서버와의 모든 통신은 TLS 암호화를 사용하여 수행해야 합니다.
인증서 신뢰 저장소를 Apache Kafka 프로젝트 네임스페이스의 Streams에서 OpenShift Secret으로 구성하고 tlsTrustedCertificates 속성을 사용하여 truststore 파일이 포함된 OpenShift 보안을 가리킬 수 있습니다.
JWT 토큰에서 사용자 이름을 올바르게 추출하도록 userNameClaim 을 구성할 수 있습니다. 필요한 경우 "['user.info'].['user.id']" 와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.
Kafka ACL 권한을 사용하려면 인증 중에 사용자 이름으로 사용자를 식별해야 합니다. ( JWT 토큰의 하위 클레임은 일반적으로 사용자 이름이 아닌 고유 ID입니다.)
빠른 로컬 JWT 토큰 검증을 위한 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
#...
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
validIssuerUri: <https://<auth_server_address>/auth/realms/tls>
jwksEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/certs>
userNameClaim: preferred_username
maxSecondsWithoutReauthentication: 3600
tlsTrustedCertificates:
- secretName: oauth-server-cert
certificate: ca.crt
#...
15.4.2.4. OAuth 2.0 인트로스펙션 엔드 포인트 구성 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0 인트로스펙션 엔드포인트를 사용하는 토큰 검증은 수신된 액세스 토큰을 불투명으로 처리합니다. Kafka 브로커는 검증에 필요한 토큰 정보로 응답하는 인트로스펙션 엔드포인트에 액세스 토큰 토큰을 보냅니다. 중요한 것은 특정 액세스 토큰이 유효한 경우 최신 정보와 토큰이 만료되는 시기에 대한 정보를 반환합니다.
OAuth 2.0 인트로스펙션 기반 검증을 구성하려면 빠른 로컬 JWT 토큰 검증에 지정된 jwksEndpointUri 속성 대신 introspectionEndpointUri 속성을 지정합니다. 인증 서버에 따라 인트로스펙션 엔드포인트가 일반적으로 보호되므로 clientId 및 clientSecret 을 지정해야 합니다.
인트로스펙션 엔드 포인트 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
clientId: kafka-broker
clientSecret:
secretName: my-cluster-oauth
key: clientSecret
validIssuerUri: <https://<auth_server_-_address>/auth/realms/tls>
introspectionEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/token/introspect>
userNameClaim: preferred_username
maxSecondsWithoutReauthentication: 3600
tlsTrustedCertificates:
- secretName: oauth-server-cert
certificate: ca.crt
15.4.3. Kafka 브로커에 대한 세션 재인증 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클라이언트와 Kafka 브로커 간의 OAuth 2.0 세션에 Kafka 세션 재인증 을 사용하도록 oauth 리스너를 구성할 수 있습니다. 이 메커니즘은 정의된 기간 후에 클라이언트와 브로커 간에 인증된 세션 만료를 적용합니다. 세션이 만료되면 클라이언트는 기존 연결을 삭제하는 대신 다시 사용하여 새 세션을 즉시 시작합니다.
세션 재인증은 기본적으로 비활성화되어 있습니다. 이를 활성화하려면 oauth 리스너 구성에서 maxSecondsWithoutReauthentication 의 시간 값을 설정합니다. 동일한 속성은 OAUTHBEARER 및 PLAIN 인증에 대한 세션 재인증을 구성하는 데 사용됩니다. 구성 예제는 15.4.6.2절. “Kafka 브로커에 대한 OAuth 2.0 지원 구성” 을 참조하십시오.
세션 재인증은 클라이언트에서 사용하는 Kafka 클라이언트 라이브러리에서 지원해야 합니다.
세션 재인증은 빠른 로컬 JWT 또는 인트로스펙션 엔드포인트 토큰 검증과 함께 사용할 수 있습니다.
클라이언트 재인증
브로커의 인증된 세션이 만료되면 연결을 삭제하지 않고 새 유효한 액세스 토큰을 브로커에 전송하여 클라이언트가 기존 세션으로 다시 인증해야 합니다.
토큰 유효성 검사가 성공하면 기존 연결을 사용하여 새 클라이언트 세션이 시작됩니다. 클라이언트가 다시 인증되지 않으면 메시지를 보내거나 수신하려고 하면 브로커가 연결을 종료합니다. Kafka 클라이언트 라이브러리 2.2 이상을 사용하는 Java 클라이언트는 브로커에서 재인증 메커니즘이 활성화된 경우 자동으로 다시 인증됩니다.
세션 재인증은 사용되는 경우 토큰 새로 고침에도 적용됩니다. 세션이 만료되면 클라이언트는 새로 고침 토큰을 사용하여 액세스 토큰을 새로 고칩니다. 그런 다음 클라이언트는 새 액세스 토큰을 사용하여 기존 세션에 다시 인증합니다.
OAUTHBEARER 및 PLAIN의 세션 만료
세션 재인증이 구성되면 OAUTHBEARER 및 PLAIN 인증에 대해 세션 만료가 다르게 작동합니다.
OAUTHBEARER 및 PLAIN의 경우 클라이언트 ID 및 시크릿 방법을 사용합니다.
-
브로커의 인증된 세션은 구성된
maxSecondsWithoutReauthentication에서 만료됩니다. - 구성된 시간 전에 액세스 토큰이 만료되면 세션이 이전에 만료됩니다.
장기 액세스 토큰 방법을 사용하는 PLAIN의 경우:
-
브로커의 인증된 세션은 구성된
maxSecondsWithoutReauthentication에서 만료됩니다. - 구성된 시간 전에 액세스 토큰이 만료되면 재인증이 실패합니다. 세션 재인증이 시도되었지만 PLAIN에는 토큰을 새로 고치는 메커니즘이 없습니다.
maxSecondsWithoutReauthentication 이 구성되지 않은 경우 OAUTHBEARER 및 PLAIN 클라이언트는 다시 인증할 필요 없이 브로커에 무기한 연결을 유지할 수 있습니다. 인증된 세션은 액세스 토큰 만료로 끝나지 않습니다. 그러나 예를 들어 keycloak 권한 부여를 사용하거나 사용자 정의 승인기를 설치하여 권한을 구성할 때 이를 고려할 수 있습니다.
15.4.4. OAuth 2.0 Kafka 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클라이언트는 다음 중 하나로 구성됩니다.
- 권한 부여 서버에서 유효한 액세스 토큰을 가져오는 데 필요한 인증 정보(클라이언트 ID 및 시크릿)
- 권한 부여 서버에서 제공하는 툴을 사용하여 얻은 유효한 장기 액세스 토큰 또는 새로 고침 토큰
Kafka 브로커로 전송된 유일한 정보는 액세스 토큰입니다. 액세스 토큰을 얻기 위해 권한 부여 서버로 인증하는 데 사용되는 인증 정보는 브로커로 전송되지 않습니다.
클라이언트에서 액세스 토큰을 가져올 때 권한 부여 서버와의 추가 통신이 필요하지 않습니다.
가장 간단한 메커니즘은 클라이언트 ID 및 시크릿을 사용한 인증입니다. 장기 액세스 토큰 또는 수명이 긴 새로 고침 토큰을 사용하면 권한 부여 서버 도구에 대한 추가 종속성이 있기 때문에 복잡성이 향상됩니다.
장기 액세스 토큰을 사용하는 경우 토큰의 최대 수명을 늘리려면 권한 부여 서버에서 클라이언트를 구성해야 할 수 있습니다.
Kafka 클라이언트가 액세스 토큰으로 직접 구성되지 않은 경우 클라이언트는 권한 부여 서버에 연결하여 Kafka 세션 시작 중에 액세스 토큰에 대한 인증 정보를 교환합니다. Kafka 클라이언트 교환:
- 클라이언트 ID 및 시크릿
- 클라이언트 ID, 새로 고침 토큰, 시크릿(선택 사항)
- 사용자 이름과 암호, 클라이언트 ID 및 시크릿 사용(선택 사항)
15.4.5. OAuth 2.0 클라이언트 인증 흐름 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0 인증 흐름은 기본 Kafka 클라이언트 및 Kafka 브로커 구성에 따라 다릅니다. 이 흐름은 사용된 권한 부여 서버에서도 지원해야 합니다.
Kafka 브로커 리스너 구성은 클라이언트가 액세스 토큰을 사용하여 인증하는 방법을 결정합니다. 클라이언트는 클라이언트 ID와 시크릿을 전달하여 액세스 토큰을 요청할 수 있습니다.
리스너가 PLAIN 인증을 사용하도록 구성된 경우 클라이언트는 클라이언트 ID 및 시크릿 또는 사용자 이름 및 액세스 토큰으로 인증할 수 있습니다. 이러한 값은 PLAIN 메커니즘의 사용자 이름 및 암호 속성으로 전달됩니다.
리스너 구성은 다음 토큰 검증 옵션을 지원합니다.
- 권한 부여 서버에 연결하지 않고도 JWT 서명 확인 및 로컬 토큰 인트로스펙션에 따라 빠른 로컬 토큰 검증을 사용할 수 있습니다. 권한 부여 서버는 토큰의 서명의 유효성을 검사하는 데 사용되는 공용 인증서가 있는 JWKS 엔드포인트를 제공합니다.
- 권한 부여 서버에서 제공하는 토큰 인트로스펙션 엔드포인트를 호출할 수 있습니다. 새 Kafka 브로커 연결이 설정될 때마다 브로커는 클라이언트에서 수신한 액세스 토큰을 권한 부여 서버로 전달합니다. Kafka 브로커는 토큰이 유효한지 여부를 확인하기 위해 응답을 확인합니다.
권한 부여 서버는 불투명 액세스 토큰만 사용할 수 있으므로 로컬 토큰 유효성 검사는 사용할 수 없습니다.
다음과 같은 인증 유형에 대해 Kafka 클라이언트 인증 정보를 구성할 수도 있습니다.
- 이전에 생성된 장기 액세스 토큰을 사용하여 로컬 액세스 직접
- 새 액세스 토큰을 발행하기 위해 권한 부여 서버와 연락합니다(클라이언트 ID와 시크릿 또는 새로 고침 토큰 또는 사용자 이름과 암호 사용)
15.4.5.1. SASL OAUTHBEARER 메커니즘을 사용한 클라이언트 인증 흐름의 예 링크 복사링크가 클립보드에 복사되었습니다!
SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 인증에 다음 통신 흐름을 사용할 수 있습니다.
브로커에서 인증 서버에 검증을 위임하는 클라이언트 ID와 시크릿을 사용하는 클라이언트
- Kafka 클라이언트는 클라이언트 ID 및 시크릿을 사용하여 권한 부여 서버에서 액세스 토큰을 요청하고 선택적으로 새로 고침 토큰을 요청합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
- 권한 부여 서버에서 새 액세스 토큰을 생성합니다.
- Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 액세스 토큰을 전달하여 Kafka 브로커로 인증합니다.
- Kafka 브로커는 자체 클라이언트 ID와 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 엔드포인트를 호출하여 액세스 토큰을 검증합니다.
- 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.
브로커가 빠른 로컬 토큰 검증을 수행하는 클라이언트 ID 및 시크릿을 사용하는 클라이언트
- Kafka 클라이언트는 클라이언트 ID 및 시크릿을 사용하여 토큰 끝점의 권한 부여 서버와 필요한 경우 새로 고침 토큰을 사용하여 인증합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
- 권한 부여 서버에서 새 액세스 토큰을 생성합니다.
- Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 액세스 토큰을 전달하여 Kafka 브로커로 인증합니다.
- Kafka 브로커는 JWT 토큰 서명 검사 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬로 검증합니다.
브로커로 권한 부여 서버에 검증을 위임하는 장기 액세스 토큰을 사용하는 클라이언트
- Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 브로커로 인증하여 장기 액세스 토큰을 전달합니다.
- Kafka 브로커는 자체 클라이언트 ID와 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 엔드포인트를 호출하여 액세스 토큰을 검증합니다.
- 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.
브로커가 빠른 로컬 유효성 검사를 수행하는 장기 액세스 토큰을 사용하는 클라이언트
- Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 브로커로 인증하여 장기 액세스 토큰을 전달합니다.
- Kafka 브로커는 JWT 토큰 서명 검사 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬로 검증합니다.
빠른 로컬 JWT 토큰 서명 검증은 토큰이 취소된 경우 권한 부여 서버와 확인되지 않으므로 수명이 짧은 토큰에만 적합합니다. 토큰 만료는 토큰에 기록되지만 취소는 언제든지 발생할 수 있으므로 권한 부여 서버에 연결하지 않아도 됩니다. 발행된 토큰은 만료될 때까지 유효한 것으로 간주됩니다.
15.4.5.2. SASL PLAIN 메커니즘을 사용한 클라이언트 인증 흐름의 예 링크 복사링크가 클립보드에 복사되었습니다!
OAuth PLAIN 메커니즘을 사용하여 Kafka 인증에 다음 통신 흐름을 사용할 수 있습니다.
브로커가 클라이언트의 액세스 토큰을 가져오는 클라이언트 ID와 시크릿을 사용하는 클라이언트
-
Kafka 클라이언트는 사용자 이름으로
clientId를 전달하고시크릿을 암호로 전달합니다. -
Kafka 브로커는 토큰 끝점을 사용하여
clientId및secret을 권한 부여 서버에 전달합니다. - 인증 서버는 새로운 액세스 토큰을 반환하거나 클라이언트 자격 증명이 유효하지 않은 경우 오류를 반환합니다.
Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.
- 토큰 인트로스펙션 엔드포인트가 지정된 경우 Kafka 브로커는 권한 부여 서버에서 엔드포인트를 호출하여 액세스 토큰을 검증합니다. 토큰 유효성 검사가 성공하면 세션이 설정됩니다.
- 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 이루어지지 않습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 액세스 토큰을 로컬로 검증합니다.
클라이언트 ID 및 시크릿 없이 장기 액세스 토큰을 사용하는 클라이언트
- Kafka 클라이언트는 사용자 이름과 암호를 전달합니다. 암호는 수동으로 가져와 클라이언트를 실행하기 전에 구성한 액세스 토큰의 값을 제공합니다.
이 암호는 Kafka 브로커 리스너가 인증을 위해 토큰 끝점으로 구성되었는지 여부에 따라
$accessToken:문자열 접두사와 함께 전달됩니다.-
토큰 끝점이 구성된 경우 브로커에 password 매개변수에 클라이언트 시크릿이 아닌 액세스 토큰이 포함되어 있음을 알 수 있도록 암호 앞에
$accessToken:가 붙여야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다. -
토큰 끝점이 Kafka 브로커 리스너에 구성되지 않은 경우(
no-client-credentials 모드사용) 암호는 접두사 없이 액세스 토큰을 제공해야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다. 이 모드에서 클라이언트는 클라이언트 ID와 시크릿을 사용하지 않으며password매개변수는 항상 원시 액세스 토큰으로 해석됩니다.
-
토큰 끝점이 구성된 경우 브로커에 password 매개변수에 클라이언트 시크릿이 아닌 액세스 토큰이 포함되어 있음을 알 수 있도록 암호 앞에
Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.
- 토큰 인트로스펙션 엔드포인트가 지정된 경우 Kafka 브로커는 권한 부여 서버에서 엔드포인트를 호출하여 액세스 토큰을 검증합니다. 토큰 유효성 검사가 성공하면 세션이 설정됩니다.
- 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 없습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 액세스 토큰을 로컬로 검증합니다.
15.4.6. OAuth 2.0 인증 구성 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0은 Kafka 클라이언트와 Apache Kafka 구성 요소의 스트림 간의 상호 작용에 사용됩니다.
Apache Kafka에 OAuth 2.0을 사용하려면 다음을 수행해야 합니다.
15.4.6.1. OAuth 2.0 인증 서버 구성 링크 복사링크가 클립보드에 복사되었습니다!
이 절차에서는 일반적으로 Apache Kafka용 Streams와 통합하기 위해 권한 부여 서버를 구성해야 하는 작업을 설명합니다.
이 지침은 제품에 한정되어 있지 않습니다.
단계는 선택한 권한 부여 서버에 따라 다릅니다. OAuth 2.0 액세스를 설정하는 방법에 대한 정보는 권한 부여 서버에 대한 제품 설명서를 참조하십시오.
권한 부여 서버가 이미 배포된 경우 배포 단계를 건너뛰고 현재 배포를 사용할 수 있습니다.
프로세스
- 권한 부여 서버를 클러스터에 배포합니다.
권한 부여 서버의 CLI 또는 관리 콘솔에 액세스하여 Apache Kafka용 OAuth 2.0을 구성합니다.
이제 Apache Kafka용 Streams에서 작동하도록 권한 부여 서버를 준비합니다.
-
kafka-broker클라이언트를 구성합니다. - 애플리케이션의 각 Kafka 클라이언트 구성 요소에 대해 클라이언트를 구성합니다.
다음에 수행할 작업
권한 부여 서버를 배포하고 구성한 후 OAuth 2.0을 사용하도록 Kafka 브로커를 구성합니다.
15.4.6.2. Kafka 브로커에 대한 OAuth 2.0 지원 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 브로커 리스너가 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 브로커를 구성하는 방법을 설명합니다.
tls: true 가 있는 리스너를 통해 암호화된 인터페이스를 통해 OAuth 2.0을 사용하는 것이 좋습니다. 일반 리스너는 권장되지 않습니다.
인증 서버가 신뢰할 수 있는 CA에서 서명한 인증서를 사용하고 OAuth 2.0 서버 호스트 이름과 일치하는 경우 TLS 연결이 기본 설정을 사용하여 작동합니다. 그렇지 않으면 적절한 인증서를 사용하여 truststore를 구성하거나 인증서 호스트 이름 검증을 비활성화해야 할 수 있습니다.
Kafka 브로커를 구성할 때 새로 연결된 Kafka 클라이언트의 OAuth 2.0 인증 중에 액세스 토큰을 확인하는 데 사용되는 메커니즘에 대한 두 가지 옵션이 있습니다.
시작하기 전
Kafka 브로커 리스너에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 다음을 참조하십시오.
사전 요구 사항
- Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
- OAuth 2.0 인증 서버가 배포됨
프로세스
편집기에서
Kafka리소스의 Kafka 브로커 구성(Kafka.spec.kafka)을 업데이트합니다.oc edit kafka my-clusterKafka 브로커
리스너구성을 구성합니다.각 리스너 유형에 대한 구성은 독립적이므로 동일하지 않아야 합니다.
다음 예제에서는 외부 리스너에 대해 구성된 구성 옵션을 보여줍니다.
예 1: 빠른 로컬 JWT 토큰 검증 구성
#... - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth1 validIssuerUri: https://<auth_server_address>/auth/realms/external2 jwksEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/certs3 userNameClaim: preferred_username4 maxSecondsWithoutReauthentication: 36005 tlsTrustedCertificates:6 - secretName: oauth-server-cert certificate: ca.crt disableTlsHostnameVerification: true7 jwksExpirySeconds: 3608 jwksRefreshSeconds: 3009 jwksMinRefreshPauseSeconds: 110 - 1
- 리스너 유형이
oauth로 설정되었습니다. - 2
- 인증에 사용되는 토큰 발행자의 URI입니다.
- 3
- 로컬 JWT 검증에 사용되는 JWKS 인증서 끝점의 URI입니다.
- 4
- 사용자를 식별하는 데 사용되는 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 해당 값은 권한 부여 서버에 따라 다릅니다. 필요한 경우
"['user.info'].['user.id']"와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다. - 5
- (선택 사항) 액세스 토큰과 동일한 기간에 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료될 때까지 남은 시간보다 작으면 클라이언트는 실제 토큰 만료 전에 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되고 클라이언트가 재인증을 시도하지 않으면 세션이 만료되지 않습니다.
- 6
- (선택 사항) 권한 부여 서버에 대한 TLS 연결에 대한 신뢰할 수 있는 인증서입니다.
- 7
- (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은
false입니다. - 8
- JWKS 인증서가 만료되기 전에 유효한 인증서로 간주됩니다. 기본값은
360초입니다. 더 긴 시간을 지정하면 취소된 인증서에 대한 액세스를 허용할 위험을 고려하십시오. - 9
- JWKS 인증서 새로 고침 간격입니다. 간격은 만료 간격보다 60초 이상 짧아야 합니다. 기본값은
300초입니다. - 10
- JWKS 공개 키를 새로 고치는 시도 사이의 최소 일시 중지 시간(초)입니다. 알 수 없는 서명 키가 발생하면 JWKS 키 새로 고침이 마지막 새로 고침 시도 이후 지정된 일시 중지를 사용하여 정기적인 스케줄 외부에 예약됩니다. 키를 새로 고치는 것은 지수 백오프 규칙을 따르며
jwksRefreshSeconds에 도달할 때까지 일시 중지를 늘리면 실패한 새로 고침을 다시 시도합니다. 기본값은 1입니다.
예 2: 인트로스펙션 끝점을 사용하여 토큰 검증 구성
- name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth validIssuerUri: https://<auth_server_address>/auth/realms/external introspectionEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token/introspect1 clientId: kafka-broker2 clientSecret:3 secretName: my-cluster-oauth key: clientSecret userNameClaim: preferred_username4 maxSecondsWithoutReauthentication: 36005 - 1
- 토큰 인트로스펙션 엔드포인트의 URI입니다.
- 2
- 클라이언트를 식별하는 클라이언트 ID입니다.
- 3
- 클라이언트 시크릿 및 클라이언트 ID는 인증에 사용됩니다.
- 4
- 사용자를 식별하는 데 사용되는 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 해당 값은 권한 부여 서버에 따라 다릅니다. 필요한 경우
"['user.info'].['user.id']"와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다. - 5
- (선택 사항) 액세스 토큰과 동일한 기간에 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료될 때까지 남은 시간보다 작으면 클라이언트는 실제 토큰 만료 전에 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되고 클라이언트가 재인증을 시도하지 않으면 세션이 만료되지 않습니다.
OAuth 2.0 인증 적용 방법과 권한 부여 서버 유형에 따라 다음을 사용할 수 있는 추가 (선택 사항) 구성 설정이 있습니다.
# ... authentication: type: oauth # ... checkIssuer: false1 checkAudience: true2 fallbackUserNameClaim: client_id3 fallbackUserNamePrefix: client-account-4 validTokenType: bearer5 userInfoEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/userinfo6 enableOauthBearer: false7 enablePlain: true8 tokenEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token9 customClaimCheck: "@.custom == 'custom-value'"10 clientAudience: audience11 clientScope: scope12 connectTimeoutSeconds: 6013 readTimeoutSeconds: 6014 httpRetries: 215 httpRetryPauseMs: 30016 groupsClaim: "$.groups"17 groupsClaimDelimiter: ","18 includeAcceptHeader: false19 - 1
- 권한 부여 서버에서
iss클레임을 제공하지 않으면 발급자 검사를 수행할 수 없습니다. 이 경우checkIssuer를false로 설정하고유효한IssuerUri를 지정하지 마십시오. 기본값은true입니다. - 2
- 권한 부여 서버가
aud(audience) 클레임을 제공하고 대상 검사를 적용하려는 경우checkAudience를true로 설정합니다. 대상 검사에서는 의도된 토큰 수신자를 식별합니다. 결과적으로 Kafka 브로커는aud클레임에clientId가 없는 토큰을 거부합니다. 기본값은false입니다. - 3
- 권한 부여 서버는 일반 사용자와 클라이언트를 모두 식별하는 단일 속성을 제공하지 않을 수 있습니다. 클라이언트가 자체 이름으로 인증하면 서버에서 클라이언트 ID 를 제공할 수 있습니다. 사용자가 사용자 이름과 암호를 사용하여 새로 고침 토큰 또는 액세스 토큰을 가져오는 경우 서버는 클라이언트 ID 외에도 사용자 이름 속성을 제공할 수 있습니다. 기본 사용자 ID 속성을 사용할 수 없는 경우 사용할 사용자 이름 클레임(attribute)을 지정하려면 이 대체 옵션을 사용합니다. 필요한 경우
"['client.info'].['client.id']"와 같은 JsonPath 표현식을 사용하여 대체 사용자 이름을 검색하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다. - 4
fallbackUserNameClaim이 적용 가능한 경우 사용자 이름 클레임의 값과 대체 사용자 이름 클레임의 이름 충돌을 방지할 수도 있습니다.producer라는 클라이언트가 존재하지만producer라는 일반 사용자도 존재하는 상황을 고려하십시오. 이 속성을 사용하여 클라이언트의 사용자 ID에 접두사를 추가할 수 있습니다.- 5
- (
introspectionEndpointUri) 사용 중인 권한 부여 서버에 따라 인트로스펙션 엔드 포인트가 토큰 유형 속성을 반환하거나 반환하지 않거나 다른 값을 포함할 수 있습니다. 인트로스펙션 끝점의 응답에 포함되어야 하는 유효한 토큰 유형 값을 지정할 수 있습니다. - 6
- (추천
EndpointUri) 인증 서버가 Introspection Endpoint 응답에서 식별 가능한 정보를 제공하지 않도록 인증 서버를 구성하거나 구현할 수 있습니다. 사용자 ID를 얻으려면userinfo끝점의 URI를 폴백으로 구성할 수 있습니다.userNameClaim,fallbackUserNameClaim및fallbackUserNamePrefix설정은userinfo끝점 응답에 적용됩니다. - 7
- 리스너에서 OAUTHBEARER 메커니즘을 비활성화하려면 이를
false로 설정합니다. PLAIN 또는 OAUTHBEARER 중 하나 이상을 활성화해야 합니다. 기본값은true입니다. - 8
- 모든 플랫폼에서 클라이언트에 지원되는 리스너에서 PLAIN 인증을 활성화하려면
true로 설정합니다. - 9
- PLAIN 메커니즘에 대한 추가 구성입니다. 지정된 경우 클라이언트는
$accessToken:접두사를 사용하여암호로액세스 토큰을 전달하여 PLAIN을 통해 인증할 수 있습니다. 프로덕션의 경우 항상https://urls를 사용합니다. - 10
- 이를 JsonPath 필터 쿼리로 설정하여 검증 중에 JWT 액세스 토큰에 추가 사용자 지정 규칙을 적용할 수 있습니다. 액세스 토큰에 필요한 데이터가 포함되어 있지 않으면 거부됩니다.
introspectionEndpointUri를 사용하는 경우 사용자 정의 검사가 인트로스펙션 엔드포인트 응답 JSON에 적용됩니다. - 11
- 토큰 끝점에 전달된
audience매개변수입니다. 대상 은broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다.clientId및secret을 사용하는 PLAIN 클라이언트 인증의 OAuth 2.0용 클라이언트 이름에도 사용됩니다. 이는 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠에만 영향을 미칩니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다. - 12
- 토큰 끝점에 전달된
scope매개변수입니다. 범위는 broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다.clientId및secret을 사용하는 PLAIN 클라이언트 인증의 OAuth 2.0용 클라이언트 이름에도 사용됩니다. 이는 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠에만 영향을 미칩니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다. - 13
- 권한 부여 서버에 연결할 때 연결 시간(초)입니다. 기본값은 60입니다.
- 14
- 권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
- 15
- 권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은
0입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면connectTimeoutSeconds및readTimeoutSeconds옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다. - 16
- 권한 부여 서버에 실패한 HTTP 요청을 다시 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 있으므로 일시 중지가 적용되지 않습니다. 이는 실패한 요청을 유발하는 많은 문제가 요청당 네트워크 결함 또는 프록시 문제로 인해 신속하게 해결할 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하가 발생하거나 트래픽이 많은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 성공적인 재시도 가능성을 높일 수 있습니다.
- 17
- JWT 토큰 또는 인트로스펙션 엔드포인트 응답에서 그룹 정보를 추출하는 데 사용되는 JsonPath 쿼리입니다. 이 옵션은 기본적으로 설정되어 있지 않습니다. 이 옵션을 구성하면 사용자 정의 작성자가 사용자 그룹을 기반으로 권한 부여 결정을 내릴 수 있습니다.
- 18
- 그룹으로 구분된 단일 문자열로 반환될 때 그룹 정보를 구문 분석하는 데 사용되는 구분 기호입니다. 기본값은 ',' (comma)입니다.
- 19
- 일부 인증 서버는
Accept: application/json헤더를 보내는 클라이언트에 문제가 있습니다.includeAcceptHeader: false를 설정하면 헤더가 전송되지 않습니다. 기본값은true입니다.
- 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.
다음에 수행할 작업
15.4.6.3. OAuth 2.0을 사용하도록 Kafka Java 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커와의 상호 작용에 OAuth 2.0을 사용하도록 Kafka 생산자 및 소비자 API를 구성합니다. 클라이언트 pom.xml 파일에 콜백 플러그인을 추가한 다음 OAuth 2.0에 대해 클라이언트를 구성합니다.
클라이언트 구성에 다음을 지정합니다.
SASL(Simple Authentication and Security Layer) 보안 프로토콜:
-
TLS 암호화 연결을 통한 인증을 위한
SASL_SSL 암호화되지 않은 연결을 통한 인증을 위한
SASL_PLAINTEXT프로덕션에는
SASL_SSL을 사용하고 로컬 개발에는SASL_PLAINTEXT를 사용하십시오.SASL_SSL을 사용하는 경우 추가ssl.truststore구성이 필요합니다. OAuth 2.0 권한 부여 서버에 대한 보안 연결(https://)을 위해서는 truststore 구성이 필요합니다. OAuth 2.0 권한 부여 서버를 확인하려면 인증 서버의 CA 인증서를 클라이언트 구성의 신뢰 저장소에 추가합니다. PEM 또는 PKCS #12 형식으로 신뢰 저장소를 구성할 수 있습니다.
-
TLS 암호화 연결을 통한 인증을 위한
Kafka SASL 메커니즘:
-
전달자 토큰을 사용하여 인증 정보 교환을 위한
OAUTHBEARER -
클라이언트 인증 정보(clientId + 시크릿) 또는 액세스 토큰을 전달하는
PLAIN
-
전달자 토큰을 사용하여 인증 정보 교환을 위한
SASL 메커니즘을 구현하는 JAAS(Java Authentication and Authorization Service) 모듈:
-
org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule은 OAuthbearer 메커니즘을 구현합니다. -
org.apache.kafka.common.security.plain.PlainLoginModule은 일반 메커니즘을 구현합니다.
OAuthbearer 메커니즘을 사용할 수 있으려면 사용자 정의
io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler클래스를 콜백 처리기로 추가해야 합니다.JaasClientOauthLoginCallbackHandler는 클라이언트 로그인 중에 토큰을 액세스하기 위해 권한 부여 서버로의 OAuth 콜백을 처리합니다. 이를 통해 자동 토큰 갱신을 통해 사용자 개입 없이 지속적인 인증을 보장할 수 있습니다. 또한 OAuth 2.0 암호 부여 방법을 사용하여 클라이언트의 로그인 인증 정보를 처리합니다.-
SASL 인증 속성은 다음 인증 방법을 지원합니다.
- OAuth 2.0 클라이언트 인증 정보
- OAuth 2.0 암호 부여(더 이상 사용되지 않음)
- 액세스 토큰
- 토큰 새로 고침
SASL 인증 속성을 JAAS 구성(
sasl.jaas.config및sasl.login.callback.handler.class)으로 추가합니다. 인증 속성을 구성하는 방법은 OAuth 2.0 권한 부여 서버에 액세스하기 위해 사용 중인 인증 방법에 따라 다릅니다. 이 절차에서 속성은 속성 파일에 지정 된 다음 클라이언트 구성에 로드됩니다.In this procedure, the properties are specified in a properties file, then loaded into the client configuration.
인증 속성을 환경 변수로 지정하거나 Java 시스템 속성으로 지정할 수도 있습니다. Java 시스템 속성의 경우 setProperty 를 사용하여 설정하고 -D 옵션을 사용하여 명령줄에서 전달할 수 있습니다.
사전 요구 사항
- Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
- OAuth 2.0 권한 부여 서버가 Kafka 브로커에 대한 OAuth 액세스용으로 배포 및 구성됨
- Kafka 브로커는 OAuth 2.0으로 구성되어 있습니다.
프로세스
OAuth 2.0 지원이 포함된 클라이언트 라이브러리를 Kafka 클라이언트의
pom.xml파일에 추가합니다.<dependency> <groupId>io.strimzi</groupId> <artifactId>kafka-oauth-client</artifactId> <version>0.15.0.redhat-00007</version> </dependency>속성 파일에 다음 구성을 지정하여 클라이언트 속성을 구성합니다.
- 보안 프로토콜
- SASL 메커니즘
사용 방법에 따른 JAAS 모듈 및 인증 속성
예를 들어
client.properties파일에 다음을 추가할 수 있습니다.클라이언트 인증 메커니즘 속성
security.protocol=SASL_SSL1 sasl.mechanism=OAUTHBEARER2 ssl.truststore.location=/tmp/truststore.p123 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \4 oauth.client.id="<client_id>" \5 oauth.client.secret="<client_secret>" \6 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \7 oauth.ssl.truststore.password="$STOREPASS" \8 oauth.ssl.truststore.type="PKCS12" \9 oauth.scope="<scope>" \10 oauth.audience="<audience>" ;11 sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler- 1
- TLS 암호화 연결을 위한
SASL_SSL보안 프로토콜. 로컬 개발을 위해 암호화되지 않은 연결보다SASL_PLAINTEXT를 사용하십시오. - 2
OAUTHBEARER또는PLAIN으로 지정된 SASL 메커니즘 .- 3
- Kafka 클러스터에 대한 보안 액세스를 위한 신뢰 저장소 구성입니다.
- 4
- 권한 부여 서버 토큰 끝점의 URI입니다.
- 5
- 권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
- 6
- 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
- 7
- 위치에는 권한 부여 서버의 공개 키 인증서(
truststore.p12)가 포함되어 있습니다. - 8
- truststore에 액세스하기 위한 암호입니다.
- 9
- truststore 유형입니다.
- 10
- (선택 사항) 토큰 끝점에서 토큰을 요청하는
범위입니다. 권한 부여 서버에는 클라이언트가 범위를 지정해야 할 수 있습니다. - 11
- (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다.
권한 부여 서버에는 클라이언트가 대상을 지정해야 할 수 있습니다.
암호는 메커니즘 속성 부여
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \1 oauth.client.secret="<client_secret>" \2 oauth.password.grant.username="<username>" \3 oauth.password.grant.password="<password>" \4 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.scope="<scope>" \ oauth.audience="<audience>" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler- 1
- 권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
- 2
- (선택 사항) 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
- 3
- 암호 부여 인증의 사용자 이름입니다. OAuth 암호 부여 구성(사용자 이름 및 암호)은 OAuth 2.0 암호 부여 방법을 사용합니다. 암호 부여를 사용하려면 제한된 권한이 있는 권한 부여 서버에서 클라이언트에 대한 사용자 계정을 만듭니다. 계정은 서비스 계정처럼 작동해야 합니다. 인증에 사용자 계정이 필요하지만 새로 고침 토큰을 사용하는 것이 좋습니다.
- 4
- 암호 부여 인증입니다.참고
SASL PLAIN은 OAuth 2.0 암호 부여 방법을 사용하여 사용자 이름과 암호(암호 부여)를 전달하는 것을 지원하지 않습니다.
토큰 속성에 액세스
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.access.token="<access_token>" \1 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler- 1
- Kafka 클라이언트용 장기 액세스 토큰입니다.
토큰 속성 새로 고침
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \1 oauth.client.secret="<client_secret>" \2 oauth.refresh.token="<refresh_token>" \3 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
OAUTH 2.0 인증의 클라이언트 속성을 Java 클라이언트 코드에 입력합니다.
클라이언트 속성의 입력 표시 예
Properties props = new Properties(); try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) { props.load(reader); }- Kafka 클라이언트가 Kafka 브로커에 액세스할 수 있는지 확인합니다.
15.4.6.4. Kafka 구성 요소에 대한 OAuth 2.0 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 구성 요소를 구성하는 방법을 설명합니다.
다음에 대한 인증을 구성할 수 있습니다.
- Kafka Connect
- Kafka MirrorMaker
- Kafka Bridge
이 시나리오에서는 Kafka 구성 요소와 권한 부여 서버가 동일한 클러스터에서 실행되고 있습니다.
시작하기 전
Kafka 구성 요소에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 KafkaClientAuthenticationOAuth 스키마 참조를 참조하십시오. 스키마 참조에는 구성 옵션의 예가 포함되어 있습니다.
사전 요구 사항
- Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
- OAuth 2.0 권한 부여 서버가 Kafka 브로커에 대한 OAuth 액세스용으로 배포 및 구성됨
- Kafka 브로커는 OAuth 2.0으로 구성되어 있습니다.
프로세스
클라이언트 시크릿을 생성하고 구성 요소에 환경 변수로 마운트합니다.
예를 들어, 여기에서 Kafka 브리지의 클라이언트
시크릿을 생성하고 있습니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Secret metadata: name: my-bridge-oauth type: Opaque data: clientSecret: MGQ1OTRmMzYtZTllZS00MDY2LWI5OGEtMTM5MzM2NjdlZjQw1 - 1
clientSecret키는 base64 형식이어야 합니다.
인증 속성에 대해 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: oauth1 tokenEndpointUri: https://<auth-server-address>/auth/realms/master/protocol/openid-connect/token2 clientId: kafka-bridge clientSecret: secretName: my-bridge-oauth key: clientSecret tlsTrustedCertificates:3 - secretName: oauth-server-cert certificate: tls.crtOAuth 2.0 인증 적용 방법과 권한 부여 서버 유형에 따라 다음을 사용할 수 있는 추가 구성 옵션이 있습니다.
# ... spec: # ... authentication: # ... disableTlsHostnameVerification: true1 checkAccessTokenType: false2 accessTokenIsJwt: false3 scope: any4 audience: kafka5 connectTimeoutSeconds: 606 readTimeoutSeconds: 607 httpRetries: 28 httpRetryPauseMs: 3009 includeAcceptHeader: false10 - 1
- (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은
false입니다. - 2
- 권한 부여 서버가 JWT 토큰 내에
typ(type) 클레임을 반환하지 않으면checkAccessTokenType: false를 적용하여 토큰 유형 검사를 건너뛸 수 있습니다. 기본값은true입니다. - 3
- 불투명 토큰을 사용하는 경우 액세스 토큰이 JWT 토큰으로 처리되지 않도록
accessTokenIsJwt: false를 적용할 수 있습니다. - 4
- (선택 사항) 토큰 끝점에서 토큰을 요청하는
범위입니다. 권한 부여 서버에는 클라이언트가 범위를 지정해야 할 수 있습니다. 이경우 모든. - 5
- (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다.
권한 부여 서버에는 클라이언트가 대상을 지정해야 할 수 있습니다. 이 경우kafka입니다. - 6
- (선택 사항) 권한 부여 서버에 연결할 때 연결 시간 초과(초)입니다. 기본값은 60입니다.
- 7
- (선택 사항) 권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
- 8
- (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은
0입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면connectTimeoutSeconds및readTimeoutSeconds옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다. - 9
- (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 다시 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 있으므로 일시 중지가 적용되지 않습니다. 이는 실패한 요청을 유발하는 많은 문제가 요청당 네트워크 결함 또는 프록시 문제로 인해 신속하게 해결할 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하가 발생하거나 트래픽이 많은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 성공적인 재시도 가능성을 높일 수 있습니다.
- 10
- (선택 사항) 일부 인증 서버는
Accept: application/json헤더를 보내는 클라이언트에 문제가 있습니다.includeAcceptHeader: false를 설정하면 헤더가 전송되지 않습니다. 기본값은true입니다.
Kafka 리소스의 배포에 변경 사항을 적용합니다.
oc apply -f your-file로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w롤링 업데이트는 OAuth 2.0 인증을 사용하여 Kafka 브로커와 상호 작용하기 위한 구성 요소를 구성합니다.
15.5. OAuth 2.0 토큰 기반 권한 부여 사용 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 Red Hat Single Sign-On 인증 서비스를 통해 OAuth 2.0 토큰 기반 권한 사용을 지원하므로 보안 정책과 권한을 중앙에서 관리할 수 있습니다.
Red Hat Single Sign-On에 정의된 보안 정책 및 권한은 Kafka 브로커의 리소스에 대한 액세스 권한을 부여하는 데 사용됩니다. 사용자와 클라이언트는 Kafka 브로커에서 특정 작업을 수행하기 위해 액세스를 허용하는 정책과 일치합니다.
Kafka는 기본적으로 모든 사용자에게 브로커에 대한 전체 액세스를 허용하며 AclAuthorizer 및 StandardAuthorizer 플러그인도 제공하여 ACL(Access Control Lists)을 기반으로 권한 부여를 구성합니다. 이러한 플러그인에서 관리하는 ACL 규칙은 사용자 이름을 기반으로 리소스에 대한 액세스 권한을 부여하거나 거부하는 데 사용되며 이러한 규칙은 Kafka 클러스터 자체에 저장됩니다. 그러나 Red Hat Single Sign-On을 사용한 OAuth 2.0 토큰 기반 권한 부여는 Kafka 브로커에 대한 액세스 제어를 구현하는 방법에 대한 유연성을 훨씬 높여 줍니다. 또한 OAuth 2.0 권한 부여 및 ACL을 사용하도록 Kafka 브로커를 구성할 수 있습니다.
15.5.1. OAuth 2.0 인증 메커니즘 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 스트림의 OAuth 2.0 인증에서는 Red Hat Single Sign-On 서버 권한 부여 REST 끝점을 사용하여 특정 사용자에게 정의된 보안 정책을 적용하고 해당 사용자의 다른 리소스에 부여된 권한 목록을 제공하여 Red Hat Single Sign-On을 사용하여 토큰 기반 인증을 확장합니다. 정책은 역할과 그룹을 사용하여 사용자와 권한을 일치시킵니다. OAuth 2.0 권한 부여는 Red Hat Single Sign-On 인증 서비스에서 사용자에 대한 수신된 권한 목록을 기반으로 권한을 로컬로 적용합니다.
15.5.1.1. Kafka 브로커 사용자 정의 승인 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat Single Sign-On 승인자 (KeycloakAuthorizer)는 Apache Kafka용 Streams와 함께 제공됩니다. Red Hat Single Sign-On에서 제공하는 권한 부여 서비스에 Red Hat Single Sign-On REST 엔드포인트를 사용하려면 Kafka 브로커에서 사용자 지정 승인자를 구성합니다.
인증자는 필요에 따라 권한 부여 서버에서 부여된 권한 목록을 가져와서 Kafka 브로커에 로컬로 권한 부여를 적용하여 각 클라이언트 요청에 대해 신속하게 권한 부여 결정을 내립니다.
15.5.2. OAuth 2.0 권한 부여 지원 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Red Hat Single Sign-On 인증 서비스를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 브로커를 구성하는 방법을 설명합니다.
사전 준비 사항
필요한 액세스 또는 특정 사용자에 대해 제한하려는 경우를 고려하십시오. Red Hat Single Sign-On 그룹,역할,클라이언트 및 사용자를 결합하여 Red Hat Single Sign-On에서 액세스를 구성할 수 있습니다.
일반적으로 그룹은 조직 부서 또는 지리적 위치를 기반으로 사용자와 일치시키는 데 사용됩니다. 및 역할은 해당 기능을 기반으로 사용자와 일치시키는 데 사용됩니다.
Red Hat Single Sign-On을 사용하면 사용자와 그룹을 LDAP에 저장할 수 있지만 클라이언트와 역할은 이러한 방식으로 저장할 수 없습니다. 사용자 데이터에 대한 스토리지 및 액세스는 권한 부여 정책 구성 방법의 요소가 될 수 있습니다.
Super 사용자는 Kafka 브로커에서 구현된 권한 부여에 관계없이 항상 Kafka 브로커에 대한 무제한 액세스 권한을 갖습니다.
사전 요구 사항
- Apache Kafka용 스트림은 토큰 기반 인증에 Red Hat Single Sign-On과 함께 OAuth 2.0을 사용하도록 구성해야 합니다. 권한 부여를 설정할 때 동일한 Red Hat Single Sign-On 서버 끝점을 사용합니다.
-
재인증을 활성화하려면
maxSecondsWithoutReauthentication옵션을 사용하여 OAuth 2.0 인증을 구성해야 합니다.
프로세스
- Red Hat Single Sign-On 관리 콘솔에 액세스하거나 Red Hat Single Sign-On 관리 CLI를 사용하여 OAuth 2.0 인증을 설정할 때 생성한 Kafka 브로커 클라이언트에 대한 인증 서비스를 활성화합니다.
- 인증 서비스를 사용하여 클라이언트에 대한 리소스, 권한 부여 범위, 정책 및 권한을 정의합니다.
- 역할 및 그룹을 할당하여 사용자 및 클라이언트에 권한을 바인딩합니다.
편집기에서 Kafka 리소스의 Kafka 브로커 구성(
Kafka.spec.kafka)을 업데이트하여 Red Hat Single Sign-On 권한을 사용하도록Kafka브로커를 구성합니다.oc edit kafka my-clusterkeycloak인증을 사용하고 권한 부여 서버 및 권한 부여 서비스에 액세스할 수 있도록 Kafka 브로커kafka구성을 구성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... authorization: type: keycloak1 tokenEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/token>2 clientId: kafka3 delegateToKafkaAcls: false4 disableTlsHostnameVerification: false5 superUsers:6 - CN=fred - sam - CN=edward tlsTrustedCertificates:7 - secretName: oauth-server-cert certificate: ca.crt grantsRefreshPeriodSeconds: 608 grantsRefreshPoolSize: 59 grantsMaxIdleSeconds: 30010 grantsGcPeriodSeconds: 30011 grantsAlwaysLatest: false12 connectTimeoutSeconds: 6013 readTimeoutSeconds: 6014 httpRetries: 215 enableMetrics: false16 includeAcceptHeader: false17 #...- 1
- 유형
keycloak에서는 Red Hat Single Sign-On 권한 부여를 활성화합니다. - 2
- Red Hat Single Sign-On 토큰 끝점의 URI입니다. 프로덕션의 경우 항상
https://urls를 사용합니다. 토큰 기반oauth인증을 구성할 때 로컬 JWT 검증을 위한 URI로jwksEndpointUri를 지정합니다.tokenEndpointUriURI의 호스트 이름은 동일해야 합니다. - 3
- 권한 부여 서비스가 활성화된 Red Hat Single Sign-On의 OAuth 2.0 클라이언트 정의의 클라이언트 ID입니다. 일반적으로
kafka는 ID로 사용됩니다. - 4
- (선택 사항) Red Hat Single Sign-On 권한 부여 정책에서 액세스가 거부되는 경우 Kafka
AclAuthorizer및StandardAuthorizer에 대한 권한을 위임합니다. 기본값은false입니다. - 5
- (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은
false입니다. - 6
- (선택 사항) 슈퍼유저 지정.
- 7
- (선택 사항) 권한 부여 서버에 대한 TLS 연결에 대한 신뢰할 수 있는 인증서입니다.
- 8
- (선택 사항) 두 개의 연속 부여 새로 고침 실행 사이의 시간입니다. 이는 Red Hat Single Sign-On에서 사용자의 권한 변경을 감지할 수 있는 활성 세션의 최대 시간입니다. 기본값은 60입니다.
- 9
- (선택 사항) 활성 세션에 대한 권한 부여를 새로 고치는 데 사용할 스레드 수입니다. 기본값은 5입니다.
- 10
- (선택 사항) 캐시의 유휴 부여를 제거할 수 있는 시간(초)입니다. 기본값은 300입니다.
- 11
- (선택 사항) 캐시에서 오래된 권한을 정리하는 작업의 연속 실행 사이의 시간(초)입니다. 기본값은 300입니다.
- 12
- (선택 사항) 새 세션에 대한 최신 권한을 가져올지 여부를 제어합니다. 활성화하면 Red Hat Single Sign-On에서 권한을 검색하고 사용자에게 캐시됩니다. 기본값은
false입니다. - 13
- (선택 사항) Red Hat Single Sign-On 토큰 끝점에 연결할 때 연결 시간(초)입니다. 기본값은 60입니다.
- 14
- (선택 사항) Red Hat Single Sign-On 토큰 끝점에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
- 15
- (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 일시 중지하지 않고 재시도할 최대 횟수입니다. 기본값은
0입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면connectTimeoutSeconds및readTimeoutSeconds옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다. - 16
- (선택 사항) OAuth 메트릭을 활성화하거나 비활성화합니다. 기본값은
false입니다. - 17
- (선택 사항) 일부 인증 서버는
Accept: application/json헤더를 보내는 클라이언트에 문제가 있습니다.includeAcceptHeader: false를 설정하면 헤더가 전송되지 않습니다. 기본값은true입니다.
- 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.
oc logs -f ${POD_NAME} -c kafka oc get pod -w롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.
- Kafka 브로커에 특정 역할이 있는 클라이언트 또는 사용자로 액세스하여 구성된 권한에 액세스하고 필요한 액세스 권한이 있는지 또는 권한이 없는지 확인합니다.
15.5.3. Red Hat Single Sign-On 인증 서비스에서 정책 및 권한 관리 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션에서는 Red Hat Single Sign-On 인증 서비스 및 Kafka에서 사용하는 권한 부여 모델에 대해 설명하고 각 모델에서 중요한 개념을 정의합니다.
Kafka 액세스 권한을 부여하려면 Red Hat Single Sign-On에서 OAuth 클라이언트 사양 을 생성하여 Red Hat Single Sign-On 인증 서비스 오브젝트를 Kafka 리소스에 매핑할 수 있습니다. Kafka 권한은 Red Hat Single Sign-On 인증 서비스 규칙을 사용하여 사용자 계정 또는 서비스 계정에 부여됩니다.
주제 생성 및 나열과 같이 일반적인 Kafka 작업에 필요한 다양한 사용자 권한의 예 는 다음과 같습니다.
15.5.3.1. Kafka 및 Red Hat Single Sign-On 권한 부여 모델 개요 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 및 Red Hat Single Sign-On 인증 서비스는 다른 권한 부여 모델을 사용합니다.
Kafka 인증 모델
Kafka의 권한 부여 모델에서는 리소스 유형을 사용합니다. Kafka 클라이언트가 브로커에서 작업을 수행할 때 브로커는 구성된 KeycloakAuthorizer 를 사용하여 작업 및 리소스 유형에 따라 클라이언트의 권한을 확인합니다.
Kafka는 5가지 리소스 유형을 사용하여 액세스 권한을 제어합니다. Topic,Group,Cluster,TransactionalId, DelegationToken. 각 리소스 유형에는 사용 가능한 권한 세트가 있습니다.
주제
-
개발 -
쓰기 -
읽기 -
delete -
describe -
DescribeConfigs -
변경 -
AlterConfigs
그룹
-
읽기 -
describe -
delete
Cluster
-
개발 -
describe -
변경 -
DescribeConfigs -
AlterConfigs -
IdempotentWrite -
ClusterAction
TransactionalId
-
describe -
쓰기
DelegationToken
-
describe
Red Hat Single Sign-On 인증 서비스 모델
Red Hat Single Sign-On 인증 서비스 모델에는 리소스, 권한 부여범위,정책 및 권한 의 정의 및 부여를 위한 네 가지 개념이 있습니다.
- Resources
- 리소스는 허용된 작업과 리소스를 일치시키는 데 사용되는 리소스 정의 집합입니다. 리소스는 개별 주제일 수 있습니다(예: 동일한 접두사로 시작하는 이름이 있는 모든 주제). 리소스 정의는 사용 가능한 모든 작업 세트를 나타내는 사용 가능한 권한 부여 범위 세트와 연결됩니다. 이러한 작업의 하위 집합만 실제로 허용됩니다.
- 권한 부여 범위
- 권한 부여 범위는 특정 리소스 정의에서 사용 가능한 모든 작업 세트입니다. 새 리소스를 정의할 때 모든 범위 집합에서 범위를 추가합니다.
- Policies
정책은 계정 목록과 일치하도록 기준을 사용하는 권한 부여 규칙입니다. 정책은 다음과 일치할 수 있습니다.
- 클라이언트 ID 또는 역할을 기반으로 하는 서비스 계정
- 사용자 이름, 그룹 또는 역할을 기반으로 하는 사용자 계정 입니다.
- 권한
- 권한은 특정 리소스 정의의 권한 부여 범위 하위 집합을 사용자 집합에 부여합니다.
15.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 입니다. Apache Kafka용 Streams와 함께 제공되는 구성 파일의 예 는 kafka 를 OAuth 클라이언트 ID로 사용합니다.
Kafka 클러스터가 여러 개인 경우 모두 단일 OAuth 클라이언트(kafka)를 사용할 수 있습니다. 그러면 권한 부여 규칙을 정의하고 관리할 수 있는 단일 통합 공간이 제공됩니다. 그러나 다른 OAuth 클라이언트 ID(예: my-cluster-kafka 또는 cluster-dev-kafka)를 사용하고 각 클라이언트 구성 내에서 각 클러스터에 대한 권한 부여 규칙을 정의할 수도 있습니다.
kafka 클라이언트 정의에는 Red Hat Single Sign-On 관리 콘솔에서 Authorization Enabled 옵션이 활성화되어 있어야 합니다.
모든 권한은 kafka 클라이언트 범위 내에 있습니다. 다른 OAuth 클라이언트 ID로 구성된 Kafka 클러스터가 있는 경우 각각 동일한 Red Hat Single Sign-On 영역의 일부인 경우에도 별도의 권한 세트가 필요합니다.
Kafka 클라이언트가 OAUTHBEARER 인증을 사용하는 경우 Red Hat Single Sign-On 승인자(KeycloakAuthorizer)는 현재 세션의 액세스 토큰을 사용하여 Red Hat Single Sign-On 서버에서 권한 부여 목록을 검색합니다. 권한을 검색하기 위해 인증자는 Red Hat Single Sign-On 인증 서비스 정책 및 권한을 평가합니다.
Kafka 권한에 대한 권한 부여 범위
초기 Red Hat Single Sign-On 구성은 일반적으로 권한 부여 범위를 업로드하여 각 Kafka 리소스 유형에서 수행할 수 있는 모든 가능한 작업 목록을 생성합니다. 이 단계는 권한을 정의하기 전에 한 번만 수행됩니다. 권한 부여 범위를 업로드하는 대신 수동으로 추가할 수 있습니다.
권한 부여 범위에는 리소스 유형에 관계없이 사용 가능한 모든 Kafka 권한이 포함되어야 합니다.
-
개발 -
쓰기 -
읽기 -
delete -
describe -
변경 -
DescribeConfig -
AlterConfig -
ClusterAction -
IdempotentWrite
권한(예: IdempotentWrite)이 필요하지 않은 경우 권한 부여 범위 목록에서 생략할 수 있습니다. 그러나 해당 권한은 Kafka 리소스에서 대상으로 지정할 수 없습니다.
권한 검사에 대한 리소스 패턴
리소스 패턴은 권한 검사를 수행할 때 대상 리소스와 일치하는 패턴에 사용됩니다. 일반적인 패턴 형식은 RESOURCE-TYPE:PATTERN-NAME 입니다.
리소스 유형은 Kafka 권한 부여 모델을 미러링합니다. 이 패턴은 두 가지 일치 옵션을 허용합니다.
-
정확한 일치(패턴이
*로 끝나지 않는 경우) -
접두사 일치(패턴이
*로 종료되면 )
리소스에 대한 패턴 예
Topic:my-topic
Topic:orders-*
Group:orders-*
Cluster:*
또한 일반 패턴 형식 접두사는 kafka-cluster:CLUSTER-NAME 뒤에 쉼표를 사용할 수 있습니다. 여기서 CLUSTER-NAME 은 Kafka 사용자 정의 리소스의 metadata.name 을 나타냅니다.
클러스터 접두사가 있는 리소스의 패턴 예
kafka-cluster:my-cluster,Topic:*
kafka-cluster:*,Group:b_*
kafka-cluster 접두사가 없는 경우 kafka-cluster:* 로 간주됩니다.
리소스를 정의할 때 리소스와 관련된 가능한 권한 부여 범위 목록과 연결할 수 있습니다. 대상 리소스 유형에 적합한 작업을 설정합니다.
모든 리소스에 권한 부여 범위를 추가할 수 있지만 리소스 유형에서 지원하는 범위만 액세스 제어로 간주됩니다.
액세스 권한 적용을 위한 정책
정책은 하나 이상의 사용자 계정 또는 서비스 계정에 대한 권한을 대상으로 하는 데 사용됩니다. 대상 지정은 다음을 참조할 수 있습니다.
- 특정 사용자 또는 서비스 계정
- 영역 역할 또는 클라이언트 역할
- 사용자 그룹
- 클라이언트 IP 주소와 일치하는 JavaScript 규칙
정책에는 고유한 이름이 지정되며 여러 리소스에 대한 여러 권한을 대상으로 하는 데 재사용할 수 있습니다.
액세스 권한 부여
세분화된 권한을 사용하여 사용자에게 액세스 권한을 부여하는 정책, 리소스 및 권한 부여 범위를 함께 가져옵니다.
각 권한의 이름은 사용자에게 부여하는 권한을 명확하게 정의해야 합니다. 예를 들어 Dev Team B는 x 로 시작하는 주제에서 읽을 수 있습니다.
15.5.3.3. Kafka 작업에 필요한 권한 예 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제에서는 Kafka에서 일반적인 작업을 수행하는 데 필요한 사용자 권한을 보여줍니다.
주제 생성
주제를 만들려면 특정 주제 또는 Cluster:kafka-cluster 에 대한 Create 권한이 필요합니다.
bin/kafka-topics.sh --create --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
주제 목록
사용자에게 지정된 항목에 대한 설명 권한이 있는 경우 항목이 나열됩니다.
bin/kafka-topics.sh --list \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
주제 세부 정보 표시
주제의 세부 정보를 표시하려면 주제에 대해 설명하고 DescribeConfigs 권한이 필요합니다.
bin/kafka-topics.sh --describe --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
항목에 메시지 생성
항목에 대한 메시지를 생성하려면 항목에 대해 설명 및 쓰기 권한이 필요합니다.
주제가 아직 생성되지 않았으며 자동 생성 항목이 활성화되어 있는 경우 주제를 만들 수 있는 권한이 필요합니다.
bin/kafka-console-producer.sh --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties
주제의 메시지 사용
주제의 메시지를 사용하려면 주제에서 설명 및 읽기 권한이 필요합니다. 주제에서 사용하는 것은 일반적으로 소비자 그룹에 소비자 오프셋을 저장하는 데 의존하며, 소비자 그룹에 대한 추가 설명 및 읽기 권한이 필요합니다.
일치하려면 두 개의 리소스가 필요합니다. 예를 들면 다음과 같습니다.
Topic:my-topic
Group:my-group-*
bin/kafka-console-consumer.sh --topic my-topic --group my-group-1 --from-beginning \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --consumer.config /tmp/config.properties
idempotent 생산자를 사용하여 주제로 메시지 생성
주제를 생성하는 권한뿐만 아니라 Cluster:kafka-cluster 리소스에 추가 IdempotentWrite 권한이 필요합니다.
일치하려면 두 개의 리소스가 필요합니다. 예를 들면 다음과 같습니다.
Topic:my-topic
Cluster:kafka-cluster
bin/kafka-console-producer.sh --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties --producer-property enable.idempotence=true --request-required-acks -1
소비자 그룹 나열
소비자 그룹을 나열할 때 사용자에게 권한이 있는 그룹 만 반환됩니다. 또는 사용자에게 Cluster:kafka-cluster 에 대한 Describe 권한이 있는 경우 모든 소비자 그룹이 반환됩니다.
bin/kafka-consumer-groups.sh --list \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
소비자 그룹 세부 정보 표시
소비자 그룹의 세부 정보를 표시하려면 그룹 및 그룹과 연결된 항목에 대한 설명이 필요합니다.
bin/kafka-consumer-groups.sh --describe --group my-group-1 \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
주제 구성 변경
주제의 구성을 변경하려면 설명 및 대체 권한이 필요합니다.
bin/kafka-topics.sh --alter --topic my-topic --partitions 2 \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
Kafka 브로커 구성 표시
kafka-configs.sh 를 사용하여 브로커의 구성을 가져오려면 Cluster:kafka-cluster 에 DescribeConfigs 권한이 필요합니다.
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 에 DescribeConfig 및 AlterConfigs 권한이 필요합니다.
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-cluster 에 Alter 권한이 필요합니다.
bin/kafka-leader-election.sh --topic my-topic --partition 0 --election-type PREFERRED /
--bootstrap-server my-cluster-kafka-bootstrap:9092 --admin.config /tmp/config.properties
파티션 재할당
파티션 재할당 파일을 생성하려면 관련 항목에 대한 권한이 필요합니다.
bin/kafka-reassign-partitions.sh --topics-to-move-json-file /tmp/topics-to-move.json --broker-list "0,1" --generate \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties > /tmp/partition-reassignment.json
파티션 재할당을 실행하려면 Cluster:kafka-cluster 에 대해 설명합니다. 또한 관련 항목에 대한 사용 권한이 필요합니다. Describe permissions are required on the topics involved.
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --execute \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
파티션 재할당을 확인하려면 Cluster:kafka-cluster 및 관련된 각 항목에 대해 파티션 재할당, AlterConfigs 권한이 필요합니다.
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --verify \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
15.5.4. Red Hat Single Sign-On 인증 서비스 사용 링크 복사링크가 클립보드에 복사되었습니다!
이 예에서는 Red Hat Single Sign-On 인증 서비스와 keycloak 권한을 사용하는 방법을 설명합니다. Red Hat Single Sign-On 권한 부여 서비스를 사용하여 Kafka 클라이언트에 대한 액세스 제한을 적용합니다. Red Hat Single Sign-On 인증 서비스는 권한 부여 범위, 정책 및 권한을 사용하여 리소스에 액세스 제어를 정의하고 적용합니다.
Red Hat Single Sign-On 권한 부여 서비스 REST 끝점은 인증된 사용자를 위한 리소스에 대한 권한 부여 목록을 제공합니다. 권한 부여 목록은 Kafka 클라이언트가 인증된 세션을 설정한 후 첫 번째 작업으로 Red Hat Single Sign-On 서버에서 가져옵니다. 해당 권한 부여에 대한 변경 사항이 감지되도록 백그라운드에서 목록이 새로 고쳐집니다. 부여는 각 사용자 세션에 대해 Kafka 브로커에 로컬로 캐시되고 적용되어 빠른 권한 부여 결정을 제공합니다.
Apache Kafka의 스트림은 구성 파일 예제 를 제공합니다. 여기에는 Red Hat Single Sign-On을 설정하기 위한 다음 예제 파일이 포함됩니다.
kafka-ephemeral-oauth-single-keycloak-authz.yaml-
Red Hat Single Sign-On을 사용하여 OAuth 2.0 토큰 기반 권한 부여용으로 구성된
Kafka사용자 정의 리소스의 예입니다. 사용자 정의 리소스를 사용하여keycloak권한 부여 및 토큰 기반oauth인증을 사용하는 Kafka 클러스터를 배포할 수 있습니다. kafka-authz-realm.json- 샘플 그룹, 사용자, 역할 및 클라이언트로 구성된 Red Hat Single Sign-On 영역의 예입니다. 이 영역을 Red Hat Single Sign-On 인스턴스로 가져와 Kafka에 액세스할 수 있는 세분화된 권한을 설정할 수 있습니다.
Red Hat Single Sign-On에서 예제를 시도하려면 이러한 파일을 사용하여 표시된 순서대로 이 섹션에 설명된 작업을 수행합니다.
인증
토큰 기반 oauth 인증을 구성할 때 로컬 JWT 검증을 위한 URI로 jwksEndpointUri 를 지정합니다. keycloak 권한을 구성할 때 tokenEndpointUri 를 Red Hat Single Sign-On 토큰 끝점의 URI로 지정합니다. 두 URI의 호스트 이름은 동일해야 합니다.
그룹 또는 역할 정책을 사용하여 대상 권한
Red Hat Single Sign-On에서 서비스 계정이 활성화된 기밀 클라이언트는 클라이언트 ID와 시크릿을 사용하여 자체 이름으로 서버에 인증할 수 있습니다. 이는 일반적으로 특정 사용자의 에이전트(예: 웹 사이트)가 아닌 자체 이름으로 작동하는 마이크로 서비스에 편리합니다. 서비스 계정에는 일반 사용자와 같이 할당된 역할이 있을 수 있습니다. 그러나 그룹에는 할당될 수 없습니다. 결과적으로 서비스 계정을 사용하여 마이크로 서비스에 대한 권한을 대상으로 지정하려면 그룹 정책을 사용할 수 없으며 대신 역할 정책을 사용해야 합니다. 반대로 사용자 이름과 암호를 사용한 인증이 필요한 일반 사용자 계정으로만 특정 권한을 제한하려면 역할 정책이 아닌 그룹 정책을 사용하는 부작용으로 이를 수행할 수 있습니다. 이 예제에서는 ClusterManager 로 시작하는 권한에 사용됩니다. 클러스터 관리 수행은 일반적으로 CLI 툴을 사용하여 대화식으로 수행됩니다. 결과 액세스 토큰을 사용하여 Kafka 브로커에 인증하기 전에 사용자가 로그인해야 합니다. 이 경우 액세스 토큰은 클라이언트 애플리케이션이 아닌 특정 사용자를 나타냅니다.
15.5.4.1. Red Hat Single Sign-On 관리 콘솔에 액세스 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat Single Sign-On을 설정한 다음 관리 콘솔에 연결하고 사전 구성된 영역을 추가합니다. 예제 kafka-authz-realm.json 파일을 사용하여 영역을 가져옵니다. Admin Console에서 영역에 대해 정의된 권한 부여 규칙을 확인할 수 있습니다. 이 규칙은 예제 Red Hat Single Sign-On 영역을 사용하도록 구성된 Kafka 클러스터의 리소스에 대한 액세스 권한을 부여합니다.
사전 요구 사항
- 실행 중인 OpenShift 클러스터입니다.
-
사전 구성된 영역이 포함된 Apache Kafka
예제/security/keycloak-authorization/kafka-authz-realm.json파일의 Streams입니다.
프로세스
- Red Hat Single Sign-On 설명서의 서버 설치 및 구성에 설명된 대로 Red Hat Single Sign-On Operator를 사용하여 Red Hat Single Sign-On 서버 를 설치합니다.
- Red Hat Single Sign-On 인스턴스가 실행될 때까지 기다립니다.
관리 콘솔에 액세스할 수 있도록 외부 호스트 이름을 가져옵니다.
NS=sso oc get ingress keycloak -n $NS이 예에서는 Red Hat Single Sign-On 서버가
sso네임스페이스에서 실행되고 있다고 가정합니다.admin사용자의 암호를 가져옵니다.oc get -n $NS pod keycloak-0 -o yaml | less암호는 시크릿으로 저장되므로 Red Hat Single Sign-On 인스턴스에 대한 구성 YAML 파일을 가져와 시크릿 이름을 확인합니다(
secretKeyRef.name).시크릿 이름을 사용하여 일반 텍스트 암호를 가져옵니다.
SECRET_NAME=credential-keycloak oc get -n $NS secret $SECRET_NAME -o yaml | grep PASSWORD | awk '{print $2}' | base64 -D이 예에서는 시크릿 이름이
credential-keycloak이라고 가정합니다.사용자 이름
admin및 가져온 암호를 사용하여 관리 콘솔에 로그인합니다.https://HOSTNAME을 사용하여 KubernetesIngress에 액세스합니다.이제 관리 콘솔을 사용하여 Red Hat Single Sign-On에 예제 영역을 업로드할 수 있습니다.
- Add Cryostat 를 클릭하여 예제 영역을 가져옵니다.
examples/security/keycloak-authorization/kafka-authz-realm.json파일을 추가한 다음 만들기 를 클릭합니다.이제 관리 콘솔에서 현재 영역으로
kafka-authz가 있습니다.기본 보기에 마스터 영역이 표시됩니다.
Red Hat Single Sign-On 관리 콘솔에서 클라이언트 > kafka > 인증 > 설정으로 이동하여 의사 결정 전략이 유효한 것으로 설정되어 있는지 확인합니다.
확인 정책은 클라이언트가 Kafka 클러스터에 액세스하려면 하나 이상의 정책을 충족해야 함을 의미합니다.
Red Hat Single Sign-On 관리 콘솔에서 그룹,사용자,역할 및 클라이언트로 이동하여 영역 구성을 확인합니다.
- 그룹
-
그룹은사용자 그룹을 생성하고 사용자 권한을 설정하는 데 사용됩니다. 그룹은 이름이 할당된 사용자 집합입니다. 사용자를 지리적, 조직 또는 부서 단위로 구분하는 데 사용됩니다. 그룹을 LDAP ID 공급자에 연결할 수 있습니다. 예를 들어 Kafka 리소스에 대한 권한을 부여하기 위해 사용자 지정 LDAP 서버 admin 사용자 인터페이스를 통해 사용자에게 그룹의 멤버를 만들 수 있습니다. - 사용자
-
사용자는사용자를 생성하는 데 사용됩니다. 이 예제에서는alice및bob이 정의됩니다.Alice는ClusterManager그룹의 멤버이며bob은ClusterManager-my-cluster그룹의 멤버입니다. 사용자는 LDAP ID 공급자에 저장할 수 있습니다. - 역할
-
역할은사용자 또는 클라이언트가 특정 권한이 있는 것으로 표시합니다. 역할은 그룹과 유사한 개념입니다. 일반적으로 사용자를 조직 역할로 태그 하고 필수 권한이 있는 데 사용됩니다. 역할은 LDAP ID 공급자에 저장할 수 없습니다. LDAP가 요구 사항인 경우 대신 그룹을 사용하고 Red Hat Single Sign-On 역할을 그룹에 추가하여 사용자가 그룹에 할당되면 해당 역할도 가져올 수 있습니다. - 클라이언트
클라이언트에는 특정 구성이 있을 수 있습니다. 이 예제에서는 kafka ,,kafka-cliteam-a-client,team-b-client클라이언트가 구성됩니다.-
kafka클라이언트는 Kafka 브로커가 액세스 토큰 검증에 필요한 OAuth 2.0 통신을 수행하는 데 사용됩니다. 이 클라이언트에는 Kafka 브로커에서 권한 부여를 수행하는 데 사용되는 권한 부여 서비스 리소스 정의, 정책 및 권한 부여 범위도 포함되어 있습니다. 권한 부여 구성은 권한 부여 탭의kafka클라이언트에 정의되어 있으며, 설정 탭에서 인증 활성화 가 켜지면 표시됩니다. -
kafka-cli클라이언트는 액세스 토큰 또는 새로 고침 토큰을 가져오기 위해 사용자 이름 및 암호로 인증할 때 Kafka 명령줄 툴에서 사용하는 공용 클라이언트입니다. -
team-a-client및team-b-client클라이언트는 특정 Kafka 주제에 대한 부분적인 액세스 권한이 있는 서비스를 나타내는 기밀 클라이언트입니다.
-
Red Hat Single Sign-On 관리 콘솔에서 Authorization > Permissions 로 이동하여 영역에 정의된 리소스 및 정책을 사용하는 권한이 부여된 권한을 확인합니다.
예를 들어
kafka클라이언트에는 다음과 같은 권한이 있습니다.Dev Team A can write to topics that start with x_ on any cluster Dev Team B can read from topics that start with x_ on any cluster Dev Team B can update consumer group offsets that start with x_ on any cluster ClusterManager of my-cluster Group has full access to cluster config on my-cluster ClusterManager of my-cluster Group has full access to consumer groups on my-cluster ClusterManager of my-cluster Group has full access to topics on my-cluster- Dev 팀 A
-
Dev 팀 A 영역 역할은 모든 클러스터에서
x_로 시작하는 항목에 쓸 수 있습니다. 그러면Topic:x_*, 범위설명및쓰기및Dev 팀 A정책이라는 리소스가 결합됩니다.Dev 팀 A정책은Dev 팀 A라는 realm 역할이 있는 모든 사용자와 일치합니다. - Dev 팀 B
-
Dev 팀 B 영역 역할은 모든 클러스터에서
x_로 시작하는 주제에서 읽을 수 있습니다.주제:x_*,Group:x_*리소스,설명및읽기범위,Dev 팀 B정책이 결합됩니다.Dev 팀 B정책은Dev 팀 B라는 realm 역할이 있는 모든 사용자와 일치합니다. 일치 사용자 및 클라이언트는 주제에서 읽고x_로 시작하는 이름이 있는 주제 및 소비자 그룹에 대해 소비된 오프셋을 업데이트할 수 있습니다.
15.5.4.2. Red Hat Single Sign-On 권한 부여를 사용하여 Kafka 클러스터 배포 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat Single Sign-On 서버에 연결하도록 구성된 Kafka 클러스터를 배포합니다. 예제 kafka-ephemeral-oauth-single-keycloak-authz.yaml 파일을 사용하여 Kafka 클러스터를 Kafka 사용자 정의 리소스로 배포합니다. 이 예제에서는 keycloak 권한 부여 및 oauth 인증을 사용하여 단일 노드 Kafka 클러스터를 배포합니다.
사전 요구 사항
- Red Hat Single Sign-On 권한 부여 서버는 OpenShift 클러스터에 배포되고 example 영역을 사용하여 로드됩니다.
- Cluster Operator는 OpenShift 클러스터에 배포됩니다.
-
Apache Kafka
예제/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml사용자 정의 리소스입니다.
프로세스
배포한 Red Hat Single Sign-On 인스턴스의 호스트 이름을 사용하여 Kafka 브로커의 신뢰 저장소 인증서가 Red Hat Single Sign-On 서버와 통신할 수 있도록 준비합니다.
SSO_HOST=SSO-HOSTNAME SSO_HOST_PORT=$SSO_HOST:443 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $SSO_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/sso.pem보안(HTTPS) 연결을 위해 Kubernetes
Ingress를 사용하므로 인증서가 필요합니다.일반적으로 하나의 인증서가 없지만 인증서 체인이 있습니다.
/tmp/sso.pem파일에 마지막으로 나열된 최상위 발행자 CA만 제공해야 합니다. 수동으로 추출하거나 다음 명령을 사용하여 추출할 수 있습니다.인증서 체인에서 최상위 CA 인증서를 추출하는 명령의 예
split -p "-----BEGIN CERTIFICATE-----" sso.pem sso- for f in $(ls sso-*); do mv $f $f.pem; done cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt참고신뢰할 수 있는 CA 인증서는 일반적으로
openssl명령을 사용하지 않고 신뢰할 수 있는 소스에서 가져옵니다.OpenShift에 인증서를 시크릿으로 배포합니다.
oc create secret generic oauth-server-cert --from-file=/tmp/sso-ca.crt -n $NS호스트 이름을 환경 변수로 설정
SSO_HOST=SSO-HOSTNAME예제 Kafka 클러스터를 생성하고 배포합니다.
cat examples/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml | sed -E 's#\${SSO_HOST}'"#$SSO_HOST#" | oc create -n $NS -f -
15.5.4.3. CLI Kafka 클라이언트 세션에 대한 TLS 연결 준비 링크 복사링크가 클립보드에 복사되었습니다!
대화형 CLI 세션에 사용할 새 Pod를 생성합니다. TLS 연결을 위해 Red Hat Single Sign-On 인증서가 있는 신뢰 저장소를 설정합니다. 신뢰 저장소는 Red Hat Single Sign-On 및 Kafka 브로커에 연결하는 것입니다.
사전 요구 사항
Red Hat Single Sign-On 권한 부여 서버는 OpenShift 클러스터에 배포되고 example 영역을 사용하여 로드됩니다.
Red Hat Single Sign-On 관리 콘솔에서 클라이언트에 할당된 역할이 클라이언트 > 서비스 계정 역할에 표시되는지 확인합니다.
- Red Hat Single Sign-On과 연결하도록 구성된 Kafka 클러스터는 OpenShift 클러스터에 배포됩니다.
프로세스
Apache Kafka 이미지의 Streams를 사용하여 새 대화형 pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.
NS=sso oc run -ti --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 kafka-cli -n $NS -- /bin/sh참고이미지 다운로드에서
oc시간이 초과되면 후속 시도로 인해 AlreadyExists 오류가 발생할 수 있습니다.Pod 컨테이너에 연결합니다.
oc attach -ti kafka-cli -n $NSRed 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명령을 사용하지 않고 신뢰할 수 있는 소스에서 가져옵니다.Kafka 브로커에 대한 TLS 연결에 대한 신뢰 저장소를 생성합니다.
keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias sso -storepass $STOREPASS -import -file /tmp/sso-ca.crt -nopromptKafka 부트스트랩 주소를 Kafka 브로커의 호스트 이름으로 사용하고
tls리스너 포트(9093)를 사용하여 Kafka 브로커의 인증서를 준비합니다.KAFKA_HOST_PORT=my-cluster-kafka-bootstrap:9093 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $KAFKA_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/my-cluster-kafka.pem가져온
.pem파일은 일반적으로 하나의 인증서가 아니라 인증서 체인입니다./tmp/my-cluster-kafka.pem파일에 마지막으로 나열된 최상위 발행자 CA만 제공해야 합니다. 수동으로 추출하거나 다음 명령을 사용하여 추출할 수 있습니다.인증서 체인에서 최상위 CA 인증서를 추출하는 명령의 예
split -p "-----BEGIN CERTIFICATE-----" /tmp/my-cluster-kafka.pem kafka- for f in $(ls kafka-*); do mv $f $f.pem; done cp $(ls kafka-* | sort -r | head -n 1) my-cluster-kafka-ca.crt참고신뢰할 수 있는 CA 인증서는 일반적으로
openssl명령을 사용하지 않고 신뢰할 수 있는 소스에서 가져옵니다. 이 예에서는 클라이언트가 Kafka 클러스터가 배포된 동일한 네임스페이스의 Pod에서 실행되고 있다고 가정합니다. 클라이언트가 OpenShift 클러스터 외부에서 Kafka 클러스터에 액세스하는 경우 먼저 부트스트랩 주소를 확인해야 합니다. 이 경우 OpenShift 시크릿에서 직접 클러스터 인증서를 가져올 수 있으며openssl이 필요하지 않습니다. 자세한 내용은 14장. Kafka 클러스터에 대한 클라이언트 액세스 설정의 내용을 참조하십시오.Kafka 브로커의 인증서를 신뢰 저장소에 추가합니다.
keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias my-cluster-kafka -storepass $STOREPASS -import -file /tmp/my-cluster-kafka-ca.crt -noprompt세션을 열린 상태로 유지하여 권한 있는 액세스 권한을 확인합니다.
15.5.4.4. CLI Kafka 클라이언트 세션을 사용하여 Kafka에 대한 승인된 액세스 확인 링크 복사링크가 클립보드에 복사되었습니다!
대화형 CLI 세션을 사용하여 Red Hat Single Sign-On 영역을 통해 적용되는 권한 부여 규칙을 확인합니다. Kafka의 예제 생산자 및 소비자 클라이언트를 사용하여 검사를 적용하여 다른 수준의 액세스 권한이 있는 사용자 및 서비스 계정으로 주제를 생성합니다.
team-a-client 및 team-b-client 클라이언트를 사용하여 권한 부여 규칙을 확인합니다. alice admin 사용자를 사용하여 Kafka에서 추가 관리 작업을 수행합니다.
이 예제에서 사용되는 Apache Kafka 이미지의 Streams에는 Kafka 생산자 및 소비자 바이너리가 포함되어 있습니다.
사전 요구 사항
- Zookeeper 및 Kafka는 OpenShift 클러스터에서 메시지를 보내고 수신할 수 있도록 실행 중입니다.
대화형 CLI Kafka 클라이언트 세션이 시작됩니다.
클라이언트 및 관리자 구성 설정
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 EOFSASL OAUTHBEARER 메커니즘이 사용됩니다. 이 메커니즘에는 클라이언트 ID와 클라이언트 시크릿이 필요합니다. 즉, 클라이언트가 먼저 Red Hat Single Sign-On 서버에 연결하여 액세스 토큰을 가져옵니다. 그러면 클라이언트는 Kafka 브로커에 연결하고 액세스 토큰을 사용하여 인증합니다.
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 EOFcurl을 사용하고 새로 고침 토큰을 가져오기 위해 암호를 부여하여 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}')새로 고침 토큰은 수명이 긴 오프라인 토큰이며 만료되지 않습니다.
admin 사용자
alice에 대한 인증 속성을 사용하여 Kafka 구성 파일을 준비합니다.cat > /tmp/alice.properties << EOF security.protocol=SASL_SSL ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.refresh.token="$REFRESH_TOKEN" \ oauth.client.id="kafka-cli" \ oauth.ssl.truststore.location="/tmp/truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler EOFkafka-cli공용 클라이언트는sasl.jaas.config의oauth.client.id에 사용됩니다. 공개 클라이언트이므로 시크릿이 필요하지 않습니다. 클라이언트는 이전 단계에서 인증된 새로 고침 토큰을 사용하여 인증합니다. 새로 고침 토큰은 백그라운드에서 액세스 토큰을 요청하고, 그런 다음 인증을 위해 Kafka 브로커로 전송됩니다.
권한이 부여된 액세스로 메시지 생성
team-a-client 구성을 사용하여 a_ 또는 x_ 로 시작하는 항목에 메시지를 생성할 수 있는지 확인합니다.
my-topic주제를 작성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic my-topic \ --producer.config=/tmp/team-a-client.properties First message이 요청은
[my-topic] 오류에 액세스할 수 있는 Not authorized을 반환합니다.team-a-client에는a_로 시작하는 주제에 대해 지원되는 작업을 수행할 수 있는 권한을 부여하는Dev 팀 A역할이 있지만x_로 시작하는 항목에만 쓸 수 있습니다.my-topic이라는 주제는 해당 규칙 중 어느 것과도 일치하지 않습니다.a_messages항목에 씁니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-a-client.properties First message Second messageKafka에 성공적으로 메시지가 생성됩니다.
- CTRL+C를 눌러 CLI 애플리케이션을 종료합니다.
요청에 대해
Authorization GRANTED의 디버그 로그에 대한 Kafka 컨테이너 로그를 확인합니다.oc logs my-cluster-kafka-0 -f -n $NS
승인된 액세스로 메시지 사용
team-a-client 구성을 사용하여 a_messages 의 메시지를 사용합니다.
주제
a_messages에서 메시지를 가져옵니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --from-beginning --consumer.config /tmp/team-a-client.propertiesteam-a-client의Dev Team A역할은a_로 시작하는 이름이 있는 소비자 그룹에만 액세스할 수 있기 때문에 요청이 오류를 반환합니다.team-a-client속성을 업데이트하여 사용할 수 있는 사용자 지정 소비자 그룹을 지정합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_1소비자는
a_messages주제에서 모든 메시지를 받습니다.
권한이 부여된 액세스로 Kafka 관리
team-a-client 는 클러스터 수준 액세스 권한이 없는 계정이지만 일부 관리 작업과 함께 사용할 수 있습니다.
주제 나열.
bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --lista_messages항목이 반환됩니다.소비자 그룹을 나열합니다.
bin/kafka-consumer-groups.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --lista_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_ 로 시작하는 항목에 대한 메시지를 생성합니다.
a_messages항목에 씁니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-b-client.properties Message 1이 요청은
[a_messages] 오류에 액세스할 수 있는 Not authorized을 반환합니다.b_messages항목에 씁니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic b_messages \ --producer.config /tmp/team-b-client.properties Message 1 Message 2 Message 3Kafka에 성공적으로 메시지가 생성됩니다.
X
_messages 항목에 씁니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 1Not authorized to access topics: [x_messages]오류가 반환됩니다.team-b-client는x_messages에서만 읽을 수 있습니다.team-a-client를 사용하여x_messages주제를 작성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1이 요청은
[x_messages] 오류에 액세스할 수 있는 Not authorized을 반환합니다.team-a-client는x_messages항목에 쓸 수 있지만 아직 존재하지 않는 경우 주제를 생성할 수 있는 권한이 없습니다.team-a-client가x_messages항목에 작성하려면 관리자 전원 사용자가 파티션 및 복제본 수와 같은 올바른 구성으로 생성해야 합니다.
권한이 있는 admin 사용자로 Kafka 관리
admin 사용자 alice 를 사용하여 Kafka를 관리합니다. Alice 는 모든 Kafka 클러스터에서 모든 것을 관리할 수 있는 전체 액세스 권한을 갖습니다.
x_messages주제를alice로 만듭니다.bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --topic x_messages --create --replication-factor 1 --partitions 1주제가 성공적으로 생성되었습니다.
모든 주제를
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 --listadmin 사용자
alice는 모든 주제를 나열할 수 있지만team-a-client및team-b-client는 액세스할 수 있는 항목만 나열할 수 있습니다.Dev 팀 A및Dev 팀 B역할에는x_로 시작하는 주제에 대한설명권한이 있지만 해당 역할에 대한Describe권한이 없으므로 다른 팀의 주제를 볼 수 없습니다.team-a-client를 사용하여x_messages항목에 메시지를 생성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1 Message 2 Message 3alice가x_messages주제를 생성했으므로 Kafka에 메시지가 성공적으로 생성됩니다.team-b-client를 사용하여x_messages항목에 대한 메시지를 생성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 4 Message 5이 요청은
[x_messages] 오류에 액세스할 수 있는 Not authorized을 반환합니다.team-b-client를 사용하여x_messages주제의 메시지를 사용합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-b-client.properties --group x_consumer_group_b소비자는
x_messages주제에서 모든 메시지를 받습니다.team-a-client를 사용하여x_messages주제의 메시지를 사용합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group x_consumer_group_a이 요청은
[x_messages] 오류에 액세스할 수 있는 Not authorized을 반환합니다.team-a-client를 사용하여a_로 시작하는 소비자 그룹의 메시지를 사용합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_a이 요청은
[x_messages] 오류에 액세스할 수 있는 Not authorized을 반환합니다.dev 팀 A에는x_로 시작하는 주제에 대한읽기권한이 없습니다.alice를 사용하여x_messages항목에 대한 메시지를 생성합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/alice.propertiesKafka에 성공적으로 메시지가 생성됩니다.
Alice는 모든 항목에서 읽거나 쓸 수 있습니다.Alice can read from or write to any topic.alice를 사용하여 클러스터 구성을 읽습니다.bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --entity-type brokers --describe --entity-default이 예제의 클러스터 구성은 비어 있습니다.
16장. TLS 인증서 관리 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 Apache Kafka 구성 요소의 Kafka와 Streams 간의 암호화된 통신을 위해 TLS를 지원합니다.
Apache Kafka의 스트림은 KRaft 모드에서 Kafka를 사용할 때 다음 구성 요소 간 통신을 위해 암호화된 TLS 연결을 설정합니다.
- Kafka 브로커
- Kafka 컨트롤러
- Kafka 브로커 및 컨트롤러
- Apache Kafka Operator 및 Kafka용 스트림
- 크루즈 컨트롤 및 Kafka 브로커
- Kafka Exporter 및 Kafka 브로커
클라이언트와 Kafka 브로커 간의 연결은 TLS 암호화 통신을 사용하도록 구성해야 하는 리스너를 사용합니다. Kafka 사용자 정의 리소스에서 이러한 리스너를 구성하고 각 리스너 이름과 포트 번호는 클러스터 내에서 고유해야 합니다. Kafka 브로커와 Kafka 클라이언트 간의 통신은 리스너에 대해 tls 속성이 구성된 방법에 따라 암호화됩니다. 자세한 내용은 14장. Kafka 클러스터에 대한 클라이언트 액세스 설정의 내용을 참조하십시오.
다음 다이어그램에서는 보안 통신을 위한 연결을 보여줍니다.
그림 16.1. TLS 암호화로 보안된 Kraft 기반 Kafka 통신
다이어그램에 표시된 포트는 다음과 같이 사용됩니다.
- 컨트롤 플레인 리스너 (9090)
- 포트 9090의 내부 컨트롤 플레인 리스너는 Kafka 컨트롤러와 브로커-투-컨트롤러 통신 간의 상호 통신이 용이합니다. 또한 Cluster Operator는 리스너를 통해 컨트롤러와 통신합니다. 이 리스너는 Kafka 클라이언트에서 액세스할 수 없습니다.
- 복제 리스너(9091)
- Streams for Apache Kafka Operator, Cruise Control 및 Kafka Exporter의 브로커 간 데이터 복제와 포트 9091에서 복제 리스너를 사용합니다. 이 리스너는 Kafka 클라이언트에서 액세스할 수 없습니다.
- 클라이언트 연결에 대한 리스너(9092 이상)
- TLS 암호화 통신( listener의 구성을 통해)의 경우 내부 및 외부 클라이언트가 Kafka 브로커에 연결됩니다. 외부 클라이언트(생성자 및 소비자)는 공개된 리스너 포트를 통해 Kafka 브로커에 연결합니다.
브로커에 대한 클라이언트 액세스를 위해 리스너를 구성할 때 포트 9092 이상(9093, 9094 등)을 사용할 수 있지만 몇 가지 예외가 있습니다. 리스너는 인터브로커 통신(9090 및 9091), Prometheus 지표(9404) 및 Cryostat(Java Management Extensions) 모니터링(9999)을 위해 예약된 포트를 사용하도록 구성할 수 없습니다.
클러스터 관리를 위해 Zoo Cryostat를 사용하는 경우 Zoo Cryostat와 Kafka 브로커와 Apache Kafka Operator용 Streams 간에 TLS 연결이 있습니다.
다음 다이어그램에서는 Zoo Cryostat를 사용할 때 안전한 통신을 위한 연결을 보여줍니다.
그림 16.2. TLS 암호화로 보안된 Kafka 및 Zoo Cryostat 통신
Zoo Cryostat 포트는 다음과 같이 사용됩니다.
- Zookeeper 포트 (2181)
- Kafka 브로커에 연결하기 위한 Zookeeper 포트입니다. 또한 Cluster Operator는 이 포트를 통해 Zoo Cryostat와 통신합니다. Topic Operator를 양방향 모드에서 사용하는 경우 이 포트를 통해 Zoo Cryostat와도 통신합니다.
- Zookeeper internodal 통신 포트 (2888)
- Zoo Cryostat 노드 간의 상호 통신을 위한 Zookeeper 포트입니다.
- Zookeeper 리더 선택 포트 (3888)
- Zoo Cryostat 클러스터의 Zoo Cryostat 노드 중에서 리더 선택을 위한 Zookeeper 포트입니다.
16.1. 내부 클러스터 CA 및 클라이언트 CA 링크 복사링크가 클립보드에 복사되었습니다!
암호화를 지원하기 위해 각 Streams for Apache Kafka 구성 요소에는 고유한 개인 키와 공개 키 인증서가 필요합니다. 모든 구성 요소 인증서는 클러스터 CA라는 내부 CA(인증 기관)에서 서명합니다.
CA(인증 기관) 인증서는 구성 요소 및 클라이언트의 ID를 확인하기 위해 Cluster Operator에서 생성됩니다.
마찬가지로 mTLS를 사용하여 Apache Kafka용 Streams에 연결하는 각 Kafka 클라이언트 애플리케이션은 개인 키와 인증서를 사용해야 합니다. 클라이언트 CA라는 두 번째 내부 CA는 Kafka 클라이언트 의 인증서에 서명하는 데 사용됩니다.
클러스터 CA 및 클라이언트 CA에는 모두 자체 서명된 공개 키 인증서가 있습니다.
Kafka 브로커는 클러스터 CA 또는 클라이언트 CA에서 서명한 인증서를 신뢰하도록 구성됩니다. 클라이언트가 연결할 필요가 없는 구성 요소(예: Zoo Cryostat)는 클러스터 CA에서 서명한 신뢰 인증서만 사용합니다. 외부 리스너에 대한 TLS 암호화가 비활성화되지 않는 한 클라이언트 애플리케이션은 클러스터 CA에서 서명한 인증서를 신뢰해야 합니다. 이는 mTLS 인증을 수행하는 클라이언트 애플리케이션에도 적용됩니다.
기본적으로 Streams for Apache Kafka는 클러스터 CA 또는 클라이언트 CA에서 발급한 CA 인증서를 자동으로 생성하고 갱신합니다. Kafka.spec.clusterCa 및 Kafka.spec.clientsCa 속성을 사용하여 이러한 CA 인증서의 관리를 구성할 수 있습니다.
Cluster Operator에서 생성한 CA를 사용하지 않으려면 자체 클러스터 및 클라이언트 CA 인증서를 설치할 수 있습니다. 제공하는 인증서는 Cluster Operator에 의해 갱신되지 않습니다.
16.2. Operator에서 생성한 보안 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 클러스터 내에서 암호화 및 인증을 활성화하기 위해 TLS 인증서를 자동으로 설정하고 갱신합니다. Kafka 브로커와 클라이언트 간에 암호화 또는 mTLS 인증을 활성화하려면 다른 TLS 인증서도 설정합니다.
시크릿은 Kafka 및 KafkaUser 와 같은 사용자 정의 리소스가 배포되면 생성됩니다. Apache Kafka의 스트림은 이러한 시크릿을 사용하여 Kafka 클러스터, 클라이언트 및 사용자의 개인 및 공개 키 인증서를 저장합니다. 시크릿은 Kafka 브로커 간 TLS 암호화 연결을 설정하고 브로커와 클라이언트 간의 TLS 암호화 연결을 설정하는 데 사용됩니다. mTLS 인증에도 사용됩니다.
클러스터 및 클라이언트 보안은 항상 쌍입니다. 하나는 공개 키가 포함되어 있고 개인 키가 포함되어 있습니다.
- 클러스터 시크릿
- 클러스터 시크릿에는 Kafka 브로커 인증서에 서명하는 클러스터 CA 가 포함되어 있습니다. 클라이언트는 인증서를 사용하여 Kafka 클러스터와 TLS 암호화 연결을 설정합니다. 인증서는 브로커 ID를 확인합니다.
- 클라이언트 시크릿
- 클라이언트 시크릿에는 사용자가 자체 클라이언트 인증서에 서명할 수 있는 클라이언트 CA 가 포함되어 있습니다. 이를 통해 Kafka 클러스터에 대한 상호 인증을 허용합니다. 브로커는 인증서를 통해 클라이언트의 ID를 검증합니다.
- 사용자 시크릿
- 사용자 시크릿에는 개인 키와 인증서가 포함되어 있습니다. 새 사용자를 생성할 때 클라이언트 CA에서 시크릿을 생성하고 서명합니다. 키와 인증서는 클러스터에 액세스할 때 사용자를 인증하고 권한을 부여하는 데 사용됩니다.
TLS 리스너 또는 TLS 암호화가 활성화된 외부 리스너에 대한 Kafka 리스너 인증서를 제공할 수 있습니다. Kafka 리스너 인증서를 사용하여 이미 보유한 보안 인프라를 통합합니다.
16.2.1. PEM 또는 PKCS #12 형식의 키와 인증서를 사용하는 TLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
Streams for Apache Kafka에서 생성한 시크릿은 PEM(Privacy Enhanced Mail) 및 PKCS #12(Public-Key Cryptography Standards) 형식으로 개인 키와 인증서를 제공합니다. PEM 및 PKCS #12는 SSL 프로토콜을 사용하여 TLS 통신을 위한 OpenSSL 생성 키 형식입니다.
Kafka 클러스터 및 사용자에 대해 생성된 보안에 포함된 인증 정보를 사용하는 상호 TLS(mTLS) 인증을 구성할 수 있습니다.
mTLS를 설정하려면 먼저 다음을 수행해야 합니다.
Kafka 클러스터를 배포할 때 클러스터를 확인하기 위해 < cluster_name>-cluster-ca-cert 시크릿이 공개 키로 생성됩니다. 공개 키를 사용하여 클라이언트의 신뢰 저장소를 구성합니다.
KafkaUser 를 생성할 때 사용자(클라이언트)를 확인하기 위해 키와 인증서로 < kafka_user_name > 시크릿이 생성됩니다. 이러한 인증 정보를 사용하여 클라이언트의 키 저장소를 구성합니다.
Kafka 클러스터 및 클라이언트가 mTLS를 사용하도록 설정된 상태에서 시크릿에서 인증 정보를 추출하여 클라이언트 구성에 추가합니다.
- PEM 키 및 인증서
PEM의 경우 클라이언트 구성에 다음을 추가합니다.
- truststore
-
클러스터의 CA 인증서인 <
cluster_name>-cluster-ca-cert시크릿의ca.crt.
-
클러스터의 CA 인증서인 <
- 키 저장소
-
<
kafka_user_name> 시크릿의user.crt는 사용자의 공용 인증서입니다. -
<
kafka_user_name> 시크릿의user.key는 사용자의 개인 키입니다.
-
<
- PKCS #12 키 및 인증서
PKCS #12의 경우 클라이언트 구성에 다음을 추가합니다.
- truststore
-
클러스터의 CA 인증서인 <
cluster_name>-cluster-ca-cert시크릿의ca.p12. -
공용 클러스터 CA 인증서에 액세스하기 위한 암호인 <
cluster_name>-cluster-ca-cert시크릿의ca.password.
-
클러스터의 CA 인증서인 <
- 키 저장소
-
<
kafka_user_name> 시크릿의user.p12는 사용자의 공개 키 인증서입니다. -
Kafka 사용자의 공개 키 인증서에 액세스하기 위한 암호인 <
kafka_user_name> 시크릿의user.password.
-
<
PKCS #12는 Java에서 지원하므로 인증서 값을 Java 클라이언트 구성에 직접 추가할 수 있습니다. 보안 스토리지 위치의 인증서를 참조할 수도 있습니다. PEM 파일을 사용하면 한 줄 형식으로 클라이언트 구성에 인증서를 직접 추가해야 합니다. Kafka 클러스터와 클라이언트 간의 TLS 연결을 설정하는 데 적합한 형식을 선택합니다. PEM에 익숙하지 않은 경우 PKCS #12를 사용합니다.
모든 키는 크기가 2048비트이며 기본적으로 초기 생성에서 365일 동안 유효합니다. 유효 기간을 변경할 수 있습니다.
16.2.2. Cluster Operator에서 생성한 보안 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 OpenShift 클러스터에 시크릿으로 저장된 다음 인증서를 생성합니다. Apache Kafka의 스트림은 기본적으로 이러한 시크릿을 사용합니다.
클러스터 CA 및 클라이언트 CA에는 개인 키 및 공개 키에 대한 별도의 시크릿이 있습니다.
<cluster_name>-cluster-ca- 클러스터 CA의 개인 키를 포함합니다. Apache Kafka 및 Kafka 구성 요소의 스트림은 개인 키를 사용하여 서버 인증서에 서명합니다.
<cluster_name>-cluster-ca-cert- 클러스터 CA의 공개 키를 포함합니다. Kafka 클라이언트는 공개 키를 사용하여 TLS 서버 인증으로 연결된 Kafka 브로커의 ID를 확인합니다.
<cluster_name>-clients-ca- 클라이언트 CA의 개인 키를 포함합니다. Kafka 클라이언트는 Kafka 브로커에 연결할 때 개인 키를 사용하여 mTLS 인증을 위한 새 사용자 인증서에 서명합니다.
<cluster_name>-clients-ca-cert- 클라이언트 CA의 공개 키를 포함합니다. Kafka 브로커는 공개 키를 사용하여 mTLS 인증이 사용되는 경우 Kafka 브로커에 액세스하는 클라이언트의 ID를 확인합니다.
Apache Kafka 구성 요소 스트림 간 통신을 위한 시크릿에는 클러스터 CA에서 서명한 개인 키와 공개 키 인증서가 포함되어 있습니다.
<cluster_name>-kafka-brokers- Kafka 브로커의 개인 키 및 공개 키가 포함되어 있습니다.
<cluster_name>-zookeeper-nodes- Zoo Cryostat 노드의 개인 및 공개 키를 포함합니다.
<cluster_name>-cluster-operator-certs- Cluster Operator와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-entity-topic-operator-certs- Topic Operator와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-entity-user-operator-certs- User Operator와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-cruise-control-certs- Cruise Control과 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
<cluster_name>-kafka-exporter-certs- Kafka Exporter와 Kafka 또는 Zoo Cryostat 간의 통신을 암호화하기 위한 개인 및 공개 키가 포함되어 있습니다.
클러스터 CA에서 서명한 인증서 대신 Kafka 리스너 인증서를 사용하여 Kafka 브로커에 연결하기 위해 자체 서버 인증서 및 개인 키를 제공할 수 있습니다.
16.2.3. 클러스터 CA 시크릿 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 CA 보안은 Kafka 클러스터의 Cluster Operator에 의해 관리됩니다.
클라이언트에는 <cluster_name> -cluster-ca-cert 시크릿만 필요합니다. 다른 모든 클러스터 시크릿은 Apache Kafka 구성 요소용 Streams에서 액세스할 수 있습니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 이를 적용할 수 있습니다.
< cluster_name> -cluster-ca-cert 의 CA 인증서는 TLS를 통해 Kafka 브로커에 연결할 때 Kafka 브로커 인증서를 검증하도록 Kafka 클라이언트 애플리케이션에서 신뢰해야 합니다.
| 필드 | 설명 |
|---|---|
|
| 클러스터 CA의 현재 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
| 클러스터 CA의 현재 인증서입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Kafka 브로커 Pod < num>의 인증서입니다. <cluster |
|
|
Kafka 브로커 Pod < |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Zoo Cryostat 노드 < num& gt;의 인증서입니다. <cluster |
|
|
Zoo Cryostat pod < |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Cluster Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster |
|
| Cluster Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Topic Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster |
|
| Topic Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
User Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster |
|
| User Operator와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Cruise Control과 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster |
|
| 크루즈 컨트롤과 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Kafka Exporter와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신 인증서입니다. <cluster |
|
| Kafka Exporter와 Kafka 또는 Zoo Cryostat 간의 mTLS 통신의 개인 키입니다. |
16.2.4. 클라이언트 CA 시크릿 링크 복사링크가 클립보드에 복사되었습니다!
클라이언트 CA 보안은 Kafka 클러스터의 Cluster Operator에 의해 관리됩니다.
< cluster_name> -clients-ca-cert 의 인증서는 Kafka 브로커가 신뢰하는 인증서입니다.
& lt;cluster_name> -clients-ca 시크릿은 클라이언트 애플리케이션의 인증서에 서명하는 데 사용됩니다. User Operator를 사용하지 않고 애플리케이션 인증서를 발행하려는 경우 Apache Kafka 구성 요소의 Streams for Apache Kafka 구성 요소와 관리 액세스에 액세스할 수 있어야 합니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 이를 적용할 수 있습니다.
| 필드 | 설명 |
|---|---|
|
| 클라이언트 CA의 현재 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
| 클라이언트 CA의 현재 인증서입니다. |
16.2.5. User Operator에서 생성한 사용자 시크릿 링크 복사링크가 클립보드에 복사되었습니다!
사용자 보안은 User Operator가 관리합니다.
User Operator를 사용하여 사용자를 생성하면 사용자 이름을 사용하여 보안이 생성됩니다.
| 시크릿 이름 | 시크릿 내 필드 | 설명 |
|---|---|---|
|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소입니다. |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. | |
|
| 클라이언트 CA에서 서명한 사용자의 인증서 | |
|
| 사용자의 개인 키 |
16.2.6. 클러스터 CA 보안에 레이블 및 주석 추가 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 사용자 정의 리소스에서 clusterCaCert 템플릿 속성을 구성하면 Cluster Operator에서 생성한 Cluster CA 보안에 사용자 정의 레이블 및 주석을 추가할 수 있습니다. 레이블 및 주석은 오브젝트를 식별하고 컨텍스트 정보를 추가하는 데 유용합니다. Apache Kafka 사용자 정의 리소스의 Streams에서 템플릿 속성을 구성합니다.
보안에 레이블 및 주석을 추가하는 템플릿 사용자 정의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
template:
clusterCaCert:
metadata:
labels:
label1: value1
label2: value2
annotations:
annotation1: value1
annotation2: value2
# ...
16.2.7. CA 보안에서 ownerReference 비활성화 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 클러스터 및 클라이언트 CA 보안은 Kafka 사용자 정의 리소스로 설정된 ownerReference 속성을 사용하여 생성됩니다. 즉, Kafka 사용자 정의 리소스가 삭제되면 OpenShift에서 CA 시크릿도 삭제(가용됨)됩니다.
새 클러스터에 CA를 재사용하려면 Kafka 구성에서 클러스터 및 클라이언트 CA 시크릿의 generateSecretOwnerReference 속성을 false 로 설정하여 ownerReference 를 비활성화할 수 있습니다. ownerReference 가 비활성화되면 해당 Kafka 사용자 정의 리소스가 삭제되면 OpenShift에서 CA 시크릿이 삭제되지 않습니다.
클러스터 및 클라이언트 CA에 대해 비활성화된 ownerReference 가 있는 Kafka 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
clusterCa:
generateSecretOwnerReference: false
clientsCa:
generateSecretOwnerReference: false
# ...
16.3. 인증서 갱신 및 유효 기간 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 CA 및 클라이언트 CA 인증서는 유효 기간이라는 제한된 기간 동안만 유효합니다. 일반적으로 인증서가 생성된 후 일수로 정의됩니다.
Cluster Operator가 자동으로 생성한 CA 인증서의 경우 유효한 기간을 구성할 수 있습니다.
-
Kafka.spec.clusterCa.validityDays의 클러스터 CA 인증서 -
Kafka.spec.clientsCa.validityDays의 클라이언트 CA 인증서
두 인증서의 기본 유효 기간은 365일입니다. 수동으로 설치한 CA 인증서에는 고유한 유효 기간이 정의되어 있어야 합니다.
CA 인증서가 만료되면 해당 인증서를 계속 신뢰하는 구성 요소 및 클라이언트는 CA 개인 키로 인증서를 서명한 피어의 연결을 허용하지 않습니다. 구성 요소 및 클라이언트는 대신 새 CA 인증서를 신뢰해야 합니다.
서비스 손실 없이 CA 인증서 갱신을 허용하기 위해 Cluster Operator는 이전 CA 인증서가 만료되기 전에 인증서 갱신을 시작합니다.
Cluster Operator가 생성한 인증서의 갱신 기간을 구성할 수 있습니다.
-
Kafka.spec.clusterCa.renewalDays의 클러스터 CA 인증서 -
Kafka.spec.clientsCa.renewalDays의 클라이언트 CA 인증서
두 인증서의 기본 갱신 기간은 30일입니다.
갱신 기간은 현재 인증서의 만료 날짜로부터 역순으로 측정됩니다.
갱신 기간에 대한 유효 기간
Not Before Not After
| |
|<--------------- validityDays --------------->|
<--- renewalDays --->|
Kafka 클러스터를 생성한 후 유효 기간 및 갱신 기간을 변경하려면 Kafka 사용자 정의 리소스를 구성 및 적용하고 CA 인증서를 수동으로 갱신합니다. 인증서를 수동으로 갱신하지 않으면 다음에 인증서가 자동으로 갱신될 때 새 기간이 사용됩니다.
인증서 유효 기간 및 갱신 기간에 대한 Kafka 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
clusterCa:
renewalDays: 30
validityDays: 365
generateCertificateAuthority: true
clientsCa:
renewalDays: 30
validityDays: 365
generateCertificateAuthority: true
# ...
갱신 기간 동안 Cluster Operator의 동작은 클러스터 CA 및 클라이언트 CA의 generateCertificateAuthority 인증서 생성 속성 설정에 따라 다릅니다.
true-
속성이
true로 설정되면 Cluster Operator에 의해 CA 인증서가 자동으로 생성되고 갱신 기간 내에 자동으로 갱신됩니다. false-
속성이
false로 설정되면 Cluster Operator에 의해 CA 인증서가 생성되지 않습니다. 자체 인증서를 설치하는 경우 이 옵션을 사용합니다.
16.3.1. 자동으로 생성된 CA 인증서로 갱신 프로세스 링크 복사링크가 클립보드에 복사되었습니다!
CA 인증서를 갱신할 때 Cluster Operator는 이 순서대로 다음 프로세스를 수행합니다.
새 CA 인증서를 생성하지만 기존 키를 유지합니다.
새 인증서는 이전 인증서를 해당
시크릿내의ca.crt이름으로 교체합니다.새 클라이언트 인증서( Zookafka 노드, Kafka 브로커 및 Entity Operator용)를 생성합니다.
서명 키가 변경되지 않았으므로 엄격하게 필요하지 않지만 클라이언트 인증서의 유효 기간이 CA 인증서와 동기화됩니다.
- 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용할 수 있도록 Zoo Cryostat 노드를 재시작합니다.
- Kafka 브로커를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.
새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용하도록 Topic 및 User Operator를 다시 시작합니다.
사용자 인증서는 클라이언트 CA에서 서명합니다. User Operator가 생성한 사용자 인증서는 클라이언트 CA가 갱신될 때 갱신됩니다.
16.3.2. 클라이언트 인증서 갱신 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 Kafka 클러스터를 사용하는 클라이언트 애플리케이션을 인식하지 못합니다.
클러스터에 연결하고 올바르게 작동하려면 클라이언트 애플리케이션이 다음을 수행해야 합니다.
- <cluster> - cluster-ca-cert 시크릿에 게시된 클러스터 CA 인증서를 신뢰합니다.
< user-name> 보안에 게시된 인증 정보를 사용하여 클러스터에 연결합니다.
사용자 시크릿은 PEM 및 PKCS #12 형식으로 자격 증명을 제공하거나 SCRAM-SHA 인증을 사용할 때 암호를 제공할 수 있습니다. User Operator는 사용자가 생성될 때 사용자 인증 정보를 생성합니다.
인증서 갱신 후에도 클라이언트가 계속 작동하는지 확인해야 합니다. 갱신 프로세스는 클라이언트 구성 방법에 따라 다릅니다.
클라이언트 인증서 및 키를 수동으로 프로비저닝하는 경우 새 클라이언트 인증서를 생성하고 갱신 기간 내에 클라이언트에서 새 인증서를 사용해야 합니다. 갱신 기간이 끝날 때까지 이 작업을 수행하지 않으면 클라이언트 애플리케이션이 클러스터에 연결할 수 없게 될 수 있습니다.
동일한 OpenShift 클러스터 및 네임스페이스 내에서 실행되는 워크로드의 경우 Secrets는 보안의 현재 상태에서 클라이언트 Pod가 키 저장소 및 신뢰 저장소를 구성하도록 볼륨으로 마운트할 수 있습니다. 이 프로세스에 대한 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.
16.3.3. Cluster Operator 관리 CA 인증서 수동 갱신 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator가 생성한 클러스터 및 클라이언트 CA 인증서는 해당 인증서 갱신 기간이 시작될 때 자동으로 갱신됩니다. 그러나 strimzi.io/force-renew 주석을 사용하여 인증서 갱신 기간이 시작되기 전에 이러한 인증서 중 하나 또는 둘 다를 수동으로 갱신할 수 있습니다. 보안상의 이유로 이 작업을 수행하거나 인증서의 갱신 또는 유효 기간을 변경한 경우 .
업데이트된 인증서는 이전 인증서와 동일한 개인 키를 사용합니다.
자체 CA 인증서를 사용하는 경우 force-renew 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.
- CA 인증서의 유효 기간을 확인하는 OpenSSL TLS 관리 툴입니다.
이 절차에서는 my-project 네임스페이스 내에서 my-cluster 라는 Kafka 클러스터를 사용합니다.
프로세스
갱신하려는 CA 인증서가 포함된 보안에
strimzi.io/force-renew주석을 적용합니다.클러스터 CA 시크릿 갱신
oc annotate secret my-cluster-cluster-ca-cert -n my-project strimzi.io/force-renew="true"클라이언트 CA 시크릿 갱신
oc annotate secret my-cluster-clients-ca-cert -n my-project strimzi.io/force-renew="true"다음 조정에서 Cluster Operator는 새 인증서를 생성합니다.
유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 기간 기간 내에 첫 번째 조정에 새 CA 인증서를 생성합니다.
새 CA 인증서의 유효 기간을 확인합니다.
새 클러스터 CA 인증서의 유효 기간 확인
oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates새 클라이언트 CA 인증서의 유효 기간 확인
oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates이 명령은 CA 인증서에 유효한 시작 및 종료 날짜인
notBefore및notAfter날짜를 반환합니다.새 클러스터 CA 인증서를 신뢰하도록 클라이언트 구성을 업데이트합니다.
다음 내용을 참조하십시오.
16.3.4. 만료된 Cluster Operator 관리 CA 인증서에서 수동으로 복구 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 Operator는 갱신 기간이 시작될 때 클러스터 및 클라이언트 CA 인증서를 자동으로 갱신합니다. 그러나 예기치 않은 운영 문제 또는 중단으로 인해 Cluster Operator의 다운타임 또는 Kafka 클러스터를 사용할 수 없는 것과 같은 갱신 프로세스를 방지할 수 있습니다. CA 인증서가 만료되면 Kafka 클러스터 구성 요소는 서로 통신할 수 없으며 Cluster Operator는 수동 조작 없이 CA 인증서를 갱신할 수 없습니다.
즉시 복구를 수행하려면 다음 절차에 설명된 단계를 지정된 순서대로 따르십시오. 만료된 클러스터 및 클라이언트 CA 인증서에서 복구할 수 있습니다. 이 프로세스에서는 Cluster Operator에 의해 새 인증서가 생성되도록 만료된 인증서가 포함된 보안을 삭제해야 합니다. Apache Kafka 스트림에서 관리되는 보안에 대한 자세한 내용은 16.2.2절. “Cluster Operator에서 생성한 보안” 을 참조하십시오.
자체 CA 인증서를 사용하는 경우 프로세스가 만료되지만 Cluster Operator에서 생성한 인증서를 사용하지 않고 CA 인증서를 갱신 해야 합니다.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.
- CA 인증서의 유효 기간을 확인하는 OpenSSL TLS 관리 툴입니다.
이 절차에서는 my-project 네임스페이스 내에서 my-cluster 라는 Kafka 클러스터를 사용합니다.
프로세스
만료된 CA 인증서가 포함된 보안을 삭제합니다.
클러스터 CA 시크릿 삭제
oc delete secret my-cluster-cluster-ca-cert -n my-project클라이언트 CA 시크릿 삭제
oc delete secret my-cluster-clients-ca-cert -n my-projectCluster Operator가 새 인증서를 생성할 때까지 기다립니다.
-
Kafka 브로커의 ID를 동일한 이름(
my-cluster-cluster-ca-cert)의 시크릿에 생성하는 새 CA 클러스터 인증서입니다. -
Kafka 사용자의 ID를 확인하는 새 CA 클라이언트 인증서가 동일한 이름의 시크릿(
my-cluster-clients-ca-cert)에 생성됩니다.
-
Kafka 브로커의 ID를 동일한 이름(
새 CA 인증서의 유효 기간을 확인합니다.
새 클러스터 CA 인증서의 유효 기간 확인
oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates새 클라이언트 CA 인증서의 유효 기간 확인
oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates이 명령은 CA 인증서에 유효한 시작 및 종료 날짜인
notBefore및notAfter날짜를 반환합니다.CA 인증서를 사용하는 구성 요소 Pod 및 시크릿을 삭제합니다.
- Zoo Cryostat 시크릿을 삭제합니다.
- Cluster Operator가 누락된 Zoo Cryostat 시크릿을 감지하고 다시 생성할 때까지 기다립니다.
- 모든 Zoo Cryostat Pod를 삭제합니다.
- Kafka 시크릿을 삭제합니다.
- Cluster Operator가 누락된 Kafka 시크릿을 감지하고 다시 생성할 때까지 기다립니다.
- 모든 Kafka Pod를 삭제합니다.
클라이언트 CA 인증서만 복구하는 경우 Kafka 시크릿 및 Pod만 삭제해야 합니다.
다음
oc명령을 사용하여 리소스를 찾고 해당 리소스가 제거되었는지 확인할 수 있습니다.oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>&
lt;resource_type>을Pod또는Secret과 같은 리소스 유형으로 바꿉니다.Cluster Operator가 누락된 Kafka 및 Zoo Cryostat Pod를 감지하고 업데이트된 CA 인증서로 다시 생성할 때까지 기다립니다.
조정 시 Cluster Operator는 새 CA 인증서를 신뢰하도록 다른 구성 요소를 자동으로 업데이트합니다.
- Cluster Operator 로그의 인증서 검증과 관련된 문제가 없는지 확인합니다.
새 클러스터 CA 인증서를 신뢰하도록 클라이언트 구성을 업데이트합니다.
다음 내용을 참조하십시오.
16.3.5. Cluster Operator 관리 CA 인증서에서 사용하는 개인 키 교체 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator에서 생성한 클러스터 CA 및 클라이언트 CA 인증서에서 사용하는 개인 키를 교체할 수 있습니다. 개인 키가 교체되면 Cluster Operator는 새 개인 키에 대한 새 CA 인증서를 생성합니다.
자체 CA 인증서를 사용하는 경우 force-replace 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
- CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.
프로세스
strimzi.io/force-replace주석을 갱신할 개인 키가 포함된 보안에 적용합니다.Expand 표 16.13. 개인 키 교체 명령 의 개인 키 Secret 주석 명령 클러스터 CA
<cluster_name>-cluster-ca
oc annotate secret <cluster_name>-cluster-ca strimzi.io/force-replace="true"클라이언트 CA
<cluster_name>-clients-ca
oc annotate secret <cluster_name>-clients-ca strimzi.io/force-replace="true"
다음 조정에서 Cluster Operator는 다음을 수행합니다.
-
주석이 달린 보안에 대한 새 개인 키 생성
- 새 CA 인증서 생성
유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 기간 내에 첫 번째 조정 시 새 개인 키 및 CA 인증서를 생성합니다.
클라이언트 애플리케이션은 Cluster Operator가 업데이트한 클러스터 및 클라이언트 CA 인증서를 다시 로드해야 합니다.
16.4. 클러스터 CA를 신뢰하도록 내부 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 클러스터 CA 인증서를 신뢰하기 위해 OpenShift 클러스터 내에 있는 Kafka 클라이언트를 구성하는 방법을 설명합니다.
내부 클라이언트에 이 작업을 수행하는 가장 쉬운 방법은 볼륨 마운트를 사용하여 필요한 인증서 및 키가 포함된 시크릿에 액세스하는 것입니다.
단계에 따라 Java 기반 Kafka Producer, Consumer 및 Streams API에 대한 클러스터 CA에서 서명한 신뢰 인증서를 구성합니다.
클러스터 CA의 인증서 형식에 따라 수행할 단계를 선택합니다. PKCS #12 (.p12) 또는 PEM (.crt).
이 단계에서는 Kafka 클러스터의 ID를 클라이언트 Pod에 확인하는 클러스터 시크릿을 마운트하는 방법을 설명합니다.
사전 요구 사항
- Cluster Operator가 실행 중이어야 합니다.
-
OpenShift 클러스터 내에
Kafka리소스가 있어야 합니다. - TLS를 사용하여 연결할 OpenShift 클러스터 내부에 Kafka 클라이언트 애플리케이션이 필요하며 클러스터 CA 인증서를 신뢰해야 합니다.
-
클라이언트 애플리케이션은
Kafka리소스와 동일한 네임스페이스에서 실행되어야 합니다.
PKCS #12 형식 사용(.p12)
클라이언트 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 구성에 사용할 수 있는 환경 변수에 대한 암호
다음 속성을 사용하여 Kafka 클라이언트를 구성합니다.
보안 프로토콜 옵션:
-
security.protocol: 암호화에 TLS를 사용하는 경우 SSL( mTLS 인증 포함 또는 사용 안 함)입니다. -
security.protocol: TLS를 통해 SCRAM-SHA 인증을 사용할 때 SASL_SSL입니다.
-
-
인증서를 가져온
truststore 위치를 사용하는 SSL.truststore.location. -
truststore에 액세스하기 위한 암호가 있는 SSL.truststore.password. -
SSL.truststore.type=PKCS12로 신뢰 저장소 유형을 식별합니다.
PEM 형식 사용(.crt)
클라이언트 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- 추출된 인증서를 사용하여 X.509 형식으로 인증서를 사용하는 클라이언트에서 TLS 연결을 구성합니다.
16.5. 클러스터 CA를 신뢰하도록 외부 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 클러스터 CA 인증서를 신뢰하기 위해 OpenShift 클러스터 외부에 있는 Kafka 클라이언트를 구성하는 방법을 설명합니다. 이전 클라이언트 CA 인증서가 교체되는 경우 클라이언트를 설정하고 갱신 기간 동안 다음 절차를 따르십시오.
단계에 따라 Java 기반 Kafka Producer, Consumer 및 Streams API에 대한 클러스터 CA에서 서명한 신뢰 인증서를 구성합니다.
클러스터 CA의 인증서 형식에 따라 수행할 단계를 선택합니다. PKCS #12 (.p12) 또는 PEM (.crt).
이 단계에서는 Kafka 클러스터의 ID를 확인하는 클러스터 시크릿에서 인증서를 가져오는 방법을 설명합니다.
& lt;cluster_name> -cluster-ca-cert 시크릿에는 CA 인증서 갱신 기간 동안 두 개 이상의 CA 인증서가 포함되어 있습니다. 클라이언트는 모두 신뢰 저장소에 추가해야 합니다.
사전 요구 사항
- Cluster Operator가 실행 중이어야 합니다.
-
OpenShift 클러스터 내에
Kafka리소스가 있어야 합니다. - TLS를 사용하여 연결할 OpenShift 클러스터 외부의 Kafka 클라이언트 애플리케이션이 필요하며 클러스터 CA 인증서를 신뢰해야 합니다.
PKCS #12 형식 사용(.p12)
Kafka 클러스터의 <cluster
_name> -cluster-ca-certSecret에서 클러스터 CA 인증서 및 암호를 추출합니다.oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password& lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다.
다음 속성을 사용하여 Kafka 클라이언트를 구성합니다.
보안 프로토콜 옵션:
-
security.protocol: TLS를 사용할 때 SSL입니다. -
security.protocol: TLS를 통해 SCRAM-SHA 인증을 사용할 때 SASL_SSL입니다.
-
-
인증서를 가져온
truststore 위치를 사용하는 SSL.truststore.location. -
truststore에 액세스하기 위한 암호가 있는 SSL.truststore.password. truststore에 필요하지 않은 경우 이 속성을 생략할 수 있습니다. -
SSL.truststore.type=PKCS12로 신뢰 저장소 유형을 식별합니다.
PEM 형식 사용(.crt)
Kafka 클러스터의 <
cluster_name> -cluster-ca-cert시크릿에서 클러스터 CA 인증서를 추출합니다.oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt- 추출된 인증서를 사용하여 X.509 형식으로 인증서를 사용하는 클라이언트에서 TLS 연결을 구성합니다.
16.6. 자체 CA 인증서 및 개인 키 사용 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator에서 생성한 기본값을 사용하는 대신 자체 CA 인증서 및 개인 키를 설치하고 사용합니다. 클러스터 및 클라이언트 CA 인증서 및 개인 키를 교체할 수 있습니다.
다음과 같은 방법으로 자체 CA 인증서 및 개인 키를 사용하여 전환할 수 있습니다.
- Kafka 클러스터를 배포하기 전에 자체 CA 인증서 및 개인 키 설치
- Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 고유한 인증서로 교체
Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 교체하는 단계는 자체 CA 인증서 및 개인 키를 갱신하는 데 사용되는 것과 동일합니다.
자체 인증서를 사용하는 경우 자동으로 갱신되지 않습니다. 만료되기 전에 CA 인증서 및 개인 키를 갱신해야 합니다.
갱신 옵션:
- CA 인증서만 갱신
- CA 인증서 및 개인 키 갱신(또는 기본값 교체)
16.6.1. 자체 CA 인증서 및 개인 키 설치 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator에서 생성한 클러스터 및 클라이언트 CA 인증서 및 개인 키를 사용하는 대신 자체 CA 인증서 및 개인 키를 설치합니다.
기본적으로 Apache Kafka의 Streams는 자동으로 갱신되는 다음 클러스터 CA 및 클라이언트 CA 시크릿을 사용합니다.
클러스터 CA 시크릿
-
<cluster_name>-cluster-ca -
<cluster_name>-cluster-ca-cert
-
클라이언트 CA 시크릿
-
<cluster_name>-clients-ca -
<cluster_name>-clients-ca-cert
-
자체 인증서를 설치하려면 동일한 이름을 사용합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
Kafka 클러스터는 아직 배포되지 않았습니다.
Kafka 클러스터를 이미 배포한 경우 기본 CA 인증서를 자체 인증서로 교체할 수 있습니다.
클러스터 CA 또는 클라이언트 CA의 PEM 형식의 고유한 X.509 인증서 및 키입니다.
루트 CA가 아닌 클러스터 또는 클라이언트 CA를 사용하려면 전체 체인을 인증서 파일에 포함해야 합니다. 체인은 다음 순서로 설정되어야 합니다.
- 클러스터 또는 클라이언트 CA
- 하나 이상의 중간 CA
- 루트 CA
- 체인의 모든 CA는 X509v3 기본 제약 조건 확장을 사용하여 구성해야 합니다. 기본 제한 조건은 인증서 체인의 경로 길이를 제한합니다.
- 인증서를 변환하는 OpenSSL TLS 관리 툴입니다.
사전 준비 사항
Cluster Operator는 PEM(Privacy Enhanced Mail) 및 PKCS #12(Public-Key Cryptography Standards) 형식으로 키와 인증서를 생성합니다. 두 형식 중 하나로 자체 인증서를 추가할 수 있습니다.
일부 애플리케이션은 PEM 인증서를 사용할 수 없으며 PKCS #12 인증서만 지원합니다. PKCS #12 형식의 클러스터 인증서가 없는 경우 OpenSSL TLS 관리 툴을 사용하여 ca.crt 파일에서 하나를 생성합니다.
certificate generation 명령 예
openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt
<P12_password>를 고유한 암호로 바꿉니다.
프로세스
CA 인증서가 포함된 새 보안을 생성합니다.
PEM 형식의 인증서가 있는 클라이언트 보안 생성
oc create secret generic <cluster_name>-clients-ca-cert --from-file=ca.crt=ca.crtPEM 및 PKCS #12 형식의 인증서로 클러스터 시크릿 생성
oc create secret generic <cluster_name>-cluster-ca-cert \ --from-file=ca.crt=ca.crt \ --from-file=ca.p12=ca.p12 \ --from-literal=ca.password=P12-PASSWORD<cluster_name>을 Kafka 클러스터 이름으로 바꿉니다.
개인 키가 포함된 새 보안을 생성합니다.
oc create secret generic <ca_key_secret> --from-file=ca.key=ca.key보안에 레이블을 지정합니다.
oc label secret <ca_certificate_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"oc label secret <ca_key_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"-
strimzi.io/kind=Kafka레이블은 Kafka 사용자 정의 리소스를 식별합니다. -
strimzi.io/cluster="<cluster_name>"레이블은 Kafka 클러스터를 식별합니다.
-
보안 주석
oc annotate secret <ca_certificate_secret> strimzi.io/ca-cert-generation="<ca_certificate_generation>"oc annotate secret <ca_key_secret> strimzi.io/ca-key-generation="<ca_key_generation>"-
주석
strimzi.io/ca-cert-generation="<ca_certificate_generation>"은 새 CA 인증서 생성을 정의합니다. 주석
strimzi.io/ca-key-generation="<ca_key_generation>"은 새 CA 키 생성을 정의합니다.0(zero)에서 자체 CA 인증서에 대한 증분 값(sti
mzi.io/ca-cert-generation=0)으로 시작합니다. 인증서를 갱신할 때 더 높은 증분 값을 설정합니다.
-
주석
생성된 CA를 사용하지 않도록
또는Kafka.spec.clusterCaKafka.spec.clientsCa오브젝트를 구성하여 클러스터에 대한 Kafka 리소스를 생성합니다.사용자가 제공한 인증서를 사용하도록 클러스터 CA를 구성하는 조각 모음
Kafka리소스의 예kind: Kafka version: kafka.strimzi.io/v1beta2 spec: # ... clusterCa: generateCertificateAuthority: false
16.6.2. 자체 CA 인증서 갱신 링크 복사링크가 클립보드에 복사되었습니다!
자체 CA 인증서를 사용하는 경우 수동으로 업데이트해야 합니다. Cluster Operator는 자동으로 갱신되지 않습니다. 갱신 기간이 만료되기 전에 CA 인증서를 갱신합니다.
CA 인증서를 갱신하고 동일한 개인 키를 계속 사용하는 경우 이 절차의 단계를 수행합니다. 자체 CA 인증서 및 개인 키를 갱신하는 경우 16.6.3절. “CA 인증서 및 개인 키 갱신 또는 교체” 을 참조하십시오.
이 절차에서는 PEM 형식의 CA 인증서 갱신을 설명합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
- PEM 형식의 새 클러스터 또는 클라이언트 X.509 인증서가 있습니다.
프로세스
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새 CA 인증서를 base64로 인코딩합니다.
cat <path_to_new_certificate> | base64CA 인증서를 업데이트합니다.
이전 단계에서 base64로 인코딩된 CA 인증서를
data아래의ca.crt속성 값으로 복사합니다.CA 인증서 생성 주석의 값을 늘립니다.
strimzi.io/ca-cert-generation주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어strimzi.io/ca-cert-generation=0을strimzi.io/ca-cert-generation=1으로 변경합니다. 보안에 주석이 없는 경우 값은0으로 처리되므로 값이1인 주석을 추가합니다.Apache Kafka용 Streams가 인증서를 생성하면 Cluster Operator에 의해 인증서 생성 주석이 자동으로 증가합니다. 자체 CA 인증서의 경우 더 높은 증분 값으로 주석을 설정합니다. 이 주석에는 Cluster Operator가 Pod를 롤아웃하고 인증서를 업데이트할 수 있도록 현재 보안의 값보다 높은 값이 필요합니다.
strimzi.io/ca-cert-generation는 각 CA 인증서 갱신에 따라 증가해야 합니다.새 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
다음 조정에서 Cluster Operator는 새 CA 인증서를 신뢰하기 위해 Zoo Cryostat, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행합니다.
유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 기간 기간 내에 첫 번째 조정 시 Pod를 롤아웃합니다.
16.6.3. CA 인증서 및 개인 키 갱신 또는 교체 링크 복사링크가 클립보드에 복사되었습니다!
자체 CA 인증서 및 개인 키를 사용하는 경우 수동으로 갱신해야 합니다. Cluster Operator는 자동으로 갱신되지 않습니다. 갱신 기간이 만료되기 전에 CA 인증서를 갱신합니다. 동일한 절차를 사용하여 Apache Kafka Operator의 Streams에서 생성한 CA 인증서 및 개인 키를 자체 교체할 수도 있습니다.
CA 인증서 및 개인 키를 갱신하거나 교체할 때 이 절차의 단계를 수행합니다. 자체 CA 인증서만 갱신하는 경우 16.6.2절. “자체 CA 인증서 갱신” 을 참조하십시오.
이 절차에서는 PEM 형식의 CA 인증서 및 개인 키 갱신을 설명합니다.
다음 단계를 수행하기 전에 새 CA 인증서의 CN(Common Name)이 현재 CA 인증서와 다른지 확인합니다. 예를 들어 Cluster Operator에서 인증서를 자동으로 갱신하면 v<version_number > 접미사가 추가되어 버전을 확인합니다. 갱신마다 다른 접미사를 추가하여 자체 CA 인증서로 동일한 작업을 수행합니다. 다른 키를 사용하여 새 CA 인증서를 생성하면 Secret 에 저장된 현재 CA 인증서가 유지됩니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
- PEM 형식의 새 클러스터 또는 클라이언트 X.509 인증서 및 키가 있습니다.
프로세스
Kafka사용자 정의 리소스의 조정을 일시 중지합니다.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"사용자 정의 리소스의 상태 조건에
ReconciliationPaused: 변경 사항이 표시되는지 확인합니다.oc describe Kafka <name_of_custom_resource>유형조건은lastTransitionTime에서ReconciliationPaused로 변경됩니다.
Kafka사용자 정의 리소스의generateCertificateAuthority속성 설정을 확인합니다.속성이
false로 설정된 경우 Cluster Operator에 의해 CA 인증서가 생성되지 않습니다. 자체 인증서를 사용하는 경우 이 설정이 필요합니다.필요한 경우 기존
Kafka사용자 정의 리소스를 편집하고generateCertificateAuthority속성을false로 설정합니다.oc edit Kafka <name_of_custom_resource>다음 예제에서는 사용자에게 위임된 클러스터 및 클라이언트 CA 인증서 생성이 모두 있는
Kafka사용자 정의 리소스를 보여줍니다.자체 CA 인증서를 사용하는
Kafka구성의 예apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka # ... spec: # ... clusterCa: generateCertificateAuthority: false1 clientsCa: generateCertificateAuthority: false2 # ...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현재 CA 인증서의 이름을 변경하여 유지합니다.
data아래의 현재ca.crt속성의 이름을ca-<date>.crt로 변경합니다. 여기서 <date>는 YEAR-MONTH-DAYTHOUR-MINUTE-SECONDZ 형식의 인증서 만료 날짜입니다. 예:ca-2023-01-26T17-32-00Z.crt:. 현재 CA 인증서를 유지하기 위해 속성 값을 그대로 둡니다.새 CA 인증서를 base64로 인코딩합니다.
cat <path_to_new_certificate> | base64CA 인증서를 업데이트합니다.
data아래에 새ca.crt속성을 생성하고 이전 단계에서 base64로 인코딩된 CA 인증서를ca.crt속성 값으로 복사합니다.CA 인증서 생성 주석의 값을 늘립니다.
strimzi.io/ca-cert-generation주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어strimzi.io/ca-cert-generation=0을strimzi.io/ca-cert-generation=1으로 변경합니다. 보안에 주석이 없는 경우 값은0으로 처리되므로 값이1인 주석을 추가합니다.Apache Kafka용 Streams가 인증서를 생성하면 Cluster Operator에 의해 인증서 생성 주석이 자동으로 증가합니다. 자체 CA 인증서의 경우 더 높은 증분 값으로 주석을 설정합니다. 이 주석에는 Cluster Operator가 Pod를 롤아웃하고 인증서를 업데이트할 수 있도록 현재 보안의 값보다 높은 값이 필요합니다.
strimzi.io/ca-cert-generation는 각 CA 인증서 갱신에 따라 증가해야 합니다.새 CA 인증서 및 인증서 생성 주석 값을 사용하여 보안을 저장합니다.
새 CA 인증서로 업데이트된 보안 구성의 예
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F...1 ca-2023-01-26T17-32-00Z.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F...2 metadata: annotations: strimzi.io/ca-cert-generation: "1"3 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
새 CA 인증서에 서명하는 데 사용되는 CA 키의
시크릿을 업데이트합니다.기존 보안을 편집하여 새 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: OpaqueCA 키를 base64로 인코딩합니다.
cat <path_to_new_key> | base64CA 키를 업데이트합니다.
이전 단계에서 base64로 인코딩된 CA 키를
data아래의ca.key속성 값으로 복사합니다.CA 키 생성 주석의 값을 늘립니다.
strimzi.io/ca-key-generation주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어strimzi.io/ca-key-generation=0을strimzi.io/ca-key-generation=1으로 변경합니다. 보안에 주석이 없는 경우0으로 처리되므로 값이1인 주석을 추가합니다.Apache Kafka용 Streams가 인증서를 생성하면 Cluster Operator에 의해 키 생성 주석이 자동으로 증가합니다. 자체 CA 인증서와 새 CA 키의 경우 주석을 더 높은 증분 값으로 설정합니다. 이 주석에는 Cluster Operator가 Pod를 롤아웃하고 인증서 및 키를 업데이트할 수 있도록 현재 보안의 값보다 높은 값이 필요합니다.
strimzi.io/ca-key-generation는 각 CA 인증서 갱신에 따라 증가해야 합니다.새 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
일시 중지에서 다시 시작합니다.
Kafka사용자 정의 리소스 조정을 다시 시작하려면pause-reconciliation주석을false로 설정합니다.oc annotate --overwrite Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="false"pause-reconciliation주석을 제거하여 동일한 작업을 수행할 수도 있습니다.oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation-다음 조정에서 Cluster Operator는 새 CA 인증서를 신뢰하기 위해 Zoo Cryostat, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행합니다. 롤링 업데이트가 완료되면 Cluster Operator가 새 CA 키로 서명한 새 서버 인증서를 생성하기 위해 새 업데이트를 시작합니다.
유지 관리 시간 창이 구성된 경우 Cluster Operator는 다음 유지 관리 기간 기간 내에 첫 번째 조정 시 Pod를 롤아웃합니다.
- 롤링 업데이트가 새 CA 인증서로 이동할 때까지 기다립니다.
보안 구성에서 오래된 인증서를 제거하여 클러스터가 더 이상 신뢰하지 않도록 합니다.
oc edit secret <ca_certificate_secret_name>이전 인증서가 제거된 보안 구성의 예
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... metadata: annotations: strimzi.io/ca-cert-generation: "1" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque클러스터의 수동 롤링 업데이트를 시작하여 시크릿 구성에 대한 변경 사항을 가져옵니다.
17장. Apache Kafka Pod 및 컨테이너의 Streams에 보안 컨텍스트 적용 링크 복사링크가 클립보드에 복사되었습니다!
보안 컨텍스트는 포드 및 컨테이너에 대한 제약 조건을 정의합니다. 보안 컨텍스트를 지정하면 Pod 및 컨테이너에는 필요한 권한만 있습니다. 예를 들어 권한은 런타임 작업을 제어하거나 리소스에 대한 액세스를 제어할 수 있습니다.
17.1. OpenShift 플랫폼의 보안 컨텍스트 처리 링크 복사링크가 클립보드에 복사되었습니다!
보안 컨텍스트 처리는 사용 중인 OpenShift 플랫폼의 툴링에 따라 다릅니다.
예를 들어 OpenShift는 기본 제공 SCC(보안 컨텍스트 제약 조건)를 사용하여 권한을 제어합니다. SCC는 Pod에서 액세스할 수 있는 보안 기능을 제어하는 설정 및 전략입니다.
기본적으로 OpenShift는 보안 컨텍스트 구성을 자동으로 삽입합니다. 대부분의 경우 Cluster Operator가 생성한 Pod 및 컨테이너에 대한 보안 컨텍스트를 구성할 필요가 없습니다. 여전히 자체 SCC를 생성하고 관리할 수 있습니다.
자세한 내용은 OpenShift 설명서 를 참조하십시오.
18장. 브로커 추가 또는 제거를 통해 클러스터 스케일링 링크 복사링크가 클립보드에 복사되었습니다!
브로커를 추가하여 Kafka 클러스터를 확장하면 클러스터의 성능과 안정성을 높일 수 있습니다. 브로커를 더 많이 추가하면 사용 가능한 리소스가 증가하여 클러스터가 더 큰 워크로드를 처리하고 더 많은 메시지를 처리할 수 있습니다. 또한 더 많은 복제본 및 백업을 제공하여 내결함성을 향상시킬 수 있습니다. 반대로 활용도가 낮은 브로커를 제거하면 리소스 소비를 줄이고 효율성을 향상시킬 수 있습니다. 중단이나 데이터 손실을 방지하려면 스케일링을 신중하게 수행해야 합니다. 클러스터의 모든 브로커에 파티션을 재배포하면 각 브로커의 리소스 사용량이 줄어들어 클러스터의 전체 처리량이 증가할 수 있습니다.
Kafka 주제의 처리량을 높이기 위해 해당 항목의 파티션 수를 늘릴 수 있습니다. 이를 통해 클러스터의 여러 브로커 간에 주제의 부하를 공유할 수 있습니다. 그러나 모든 브로커가 특정 리소스(예: I/O)에 의해 제한되는 경우 파티션을 더 추가하면 처리량이 증가되지 않습니다. 이 경우 클러스터에 브로커를 더 추가해야 합니다.
Kafka.spec.kafka.replicas 구성을 조정하면 복제본 역할을 하는 클러스터의 브로커 수에 영향을 미칩니다. 주제의 실제 복제 요소는 default.replication.factor 및 min.insync.replicas 의 설정과 사용 가능한 브로커 수에 따라 결정됩니다. 예를 들어 3의 복제 요소는 주제의 각 파티션이 세 브로커에 복제되어 브로커가 실패할 경우 내결함성을 보장합니다.
복제본 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
replicas: 3
# ...
config:
# ...
default.replication.factor: 3
min.insync.replicas: 2
# ...
Kafka 리소스 구성을 통해 브로커를 추가할 때 노드 ID는 0(영)에서 시작되고 Cluster Operator는 가장 낮은 ID를 새 노드에 할당합니다. 브로커 제거 프로세스는 클러스터에서 가장 높은 ID가 있는 브로커 Pod에서 시작됩니다.
노드 풀을 사용하여 클러스터에서 노드를 관리하는 경우 KafkaNodePool.spec.replicas 구성을 조정하여 노드 풀의 노드 수를 변경합니다. 또한 노드 풀을 사용하여 기존 클러스터를 확장할 때 확장 작업에 노드 ID를 할당 할 수 있습니다.
브로커를 추가하거나 제거하면 Kafka가 자동으로 파티션을 다시 할당하지 않습니다. 가장 좋은 방법은 Cruise Control을 사용하는 것입니다. 클러스터를 확장하거나 축소할 때 Cruise Control의 add-brokers 및 remove-brokers 모드를 사용할 수 있습니다.
-
Kafka 클러스터를 확장한 후 기존 브로커에서 새로 추가된 브로커로 파티션 복제본을 이동한 후
add-brokers모드를 사용합니다. -
Kafka 클러스터를 축소하기 전에 제거하려는 브로커에서 파티션 복제본을 이동하기 전에
remove-brokers모드를 사용합니다.
18.1. 스케일 다운 작업에서 검사 건너뛰기 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 Apache Kafka용 Streams는 Kafka 클러스터에서 스케일링 다운 작업을 시작하기 전에 브로커에 파티션 복제본이 없는지 확인하기 위해 검사를 수행합니다. 점검은 브로커의 역할 또는 브로커 및 컨트롤러의 이중 역할을 수행하는 노드 풀의 노드에 적용됩니다.
복제본이 발견되면 잠재적인 데이터 손실을 방지하기 위해 스케일 다운이 수행되지 않습니다. 클러스터를 확장하려면 다시 축소하기 전에 브로커에 복제본을 남겨 두지 않아야 합니다.
그러나 이 메커니즘을 우회하려는 시나리오가 있을 수 있습니다. 예를 들어 새 주제가 브로커의 복제본을 계속 생성하기 때문에 사용 중인 클러스터에 검사를 비활성화해야 할 수 있습니다. 이 상황은 브로커가 거의 비어 있어도 축소를 무기한 차단할 수 있습니다. 이러한 방식으로 차단 메커니즘을 재정의하면 영향을 받습니다. 브로커에 축소되는 항목이 있으면 Kafka 클러스터에 대한 조정 실패가 발생할 수 있습니다.
Kafka 클러스터의 Kafka 리소스에 주석을 달아 차단 메커니즘을 바이패스할 수 있습니다. strimzi.io/skip-broker-scaledown-check 주석을 true 로 설정하여 리소스에 주석을 답니다.
스케일 다운 작업에서 검사를 건너뛸 주석 추가
oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check="true"
이 주석은 Apache Kafka의 Streams가 스케일 다운 검사를 건너뛰도록 지시합니다. my-kafka-cluster 를 특정 Kafka 리소스의 이름으로 교체합니다.
축소 작업 검사를 복원하려면 주석을 제거합니다.
스케일 다운 작업에서 검사를 건너뛸 주석 제거
oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check-
19장. Cruise Control을 사용하여 클러스터 재조정 링크 복사링크가 클립보드에 복사되었습니다!
cruise Control은 다음 Kafka 작업을 지원하는 오픈 소스 시스템입니다.
- 클러스터 워크로드 모니터링
- 사전 정의된 제약 조건을 기반으로 클러스터 재조정
이 작업은 브로커 Pod를 보다 효율적으로 사용하는 균형 있는 Kafka 클러스터를 실행하는 데 도움이 됩니다.
일반적인 클러스터는 시간이 지남에 따라 균등하게 로드할 수 있습니다. 대량의 메시지 트래픽을 처리하는 파티션은 사용 가능한 브로커에 균등하게 분산되지 않을 수 있습니다. 클러스터를 재조정하려면 관리자가 브로커의 부하를 모니터링하고 사용 중인 파티션을 예비 용량이 있는 브로커에 수동으로 다시 할당해야 합니다.
cruise Control은 클러스터 재조정 프로세스를 자동화합니다. CPU, 디스크 및 네트워크 로드를 기반으로 클러스터에 대한 리소스 사용률의 워크로드 모델을 구성하고, 분산 파티션 할당을 위해 최적화 제안(승인 또는 거부할 수 있음)을 생성합니다. 구성 가능한 최적화 목표 세트가 이러한 제안을 계산하는 데 사용됩니다.
특정 모드에서 최적화 제안을 생성할 수 있습니다. 기본 전체 모드는 모든 브로커에서 파티션을 재조정합니다. add-brokers 및 remove-brokers 모드를 사용하여 클러스터를 확장하거나 축소할 때 변경 사항을 적용할 수도 있습니다.
최적화 제안을 승인하면 Cruise Control이 Kafka 클러스터에 적용합니다. KafkaRebalance 리소스를 사용하여 최적화 제안을 구성하고 생성합니다. 최적화 제안이 자동으로 또는 수동으로 승인되도록 주석을 사용하여 리소스를 구성할 수 있습니다.
Apache Kafka용 스트림은 Cruise Control에 대한 구성 파일 예제 를 제공합니다.
19.1. 크루즈 컨트롤 구성 요소 및 기능 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤은 로드 모니터, Analyzer, Anomaly Detector 및 Executor-및 클라이언트 상호 작용을 위한 REST API 등 네 가지 주요 구성 요소로 구성됩니다. Apache Kafka의 스트림은 REST API를 사용하여 다음 Cruise Control 기능을 지원합니다.
- 최적화 목표에서 최적화 제안을 생성합니다.
- 최적화 제안을 기반으로 Kafka 클러스터 재조정.
- 최적화 목표
최적화 목표는 리밸런스에서 달성하기위한 특정 목표를 설명합니다. 예를 들어 목표는 브로커 간에 주제 복제본을 보다 균등하게 배포하는 것입니다. 구성을 통해 포함할 목표를 변경할 수 있습니다. 목표는 하드 목표 또는 소프트 목표로 정의됩니다. Cruise Control 배포 구성을 통해 하드 목표를 추가할 수 있습니다. 또한 이러한 각 카테고리에 적합한 기본, 기본값 및 사용자 제공 목표를 가지고 있습니다.
- 하드 목표는 사전 설정되었으며 성공적인 최적화 제안에 충족해야 합니다.
- 최적화 제안이 성공하려면 소프트 목표를 충족할 필요가 없습니다. 모든 어려운 목표를 달성하는 경우 별도로 설정할 수 있습니다.
- 주요 목표는 Cruise Control에서 상속됩니다. 일부는 어려운 목표로 구성되어 있습니다. 주요 목표는 기본적으로 최적화 제안에 사용됩니다.
- 기본 목표는 기본적으로 기본 목표와 동일합니다. 자체 기본 목표 세트를 지정할 수 있습니다.
- 사용자 제공 목표는 특정 최적화 제안을 생성하도록 구성된 기본 목표의 하위 집합입니다.
- 최적화 제안
최적화 제안은 재조정에서 달성하려는 목표를 포함합니다. 제안된 변경 사항에 대한 요약과 리밸런스로 가능한 결과를 생성하기 위한 최적화 제안을 생성합니다. 목표는 특정 우선 순위 순서로 평가됩니다. 그런 다음 제안서를 승인하거나 거부하도록 선택할 수 있습니다. 조정된 목표 세트로 다시 실행하려는 제안을 거부할 수 있습니다.
세 가지 모드 중 하나로 최적화 제안을 생성할 수 있습니다.
-
full은 기본 모드이며 전체 리밸런스를 실행합니다. -
add-brokers는 Kafka 클러스터를 확장할 때 브로커를 추가한 후 사용하는 모드입니다. -
remove-brokers는 Kafka 클러스터를 축소할 때 브로커를 제거하기 전에 사용하는 모드입니다.
-
다른 Cruise Control 기능은 현재 자체 교복, 알림, 쓰기 사용자 지정 목표, 주제 복제 요인 변경 등 현재 지원되지 않습니다.
19.2. 최적화 목표 개요 링크 복사링크가 클립보드에 복사되었습니다!
최적화 목표는 Kafka 클러스터의 워크로드 재배포 및 리소스 사용률에 대한 제약입니다. Kafka 클러스터를 재조정하기 위해 Cruise Control은 최적화 목표를 사용하여 승인 또는 거부할 수 있는 최적화 제안을 생성합니다.
19.2.1. 우선 순위의 목표 순서 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 Cruise Control 프로젝트에서 개발된 대부분의 최적화 목표를 지원합니다. 지원되는 목표는 기본 우선순위 내림차순으로 다음과 같습니다.
- Rack-awareness
- 주제 집합의 브로커당 최소 리더 복제본 수
- 복제본 용량
용량 목표
- 디스크 용량
- 네트워크 인바운드 용량
- 네트워크 아웃 바운드 용량
- CPU 용량
- 복제본 배포
- 잠재적인 네트워크 출력
리소스 배포 목표
- 디스크 사용률 배포
- 네트워크 인바운드 사용률 배포
- 네트워크 아웃 바운드 사용률 배포
- CPU 사용률 배포
- Leader bytes-in rate distribution
- 주제 복제본 배포
- 리더 복제본 배포
- 선호하는 리더 선택
- Intra-broker 디스크 용량
- Intra-broker 디스크 사용 배포
각 최적화 목표에 대한 자세한 내용은 Cruise Control Wiki의 목표를 참조하십시오.
"자신의 쓰기" 목표와 Kafka 할당자 목표는 아직 지원되지 않습니다.
19.2.2. Apache Kafka 사용자 정의 리소스에 대한 Streams의 목표 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 및 KafkaRebalance 사용자 정의 리소스에서 최적화 목표를 구성합니다. 크루즈 컨트롤에는 주요, 기본값 및 사용자 제공 최적화 목표를 충족해야 하는 하드 최적화 목표에 대한 구성이 있습니다.
다음 구성에서 최적화 목표를 지정할 수 있습니다.
-
주요 목적 Cryostat-
Kafka.spec.cruiseControl.config.goals -
하드 목적 Cryostat-
Kafka.spec.cruiseControl.config.hard.goals -
기본 목적 Cryostat-
Kafka.spec.cruiseControl.config.default.goals -
사용자 제공 목표 Cryo stat-
KafkaRebalance.spec.goals
리소스 배포 목표는 브로커 리소스에 대한 용량 제한 의 적용을 받습니다.
19.2.3. 하드 및 소프트 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
하드 목표는 최적화 제안에 충족해야 하는 목표입니다. Cruise Control 코드에서 하드 목표로 정의되지 않은 목표는 소프트 목표 라고 합니다. 소프트 목표는 최선의 노력 목표로 생각할 수 있습니다: 최적화 제안에 만족 할 필요는 없지만 최적화 계산에 포함됩니다. 하나 이상의 소프트 목표를 위반하지만 모든 하드 목표를 충족하는 최적화 제안은 유효합니다.
크루즈 컨트롤은 가능한 한 많은 하드 목표와 가능한 많은 소프트 목표를 충족하는 최적화 제안을 계산합니다. 모든 하드 목표를 충족하지 않는 최적화 제안은 Cruise Control에 의해 거부되고 승인을 위해 사용자에게 전송되지 않습니다.
예를 들어 클러스터에 주제의 복제본을 균등하게 분배하는 소프트 목표를 가질 수 있습니다(복제 복제본 배포 목표 참조). 크루즈 컨트롤은 구성된 모든 하드 목표를 달성할 수 있도록 하는 경우 이 목표를 무시합니다.
Cruise Control에서 다음과 같은 주요 최적화 목표는 어려운 목표입니다.
RackAwareGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal
Cruise Control 배포 구성에서 Kafka.spec.cruiseControl.config 의 hard.goals 속성을 사용하여 적용할 하드 목표를 지정할 수 있습니다.
-
모든 하드 목표를 강제 실행하려면
hard.goals속성을 생략하면 됩니다. -
Cruise Control이 적용하는 하드 목표를 변경하려면 정규화된 도메인 이름을 사용하여
hard.goals속성에 필요한 목표를 지정합니다. -
특정 하드 목표를 실행하지 못하도록 목표는
default.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: true 가 KafkaRebalance 사용자 정의 리소스에 지정된 경우 Cruise Control은 사용자 제공 최적화 목표 목록( KafkaRebalance.spec.goals)에 구성된 모든 하드 목표(hard.goals)가 포함되어 있는지 확인하지 않습니다. 따라서 사용자 제공 최적화 목표의 일부만 hard.goals 목록에 있는 경우 Cruise Control은 skipHardGoalCheck: true 가 지정된 경우에도 여전히 하드 목표로 처리합니다.
19.2.4. 주요 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
주요 최적화 목표는 모든 사용자가 사용할 수 있습니다. 주요 최적화 목표에 나열되지 않은 목표는 Cruise Control 작업에서 사용할 수 없습니다.
Cruise Control 배포 구성 을 변경하지 않는 한, Apache Kafka의 Streams는 Cruise Control의 다음과 같은 기본 최적화 목표를 내림차순으로 상속합니다.
RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal
이러한 목표 중 일부는 하드 목표로 사전 설정되어 있습니다.
복잡성을 줄이려면 KafkaRebalance 리소스에서 하나 이상의 목표를 완전히 제외할 필요가 없는 상속된 기본 최적화 목표를 사용하는 것이 좋습니다. 기본 최적화 목표의 우선 순위 순서는 필요한 경우 기본 최적화 목표에 대한 구성에서 수정할 수 있습니다.
필요한 경우 Cruise Control 배포 구성에서 기본 최적화 목표를 구성합니다. Kafka.spec.cruiseControl.config.goals
-
상속된 주요 최적화 목표를 수락하려면
Kafka.spec.cruiseControl.config에서goals속성을 지정하지 마십시오. -
상속된 기본 최적화 목표를 수정해야 하는 경우 목표 목록을 대상 구성 옵션에 내림차순으로 지정합니다.
최적화 제안을 생성할 때 오류를 방지하려면 Kafka.spec.cruiseControl.config 의 목표 또는 default.goals 에 대한 변경 사항이 hard.goals 속성에 지정된 모든 하드 목표를 포함해야 합니다. 명확히 하려면 주요 최적화 목표 및 기본 목표에 대해 (하위 세트로) 하드 목표를 지정해야 합니다.
19.2.5. 기본 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
cruise Control은 기본 최적화 목표를 사용하여 캐시된 최적화 제안을 생성합니다. 캐시된 최적화 제안에 대한 자세한 내용은 19.3절. “최적화 제안 개요” 을 참조하십시오.
KafkaRebalance 사용자 정의 리소스에서 사용자 제공 최적화 목표를 설정하여 기본 최적화 목표를 덮어쓸 수 있습니다.
Cruise Control 배포 구성에 default.goals 를 지정하지 않는 한 주요 최적화 목표는 기본 최적화 목표로 사용됩니다. 이 경우 캐시된 최적화 제안은 주요 최적화 목표를 사용하여 생성됩니다.
-
기본 최적화 목표를 기본 목표로 사용하려면
Kafka.spec.cruiseControl.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
# ...
기본 최적화 목표를 지정하지 않으면 기본 최적화 목표를 사용하여 캐시된 제안서가 생성됩니다.
19.2.6. 사용자 제공 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
사용자 제공 최적화 목표는 특정 최적화 제안에 대해 구성된 기본 목표를 좁힙니다. KafkaRebalance 사용자 정의 리소스의 spec.goals 에서 필요에 따라 이를 설정할 수 있습니다.
KafkaRebalance.spec.goals
사용자 제공 최적화 목표는 다양한 시나리오에 대한 최적화 제안을 생성할 수 있습니다. 예를 들어 디스크 용량 또는 디스크 사용률을 고려하지 않고 Kafka 클러스터에서 리더 복제본 배포를 최적화할 수 있습니다. 따라서 리더 복제본 배포를 위한 단일 사용자 제공 목표를 포함하는 KafkaRebalance 사용자 정의 리소스를 생성합니다.
사용자 제공 최적화 목표는 다음과 같아야 합니다.
- 구성된 모든 하드 목표를 포함하거나 오류가 발생합니다.
- 주요 최적화 목표의 하위 집합이 될 수 있습니다.
최적화 제안을 생성할 때 구성된 하드 목표를 무시하려면 skipHardGoalCheck: true 속성을 KafkaRebalance 사용자 지정 리소스에 추가합니다. 19.6절. “최적화 제안 생성”을 참조하십시오.
19.3. 최적화 제안 개요 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안을 생성하고 제안된 변경 사항을 적용하도록 KafkaRebalance 리소스를 구성합니다. 최적화 제안은 브로커 간에 파티션 워크로드가 더 균등하게 분산되는 Kafka 클러스터를 생성하는 제안된 변경 사항에 대한 요약입니다.
각 최적화 제안은 브로커 리소스에 대해 구성된 용량 제한에 따라 이를 생성하는 데 사용된 최적화 목표 세트를 기반으로 합니다.
모든 최적화 제안은 제안된 리밸런스의 영향에 대한 추정치 입니다. 제안을 승인하거나 거부할 수 있습니다. 최적화 제안을 먼저 생성하지 않고 클러스터 재조정을 승인할 수 없습니다.
다음 재조정 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.
-
full -
add-brokers -
remove-brokers
19.3.1. 재조정 모드 링크 복사링크가 클립보드에 복사되었습니다!
KafkaRebalance 사용자 정의 리소스의 spec.mode 속성을 사용하여 리밸런싱 모드를 지정합니다.
full-
전체모드는 클러스터의 모든 브로커에서 복제본을 이동하여 전체 재조정을 실행합니다.spec.mode속성이KafkaRebalance사용자 정의 리소스에 정의되지 않은 경우 기본 모드입니다. add-brokers-
add-brokers모드는 하나 이상의 브로커를 추가하여 Kafka 클러스터를 확장한 후 사용됩니다. 일반적으로 Kafka 클러스터를 확장한 후 새 브로커는 새로 생성된 주제의 파티션만 호스팅하는 데 사용됩니다. 새 항목이 생성되지 않으면 새로 추가된 브로커가 사용되지 않고 기존 브로커가 동일한 부하에 남아 있습니다. 클러스터에 브로커를 추가한 직후add-brokers모드를 사용하면 재조정 작업이 기존 브로커에서 새로 추가된 브로커로 복제본이 이동합니다.KafkaRebalance사용자 정의 리소스의spec.brokers속성을 사용하여 새 브로커를 목록으로 지정합니다. remove-brokers-
remove-brokers모드는 하나 이상의 브로커를 제거하여 Kafka 클러스터를 축소하기 전에 사용됩니다. Kafka 클러스터를 축소하는 경우 복제본을 호스팅하는 경우에도 브로커가 종료됩니다. 이로 인해 복제되지 않은 파티션이 발생할 수 있으며 일부 파티션이 최소 ISR(동기화형 복제본)에 있을 수 있습니다. 이러한 잠재적인 문제를 방지하기 위해remove-brokers모드는 제거될 브로커에서 복제본을 이동합니다. 이러한 브로커가 더 이상 복제본을 호스팅하지 않으면 축소 작업을 안전하게 실행할 수 있습니다. 제거 중인 브로커는KafkaRebalance사용자 정의 리소스의spec.brokers속성에서 목록으로 지정합니다.
일반적으로 전체 리밸런스 모드를 사용하여 브로커 간에 부하를 분산하여 Kafka 클러스터를 재조정합니다. 클러스터를 확장하거나 축소하고 그에 따라 복제본을 재조정하려는 경우에만 add-brokers 및 remove-brokers 모드를 사용합니다.
리밸런스를 실행하는 절차는 세 가지 모드에서 실제로 동일합니다. 유일한 차이점은 spec.mode 속성을 통해 모드를 지정하고 필요한 경우 spec.brokers 속성을 통해 추가되거나 제거될 브로커 목록을 지정하는 것입니다.
19.3.2. 최적화 제안의 결과 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안이 생성되면 요약 및 브로커 로드가 반환됩니다.
- 요약
-
요약은
KafkaRebalance리소스에 포함되어 있습니다. 요약은 제안된 클러스터 리밸런스에 대한 개요를 제공하고 관련 변경 사항의 규모를 나타냅니다. 성공적으로 생성된 최적화 제안 요약은KafkaRebalance리소스의Status.OptimizationResult속성에 포함되어 있습니다. 제공되는 정보는 전체 최적화 제안에 대한 요약입니다. - 브로커 로드
- 브로커 로드는 데이터를 JSON 문자열로 포함하는 ConfigMap에 저장됩니다. 브로커 로드는 제안된 리밸런스에 대한 값 전후에 표시되므로 클러스터의 각 브로커에 미치는 영향을 확인할 수 있습니다.
19.3.3. 최적화 제안을 수동으로 승인 또는 거부 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안 요약은 제안된 변경 범위를 보여줍니다.
KafkaRebalance 리소스의 이름을 사용하여 명령줄에서 요약을 반환할 수 있습니다.
최적화 제안 요약 반환
oc describe kafkarebalance <kafka_rebalance_resource_name> -n <namespace>
jq 명령줄 JSON 구문 분석 도구를 사용할 수도 있습니다.
jq를 사용하여 최적화 제안 요약 반환
oc get kafkarebalance -o json | jq <jq_query>.
요약을 사용하여 최적화 제안을 승인하거나 거부할지 여부를 결정합니다.
- 최적화 제안 승인
-
승인하도록
KafkaRebalance리소스의strimzi.io/rebalance주석을 설정하여 최적화 제안을승인합니다. 크루즈 컨트롤은 이 제안을 Kafka 클러스터에 적용하고 클러스터 재조정 작업을 시작합니다. - 최적화 제안 거부
-
최적화 제안을 승인하지 않도록 선택하는 경우 최적화 목표를 변경하거나 성능 튜닝 옵션을 재조정 한 다음 다른 제안을 생성할 수 있습니다.
strimzi.io/rebalance주석을새로 고침하도록 설정하여KafkaRebalance리소스에 대한 새로운 최적화 제안을 생성할 수 있습니다.
재조정에 필요한 효과를 평가하기 위해 최적화 제안을 사용하십시오. 예를 들어 요약은broker 및 intra-broker 이동을 설명합니다. 브랜드 간 리밸런스(broker)는 별도의 브로커 간에 데이터를 리밸런싱합니다. Intra-broker 재조정은 JBOD 스토리지 구성을 사용할 때 동일한 브로커의 디스크 간에 데이터를 이동합니다. 이러한 정보는 귀하가 진행하지 않고 제안을 승인하더라도 유용할 수 있습니다.
재조정할 때 Kafka 클러스터에서 추가 로드로 인해 최적화 제안을 거부하거나 승인을 지연할 수 있습니다.
다음 예에서 제안서는 별도의 브로커 간 데이터 재조정을 제안합니다. 리밸런스에는 브로커 간에 총 12MB의 데이터가 있는 55 파티션 복제본의 이동이 포함됩니다. 파티션 복제본 간 이동은 성능에 큰 영향을 미치지만 총 데이터 양이 크지 않습니다. 총 데이터가 훨씬 큰 경우 제안서를 거부하거나 Kafka 클러스터 성능에 미치는 영향을 제한하기 위해 리밸런스를 승인하는 시간을 거부할 수 있습니다.
성능 튜닝 옵션을 재조정하면 데이터 이동의 영향을 줄이는 데 도움이 될 수 있습니다. 리밸런스 기간을 연장할 수 있는 경우 리밸런스를 작은 일괄 처리로 나눌 수 있습니다. 한 번에 데이터 이동이 줄어들어 클러스터의 부하를 줄일 수 있습니다.
최적화 제안 요약 예
Name: my-rebalance
Namespace: myproject
Labels: strimzi.io/cluster=my-cluster
Annotations: API Version: kafka.strimzi.io/v1alpha1
Kind: KafkaRebalance
Metadata:
# ...
Status:
Conditions:
Last Transition Time: 2022-04-05T14:36:11.900Z
Status: ProposalReady
Type: State
Observed Generation: 1
Optimization Result:
Data To Move MB: 0
Excluded Brokers For Leadership:
Excluded Brokers For Replica Move:
Excluded Topics:
Intra Broker Data To Move MB: 12
Monitored Partitions Percentage: 100
Num Intra Broker Replica Movements: 0
Num Leader Movements: 24
Num Replica Movements: 55
On Demand Balancedness Score After: 82.91290759174306
On Demand Balancedness Score Before: 78.01176356230222
Recent Windows: 5
Session Id: a4f833bd-2055-4213-bfdd-ad21f95bf184
이 제안은 24 개의 파티션 리더를 다른 브로커로 이동합니다. 이를 위해서는 Zoo Cryostat 구성을 변경해야 하며 이는 성능에 미치는 영향은 낮습니다.
균형 잡힌 점수는 최적화 제안이 승인되기 전과 후에 Kafka 클러스터의 전체 균형에 대한 측정입니다. 균형 잡힌 점수는 최적화 목표를 기반으로합니다. 모든 목표를 충족하면 점수는 100입니다. 달성되지 않는 각 목표의 점수가 줄어듭니다. 균형 잡힌 점수를 비교하여 Kafka 클러스터가 리밸런스를 팔로우할 수 있는 것보다 더 적은지 확인합니다.
19.3.4. 최적화 제안 자동 승인 링크 복사링크가 클립보드에 복사되었습니다!
시간을 절약하기 위해 최적화 제안 승인 프로세스를 자동화할 수 있습니다. 자동화를 사용하면 최적화 제안을 생성할 때 클러스터 재조정으로 바로 들어갑니다.
최적화 제안 자동 승인 메커니즘을 활성화하려면 strimzi.io/rebalance-auto-approval 주석이 true 로 설정된 KafkaRebalance 리소스를 생성합니다. 주석을 설정하지 않거나 false 로 설정하면 최적화 제안에 수동 승인이 필요합니다.
자동 승인 메커니즘을 사용하여 리밸런스 요청의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaRebalance
metadata:
name: my-rebalance
labels:
strimzi.io/cluster: my-cluster
annotations:
strimzi.io/rebalance-auto-approval: "true"
spec:
mode: # any mode
# ...
최적화 제안을 자동으로 승인할 때 상태를 확인할 수 있습니다. 리밸런스가 완료되면 KafkaRebalance 리소스의 상태가 Ready 로 이동합니다.
19.3.5. 최적화 제안 요약 속성 링크 복사링크가 클립보드에 복사되었습니다!
다음 표에서는 최적화 제안의 요약 섹션에 포함된 속성에 대해 설명합니다.
| JSON 속성 | 설명 |
|---|---|
|
| 클러스터 브로커의 디스크 간에 전송할 총 파티션 복제본 수입니다.
리밸런스 작업 중 성능에 미치는 영향: 영구적으로 높지만 |
|
| 아직 지원되지 않습니다. 빈 목록이 반환됩니다. |
|
| 별도의 브로커 간에 이동할 파티션 복제본 수입니다. 리밸런스 작업 중 성능에 미치는 영향: Relatively high. |
|
| 최적화 제안이 생성 되기 전과 후에 Kafka 클러스터의 전반적인 균형을 측정합니다.
점수는 각 분류된 소프트 목표를 100에서 위반하는
|
|
|
동일한 브로커의 디스크 간에 이동할 각 파티션 복제본의 크기 합계
리밸런스 작업 중 성능에 미치는 영향: 변수. 숫자가 클수록 클러스터 리밸런스를 완료하는 데 시간이 오래 걸립니다. 동일한 브로커의 디스크 간에 대량의 데이터를 이동하면 별도의 브로커보다 영향을 덜 받습니다(Data |
|
| 최적화 제안서를 기반으로 하는 메트릭 창 수입니다. |
|
|
별도의 브로커로 이동할 각 파티션 복제본의 크기의 합계입니다 ( 리밸런스 작업 중 성능에 미치는 영향: 변수. 숫자가 클수록 클러스터 리밸런스를 완료하는 데 시간이 오래 걸립니다. |
|
|
최적화 제안에 적용되는 Kafka 클러스터의 파티션 백분율입니다. |
|
|
|
|
| 리더가 다른 복제본으로 전환될 파티션의 수입니다. 이를 위해서는 Zoo Cryostat 구성을 변경해야 합니다. 리밸런스 작업 중 성능에 미치는 영향: Relatively low. |
|
| 아직 지원되지 않습니다. 빈 목록이 반환됩니다. |
19.3.6. 브로커 로드 속성 링크 복사링크가 클립보드에 복사되었습니다!
브로커 로드는 JSON 형식 문자열과 KafkaRebalance 사용자 정의 리소스와 동일한 이름( KafkaRebalance 사용자 정의 리소스와 동일한 이름)에 저장됩니다. 이 JSON 문자열은 각 브로커의 여러 메트릭에 연결된 각 브로커 ID의 키가 있는 JSON 오브젝트로 구성됩니다. 각 메트릭은 세 개의 값으로 구성됩니다. 첫 번째는 최적화 제안이 적용되기 전에 메트릭 값이고, 두 번째는 제안이 적용된 후 지표의 예상값이며, 세 번째는 처음 두 값 사이의 차이입니다(이전에서 제외).
KafkaRebalance 리소스가 ProposalReady 상태에 있을 때 ConfigMap이 표시되고 리밸런스가 완료된 후에도 유지됩니다.
ConfigMap의 이름을 사용하여 명령줄에서 해당 데이터를 볼 수 있습니다.
ConfigMap 데이터 반환
oc describe configmaps <my_rebalance_configmap_name> -n <namespace>
jq 명령줄 JSON 구문 분석 도구를 사용하여 ConfigMap에서 JSON 문자열을 추출할 수도 있습니다.
jq를 사용하여 ConfigMap에서 JSON 문자열 추출
oc get configmaps <my_rebalance_configmap_name> -o json | jq '.["data"]["brokerLoad.json"]|fromjson|.'
다음 표에서는 최적화 제안의 브로커 로드 ConfigMap에 포함된 속성을 설명합니다.
| JSON 속성 | 설명 |
|---|---|
|
| 파티션 리더인 이 브로커의 복제본 수입니다. |
|
| 이 브로커의 복제본 수입니다. |
|
| 정의된 용량의 백분율로 CPU 사용률입니다. |
|
| 정의된 용량의 백분율로 디스크 사용률입니다. |
|
| 절대 디스크 사용량(MB)입니다. |
|
| 브로커의 총 네트워크 출력 비율입니다. |
|
| 이 브로커의 모든 파티션 리더 복제본의 네트워크 입력 비율입니다. |
|
| 이 브로커의 모든 후속 복제본의 네트워크 입력 비율입니다. |
|
| 이 브로커가 현재 호스팅되는 모든 복제본의 리더가 되는 경우 실현 가능한 최대 네트워크 출력 비율입니다. |
19.3.7. 캐시된 최적화 제안 링크 복사링크가 클립보드에 복사되었습니다!
cruise Control은 구성된 기본 최적화 목표에 따라 캐시된 최적화 제안을 유지합니다. 워크로드 모델에서 생성된 캐시된 최적화 제안은 Kafka 클러스터의 현재 상태를 반영하도록 15분마다 업데이트됩니다. 기본 최적화 목표를 사용하여 최적화 제안을 생성하면 Cruise Control은 최신 캐시된 제안을 반환합니다.
캐시된 최적화 제안 새로 고침 간격을 변경하려면 Cruise Control 배포 구성에서 proposal.expiration.ms 설정을 편집합니다. Cruise Control 서버의 로드가 증가하지만 빠르게 변화하는 클러스터의 더 짧은 간격을 고려하십시오.
19.4. 성능 튜닝 개요 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 재조정을 위해 여러 성능 튜닝 옵션을 조정할 수 있습니다. 이러한 옵션은 리밸런스에서의 파티션 복제본 및 리더십 이동 방식 및 리밸런스 작업에 할당된 대역폭을 제어합니다.
19.4.1. 파티션 재할당 명령 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안은 별도의 파티션 재할당 명령으로 구성됩니다. 제안을 승인 하면 Cruise Control 서버에서 이러한 명령을 Kafka 클러스터에 적용합니다.
파티션 재할당 명령은 다음 작업 유형 중 하나로 구성됩니다.
파티션 이동: 파티션 복제본과 해당 데이터를 새 위치로 전송합니다. 파티션 모음은 다음 두 가지 형식 중 하나를 수행할 수 있습니다.
- 브랜드 간 이동: 파티션 복제본이 다른 브로커의 로그 디렉터리로 이동됩니다.
- Intra-broker 이동: 파티션 복제본은 동일한 브로커의 다른 로그 디렉터리로 이동합니다.
- 리더십 이동: 파티션 복제본의 리더를 전환해야 합니다.
cruise Control은 배치의 Kafka 클러스터에 파티션 재할당 명령을 발행합니다. 리밸런스 중 클러스터 성능은 각 배치에 포함된 각 이동 유형의 영향을 받습니다.
19.4.2. 복제본 이동 전략 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 리밸런스 성능은 파티션 재할당 명령의 배치에 적용되는 복제본 이동 전략 의 영향을 받습니다. 기본적으로 Cruise Control은 생성된 순서대로 명령을 간단히 적용하는 BaseReplica CryostatmentStrategy 를 사용합니다. 그러나 제안 초기에 매우 큰 파티션 재할당이 있는 경우 이 전략은 다른 재할당의 적용 속도가 느려질 수 있습니다.
cruise Control은 최적화 제안에 적용할 수 있는 네 가지 대체 복제본 이동 전략을 제공합니다.
-
PrioritizeSmallReplicamentStrategy: 오름차순으로 재할당합니다. -
PrioritizeLargeReplicamentStrategy: 내림차순으로 재할당합니다. -
PostponeUrpReplica>-<mentStrategy: 동기화되지 않은 복제본이 없는 파티션 복제본의 재할당을 우선순위화합니다. -
PrioritizeMinIsrWithOfflineReplicasStrategy: 오프라인 복제본을 사용하여 (At/Under)MinISR 파티션을 사용하여 재할당을 우선순위화합니다. 이 전략은Kafka사용자 정의 리소스의 사양에서cruiseControl.config.concurrency.adjuster.min.isr.check.enabled가true로 설정된 경우에만 작동합니다.
이러한 전략은 시퀀스로 구성할 수 있습니다. 첫 번째 전략은 내부 논리를 사용하여 두 파티션 재할당을 비교하려고 합니다. 재할당이 동일한 경우 순서에서 다음 전략으로 전달하여 순서를 결정하는 등의 작업을 수행합니다.
19.4.3. Intra-broker 디스크 밸런싱 링크 복사링크가 클립보드에 복사되었습니다!
동일한 브로커의 디스크 간에 대량의 데이터를 이동해도 별도의 브로커보다 더 적은 영향을 미칩니다. 동일한 브로커에 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포를 실행 중인 경우 Cruise Control은 디스크 간에 파티션의 균형을 조정할 수 있습니다.
단일 디스크와 함께 JBOD 스토리지를 사용하는 경우 균형을 조정할 디스크가 없으므로 intra-broker 디스크 밸런싱이 0인 제안이 발생합니다.
intra-broker 디스크 균형을 수행하려면 KafkaRebalance.spec 에서 rebalanceDisk 를 true 로 설정합니다. rebalanceDisk 를 true 로 설정할 때 Cruise Control이 자동으로 브랜드 내 목표를 설정하고 브랜드 간 목표를 무시하므로 KafkaRebalance.spec 의 목표 필드를 설정하지 마십시오. 크루즈 컨트롤은broker와 intra-broker 밸런싱을 동시에 수행하지 않습니다.
19.4.4. 조정 옵션 재조정 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤은 위에서 설명한 리밸런스 매개변수를 조정하기 위한 몇 가지 구성 옵션을 제공합니다. Kafka 또는 최적화 제안 수준을 사용하여 Cruise Control을 구성하고 배포 할 때 이러한 튜닝 옵션을 설정할 수 있습니다.
-
Cruise Control 서버 설정은
Kafka.spec.cruiseControl.config의 Kafka 사용자 지정 리소스에서 설정할 수 있습니다. -
개별 리밸런스 성능 구성은
KafkaRebalance.spec아래에 설정할 수 있습니다.
관련 구성은 다음 표에 요약되어 있습니다.
| 크루즈 컨트롤 속성 | KafkaRebalance 속성 | 기본 | 설명 |
|---|---|---|---|
|
|
| 5 | 각 파티션 재할당 배치의 최대 구성 요소 수 |
|
|
| 2 | 각 파티션 재할당 배치에서 인트라브러 파티션의 최대 수 |
|
|
| 1000 | 각 파티션 재할당 배치의 최대 파티션 리더십 변경 수 |
|
|
| null (제한 없음) | 파티션 재할당에 할당할 대역폭(초당 바이트 단위) |
|
|
|
|
생성된 제안서에 대해 파티션 재할당 명령이 실행되는 순서를 결정하는 데 사용되는 전략 목록(우선순)입니다. 서버 설정의 경우 전략 클래스의 정규화된 이름으로 쉼표로 구분된 문자열을 사용합니다( 각 클래스 이름 시작에 |
| - |
| false | intra-broker 디스크 밸런싱을 활성화합니다. 이는 동일한 브로커의 디스크 공간 사용률의 균형을 유지합니다. 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포에만 적용됩니다. |
기본 설정을 변경하면 리밸런스가 완료하는 데 걸리는 시간과 재조정 중 Kafka 클러스터에 배치된 로드에 영향을 미칩니다. 더 낮은 값을 사용하면 로드가 줄어들지만 사용된 시간이 증가하고 그 반대의 경우도 마찬가지입니다.
19.5. Kafka를 사용하여 Cruise Control 구성 및 배포 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터와 함께 Cruise Control을 배포하도록 Kafka 리소스를 구성합니다. Kafka 리소스의 cruiseControl 속성을 사용하여 배포를 구성할 수 있습니다. Kafka 클러스터당 하나의 Cruise Control 인스턴스를 배포합니다.
Cruise Control config 에서 목표 구성을 사용하여 최적화 제안을 생성하기 위한 최적화 목표를 지정합니다. brokerCapacity 를 사용하여 리소스 배포와 관련된 목표에 대한 기본 용량 제한을 변경할 수 있습니다. 브로커가 이기종 네트워크 리소스가 있는 노드에서 실행 중인 경우 재정의 를 사용하여 각 브로커의 네트워크 용량 제한을 설정할 수 있습니다.
cruiseControl 구성에 빈 오브젝트({})를 사용하는 경우 모든 속성은 기본값을 사용합니다.
Cruise Control의 구성 옵션에 대한 자세한 내용은 Streams for Apache Kafka Custom Resource API Reference 를 참조하십시오.
사전 요구 사항
- OpenShift 클러스터
- 실행중인 Cluster Operator
프로세스
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: true5 webserver.http.cors.origin: "*" webserver.http.cors.exposeheaders: "User-Task-ID,Content-Type" # ... resources:6 requests: cpu: 1 memory: 512Mi limits: cpu: 2 memory: 2Gi logging:7 type: inline loggers: rootLogger.level: INFO template:8 pod: metadata: labels: label1: value1 securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe:9 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 metricsConfig:10 type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: cruise-control-metrics key: metrics-config.yml # ...- 1
- 브로커 리소스에 대한 용량 제한입니다.
- 2
- 덮어쓰기는 이기종 네트워크 리소스가 있는 노드에서 실행할 때 특정 브로커에 대한 네트워크 용량 제한을 설정합니다.
- 3
- 크루즈 제어 구성. 표준 크루즈 컨트롤 구성은 Apache Kafka용 Streams에서 직접 관리하지 않는 속성으로 제공될 수 있습니다.
- 4
- 최적화 목표 구성: 기본 최적화 목표(
default.goals), 주요 최적화 목표(대상) 및 하드목표(hard.goals)를 위한 구성을 포함할 수 있습니다. - 5
- CORS를 활성화하고 Cruise Control API에 대한 읽기 전용 액세스를 위해 구성되었습니다.
- 6
- 지원되는 리소스(현재
cpu및memory) 예약 요청 및 사용할 수 있는 최대 리소스를 지정합니다. - 7
- 크루즈 제어 로거 및 로그 수준은 ConfigMap을 통해 직접(
인라인) 또는 간접적으로(외부)에 추가됩니다. 사용자 정의 Log4j 구성은 ConfigMap의log4j.properties키 아래에 배치해야 합니다. cruise Control에는rootLogger.level이라는 단일 로거가 있습니다. 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다. - 8
- 템플릿 사용자 지정. 여기에서 Pod는 추가 보안 특성으로 예약됩니다.
- 9
- 컨테이너를 다시 시작할 시기(라이브)와 컨테이너가 트래픽을 허용할 시기(준비)를 확인할 상태 점검입니다.
- 10
- Prometheus 지표가 활성화되어 있습니다. 이 예에서는 Prometheus Cryostat Exporter(기본 지표 내보내기)에 대한 메트릭이 구성됩니다.
리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>배포 상태를 확인합니다.
oc get deployments -n <my_cluster_operator_namespace>출력에 배포 이름 및 준비 상태 표시
NAME READY UP-TO-DATE AVAILABLE my-cluster-cruise-control 1/1 1 1my-cluster는 Kafka 클러스터의 이름입니다.READY는 ready/expected 복제본 수를 표시합니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
자동 생성 주제
다음 표에서는 Cruise Control을 배포할 때 자동으로 생성되는 세 가지 주제를 보여줍니다. 이러한 주제는 크루즈 제어가 제대로 작동하려면 필수이며 삭제하거나 변경하지 않아야 합니다. 지정된 구성 옵션을 사용하여 주제 이름을 변경할 수 있습니다.
| 자동 생성 주제 구성 | 기본 주제 이름 | 작성자 | 함수 |
|---|---|---|---|
|
|
| Apache Kafka Metrics Reporter 스트림 | 각 Kafka 브로커의 Metrics Reporter의 원시 지표를 저장합니다. |
|
|
| 크루즈 제어 | 각 파티션에 대해 파생된 지표를 저장합니다. 이는 Metric Sample Aggregator 에 의해 생성됩니다. |
|
|
| 크루즈 제어 | 클러스터 워크로드 모델을 생성하는 데 사용되는 메트릭 샘플을 저장합니다. |
Cruise Control에 필요한 레코드 제거를 방지하기 위해 자동 생성된 항목에서 로그 압축이 비활성화됩니다.
Cruise Control이 활성화된 Kafka 클러스터에서 자동 생성 주제의 이름이 변경된 경우 이전 주제는 삭제되지 않으며 수동으로 제거해야 합니다.
다음에 수행할 작업
Cruise Control을 구성하고 배포한 후 최적화 제안을 생성할 수 있습니다.
19.6. 최적화 제안 생성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaRebalance 리소스를 생성하거나 업데이트할 때 Cruise Control은 구성된 최적화 목표에 따라 Kafka 클러스터에 대한 최적화 제안을 생성합니다. 최적화 제안에서 정보를 분석하고 승인 여부를 결정합니다. 최적화 제안의 결과를 사용하여 Kafka 클러스터를 재조정할 수 있습니다.
다음 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.
-
Full(기본값) -
add-brokers -
remove-brokers
사용하는 모드는 Kafka 클러스터에서 이미 실행 중인 모든 브로커 간에 재조정하는지 아니면 Kafka 클러스터를 확장한 후 또는 Kafka 클러스터를 축소하기 전에 재조정해야 하는지에 따라 다릅니다. 자세한 내용은 브로커 스케일링을 사용하여 모드 재조정 을 참조하십시오.
사전 요구 사항
- Apache Kafka 클러스터의 Streams에 Cruise Control을 배포 했습니다.
- 최적화 목표를 구성하고 브로커 리소스에 대한 용량 제한을 선택적으로 구성했습니다.
Cruise Control 구성에 대한 자세한 내용은 19.5절. “Kafka를 사용하여 Cruise Control 구성 및 배포” 을 참조하십시오.
프로세스
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: fulladd-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
- 축소 작업에서 제거할 브로커 목록입니다. 이 속성은 필수입니다.
참고다음 단계와 리밸런스를 승인하거나 중지하는 단계는 사용 중인 리밸런스 모드에 관계없이 동일합니다.
기본 목표를 사용하는 대신 사용자 제공 최적화 목표를 구성하려면
goals속성을 추가하고 하나 이상의 목표를 입력합니다.다음 예에서는 랙 인식 및 복제본 용량이 사용자 제공 최적화 목표로 구성됩니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: goals: - RackAwareGoal - ReplicaCapacityGoal구성된 하드 목표를 무시하려면
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(선택 사항) 최적화 제안을 자동으로 승인하려면
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리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_rebalance_configuration_file>Cluster Operator는 Cruise Control에서 최적화 제안을 요청합니다. Kafka 클러스터 크기에 따라 몇 분이 걸릴 수 있습니다.
자동 승인 메커니즘을 사용한 경우 최적화 제안 상태가
Ready로 변경될 때까지 기다립니다. 자동 승인 메커니즘을 활성화하지 않은 경우 최적화 제안 상태가ProposalReady로 변경될 때까지 기다립니다.oc get kafkarebalance -o wide -w -n <namespace>PendingProposal-
PendingProposal상태는 리밸런스 Operator가 Cruise Control API를 폴링하여 최적화 제안이 준비되었는지 확인합니다. ProposalReady-
ProposalReady상태는 최적화 제안이 검토 및 승인을 받을 준비가 되었음을 의미합니다.
상태가
ProposalReady로 변경되면 최적화 제안을 승인할 준비가 된 것입니다.최적화 제안을 검토하십시오.
최적화 제안은
KafkaRebalance리소스의Status.Optimization Result속성에 포함되어 있습니다.oc describe kafkarebalance <kafka_rebalance_resource_name>최적화 제안 예
Status: Conditions: Last Transition Time: 2020-05-19T13:50:12.533Z Status: ProposalReady Type: State Observed Generation: 1 Optimization Result: Data To Move MB: 0 Excluded Brokers For Leadership: Excluded Brokers For Replica Move: Excluded Topics: Intra Broker Data To Move MB: 0 Monitored Partitions Percentage: 100 Num Intra Broker Replica Movements: 0 Num Leader Movements: 0 Num Replica Movements: 26 On Demand Balancedness Score After: 81.8666802863978 On Demand Balancedness Score Before: 78.01176356230222 Recent Windows: 1 Session Id: 05539377-ca7b-45ef-b359-e13564f1458c최적화 결과섹션의 속성은 보류 중인 클러스터 재조정 작업을 설명합니다. 각 속성에 대한 설명은 최적화 제안의 콘텐츠를 참조하십시오.
CPU 용량 부족
CPU 사용률 측면에서 Kafka 클러스터가 과부하된 경우 KafkaRebalance 상태에 충분하지 않은 CPU 용량 오류가 표시될 수 있습니다. 이 사용률 값이 excludedTopics 구성의 영향을 받지 않음을 주목할 가치가 있습니다. 최적화 제안서가 제외된 주제의 복제본을 다시 할당하지 않지만, 해당 부하는 여전히 사용률 계산에서 고려됩니다.
CPU 사용률 오류 예
com.linkedin.kafka.cruisecontrol.exception.OptimizationFailureException:
[CpuCapacityGoal] Insufficient capacity for cpu (Utilization 615.21, Allowed Capacity 420.00, Threshold: 0.70). Add at least 3 brokers with the same cpu capacity (100.00) as broker-0. Add at least 3 brokers with the same cpu capacity (100.00) as broker-0.
오류에 CPU 용량이 CPU 코어 수가 아닌 백분율로 표시됩니다. 따라서 Kafka 사용자 정의 리소스에 구성된 CPU 수에 직접 매핑되지 않습니다. 브로커당 단일 가상 CPU를 사용하는 것과 같습니다. 이 CPU에는 Kafka.spec.kafka.resources.limits.cpu 에 구성된 CPU의 주기가 있습니다. 이는 CPU 사용률과 용량 간의 비율이 동일하게 유지되므로 리밸런스 동작에는 영향을 미치지 않습니다.
다음에 수행할 작업
19.7. 최적화 제안 승인 링크 복사링크가 클립보드에 복사되었습니다!
상태가 ProposalReady 인 경우 Cruise Control에서 생성한 최적화 제안을 승인할 수 있습니다. 그런 다음 cruise Control은 Kafka 클러스터에 최적화 제안을 적용하고 브로커에 파티션을 다시 할당하고 파티션 리더십을 변경합니다.
이는 드라이 목이 아닙니다. 최적화 제안을 승인하기 전에 다음을 수행해야 합니다.
- 예기치 않은 경우 제안을 새로 고칩니다.
- 제안의 내용을 주의 깊게 검토합니다.
사전 요구 사항
- Cruise Control에서 최적화 제안을 생성 했습니다.
-
KafkaRebalance사용자 정의 리소스 상태는ProposalReady입니다.
프로세스
승인하려는 최적화 제안을 위해 다음 단계를 수행하십시오.
최적화 제안이 새로 생성되지 않는 한 Kafka 클러스터 상태에 대한 현재 정보를 기반으로 하는지 확인합니다. 이렇게 하려면 최적화 제안을 새로 고침하여 최신 클러스터 메트릭을 사용하는지 확인합니다.
strimzi.io/rebalance=refresh: OpenShift의KafkaRebalance리소스에 주석을 답니다.oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="refresh"
최적화 제안의 상태가
ProposalReady로 변경될 때까지 기다립니다.oc get kafkarebalance -o wide -w -n <namespace>PendingProposal-
PendingProposal상태는 리밸런스 Operator가 Cruise Control API를 폴링하여 최적화 제안이 준비되었는지 확인합니다. ProposalReady-
ProposalReady상태는 최적화 제안이 검토 및 승인을 받을 준비가 되었음을 의미합니다.
상태가
ProposalReady로 변경되면 최적화 제안을 승인할 준비가 된 것입니다.Cruise Control을 적용할 최적화 제안을 승인합니다.
strimzi.io/rebalance=approve: OpenShift의KafkaRebalance리소스에 주석을 답니다.oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="approve"- Cluster Operator는 주석이 있는 리소스를 감지하고 Cruise Control에 Kafka 클러스터를 재조정하도록 지시합니다.
최적화 제안 상태가
Ready로 변경될 때까지 기다립니다.oc get kafkarebalance -o wide -w -n <namespace>재조정-
재조정 상태는 재조정이 진행 중임을 의미합니다. Ready-
Ready상태는 리밸런스가 완료되었음을 의미합니다. NotReady-
NotReady상태는 오류가 발생했음을 의미합니다.KafkaRebalance리소스의 문제 해결을 참조하십시오.
상태가
Ready로 변경되면 리밸런스가 완료됩니다.동일한
KafkaRebalance사용자 정의 리소스를 사용하여 다른 최적화 제안을 생성하려면새로 고침주석을 사용자 정의 리소스에 적용합니다. 이렇게 하면 사용자 정의 리소스가PendingProposal또는ProposalReady상태로 이동합니다. 그런 다음 최적화 제안을 검토하고 원하는 경우 승인할 수 있습니다.
19.8. 클러스터 리밸런스 중지 링크 복사링크가 클립보드에 복사되었습니다!
시작되고 나면 클러스터 리밸런스 작업을 완료하는 데 시간이 걸릴 수 있으며 Kafka 클러스터의 전반적인 성능에 영향을 미칠 수 있습니다.
진행 중인 클러스터 재조정 작업을 중지하려면 stop 주석을 KafkaRebalance 사용자 지정 리소스에 적용합니다. 이는 Cruise Control에 현재 파티션 재할당을 완료한 다음 재조정을 중지하도록 지시합니다. 리밸런스가 중지되면 완료된 파티션 재할당이 이미 적용되어 있으므로 리밸런스 작업을 시작하기 전과 비교할 때 Kafka 클러스터의 상태가 다릅니다. 추가 재조정이 필요한 경우 새로운 최적화 제안을 생성해야 합니다.
중간(중지됨) 상태의 Kafka 클러스터의 성능은 초기 상태보다 더 나을 수 있습니다.
사전 요구 사항
-
KafkaRebalance사용자 정의 리소스에 승인으로 주석을 달아 최적화 제안을 승인했습니다. -
KafkaRebalance사용자 정의 리소스의 상태는Rebalancing입니다.
프로세스
OpenShift의
KafkaRebalance리소스에 주석을 답니다.oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="stop"KafkaRebalance리소스의 상태를 확인합니다.oc describe kafkarebalance rebalance-cr-name-
상태가
Stopped로 변경될 때까지 기다립니다.
19.9. KafkaRebalance 리소스 문제 해결 링크 복사링크가 클립보드에 복사되었습니다!
KafkaRebalance 리소스를 생성하거나 Cruise Control과 상호 작용할 때 문제가 발생하면 문제 해결 방법에 대한 세부 정보와 함께 리소스 상태에 오류가 보고됩니다. 리소스는 NotReady 상태로도 이동합니다.
클러스터 리밸런스 작업을 계속하려면 KafkaRebalance 리소스 자체 또는 전체 Cruise Control 배포에서 문제를 수정해야 합니다. 문제에는 다음이 포함될 수 있습니다.
-
KafkaRebalance리소스의 잘못 구성된 매개변수입니다. -
KafkaRebalance리소스에서 Kafka 클러스터를 지정하는 데 필요한strimzi.io/cluster레이블이 없습니다. -
Cruise Control 서버는
Kafka리소스에cruiseControl속성이 누락되어 있지 않습니다. - Cruise Control 서버에 연결할 수 없습니다.
문제를 해결한 후 KafkaRebalance 리소스에 새로 고침 주석을 추가해야 합니다. "새로 고침" 중에 Cruise Control 서버에서 새로운 최적화 제안을 요청합니다.
사전 요구 사항
- 최적화 제안을 승인했습니다.
-
리밸런스 작업의
KafkaRebalance사용자 정의 리소스의 상태는NotReady입니다.
프로세스
KafkaRebalance상태에서 오류에 대한 정보를 가져옵니다.oc describe kafkarebalance rebalance-cr-name-
KafkaRebalance리소스에서 문제를 해결합니다. OpenShift의
KafkaRebalance리소스에 주석을 답니다.oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="refresh"KafkaRebalance리소스의 상태를 확인합니다.oc describe kafkarebalance rebalance-cr-name-
상태가
PendingProposal또는ProposalReady로 직접 변경될 때까지 기다립니다.
20장. 파티션 재할당 도구 사용 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터를 스케일링하는 경우 브로커를 추가하거나 제거하고 파티션 배포 또는 주제의 복제 요소를 업데이트해야 할 수 있습니다. 파티션 및 주제를 업데이트하려면 kafka-reassign-partitions.sh 툴을 사용할 수 있습니다.
Streams for Apache Kafka Cruise Control 통합이나 Topic Operator는 주제의 복제 요소 변경을 지원하지 않습니다. 그러나 kafka-reassign-partitions.sh 도구를 사용하여 주제의 복제 요소를 변경할 수 있습니다.
이 도구를 사용하여 파티션을 다시 할당하고 브로커 간에 파티션의 분산을 조정하여 성능을 향상시킬 수도 있습니다. 그러나 자동 파티션 재할당 및 클러스터 재조정에 Cruise Control 을 사용하는 것이 좋습니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.
kafka-reassign-partitions.sh 툴을 브로커 컨테이너가 아닌 별도의 대화형 pod로 실행하는 것이 좋습니다. 브로커 컨테이너 내에서 Kafka bin/ 스크립트를 실행하면 JVM이 Kafka 브로커와 동일한 설정으로 시작될 수 있으므로 중단이 발생할 수 있습니다. 별도의 Pod에서 kafka-reassign-partitions.sh 툴을 실행하면 이 문제를 방지할 수 있습니다. -ti 옵션을 사용하여 Pod를 실행하면 Pod 내에서 쉘 명령을 실행하기 위한 터미널이 포함된 대화형 Pod가 생성됩니다.
터미널을 사용하여 대화형 Pod 실행
oc run helper-pod -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bash
20.1. 파티션 재할당 도구 개요 링크 복사링크가 클립보드에 복사되었습니다!
파티션 재할당 툴에서는 Kafka 파티션 및 브로커를 관리하기 위한 다음과 같은 기능을 제공합니다.
- 파티션 복제본 재배포
- 브로커를 추가하거나 제거하여 클러스터를 확장하고 많이 로드된 브로커에서 활용도가 낮은 브로커로 Kafka 파티션을 이동합니다. 이렇게 하려면 이동할 주제와 파티션과 이동할 위치를 식별하는 파티션 재할당 계획을 만들어야 합니다. cruise Control은 클러스터 재조정 프로세스를 자동화 하므로 이 유형의 작업에 권장됩니다.
- 주제 복제 요인 확장 및 축소
- Kafka 주제의 복제 요소를 늘리거나 줄입니다. 이렇게 하려면 파티션 간에 기존 복제 할당을 식별하고 복제 요소가 변경되면 업데이트된 할당을 생성하는 파티션 재할당 계획을 만들어야 합니다.
- 선호하는 리더 변경
- Kafka 파티션의 기본 리더를 변경합니다. 현재 선호하는 리더를 사용할 수 없거나 클러스터의 브로커 간에 부하를 재배포하려는 경우 유용할 수 있습니다. 이렇게 하려면 복제본 순서를 변경하여 각 파티션의 새로운 기본 리더를 지정하는 파티션 재할당 계획을 만들어야 합니다.
- 특정 JBOD 볼륨을 사용하도록 로그 디렉터리 변경
- 특정 JBOD 볼륨을 사용하도록 Kafka 브로커의 로그 디렉터리를 변경합니다. 이 기능은 Kafka 데이터를 다른 디스크 또는 스토리지 장치로 이동하려는 경우 유용할 수 있습니다. 이렇게 하려면 각 주제의 새 로그 디렉터리를 지정하는 파티션 재할당 계획을 만들어야 합니다.
20.1.1. 파티션 재할당 계획 생성 링크 복사링크가 클립보드에 복사되었습니다!
파티션 재할당 도구(kafka-reassign-partitions.sh)는 현재 브로커에서 새 브로커로 이동해야 하는 파티션을 지정하는 파티션 할당 계획을 생성하여 작동합니다.
계획에 만족하는 경우 실행할 수 있습니다. 이 툴은 다음을 수행합니다.
- 파티션 데이터를 새 브로커로 마이그레이션
- 새 파티션 할당을 반영하도록 Kafka 브로커의 메타데이터 업데이트
- Kafka 브로커의 롤링 재시작을 트리거하여 새 할당이 적용되도록 합니다.
파티션 재할당 툴에는 세 가지 모드가 있습니다.
--generate- 주제 및 브로커 세트를 가져와서 재할당 JSON 파일을 생성하여 해당 브로커에 해당 주제의 파티션이 할당됩니다. 이는 전체 항목에서 작동하기 때문에 일부 주제의 일부 파티션만 다시 할당하려는 경우 사용할 수 없습니다.
--execute- JSON 파일을 다시 할당 하여 클러스터의 파티션 및 브로커에 적용합니다. 결과적으로 파티션을 얻는 브로커는 파티션 리더의 팔로우가됩니다. 지정된 파티션의 경우 새 브로커가 ISR(동기화형 복제본)에 가입하고 ISR(동기화) 복제본에 가입하면 이전 브로커가 팔로워가 되는 것을 중지하고 해당 복제본을 삭제합니다.
--verify-
--execute단계와 동일한 재할당 JSON 파일을 사용하여--verify는 파일의 모든 파티션이 의도한 브로커로 이동되었는지 확인합니다. 재할당이 완료되면--verify는 적용되는 트래픽 제한(--throttle)도 제거합니다. 제거되지 않으면 제한은 재할당이 완료된 후에도 클러스터에 계속 영향을 미칩니다.
지정된 시간에 클러스터에서 하나의 재할당을 실행할 수 있으며 실행 중인 재할당을 취소할 수 없습니다. 재할당을 취소해야 하는 경우 재할당이 완료될 때까지 기다린 다음 다른 재할당을 수행하여 첫 번째 재할당의 효과를 되돌립니다. kafka-reassign-partitions.sh 는 이 재버전에 대한 재할당 JSON을 출력 출력의 일부로 출력합니다. 매우 큰 재할당은 진행 중인 재할당을 중지해야 하는 경우 다수의 작은 재할당으로 분류되어야 합니다.
20.1.2. 파티션 재할당 JSON 파일에 주제 지정 링크 복사링크가 클립보드에 복사되었습니다!
kafka-reassign-partitions.sh 툴은 다시 할당할 주제를 지정하는 재할당 JSON 파일을 사용합니다. 특정 파티션을 이동하려는 경우 JSON 파일을 다시 할당하거나 파일을 수동으로 생성할 수 있습니다.
기본 재할당 JSON 파일에는 다음 예제에 표시된 구조가 있으며, 이 구조는 두 Kafka 항목에 속하는 파티션 세 개를 설명합니다. 각 파티션은 브로커 ID로 식별되는 새 복제본 세트에 다시 할당됩니다. version,topic,partition, replicas 속성은 모두 필요합니다.
파티션 재할당 JSON 파일 구조의 예
{
"version": 1,
"partitions": [
{
"topic": "example-topic-1",
"partition": 0,
"replicas": [1, 2, 3]
},
{
"topic": "example-topic-1",
"partition": 1,
"replicas": [2, 3, 4]
},
{
"topic": "example-topic-2",
"partition": 0,
"replicas": [3, 4, 5]
}
]
}
JSON에 포함되지 않은 파티션은 변경되지 않습니다.
주제 배열을 사용하여 주제만 지정하는 경우 파티션 재할당 도구에서 지정된 항목에 속하는 모든 파티션을 다시 할당합니다.
주제의 모든 파티션을 다시 할당하는 JSON 파일 구조의 예
{
"version": 1,
"topics": [
{ "topic": "my-topic"}
]
}
20.1.3. JBOD 볼륨 간에 파티션 재할당 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 JBOD 스토리지를 사용하는 경우 특정 볼륨과 로그 디렉터리 간에 파티션을 다시 할당할 수 있습니다(각 볼륨에 단일 로그 디렉터리가 있음).
파티션을 특정 볼륨에 다시 할당하려면 재할당 JSON 파일의 각 파티션에 대한 log_dirs 값을 추가합니다. 각 log_dirs 배열에는 각 복제본을 특정 로그 디렉터리에 할당해야 하므로 replicas 배열과 동일한 수의 항목이 포함됩니다. log_dirs 배열에는 로그 디렉터리의 절대 경로 또는 특수 값이 포함되어 있습니다. any 값은 Kafka가 해당 복제본에 사용 가능한 로그 디렉토리를 선택할 수 있음을 나타냅니다. 이는 JBOD 볼륨 간에 파티션을 다시 할당할 때 유용할 수 있습니다.
로그 디렉터리가 있는 JSON 파일 구조 재할당의 예
{
"version": 1,
"partitions": [
{
"topic": "example-topic-1",
"partition": 0,
"replicas": [1, 2, 3]
"log_dirs": ["/var/lib/kafka/data-0/kafka-log1", "any", "/var/lib/kafka/data-1/kafka-log2"]
},
{
"topic": "example-topic-1",
"partition": 1,
"replicas": [2, 3, 4]
"log_dirs": ["any", "/var/lib/kafka/data-2/kafka-log3", "/var/lib/kafka/data-3/kafka-log4"]
},
{
"topic": "example-topic-2",
"partition": 0,
"replicas": [3, 4, 5]
"log_dirs": ["/var/lib/kafka/data-4/kafka-log5", "any", "/var/lib/kafka/data-5/kafka-log6"]
}
]
}
20.1.4. 파티션 재할당 제한 링크 복사링크가 클립보드에 복사되었습니다!
브로커 간에 대량의 데이터를 전송해야 하므로 파티션 재할당은 느린 프로세스일 수 있습니다. 클라이언트에 부정적인 영향을 미치지 않도록 하려면 재할당 프로세스를 중단할 수 있습니다. kafka-reassign-partitions.sh 툴과 함께 --throttle 매개변수를 사용하여 재할당을 제한합니다. 브로커 간 파티션 이동에 대한 초당 최대 임계값(바이트)을 지정합니다. 예를 들어 --throttle 5000000 은 50MBps의 파티션 이동을 위한 최대 임계값을 설정합니다.
제한으로 인해 재할당이 완료되는 데 시간이 더 걸릴 수 있습니다.
- 스로틀이 너무 낮으면 새로 할당된 브로커는 게시되는 레코드를 유지할 수 없으며 재할당이 완료되지 않습니다.
- 스로틀이 너무 높으면 클라이언트에 영향을 미칩니다.
예를 들어 프로듀서의 경우 이는 승인을 기다리는 일반 대기 시간보다 높을 수 있습니다. 소비자의 경우 폴링 간에 대기 시간이 길기 때문에 처리량이 저하될 수 있습니다.
20.2. 파티션을 다시 할당하기 위한 재할당 JSON 파일 생성 링크 복사링크가 클립보드에 복사되었습니다!
kafka-reassign-partitions.sh 툴을 사용하여 Kafka 클러스터를 확장한 후 파티션을 다시 할당하도록 JSON 파일을 다시 할당합니다. 브로커를 추가하거나 제거해도 기존 파티션을 자동으로 재배포하지 않습니다. 파티션 배포를 밸런싱하고 새 브로커를 최대한 활용하려면 kafka-reassign-partitions.sh 도구를 사용하여 파티션을 다시 할당할 수 있습니다.
Kafka 클러스터에 연결된 대화형 Pod 컨테이너에서 툴을 실행합니다.
다음 절차에서는 mTLS를 사용하는 보안 재할당 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
연결을 설정하려면 다음이 필요합니다.
- Kafka 클러스터가 생성될 때 Cluster Operator에서 생성한 클러스터 CA 인증서 및 암호
- 사용자가 Kafka 클러스터에 대한 클라이언트 액세스를 위해 생성될 때 User Operator에서 생성한 사용자 CA 인증서 및 암호
이 절차에서 CA 인증서 및 해당 암호는 PKCS #12(.p12 및 .password) 형식으로 포함하는 클러스터 및 사용자 시크릿에서 추출됩니다. 암호를 사용하면 인증서가 포함된 .p12 저장소에 액세스할 수 있습니다. .p12 저장소를 사용하여 Kafka 클러스터에 대한 연결을 인증할 신뢰 저장소 및 키 저장소를 지정합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다.TLS 암호화 및 mTLS 인증을 사용하여 Kafka 구성
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... listeners: # ... - name: tls port: 9093 type: internal tls: true1 authentication: type: tls2 # ...실행 중인 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-topic및my-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: simple2 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: "*" # ... # ...
프로세스
Kafka 클러스터의 <cluster
_name> -cluster-ca-cert시크릿에서 클러스터 CA 인증서 및 암호를 추출합니다.oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password& lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다. Kafka 리소스를 사용하여
Kafka를 배포할 때 클러스터 CA 인증서가 있는 시크릿은 Kafka 클러스터 이름(<cluster_name> -cluster-ca-cert)을 사용하여 생성됩니다. 예를 들면my-cluster-cluster-ca-cert입니다.Apache Kafka 이미지의 Streams를 사용하여 새 대화형 pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.
oc run --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 <interactive_pod_name> -- /bin/sh -c "sleep 3600"& lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.
클러스터 CA 인증서를 대화형 Pod 컨테이너에 복사합니다.
oc cp ca.p12 <interactive_pod_name>:/tmpKafka 브로커에 액세스할 수 있는 권한이 있는 Kafka 사용자의 시크릿에서 사용자 CA 인증서 및 암호를 추출합니다.
oc get secret <kafka_user> -o jsonpath='{.data.user\.p12}' | base64 -d > user.p12oc get secret <kafka_user> -o jsonpath='{.data.user\.password}' | base64 -d > user.password& lt;kafka_user >를 Kafka 사용자의 이름으로 바꿉니다.
KafkaUser리소스를 사용하여 Kafka 사용자를 생성하면 사용자 CA 인증서가 있는 시크릿이 Kafka 사용자 이름으로 생성됩니다. 예를 들면my-user입니다.사용자 CA 인증서를 대화형 Pod 컨테이너에 복사합니다.
oc cp user.p12 <interactive_pod_name>:/tmpCA 인증서를 사용하면 대화형 Pod 컨테이너가 TLS를 사용하여 Kafka 브로커에 연결할 수 있습니다.
config.properties파일을 생성하여 Kafka 클러스터에 대한 연결을 인증하는 데 사용되는 truststore 및 키 저장소를 지정합니다.이전 단계에서 추출한 인증서 및 암호를 사용합니다.
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:90931 security.protocol=SSL2 ssl.truststore.location=/tmp/ca.p123 ssl.truststore.password=<truststore_password>4 ssl.keystore.location=/tmp/user.p125 ssl.keystore.password=<keystore_password>6 - 1
- Kafka 클러스터에 연결할 부트스트랩 서버 주소입니다. < kafka_cluster_name>을 교체하려면 자체 Kafka 클러스터 이름을 사용합니다.
- 2
- 암호화에 TLS를 사용할 때 보안 프로토콜 옵션입니다.
- 3
- truststore 위치에는 Kafka 클러스터의 공개 키 인증서(
ca.p12)가 포함되어 있습니다. - 4
- 신뢰 저장소에 액세스하기 위한 암호(
ca.password)입니다. - 5
- 키 저장소 위치에는 Kafka 사용자의 공개 키 인증서(
user.p12)가 포함되어 있습니다. - 6
- 키 저장소에 액세스하기 위한 암호(
user.password)입니다.
config.properties파일을 대화형 Pod 컨테이너에 복사합니다.oc cp config.properties <interactive_pod_name>:/tmp/config.properties이동할 주제를 지정하는
topics.json이라는 JSON 파일을 준비합니다.주제 이름을 쉼표로 구분된 목록으로 지정합니다.
my-topic의 모든 파티션을 다시 할당하는 JSON 파일의 예{ "version": 1, "topics": [ { "topic": "my-topic"} ] }이 파일을 사용하여 주제의 복제 요소를 변경할 수도 있습니다.
topics.json파일을 대화형 Pod 컨테이너에 복사합니다.oc cp topics.json <interactive_pod_name>:/tmp/topics.json대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash& lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
kafka-reassign-partitions.sh명령을 사용하여 재할당 JSON을 생성합니다.my-topic의 파티션을 지정된 브로커로 이동하는 명령의 예bin/kafka-reassign-partitions.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --topics-to-move-json-file /tmp/topics.json \ --broker-list 0,1,2,3,4 \ --generate
20.3. 브로커 추가 후 파티션 재할당 링크 복사링크가 클립보드에 복사되었습니다!
kafka-reassign-partitions.sh 툴에서 생성한 재할당 파일을 사용하여 Kafka 클러스터의 브로커 수를 늘린 후 파티션을 다시 할당합니다. 재할당 파일은 확대된 Kafka 클러스터의 브로커에 파티션을 다시 할당하는 방법을 설명해야 합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다.
이 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
kafka-reassign-partitions.sh 툴은 클러스터를 통해 모든 노드를 관리하고 있는지 또는 노드 풀을 사용하여 클러스터 내의 노드 그룹을 관리하는지 여부에 관계없이 Kafka 클러스터 내에서 파티션을 다시 할당하는 데 사용할 수 있습니다.
kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동 파티션 재할당 및 클러스터 재조정에 Cruise Control을 사용하는 것이 좋습니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.
사전 요구 사항
-
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다. -
reassignment.json 이라는 JSON 파일을 다시 생성했습니다. - 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
-
Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된
KafkaUser로 연결되어 있습니다.
프로세스
-
Kafka.spec.kafka.replicas구성 옵션을 늘려 필요한 만큼 새 브로커를 추가합니다. - 새 브로커 Pod가 시작되었는지 확인합니다.
-
이 작업을 수행하지 않은 경우 대화형 Pod 컨테이너를 실행하여
reassignment.json이라는 재할당 JSON 파일을 생성합니다. reassignment.json파일을 대화형 Pod 컨테이너에 복사합니다.oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json& lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.
대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash& lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
대화형 Pod 컨테이너에서
kafka-reassign-partitions.sh스크립트를 사용하여 파티션 재할당을 실행합니다.bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute& lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다. 예:
my-cluster-kafka-bootstrap:9093복제를 제한하려면broker throttled 속도(초당 바이트)로
--throttle옵션을 전달할 수도 있습니다. 예를 들면 다음과 같습니다.bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute이 명령은 두 개의 재할당 JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 이 값을 저장해야 합니다. 두 번째 JSON 오브젝트는 재할당 JSON 파일에 전달된 대상 재할당입니다.
재할당하는 동안 throttle을 변경해야하는 경우 다른 제한 속도로 동일한 명령을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute브로커 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를 제거하는 효과가 있습니다.- 원래 브로커로 할당을 되돌리기 위해 JSON을 저장한 경우 revert 파일을 삭제할 수 있습니다.
20.4. 브로커를 제거하기 전에 파티션 재할당 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터의 브로커 수를 줄이기 전에 kafka-reassign-partitions.sh 툴에서 생성한 재할당 파일을 사용하여 파티션을 다시 할당합니다. 재할당 파일은 Kafka 클러스터의 나머지 브로커에 파티션을 다시 할당하는 방법을 설명해야합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다. 가장 많은 Pod의 브로커가 먼저 제거됩니다.
이 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
kafka-reassign-partitions.sh 툴은 클러스터를 통해 모든 노드를 관리하고 있는지 또는 노드 풀을 사용하여 클러스터 내의 노드 그룹을 관리하는지 여부에 관계없이 Kafka 클러스터 내에서 파티션을 다시 할당하는 데 사용할 수 있습니다.
kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동 파티션 재할당 및 클러스터 재조정에 Cruise Control을 사용하는 것이 좋습니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.
사전 요구 사항
-
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다. -
reassignment.json 이라는 JSON 파일을 다시 생성했습니다. - 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
-
Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된
KafkaUser로 연결되어 있습니다.
프로세스
-
이 작업을 수행하지 않은 경우 대화형 Pod 컨테이너를 실행하여
reassignment.json이라는 재할당 JSON 파일을 생성합니다. reassignment.json파일을 대화형 Pod 컨테이너에 복사합니다.oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json& lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.
대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash& lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
대화형 Pod 컨테이너에서
kafka-reassign-partitions.sh스크립트를 사용하여 파티션 재할당을 실행합니다.bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute& lt;cluster_name >을 Kafka 클러스터 이름으로 바꿉니다. 예:
my-cluster-kafka-bootstrap:9093복제를 제한하려면broker throttled 속도(초당 바이트)로
--throttle옵션을 전달할 수도 있습니다. 예를 들면 다음과 같습니다.bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute이 명령은 두 개의 재할당 JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 이 값을 저장해야 합니다. 두 번째 JSON 오브젝트는 재할당 JSON 파일에 전달된 대상 재할당입니다.
재할당하는 동안 throttle을 변경해야하는 경우 다른 제한 속도로 동일한 명령을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute브로커 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를 제거하는 효과가 있습니다.- 원래 브로커로 할당을 되돌리기 위해 JSON을 저장한 경우 revert 파일을 삭제할 수 있습니다.
모든 파티션 재할당이 완료되면 제거되는 브로커는 클러스터의 파티션에 대한 책임이 없어야 합니다. 브로커의 데이터 로그 디렉터리에 라이브 파티션 로그가 포함되어 있지 않은지 확인하여 이를 확인할 수 있습니다. 브로커의 로그 디렉터리에 확장 정규식
\.[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 파일이 올바르지 않았습니다.
-
브로커에 라이브 파티션이 없음을 확인하면
Kafka리소스의Kafka.spec.kafka.replicas속성을 편집하여 브로커 수를 줄일 수 있습니다.
20.5. 주제의 복제 요소 변경 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 주제의 복제 요소를 변경하려면 kafka-reassign-partitions.sh 툴을 사용합니다. 이 작업은 Kafka 클러스터에 연결된 대화형 pod 컨테이너에서 툴을 실행하고 재할당 파일을 사용하여 주제 복제본을 변경하는 방법을 설명하여 수행할 수 있습니다.
이 절차에서는 TLS를 사용하는 보안 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
사전 요구 사항
-
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있어야 합니다. - 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
-
reassignment.json이라는 JSON 파일을 다시 생성했습니다. -
Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된
KafkaUser로 연결되어 있습니다.
JSON 파일 다시 할당을 참조하십시오.
이 절차에서 my-topic 이라는 주제에는 4개의 복제본이 있으며 이를 3으로 줄이고자 합니다. topics.json 이라는 JSON 파일은 주제를 지정하고 reassignment.json 파일을 생성하는 데 사용되었습니다.
JSON 파일의 예는 my-topic을 지정합니다.
{
"version": 1,
"topics": [
{ "topic": "my-topic"}
]
}
프로세스
이 작업을 수행하지 않은 경우 대화형 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"]}]}나중에 변경 사항을 복원해야 하는 경우 이 파일의 사본을 로컬에 저장합니다.
reassignment.json을 편집하여 각 파티션에서 복제본을 제거합니다.예를 들어
jq명령줄 JSON 구문 분석 도구를 사용하여 주제의 각 파티션에 대한 목록의 마지막 복제본을 제거합니다.각 파티션의 마지막 주제 복제본 제거
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json업데이트된 복제본을 표시하는 재할당 파일의 예
{"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}reassignment.json파일을 대화형 Pod 컨테이너에 복사합니다.oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json& lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.
대화형 pod 컨테이너에서 쉘 프로세스를 시작합니다.
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash& lt;namespace& gt;를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
대화형 pod 컨테이너에서
kafka-reassign-partitions.sh스크립트를 사용하여 topic replica를 변경합니다.bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute참고브로커에서 복제본을 제거해도 데이터 간 데이터 이동이 필요하지 않으므로 복제를 방해할 필요가 없습니다. 복제본을 추가하는 경우 throttle 속도를 변경해야 할 수 있습니다.
브로커 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를 제거하는 효과가 있습니다.bin/kafka-topics.sh명령을--describe옵션과 함께 실행하여 주제 변경 결과를 확인합니다.bin/kafka-topics.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --describe주제의 복제본 수를 줄이는 결과
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4마지막으로
KafkaTopic사용자 정의 리소스를 편집하여.spec.replicas를 3으로 변경한 다음 조정을 기다립니다.apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 3 replicas: 3
21장. Apache Kafka의 Streams에 대한 메트릭 및 대시보드 설정 링크 복사링크가 클립보드에 복사되었습니다!
메트릭을 수집하는 것은 Kafka 배포의 상태 및 성능을 이해하는 데 중요합니다. 메트릭을 모니터링하면 중요 상태가 되기 전에 문제를 적극적으로 식별하고 리소스 할당 및 용량 계획에 대한 정보에 입각한 결정을 내릴 수 있습니다. 메트릭이 없으면 Kafka 배포의 동작에 대한 가시성이 제한되어 문제 해결을 더 어렵고 시간이 많이 소요될 수 있습니다. 메트릭을 설정하면 장기적으로 시간과 리소스를 절약할 수 있으며 Kafka 배포의 안정성을 보장하는 데 도움이 됩니다.
메트릭은 Apache Kafka용 Streams의 각 구성 요소에 사용할 수 있으므로 개별 성능에 대한 중요한 통찰력을 제공합니다. 다른 구성 요소에는 메트릭 노출을 노출하기 위한 구성이 필요하지만 Apache Kafka Operator의 Streams는 기본적으로 Prometheus 지표를 자동으로 노출합니다. 이러한 메트릭에는 다음이 포함됩니다.
- 조정 수
- 처리 중인 사용자 정의 리소스 수
- 조정 기간
- JVM 지표
Kafka 리소스의 리스너 또는 권한 부여 구성에서 enableMetrics 속성을 활성화하여 oauth 인증 및 opa 또는 keycloak 권한과 관련된 메트릭을 수집할 수도 있습니다. 마찬가지로 KafkaBridge,KafkaConnect, KafkaMirrorMaker , 와 같은 사용자 정의 리소스에서 KafkaMirrorMaker 2oauth 인증에 대한 메트릭을 활성화할 수 있습니다.
Apache Kafka Console의 Streams는 Kafka 클러스터에서 메트릭을 모니터링하기 위한 사용자 인터페이스를 제공합니다. Apache Kafka용 Streams에서 관리하는 Kafka 클러스터를 Apache Kafka 콘솔의 Streams에 연결하면 브로커, 주제, 파티션 및 소비자 그룹과 같은 구성 요소에 대한 자세한 정보에 액세스할 수 있습니다.
Apache Kafka Console의 Streams는 현재 기술 프리뷰로 사용할 수 있습니다.
Prometheus 및 Grafana를 사용하여 Apache Kafka의 Streams를 모니터링할 수도 있습니다. Prometheus 규칙으로 구성된 경우 Prometheus는 클러스터에서 실행 중인 Pod의 지표를 사용합니다. Grafana는 대시보드에 이러한 메트릭을 시각화하여 모니터링을 위한 직관적인 인터페이스를 제공합니다.
메트릭 통합을 용이하게 하기 위해 Apache Kafka의 Streams는 Apache Kafka 구성 요소에 대한 Streams에 대한 Prometheus 규칙 및 Grafana 대시보드를 제공합니다. 특정 배포 요구 사항에 맞게 Grafana 대시보드를 사용자 지정할 수 있습니다. 규칙을 사용하여 특정 메트릭을 기반으로 경고를 트리거하는 조건을 정의할 수 있습니다.
모니터링 요구 사항에 따라 다음을 수행할 수 있습니다.
또한 분산 추적을 설정하거나 진단 도구 (report.sh)를 사용하여 문제 해결 데이터를 검색하여 메시지를 엔드 투 엔드로 추적 하도록 배포를 구성할 수 있습니다.
Apache Kafka의 스트림은 Prometheus 및 Grafana에 대한 설치 파일 예제를 제공합니다. 이 파일은 Streams for Apache Kafka 배포를 모니터링하기 위한 시작점 역할을 할 수 있습니다. 추가 지원을 받으려면 Prometheus 및 Grafana 개발자 커뮤니티에 참여하십시오.
메트릭 및 모니터링 툴에 대한 지원 문서
메트릭 및 모니터링 툴에 대한 자세한 내용은 지원 문서를 참조하십시오.
- Prometheus
- Prometheus 구성
- Kafka Exporter
- Grafana Labs
- Apache Kafka Monitoring 은 Apache Kafka에서 노출하는 Cryostat 메트릭에 대해 설명합니다.
- Zookeeper Cryostat는 Apache Zoo Cryostat에서 노출하는 Cryostat 메트릭을 설명합니다.
21.1. Kafka 내보내기를 사용하여 소비자 지연 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Exporter 는 Apache Kafka 브로커 및 클라이언트의 모니터링을 개선하는 오픈 소스 프로젝트입니다. Kafka 클러스터와 함께 Kafka Exporter를 배포하도록 Kafka 리소스를 구성할 수 있습니다. Kafka Exporter는 오프셋, 소비자 그룹, 소비자 지연 및 주제와 관련된 Kafka 브로커에서 추가 지표 데이터를 추출합니다. 예를 들어 지표 데이터는 느린 소비자를 식별하는 데 사용됩니다. 지연 데이터는 Prometheus 지표로 노출되며 분석을 위해 Grafana에 표시될 수 있습니다.
Kafka Exporter는 소비자 그룹의 커밋된 오프셋에 대한 정보를 저장하는 __consumer_offsets 항목에서 읽습니다. Kafka Exporter가 제대로 작동하려면 소비자 그룹이 사용 중이어야 합니다.
Kafka Exporter용 Grafana 대시보드는 Apache Kafka용 Streams에서 제공하는 많은 Grafana 대시보드 중 하나입니다.
Kafka 내보내기는 소비자 지연 및 소비자 오프셋과 관련된 추가 지표만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.
소비자 지연은 메시지의 프로덕션 속도와 사용 속도의 차이를 나타냅니다. 특히 지정된 소비자 그룹의 소비자 지연은 파티션의 마지막 메시지와 해당 소비자가 현재 선택 중인 메시지 사이의 지연을 나타냅니다.
지연은 파티션 로그의 끝과 관련하여 소비자 오프셋의 위치를 반영합니다.
생산자와 소비자 오프셋 간의 소비자 지연
이러한 차이점은 생산자 오프셋과 소비자 오프셋 간의 delta: Kafka 브로커 주제 파티션의 읽기 및 쓰기 위치라고도 합니다.
주제가 1초에 100개의 메시지를 스트리밍한다고 가정합니다. 생산자 오프셋(주파 파티션 헤드)과 소비자가 읽은 마지막 오프셋은 10초 지연을 의미합니다.
소비자 지연 모니터링의 중요성
실시간 데이터의 처리에 의존하는 애플리케이션의 경우 소비자 지연을 모니터링하는 것이 너무 크지 않은지 확인하는 것이 중요합니다. 지연이 많을수록 프로세스가 실시간 처리 목표에서 이동합니다.
예를 들어 소비자 지연은 제거되지 않았거나 계획되지 않은 종료를 통해 오래된 데이터를 너무 많이 소비한 결과일 수 있습니다.
소비자 지연 감소
Grafana 차트를 사용하여 지연을 분석하고 지연을 줄이는 작업이 영향을 받는 소비자 그룹에 영향을 미치는지 확인합니다. 예를 들어 Kafka 브로커가 지연을 줄이기 위해 조정되면 대시보드에는 소비자 그룹 차트가 중단되고 분별 메시지 차트가 가동되는 메시지가 표시됩니다.
지연을 줄이기 위한 일반적인 작업은 다음과 같습니다.
- 새 소비자를 추가하여 소비자 그룹 확장
- 메시지가 주제에 남아 있도록 보존 시간 늘리기
- 메시지 버퍼를 늘리기 위해 디스크 용량을 더 추가
소비자 지연을 줄이기 위한 작업은 기본 인프라와 Apache Kafka의 스트림 스트림이 지원 중인 사용 사례에 따라 달라집니다. 예를 들어, 지연된 소비자는 브로커에서 디스크 캐시의 가져오기 요청을 서비스할 수 있는 이점이 줄어듭니다. 또한 특정 경우에는 소비자가 catch될 때까지 메시지를 자동으로 삭제하는 것이 허용될 수 있습니다.
21.2. Cruise Control 작업 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤은 브로커, 주제 및 파티션의 사용을 추적하기 위해 Kafka 브로커를 모니터링합니다. 크루즈 컨트롤은 자체 성능을 모니터링하기 위한 메트릭 세트도 제공합니다.
Cruise Control 지표 보고자는 Kafka 브로커에서 원시 메트릭 데이터를 수집합니다. 데이터는 Cruise Control에 의해 자동으로 생성되는 주제로 생성됩니다. 메트릭은 Kafka 클러스터에 대한 최적화 제안을 생성하는 데 사용됩니다.
크루즈 제어 메트릭은 Cruise Control 작업의 실시간 모니터링에 사용할 수 있습니다. 예를 들어 Cruise Control 메트릭을 사용하여 실행 중인 재조정 작업 상태를 모니터링하거나 작업 성능에서 감지된 예외에 대한 경고를 제공할 수 있습니다.
Cruise Control 구성에서 Prometheus Cryostat Exporter 를 활성화하여 Cruise Control 지표를 노출합니다.
센서로 알려진 사용 가능한 Cruise Control 메트릭의 전체 목록은 Cruise Control 설명서를 참조하십시오.
21.2.1. 균형 조정 점수 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤 메트릭에는 균형 잡힌 점수가 포함됩니다. 균형은 Kafka 클러스터에 워크로드가 균등하게 배포되는 방법의 척도입니다.
균형성 점수(balanceness-score)에 대한 Cruise Control 메트릭은 KafkaRebalance 리소스의 균형 잡힌 점수와 다를 수 있습니다. cruise Control은 KafkaRebalance 리소스에서 사용되는 default.goals 와 동일하지 않을 수 있는 anomaly.detection.goals 를 사용하여 각 점수를 계산합니다. anomaly.detection.goals 는 Kafka 사용자 정의 리소스의 spec.cruiseControl.config 에 지정됩니다.
KafkaRebalance 리소스를 새로 고치면 최적화 제안을 가져옵니다. 다음 조건 중 하나가 적용되는 경우 최신 캐시된 최적화 제안을 가져옵니다.
-
KafkaRebalance 목표는
Kafka리소스의default.goals섹션에 구성된목표와일치합니다. -
KafkaRebalance
목표는지정되지 않음
그렇지 않으면 Cruise Control은 KafkaRebalance 목표를 기반으로 새로운 최적화 제안을 생성합니다. 새로 고침마다 새로운 제안이 생성되면 성능 모니터링에 영향을 미칠 수 있습니다.
21.2.2. 변칙 탐지에 대한 경고 설정 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤의 변종 탐지기는 브로커 실패와 같은 최적화 목표 생성을 차단하는 조건에 대한 메트릭 데이터를 제공합니다. 더 많은 가시성을 원하는 경우, anomaly detect에서 제공하는 메트릭을 사용하여 경고를 설정하고 알림을 보낼 수 있습니다. 지정된 알림 채널을 통해 이러한 메트릭을 기반으로 경고를 라우팅하도록 Cruise Control의 anomaly notifier 를 설정할 수 있습니다. 또는 anomaly detect에서 제공하는 메트릭 데이터를 스크랩하고 경고를 생성하도록 Prometheus를 설정할 수 있습니다. Prometheus Alertmanager는 Prometheus에서 생성한 경고를 라우팅할 수 있습니다.
Cruise Control 설명서 는 AnomalyDetector 메트릭 및 anomaly notifier에 대한 정보를 제공합니다.
21.3. 메트릭 파일 예 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams에서 제공하는 구성 파일 예제에서 Grafana 대시보드 및 기타 지표 구성 파일 예를 찾을 수 있습니다.
Apache Kafka용 Streams와 함께 제공되는 메트릭 파일의 예
metrics
├── grafana-dashboards
│ ├── 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
├── prometheus-additional-properties
│ └── prometheus-additional.yaml
├── prometheus-alertmanager-config
│ └── alert-manager-config.yaml
├── prometheus-install
│ ├── alert-manager.yaml
│ ├── prometheus-rules.yaml
│ ├── prometheus.yaml
│ └── strimzi-pod-monitor.yaml
├── kafka-bridge-metrics.yaml
├── kafka-connect-metrics.yaml
├── kafka-cruise-control-metrics.yaml
├── kafka-metrics.yaml
└── kafka-mirror-maker-2-metrics.yaml
- 1
- Apache Kafka 구성 요소에 대한 다양한 Streams에 대한 Grafana 대시보드의 예.
- 2
- Grafana 이미지에 대한 설치 파일입니다.
- 3
- 노드의 OpenShift cAdvisor 에이전트 및 kubelet에서 직접 제공되는 CPU, 메모리 및 디스크 볼륨 사용에 대한 메트릭을 스크랩하는 추가 구성입니다.
- 4
- Alertmanager를 통해 알림을 전송하기 위한 후크 정의입니다.
- 5
- Alertmanager 배포 및 구성을 위한 리소스입니다.
- 6
- Prometheus Alertmanager와 함께 사용하기 위한 경고 규칙 예(Prometheus와 함께 배포됨)
- 7
- Prometheus 이미지에 대한 설치 리소스 파일입니다.
- 8
- Prometheus Operator에서 변환한 PodMonitor 정의는 Pod에서 직접 메트릭 데이터를 스크랩할 수 있도록 Prometheus 서버의 작업으로 변환됩니다.
- 9
- 메트릭이 활성화된 Kafka 브리지 리소스.
- 10
- Kafka Connect에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.
- 11
- Cruise Control에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.
- 12
- Kafka 및 Zoo Cryostat에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.
- 13
- Kafka MirrorMaker 2에 대한 Prometheus Cryostat Exporter 레이블 재레이블 규칙을 정의하는 메트릭 구성입니다.
21.3.1. Prometheus 지표 구성의 예 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 Prometheus Cryostat Exporter 를 사용하여 Prometheus 서버에서 스크랩할 수 있는 HTTP 끝점을 통해 지표를 노출합니다.
Grafana 대시보드는 사용자 정의 리소스 구성에서 Apache Kafka 구성 요소에 대한 Streams에 대해 정의된 Prometheus Cryostat Exporter 재레이블 규칙에 따라 달라집니다.
레이블은 이름-값 쌍입니다. 레이블 재지정은 레이블을 동적으로 작성하는 프로세스입니다. 예를 들어 레이블의 값은 Kafka 서버 및 클라이언트 ID의 이름에서 파생될 수 있습니다.
Apache Kafka의 스트림은 레이블을 다시 지정하는 규칙을 사용하여 사용자 정의 리소스 구성 YAML 파일의 예를 제공합니다. Prometheus 지표 구성을 배포할 때 예제 사용자 정의 리소스를 배포하거나 메트릭 구성을 자체 사용자 정의 리소스 정의에 복사할 수 있습니다.
| Component | 사용자 정의 리소스 | YAML 파일의 예 |
|---|---|---|
| Kafka 및 Zoo Cryostat |
|
|
| Kafka Connect |
|
|
| Kafka MirrorMaker 2 |
|
|
| Kafka Bridge |
|
|
| 크루즈 제어 |
|
|
21.3.2. 경고 알림에 대한 Prometheus 규칙의 예 링크 복사링크가 클립보드에 복사되었습니다!
경고 알림에 대한 Prometheus 규칙은 Apache Kafka용 Streams에서 제공하는 지표 구성 파일 예제 와 함께 제공됩니다. 규칙은 Prometheus 배포에서 사용할 수 있도록 예제 prometheus-rules.yaml 파일에 지정됩니다.
prometheus-rules.yaml 파일에는 다음 구성 요소에 대한 예제 규칙이 포함되어 있습니다.
- Kafka
- ZooKeeper
- Entity Operator
- Kafka Connect
- Kafka Bridge
- MirrorMaker
- Kafka Exporter
각 예제 규칙에 대한 설명은 파일에 제공됩니다.
경고 규칙은 메트릭에서 관찰된 특정 상태에 대한 알림을 제공합니다. 규칙은 Prometheus 서버에서 선언되지만 Prometheus Alertmanager는 경고 알림을 담당합니다.
Prometheus 경고 규칙은 지속적으로 평가되는 PromQL 표현식을 사용하는 조건을 설명합니다.
경고 표현식이 true가 되면 조건이 충족되고 Prometheus 서버는 경고 데이터를 Alertmanager에 보냅니다. 그런 다음 Alertmanager는 배포에 대해 구성된 통신 방법을 사용하여 알림을 보냅니다.
경고 규칙 정의에 대한 일반 지점:
-
for속성은 경고가 트리거되기 전에 조건이 유지되어야 하는 기간을 결정하기 위해 규칙과 함께 사용됩니다. -
틱은 밀리초 단위로 측정되고
Kafka.spec.zookeeper.config의tickTime매개 변수를 사용하여 구성된 기본 Zoo Cryostat 시간 단위입니다. 예를 들어, Zoo CryostattickTime=3000인 경우 3 틱 (3 x 3000)은 9000 밀리초와 같습니다. -
ZookeeperRunningOutOfSpace지표 및 경고의 가용성은 사용된 OpenShift 구성 및 스토리지 구현에 따라 달라집니다. 특정 플랫폼에 대한 스토리지 구현은 메트릭이 경고를 제공하는 데 필요한 사용 가능한 공간에 대한 정보를 제공하지 못할 수 있습니다.
이메일, 채팅 메시지 또는 기타 알림 방법을 사용하도록 Alertmanager를 구성할 수 있습니다. 특정 요구 사항에 따라 예제 규칙의 기본 구성을 조정합니다.
21.3.3. Grafana 대시보드 예 링크 복사링크가 클립보드에 복사되었습니다!
지표를 제공하기 위해 Prometheus를 배포하는 경우 Apache Kafka용 Streams와 함께 제공되는 Grafana 대시보드 예제를 사용하여 Apache Kafka 구성 요소의 Streams를 모니터링할 수 있습니다.
예제 대시보드는 example/metrics/grafana-dashboards 디렉터리에 JSON 파일로 제공됩니다.
모든 대시보드는 JVM 지표와 구성 요소와 관련된 메트릭을 제공합니다. 예를 들어 Apache Kafka Operator용 Grafana 대시보드는 처리 중인 조정 또는 사용자 정의 리소스 수에 대한 정보를 제공합니다.
예제 대시보드에는 Kafka에서 지원하는 모든 메트릭이 표시되지 않습니다. 대시보드는 모니터링을 위한 대표 지표 세트로 채워집니다.
| Component | JSON 파일의 예 |
|---|---|
| Apache Kafka Operator용 스트림 |
|
| Kafka |
|
| ZooKeeper |
|
| Kafka Connect |
|
| Kafka MirrorMaker 2 |
|
| Kafka Bridge |
|
| 크루즈 제어 |
|
| Kafka Exporter |
|
Kafka Exporter에서 메트릭을 사용할 수 없는 경우 아직 클러스터에 트래픽이 없기 때문에 Kafka Exporter Grafana 대시보드에 숫자 필드에 N/A, 그래프에 표시할 데이터가 없습니다.
21.4. 구성을 통해 Prometheus 지표 활성화 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus용 Apache Kafka의 Streams에 지표를 활성화하고 노출하려면 지표 구성 속성을 사용합니다.
다음 구성 요소에는 메트릭을 노출하려면 metricsConfig 구성이 필요합니다.
- Kafka
- KafkaConnect
- MirrorMaker
- 크루즈 제어
- ZooKeeper
이 구성을 사용하면 Prometheus Cryostat Exporter 가 HTTP 끝점을 통해 지표를 노출할 수 있습니다. Cryostat 내보내기 HTTP 끝점의 포트는 9404입니다. Prometheus는 이 끝점을 스크랩하여 Kafka 지표를 수집합니다.
이러한 구성 요소의 메트릭을 노출하려면 enableMetrics 속성을 true 로 설정합니다.
- Kafka Bridge
- OAuth 2.0 인증 및 권한 부여 프레임워크
- 승인을 위한 OPA(Open Policy Agent)
Apache Kafka의 Streams에 Prometheus 지표 구성을 배포하려면 자체 구성 또는 Apache Kafka용 Streams와 함께 제공되는 사용자 정의 리소스 구성 파일 예제 를 사용할 수 있습니다.
-
kafka-metrics.yaml -
kafka-connect-metrics.yaml -
kafka-mirror-maker-2-metrics.yaml -
kafka-bridge-metrics.yaml -
kafka-cruise-control-metrics.yaml -
oauth-metrics.yaml
이러한 파일에는 Prometheus 지표를 활성화하는 데 필요한 재레이블 규칙 및 구성이 포함되어 있습니다. Apache Kafka용 Streams로 Prometheus를 시도하는 데 좋은 출발점입니다.
다음 절차에서는 Kafka 리소스에 예제 Prometheus 지표 구성을 배포하는 방법을 보여줍니다. 다른 리소스에 대한 예제 파일을 배포할 때 프로세스는 동일합니다.
Kafka Exporter 지표를 포함하려면 Kafka 리소스에 kafkaExporter 구성을 추가합니다.
Kafka 내보내기는 소비자 지연 및 소비자 오프셋과 관련된 추가 지표만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.
프로세스
Prometheus 구성을 사용하여 예제 사용자 정의 리소스를 배포합니다.
예를 들어 각
Kafka리소스에 대해kafka-metrics.yaml파일을 적용할 수 있습니다.예제 구성 배포
oc apply -f kafka-metrics.yaml또는
kafka-metrics.yaml의 예제 구성을 자체Kafka리소스에 복사할 수 있습니다.예제 구성 복사
oc edit kafka <kafka_configuration_file>Kafka리소스에 대한metricsConfig속성 및ConfigMap을 복사합니다.Kafka의 메트릭 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... metricsConfig:1 type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: kafka-metrics key: kafka-metrics-config.yml --- kind: ConfigMap2 apiVersion: v1 metadata: name: kafka-metrics labels: app: strimzi data: kafka-metrics-config.yml: | # metrics configuration...Kafka Exporter를 배포하려면
kafkaExporter구성을 추가합니다.kafkaExporter구성은Kafka리소스에만 지정됩니다.Kafka 내보내기 배포를 위한 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafkaExporter: image: my-registry.io/my-org/my-exporter-cluster:latest1 groupRegex: ".*"2 topicRegex: ".*"3 groupExcludeRegex: "^excluded-.*"4 topicExcludeRegex: "^excluded-.*"5 resources:6 requests: cpu: 200m memory: 64Mi limits: cpu: 500m memory: 128Mi logging: debug7 enableSaramaLogging: true8 template:9 pod: metadata: labels: label1: value1 imagePullSecrets: - name: my-docker-credentials securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe:10 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe:11 initialDelaySeconds: 15 timeoutSeconds: 5 # ...- 1
- ADVANCED OPTION: 특수 상황에서만 권장되는 컨테이너 이미지 구성입니다.
- 2
- 메트릭에 포함할 소비자 그룹을 지정하는 정규식입니다.
- 3
- 메트릭에 포함할 주제를 지정하는 정규식입니다.
- 4
- 메트릭에서 제외할 소비자 그룹을 지정하는 정규식입니다.
- 5
- 메트릭에서 제외할 주제를 지정하는 정규식입니다.
- 6
- 예약할 CPU 및 메모리 리소스입니다.
- 7
- 로깅 구성은 심각도가 지정된 메시지(debug, info, warn, error, fatal) 이상을 기록합니다.
- 8
- Kafka Exporter에서 사용하는 Go 클라이언트 라이브러리인 Sarama 로깅을 활성화하는 부울입니다.
- 9
- 배포 템플릿 및 포드 사용자 지정.
- 10
- 상태 점검 준비 프로브.
- 11
- 상태 점검 활성 프로브.
Kafka Exporter가 제대로 작동하려면 소비자 그룹이 사용 중이어야 합니다.
Kafka 브리지의 메트릭 활성화
Kafka Bridge의 지표를 노출하려면 KafkaBridge 리소스에서 enableMetrics 속성을 true 로 설정합니다.
Kafka 브리지의 메트릭 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaBridge
metadata:
name: my-bridge
spec:
# ...
bootstrapServers: my-cluster-kafka:9092
http:
# ...
enableMetrics: true
# ...
OAuth 2.0 및 OPA 메트릭 활성화
OAuth 2.0 또는 OPA의 메트릭을 노출하려면 적절한 사용자 정의 리소스에서 enableMetrics 속성을 true 로 설정합니다.
- OAuth 2.0 메트릭
Kafka리소스에서 Kafka 클러스터 권한 부여 및 Kafka 리스너 인증에 대한 지표를 활성화합니다.지원되는 다른 구성 요소의 사용자 정의 리소스에서 OAuth 2.0 인증에 대한 메트릭을 활성화할 수도 있습니다.
- OPA 메트릭
-
Kafka 클러스터 권한 부여 메트릭을 OAuth 2.0과 동일한 방식으로
Kafka리소스를 활성화합니다.
다음 예에서 OAuth 2.0 리스너 인증 및 OAuth 2.0(keycloak) 클러스터 권한에 대해 메트릭이 활성화됩니다.
OAuth 2.0에 대해 메트릭이 활성화된 클러스터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
listeners:
- name: external3
port: 9094
type: loadbalancer
tls: true
authentication:
type: oauth
enableMetrics: true
configuration:
#...
authorization:
type: keycloak
enableMetrics: true
# ...
Prometheus와 함께 OAuth 2.0 지표를 사용하려면 oauth-metrics.yaml 파일을 사용하여 예제 Prometheus 지표 구성을 배포할 수 있습니다. oauth-metrics.yaml 파일에 포함된 ConfigMap 구성을 OAuth 2.0에 대한 메트릭을 활성화한 동일한 Kafka 리소스 구성 파일에 복사합니다.
21.5. OpenShift에서 Kafka 메트릭 및 대시보드 보기 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림이 OpenShift Container Platform에 배포되면 사용자 정의 프로젝트에 대한 모니터링 을 통해 메트릭이 제공됩니다. 이 OpenShift 기능을 사용하면 개발자가 자체 프로젝트(예: Kafka 프로젝트)를 모니터링하기 위해 별도의 Prometheus 인스턴스에 액세스할 수 있습니다.
사용자 정의 프로젝트에 대한 모니터링이 활성화된 경우 openshift-user-workload-monitoring 프로젝트에 다음 구성 요소가 포함됩니다.
- Prometheus Operator
- Prometheus 인스턴스(Prometheus Operator에서 자동으로 배포)
- Thanos Ruler 인스턴스
Apache Kafka의 스트림은 이러한 구성 요소를 사용하여 메트릭을 사용합니다.
클러스터 관리자는 사용자 정의 프로젝트에 대한 모니터링을 활성화한 다음 개발자 및 기타 사용자에게 자체 프로젝트 내에서 애플리케이션을 모니터링할 수 있는 권한을 부여해야 합니다.
Grafana 배포
Kafka 클러스터가 포함된 프로젝트에 Grafana 인스턴스를 배포할 수 있습니다. 그런 다음 예제 Grafana 대시보드를 사용하여 Grafana 사용자 인터페이스에서 Apache Kafka의 Streams에 대한 Prometheus 지표를 시각화할 수 있습니다.
openshift-monitoring 프로젝트는 핵심 플랫폼 구성 요소에 대한 모니터링을 제공합니다. 이 프로젝트에서 Prometheus 및 Grafana 구성 요소를 사용하여 OpenShift Container Platform 4.x에서 Apache Kafka에 대한 스트림 모니터링을 구성하지 마십시오.
절차 개요
OpenShift Container Platform에서 Apache Kafka 모니터링의 Streams를 설정하려면 다음 절차를 순서대로 따르십시오.
21.5.1. 사전 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
- 예제 YAML 파일을 사용하여 Prometheus 지표 구성을 배포 했습니다.
-
사용자 정의 프로젝트에 대한 모니터링이 활성화됩니다. 클러스터 관리자가 OpenShift 클러스터에
cluster-monitoring-config구성 맵을 생성했습니다. -
클러스터 관리자에게
monitoring-rules-edit또는monitoring-edit역할이 할당되었습니다.
cluster-monitoring-config 구성 맵을 생성하고 사용자 정의 프로젝트를 모니터링할 수 있는 사용자에게 권한을 부여하는 방법에 대한 자세한 내용은 OpenShift 설명서 를 참조하십시오.
21.5.2. Prometheus 리소스 배포 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus를 사용하여 Kafka 클러스터에서 모니터링 데이터를 가져옵니다.
자체 Prometheus 배포를 사용하거나 Apache Kafka용 Streams에서 제공하는 지표 구성 파일 예제 를 사용하여 Prometheus를 배포할 수 있습니다. 예제 파일을 사용하려면 PodMonitor 리소스를 구성하고 배포합니다. PodMonitor 는 Apache Kafka, Zoo Cryostat, Operators, Kafka Bridge 및 Cruise Control의 Pod에서 직접 데이터를 스크랩합니다.
그런 다음 Alertmanager에 대한 경고 규칙 예제를 배포합니다.
사전 요구 사항
- 실행 중인 Kafka 클러스터입니다.
- Apache Kafka용 Streams와 함께 제공되는 경고 규칙 예제 를 확인합니다.
프로세스
사용자 정의 프로젝트에 대한 모니터링이 활성화되어 있는지 확인합니다.
oc get pods -n openshift-user-workload-monitoring활성화하면 모니터링 구성 요소의 Pod가 반환됩니다. 예를 들면 다음과 같습니다.
NAME READY STATUS RESTARTS AGE prometheus-operator-5cc59f9bc6-kgcq8 1/1 Running 0 25s prometheus-user-workload-0 5/5 Running 1 14s prometheus-user-workload-1 5/5 Running 1 14s thanos-ruler-user-workload-0 3/3 Running 0 14s thanos-ruler-user-workload-1 3/3 Running 0 14s반환된 Pod가 없는 경우 사용자 정의 프로젝트에 대한 모니터링이 비활성화됩니다. 21.5절. “OpenShift에서 Kafka 메트릭 및 대시보드 보기” 의 사전 요구 사항을 참조하십시오.
여러
PodMonitor리소스는examples/metrics/prometheus-install/strimzi-pod-monitor.yaml에서 정의됩니다.각
PodMonitor리소스에 대해spec.namespaceSelector.matchNames속성을 편집합니다.apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: cluster-operator-metrics labels: app: strimzi spec: selector: matchLabels: strimzi.io/kind: cluster-operator namespaceSelector: matchNames: - <project-name>1 podMetricsEndpoints: - path: /metrics port: http # ...- 1
- 메트릭을 스크랩할 Pod가 실행 중인 프로젝트입니다(예:
Kafka).
strimzi-pod-monitor.yaml파일을 Kafka 클러스터가 실행 중인 프로젝트에 배포합니다.oc apply -f strimzi-pod-monitor.yaml -n MY-PROJECT예제 Prometheus 규칙을 동일한 프로젝트에 배포합니다.
oc apply -f prometheus-rules.yaml -n MY-PROJECT
21.5.3. Grafana의 서비스 계정 생성 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams에 대한 Grafana 인스턴스는 cluster-monitoring-view 역할이 할당된 서비스 계정으로 실행해야 합니다.
Grafana를 사용하여 모니터링에 대한 지표를 표시하는 경우 서비스 계정을 생성합니다.
사전 요구 사항
프로세스
Kafka 클러스터가 포함된 프로젝트에서 Grafana에 대한
ServiceAccount를 생성합니다.oc create sa grafana-service-account -n my-project이 예에서는
my-project네임스페이스에grafana-service-account라는 서비스 계정이 생성됩니다.Grafana
ServiceAccount에cluster-monitoring-view역할을 할당하는ClusterRoleBinding리소스를 생성합니다. 여기서 리소스의 이름은grafana-cluster-monitoring-binding입니다.apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: grafana-cluster-monitoring-binding labels: app: strimzi subjects: - kind: ServiceAccount name: grafana-service-account namespace: my-project roleRef: kind: ClusterRole name: cluster-monitoring-view apiGroup: rbac.authorization.k8s.io동일한 프로젝트에
ClusterRoleBinding을 배포합니다.oc apply -f grafana-cluster-monitoring-binding.yaml -n my-project서비스 계정에 대한 토큰 시크릿을 생성합니다.
apiVersion: v1 kind: Secret metadata: name: secret-sa annotations: kubernetes.io/service-account.name: "grafana-service-account"1 type: kubernetes.io/service-account-token2 Secret오브젝트 및 액세스 토큰을 생성합니다.oc create -f <secret_configuration>.yamlGrafana를 배포할 때 액세스 토큰이 필요합니다.
21.5.4. Prometheus 데이터 소스를 사용하여 Grafana 배포 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus 지표를 표시하기 위해 Grafana를 배포합니다. Grafana 애플리케이션에는 OpenShift Container Platform 모니터링 스택에 대한 구성이 필요합니다.
OpenShift Container Platform에는 openshift-monitoring 프로젝트에 Thanos Querier 인스턴스가 포함되어 있습니다. Thanos Querier는 플랫폼 메트릭을 집계하는 데 사용됩니다.
필요한 플랫폼 지표를 사용하려면 Grafana 인스턴스에 Thanos Querier에 연결할 수 있는 Prometheus 데이터 소스가 필요합니다. 이 연결을 구성하려면 Thanos Querier와 함께 실행되는 oauth-proxy 사이드카에 토큰을 사용하여 인증하는 구성 맵을 생성합니다. datasource.yaml 파일은 구성 맵의 소스로 사용됩니다.
마지막으로 Kafka 클러스터가 포함된 프로젝트에 볼륨으로 마운트된 구성 맵을 사용하여 Grafana 애플리케이션을 배포합니다.
사전 요구 사항
- Prometheus 리소스를 배포 했습니다.
- Grafana 에 대한 서비스 계정을 생성 했습니다.
프로세스
Grafana
ServiceAccount:의 액세스 토큰을 가져옵니다.oc describe sa/grafana-service-account | grep Tokens: oc describe secret grafana-service-account-token-mmlp9 | grep token:이 예에서 서비스 계정의 이름은
grafana-service-account입니다. 다음 단계에서 사용할 액세스 토큰을 복사합니다.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: GrafanaServiceAccount에 대한 액세스 토큰의 값입니다.
datasource.yaml파일에서grafana-config라는 구성 맵을 생성합니다.oc create configmap grafana-config --from-file=datasource.yaml -n MY-PROJECT배포및 서비스로 구성된 Grafana 애플리케이션을 생성합니다.grafana-config구성 맵은 데이터 소스 구성의 볼륨으로 마운트됩니다.apiVersion: apps/v1 kind: Deployment metadata: name: grafana labels: app: strimzi spec: replicas: 1 selector: matchLabels: name: grafana template: metadata: labels: name: grafana spec: serviceAccountName: grafana-service-account containers: - name: grafana image: grafana/grafana:10.4.2 ports: - name: grafana containerPort: 3000 protocol: TCP volumeMounts: - name: grafana-data mountPath: /var/lib/grafana - name: grafana-logs mountPath: /var/log/grafana - name: grafana-config mountPath: /etc/grafana/provisioning/datasources/datasource.yaml readOnly: true subPath: datasource.yaml readinessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 15 periodSeconds: 20 volumes: - name: grafana-data emptyDir: {} - name: grafana-logs emptyDir: {} - name: grafana-config configMap: name: grafana-config --- apiVersion: v1 kind: Service metadata: name: grafana labels: app: strimzi spec: ports: - name: grafana port: 3000 targetPort: 3000 protocol: TCP selector: name: grafana type: ClusterIPKafka 클러스터가 포함된 프로젝트에 Grafana 애플리케이션을 배포합니다.
oc apply -f <grafana-application> -n <my-project>
21.5.5. Grafana 서비스에 대한 경로 생성 링크 복사링크가 클립보드에 복사되었습니다!
Grafana 서비스를 노출하는 경로를 통해 Grafana 사용자 인터페이스에 액세스할 수 있습니다.
프로세스
grafana서비스에 대한 에지 경로를 생성합니다.oc create route edge <my-grafana-route> --service=grafana --namespace=KAFKA-NAMESPACE
21.5.6. Grafana 대시보드 가져오기 링크 복사링크가 클립보드에 복사되었습니다!
Grafana를 사용하여 사용자 지정 가능한 대시보드에 Prometheus 지표의 시각화를 제공합니다.
Apache Kafka 스트림에서는 JSON 형식으로 Grafana에 대한 대시보드 구성 파일의 예를 제공합니다.
-
예/metrics/grafana-dashboards
이 절차에서는 Grafana 대시보드 예제를 사용합니다.
예제 대시보드는 키 메트릭을 모니터링하는 데 좋은 시작점이지만 Kafka에서 지원하는 모든 메트릭은 표시되지 않습니다. 인프라에 따라 예제 대시보드를 수정하거나 다른 메트릭을 추가할 수 있습니다.
사전 요구 사항
프로세스
Grafana 서비스로의 경로 세부 정보를 가져옵니다. 예를 들면 다음과 같습니다.
oc get routes NAME HOST/PORT PATH SERVICES MY-GRAFANA-ROUTE MY-GRAFANA-ROUTE-amq-streams.net grafana- 웹 브라우저에서 경로 호스트 및 포트의 URL을 사용하여 Grafana 로그인 화면에 액세스합니다.
사용자 이름과 암호를 입력한 다음 로그인 을 클릭합니다.
기본 Grafana 사용자 이름과 암호는 모두
admin입니다. 처음 로그인한 후 암호를 변경할 수 있습니다.- Configuration > Data Sources 에서 Prometheus 데이터 소스가 생성되었는지 확인합니다. 데이터 소스는 21.5.4절. “Prometheus 데이터 소스를 사용하여 Grafana 배포” 에서 생성되었습니다.
- + 아이콘을 클릭한 다음 가져오기 를 클릭합니다.
-
examples/metrics/grafana-dashboards에서 가져올 대시보드의 JSON을 복사합니다. - 텍스트 상자에 JSON을 붙여넣은 다음 Load 를 클릭합니다.
- 다른 예제 Grafana 대시보드에 대해 5-7단계를 반복합니다.
가져온 Grafana 대시보드는 대시보드 홈 페이지에서 볼 수 있습니다.
22장. 분산 추적 소개 링크 복사링크가 클립보드에 복사되었습니다!
분산 추적은 분산 시스템의 애플리케이션 간 트랜잭션 진행 상황을 추적합니다. 마이크로 서비스 아키텍처에서 추적은 서비스 간 트랜잭션 진행 상황을 추적합니다. 추적 데이터는 애플리케이션 성능을 모니터링하고 대상 시스템 및 최종 사용자 애플리케이션 관련 문제를 조사하는 데 유용합니다.
Apache Kafka용 Streams에서 추적은 소스 시스템에서 Kafka로 보낸 다음 Kafka에서 대상 시스템 및 애플리케이션까지 메시지의 엔드 투 엔드 추적을 용이하게 합니다. 분산 추적은 Grafana 대시보드의 메트릭 모니터링과 구성 요소 로거를 보완합니다.
추적 지원은 다음 Kafka 구성 요소에 빌드됩니다.
- 소스 클러스터에서 대상 클러스터로 메시지를 추적하는 MirrorMaker
- Kafka Connect에서 사용하고 생성하는 메시지를 추적하기 위한 Kafka 연결
- Kafka 및 HTTP 클라이언트 애플리케이션 간 메시지 추적을 위한 Kafka 브리지
Kafka 브로커에서는 추적이 지원되지 않습니다.
사용자 정의 리소스를 통해 이러한 구성 요소에 대한 추적을 활성화하고 구성합니다. spec.template 속성을 사용하여 추적 구성을 추가합니다.
spec.tracing.type 속성을 사용하여 추적 유형을 지정하여 추적을 활성화합니다.
OpenTelemetry-
OpenTelemetry를 사용하려면
type: opentelemetry를 지정합니다. 기본적으로 OpenTelemetry는 OTLP(OpenTelemetry Protocol) 내보내기 및 끝점을 사용하여 추적 데이터를 가져옵니다. Jaeger 추적을 포함하여 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. 이렇게 하려면 추적 구성에서 OpenTelemetry 내보내기 및 끝점을 변경합니다.
Apache Kafka용 스트림은 더 이상 OpenTracing을 지원하지 않습니다. 이전에 type: jaeger 옵션과 함께 OpenTracing을 사용하는 경우 대신 OpenTelemetry를 사용하도록 전환하는 것이 좋습니다.
22.1. 추적 옵션 링크 복사링크가 클립보드에 복사되었습니다!
Jaeger 추적 시스템과 함께 OpenTelemetry를 사용합니다.
OpenTelemetry는 추적 또는 모니터링 시스템과 독립적인 API 사양을 제공합니다.
API를 사용하여 추적을 위한 애플리케이션 코드를 계측합니다.
- 조정된 애플리케이션은 분산 시스템에서 개별 요청에 대한 추적 을 생성합니다.
- 추적은 시간이 지남에 따라 특정 작업 단위를 정의하는 범위로 구성됩니다.
Jaeger는 마이크로 서비스 기반 분산 시스템의 추적 시스템입니다.
- Jaeger 사용자 인터페이스를 사용하면 추적 데이터를 쿼리, 필터링 및 분석할 수 있습니다.
간단한 쿼리를 표시하는 Jaeger 사용자 인터페이스
22.2. 추적을 위한 환경 변수 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 구성 요소에 대한 추적을 활성화하거나 Kafka 클라이언트의 추적기를 초기화할 때 환경 변수를 사용합니다.
환경 변수 추적은 변경될 수 있습니다. 최신 정보는 OpenTelemetry 설명서 를 참조하십시오.
다음 표에서는 추적기를 설정하기 위한 주요 환경 변수를 설명합니다.
| 속성 | 필수 항목 | 설명 |
|---|---|---|
|
| 제공됨 | OpenTelemetry에 대한 Jaeger 추적 서비스의 이름입니다. |
|
| 제공됨 | 추적에 사용되는 내보내기입니다. |
|
| 제공됨 |
추적에 사용되는 내보내기입니다. 기본적으로 |
22.3. 분산 추적 설정 링크 복사링크가 클립보드에 복사되었습니다!
사용자 정의 리소스에 추적 유형을 지정하여 Kafka 구성 요소에서 분산 추적을 활성화합니다. 메시지 엔드 투 엔드 추적을 위한 Kafka 클라이언트의 장치 추적기.
분산 추적을 설정하려면 다음 절차를 순서대로 수행합니다.
- MirrorMaker, Kafka Connect 및 Kafka 브리지의 추적을 활성화합니다.
클라이언트의 추적을 설정합니다.
추적기가 있는 장비 클라이언트:
22.3.1. 사전 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
분산 추적을 설정하기 전에 Jaeger 백엔드 구성 요소가 OpenShift 클러스터에 배포되었는지 확인합니다. OpenShift 클러스터에 Jaeger를 배포하기 위해 Jaeger Operator를 사용하는 것이 좋습니다.
배포 지침은 Jaeger 설명서 를 참조하십시오.
Streams for Apache Kafka 이외의 애플리케이션 및 시스템에 대한 추적을 설정하는 것은 이 콘텐츠의 범위를 벗어납니다.
22.3.2. MirrorMaker, Kafka Connect 및 Kafka Bridge 리소스에서 추적 활성화 링크 복사링크가 클립보드에 복사되었습니다!
분산 추적은 MirrorMaker, MirrorMaker 2, Kafka Connect 및 Apache Kafka Bridge용 Streams에서 지원됩니다. 추적기 서비스를 지정하고 활성화하도록 구성 요소의 사용자 지정 리소스를 구성합니다.
리소스에서 추적을 활성화하면 다음 이벤트가 트리거됩니다.
- 인터셉터 클래스는 구성 요소의 통합 소비자 및 생산자에서 업데이트됩니다.
- MirrorMaker, MirrorMaker 2 및 Kafka Connect의 경우 추적 에이전트는 리소스에 정의된 추적 구성을 기반으로 추적기를 초기화합니다.
- Kafka 브리지의 경우 리소스에 정의된 추적 구성을 기반으로 하는 추적기가 Kafka Bridge 자체에 의해 초기화됩니다.
OpenTelemetry를 사용하는 추적을 활성화할 수 있습니다.
MirrorMaker 및 MirrorMaker 2의 추적
MirrorMaker 및 MirrorMaker 2의 경우 소스 클러스터에서 대상 클러스터로 메시지가 추적됩니다. 추적 데이터는 MirrorMaker 또는 MirrorMaker 2 구성 요소를 입력하고 남겨진 메시지를 기록합니다.
Kafka Connect의 추적
Kafka Connect의 경우 Kafka Connect에서 생성하고 사용하는 메시지만 추적됩니다. Kafka Connect와 외부 시스템 간에 전송된 메시지를 추적하려면 해당 시스템의 커넥터에서 추적을 구성해야 합니다.
Kafka 브리지의 추적
Kafka 브리지의 경우 Kafka 브리지에서 생성하고 사용하는 메시지가 추적됩니다. Kafka 브리지를 통해 메시지를 보내고 수신하기 위해 클라이언트 애플리케이션에서 들어오는 HTTP 요청도 추적됩니다. 엔드 투 엔드 추적을 사용하려면 HTTP 클라이언트에서 추적을 구성해야 합니다.
프로세스
각 KafkaMirrorMaker,KafkaMirrorMaker2,KafkaConnect 및 KafkaBridge 리소스에 대해 다음 단계를 수행합니다.
spec.template속성에서 tracer 서비스를 구성합니다.- 추적 환경 변수를 템플릿 구성 속성으로 사용합니다.
-
OpenTelemetry의 경우
spec.tracing.type속성을opentelemetry로 설정합니다.
OpenTelemetry를 사용한 Kafka Connect의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...OpenTelemetry를 사용한 MirrorMaker의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker metadata: name: my-mirror-maker spec: #... template: mirrorMakerContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...OpenTelemetry를 사용한 MirrorMaker 2의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...OpenTelemetry를 사용한 Kafka 브리지의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: #... template: bridgeContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...리소스를 생성하거나 업데이트합니다.
oc apply -f <resource_configuration_file>
22.3.3. Kafka 클라이언트의 추적 초기화 링크 복사링크가 클립보드에 복사되었습니다!
OpenTelemetry에 대한 추적기를 초기화한 다음 분산 추적을 위해 클라이언트 애플리케이션을 측정합니다. Kafka 생산자 및 소비자 클라이언트 및 Kafka Streams API 애플리케이션을 계측할 수 있습니다.
추적 환경 변수 세트를 사용하여 추적기를 구성하고 초기화합니다.
프로세스
각 클라이언트 애플리케이션에서 추적기에 대한 종속성을 추가합니다.
클라이언트 애플리케이션의
pom.xml파일에 Maven 종속성을 추가합니다.OpenTelemetry 종속 항목
<dependency> <groupId>io.opentelemetry.semconv</groupId> <artifactId>opentelemetry-semconv</artifactId> <version>1.21.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> <version>1.34.1</version> <exclusions> <exclusion> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-okhttp</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-grpc-managed-channel</artifactId> <version>1.34.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-kafka-clients-2.6</artifactId> <version>1.32.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-jdk</artifactId> <version>1.34.1-alpha</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.61.0</version> </dependency>- 추적 환경 변수를 사용하여 추적 프로그램의 구성을 정의합니다.
환경 변수로 초기화되는 추적기를 생성합니다.
OpenTelemetry용 추적기 생성
OpenTelemetry ot = GlobalOpenTelemetry.get();추적기를 글로벌 추적기로 등록합니다.
GlobalTracer.register(tracer);클라이언트를 계측합니다.
22.3.4. 추적을 위한 생산자 및 소비자 처리 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 생산자 및 소비자에서 추적을 활성화하는 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Java 생산자 및 소비자 애플리케이션 코드를 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.
OpenTelemetry 계측 프로젝트는 생산자 및 소비자의 계측을 지원하는 클래스를 제공합니다.
- 데코레이터 계측
- 데코레이터 계측을 위해 추적을 위해 수정된 생산자 또는 소비자 인스턴스를 생성합니다.
- 인터셉터 계측
- 인터셉터 계측의 경우 소비자 또는 생산자 구성에 추적 기능을 추가합니다.
사전 요구 사항
추적 JAR을 프로젝트에 종속 항목으로 추가하여 생산자 및 소비자 애플리케이션에서 계측을 활성화합니다.
프로세스
각 생산자 및 소비자 애플리케이션의 애플리케이션 코드에서 다음 단계를 수행합니다. 데코레이터 패턴 또는 인터셉터를 사용하여 클라이언트 애플리케이션 코드를 측정합니다.
데코레이터 패턴을 사용하려면 수정된 생산자 또는 소비자 인스턴스를 생성하여 메시지를 보내거나 받습니다.
원래
KafkaProducer또는KafkaConsumer클래스를 전달합니다.OpenTelemetry에 대한 데코레이터 계측 예
// Producer instance Producer < String, String > op = new KafkaProducer < > ( configs, new StringSerializer(), new StringSerializer() ); Producer < String, String > producer = tracing.wrap(op); KafkaTracing tracing = KafkaTracing.create(GlobalOpenTelemetry.get()); producer.send(...); //consumer instance Consumer<String, String> oc = new KafkaConsumer<>( configs, new StringDeserializer(), new StringDeserializer() ); Consumer<String, String> consumer = tracing.wrap(oc); consumer.subscribe(Collections.singleton("mytopic")); ConsumerRecords<Integer, String> records = consumer.poll(1000); ConsumerRecord<Integer, String> record = ... SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);인터셉터를 사용하려면 생산자 또는 소비자 구성에서 interceptor 클래스를 설정합니다.
일반적인 방식으로
KafkaProducer및KafkaConsumer클래스를 사용합니다.TracingProducerInterceptor및TracingConsumerInterceptor클래스는 추적 기능을 처리합니다.인터셉터를 사용한 생산자 구성 예
senderProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps); producer.send(...);인터셉터를 사용한 소비자 구성 예
consumerProps.put(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName()); KafkaConsumer<Integer, String> consumer = new KafkaConsumer<>(consumerProps); consumer.subscribe(Collections.singletonList("messages")); ConsumerRecords<Integer, String> records = consumer.poll(1000); ConsumerRecord<Integer, String> record = ... SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);
22.3.5. 추적을 위한 Kafka Streams 애플리케이션 조정 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Streams API 애플리케이션에서 추적을 활성화하는 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Kafka Streams API 애플리케이션을 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.
- 데코레이터 계측
-
데코레이터 계측을 위해 추적을 위해 수정된 Kafka Streams 인스턴스를 생성합니다. OpenTelemetry의 경우 Kafka Streams에 추적 계측을 제공하기 위해 사용자 정의
TracingKafkaClientSupplier클래스를 생성해야 합니다. - 인터셉터 계측
- 인터셉터 계측의 경우 Kafka Streams 생산자 및 소비자 구성에 추적 기능을 추가합니다.
사전 요구 사항
추적 JAR을 프로젝트에 종속 항목으로 추가하여 Kafka Streams 애플리케이션에서 계측을 활성화합니다.
-
OpenTelemetry를 사용하여 Kafka Streams를 조정하려면 사용자 정의
TracingKafkaClientSupplier를 작성해야 합니다. 사용자 정의
TracingKafkaClientSupplier는 Kafka의DefaultKafkaClientSupplier를 확장하여 생산자 및 소비자 생성 방법을 재정의하여 Telemetry 관련 코드로 인스턴스를 래핑할 수 있습니다.사용자 정의
TracingKafkaClientSupplier의 예private class TracingKafkaClientSupplier extends DefaultKafkaClientSupplier { @Override public Producer<byte[], byte[]> getProducer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getProducer(config)); } @Override public Consumer<byte[], byte[]> getConsumer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getConsumer(config)); } @Override public Consumer<byte[], byte[]> getRestoreConsumer(Map<String, Object> config) { return this.getConsumer(config); } @Override public Consumer<byte[], byte[]> getGlobalConsumer(Map<String, Object> config) { return this.getConsumer(config); } }
프로세스
각 Kafka Streams API 애플리케이션에 대해 다음 단계를 수행합니다.
데코레이터 패턴을 사용하려면
TracingKafkaClientSupplier공급자 인터페이스 인스턴스를 생성한 다음 공급자 인터페이스를KafkaStreams에 제공합니다.데코레이터 계측 예
KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer); KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier); streams.start();인터셉터를 사용하려면 Kafka Streams 생산자 및 소비자 구성에서 interceptor 클래스를 설정합니다.
TracingProducerInterceptor및TracingConsumerInterceptor클래스는 추적 기능을 처리합니다.인터셉터를 사용한 생산자 및 소비자 구성의 예
props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); props.put(StreamsConfig.CONSUMER_PREFIX + ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName());
22.3.6. 다른 OpenTelemetry 추적 시스템 도입 링크 복사링크가 클립보드에 복사되었습니다!
기본 OTLP 시스템 대신 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. Apache Kafka용 Streams와 함께 제공된 Kafka 이미지에 필요한 아티팩트를 추가하여 이 작업을 수행합니다. 필요한 구현별 환경 변수도 설정해야 합니다. 그런 다음 OTEL_TRACES_EXPORTER 환경 변수를 사용하여 새 추적 구현을 활성화합니다.
다음 절차에서는 Zipkin 추적을 구현하는 방법을 설명합니다.
프로세스
Apache Kafka 이미지의 Streams의
/opt/kafka/libs/디렉터리에 추적 아티팩트를 추가합니다.Red Hat Ecosystem Catalog 에서 Kafka 컨테이너 이미지를 새 사용자 정의 이미지를 생성하기 위한 기본 이미지로 사용할 수 있습니다.
Zipkin의 OpenTelemetry 아티팩트
io.opentelemetry:opentelemetry-exporter-zipkin새 추적 구현에 대해 추적 내보내기 및 끝점을 설정합니다.
Zikpin 추적기 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-zipkin-service - name: OTEL_EXPORTER_ZIPKIN_ENDPOINT value: http://zipkin-exporter-host-name:9411/api/v2/spans1 - name: OTEL_TRACES_EXPORTER value: zipkin2 tracing: type: opentelemetry #...
22.3.7. OpenTelemetry에 대한 사용자 정의 범위 이름 지정 링크 복사링크가 클립보드에 복사되었습니다!
추적 범위는 작업 이름, 시작 시간 및 기간이 있는 Jaeger의 논리적 작업 단위입니다. 범위에는 이름이 내장되어 있지만 Kafka 클라이언트 계측에 사용자 정의 범위 이름을 지정할 수 있습니다.
사용자 지정 범위 이름을 지정하는 것은 선택 사항이며 생산자 및 소비자 클라이언트 계측 또는 Kafka 스트림 조정에서 데코레이터 패턴을 사용하는 경우에만 적용됩니다.
사용자 지정 범위 이름은 OpenTelemetry로 직접 지정할 수 없습니다. 대신 클라이언트 애플리케이션에 코드를 추가하여 추가 태그 및 속성을 추출하여 범위 이름을 검색합니다.
특성을 추출하는 코드 예
//Defines attribute extraction for a producer
private static class ProducerAttribExtractor implements AttributesExtractor < ProducerRecord < ? , ? > , Void > {
@Override
public void onStart(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord) {
set(attributes, AttributeKey.stringKey("prod_start"), "prod1");
}
@Override
public void onEnd(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
set(attributes, AttributeKey.stringKey("prod_end"), "prod2");
}
}
//Defines attribute extraction for a consumer
private static class ConsumerAttribExtractor implements AttributesExtractor < ConsumerRecord < ? , ? > , Void > {
@Override
public void onStart(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord) {
set(attributes, AttributeKey.stringKey("con_start"), "con1");
}
@Override
public void onEnd(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
set(attributes, AttributeKey.stringKey("con_end"), "con2");
}
}
//Extracts the attributes
public static void main(String[] args) throws Exception {
Map < String, Object > configs = new HashMap < > (Collections.singletonMap(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"));
System.setProperty("otel.traces.exporter", "jaeger");
System.setProperty("otel.service.name", "myapp1");
KafkaTracing tracing = KafkaTracing.newBuilder(GlobalOpenTelemetry.get())
.addProducerAttributesExtractors(new ProducerAttribExtractor())
.addConsumerAttributesExtractors(new ConsumerAttribExtractor())
.build();
23장. Apache Kafka DrainCleaner용 Streams를 사용하여 Pod 제거 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 및 Zoo Cryostat Pod는 OpenShift 업그레이드, 유지 관리 또는 Pod 일정 변경 중에 제거될 수 있습니다. Kafka 및 Zoo Cryostat Pod가 Apache Kafka용 Streams에 의해 배포된 경우 Apache Kafka DrainCleaner 툴의 Streams를 사용하여 Pod 제거를 처리할 수 있습니다. Apache Kafka Draincleaner의 Streams는 OpenShift 대신 제거를 처리합니다.
Apache Kafka DrainCleaner용 Streams를 배포하면 Cluster Operator를 사용하여 OpenShift 대신 Kafka Pod를 이동할 수 있습니다. Cluster Operator는 복제되지 않으며 제거 프로세스 중에 Kafka가 계속 작동할 수 있습니다. OpenShift 작업자 노드가 연속으로 드레이닝되므로 Cluster Operator는 주제가 동기화될 때까지 기다립니다.
승인 Webhook는 Apache Kafka의 Pod 제거 요청의 Streams for Apache Kafka에 대한 알림을 Kubernetes API에 알립니다. 그런 다음 Streams for Apache Kafka DrainCleaner는 드레인할 Pod에 롤링 업데이트 주석을 추가합니다. 이렇게 하면 Cluster Operator에 제거된 Pod의 롤링 업데이트를 수행합니다.
Apache Kafka DrainCleaner용 Streams를 사용하지 않는 경우 Pod 주석을 추가하여 롤링 업데이트를 수동으로 수행할 수 있습니다.
Webhook 구성
Apache Kafka Drain cleaner 배포 파일에는 ValidatingWebhookConfiguration 리소스 파일이 포함되어 있습니다. 리소스는 Kubernetes API에 Webhook를 등록하기 위한 구성을 제공합니다.
구성은 Pod 제거 요청 시 수행할 Kubernetes API에 대한 규칙을 정의합니다. 규칙은 pods/eviction 하위 리소스와 관련된 CREATE 작업만 인터셉트되도록 지정합니다. 이러한 규칙이 충족되면 API에서 알림을 전달합니다.
clientConfig 는 Apache Kafka Drain cleaner 서비스의 Streams 및 Webhook를 노출하는 /drainer 엔드포인트를 가리킵니다. Webhook는 인증이 필요한 보안 TLS 연결을 사용합니다. caBundle 속성은 HTTPS 통신의 유효성을 검사하는 인증서 체인을 지정합니다. 인증서는 Base64로 인코딩됩니다.
Pod 제거 알림에 대한 Webhook 구성
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
# ...
webhooks:
- name: strimzi-drain-cleaner.strimzi.io
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods/eviction"]
scope: "Namespaced"
clientConfig:
service:
namespace: "strimzi-drain-cleaner"
name: "strimzi-drain-cleaner"
path: /drainer
port: 443
caBundle: Cg==
# ...
23.1. Apache Kafka DrainCleaner 배포 파일 스트림 다운로드 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka DrainCleaner용 Streams를 배포하고 사용하려면 배포 파일을 다운로드해야 합니다.
Apache Kafka Drain cleaner 배포 파일은 Streams for Apache Kafka 소프트웨어 다운로드 페이지에서 사용할 수 있습니다.
23.2. 설치 파일을 사용하여 Apache Kafka DrainCleaner용 Streams 배포 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator 및 Kafka 클러스터가 실행 중인 OpenShift 클러스터에 Apache Kafka Drain cleaner의 Streams를 배포합니다.
Apache Kafka Drain cleaner용 스트림은 두 가지 다른 모드로 실행할 수 있습니다. 기본적으로 Drain cleaner는 OpenShift 제거 요청을 거부하여 OpenShift 제거 요청을 거부하여 Pod를 제거하고 대신 Cluster Operator를 사용하여 Pod를 이동합니다. 이 모드는 다양한 클러스터 자동 스케일링 툴과 더 적합하며 특정 PodDisuptionBudget 구성이 필요하지 않습니다. 또는 Cluster Operator가 Pod를 이동하도록 지시하는 동안 제거 요청을 허용하는 레거시 모드를 활성화할 수 있습니다. 레거시 모드가 작동하려면 maxUnavailable 옵션을 0 으로 설정하여 PodDisruptionBudget 을 구성해야합니다.
사전 요구 사항
- Apache Kafka DrainCleaner 배포 파일의 Streams를 다운로드 했습니다.
- 업데이트하려는 OpenShift 작업자 노드에서 실행 중인 고가용성 Kafka 클러스터 배포가 있습니다.
고가용성을 위해 주제가 복제됩니다.
주제 구성은 복제 요소보다 최소 3개 이상 및 최소 동기화된 복제본 수를 1개로 지정합니다.
고가용성을 위해 Kafka 주제 복제
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
Kafka 또는 Zoo Cryostat 제외
Drain cleaner 작업에 Kafka 또는 Zoo Cryostat Pod를 포함하지 않거나 기존 모드에서 DrainCleaner를 사용하려는 경우 Drain cleaner 배포 구성 파일의 기본 환경 변수를 변경합니다.
-
PodDisruptionBudget구성에 의존하는 레거시 모드를 사용하도록STRIMZI_DENY_EVICTION을false로 설정합니다. -
Kafka Pod를 제외하려면
STRIMZI_DRAIN_KAFKA를false로 설정합니다. -
Zoo Cryostat Pod를 제외하려면
STRIMZI_DRAIN_ZOOKEEPER를false로 설정합니다.
Zoo Cryostat Pod를 제외하는 구성 예
apiVersion: apps/v1
kind: Deployment
spec:
# ...
template:
spec:
serviceAccountName: strimzi-drain-cleaner
containers:
- name: strimzi-drain-cleaner
# ...
env:
- name: STRIMZI_DENY_EVICTION
value: "true"
- name: STRIMZI_DRAIN_KAFKA
value: "true"
- name: STRIMZI_DRAIN_ZOOKEEPER
value: "false"
# ...
프로세스
STRIMZI_DENY_EVICTION환경 변수를false로 설정하여 활성화된 레거시 모드를 사용하는 경우PodDisruptionBudget리소스도 구성해야 합니다.템플릿설정을 사용하여Kafka리소스의 Kafka 및 Zoo Cryostat 섹션에서maxUnavailable을0(zero)으로 설정합니다.Pod 중단 예산 지정
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: template: podDisruptionBudget: maxUnavailable: 0 # ... zookeeper: template: podDisruptionBudget: maxUnavailable: 0 # ...이 설정은 계획된 중단 시 Pod를 자동으로 제거하여 Apache Kafka 드인클린더 및 Cluster Operator의 Streams를 다른 작업자 노드에 Pod를 롤아웃합니다.
Apache Kafka DrainCleaner에 Streams를 사용하여 Zoo Cryostat 노드를 드레이닝하려면 Zoo Cryostat에 대해 동일한 구성을 추가합니다.
Kafka리소스를 업데이트합니다.oc apply -f <kafka_configuration_file>Apache Kafka Drain cleaner용 Streams를 배포합니다.
OpenShift에서 Drain cleaner를 실행하려면
/install/drain-cleaner/openshift디렉터리에 리소스를 적용합니다.oc apply -f ./install/drain-cleaner/openshift
23.3. Apache Kafka DrainCleaner용 스트림 사용 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator와 함께 Apache Kafka Drain cleaner의 Streams를 사용하여 드레이닝 중인 노드에서 Kafka 브로커 또는 Zoo Cryostat Pod를 이동합니다. Apache Kafka DrainCleaner의 Streams를 실행하면 롤링 업데이트 pod 주석이 있는 Pod에 주석을 추가합니다. Cluster Operator는 주석을 기반으로 롤링 업데이트를 수행합니다.
사전 요구 사항
유사성 방지 구성을 사용할 때 고려 사항
Kafka 또는 Zoo Cryostat Pod와 함께 유사성 방지를 사용하는 경우 클러스터에 예비 작업자 노드를 추가하는 것이 좋습니다. 예비 노드를 포함하면 다른 노드를 드레이닝하거나 임시로 사용할 수 없는 동안 클러스터에서 Pod를 다시 예약할 수 있는 용량을 확보할 수 있습니다. 작업자 노드가 드레인되고 유사성 방지 규칙이 대체 노드에서 Pod 일정을 제한하는 경우 예비 노드를 사용하면 재시작된 Pod를 예약할 수 없게 됩니다. 이렇게 하면 드레이닝 작업이 실패할 위험이 완화됩니다.
프로세스
Kafka 브로커 또는 Zoo Cryostat Pod를 호스팅하는 지정된 OpenShift 노드를 드레이닝합니다.
oc get nodes oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --forceApache Kafka Drain cleaner 로그의 Streams에서 제거 이벤트를 확인하여 Pod에 다시 시작 주석이 추가되었는지 확인합니다.
Apache Kafka Drain cleaner 로그 스트림에서 Pod의 주석 표시
INFO ... Received eviction webhook for Pod my-cluster-zookeeper-2 in namespace my-project INFO ... Pod my-cluster-zookeeper-2 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-zookeeper-2 in namespace my-project found and annotated for restart INFO ... Received eviction webhook for Pod my-cluster-kafka-0 in namespace my-project INFO ... Pod my-cluster-kafka-0 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-kafka-0 in namespace my-project found and annotated for restartCluster Operator 로그에서 조정 이벤트를 확인하여 롤링 업데이트를 확인합니다.
Cluster Operator 로그에서 롤링 업데이트 표시
INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-zookeeper-2 INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-kafka-0 INFO AbstractOperator:500 - Reconciliation #13(timer) Kafka(my-project/my-cluster): reconciled
23.4. Apache Kafka Drain cleaner용 Streams에서 사용하는 TLS 인증서 감시 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 Drain cleaner 배포는 인증에 사용하는 TLS 인증서가 포함된 시크릿을 감시합니다. DrainCleaner는 인증서 갱신과 같은 변경 사항을 감시합니다. 변경 사항이 감지되면 다시 시작하여 TLS 인증서를 다시 로드합니다. Drain cleaner 설치 파일은 기본적으로 이 동작을 활성화합니다. 그러나 DrainCleaner 설치 파일의 배포 구성(060- )에서 Deployment.yamlSTRIMZI_CERTIFICATE_WATCH_ENABLED 환경 변수를 false 로 설정하여 인증서 감시를 비활성화할 수 있습니다.
STRIMZI_CERTIFICATE_WATCH_ENABLED 를 활성화하면 TLS 인증서를 감시하는 데 다음 환경 변수를 사용할 수도 있습니다.
| 환경 변수 | 설명 | 기본 |
|---|---|---|
|
| 인증서 감시 활성화 또는 비활성화 |
|
|
| Drain cleaner가 배포되고 인증서 보안이 존재하는 네임스페이스입니다. |
|
|
| Drain cleaner Pod 이름 | - |
|
| TLS 인증서를 포함하는 시크릿의 이름 |
|
|
| TLS 인증서가 포함된 시크릿 내부의 필드 목록 |
|
조사 작업을 제어하는 환경 변수 구성의 예
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_NAMESPACE 및 STRIMZI_CERTIFICATE_WATCH_POD_NAME 을 구성합니다.
24장. 진단 및 문제 해결 데이터 검색 링크 복사링크가 클립보드에 복사되었습니다!
report.sh 진단 툴은 OpenShift에서 Apache Kafka 배포용 Streams 문제 해결을 위한 필수 데이터를 수집하기 위해 Red Hat에서 제공하는 스크립트입니다. 관련 로그, 구성 파일 및 기타 진단 데이터를 수집하여 문제를 식별하고 해결합니다. 스크립트를 실행할 때 추가 매개변수를 지정하여 특정 데이터를 검색할 수 있습니다.
사전 요구 사항
- Bash 4 이상에서 스크립트를 실행합니다.
-
OpenShift
oc명령줄 툴이 설치되어 실행 중인 클러스터에 연결하도록 구성되어 있습니다.
이렇게 하면 oc 명령줄 툴에서 클러스터와 상호 작용하고 필요한 진단 데이터를 검색하는 데 필요한 인증이 설정됩니다.
프로세스
툴을 다운로드하여 추출합니다.
툴을 추출한 디렉터리에서 터미널을 열고 보고 툴을 실행합니다.
./report.sh --namespace=<cluster_namespace> --cluster=<cluster_name> --out-dir=<local_output_directory><
cluster_namespace>를 Apache Kafka 배포에 대한 Streams의 실제 OpenShift 네임스페이스로, <cluster_name>을 Kafka 클러스터의 이름으로, <local_output_directory>를 생성된 보고서를 저장하려는 로컬 디렉터리의 경로로 바꿉니다. 디렉터리를 지정하지 않으면 임시 디렉터리가 생성됩니다.필요에 따라 기타 선택적 보고 옵션을 포함합니다.
- --bridge=<string>
- Pod 및 로그에서 데이터를 가져오려면 Kafka Bridge 클러스터의 이름을 지정합니다.
- --connect=<string>
- Pod 및 로그에서 데이터를 가져올 Kafka Connect 클러스터의 이름을 지정합니다.
- --mm2=<string>
- Pod 및 로그의 데이터를 가져올 미러 메이커 2 클러스터의 이름을 지정합니다.
- --secrets=(off|hidden|all)
시크릿 상세 정보 표시 수준을 지정합니다. 기본값은
hidden입니다. 사용 가능한 옵션은 다음과 같습니다.-
all: 시크릿 키와 데이터 값이 보고됩니다. -
hidden: 키만 있는 시크릿이 보고됩니다. 암호와 같은 데이터 값이 제거됩니다. -
Off: 시크릿은 전혀 보고되지 않습니다.
-
데이터 수집 옵션이 있는 요청 예
./report.sh --namespace=my-amq-streams-namespace --cluster=my-kafka-cluster --bridge=my-bridge-component --secrets=all --out-dir=~/reports참고필요한 경우
chmod명령을 사용하여 스크립트에 대한 실행 권한을 사용자에게 할당합니다. 예를 들어chmod +x report.sh.
스크립트 실행이 완료되면 출력 디렉터리에 Apache Kafka 배포를 위해 Streams의 각 구성 요소에 대해 수집된 로그, 구성 및 기타 진단 데이터의 파일 및 디렉터리가 포함됩니다.
보고 진단 툴로 수집한 데이터
다음 구성 요소의 데이터가 있는 경우 반환됩니다.
Cluster Operator
- 배포 YAML 및 로그
- 모든 관련 Pod 및 해당 로그
- 클러스터 Operator와 관련된 리소스에 대한 YAML 파일(ClusterRoles, ClusterRoleBindings)
drain cleaner (있는 경우)
- 배포 YAML 및 로그
- Pod 로그
사용자 정의 리소스
- CRD(사용자 정의 리소스 정의) YAML
- 모든 관련 사용자 정의 리소스(CR)에 대한 YAML 파일
이벤트
- 지정된 네임스페이스와 관련된 이벤트
구성
-
Kafka Pod 로그 및 구성 파일 (
strimzi.properties) -
Zookeeper Pod 로그 및 구성 파일 ( Zookeeper
.properties) - Entity Operator(Topic Operator, User Operator) Pod 로그
- cruise Control Pod 로그
- Kafka Exporter Pod 로그
- 옵션에 지정된 경우 브리지 Pod 로그
- 옵션에 지정된 경우 Pod 로그 연결
- 옵션에 지정된 경우 MirrorMaker 2 Pod 로그
보안 (옵션에서 요청된 경우)
- 지정된 Kafka 클러스터와 관련된 모든 보안에 대한 YAML 파일
25장. Apache Kafka의 스트림 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Streams for Apache Kafka 설치를 버전 2.7로 업그레이드하고 새로운 기능, 성능 개선 및 향상된 보안 옵션을 활용할 수 있습니다. 업그레이드 중에 Kafka가 지원되는 최신 버전으로 업데이트되어 Apache Kafka 배포를 위한 Streams에 추가 기능 및 버그 수정이 도입되었습니다.
초기 배포 방법으로 Cluster Operator를 업그레이드하려면 동일한 방법을 사용합니다. 예를 들어, Apache Kafka 설치 파일의 Streams를 사용한 경우 해당 파일을 수정하여 업그레이드를 수행합니다. Cluster Operator를 2.7로 업그레이드한 후 다음 단계는 모든 Kafka 노드를 지원되는 최신 Kafka 버전으로 업그레이드하는 것입니다. Kafka 업그레이드는 Kafka 노드의 롤링 업데이트를 통해 Cluster Operator에 의해 수행됩니다.
새 버전에 문제가 발생하면 Apache Kafka용 Streams를 이전 버전으로 다운그레이드 할 수 있습니다.
Apache Kafka 버전용 릴리스 스트림은 Apache Kafka 소프트웨어 다운로드용 Streams에서 찾을 수 있습니다.
다운타임 없이 업그레이드
고가용성(최소 3 및 균등하게 분산 파티션의 복제 요소)으로 구성된 주제의 경우 업그레이드 프로세스에서 소비자 및 생산자의 다운타임을 유발하지 않아야 합니다.
업그레이드는 프로세스의 다른 단계에서 브로커를 하나씩 다시 시작하는 롤링 업데이트를 트리거합니다. 이 기간 동안 전체 클러스터 가용성이 일시적으로 줄어들어 브로커가 실패할 경우 메시지 손실 위험이 증가할 수 있습니다.
25.1. 필수 업그레이드 순서 링크 복사링크가 클립보드에 복사되었습니다!
다운타임 없이 브로커 및 클라이언트를 업그레이드하려면 다음 순서로 Apache Kafka 업그레이드 절차를 완료해야 합니다.
OpenShift 클러스터 버전이 지원되는지 확인합니다.
Apache Kafka 2.7의 스트림에는 OpenShift 4.12 ~ 4.15가 필요합니다.
다운타임을 최소화하여 OpenShift를 업그레이드할 수 있습니다.
- Cluster Operator를 업그레이드합니다.
클러스터 구성에 따라 Kafka를 업그레이드합니다.
-
KRaft 모드에서 Kafka를 사용하는 경우 Kafka 버전 및
spec.kafka.metadataVersion을 업데이트하여 모든 Kafka 브로커 및 클라이언트 애플리케이션을 업그레이드 합니다. -
Zoo Cryostat 기반 Kafka를 사용하는 경우 Kafka 버전과
inter.broker.protocol.version을 업데이트하여 모든 Kafka 브로커 및 클라이언트 애플리케이션을 업그레이드 합니다.
-
KRaft 모드에서 Kafka를 사용하는 경우 Kafka 버전 및
Streams for Apache Kafka 2.7에서 KRaft 기반 클러스터 간의 업그레이드 및 다운그레이드가 지원됩니다.
25.2. Apache Kafka 업그레이드 경로 스트림 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams에 두 개의 업그레이드 경로를 사용할 수 있습니다.
- 증분 업그레이드
- 증분 업그레이드에는 이전 마이너 버전에서 버전 2.7로 Apache Kafka의 Streams를 업그레이드해야 합니다.
- 다중 버전 업그레이드
- 다중 버전 업그레이드에는 Apache Kafka의 이전 버전의 Streams를 단일 업그레이드 내에서 버전 2.7으로 업그레이드하여 하나 이상의 중간 버전을 건너뜁니다. 예를 들어 Streams for Apache Kafka 2.3.0에서 Apache Kafka 2.7의 Streams로 직접 업그레이드할 수 있습니다.
25.2.1. 업그레이드할 때 Kafka 버전 지원 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams를 업그레이드할 때 사용 중인 Kafka 버전과의 호환성을 확인하는 것이 중요합니다.
지원되는 Kafka 버전이 이전 버전과 새 버전 간에 다른 경우에도 다중 버전 업그레이드가 가능합니다. 그러나 현재 Kafka 버전을 지원하지 않는 Apache Kafka 버전의 새 Streams로 업그레이드하려고 하면 Kafka 버전이 지원되지 않음을 나타내는 오류가 생성됩니다. 이 경우 Kafka 사용자 정의 리소스의 spec.kafka.version 을 새 Streams for Apache Kafka 버전에 대해 지원되는 버전으로 변경하여 Apache Kafka 에 대한 Streams for Apache Kafka 업그레이드의 일부로 Kafka 버전을 업그레이드해야 합니다.
25.2.2. 1.7 이전의 Apache Kafka용 Streams에서 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
버전 1.7 이전 버전에서 Apache Kafka의 최신 버전으로 업그레이드하는 경우 다음을 수행합니다.
- 표준 순서에 따라 Apache Kafka의 Streams를 버전 1.7로 업그레이드합니다.
-
Apache Kafka 사용자 정의 리소스의 Streams를 Apache Kafka용 Streams와 함께 제공되는 API 변환 툴 을 사용하여
v1beta2로 변환합니다. 다음 중 하나를 수행합니다.
-
Apache Kafka의 Streams를 1.8에서 0.26 사이의 버전으로 업그레이드합니다. 여기서
ControlPlaneListener기능 게이트는 기본적으로 비활성화되어 있습니다. -
Apache Kafka의 Streams를 2.0에서 0.31(기본적으로
ControlPlaneListener기능 게이트가 활성화되어 있음)과ControlPlaneListener기능 게이트가 비활성화된 버전으로 업그레이드합니다.
-
Apache Kafka의 Streams를 1.8에서 0.26 사이의 버전으로 업그레이드합니다. 여기서
-
ControlPlaneListener기능 게이트를 활성화합니다. - 표준 순서에 따라 Apache Kafka 2.7의 Streams로 업그레이드.
Apache Kafka 사용자 정의 리소스의 스트림은 릴리스 1.7에서 v1beta2 API 버전을 사용하기 시작했습니다. Apache Kafka 1.8 이상 버전으로 업그레이드하기 전에 CRD 및 사용자 정의 리소스를 변환해야 합니다. API 변환 툴 사용에 대한 자세한 내용은 Apache Kafka 1.7 업그레이드 설명서 를 참조하십시오.
버전 1.7로 처음 업그레이드하는 대신 버전 1.7에서 사용자 지정 리소스를 설치한 다음 리소스를 변환할 수 있습니다.
이제 ControlPlaneListener 기능이 Apache Kafka용 Streams에서 영구적으로 활성화됩니다. 비활성화된 Apache Kafka용 Streams 버전으로 업그레이드한 다음 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 사용하여 활성화해야 합니다.
ControlPlaneListener 기능 게이트 비활성화
env:
- name: STRIMZI_FEATURE_GATES
value: -ControlPlaneListener
ControlPlaneListener 기능 게이트 활성화
env:
- name: STRIMZI_FEATURE_GATES
value: +ControlPlaneListener
25.2.3. Kafka 버전 및 이미지 매핑 링크 복사링크가 클립보드에 복사되었습니다!
Kafka를 업그레이드할 때 STRIMZI_KAFKA_IMAGES 환경 변수 및 Kafka.spec.kafka.version 속성에 대한 설정을 고려하십시오.
-
각
Kafka리소스는 지정되지 않은 경우 지원되는 최신 Kafka 버전 (3.7.0)으로 기본 제공되는Kafka.spec.kafka.version을 사용하여 구성할 수 있습니다. Cluster Operator의
STRIMZI_KAFKA_IMAGES환경 변수는Kafka버전과 지정된 Kafka 리소스에서 특정 Kafka 버전을 요청할 때 사용할 이미지 간 매핑 (<kafka_version>=<image>)을 제공합니다. 예: 3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0.-
Kafka.spec.kafka.image가 구성되지 않은 경우 지정된 버전의 기본 이미지가 사용됩니다. -
Kafka.spec.kafka.image가 구성된 경우 기본 이미지가 재정의됩니다.
-
Cluster Operator는 이미지에 예상 버전의 Kafka 브로커가 실제로 포함되어 있는지 확인할 수 없습니다. 지정된 이미지가 지정된 Kafka 버전에 해당하는지 확인합니다.
25.3. 클라이언트 업그레이드 전략 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클라이언트를 업그레이드하면 새로운 버전의 Kafka에 도입된 기능, 수정 및 개선 사항의 이점을 누릴 수 있습니다. 업그레이드된 클라이언트는 다른 업그레이드된 Kafka 구성 요소와의 호환성을 유지합니다. 고객의 성능과 안정성도 개선될 수 있습니다.
원활한 전환을 위해 Kafka 클라이언트 및 브로커를 업그레이드하는 가장 좋은 방법을 고려하십시오. 선택한 업그레이드 전략은 브로커 또는 클라이언트를 먼저 업그레이드하는지 여부에 따라 달라집니다. Kafka 3.0부터는 브로커와 클라이언트를 어떤 순서로 독립적으로 업그레이드할 수 있습니다. 먼저 클라이언트 또는 브로커 업그레이드 결정은 업그레이드해야 하는 애플리케이션 수와 다운타임을 허용할 수 없는 여러 요인에 따라 달라집니다.
브로커 전에 클라이언트를 업그레이드하는 경우 일부 새로운 기능은 브로커가 아직 지원하지 않기 때문에 작동하지 않을 수 있습니다. 그러나 브로커는 다른 버전으로 실행되고 다른 로그 메시지 버전을 지원하는 생산자 및 소비자를 처리할 수 있습니다.
25.4. 다운타임을 최소화하여 OpenShift 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift를 업그레이드하는 경우 OpenShift 업그레이드 설명서를 참조하여 업그레이드 경로와 노드를 올바르게 업그레이드하는 단계를 확인하십시오. OpenShift를 업그레이드하기 전에 Apache Kafka용 Streams 버전에 대해 지원되는 버전을 확인합니다.
업그레이드를 수행할 때 다음 단계를 수행하여 Kafka 클러스터의 가용성을 확인하십시오.
- Pod 중단 예산 구성
다음 방법 중 하나를 사용하여 롤링 Pod
- Apache Kafka Drain cleaner용 Streams 사용 (권장 권장)
- Pod에 주석을 적용하여 수동으로 롤아웃
Kafka가 계속 작동하려면 고가용성을 위해 주제를 복제해야 합니다. 이를 위해서는 복제 요소보다 3개 이상의 복제 요소와 최소 개수의 in-sync 복제본 수를 1로 지정하는 주제 구성이 필요합니다.
고가용성을 위해 Kafka 주제 복제
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 1
replicas: 3
config:
# ...
min.insync.replicas: 2
# ...
고가용성 환경에서 Cluster Operator는 업그레이드 프로세스 중에 다운타임이 없도록 최소한의 in-sync 복제본을 유지 관리합니다.
25.4.1. Drain cleaner를 사용하여 롤링 Pod 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 업그레이드 중에 노드를 제거하기 위해 Streams for Apache Kafka DrainCleaner를 사용하면 Pod에 수동 롤링 업데이트 주석이 추가되어 Cluster Operator에 제거되어야 하는 Pod의 롤링 업데이트를 수행하고 업그레이드 중인 OpenShift 노드에서 이동하도록 알립니다.
자세한 내용은 23장. Apache Kafka DrainCleaner용 Streams를 사용하여 Pod 제거의 내용을 참조하십시오.
25.4.2. 롤링 Pod 수동 (클린더를 Drain cleaner로) 링크 복사링크가 클립보드에 복사되었습니다!
DrainCleaner를 사용하여 Pod를 롤오버하는 대신 Cluster Operator를 통해 Pod의 수동 롤링 업데이트를 트리거할 수 있습니다. Pod 리소스를 사용하여 롤링 업데이트는 새 Pod를 사용하여 리소스의 Pod를 다시 시작합니다. 주제를 계속 사용하여 Drain cleaner의 작업을 복제하려면 Pod 중단 예산에 대해 maxUnavailable 값을 0으로 설정해야 합니다. Pod 중단 예산을 0으로 줄이면 OpenShift에서 포드를 자동으로 제거하지 못합니다.
Pod 중단 예산 지정
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
template:
podDisruptionBudget:
maxUnavailable: 0
# ...
드레인해야 하는 Pod를 확인해야 합니다. 그런 다음 Pod 주석을 추가하여 업데이트합니다.
여기에서 주석은 my-cluster-pool-a-1 이라는 Kafka Pod를 업데이트합니다.
Kafka Pod에서 수동 롤링 업데이트 수행
oc annotate pod my-cluster-pool-a-1 strimzi.io/manual-rolling-update="true"
25.5. Cluster Operator 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
초기 배포 방법으로 Cluster Operator를 업그레이드하려면 동일한 방법을 사용합니다.
25.5.1. 설치 파일을 사용하여 Cluster Operator 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Apache Kafka 2.7에 Streams를 사용하도록 Cluster Operator 배포를 업그레이드하는 방법을 설명합니다.
설치 YAML 파일을 사용하여 Cluster Operator를 배포한 경우 다음 절차를 따르십시오.
Cluster Operator에서 관리하는 Kafka 클러스터의 가용성은 업그레이드 작업의 영향을 받지 않습니다.
해당 버전으로 업그레이드하는 방법에 대한 정보는 특정 버전의 Apache Kafka를 지원하는 설명서를 참조하십시오.
사전 요구 사항
- 기존 Cluster Operator 배포를 사용할 수 있습니다.
- Apache Kafka 2.7용 Streams 아티팩트를 다운로드 했습니다.
프로세스
-
기존 Cluster Operator 리소스(
/install/cluster-operator디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. Cluster Operator의 새 버전으로 변경 사항을 덮어씁니다. - Apache Kafka 버전 2.7에 사용할 수 있는 지원되는 구성 옵션을 반영하도록 사용자 지정 리소스를 업데이트합니다.
Cluster Operator를 업데이트합니다.
Cluster Operator가 실행되는 네임스페이스에 따라 새 Cluster Operator 버전의 설치 파일을 수정합니다.
Linux에서 다음을 사용하십시오.
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlMacOS에서 다음을 사용하십시오.
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml-
기존 Cluster Operator 배포에서 하나 이상의 환경 변수를 수정한 경우
install/cluster-operator/060-파일을 편집하여 해당 환경 변수를 사용합니다.Deployment-strimzi-cluster-operator.yaml
업데이트된 구성이 있는 경우 나머지 설치 리소스와 함께 배포합니다.
oc replace -f install/cluster-operator롤링 업데이트가 완료될 때까지 기다립니다.
새 Operator 버전이 업그레이드 중인 Kafka 버전을 더 이상 지원하지 않는 경우 Cluster Operator는 버전이 지원되지 않는 것으로 오류 메시지를 반환합니다. 그렇지 않으면 오류 메시지가 반환되지 않습니다.
오류 메시지가 반환되면 새 Cluster Operator 버전에서 지원하는 Kafka 버전으로 업그레이드합니다.
-
Kafka사용자 정의 리소스를 편집합니다. -
spec.kafka.version속성을 지원되는 Kafka 버전으로 변경합니다.
-
- 오류 메시지가 반환 되지 않으면 다음 단계로 이동합니다. 나중에 Kafka 버전을 업그레이드합니다.
Kafka Pod의 이미지를 가져와 업그레이드가 성공적으로 수행되었는지 확인합니다.
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'image 태그는 Apache Kafka 버전의 새 Streams와 Kafka 버전이 차례로 표시됩니다.
registry.redhat.io/amq-streams/strimzi-kafka-37-rhel9:2.7.0
Cluster Operator는 버전 2.7으로 업그레이드되지만 관리하는 클러스터에서 실행되는 Kafka 버전은 변경되지 않습니다.
25.5.2. OperatorHub를 사용하여 Cluster Operator 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
OperatorHub에서 Apache Kafka용 Streams를 배포하는 경우 OLM(Operator Lifecycle Manager)을 사용하여 Apache Kafka Operator의 스트림 업데이트 채널을 Apache Kafka 버전의 새 스트림으로 변경합니다.
채널을 업데이트하면 선택한 업그레이드 전략에 따라 다음 유형의 업그레이드 중 하나가 시작됩니다.
- 자동 업그레이드가 시작됨
- 설치를 시작하기 전에 승인이 필요한 수동 업그레이드
stable 채널을 구독하면 채널을 변경하지 않고도 자동 업데이트를 받을 수 있습니다. 그러나 설치 전 업그레이드 단계가 누락될 가능성이 있으므로 자동 업데이트를 활성화하는 것은 권장되지 않습니다. 버전별 채널에서만 자동 업그레이드를 사용합니다.
OperatorHub를 사용하여 Operator를 업그레이드하는 방법에 대한 자세한 내용은 설치된 Operator 업그레이드(OpenShift 문서)를 참조하십시오.
25.5.3. 단방향 주제 관리로 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator를 배포하여 주제를 관리할 때 Cluster Operator는 기본적으로 단방향 주제 관리를 활성화합니다. 양방향 주제 관리를 사용한 Apache Kafka용 스트림 버전에서 전환하는 경우 Cluster Operator를 업그레이드한 후 수행해야 하는 몇 가지 정리 작업이 있습니다. 자세한 내용은 10.9절. “Topic Operator 모드 간 전환”의 내용을 참조하십시오.
25.5.4. Cluster Operator 업그레이드 시 Kafka 버전 오류가 반환됩니다. 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator를 사용 중인 현재 Kafka 버전을 지원하지 않는 버전으로 업그레이드하는 경우 지원되지 않는 Kafka 버전 오류가 발생합니다. 이 오류는 모든 설치 방법에 적용되며 Kafka를 지원되는 Kafka 버전으로 업그레이드해야 합니다. Kafka 리소스의 spec.kafka.version 을 지원되는 버전으로 변경합니다.
oc 를 사용하여 Kafka 리소스의 상태에서 이와 같은 오류 메시지를 확인할 수 있습니다.
Kafka 상태에 오류가 있는지 확인
oc get kafka <kafka_cluster_name> -n <namespace> -o jsonpath='{.status.conditions}'
<kafka_cluster_name>을 Kafka 클러스터의 이름으로 바꾸고 <namespace>를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
25.5.5. OperatorHub를 사용하여 Apache Kafka 1.7 또는 이전 버전의 Streams에서 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
OperatorHub를 사용하여 Apache Kafka 1.7 또는 이전 버전의 Streams에서 업그레이드하는 경우 필요한 작업
Apache Kafka Operator의 Streams for Apache Kafka Operator 를 버전 2.7로 업그레이드하기 전에 다음과 같은 사항을 변경해야 합니다.
-
사용자 정의 리소스 및 CRD를
v1beta2로 변환 -
ControlPlaneListener기능 게이트가 비활성화된 Apache Kafka의 Streams 버전으로 업그레이드
이러한 요구 사항은 25.2.2절. “1.7 이전의 Apache Kafka용 Streams에서 업그레이드” 에 설명되어 있습니다.
Apache Kafka 1.7 또는 이전 버전의 Streams에서 업그레이드하는 경우 다음을 수행합니다.
- Apache Kafka 1.7의 Streams로 업그레이드합니다.
- Apache Kafka 소프트웨어 다운로드 페이지에서 Streams for Apache Kafka 1.8와 함께 제공되는 Red Hat Streams for Apache Kafka API 변환 툴 을 다운로드합니다.
사용자 정의 리소스 및 CRD를
v1beta2로 변환합니다.- OperatorHub에서 Apache Kafka Operator용 Streams 1.7 버전을 삭제합니다.
또한 존재하는 경우 Apache Kafka Operator용 Streams 2.7 버전을 삭제합니다.
존재하지 않는 경우 다음 단계로 이동합니다.
Apache Kafka Operator의 Streams에 대한 승인 전략이 자동으로 설정된 경우 Operator의 버전 2.7이 클러스터에 이미 존재할 수 있습니다. 사용자 정의 리소스 및 CRD를 릴리스 전에
v1beta2API 버전으로 변환 하지 않은 경우 operator-managed 사용자 정의 리소스 및 CRD는 이전 API 버전을 사용합니다. 그 결과 2.7 Operator가 Pending 상태로 유지됩니다. 이 경우 버전 2.7 of the Streams for Apache Kafka Operator 및 버전 1.7을 삭제해야 합니다.두 Operator를 모두 삭제하면 새 Operator 버전이 설치될 때까지 조정이 일시 중지됩니다. 사용자 정의 리소스에 대한 변경 사항이 지연되지 않도록 다음 단계를 즉시 수행합니다.
OperatorHub에서 다음 중 하나를 수행합니다.
-
Apache Kafka Operator용 Streams 1.8로 업그레이드(
ControlPlaneListener기능 게이트는 기본적으로 비활성화되어 있음). -
ControlPlaneListener기능 게이트를 비활성화하여 Apache Kafka Operator용 Streams 2.0 또는 2.2(ControlPlaneListener기능 게이트가 기본적으로 활성화되어 있음)로 업그레이드합니다.
-
Apache Kafka Operator용 Streams 1.8로 업그레이드(
Apache Kafka Operator의 Streams 2.7으로 즉시 업그레이드합니다.
설치된 2.7 Operator는 클러스터를 모니터링하고 롤링 업데이트를 수행합니다. 이 프로세스 중에 클러스터 성능이 일시적으로 저하될 수 있습니다.
25.6. KRaft 기반 Kafka 클러스터 및 클라이언트 애플리케이션 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 클러스터의 KRaft 기반 Streams를 지원되는 최신 Kafka 버전 및 KRaft 메타데이터 버전으로 업그레이드합니다.
또한 클라이언트 업그레이드 전략을 선택해야 합니다. Kafka 클라이언트는 이 절차의 6단계에서 업그레이드됩니다.
KRaft 기반 업그레이드 지원에 대한 최신 정보는 Apache Kafka 설명서를 참조하십시오.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
-
Apache Kafka 클러스터의 Streams를 업그레이드하기 전에 Kafka 리소스의 속성에 새
Kafka버전에서 지원되지 않는 구성 옵션이 포함되어 있지 않은지 확인합니다.
프로세스
Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka <kafka_configuration_file>구성된 경우 현재
spec.kafka.metadataVersion이 업그레이드 중인 Kafka 버전에서 지원하는 버전으로 설정되어 있는지 확인합니다.예를 들어 Kafka 버전 3.6.0에서 3.7.0으로 업그레이드하는 경우 현재 버전은 3.6-IV2입니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2 version: 3.6.0 # ...metadataVersion이 구성되지 않은 경우 다음 단계에서 Kafka 버전으로 업데이트한 후 Apache Kafka의 Streams를 현재 기본값으로 자동으로 업데이트합니다.참고metadataVersion의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.Kafka.spec.kafka.version을 변경하여 새 Kafka 버전을 지정하고metadataVersion을 현재 Kafka 버전의 기본값으로 둡니다.참고kafka.version을 변경하면 클러스터의 모든 브로커가 새 브로커 바이너리를 사용하도록 업그레이드됩니다. 이 프로세스 중에 일부 브로커는 이전 바이너리를 사용하고 있지만 다른 브로커는 이미 새 바이너리로 업그레이드했습니다. 현재 설정에서metadataVersion을 변경하지 않고 그대로 유지하면 Kafka 브로커와 컨트롤러가 업그레이드 중에 계속 서로 통신할 수 있습니다.예를 들어 Kafka 3.6.0에서 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV21 version: 3.7.02 # ...Kafka 클러스터의 이미지가 Kafka 사용자 정의 리소스의
Kafka.spec.kafka.에 정의된 경우 새imageKafka버전이 있는 컨테이너 이미지를 가리키도록 이미지를 업데이트합니다.Kafka 버전 및 이미지 매핑을 참조하십시오.
편집기를 저장하고 종료한 다음 롤링 업데이트가 Kafka 노드를 업그레이드할 때까지 기다립니다.
Pod 상태 전환을 확인하여 롤링 업데이트의 진행 상황을 확인합니다.
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'롤링 업데이트를 통해 각 pod가 새 Kafka 버전에 브로커 바이너리를 사용하고 있는지 확인합니다.
클라이언트를 업그레이드하기 위한 선택한 전략에 따라 모든 클라이언트 애플리케이션을 업그레이드하여 새 버전의 클라이언트 바이너리를 사용합니다.
필요한 경우 Kafka Connect 및 MirrorMaker의
버전속성을 Kafka의 새 버전으로 설정합니다.-
Kafka Connect의 경우
KafkaConnect.spec.version을 업데이트합니다. -
MirrorMaker의 경우
KafkaMirrorMaker.spec.version을 업데이트합니다. MirrorMaker 2의 경우
KafkaMirrorMaker2.spec.version을 업데이트합니다.참고수동으로 빌드된 사용자 지정 이미지를 사용하는 경우 해당 이미지를 다시 빌드하여 Apache Kafka 기본 이미지의 최신 스트림으로 최신 이미지인지 확인해야 합니다. 예를 들어 기본 Kafka Connect 이미지에서 컨테이너 이미지를 생성한 경우 최신 기본 이미지 및 빌드 구성을 가리키도록 Dockerfile을 업데이트합니다.
-
Kafka Connect의 경우
- 업그레이드된 클라이언트 애플리케이션이 새 Kafka 브로커에서 올바르게 작동하는지 확인합니다.
구성된 경우 새
metadataVersion버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 9단계로 이동합니다.예를 들어 Kafka 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.7-IV2 version: 3.7.0 # ...주의다운그레이딩이 가능하지 않을 수 있으므로
metadataVersion을 변경할 때는 주의하십시오. 새 Kafka 버전의metadataVersion이 다운그레이드하려는 Kafka 버전보다 크면 Kafka를 다운그레이드할 수 없습니다. 그러나 이전 버전을 유지 관리할 때 지원 및 호환성에 미치는 잠재적 영향을 이해하십시오.Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
25.7. Zoo Cryostat를 사용할 때 Kafka 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Zoo Cryostat 기반 Kafka 클러스터를 사용하는 경우 업그레이드하려면 Kafka 버전과 브랜드 간 프로토콜 버전을 업데이트해야 합니다.
KRaft 모드에서 메타데이터 관리를 위해 Zoo Cryostat를 사용하여 Kafka 클러스터를 전환하려면 업그레이드와 별도로 단계를 수행해야 합니다. KRaft 기반 클러스터로 마이그레이션하는 방법에 대한 자세한 내용은 8장. KRaft 모드로 마이그레이션 을 참조하십시오.
25.7.1. Kafka 버전 업데이트 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 관리를 위해 Zoo Cryostat를 사용할 때 Kafka 를 업그레이드하려면 Kafka 리소스 구성에서 Kafka 버전(Kafka.spec.kafka.version)과 브랜드 간 프로토콜 버전(inter.broker.protocol.version)을 업데이트해야 합니다. Kafka의 각 버전에는 해석 간 프로토콜의 호환 버전이 있습니다. broker 간 프로토콜은 브루커 간 통신에 사용됩니다. 프로토콜의 마이너 버전은 일반적으로 이전 표에 표시된 대로 Kafka의 마이너 버전과 일치하도록 증가합니다. broker 프로토콜 버전은 Kafka 리소스에서 클러스터 전체로 설정됩니다. 이를 변경하려면 Kafka.spec.kafka.config 에서 inter.broker.protocol.version 속성을 편집합니다.
다음 표는 Kafka 버전의 차이점을 보여줍니다.
| Apache Kafka 버전용 스트림 | Kafka 버전 | broker 프로토콜 버전 | 로그 메시지 형식 버전 | Zookeeper 버전 |
|---|---|---|---|---|
| 2.7 | 3.7.0 | 3.7 | 3.7 | 3.8.3 |
| 2.6 | 3.6.0 | 3.6 | 3.6 | 3.8.3 |
- Kafka 3.7.0은 프로덕션 용도로 지원됩니다.
- Kafka 3.6.0은 Apache Kafka 2.7용 Streams로 업그레이드하기 위한 목적으로만 지원됩니다.
로그 메시지 형식 버전
생산자가 Kafka 브로커에 메시지를 보내면 메시지는 특정 형식을 사용하여 인코딩됩니다. 형식은 Kafka 릴리스 간에 변경될 수 있으므로 메시지는 인코딩된 메시지 형식의 버전을 지정합니다.
특정 메시지 형식 버전을 설정하는 데 사용되는 속성은 다음과 같습니다.
-
주제의
message.format.version속성 -
Kafka 브로커의
log.message.format.version속성
Kafka 3.0.0에서 메시지 형식 버전 값은 inter.broker.protocol.version 과 일치하도록 가정되며 설정할 필요가 없습니다. 값은 사용된 Kafka 버전을 반영합니다.
Kafka 3.0.0 이상으로 업그레이드할 때 inter.broker.protocol.version 을 업데이트할 때 이러한 설정을 제거할 수 있습니다. 그러지 않으면 업그레이드할 Kafka 버전에 따라 메시지 형식 버전을 설정할 수 있습니다.
항목에 대한 message.format.version 의 기본값은 Kafka 브로커에 설정된 log.message.format.version 에 의해 정의됩니다. 주제 구성을 수정하여 주제의 message.format.version 을 수동으로 설정할 수 있습니다.
Kafka 버전 변경에서 롤링 업데이트
Kafka 버전이 업데이트되면 Cluster Operator가 Kafka 브로커에 대한 롤링 업데이트를 시작합니다. 추가 롤링 업데이트는 inter.broker.protocol.version 및 log.message.format.version 에 대한 구성에 따라 달라집니다.
Kafka.spec.kafka.config 에…이 포함된 경우 | Cluster Operator가…을 시작합니다. |
|---|---|
|
|
단일 롤링 업데이트. 업데이트 후 |
|
| 두 개의 롤링 업데이트 |
|
| 두 개의 롤링 업데이트 |
Kafka 3.0.0에서 inter.broker.protocol.version 이 3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다. 브로커의 log.message.format.version 속성 및 주제의 message.format.version 속성은 더 이상 사용되지 않으며 Kafka의 향후 릴리스에서 제거됩니다.
Kafka 업그레이드의 일부로 Cluster Operator는 Zoo Cryostat에 대한 롤링 업데이트를 시작합니다.
- 단일 롤링 업데이트는 Zoo Cryostat 버전이 변경되지 않은 경우에도 발생합니다.
- 추가 롤링 업데이트는 Kafka의 새 버전에 새 Zoo Cryostat 버전이 필요한 경우 발생합니다.
25.7.2. 이전 메시지 형식으로 클라이언트 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 3.0 이전에는 log.message.format.version 속성(또는 주제 수준의 message.format.version 속성)을 사용하여 브로커에 대한 특정 메시지 형식을 구성할 수 있습니다. 이로 인해 브로커는 오래된 메시지 형식을 사용하는 이전 Kafka 클라이언트를 수용할 수 있었습니다. Kafka는 이 속성을 명시적으로 설정하지 않고 이전 클라이언트를 고유하게 지원하지만 브로커는 상당한 성능 비용과 함께 이전 클라이언트에서 메시지를 변환해야 합니다.
Apache Kafka Java 클라이언트는 버전 0.11 이후 최신 메시지 형식 버전을 지원했습니다. 모든 클라이언트가 최신 메시지 버전을 사용하는 경우 브로커를 업그레이드할 때 log.message.format.version 또는 message.format.version 덮어쓰기를 제거할 수 있습니다.
그러나 이전 메시지 형식 버전을 사용하는 클라이언트가 여전히 있는 경우 먼저 클라이언트를 업그레이드하는 것이 좋습니다. 소비자와 함께 시작한 다음 브로커를 업그레이드할 때 log.message.format.version 또는 message.format.version 을 제거하기 전에 생산자를 업그레이드합니다. 이렇게 하면 모든 클라이언트가 최신 메시지 형식 버전을 지원할 수 있으며 업그레이드 프로세스가 원활하게 진행됩니다.
이 메트릭을 사용하여 Kafka 클라이언트 이름 및 버전을 추적할 수 있습니다.
-
Kafka.server:type=socket-server-metrics,clientSoftwareName=<name>,clientSoftwareVersion=<version>,listener=<listener>,networkProcessor=<processor>
다음 Kafka 브로커 메트릭은 메시지 down-conversion의 성능을 모니터링하는 데 도움이 됩니다.
-
Kafka
.network:type=RequestMetrics,name=MessageConversionsTimeMs,request={Produce|Fetch}는 메시지 변환을 수행하는 데 걸리는 시간에 대한 메트릭을 제공합니다. -
Kafka
.server:type=BrokerTopicMetrics,name={Produce|Fetch}MessageConversionsPerSec,topic=([.\w]+)은 일정 기간 동안 변환된 메시지 수에 대한 메트릭을 제공합니다.
25.7.3. Zoo Cryostat 기반 Kafka 클러스터 및 클라이언트 애플리케이션 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
지원되는 최신 Kafka 버전 및 브랜드 간 프로토콜 버전으로 Apache Kafka 클러스터의 Zoo Cryostat 기반 Streams를 업그레이드합니다.
또한 클라이언트 업그레이드 전략을 선택해야 합니다. Kafka 클라이언트는 이 절차의 6단계에서 업그레이드됩니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
-
Apache Kafka 클러스터의 Streams를 업그레이드하기 전에 Kafka 리소스의 속성에 새
Kafka버전에서 지원되지 않는 구성 옵션이 포함되어 있지 않은지 확인합니다.
프로세스
Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka <kafka_configuration_file>구성된 경우
inter.broker.protocol.version및log.message.format.version속성이 현재 버전으로 설정되어 있는지 확인합니다.예를 들어 Kafka 버전 3.6.0에서 3.7.0으로 업그레이드하는 경우 현재 버전은 3.6입니다.
kind: Kafka spec: # ... kafka: version: 3.6.0 config: log.message.format.version: "3.6" inter.broker.protocol.version: "3.6" # ...log.message.format.version및inter.broker.protocol.version이 구성되지 않은 경우 Apache Kafka의 Streams는 다음 단계에서 Kafka 버전으로 업데이트한 후 이러한 버전을 현재 기본값으로 자동으로 업데이트합니다.참고log.message.format.version및inter.broker.protocol.version의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.Kafka.spec.kafka.version을 변경하여 새 Kafka 버전을 지정하고, 현재 Kafka 버전의 기본값으로log.message.format.version및inter.broker.protocol.version을 남겨 둡니다.참고kafka.version을 변경하면 클러스터의 모든 브로커가 새 브로커 바이너리를 사용하도록 업그레이드됩니다. 이 프로세스 중에 일부 브로커는 이전 바이너리를 사용하고 있지만 다른 브로커는 이미 새 바이너리로 업그레이드했습니다. 현재 설정에서inter.broker.protocol.version을 변경하지 않으면 브로커가 업그레이드 중에 계속 서로 통신할 수 있습니다.예를 들어 Kafka 3.6.0에서 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.01 config: log.message.format.version: "3.6"2 inter.broker.protocol.version: "3.6"3 # ...주의새 Kafka 버전의
inter.broker.protocol.version이 변경되면 Kafka를 다운그레이드할 수 없습니다. inter-broker 프로토콜 버전은__consumer_offsets에 기록된 메시지를 포함하여 브로커가 저장한 영구 메타데이터에 사용되는 스키마를 결정합니다. 다운그레이드된 클러스터는 메시지를 이해할 수 없습니다.Kafka 클러스터의 이미지가 Kafka 사용자 정의 리소스의
Kafka.spec.kafka.에 정의된 경우 새imageKafka버전이 있는 컨테이너 이미지를 가리키도록 이미지를 업데이트합니다.Kafka 버전 및 이미지 매핑을 참조하십시오.
편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
Pod 상태 전환을 확인하여 롤링 업데이트의 진행 상황을 확인합니다.
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'롤링 업데이트를 통해 각 pod가 새 Kafka 버전에 브로커 바이너리를 사용하고 있는지 확인합니다.
클라이언트를 업그레이드하기 위한 선택한 전략에 따라 모든 클라이언트 애플리케이션을 업그레이드하여 새 버전의 클라이언트 바이너리를 사용합니다.
필요한 경우 Kafka Connect 및 MirrorMaker의
버전속성을 Kafka의 새 버전으로 설정합니다.-
Kafka Connect의 경우
KafkaConnect.spec.version을 업데이트합니다. -
MirrorMaker의 경우
KafkaMirrorMaker.spec.version을 업데이트합니다. MirrorMaker 2의 경우
KafkaMirrorMaker2.spec.version을 업데이트합니다.참고수동으로 빌드된 사용자 지정 이미지를 사용하는 경우 해당 이미지를 다시 빌드하여 Apache Kafka 기본 이미지의 최신 스트림으로 최신 이미지인지 확인해야 합니다. 예를 들어 기본 Kafka Connect 이미지에서 컨테이너 이미지를 생성한 경우 최신 기본 이미지 및 빌드 구성을 가리키도록 Dockerfile을 업데이트합니다.
-
Kafka Connect의 경우
- 업그레이드된 클라이언트 애플리케이션이 새 Kafka 브로커에서 올바르게 작동하는지 확인합니다.
구성된 경우 새
inter.broker.protocol.version버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 9단계로 이동합니다.예를 들어 Kafka 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.6" inter.broker.protocol.version: "3.7" # ...- Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
구성된 경우 새
log.message.format.version버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 10 단계로 이동합니다.예를 들어 Kafka 3.7.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.7" inter.broker.protocol.version: "3.7" # ...중요Kafka 3.0.0에서
inter.broker.protocol.version이3.0이상으로 설정되면log.message.format.version옵션이 무시되고 설정할 필요가 없습니다.Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
25.8. 업그레이드 상태 확인 링크 복사링크가 클립보드에 복사되었습니다!
업그레이드(또는 다운그레이드)를 수행할 때 Kafka 사용자 정의 리소스의 상태에서 성공적으로 완료되었는지 확인할 수 있습니다. 상태는 사용 중인 Apache Kafka 및 Kafka 버전의 Streams에 대한 정보를 제공합니다.
업그레이드를 완료한 후 올바른 버전이 있는지 확인하려면 Kafka 상태에서 kafkaVersion 및 operatorLastSuccessfulVersion 값을 확인합니다.
-
operatorLastSuccessfulVersion은 마지막으로 조정에 성공한 Apache Kafka Operator의 Streams 버전입니다. -
kafkaVersion은 Kafka 클러스터에서 사용하는 Kafka 버전입니다. -
kafkaMetadataVersion은 KRaft 기반 Kafka 클러스터에서 사용하는 메타데이터 버전입니다.
이 값을 사용하여 Apache Kafka 또는 Kafka에 대한 Streams 업그레이드가 완료되었는지 확인할 수 있습니다.
Kafka 상태에서 업그레이드 확인
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
spec:
# ...
status:
# ...
kafkaVersion: 3.7.0
operatorLastSuccessfulVersion: 2.7
kafkaMetadataVersion: 3.7
25.9. Apache Kafka의 Streams를 업그레이드할 때 FIPS 모드로 전환 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림이 FIPS 지원 OpenShift 클러스터에서 FIPS 모드에서 실행되도록 업그레이드합니다. Apache Kafka 2.3의 스트림까지 FIPS 지원 OpenShift 클러스터에서 실행되는 것은 FIPS_MODE 환경 변수를 사용하여 FIPS 모드를 비활성화한 경우에만 사용할 수 있었습니다. 릴리스 2.3에서 Apache Kafka용 Streams는 FIPS 모드를 지원합니다. FIPS_MODE 를 disabled 로 설정하여 FIPS 지원 OpenShift 클러스터에서 Apache Kafka에 대한 Streams를 실행하면 다음 절차에 따라 활성화할 수 있습니다.
사전 요구 사항
- FIPS 지원 OpenShift 클러스터
-
FIPS_MODE환경 변수가disabled로 설정된 기존 Cluster Operator 배포
프로세스
-
Cluster Operator를 버전 2.3 이상으로 업그레이드하지만
FIPS_MODE환경 변수를disabled로 설정합니다. 2.3 이전의 Apache Kafka 버전의 Streams를 처음 배포한 경우 FIPS가 활성화된 상태에서 지원되지 않는 PKCS #12 저장소에서 이전 암호화 및 다이제스트 알고리즘을 사용할 수 있습니다. 업데이트된 알고리즘으로 인증서를 다시 생성하려면 클러스터 및 클라이언트 CA 인증서를 갱신합니다.
-
Cluster Operator가 생성한 CA를 갱신하려면 CA 보안에
force-renew주석을 추가하여 갱신을 트리거합니다. -
자체 CA를 갱신하려면 새 인증서를 CA 보안에 추가하고
ca-cert-generation주석을 더 높은 증분 값으로 업데이트하여 업데이트를 캡처합니다.
-
Cluster Operator가 생성한 CA를 갱신하려면 CA 보안에
SCRAM-SHA-512 인증을 사용하는 경우 사용자의 암호 길이를 확인합니다. 32자 미만의 경우 다음 방법 중 하나로 새 암호를 생성합니다.
- User Operator가 충분한 길이의 새 암호를 사용하여 새 암호를 생성하도록 사용자 시크릿을 삭제합니다.
-
KafkaUser사용자 정의 리소스의.spec.authentication.password속성을 사용하여 암호를 제공한 경우 동일한 암호 구성에서 참조되는 OpenShift 시크릿의 암호를 업데이트합니다. 새 암호를 사용하도록 클라이언트를 업데이트하는 것을 잊어서는 안 됩니다.
- CA 인증서가 올바른 알고리즘을 사용하고 SCRAM-SHA-512 암호가 충분한 길이인지 확인합니다. 그런 다음 FIPS 모드를 활성화할 수 있습니다.
-
Cluster Operator 배포에서
FIPS_MODE환경 변수를 제거합니다. 그러면 Cluster Operator가 재시작되고 모든 피연산자를 롤백하여 FIPS 모드를 활성화합니다. 재시작이 완료되면 이제 모든 Kafka 클러스터가 FIPS 모드가 활성화된 상태에서 실행됩니다.
26장. Apache Kafka용 다운그레이드 스트림 링크 복사링크가 클립보드에 복사되었습니다!
업그레이드한 Apache Kafka의 Streams 버전에 문제가 있는 경우 설치를 이전 버전으로 되돌릴 수 있습니다.
YAML 설치 파일을 사용하여 Apache Kafka용 Streams를 설치한 경우 이전 릴리스의 YAML 설치 파일을 사용하여 다운그레이드 절차를 수행할 수 있습니다. Cluster Operator 및 사용 중인 Kafka 버전을 업데이트하여 Apache Kafka용 Streams를 다운그레이드할 수 있습니다. Kafka 버전 다운그레이드는 Cluster Operator에서 수행합니다.
다음 다운그레이드 지침은 설치 파일을 사용하여 Apache Kafka용 Streams를 설치한 경우에만 적합합니다. OperatorHub와 같은 다른 방법을 사용하여 Apache Kafka용 Streams를 설치한 경우 문서에 지정하지 않는 한 해당 메서드에서 다운그레이드가 지원되지 않을 수 있습니다. 성공적인 다운그레이드 프로세스를 위해서는 지원되는 접근 방식을 사용해야 합니다.
26.1. Cluster Operator를 이전 버전으로 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams에 문제가 있는 경우 설치를 되돌릴 수 있습니다.
다음 절차에서는 Cluster Operator 배포를 이전 버전으로 다운그레이드하는 방법을 설명합니다.
사전 요구 사항
- 기존 Cluster Operator 배포를 사용할 수 있습니다.
- 이전 버전의 설치 파일을 다운로드 했습니다.
사전 준비 사항
Apache Kafka 기능 게이트용 Streams 의 다운그레이드 요구 사항을 확인합니다. 기능 게이트가 영구적으로 활성화된 경우 대상 버전으로 다운그레이드하기 전에 비활성화할 수 있는 버전으로 다운그레이드해야 할 수 있습니다.
프로세스
-
기존 Cluster Operator 리소스(
/install/cluster-operator디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. 이전 버전의 Cluster Operator에서 변경 사항을 덮어씁니다. - 사용자 정의 리소스를 되돌리면 다운그레이드하려는 Apache Kafka의 Streams에 사용할 수 있는 지원되는 구성 옵션을 반영합니다.
Cluster Operator를 업데이트합니다.
Cluster Operator가 실행 중인 네임스페이스에 따라 이전 버전의 설치 파일을 수정합니다.
Linux에서 다음을 사용하십시오.
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yamlMacOS에서 다음을 사용하십시오.
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml-
기존 Cluster Operator 배포에서 하나 이상의 환경 변수를 수정한 경우
install/cluster-operator/060-파일을 편집하여 해당 환경 변수를 사용합니다.Deployment-strimzi-cluster-operator.yaml
업데이트된 구성이 있는 경우 나머지 설치 리소스와 함께 배포합니다.
oc replace -f install/cluster-operator롤링 업데이트가 완료될 때까지 기다립니다.
Kafka Pod의 이미지를 가져와서 다운그레이드에 성공했는지 확인합니다.
oc get pod my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'image 태그는 Apache Kafka 버전의 새 Streams 및 Kafka 버전을 표시합니다. 예를 들어 <
strimzi_version>-kafka-<kafka_version>.또한
Kafka리소스 상태에서 다운그레이드가 성공적으로 완료되었는지 확인할 수 있습니다.
26.2. KRaft 기반 Kafka 클러스터 및 클라이언트 애플리케이션 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 클러스터의 KRaft 기반 Streams를 이전 버전으로 다운그레이드합니다. Apache Kafka 클러스터의 KRaft 기반 Streams를 3.7.0에서 3.6.0으로 이동하는 등 더 낮은 버전으로 다운그레이드하는 경우 Kafka 클러스터에서 사용하는 메타데이터 버전이 다운그레이드하려는 Kafka 버전에서 지원하는 버전인지 확인합니다. 다운그레이드하려는 Kafka 버전의 메타데이터 버전은 다운그레이드된 버전보다 크지 않아야 합니다.
KRaft 기반 다운그레이드와 관련된 지원 및 제한 사항에 대한 정보는 Apache Kafka 설명서를 참조하십시오.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
Apache
Kafka클러스터의 Streams를 다운그레이드하기 전에 Kafka 리소스에 대해 다음을 확인합니다.-
Kafka사용자 정의 리소스에는 다운그레이드된 Kafka 버전에서 지원하지 않는 옵션이 포함되어 있지 않습니다. -
spec.kafka.metadataVersion은 다운그레이드된 Kafka 버전에서 지원하는 버전으로 설정됩니다.
-
프로세스
Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka <kafka_configuration_file>metadataVersion버전을 다운그레이드하려는 Kafka 버전에서 지원하는 버전으로 변경합니다. 현재 Kafka 버전에서 변경하지 않고Kafka.spec.kafka.version을 그대로 둡니다.예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV21 version: 3.7.02 # ...참고metadataVersion의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.-
변경 사항을 저장하고 Cluster Operator가
Kafka리소스의.status.kafkaMetadataVersion을 업데이트할 때까지 기다립니다. Kafka.spec.kafka.version을 이전 버전으로 변경합니다.예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV21 version: 3.6.02 # ...Kafka 버전의 이미지가 Cluster Operator의
STRIMZI_KAFKA_IMAGES에 정의된 이미지와 다른 경우Kafka.spec.kafka.image를 업데이트합니다.25.2.3절. “Kafka 버전 및 이미지 매핑”을 참조하십시오.
Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
이전 버전의 클라이언트 바이너리를 사용하도록 모든 클라이언트 애플리케이션(consumers)을 다운그레이드합니다.
Kafka 클러스터 및 클라이언트는 이제 이전 Kafka 버전을 사용하고 있습니다.
26.3. Zoo Cryostat를 사용할 때 Kafka 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Zoo Cryostat 모드에서 Kafka를 사용하는 경우 다운그레이드 프로세스에서 Kafka 버전 및 관련 log.message.format.version 및 inter.broker.protocol.version 속성을 변경해야 합니다.
26.3.1. 다운그레이드에 대한 Kafka 버전 호환성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 다운그레이드는 호환되는 현재 및 대상 Kafka 버전 및 메시지가 기록된 상태에 따라 달라집니다.
해당 버전에서 해당 클러스터에서 사용된 inter.broker.protocol.version 설정을 지원하지 않거나 최신 log.message.format.version 을 사용하는 메시지 로그에 메시지가 추가된 경우 이전 Kafka 버전으로 되돌릴 수 없습니다.
inter.broker.protocol.version 은 __consumer_offsets 에 기록된 메시지의 스키마와 같이 브로커가 저장한 영구 메타데이터에 사용되는 스키마를 결정합니다. 클러스터에서 이전에 사용된 inter.broker.protocol.version 을 이해하지 못하는 Kafka 버전으로 다운그레이드하는 경우 브로커는 이해할 수 없는 데이터를 접하게 됩니다.
Kafka의 대상 다운그레이드 버전에 해당하는 경우:
-
현재 버전과 동일한
log.message.format.version, Cluster Operator는 브로커를 단일 롤링 재시작하여 다운그레이드합니다. 다른
log.message.format.version.downgrading은 실행 중인 클러스터에 항상log.message.format.version이 downgraded 버전에서 사용하는 버전으로 설정된 경우에만 가능합니다. 일반적으로log.message.format.version을 변경하기 전에 업그레이드 절차가 중단된 경우에만 해당합니다. 이 경우 다운그레이드에는 다음이 필요합니다.- 두 버전의 interbroker 프로토콜이 다른 경우 브로커의 두 롤링 재시작
- 동일한 경우 단일 롤링 재시작
새 버전이 log.message.format.version 의 기본값을 사용하는 경우를 포함하여 이전 버전에서 지원하지 않는 log.message.format.version 을 사용한 경우 다운그레이드를 수행할 수 없습니다. 예를 들어 log.message.format.version 이 변경되지 않았기 때문에 Kafka 버전 3.6.0으로 이 리소스를 다운그레이드할 수 있습니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
# ...
kafka:
version: 3.7.0
config:
log.message.format.version: "3.6"
# ...
log.message.format.version 이 "3.7" 로 설정되었거나 값이 없는 경우 다운그레이드를 수행할 수 없으므로 매개 변수가 3.7의 3.7.0 브로커에 기본값을 사용합니다.
Kafka 3.0.0에서 inter.broker.protocol.version 이 3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다.
26.3.2. Zoo Cryostat 기반 Kafka 클러스터 및 클라이언트 애플리케이션 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 클러스터의 Zoo Cryostat 기반 스트림을 이전 버전으로 다운그레이드합니다. Apache Kafka 클러스터용 Zoo Cryostat 기반 Streams를 3.7.0에서 3.6.0으로 이동하는 것과 같은 더 낮은 버전으로 다운그레이드하는 경우 Kafka 클러스터에서 사용하는 비브로커 프로토콜 버전이 다운그레이드하려는 Kafka 버전에서 지원하는 버전인지 확인합니다. 다운그레이드하려는 Kafka 버전에 대한 inter-broker 프로토콜 버전은 다운그레이드 중인 버전보다 높지 않아야 합니다.
Zoo Cryostat 기반 다운그레이드와 관련된 지원 및 제한 사항에 대한 정보는 Apache Kafka 설명서를 참조하십시오.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
Apache
Kafka클러스터의 Streams를 다운그레이드하기 전에 Kafka 리소스에 대해 다음을 확인합니다.- 중요: Kafka 버전의 호환성.
-
Kafka사용자 정의 리소스에는 다운그레이드된 Kafka 버전에서 지원하지 않는 옵션이 포함되어 있지 않습니다. Kafka.spec.kafka.config에는 로 다운그레이드되는 Kafka 버전에서 지원하는log.message.format.version및inter.broker.protocol.version이 있습니다.Kafka 3.0.0에서
inter.broker.protocol.version이3.0이상으로 설정되면log.message.format.version옵션이 무시되고 설정할 필요가 없습니다.
프로세스
Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka <kafka_configuration_file>inter.broker.protocol.version버전(및log.message.format.version)을 다운그레이드하려는 Kafka 버전에서 지원하는 버전으로 변경합니다.Kafka.spec.kafka.version은 현재 Kafka 버전에서 변경되지 않은 상태로 둡니다.예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafka: version: 3.7.01 config: inter.broker.protocol.version: "3.6"2 log.message.format.version: "3.6" # ...참고log.message.format.version및inter.broker.protocol.version의 값은 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
Pod 상태 전환을 확인하여 롤링 업데이트의 진행 상황을 확인합니다.
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'롤링 업데이트를 통해 각 pod가 지정된 Kafka 간 프로토콜 버전을 사용하고 있습니다.
Kafka.spec.kafka.version을 이전 버전으로 변경합니다.예를 들어 Kafka 3.7.0에서 3.6.0으로 다운그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafka: version: 3.6.01 config: inter.broker.protocol.version: "3.6"2 log.message.format.version: "3.6" # ...Kafka 버전의 이미지가 Cluster Operator의
STRIMZI_KAFKA_IMAGES에 정의된 이미지와 다른 경우Kafka.spec.kafka.image를 업데이트합니다.25.2.3절. “Kafka 버전 및 이미지 매핑”을 참조하십시오.
Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
이전 버전의 클라이언트 바이너리를 사용하도록 모든 클라이언트 애플리케이션(consumers)을 다운그레이드합니다.
Kafka 클러스터 및 클라이언트는 이제 이전 Kafka 버전을 사용하고 있습니다.
주제 메타데이터 스토리지에 Zoo Cryostat를 사용하는 1.7 이전의 Apache Kafka용 Streams 버전으로 되돌리는 경우 Kafka 클러스터에서 내부 주제 저장소 주제를 삭제합니다.
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
27장. Apache Kafka의 스트림 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔 또는 CLI를 사용하여 OperatorHub에서 OpenShift 4.12에서 4.15로 Apache Kafka의 Streams를 설치 제거할 수 있습니다.
Apache Kafka용 Streams를 설치하는 데 사용한 것과 동일한 접근 방식을 사용합니다.
Apache Kafka용 Streams를 설치 제거할 때 배포를 위해 특별히 생성된 리소스를 식별하고 Apache Kafka 리소스에서 참조하는 리소스를 식별해야 합니다.
이러한 리소스는 다음과 같습니다.
- 보안(사용자 정의 CA 및 인증서, Kafka Connect 시크릿 및 기타 Kafka 시크릿)
-
로깅
ConfigMaps(유형외부)
이러한 리소스는 Kafka , ,Kafka ConnectKafkaMirrorMaker 또는 KafkaBridge 구성에서 참조하는 리소스입니다.
CRD 및 관련 사용자 정의 리소스 삭제
CustomResourceDefinition 이 삭제되면 해당 유형의 사용자 정의 리소스도 삭제됩니다. 여기에는 Apache Kafka 용 Streams에서 관리하는 Kafka , ,Kafka ConnectKafkaMirrorMaker 및 Kafka Kafka의 Pod를 관리하는 데 사용하는 StrimziPodSet 리소스 스트림이 포함됩니다. 또한 Deployment,Pod,Service, ConfigMap 리소스와 같이 이러한 사용자 정의 리소스에서 생성한 모든 OpenShift 리소스도 제거됩니다. 의도하지 않은 데이터 손실을 방지하기 위해 이러한 리소스를 삭제할 때는 항상 주의하십시오.
27.1. 웹 콘솔을 사용하여 OperatorHub에서 Apache Kafka의 스트림 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OperatorHub에서 Apache Kafka의 Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.
콘솔에서 단계를 수행하거나 대체 CLI 명령을 사용할 수 있습니다.
사전 요구 사항
-
cluster-admin또는strimzi-admin권한이 있는 계정을 사용하여 OpenShift Container Platform 웹 콘솔에 액세스합니다. 삭제할 리소스를 확인했습니다.
다음
ocCLI 명령을 사용하여 리소스를 찾고 Apache Kafka의 스트림을 제거할 때 해당 리소스가 제거되었는지 확인할 수 있습니다.Apache Kafka 배포를 위한 스트림과 관련된 리소스를 찾는 명령
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>& lt;resource_type >을
시크릿또는configmap과 같이 검사 중인 리소스 유형으로 바꿉니다.
프로세스
- OpenShift 웹 콘솔에서 Operator > 설치된 Operator로 이동합니다.
설치된 Apache Kafka Operator 의 경우 옵션 아이콘(세 개의 수직 점)을 선택하고 Operator 설치 제거를 클릭합니다.
Operator는 설치된 Operator에서 제거됩니다.
- Home > Projects 로 이동하여 Apache Kafka용 Streams 및 Kafka 구성 요소를 설치한 프로젝트를 선택합니다.
Inventory 아래의 옵션을 클릭하여 관련 리소스를 삭제합니다.
리소스에는 다음이 포함됩니다.
- 배포
- StatefulSets
- Pods
- 서비스
- ConfigMaps
- 보안
작은 정보검색을 사용하여 Kafka 클러스터 이름으로 시작하는 관련 리소스를 찾습니다. 워크로드에서 리소스를 찾을 수도 있습니다.
대체 CLI 명령
CLI 명령을 사용하여 OperatorHub에서 Apache Kafka의 스트림을 제거할 수 있습니다.
Apache Kafka 서브스크립션의 Streams를 삭제합니다.
oc delete subscription amq-streams -n openshift-operatorsCSV(클러스터 서비스 버전)를 삭제합니다.
oc delete csv amqstreams.<version> -n openshift-operators관련 CRD를 제거합니다.
oc get crd -l app=strimzi -o name | xargs oc delete
27.2. CLI를 사용하여 Apache Kafka의 스트림 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 oc 명령줄 툴을 사용하여 Apache Kafka의 Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.
사전 요구 사항
-
cluster-admin또는strimzi-admin권한이 있는 계정을 사용하여 OpenShift 클러스터에 액세스합니다. 삭제할 리소스를 확인했습니다.
다음
ocCLI 명령을 사용하여 리소스를 찾고 Apache Kafka의 스트림을 제거할 때 해당 리소스가 제거되었는지 확인할 수 있습니다.Apache Kafka 배포를 위한 스트림과 관련된 리소스를 찾는 명령
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>& lt;resource_type >을
시크릿또는configmap과 같이 검사 중인 리소스 유형으로 바꿉니다.
프로세스
Cluster Operator
Deployment, 관련CustomResourceDefinitions및RBAC리소스를 삭제합니다.Cluster Operator를 배포하는 데 사용되는 설치 파일을 지정합니다.
oc delete -f install/cluster-operator사전 요구 사항에서 확인한 리소스를 삭제합니다.
oc delete <resource_type> <resource_name> -n <namespace>& lt;resource_type >을 삭제 중인 리소스 유형으로 바꾸고 < resource_name >을 리소스 이름으로 바꿉니다.
시크릿 삭제 예
oc delete secret my-cluster-clients-ca-cert -n my-project
28장. Kafka 재시작에 대한 정보 검색 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator가 OpenShift 클러스터에서 Kafka Pod를 다시 시작한 후 Pod가 다시 시작된 이유를 설명하는 Pod의 네임스페이스에 OpenShift 이벤트를 내보냅니다. 클러스터 동작을 이해하는 데 도움이 필요하면 명령줄에서 재시작 이벤트를 확인할 수 있습니다.
Prometheus와 같은 메트릭 컬렉션 툴을 사용하여 재시작 이벤트를 내보내고 모니터링할 수 있습니다. 적절한 형식으로 출력을 내보낼 수 있는 이벤트 내보내기기와 함께 메트릭 툴을 사용합니다.
28.1. 재시작 이벤트 이유 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 특정 이유로 재시작 이벤트를 시작합니다. 재시작 이벤트에 대한 정보를 가져와서 이유를 확인할 수 있습니다.
| 이벤트 | 설명 |
|---|---|
| CaCertHasOldGeneration | Pod는 이전 CA로 서명된 서버 인증서를 계속 사용하므로 인증서 업데이트의 일부로 다시 시작해야 합니다. |
| CaCertRemoved | 만료된 CA 인증서가 제거되었으며 Pod가 현재 인증서로 실행되도록 다시 시작됩니다. |
| CaCertRenewed | CA 인증서가 갱신되었으며 Pod가 업데이트된 인증서로 실행되도록 다시 시작됩니다. |
| ClientCaCertKeyReplaced | 클라이언트 CA 인증서에 서명하는 데 사용되는 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 다시 시작됩니다. |
| ClusterCaCertKeyReplaced | 클러스터의 CA 인증서에 서명하는 데 사용되는 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 다시 시작됩니다. |
| ConfigChangeRequiresRestart | 일부 Kafka 구성 속성은 동적으로 변경되지만 다른 경우 브로커를 다시 시작해야 합니다. |
| FileSystemResizeNeeded | 파일 시스템 크기가 증가했으며 이를 적용하려면 다시 시작해야 합니다. |
| KafkaCertificatesChanged | Kafka 브로커에서 사용하는 하나 이상의 TLS 인증서가 업데이트되었으며 이를 사용하려면 다시 시작해야 합니다. |
| ManualRollingUpdate |
사용자가 Pod를 주석 처리하거나 |
| PodForceRestartOnError | 수정을 위해 Pod를 다시 시작해야 하는 오류가 발생했습니다. |
| PodHasOldRevision |
Kafka 볼륨에서 디스크가 추가되거나 제거되었으며 변경 사항을 적용하려면 다시 시작해야 합니다. |
| PodHasOldRevision |
Pod의 멤버인 |
| PodStuck | Pod는 여전히 보류 중이고 예약되지 않았거나 예약할 수 없으므로 Operator에서 Pod를 마지막으로 실행하여 Pod를 다시 시작했습니다. |
| PodUnresponsive | Apache Kafka의 스트림을 Pod에 연결할 수 없어 브로커가 올바르게 시작되지 않음을 나타낼 수 있으므로 Operator에서 문제를 해결하기 위해 다시 시작했습니다. |
28.2. 이벤트 필터 재시작 링크 복사링크가 클립보드에 복사되었습니다!
명령줄에서 재시작 이벤트를 확인할 때 OpenShift 이벤트 필드에 필터링할 필드 선택기 를 지정할 수 있습니다.
다음 필드는 필드 선택기 로 이벤트를 필터링할 때 사용할 수 있습니다.
regardingObject.kind-
재시작된 오브젝트와 재시작 이벤트의 경우 kind는 항상
Pod입니다. regarding.namespace- Pod가 속한 네임스페이스입니다.
regardingObject.name-
Pod의 이름(예:
strimzi-cluster-kafka-0) regardingObject.uid- Pod의 고유 ID입니다.
reason-
Pod를 재시작한 이유(예:
JbodVolumesChanged) reportingController-
보고 구성 요소는 항상 Apache Kafka 재시작 이벤트용 Streams용
strimzi.io/cluster-operator입니다. 소스-
source는reportingController의 이전 버전입니다. 보고 구성 요소는 항상 Apache Kafka 재시작 이벤트용 Streams용strimzi.io/cluster-operator입니다. type-
Warning또는Normal인 이벤트 유형입니다. Apache Kafka 재시작 이벤트용 Streams의 경우 유형은Normal입니다.
이전 버전의 OpenShift에서 regarding 접두사를 사용하는 필드는 대신 involvedObject 접두사를 사용할 수 있습니다. reportingController 는 이전에 reportingComponent 를 호출했습니다.
28.3. Kafka 재시작 확인 링크 복사링크가 클립보드에 복사되었습니다!
oc 명령을 사용하여 Cluster Operator가 시작한 재시작 이벤트를 나열합니다. Cluster Operator를 reportingController 또는 소스 이벤트 필드를 사용하여 보고 구성 요소로 설정하여 Cluster Operator에서 내보낸 재시작 이벤트를 필터링합니다.
사전 요구 사항
- Cluster Operator가 OpenShift 클러스터에서 실행되고 있습니다.
프로세스
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=PodForceRestartOnErrorYAML과 같은 출력 형식을 사용하여 하나 이상의 이벤트에 대한 자세한 정보를 반환합니다.
oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator,reason=PodForceRestartOnError -o yaml자세한 이벤트 출력 표시 예
apiVersion: v1 items: - action: StrimziInitiatedPodRestart apiVersion: v1 eventTime: "2022-05-13T00:22:34.168086Z" firstTimestamp: null involvedObject: kind: Pod name: strimzi-cluster-kafka-1 namespace: kafka kind: Event lastTimestamp: null message: Pod needs to be forcibly restarted due to an error metadata: creationTimestamp: "2022-05-13T00:22:34Z" generateName: strimzi-event name: strimzi-eventwppk6 namespace: kafka resourceVersion: "432961" uid: 29fcdb9e-f2cf-4c95-a165-a5efcd48edfc reason: PodForceRestartOnError reportingController: strimzi.io/cluster-operator reportingInstance: strimzi-cluster-operator-6458cfb4c6-6bpdp source: {} type: Normal kind: List metadata: resourceVersion: "" selfLink: ""
다음 필드는 더 이상 사용되지 않으므로 이러한 이벤트에 대해 채워지지 않습니다.
-
firstTimestamp -
lastTimestamp -
소스
29장. Apache Kafka용 스트림 관리 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka용 Streams를 관리하려면 Kafka 클러스터 및 관련 리소스가 원활하게 실행되도록 다양한 작업을 수행해야 합니다. oc 명령을 사용하여 리소스의 상태를 확인하고, 롤링 업데이트에 대한 유지 관리 창을 구성하고, Apache Kafka Drain cleaner 및 Kafka Static Quota 플러그인과 같은 툴을 활용하여 배포를 효과적으로 관리합니다.
29.1. 롤링 업데이트를 위한 유지 관리 기간 링크 복사링크가 클립보드에 복사되었습니다!
유지 관리 시간 창을 사용하면 Kafka 및 Zoo Cryostat 클러스터의 특정 롤링 업데이트를 편리한 시간에 시작할 수 있습니다.
29.1.1. 유지 관리 시간 창 개요 링크 복사링크가 클립보드에 복사되었습니다!
대부분의 경우 Cluster Operator는 해당 Kafka 리소스에 대한 변경 사항에 따라 Kafka 또는 Zoo Cryostat 클러스터만 업데이트합니다. 이를 통해 Kafka 리소스에 변경 사항을 적용할 시기를 계획하여 Kafka 클라이언트 애플리케이션에 미치는 영향을 최소화할 수 있습니다.
그러나 Kafka 및 Zoo Cryostat 클러스터에 대한 일부 업데이트는 Kafka 리소스를 변경하지 않고 발생할 수 있습니다. 예를 들어 관리하는 CA(인증 기관) 인증서가 만료되기 가까운 경우 Cluster Operator는 롤링 재시작을 수행해야 합니다.
Pod를 롤링 재시작하면 서비스 가용성에 영향을 미치지 않지만(올바른 브로커 및 주제 구성 가정) Kafka 클라이언트 애플리케이션의 성능 에 영향을 미칠 수 있습니다. 유지 관리 시간 창을 사용하면 Kafka 및 Zoo Cryostat 클러스터의 자동 롤링 업데이트를 편리한 시간에 시작할 수 있습니다. 유지 관리 시간 창이 클러스터에 대해 구성되지 않은 경우 예측 가능한 로드 기간 동안과 같이 이러한 무관한 롤링 업데이트가 불편한 시간에 발생할 수 있습니다.
29.1.2. 유지 관리 시간 창 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kafka.spec.maintenanceTimeWindows 속성에 문자열 배열을 입력하여 유지 관리 시간 창을 구성합니다. 각 문자열은 UTC (Coordinated Universal Time)로 해석되는 cron 표현식 입니다. 실용적인 목적으로는 Greenwich Mean Time과 동일합니다.
다음 예제에서는 자정에 시작하여 오전 01:59am (UTC), 일요일, 월요일, 화요일, 수요일 및 목요일에 종료되는 단일 유지 관리 시간 창을 구성합니다.
# ...
maintenanceTimeWindows:
- "* * 0-1 ? * SUN,MON,TUE,WED,THU *"
# ...
실제로 유지 관리 창은 Kafka 리소스의 Kafka.spec.clusterCa.renewalDays 및 Kafka.spec.clientsCa.renewalDays 속성과 함께 설정하여 필요한 CA 인증서 갱신을 구성된 유지 관리 시간 창에서 완료할 수 있도록 해야 합니다.
Apache Kafka의 스트림은 지정된 창에 따라 정확히 유지 관리 작업을 예약하지 않습니다. 대신 각 조정에 대해 유지 관리 기간이 현재 "오픈"인지 확인합니다. 즉, 지정된 시간 내에 유지 관리 작업 시작이 Cluster Operator 조정 간격까지 지연될 수 있습니다. 따라서 유지 관리 시간은 이 기간 이상이어야 합니다.
29.1.3. 유지 관리 시간 창 구성 링크 복사링크가 클립보드에 복사되었습니다!
지원되는 프로세스에서 트리거한 롤링 업데이트에 대한 유지 관리 시간 창을 구성할 수 있습니다.
사전 요구 사항
- OpenShift 클러스터입니다.
- Cluster Operator가 실행 중입니다.
프로세스
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 * * ?"리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>
29.2. 주석을 사용하여 Kafka 및 기타 피연산자의 롤링 업데이트 시작 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 Cluster Operator를 통해 Kafka 및 기타 피연산자의 롤링 업데이트를 수동으로 트리거하는 주석 사용을 지원합니다. 주석을 사용하여 Kafka, Kafka Connect, MirrorMaker 2 및 Zoo Cryostat 클러스터의 롤링 업데이트를 시작합니다.
일반적으로 특정 Pod 또는 Pod 세트에서 롤링 업데이트를 수동으로 수행하는 것은 예외적인 경우에만 필요합니다. 그러나 Pod를 직접 삭제하지 않고 Cluster Operator를 통해 롤링 업데이트를 수행하면 다음을 확인합니다.
- Pod의 수동 삭제는 동시에 다른 Pod 삭제와 같은 동시 Cluster Operator 작업과 충돌하지 않습니다.
- Cluster Operator 논리는 동기화 중인 복제본 수와 같은 Kafka 구성 사양을 처리합니다.
29.2.1. Pod 관리 주석을 사용하여 롤링 업데이트 수행 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Kafka, Kafka Connect, MirrorMaker 2, 또는 Zoo Cryostat 클러스터의 롤링 업데이트를 트리거하는 방법을 설명합니다. 업데이트를 트리거하려면 클러스터에서 실행 중인 Pod를 관리하는 StrimziPodSet 에 주석을 추가합니다.
사전 요구 사항
수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator가 필요합니다. Kafka, Kafka Connect, MirrorMaker 2 또는 Zoo Cryostat와 관계없이 업데이트할 구성 요소의 클러스터도 실행 중이어야 합니다.
프로세스
수동으로 업데이트할 Pod를 제어하는 리소스의 이름을 찾습니다.
예를 들어 Kafka 클러스터 이름이 my-cluster 인 경우 해당 이름은 my-cluster-kafka 및 my-cluster-zookeeper 입니다. my-connect-cluster 라는 Kafka Connect 클러스터의 경우 해당 이름은 my-connect-cluster-connect 입니다. my-mm2-cluster 라는 MirrorMaker 2 클러스터의 경우 해당 이름은 my-mm2-cluster-mirrormaker2 입니다.
oc annotate를 사용하여 OpenShift에서 적절한 리소스에 주석을 답니다.StrimziPodSet 주석 처리
oc annotate strimzipodset <cluster_name>-kafka strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-zookeeper strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-connect strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-mirrormaker2 strimzi.io/manual-rolling-update="true"- 다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다). 조정 프로세스에서 주석을 감지한 한 주석이 주석으로 감지되면 주석이 주석에 있는 모든 Pod의 롤링 업데이트가 트리거됩니다. 모든 Pod의 롤링 업데이트가 완료되면 리소스에서 주석이 자동으로 제거됩니다.
29.2.2. Pod 주석을 사용하여 롤링 업데이트 수행 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift Pod 주석을 사용하여 기존 Kafka, Kafka Connect, MirrorMaker 2 또는 Zoo Cryostat 클러스터의 롤링 업데이트를 수동으로 트리거하는 방법을 설명합니다. 여러 Pod에 주석이 있으면 동일한 조정 실행 내에서 연속 롤링 업데이트가 수행됩니다.
사전 요구 사항
수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator가 필요합니다. Kafka, Kafka Connect, MirrorMaker 2 또는 Zoo Cryostat와 관계없이 업데이트할 구성 요소의 클러스터도 실행 중이어야 합니다.
사용된 주제 복제 요인에 관계없이 Kafka 클러스터에서 롤링 업데이트를 수행할 수 있습니다. 그러나 Kafka가 업데이트 중에 작동하려면 다음이 필요합니다.
- 업데이트하려는 노드에서 실행되는 고가용성 Kafka 클러스터 배포입니다.
고가용성을 위해 복제된 주제입니다.
주제 구성은 복제 요소보다 최소 3개 이상 및 최소 동기화된 복제본 수를 1개로 지정합니다.
고가용성을 위해 Kafka 주제 복제
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
프로세스
수동으로 업데이트할
Pod이름을 찾습니다.Pod 이름 지정 규칙은 다음과 같습니다.
-
Kafka 클러스터의 <CLUSTER_NAME>-kafka-<index_number> -
<CLUSTER_NAME>-zookeeper-<index_number> -
Kafka Connect
클러스터의 <CLUSTER_NAME>-connect-<index_number> -
<CLUSTER_NAME>-mirrormaker2-<index_number> 2 클러스터의 경우
Pod에 할당된 <
index_number>는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다.-
oc annotate를 사용하여 OpenShift에서Pod리소스에 주석을 답니다.oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-connect-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-mirrormaker2-<index_number> strimzi.io/manual-rolling-update="true"-
다음 조정이 발생할 때까지 기다립니다(기본적으로 2분마다). 조정 프로세스에서 주석이 감지된 한 주석이 주석에 감지되면 주석이 주석의 롤링 업데이트가 트리거됩니다.
Pod의 롤링 업데이트가 완료되면Pod에서 주석이 자동으로 제거됩니다.
29.3. 영구 볼륨에서 클러스터 복구 링크 복사링크가 클립보드에 복사되었습니다!
PV(영구 볼륨)가 여전히 존재하는 경우 Kafka 클러스터를 복구할 수 있습니다.
예를 들어 다음과 같은 작업을 수행할 수 있습니다.
- 네임스페이스가 의도하지 않게 삭제됨
- 전체 OpenShift 클러스터가 손실되었지만 PV는 인프라에 남아 있습니다.
29.3.1. 네임스페이스 삭제에서 복구 링크 복사링크가 클립보드에 복사되었습니다!
영구 볼륨과 네임스페이스 간의 관계로 인해 네임스페이스 삭제로 인한 복구가 가능합니다. PV( PersistentVolume )는 네임스페이스 외부에 있는 스토리지 리소스입니다. PV는 네임스페이스 내에 있는 PVC( PersistentVolumeClaim )를 사용하여 Kafka Pod에 마운트됩니다.
PV의 회수 정책은 네임스페이스를 삭제할 때 클러스터에 작동하는 방법을 지시합니다. 회수 정책이 다음과 같이 설정된 경우
- 삭제 (기본값), 네임스페이스 내에서 PVC가 삭제되면 PV가 삭제됩니다.
- 네임스페이스를 삭제할 때 PV가 삭제되지 않음
의도하지 않게 삭제된 경우 PV에서 복구하려면 persistentVolumeReclaimPolicy 속성을 사용하여 PV 사양의 Delete 에서 Retain 으로 정책을 재설정해야 합니다.
apiVersion: v1
kind: PersistentVolume
# ...
spec:
# ...
persistentVolumeReclaimPolicy: Retain
또는 PV는 관련 스토리지 클래스의 회수 정책을 상속할 수 있습니다. 스토리지 클래스는 동적 볼륨 할당에 사용됩니다.
스토리지 클래스에 대한 reclaimPolicy 속성을 구성하면 스토리지 클래스를 사용하는 PV가 적절한 회수 정책으로 생성됩니다. 스토리지 클래스는 storageClassName 속성을 사용하여 PV에 구성됩니다.
apiVersion: v1
kind: StorageClass
metadata:
name: gp2-retain
parameters:
# ...
# ...
reclaimPolicy: Retain
apiVersion: v1
kind: PersistentVolume
# ...
spec:
# ...
storageClassName: gp2-retain
Retain 을 회수 정책으로 사용하지만 전체 클러스터를 삭제하려면 PV를 수동으로 삭제해야 합니다. 그렇지 않으면 삭제되지 않으며 리소스에 대한 불필요한 문제가 발생할 수 있습니다.
29.3.2. OpenShift 클러스터 손실에서 복구 링크 복사링크가 클립보드에 복사되었습니다!
클러스터가 손실되면 디스크/볼륨의 데이터를 사용하여 인프라 내에 보존된 경우 클러스터를 복구할 수 있습니다. 복구 절차는 PV를 복구하고 수동으로 생성할 수 있다고 가정하면 네임스페이스 삭제와 동일합니다.
29.3.3. 영구 볼륨에서 삭제된 클러스터 복구 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 PV(영구 볼륨)에서 삭제된 클러스터를 복구하는 방법을 설명합니다.
이 경우 Topic Operator는 Kafka에 항목이 존재하지만 KafkaTopic 리소스가 존재하지 않습니다.
클러스터를 다시 생성하는 단계에 도달하면 다음 두 가지 옵션이 있습니다.
모든
KafkaTopic리소스를 복구할 수 있는 경우 옵션 1 을 사용합니다.따라서
KafkaTopic리소스는 Topic Operator에서 해당 주제를 삭제하지 않도록 클러스터를 시작하기 전에 복구해야 합니다.모든
KafkaTopic리소스를 복구할 수 없는 경우 옵션 2 를 사용합니다.이 경우 Topic Operator 없이 클러스터를 배포하고 Topic Operator 주제 저장소 메타데이터를 삭제한 다음 Topic Operator를 사용하여 Kafka 클러스터를 재배포하여 해당 주제에서
KafkaTopic리소스를 다시 생성할 수 있습니다.
Topic Operator가 배포되지 않은 경우 PVC( PersistentVolumeClaim ) 리소스만 복구해야 합니다.
사전 준비 사항
이 절차에서는 데이터 손상을 방지하려면 PV를 올바른 PVC에 마운트해야 합니다. volumeName 은 PVC에 지정되어 있으며 PV의 이름과 일치해야 합니다.
자세한 내용은 영구 스토리지를 참조하십시오.
프로세스에는 수동으로 다시 생성해야 하는 KafkaUser 리소스의 복구가 포함되지 않습니다. 암호 및 인증서를 유지해야 하는 경우 KafkaUser 리소스를 생성하기 전에 시크릿을 다시 생성해야 합니다.
프로세스
클러스터의 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에 대한 링크를 보여줍니다.
원래 네임스페이스를 다시 생성합니다.
oc create namespace myproject원래 PVC 리소스 사양을 다시 생성하여 PVC를 적절한 PV에 연결합니다.
예를 들면 다음과 같습니다.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-0-my-cluster-kafka-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: gp2-retain volumeMode: Filesystem volumeName: pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4cPV 사양을 편집하여 원래 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-0aef8816c7eaCluster Operator를 배포합니다.
oc create -f install/cluster-operator -n my-project클러스터를 다시 생성합니다.
클러스터를 다시 생성하는 데 필요한 모든
KafkaTopic리소스가 있는지 여부에 따라 단계를 따르십시오.옵션 1:
__consumer_offsets의 커밋된 오프셋과 같은 내부 주제를 포함하여 클러스터를 손실하기 전에 존재하는 모든KafkaTopic리소스가 있는 경우 :모든
KafkaTopic리소스를 다시 생성합니다.클러스터를 배포하기 전에 리소스를 다시 생성해야 합니다. 그러지 않으면 Topic Operator에서 주제를 삭제해야 합니다.
Kafka 클러스터를 배포합니다.
예를 들면 다음과 같습니다.
oc apply -f kafka.yaml
옵션 2: 클러스터를 손실하기 전에 존재하는 모든
KafkaTopic리소스가 없는 경우:첫 번째 옵션과 마찬가지로 Kafka 클러스터를 배포하지만, 배포하기 전에 Kafka 리소스에서
topicOperator속성을 제거하여 Topic Operator 없이 Kafka 클러스터를 배포합니다.Topic Operator를 배포에 포함하는 경우 Topic Operator는 모든 주제를 삭제합니다.
Kafka 클러스터에서 내부 주제 저장소 주제를 삭제합니다.
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete명령은 Kafka 클러스터에 액세스하는 데 사용되는 리스너 및 인증 유형에 해당해야 합니다.
topicOperator속성으로 Kafka 클러스터를 재배포하여KafkaTopic리소스를 다시 생성하여 Topic Operator를 활성화합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {}1 #...
- 1
- 여기서는 추가 속성이 없는 기본 구성을 보여줍니다.
EntityTopicOperatorSpec스키마 참조에 설명된 속성을 사용하여 필요한 구성을 지정합니다.
KafkaTopic리소스를 나열하여 복구를 확인합니다.oc get KafkaTopic
29.4. 자주하는 질문 링크 복사링크가 클립보드에 복사되었습니다!
30장. Apache Kafka용 Streams에서 미터링 사용 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift에서 사용할 수 있는 미터링 툴을 사용하여 다양한 데이터 소스에서 미터링 보고서를 생성할 수 있습니다. 클러스터 관리자는 미터링을 사용하여 클러스터에서 발생하는 상황을 분석할 수 있습니다. 자체적으로 작성하거나 사전 정의된 SQL 쿼리를 사용하여 사용 가능한 다양한 데이터 소스에서 데이터를 처리하는 방법을 정의할 수 있습니다. Prometheus를 기본 데이터 소스로 사용하면 Pod, 네임스페이스 및 대부분의 다른 OpenShift 리소스에 대한 보고서를 생성할 수 있습니다.
OpenShift Metering Operator를 사용하여 설치된 Apache Kafka 구성 요소를 분석하여 Red Hat 서브스크립션을 준수하는지 확인할 수도 있습니다.
Apache Kafka용 Streams와 함께 미터링을 사용하려면 먼저 OpenShift Container Platform에서 Metering Operator 를 설치하고 구성해야 합니다.
30.1. 미터링 리소스 링크 복사링크가 클립보드에 복사되었습니다!
미터링에는 많은 리소스가 있으며, 기능 미터링을 보고하는 기능과 함께 미터링 배포 및 설치를 관리하는 데 사용할 수 있습니다. 미터링은 다음 CRD를 사용하여 관리합니다.
| 이름 | 설명 |
|---|---|
|
| 배포에 대해 미터링 스택을 구성합니다. 미터링 스택을 구성하는 각 구성 요소를 제어하기 위한 사용자 정의 및 구성 옵션이 포함되어 있습니다. |
|
| 사용할 쿼리, 쿼리를 실행할 빈도 및 결과를 저장할 위치를 제어합니다. |
|
|
|
|
| ReportQueries 및 Reports에서 사용할 수 있는 데이터를 제어합니다. 미터링 내에서 사용할 수 있도록 다양한 데이터베이스에 대한 액세스를 구성할 수 있습니다. |
30.2. Apache Kafka의 Streams에 대한 미터링 레이블 링크 복사링크가 클립보드에 복사되었습니다!
다음 표에는 Apache Kafka 인프라 구성 요소 및 통합용 Streams의 미터링 레이블이 나열되어 있습니다.
| 레이블 | 가능한 값 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 인프라
|
| 애플리케이션
| |
|
|
|
예
인프라 예(인프라 구성 요소가 entity-operator인 경우)
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2024.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.7 rht.subcomp=entity-operator rht.subcomp_t=infrastructure애플리케이션 예(통합 배포 이름은 kafka-bridge)
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2024.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.7 rht.subcomp=kafka-bridge rht.subcomp_t=application
부록 A. 서브스크립션 사용 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka의 스트림은 소프트웨어 서브스크립션을 통해 제공됩니다. 서브스크립션을 관리하려면 Red Hat 고객 포털에서 계정에 액세스하십시오.
계정 액세스
- access.redhat.com 으로 이동합니다.
- 계정이 없는 경우 계정을 생성합니다.
- 계정에 로그인합니다.
서브스크립션 활성화
- access.redhat.com 으로 이동합니다.
- 내 서브스크립션 으로 이동합니다.
- 서브스크립션 활성화로 이동하여 16자리 활성화 번호를 입력합니다.
Zip 및 Tar 파일 다운로드
zip 또는 tar 파일에 액세스하려면 고객 포털을 사용하여 다운로드할 관련 파일을 찾습니다. RPM 패키지를 사용하는 경우 이 단계는 필요하지 않습니다.
- 브라우저를 열고 Red Hat Customer Portal 제품 다운로드 페이지에 access.redhat.com/downloads.
- INTEGRATION 및 AUTOMATION 카테고리에서 Apache Kafka에 대한 Streams for Apache Kafka 항목을 찾습니다.
- Apache Kafka 제품에 대해 원하는 Streams를 선택합니다. 소프트웨어 다운로드 페이지가 열립니다.
- 구성 요소에 대한 다운로드 링크를 클릭합니다.
DNF를 사용하여 패키지 설치
패키지 및 모든 패키지 종속 항목을 설치하려면 다음을 사용합니다.
dnf install <package_name>
로컬 디렉터리에서 이전에 다운로드한 패키지를 설치하려면 다음을 사용합니다.
dnf install <path_to_download_package>
2024-05-31에 최종 업데이트된 문서