OpenShift에서 AMQ Streams 배포 및 관리
OpenShift Container Platform에 AMQ Streams 2.4 배포
초록
보다 포괄적 수용을 위한 오픈 소스 용어 교체 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.
1장. 배포 개요 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 OpenShift 클러스터에서 Apache Kafka 를 실행하는 프로세스를 간소화합니다.
이 가이드에서는 AMQ Streams 배포 및 업그레이드에 사용할 수 있는 모든 옵션과 OpenShift 클러스터에서 Apache Kafka를 실행하는 데 필요한 배포 순서를 설명합니다.
배포 단계에 대한 설명뿐만 아니라 이 가이드에서는 사전 및 배포 후 지침을 제공하여 배포를 준비하고 검증합니다. 이 가이드에서는 메트릭을 도입하기 위한 추가 배포 옵션도 설명합니다.
AMQ Streams 및 Kafka 업그레이드에 대한 업그레이드 지침이 제공됩니다.
AMQ Streams는 공용 및 프라이빗 클라우드에서 개발을 위해 의도된 로컬 배포에 관계없이 배포와 관계없이 모든 유형의 OpenShift 클러스터에서 작동하도록 설계되었습니다.
1.1. 배포 구성 링크 복사링크가 클립보드에 복사되었습니다!
이 가이드의 배포 절차는 배포의 초기 구조를 설정하는 데 도움이 되도록 고안되어 있습니다. 구조를 설정한 후 사용자 정의 리소스를 사용하여 정확한 요구에 맞게 배포를 구성할 수 있습니다. 배포 절차에서는 AMQ Streams와 함께 제공되는 설치 파일 예제를 사용합니다. 이 절차에서는 중요한 구성 고려 사항을 강조하지만 사용 가능한 모든 구성 옵션을 설명하지는 않습니다.
AMQ Streams를 배포하기 전에 Kafka 구성 요소에 사용할 수 있는 구성 옵션을 검토할 수 있습니다. 구성 옵션에 대한 자세한 내용은 사용자 정의 리소스 API 참조 를 참조하십시오.
1.1.1. Securing Kafka 링크 복사링크가 클립보드에 복사되었습니다!
배포 시 Cluster Operator는 클러스터 내의 데이터 암호화 및 인증에 필요한 TLS 인증서를 자동으로 설정합니다.
AMQ Streams는 암호화,인증 및 권한 부여 에 대한 추가 구성 옵션을 제공합니다.
- Kafka에 대한 보안 액세스를 관리하여 Kafka 클러스터와 클라이언트 간 데이터 교환을 보호합니다.
- OAuth 2.0 인증 및 OAuth 2.0 권한 부여를 제공하도록 권한 부여 서버를 사용하도록 배포를 구성합니다.
- 자체 인증서를 사용하여 Kafka를 보호합니다.
1.1.2. 배포 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 배포를 모니터링할 수 있는 추가 배포 옵션을 지원합니다.
- Kafka 클러스터와 함께 Prometheus 및 Grafana를 배포하여 메트릭을 추출하고 Kafka 구성 요소를 모니터링합니다.
- Kafka 클러스터와 함께 Kafka Exporter를 배포하여 특히 소비자 지연 모니터링과 관련된 추가 메트릭을 추출합니다.
- 분산 추적을 설정하여 메시지 엔드 투 엔드 추적을 추적합니다.
1.1.3. CPU 및 메모리 리소스 제한 및 요청 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 AMQ Streams Cluster Operator는 배포하는 피연산자의 CPU 및 메모리 리소스에 대한 요청 및 제한을 지정하지 않습니다.
Kafka와 같은 애플리케이션이 안정적이고 우수한 성능을 제공하려면 충분한 리소스를 보유하는 것이 중요합니다.
사용해야 하는 적절한 리소스 양은 특정 요구 사항 및 사용 사례에 따라 다릅니다.
CPU 및 메모리 리소스를 구성하는 것을 고려해야 합니다. AMQ Streams 사용자 정의 리소스에서 각 컨테이너에 대한 리소스 요청 및 제한을 설정할 수 있습니다.
1.2. AMQ Streams 사용자 정의 리소스 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams를 사용하여 OpenShift 클러스터에 Kafka 구성 요소를 배포하는 것은 사용자 정의 리소스 애플리케이션을 통해 구성할 수 있습니다. 사용자 정의 리소스는 OpenShift 리소스를 확장하기 위해 CRD(Custom Resource Definitions)에서 추가한 API 인스턴스로 생성됩니다.
CRD는 OpenShift 클러스터의 사용자 정의 리소스를 설명하는 구성 지침 역할을 하며, 배포에 사용된 각 Kafka 구성 요소에 대해 AMQ Streams와 사용자 및 주제를 제공합니다. CRD 및 사용자 정의 리소스는 YAML 파일로 정의됩니다. YAML 파일의 예는 AMQ Streams 배포와 함께 제공됩니다.
또한 CRD를 사용하면 AMQ Streams 리소스가 CLI 접근성 및 구성 검증과 같은 기본 OpenShift 기능을 활용할 수 있습니다.
1.2.1. AMQ Streams 사용자 정의 리소스 예 링크 복사링크가 클립보드에 복사되었습니다!
CRD에는 AMQ Streams 관련 리소스를 인스턴스화하고 관리하는 데 사용되는 스키마를 정의하기 위해 클러스터에 일회성 설치가 필요합니다.
CRD를 설치하여 새 사용자 정의 리소스 유형을 클러스터에 추가한 후 사양을 기반으로 리소스 인스턴스를 생성할 수 있습니다.
클러스터 설정에 따라 설치에 따라 일반적으로 클러스터 관리자 권한이 필요합니다.
사용자 정의 리소스 관리에 대한 액세스는 AMQ Streams 관리자에게 제한됩니다. 자세한 내용은 4.6절. “AMQ Streams 관리자 지정”의 내용을 참조하십시오.
CRD는 OpenShift 클러스터 내에서 와 같은 새로운 종류의 리소스를 정의합니다.
kind:Kafka
Kubernetes API 서버를 사용하면 유형을 기반으로 사용자 정의 리소스를 생성할 수 있으며 OpenShift 클러스터에 추가할 때 사용자 정의 리소스의 유효성을 검사하고 저장하는 방법을 CRD에서 이해할 수 있습니다.
CRD가 삭제되면 해당 유형의 사용자 정의 리소스도 삭제됩니다. 또한 Pod 및 statefulsets와 같은 사용자 정의 리소스에서 생성한 리소스도 삭제됩니다.
각 AMQ Streams별 사용자 정의 리소스는 리소스 종류의 CRD에서 정의한 스키마를 준수합니다. AMQ Streams 구성 요소에 대한 사용자 정의 리소스에는 사양에 정의된 공통 구성 속성이 있습니다.
CRD와 사용자 정의 리소스 간의 관계를 이해하기 위해 Kafka 항목에 대한 CRD 샘플을 살펴보겠습니다.
Kafka topic CRD
apiVersion: kafka.strimzi.io/v1beta2
kind: CustomResourceDefinition
metadata:
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의 메타데이터, CRD를 식별하는 라벨 및 이름입니다.
- 2
- 그룹(domain) 이름, 복수형 이름 및 지원되는 스키마 버전을 포함하여 주제의 API에 액세스하는 URL에 사용되는 이 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'가 포함되어 있기 때문에 AMQ Streams 설치 파일과 함께 제공되는 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클러스터의 이름을 정의하는KafkaTopic및KafkaUser리소스에만 적용되는 레이블입니다. - 3
- 사양은 주제의 파티션 및 복제본 수와 주제 자체에 대한 구성 매개 변수를 보여줍니다. 이 예에서는 메시지가 항목에 남아 있고 로그의 세그먼트 파일 크기가 지정됩니다.
- 4
KafkaTopic리소스의 상태 상태입니다.lastTransitionTime에서유형조건이Ready로 변경되었습니다.
사용자 정의 리소스는 플랫폼 CLI를 통해 클러스터에 적용할 수 있습니다. 사용자 정의 리소스가 생성되면 Kubernetes API의 기본 제공 리소스와 동일한 검증을 사용합니다.
KafkaTopic 사용자 정의 리소스가 생성되면 Topic Operator에 알림을 받고 해당 Kafka 항목이 AMQ Streams에서 생성됩니다.
1.3. Kafka 브리지를 사용하여 Kafka 클러스터 연결 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams Kafka Bridge API를 사용하여 소비자를 생성 및 관리하고 기본 Kafka 프로토콜이 아닌 HTTP를 통해 레코드를 전송 및 수신할 수 있습니다.
Kafka 브리지를 설정하면 Kafka 클러스터에 대한 HTTP 액세스를 구성합니다. 그런 다음 Kafka Bridge를 사용하여 클러스터에서 메시지를 생성 및 사용하고 REST 인터페이스를 통해 다른 작업을 수행할 수 있습니다.
1.4. 문서 관련 링크 복사링크가 클립보드에 복사되었습니다!
사용자 대체 값
대체 가능 값이라고도 하는 사용자 대체 값은 이진수에 빙각 대괄호(< >)로 표시됩니다. 밑줄( _ )은 여러 단어 값에 사용됩니다. 값이 코드 또는 명령을 참조하는 경우 monospace 도 사용됩니다.
예를 들어 다음 코드에서 < my_namespace>를 네임스페이스 이름으로 교체하려고 합니다.
sed -i 's/namespace: .*/namespace: <my_namespace>/' install/cluster-operator/*RoleBinding*.yaml
2장. AMQ Streams 설치 방법 링크 복사링크가 클립보드에 복사되었습니다!
다음 두 가지 방법으로 OpenShift 4.10에 AMQ Streams를 4.13에 설치할 수 있습니다.
| 설치 방법 | 설명 |
|---|---|
|
AMQ Streams 소프트웨어 다운로드 페이지에서 Red Hat AMQ Streams 2.4 OpenShift 설치 및 예제 파일을 다운로드합니다.
| |
| OperatorHub에서 AMQ Streams Operator를 사용하여 단일 네임스페이스 또는 모든 네임스페이스에 AMQ Streams를 배포합니다. |
유연성을 극대화하려면 설치 아티팩트 방법을 선택합니다. OperatorHub 방법은 표준 구성을 제공하며 자동 업데이트를 활용할 수 있습니다.
Helm을 사용한 AMQ Streams 설치는 지원되지 않습니다.
3장. AMQ Streams로 배포 대상 링크 복사링크가 클립보드에 복사되었습니다!
Apache Kafka 구성 요소는 AMQ Streams 배포를 사용하여 OpenShift에 배포할 수 있도록 제공됩니다. Kafka 구성 요소는 일반적으로 가용성을 위해 클러스터로 실행됩니다.
Kafka 구성 요소를 통합하는 일반적인 배포에는 다음이 포함될 수 있습니다.
- 브로커 노드의 Kafka 클러스터
- 복제된 ZooKeeper 인스턴스의 zookeeper 클러스터
- 외부 데이터 연결을 위한 Kafka Connect 클러스터
- 보조 클러스터에서 Kafka 클러스터를 미러링할 Kafka MirrorMaker 클러스터
- 모니터링을 위한 추가 Kafka 메트릭 데이터를 추출하기 위한 Kafka 내보내기
- Kafka 클러스터에 대한 HTTP 기반 요청 생성
이러한 구성 요소가 모두 필수는 아니지만 Kafka 및 ZooKeeper가 최소한 필요합니다. 일부 구성 요소는 MirrorMaker 또는 Kafka Connect와 같은 Kafka 없이 배포할 수 있습니다.
3.1. 배포 순서 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 클러스터에 필요한 배포 순서는 다음과 같습니다.
- Kafka 클러스터를 관리하기 위해 Cluster Operator 배포
- ZooKeeper 클러스터를 사용하여 Kafka 클러스터를 배포하고 배포에 Topic Operator 및 User Operator를 포함합니다.
선택적으로 다음을 배포합니다.
- Kafka 클러스터와 함께 배포하지 않은 경우 Topic Operator 및 User Operator 독립 실행형
- Kafka Connect
- Kafka MirrorMaker
- Kafka 브리지
- 메트릭 모니터링을 위한 구성 요소
Cluster Operator는 Deployment,Service 및 Pod 리소스와 같은 구성 요소에 대해 OpenShift 리소스를 생성합니다. OpenShift 리소스의 이름에는 배포 시 구성 요소에 지정된 이름이 추가됩니다. 예를 들어 my-kafka-cluster 라는 Kafka 클러스터에는 my-kafka-cluster-kafka 라는 서비스가 있습니다.
4장. AMQ Streams 배포 준비 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션에서는 다음을 설명하는 AMQ Streams 배포를 준비하는 방법을 보여줍니다.
이 가이드에서 명령을 실행하려면 클러스터 사용자에게 RBAC(역할 기반 액세스 제어) 및 CRD를 관리할 수 있는 권한이 있어야 합니다.
4.1. 배포 사전 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams를 배포하려면 다음이 필요합니다.
OpenShift 4.10에서 4.13 클러스터로.
AMQ Streams는 Strimzi 0.34.x를 기반으로 합니다.
-
oc명령줄 툴이 설치되고 실행 중인 클러스터에 연결하도록 구성되어 있습니다.
4.2. AMQ Streams 릴리스 아티팩트 다운로드 링크 복사링크가 클립보드에 복사되었습니다!
배포 파일을 사용하여 AMQ Streams를 설치하려면 AMQ Streams 소프트웨어 다운로드 페이지에서 파일을 다운로드하여 추출합니다.
AMQ Streams 릴리스 아티팩트에는 OpenShift에 AMQ Streams의 구성 요소를 배포하고, 공통 작업을 수행하고, Kafka 클러스터를 구성하는 데 도움이 되는 샘플 YAML 파일이 포함되어 있습니다.
oc 를 사용하여 다운로드한 ZIP 파일의 install/cluster-operator 폴더에 Cluster Operator를 배포합니다. Cluster Operator 배포 및 구성에 대한 자세한 내용은 6.2절. “Cluster Operator 배포” 을 참조하십시오.
또한 AMQ Streams Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 Topic 및 User Operator의 독립 실행형 설치를 사용하려면 install/topic-operator 및 install/user-operator 폴더에서 해당 Operator를 배포할 수 있습니다.
또한 AMQ Streams 컨테이너 이미지는 Red Hat Ecosystem Catalog 를 통해 사용할 수 있습니다. 그러나 AMQ Streams를 배포하기 위해 제공된 YAML 파일을 사용하는 것이 좋습니다.
4.3. 구성 및 배포 파일의 예 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams와 함께 제공되는 구성 및 배포 파일을 사용하여 다양한 구성으로 Kafka 구성 요소를 배포하고 배포를 모니터링합니다. 사용자 지정 리소스에 대한 구성 파일의 예제에는 중요한 속성 및 값이 포함되어 있으며, 자체 배포에 대해 지원되는 추가 구성 속성으로 확장할 수 있습니다.
4.3.1. 파일 위치 예 링크 복사링크가 클립보드에 복사되었습니다!
예제 파일은 AMQ Streams 소프트웨어 다운로드 페이지에서 다운로드할 수 있는 릴리스 아티팩트를 통해 제공됩니다.
oc 명령줄 툴을 사용하여 예제를 다운로드하여 적용할 수 있습니다. 이 예제에서는 배포에 대한 자체 Kafka 구성 요소 구성을 빌드할 때 시작점으로 사용될 수 있습니다.
Operator를 사용하여 AMQ Streams를 설치한 경우에도 예제 파일을 다운로드하여 구성을 업로드할 수 있습니다.
4.3.2. AMQ Streams와 함께 제공되는 파일 예 링크 복사링크가 클립보드에 복사되었습니다!
릴리스 아티팩트에는 구성 예제가 포함된 examples 디렉터리가 포함되어 있습니다.
디렉터리 예
examples
├── user
├── topic
├── security
│ ├── tls-auth
│ ├── scram-sha-512-auth
│ └── keycloak-authorization
├── mirror-maker
├── metrics
├── kafka
├── cruise-control
├── connect
└── bridge
- 1
- User Operator가 관리하는
KafkaUser사용자 정의 리소스 구성 - 2
- Topic Operator에서 관리하는
KafkaTopic사용자 정의 리소스 구성 - 3
- Kafka 구성 요소에 대한 인증 및 권한 부여 구성 TLS 및 SCRAM-SHA-512 인증에 대한 구성 예를 포함합니다. Red Hat Single Sign-On 예제에는
Kafka사용자 정의 리소스 구성 및 Red Hat Single Sign-On 영역 사양이 포함되어 있습니다. 이 예제를 사용하여 Red Hat Single Sign-On 권한 부여 서비스를 사용해 볼 수 있습니다. 활성화된oauth인증 및keycloak권한 부여 지표가 있는 예도 있습니다. - 4
- MirrorECDHE 배포를 위한
Kafka사용자 정의 리소스 구성 복제 정책 및 동기화 빈도에 대한 구성 예제가 포함되어 있습니다. - 5
- Prometheus 설치 및 Grafana 대시보드 파일을 포함한 지표 구성
- 6
Kafka배포에 대한 Kafka 사용자 지정 리소스 구성 임시 또는 영구 단일 또는 다중 노드 배포를 위한 구성 예를 포함합니다.- 7
- Cruise Control에 대한 배포 구성이 있는
Kafka사용자 지정 리소스KafkaRebalance사용자 정의 리소스를 포함하여 Cruise Control에서 최적화 제안을 생성하고 기본 또는 사용자 최적화 목표를 사용하는 예제 구성을 포함합니다. - 8
KafkaConnect및KafkaConnector사용자 정의 리소스 구성: Kafka Connect 배포용. 단일 또는 다중 노드 배포를 위한 구성 예시가 포함되어 있습니다.- 9
Kafka 브리지배포를 위한 KafkaBridge 사용자 정의 리소스 구성
4.4. 자체 레지스트리로 컨테이너 이미지 푸시 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams의 컨테이너 이미지는 Red Hat Ecosystem Catalog 에서 사용할 수 있습니다. AMQ Streams에서 제공하는 설치 YAML 파일은 Red Hat Ecosystem Catalog 에서 직접 이미지를 가져옵니다.
Red Hat Ecosystem Catalog 에 액세스할 수 없거나 자체 컨테이너 리포지토리를 사용하려는 경우 다음을 수행하십시오.
- 여기에 나열된 모든 컨테이너 이미지를 가져옵니다.
- 사용자 고유의 레지스트리로 푸시
- 설치 YAML 파일에서 이미지 이름을 업데이트
릴리스에 지원되는 각 Kafka 버전에는 별도의 이미지가 있습니다.
| 컨테이너 이미지 | namespace/Repository | 설명 |
|---|---|---|
| Kafka |
| Kafka를 실행하기 위한 AMQ Streams 이미지 (예:
|
| Operator |
| Operator 실행을 위한 AMQ Streams 이미지:
|
| Kafka 브리지 |
| AMQ Streams Kafka 브리지 실행을 위한 AMQ Streams 이미지 |
| AMQ Streams DrainCleaner |
| AMQ Streams Drain cleaner 실행을 위한 AMQ Streams 이미지 |
4.5. 컨테이너 이미지 레지스트리에 인증할 풀 시크릿 생성 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams에서 제공하는 설치 YAML 파일은 Red Hat Ecosystem Catalog 에서 직접 컨테이너 이미지를 가져옵니다. AMQ Streams 배포에 인증이 필요한 경우 시크릿에서 인증 자격 증명을 구성하고 설치 YAML에 추가합니다.
인증은 일반적으로 필요하지 않지만 특정 플랫폼에서 요청할 수 있습니다.
사전 요구 사항
- Red Hat 사용자 이름 및 암호 또는 Red Hat 레지스트리 서비스 계정의 로그인 정보가 필요합니다.
Red Hat 서브스크립션을 사용하여 Red Hat 고객 포털에서 레지스트리 서비스 계정을 생성할 수 있습니다.
절차
로그인 세부 정보와 AMQ Streams 이미지를 가져오는 컨테이너 레지스트리가 포함된 풀 시크릿을 생성합니다.
oc create secret docker-registry <pull_secret_name> \ --docker-server=registry.redhat.io \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>사용자 이름 및 암호를 추가합니다. 이메일 주소는 선택 사항입니다.
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml배포 파일을 편집하여STRIMZI_IMAGE_PULL_SECRET환경 변수를 사용하여 풀 시크릿을 지정합니다.apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: - name: STRIMZI_IMAGE_PULL_SECRETS value: "<pull_secret_name>" # ...보안은 Cluster Operator가 생성한 모든 Pod에 적용됩니다.
4.6. AMQ Streams 관리자 지정 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 배포 구성을 위한 사용자 정의 리소스를 제공합니다. 기본적으로 이러한 리소스를 보고, 생성, 편집 및 삭제하는 권한은 OpenShift 클러스터 관리자에게 제한됩니다. AMQ Streams는 이러한 권한을 다른 사용자에게 할당하는 데 사용할 수 있는 두 개의 클러스터 역할을 제공합니다.
-
Strimzi-view를 사용하면 AMQ Streams 리소스를 보고 나열할 수 있습니다. -
Strimzi-admin을 사용하면 AMQ Streams 리소스를 생성, 편집 또는 삭제할 수도 있습니다.
이러한 역할을 설치하면 기본 OpenShift 클러스터 역할에 이러한 권한을 자동으로 집계(추가)합니다. Strimzi-view 는 view 역할로 집계하고, strimzi-admin 은 edit 및 admin 역할에 대해 집계합니다. 집계로 인해 이미 유사한 권한이 있는 사용자에게 이러한 역할을 할당할 필요가 없습니다.
다음 절차에서는 비 클러스터 관리자가 AMQ Streams 리소스를 관리할 수 있는 strimzi-admin 역할을 할당하는 방법을 보여줍니다.
시스템 관리자는 Cluster Operator를 배포한 후 AMQ Streams 관리자를 지정할 수 있습니다.
사전 요구 사항
- CRD를 관리하기 위한 AMQ Streams CRD(Custom Resource Definitions) 및 RBAC(역할 기반 액세스 제어) 리소스가 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에서 AMQ Streams 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔의 OperatorHub에서 AMQ Streams Operator를 설치합니다.
이 섹션의 절차에서는 다음을 수행하는 방법을 보여줍니다.
5.1. OperatorHub에서 AMQ Streams Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔에서 OperatorHub를 사용하여 AMQ Streams Operator를 설치하고 구독할 수 있습니다.
다음 절차에서는 프로젝트를 생성하고 해당 프로젝트에 AMQ Streams Operator를 설치하는 방법을 설명합니다. 프로젝트는 네임스페이스를 나타냅니다. 관리 효율성을 위해 네임스페이스를 사용하여 함수를 분리하는 것이 좋습니다.
적절한 업데이트 채널을 사용하고 있는지 확인하십시오. 지원되는 OpenShift 버전에 있는 경우 기본 stable 채널에서 AMQ Streams를 설치하는 것이 일반적으로 안전합니다. 그러나 stable 채널에서 자동 업데이트를 활성화하는 것은 권장되지 않습니다. 자동 업그레이드는 업그레이드하기 전에 필요한 단계를 건너뜁니다. 버전별 채널에서만 자동 업그레이드를 사용합니다.
사전 요구 사항
-
cluster-admin또는strimzi-admin권한이 있는 계정을 사용하여 OpenShift Container Platform 웹 콘솔에 액세스합니다.
절차
OpenShift 웹 콘솔에서 홈 > 프로젝트 페이지로 이동하여 설치에 사용할 프로젝트(네임스페이스)를 생성합니다.
이 예제에서는
amq-streams-kafka라는 프로젝트를 사용합니다.- Operators > OperatorHub 페이지로 이동합니다.
스크롤하거나 키워드로 필터링 상자에 키워드 를 입력하여 AMQ Streams Operator를 찾습니다.
Operator는 Streaming & Messaging 카테고리에 있습니다.
- AMQ Streams 를 클릭하여 Operator 정보를 표시합니다.
- Operator에 대한 정보를 읽고 설치를 클릭합니다.
Operator 설치 페이지에서 다음 설치 및 업데이트 옵션 중에서 선택합니다.
Update Channel: Operator의 업데이트 채널을 선택합니다.
- (기본값) stable 채널에는 메이저, 마이너 및 마이크로 릴리스를 포함하여 모든 최신 업데이트 및 릴리스가 포함되어 있으며 이는 테스트되고 안정적인 것으로 간주됩니다.
- amq-streams-X.x 채널에는 주요 릴리스의 마이너 릴리스 및 마이크로 릴리스 업데이트가 포함되어 있습니다. 여기서 X 는 주요 릴리스 버전 번호입니다.
- amq-streams-X.Y.x 채널에는 마이너 릴리스의 마이크로 릴리스 업데이트가 포함되어 있습니다. 여기서 X 는 주요 릴리스 버전 번호이고 Y 는 마이너 릴리스 버전 번호입니다.
설치 모드: 특정 네임스페이스에 Operator를 설치하기 위해 생성한 프로젝트를 선택합니다.
AMQ Streams Operator를 클러스터의 모든 네임스페이스(기본 옵션) 또는 특정 네임스페이스에 설치할 수 있습니다. Kafka 클러스터 및 기타 AMQ Streams 구성 요소에 특정 네임스페이스를 전용으로 지정하는 것이 좋습니다.
- 업데이트 승인: 기본적으로 AMQ Streams Operator는 OLM(Operator Lifecycle Manager)에 의해 최신 AMQ Streams 버전으로 자동으로 업그레이드됩니다. 필요한 경우 향후 업그레이드를 수동으로 승인하려면 수동 을 선택합니다. 자세한 내용은 OpenShift 설명서 의 Operator 가이드를 참조하십시오.
Install 을 클릭하여 선택한 네임스페이스에 Operator를 설치합니다.
AMQ Streams Operator는 Cluster Operator, CRD, RBAC(역할 기반 액세스 제어) 리소스를 선택한 네임스페이스에 배포합니다.
Operator를 사용할 준비가 되면 Operator > 설치된 Operator 로 이동하여 Operator가 선택한 네임스페이스에 설치되었는지 확인합니다.
상태가 성공으로 표시됩니다.
이제 AMQ Streams Operator를 사용하여 Kafka 클러스터부터 Kafka 구성 요소를 배포할 수 있습니다.
워크로드 > 배포로 이동하는 경우 Cluster Operator 및 Entity Operator에 대한 배포 세부 정보를 확인할 수 있습니다. Cluster Operator의 이름에는 amq-streams-cluster-operator-<version> 이라는 버전 번호가 포함됩니다. AMQ Streams 설치 아티팩트를 사용하여 Cluster Operator를 배포할 때 이름은 다릅니다. 이 경우 이름은 strimzi-cluster-operator 입니다.
5.2. AMQ Streams Operator를 사용하여 Kafka 구성 요소 배포 링크 복사링크가 클립보드에 복사되었습니다!
Openshift에 설치하는 경우 AMQ Streams Operator를 사용하면 사용자 인터페이스에서 Kafka 구성 요소를 설치할 수 있습니다.
다음 Kafka 구성 요소를 설치에 사용할 수 있습니다.
- Kafka
- Kafka Connect
- Kafka MirrorMaker
- Kafka MirrorMaker 2
- Kafka Topic
- Kafka 사용자
- Kafka 브리지
- Kafka Connector
- Kafka 리밸런스
구성 요소를 선택하고 인스턴스를 만듭니다. 최소한 Kafka 인스턴스를 생성합니다. 다음 절차에서는 기본 설정을 사용하여 Kafka 인스턴스를 생성하는 방법을 설명합니다. 설치를 수행하기 전에 기본 설치 사양을 구성할 수 있습니다.
프로세스는 다른 Kafka 구성 요소의 인스턴스를 생성하는 것과 동일합니다.
사전 요구 사항
- AMQ Streams Operator 가 OpenShift 클러스터에 설치되어 있습니다.
절차
웹 콘솔에서 Operator > 설치된 Operator 페이지로 이동하고 AMQ Streams 를 클릭하여 Operator 세부 정보를 표시합니다.
제공된 API 에서 Kafka 구성 요소의 인스턴스를 생성할 수 있습니다.
Kafka 에서 인스턴스 생성을 클릭하여 Kafka 인스턴스를 생성합니다.
기본적으로 세 개의 Kafka 브로커 노드와 3 개의 ZooKeeper 노드가 있는
my-cluster라는 Kafka 클러스터를 생성합니다. 클러스터는 임시 스토리지를 사용합니다.생성을 클릭하여 Kafka 설치를 시작합니다.
상태가 Ready 로 변경될 때까지 기다립니다.
6장. 설치 아티팩트를 사용하여 AMQ Streams 배포 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams 배포를 위한 환경을 준비하면 OpenShift 클러스터에 AMQ Streams 를 배포할 수 있습니다. 릴리스 아티팩트와 함께 제공되는 설치 파일을 사용합니다.
AMQ Streams는 Strimzi 0.34.x를 기반으로 합니다. OpenShift 4.10에 AMQ Streams 2.4를 4.13에 배포할 수 있습니다.
설치 파일을 사용하여 AMQ Streams를 배포하는 단계는 다음과 같습니다.
- Cluster Operator 배포
Cluster Operator를 사용하여 다음을 배포합니다.
선택적으로 요구 사항에 따라 다음 Kafka 구성 요소를 배포합니다.
이 가이드에서 명령을 실행하려면 OpenShift 사용자에게 RBAC(역할 기반 액세스 제어) 및 CRD를 관리할 수 있는 권한이 있어야 합니다.
6.1. 기본 배포 경로 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams가 동일한 네임스페이스에서 단일 Kafka 클러스터를 관리하는 배포를 설정할 수 있습니다. 개발 또는 테스트에 이 구성을 사용할 수 있습니다. 또는 프로덕션 환경에서 AMQ Streams를 사용하여 다른 네임스페이스의 여러 Kafka 클러스터를 관리할 수 있습니다.
AMQ Streams 배포의 첫 번째 단계는 install/cluster-operator 파일을 사용하여 Cluster Operator를 설치하는 것입니다.
단일 명령은 cluster-operator 폴더의 모든 설치 파일을 적용합니다. oc apply -f ./install/cluster-operator.
이 명령은 다음을 포함하여 Kafka 배포를 생성하고 관리하는 데 필요한 모든 것을 설정합니다.
-
Cluster Operator (
배포,ConfigMap) -
AMQ Streams CRD(
CustomResourceDefinition) -
RBAC 리소스(
ClusterRole,ClusterRoleBinding,RoleBinding) -
서비스 계정(
ServiceAccount)
기본 배포 경로는 다음과 같습니다.
- 릴리스 아티팩트 다운로드
- 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가 제공되도록 리더 선택으로 복제본을 추가할 수 있습니다. 자세한 내용은 13.2.5절. “리더 선택을 사용하여 여러 Cluster Operator 복제본 실행”의 내용을 참조하십시오.
6.2.1. Cluster Operator에서 감시하는 네임스페이스 지정 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 Kafka 리소스가 배포되는 네임스페이스의 업데이트를 감시합니다. Cluster Operator를 배포할 때 조사할 네임스페이스를 지정합니다. 다음 네임스페이스를 지정할 수 있습니다.
Cluster Operator는 OpenShift 클러스터에서 하나, 여러 개 또는 모든 네임스페이스를 조사할 수 있습니다. Topic Operator 및 User Operator는 단일 네임스페이스에서 KafkaTopic 및 KafkaUser 리소스를 조사합니다. 자세한 내용은 13.1절. “AMQ Streams Operator를 사용하여 네임스페이스 모니터링”의 내용을 참조하십시오.
Cluster Operator는 다음 리소스에 대한 변경 사항을 감시합니다.
-
Kafka클러스터의 Kafka입니다. -
Kafka Connect클러스터의 KafkaConnect. -
Kafka Connect 클러스터에서 커넥터를 생성하고 관리하기 위한
KafkaConnector. -
Kafka MirrorMaker인스턴스인 KafkaMirrorMaker입니다. -
Kafka MirrorMaker 2인스턴스의 KafkaMirrorMaker2입니다. -
Kafka 브리지인스턴스용 KafkaBridge. -
Cruise Control 최적화 요청에 대한
KafkaRebalance
OpenShift 클러스터에 이러한 리소스 중 하나가 생성되면 Operator가 리소스에서 클러스터 설명을 가져오고 StatefulSets, Services 및 ConfigMaps와 같은 필요한 OpenShift 리소스를 생성하여 리소스에 대한 새 클러스터 생성을 시작합니다.
Kafka 리소스가 업데이트될 때마다 Operator는 리소스에 대한 클러스터를 구성하는 OpenShift 리소스에서 해당 업데이트를 수행합니다.
리소스를 패치하거나 삭제한 다음 다시 생성하여 리소스의 클러스터를 원하는 클러스터 상태를 반영합니다. 이 작업으로 인해 서비스 중단으로 이어질 수 있는 롤링 업데이트가 발생할 수 있습니다.
리소스가 삭제되면 Operator는 클러스터 배포를 취소하고 관련된 모든 OpenShift 리소스를 삭제합니다.
6.2.2. 단일 네임스페이스를 조사하기 위해 Cluster Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 클러스터의 단일 네임스페이스에서 AMQ Streams 리소스를 조사하기 위해 Cluster Operator를 배포하는 방법을 설명합니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.
절차
AMQ Streams 설치 파일을 편집하여 Cluster Operator가 설치될 네임스페이스를 사용합니다.
예를 들어 이 절차에서는 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에는 준비되거나 예상된 복제본 수가 표시됩니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.2.3. 여러 네임스페이스를 조사하기 위해 Cluster Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 배포하여 OpenShift 클러스터의 여러 네임스페이스에서 AMQ Streams 리소스를 조사하는 방법을 설명합니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.
절차
AMQ Streams 설치 파일을 편집하여 Cluster Operator가 설치될 네임스페이스를 사용합니다.
예를 들어 이 절차에서는 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-rhel8-operator:2.4.0 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: watched-namespace-1,watched-namespace-2,watched-namespace-3나열된 각 네임스페이스에 대해
RoleBindings를 설치합니다.이 예제에서는 이 명령에서
watched-namespace를 이전 단계에 나열된 네임스페이스로 교체하고watched-namespace-1,watched-namespace-2,watched-namespace-3에 대해 반복합니다.oc create -f install/cluster-operator/020-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/023-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/031-RoleBinding-strimzi-cluster-operator-entity-operator-delegation.yaml -n <watched_namespace>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에는 준비되거나 예상된 복제본 수가 표시됩니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.2.4. 모든 네임스페이스를 조사하기 위해 Cluster Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 클러스터의 모든 네임스페이스에서 AMQ Streams 리소스를 조사하기 위해 Cluster Operator를 배포하는 방법을 설명합니다.
이 모드에서 실행하면 Cluster Operator가 생성된 새 네임스페이스의 클러스터를 자동으로 관리합니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.
절차
AMQ Streams 설치 파일을 편집하여 Cluster Operator가 설치될 네임스페이스를 사용합니다.
예를 들어 이 절차에서는 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-rhel8-operator:2.4.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에는 준비되거나 예상된 복제본 수가 표시됩니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.3. Kafka 배포 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator를 사용하여 Kafka 클러스터를 관리할 수 있으려면 Kafka 리소스로 배포해야 합니다. AMQ Streams는 이 작업을 수행할 배포 파일 예를 제공합니다. 이러한 파일을 사용하여 Topic Operator 및 User Operator를 동시에 배포할 수 있습니다.
Cluster Operator를 배포한 후 Kafka 리소스를 사용하여 다음 구성 요소를 배포합니다.
Kafka를 설치할 때 AMQ Streams는 ZooKeeper 클러스터를 설치하고, Kafka를 ZooKeeper와 연결하는 데 필요한 구성을 추가합니다.
Kafka 클러스터를 Kafka 리소스로 배포하지 않은 경우 Cluster Operator를 사용하여 관리할 수 없습니다. 이는 예를 들어 OpenShift 외부에서 실행되는 Kafka 클러스터에 적용됩니다. 그러나 독립 실행형 구성 요소로 배포하여 AMQ Streams에서 관리하지 않는 Kafka 클러스터와 함께 Topic Operator 및 User Operator를 사용할 수 있습니다. AMQ Streams에서 관리하지 않는 Kafka 클러스터와 함께 다른 Kafka 구성 요소를 배포하고 사용할 수도 있습니다.
6.3.1. Kafka 클러스터 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Kafka 클러스터를 OpenShift 클러스터에 배포하는 방법을 설명합니다.
배포에서는 YAML 파일을 사용하여 Kafka 리소스를 생성하는 사양을 제공합니다.
AMQ Streams는 Kafka 클러스터를 생성하는 데 사용할 수 있는 다음 예제 파일을 제공합니다.
kafka-persistent.yaml- 3개의 ZooKeeper 및 3개의 Kafka 노드로 영구 클러스터를 배포합니다.
kafka-jbod.yaml- 3개의 ZooKeeper 및 3개의 Kafka 노드로 영구 클러스터를 배포합니다(각각 여러 영구 볼륨을 사용).
kafka-persistent-single.yaml- 단일 ZooKeeper 노드와 단일 Kafka 노드로 영구 클러스터를 배포합니다.
kafka-ephemeral.yaml- 3개의 ZooKeeper 및 3개의 Kafka 노드로 임시 클러스터를 배포합니다.
kafka-ephemeral-single.yaml- 3개의 ZooKeeper 노드와 단일 Kafka 노드로 임시 클러스터를 배포합니다.
이 절차에서는 임시 및 영구 Kafka 클러스터 배포에 대한 예제를 사용합니다.
- 임시 클러스터
-
일반적으로 임시(또는 임시) Kafka 클러스터는 프로덕션이 아닌 개발 및 테스트 목적으로 적합합니다. 이 배포에서는 브로커 정보(축소용) 및 주제 또는 파티션( Kafka용)을 저장하는 데
emptyDir볼륨을 사용합니다.emptyDir볼륨을 사용하면 콘텐츠가 Pod 라이프 사이클과 엄격하게 관련되어 있으며 Pod가 중단되면 삭제됩니다. - 영구 클러스터
영구 Kafka 클러스터는 영구 볼륨을 사용하여 ZooKeeper 및 Kafka 데이터를 저장합니다.
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 버전을 지정하고 지원되는 로그 메시지 형식 버전 및broker 간 프로토콜 버전에 대한 구성을 지정합니다. 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 옵션이 무시되고 설정할 필요가 없습니다.
Kafka를 업그레이드 할 때 inter.broker.protocol.version 에 대한 업데이트가 필요합니다.
예제 클러스터의 이름은 기본적으로 my-cluster 로 지정됩니다. 클러스터 이름은 리소스 이름으로 정의되며 클러스터를 배포한 후에는 변경할 수 없습니다. 클러스터를 배포하기 전에 클러스터 이름을 변경하려면 관련 YAML 파일에서 Kafka 리소스의 Kafka.metadata.name 속성을 편집합니다.
기본 클러스터 이름 및 지정된 Kafka 버전
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.4.0
#...
config:
#...
log.message.format.version: "3.4"
inter.broker.protocol.version: "3.4"
# ...
사전 요구 사항
절차
임시 또는 영구 클러스터를 생성하고 배포합니다.
임시 클러스터를 생성하고 배포하려면 다음을 수행합니다.
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 및 ZooKeeper Pod를 식별합니다.기본 배포를 사용하면 Entity Operator 클러스터, Kafka Pod 3개 및 3 ZooKeeper Pod를 생성합니다.
READY에는 준비되거나 예상된 복제본 수가 표시됩니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.3.2. Cluster Operator를 사용하여 Topic Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Topic Operator를 배포하는 방법을 설명합니다.
topicOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 구성합니다. 기본적으로 Topic Operator는 Cluster Operator가 배포한 Kafka 클러스터의 네임스페이스에서 KafkaTopic 리소스를 감시합니다. 주제 Operator 사양에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다. 단일 Topic Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임스페이스는 하나의 Topic Operator에서만 조사해야 합니다.
AMQ Streams를 사용하여 여러 Kafka 클러스터를 동일한 네임스페이스에 배포하는 경우 하나의 Kafka 클러스터에 대해서만 Topic Operator를 활성화하거나 watchedNamespace 속성을 사용하여 다른 네임스페이스를 조사하도록 Topic Operator를 구성합니다.
AMQ Streams에서 관리하지 않는 Kafka 클러스터에서 Topic Operator를 사용하려면 Topic Operator를 독립 실행형 구성 요소로 배포 해야 합니다.
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에는 준비되거나 예상된 복제본 수가 표시됩니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.3.3. Cluster Operator를 사용하여 User Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 User Operator를 배포하는 방법을 설명합니다.
userOperator 를 포함하도록 Kafka 리소스의 entityOperator 속성을 구성합니다. 기본적으로 User Operator는 Kafka 클러스터 배포의 네임스페이스에서 KafkaUser 리소스를 감시합니다. User Operator 사양에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다. 단일 User Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임스페이스는 User Operator 한 개만 조사해야 합니다.
AMQ Streams에서 관리하지 않는 Kafka 클러스터에서 User Operator를 사용하려면 User Operator를 독립 실행형 구성 요소로 배포 해야 합니다.
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에는 준비되거나 예상된 복제본 수가 표시됩니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.4. Kafka Connect 배포 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect 는 Apache Kafka와 기타 시스템 간에 데이터를 스트리밍하는 툴입니다. 예를 들어 Kafka Connect는 Kafka를 외부 데이터베이스 또는 스토리지 및 메시징 시스템과 통합할 수 있습니다.
AMQ Streams에서 Kafka Connect는 분산 모드로 배포됩니다. Kafka Connect는 독립 실행형 모드에서도 작동할 수 있지만 AMQ Streams에서는 지원되지 않습니다.
커넥터 의 개념을 사용하여 Kafka Connect는 확장성과 신뢰성을 유지하면서 Kafka 클러스터 내외로 대량의 데이터를 이동하기 위한 프레임워크를 제공합니다.
Cluster Operator는 KafkaConnector 리소스를 사용하여 생성된 KafkaConnect 리소스 및 커넥터를 사용하여 배포된 Kafka Connect 클러스터를 관리합니다.
Kafka Connect를 사용하려면 다음을 수행해야 합니다.
커넥터 라는 용어는 Kafka Connect 클러스터 또는 커넥터 클래스 내에서 실행되는 커넥터 인스턴스를 의미합니다. 이 가이드에서 커넥터 라는 용어는 컨텍스트에서 의미가 명확해질 때 사용됩니다.
6.4.1. OpenShift 클러스터에 Kafka Connect 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Kafka Connect 클러스터를 OpenShift 클러스터에 배포하는 방법을 설명합니다.
Kafka Connect 클러스터 배포는 연결 작업의 워크로드를 작업으로 배포하는 구성 가능한 수의 노드( 작업자라고도 함)로 구현되어 메시지 flow가 확장성이 높고 신뢰할 수 있습니다.
배포에서는 YAML 파일을 사용하여 사양을 제공하여 KafkaConnect 리소스를 생성합니다.
AMQ Streams는 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.
-
examples/connect/kafka-connect.yaml
절차
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에는 준비되거나 예상된 복제본 수가 표시됩니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.4.2. 여러 인스턴스에 대한 Kafka Connect 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect의 여러 인스턴스를 실행하는 경우 다음 구성 속성의 기본 구성을 변경해야 합니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect
spec:
# ...
config:
group.id: connect-cluster
offset.storage.topic: connect-cluster-offsets
config.storage.topic: connect-cluster-configs
status.storage.topic: connect-cluster-status
# ...
# ...
세 항목의 값은 동일한 group.id 가 있는 모든 Kafka Connect 인스턴스에 대해 동일해야 합니다.
기본 설정을 변경하지 않으면 동일한 Kafka 클러스터에 연결하는 각 Kafka Connect 인스턴스가 동일한 값으로 배포됩니다. 실제로 모든 인스턴스가 클러스터에서 실행되고 동일한 주제를 사용하도록 연결된 것입니다.
여러 Kafka Connect 클러스터가 동일한 주제를 사용하려고 하면 Kafka Connect가 예상대로 작동하지 않고 오류를 생성합니다.
여러 Kafka Connect 인스턴스를 실행하려면 각 인스턴스에 대해 이러한 속성의 값을 변경합니다.
6.4.3. 커넥터 추가 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect는 커넥터를 사용하여 다른 시스템과 통합하여 데이터를 스트리밍합니다. 커넥터는 다음 유형 중 하나일 수 있는 Kafka Connector 클래스의 인스턴스입니다.
- 소스 커넥터
- 소스 커넥터는 외부 시스템에서 데이터를 가져와서 메시지로 Kafka에 제공하는 런타임 엔티티입니다.
- 싱크 커넥터
- 싱크 커넥터는 Kafka 주제에서 메시지를 가져와서 외부 시스템에 제공하는 런타임 엔티티입니다.
Kafka Connect는 플러그인 아키텍처를 사용하여 커넥터에 대한 구현 아티팩트를 제공합니다. 플러그인을 사용하면 다른 시스템에 연결하고 데이터를 조작할 수 있는 추가 구성을 제공할 수 있습니다. 플러그인에는 커넥터 및 기타 구성 요소(예: 데이터 변환기 및 변환)가 포함됩니다. 커넥터는 특정 유형의 외부 시스템에서 작동합니다. 각 커넥터는 해당 구성의 스키마를 정의합니다. Kafka Connect에 구성을 제공하여 Kafka Connect 내에서 커넥터 인스턴스를 생성합니다. 그런 다음 커넥터 인스턴스는 시스템 간에 데이터를 이동하기 위한 일련의 작업을 정의합니다.
다음 방법 중 하나로 Kafka Connect에 커넥터 플러그인을 추가합니다.
- 플러그인이 자동으로 새 컨테이너 이미지를 빌드하도록 Kafka Connect 구성
- 기본 Kafka Connect 이미지에서 Docker 이미지를 생성 (수동적으로 또는 연속 통합 사용)
컨테이너 이미지에 플러그인을 추가한 후에는 다음과 같은 방법으로 커넥터 인스턴스를 시작, 중지 및 관리할 수 있습니다.
이러한 옵션을 사용하여 새 커넥터 인스턴스를 만들 수도 있습니다.
6.4.3.1. 커넥터 플러그인을 사용하여 새 컨테이너 이미지 자동으로 빌드 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams가 추가 커넥터를 사용하여 새 컨테이너 이미지를 자동으로 빌드하도록 Kafka Connect를 구성합니다. KafkaConnect 사용자 정의 리소스의 .spec.build.plugins 속성을 사용하여 커넥터 플러그인을 정의합니다. AMQ Streams는 커넥터 플러그인을 자동으로 다운로드하여 새 컨테이너 이미지에 추가합니다. 컨테이너는 .spec.build.output 에 지정된 컨테이너 리포지토리로 푸시되고 Kafka Connect 배포에 자동으로 사용됩니다.
사전 요구 사항
- Cluster Operator를 배포해야 합니다.
- 컨테이너 레지스트리.
이미지를 푸시, 저장 및 가져올 수 있는 자체 컨테이너 레지스트리를 제공해야 합니다. AMQ Streams는 프라이빗 컨테이너 레지스트리 및 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: debezium-postgres-connector artifacts: - type: tgz url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-postgres/2.1.3.Final/debezium-connector-postgres-2.1.3.Final-plugin.tar.gz sha512sum: c4ddc97846de561755dc0b021a62aba656098829c70eb3ade3b817ce06d852ca12ae50c0281cc791a5a131cb7fc21fb15f4b8ee76c6cae5dd07f9c11cb7c6e79 - name: camel-telegram artifacts: - type: tgz url: https://repo.maven.apache.org/maven2/org/apache/camel/kafkaconnector/camel-telegram-kafka-connector/0.11.5/camel-telegram-kafka-connector-0.11.5-package.tar.gz sha512sum: d6d9f45e0d1dbfcc9f6d1c7ca2046168c764389c78bc4b867dab32d24f710bb74ccf2a007d7d7a8af2dfca09d9a52ccbc2831fc715c195a3634cca055185bd91 #...리소스를 생성하거나 업데이트합니다.
$ oc apply -f <kafka_connect_configuration_file>- 새 컨테이너 이미지가 빌드될 때까지 기다린 후 Kafka Connect 클러스터가 배포될 때까지 기다립니다.
-
Kafka Connect REST API 또는
KafkaConnector사용자 정의 리소스를 사용하여 사용자가 추가한 커넥터 플러그인을 사용합니다.
6.4.3.2. Kafka Connect 기본 이미지에서 커넥터 플러그인을 사용하여 새 컨테이너 이미지 빌드 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect 기본 이미지에서 커넥터 플러그인을 사용하여 사용자 지정 Docker 이미지를 /opt/kafka/plugins 디렉터리에 추가합니다.
Red Hat Ecosystem Catalog 의 Kafka 컨테이너 이미지를 기본 이미지로 사용하여 추가 커넥터 플러그인으로 자체 사용자 지정 이미지를 생성할 수 있습니다.
시작 시 Kafka Connect의 AMQ Streams 버전은 /opt/kafka/plugins 디렉터리에 포함된 타사 커넥터 플러그인을 로드합니다.
사전 요구 사항
절차
registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0을 기본 이미지로 사용하여 새Dockerfile을 생성합니다.FROM registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 USER root:root COPY ./my-plugins/ /opt/kafka/plugins/ USER 1001plugins 파일 예
$ 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.4.3.3. KafkaConnector 리소스 배포 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 배포하여 커넥터를 관리합니다. KafkaConnector 사용자 정의 리소스는 Cluster Operator의 커넥터 관리에 OpenShift 네이티브 접근 방식을 제공합니다. Kafka Connect REST API와 마찬가지로 커넥터를 관리하기 위해 HTTP 요청을 보낼 필요가 없습니다. 해당 KafkaConnector 리소스를 업데이트한 다음 업데이트를 적용하여 실행 중인 커넥터 인스턴스를 관리합니다. Cluster Operator는 실행 중인 커넥터 인스턴스의 구성을 업데이트합니다. 해당 KafkaConnector 를 삭제하여 커넥터를 제거합니다.
KafkaConnector 리소스를 연결하는 Kafka Connect 클러스터와 동일한 네임스페이스에 배포해야 합니다.
이 절차에 표시된 구성에서 autoRestart 속성은 true 로 설정됩니다. 이를 통해 실패한 커넥터 및 작업을 자동으로 다시 시작할 수 있습니다. 재시작 횟수는 최대 7개까지 수행되며, 이 후에는 수동으로 다시 시작해야 합니다. KafkaConnector 리소스에 커넥터 를 다시 시작하거나 커넥터 작업을 수동으로 다시 시작하도록 주석을 답니다.
커넥터 예
자체 커넥터를 사용하거나 AMQ Streams에서 제공하는 예제를 시도할 수 있습니다. Apache Kafka 3.1.0까지 예제 파일 커넥터 플러그인이 Apache Kafka에 포함되었습니다. Apache Kafka의 3.1.1 및 3.2.0 릴리스에서 시작하여 다른 커넥터와 함께 예제를 플러그인 경로에 추가해야 합니다.
AMQ Streams는 예제 파일 커넥터 플러그인에 대한 KafkaConnector 구성 파일 (examples/connect/source-connector.yaml) 예제를 제공하여 KafkaConnector 리소스로 다음 커넥터 인스턴스를 생성합니다.
-
Kafka 라이센스 파일(소스)에서 각 행을 읽고 해당 데이터를 단일 Kafka 항목에 메시지로 기록하는 instance입니다.
-
Kafka 주제에서 메시지를 읽고 메시지를 임시 파일(스케크)에 쓰는 instance입니다.
이 절차에서는 예제 파일을 사용하여 커넥터를 생성합니다.
예제 커넥터는 프로덕션 환경에서 사용하기 위한 것이 아닙니다.
사전 요구 사항
- Kafka Connect 배포
- Cluster Operator가 실행 중입니다.
절차
다음 방법 중 하나로 Kafka Connect에
ScanSettingConnector 플러그인을 추가합니다.SourceConnector및 ScanSettingSink- 플러그인이 자동으로 새 컨테이너 이미지를 빌드하도록 Kafka Connect 구성
- 기본 Kafka Connect 이미지에서 Docker 이미지를 생성 (수동적으로 또는 연속 통합 사용)
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파일을 편집합니다.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
- 실패한 커넥터 및 작업의 자동 재시작을 활성화합니다.
- 6
- 커넥터 구성은 키-값 쌍으로 설정됩니다.
- 7
- 이 예제 소스 커넥터 구성은
/opt/kafka/LICENSE파일에서 데이터를 읽습니다. - 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 속성에 정의되어 있습니다.
ECDHE SourceConnector 및 ECDHESinkConnector 클래스는 Kafka Connect REST API와 동일한 구성 옵션을 지원합니다. 기타 커넥터는 다양한 구성 옵션을 지원합니다.
| 이름 | 유형 | 기본값 | 설명 |
|---|---|---|---|
|
| 문자열 | null | 메시지를 작성할 소스 파일입니다. 지정하지 않으면 표준 입력이 사용됩니다. |
|
| list | null | 데이터를 게시하는 Kafka 주제입니다. |
| 이름 | 유형 | 기본값 | 설명 |
|---|---|---|---|
|
| 문자열 | null | 메시지를 작성할 대상 파일입니다. 지정하지 않으면 표준 출력이 사용됩니다. |
|
| list | null | 데이터를 읽을 하나 이상의 Kafka 주제입니다. |
|
| 문자열 | null | 데이터를 읽을 하나 이상의 Kafka 주제와 일치하는 정규식입니다. |
6.4.3.4. 커넥터 수동 다시 시작 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 restart 주석을 사용하여 커넥터 재시작을 수동으로 트리거합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
절차
재시작하려는 Kafka 커넥터를 제어하는
KafkaConnector사용자 정의 리소스의 이름을 찾습니다.oc get KafkaConnectorOpenShift에서
KafkaConnector리소스에 주석을 달아 커넥터를 다시 시작합니다.oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart=truerestart주석은true로 설정됩니다.다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다).
조정 프로세스에서 주석이 감지된 한 Kafka 커넥터가 재시작됩니다. Kafka Connect에서 재시작 요청을 수락하면 주석이
KafkaConnector사용자 정의 리소스에서 제거됩니다.
6.4.3.5. Kafka 커넥터 작업 수동 다시 시작 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 사용하여 커넥터를 관리하는 경우 restart-task 주석을 사용하여 커넥터 작업 재시작을 수동으로 트리거합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
절차
재시작하려는 Kafka 커넥터 작업을 제어하는
KafkaConnector사용자 정의 리소스의 이름을 찾습니다.oc get KafkaConnectorKafkaConnector사용자 정의 리소스에서 재시작할 작업의 ID를 찾습니다. 작업 ID는 0부터 시작하여 음수가 아닌 정수입니다.oc describe KafkaConnector <kafka_connector_name>OpenShift에서
KafkaConnector리소스에 주석을 달아 ID를 사용하여 커넥터 작업을 다시 시작합니다.oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart-task=0이 예에서는 작업
0이 다시 시작됩니다.다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다).
조정 프로세스에서 주석을 탐지한 경우 Kafka 커넥터 작업이 재시작됩니다. Kafka Connect에서 재시작 요청을 수락하면 주석이
KafkaConnector사용자 정의 리소스에서 제거됩니다.
6.4.3.6. Kafka Connect API 노출 링크 복사링크가 클립보드에 복사되었습니다!
KafkaConnector 리소스를 사용하여 커넥터를 관리하는 대신 Kafka Connect REST API를 사용합니다. Kafka Connect REST API는 < connect_cluster_name> -connect-api:8083 에서 실행되는 서비스로 사용할 수 있습니다. 여기서 < connect_cluster_name >은 Kafka Connect 클러스터의 이름입니다. 이 서비스는 Kafka Connect 인스턴스를 생성할 때 생성됩니다.
Kafka Connect REST API에서 지원하는 작업은 Apache Kafka Connect API 설명서에 설명되어 있습니다.
strimzi.io/use-connector-resources 주석은 KafkaConnectors를 활성화합니다. KafkaConnect 리소스 구성에 주석을 적용한 경우 Kafka Connect API를 사용하려면 해당 주석을 제거해야 합니다. 그렇지 않으면 Kafka Connect REST API를 직접 사용하여 수행한 수동 변경 사항을 Cluster Operator에 의해 되돌립니다.
커넥터 구성을 JSON 오브젝트로 추가할 수 있습니다.
커넥터 구성 추가에 대한 curl 요청의 예
curl -X POST \
http://my-connect-cluster-connect-api:8083/connectors \
-H 'Content-Type: application/json' \
-d '{ "name": "my-source-connector",
"config":
{
"connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector",
"file": "/opt/kafka/LICENSE",
"topic":"my-topic",
"tasksMax": "4",
"type": "source"
}
}'
API는 OpenShift 클러스터 내에서만 액세스할 수 있습니다. OpenShift 클러스터 외부에서 실행되는 애플리케이션에서 Kafka Connect API에 액세스하도록 하려면 다음 기능 중 하나를 생성하여 수동으로 노출할 수 있습니다.
-
LoadBalancer또는NodePort유형 서비스 -
Ingress리소스(Kubernetes만 해당) - OpenShift 경로(OpenShift만 해당)
연결이 안전하지 않으므로 외부 액세스를 권장합니다.
서비스를 생성하기로 결정하는 경우 < connect_cluster_name> -connect-api 서비스의 선택기 에서 레이블을 사용하여 서비스에서 트래픽을 라우팅할 Pod를 구성합니다.
서비스에 대한 선택기 구성
# ...
selector:
strimzi.io/cluster: my-connect-cluster
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.4.3.7. Kafka Connect API에 대한 액세스 제한 링크 복사링크가 클립보드에 복사되었습니다!
인증되지 않은 작업 및 잠재적 보안 문제를 방지하기 위해 Kafka Connect API에 대한 액세스를 신뢰할 수 있는 사용자에게만 제한하는 것이 중요합니다. Kafka Connect API는 커넥터 구성을 변경하기 위한 광범위한 기능을 제공하므로 보안 예방 조치를 취하는 것이 더 중요합니다. Kafka Connect API에 액세스할 수 있는 사용자는 관리자가 안전한 것으로 가정할 수 있는 중요한 정보를 얻을 수 있습니다.
Kafka Connect REST API는 OpenShift 클러스터에 대한 인증 액세스 권한이 있고 호스트 이름/IP 주소 및 포트 번호를 포함하는 끝점 URL을 알고 있는 모든 사용자가 액세스할 수 있습니다.
예를 들어 조직이 Kafka Connect 클러스터 및 커넥터를 사용하여 중요한 데이터를 고객 데이터베이스에서 중앙 데이터베이스로 스트리밍한다고 가정합니다. 관리자는 구성 공급자 플러그인을 사용하여 고객 데이터베이스 및 중앙 데이터베이스 연결(예: 데이터베이스 연결 세부 정보 및 인증 자격 증명)과 관련된 중요한 정보를 저장합니다. 구성 공급자는 이 민감한 정보가 인증되지 않은 사용자에게 노출되는 것을 보호합니다. 그러나 Kafka Connect API에 액세스할 수 있는 사용자는 관리자의 동의 없이 고객 데이터베이스에 계속 액세스할 수 있습니다. 이는 페이크 데이터베이스를 설정하고 연결하도록 커넥터를 구성하여 수행할 수 있습니다. 그런 다음 고객 데이터베이스를 가리키도록 커넥터 구성을 수정하지만 데이터를 중앙 데이터베이스로 보내는 대신 페이크 데이터베이스로 전송합니다. 페이크 데이터베이스에 연결하도록 커넥터를 구성하면 구성 공급자에 안전하게 저장된 경우에도 고객 데이터베이스에 연결하는 데 필요한 로그인 세부 정보와 인증 정보가 가로채집니다.
KafkaConnector 사용자 정의 리소스를 사용하는 경우 기본적으로 OpenShift RBAC 규칙에서는 OpenShift 클러스터 관리자만 커넥터를 변경할 수 있습니다. AMQ Streams 리소스를 관리하기 위해 비 클러스터 관리자를 지정할 수도 있습니다. Kafka Connect 구성에서 KafkaConnector 리소스를 활성화하면 Kafka Connect REST API를 사용하여 직접 변경한 사항이 Cluster Operator에 의해 되돌아갑니다. KafkaConnector 리소스를 사용하지 않는 경우 기본 RBAC 규칙은 Kafka Connect API에 대한 액세스를 제한하지 않습니다. OpenShift RBAC를 사용하여 Kafka Connect REST API에 대한 직접 액세스를 제한하려면 KafkaConnector 리소스를 활성화하고 사용해야 합니다.
보안을 개선하기 위해 Kafka Connect API에 대한 다음 속성을 구성하는 것이 좋습니다.
org.apache.kafka.disallowed.login.modules(Kafka 3.4 이상)
org.apache.kafka.disallowed.login.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.4.3.8. 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.5. Kafka MirrorMaker 배포 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 하나 이상의 Kafka MirrorMaker 복제본을 배포하여 Kafka 클러스터 간에 데이터를 복제합니다. Kafka 파티션 복제 개념과 혼동하지 않도록 이 프로세스를 미러링이라고 합니다. MirrorMaker는 소스 클러스터의 메시지를 사용하여 해당 메시지를 대상 클러스터에 다시 게시합니다.
6.5.1. OpenShift 클러스터에 Kafka MirrorMaker 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Kafka MirrorMaker 클러스터를 OpenShift 클러스터에 배포하는 방법을 설명합니다.
배포에서는 YAML 파일을 사용하여 배포된 MirrorMaker 버전에 따라 KafkaMirrorMaker 또는 KafkaMirrorMaker2 리소스를 생성합니다.
Kafka MirrorMaker 1(문서의 MirrorMaker 라고도 함)은 Apache Kafka 3.0.0에서 더 이상 사용되지 않으며 Apache Kafka 4.0.0에서 제거됩니다. 결과적으로 Kafka MirrorMaker 1을 배포하는 데 사용되는 KafkaMirrorMaker 사용자 정의 리소스도 AMQ Streams에서 더 이상 사용되지 않습니다. Apache Kafka 4.0.0을 채택하면 KafkaMirrorMaker 리소스가 AMQ Streams에서 제거됩니다. 대체 방법으로 KafkaMirrorMaker2 사용자 정의 리소스를 IdentityReplicationPolicy 와 함께 사용합니다.
AMQ Streams는 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.
-
examples/mirror-maker/kafka-mirror-maker.yaml -
examples/mirror-maker/kafka-mirror-maker-2.yaml
사전 요구 사항
절차
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에는 준비되거나 예상된 복제본 수가 표시됩니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.6. Kafka 브리지 배포 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 하나 이상의 Kafka 브리지 복제본을 배포하여 HTTP API를 통해 Kafka 클러스터와 클라이언트 간에 데이터를 보냅니다.
6.6.1. OpenShift 클러스터에 Kafka 브리지 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Cluster Operator를 사용하여 Kafka Bridge 클러스터를 OpenShift 클러스터에 배포하는 방법을 설명합니다.
배포에서는 YAML 파일을 사용하여 사양을 제공하여 KafkaBridge 리소스를 생성합니다.
AMQ Streams는 구성 파일 예제 를 제공합니다. 이 절차에서는 다음 예제 파일을 사용합니다.
-
examples/bridge/kafka-bridge.yaml
사전 요구 사항
절차
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 브리지 클러스터의 이름입니다.Pod ID는 생성된 각 Pod를 식별합니다.
기본 배포를 사용하면 단일 Kafka 브리지 Pod를 설치합니다.
READY에는 준비되거나 예상된 복제본 수가 표시됩니다.STATUS가Running으로 표시되면 배포가 성공적으로 수행됩니다.
6.6.2. Kafka 브리지 서비스를 로컬 머신에 노출 링크 복사링크가 클립보드에 복사되었습니다!
포트 전달을 사용하여 http://localhost:8080 의 로컬 머신에 AMQ Streams Kafka Bridge 서비스를 노출합니다.
포트 전달은 개발 및 테스트 목적으로만 적합합니다.
절차
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 브리지 Pod의 포트 8080으로 전달됩니다.
6.6.3. OpenShift 외부에서 Kafka 브릿지 액세스 링크 복사링크가 클립보드에 복사되었습니다!
배포 후 AMQ Streams Kafka Bridge는 동일한 OpenShift 클러스터에서 실행되는 애플리케이션에서만 액세스할 수 있습니다. 이러한 애플리케이션은 < ;kafka_bridge_name> -bridge-service 서비스를 사용하여 API에 액세스합니다.
OpenShift 클러스터 외부에서 실행되는 애플리케이션에 Kafka Bridge에 액세스하도록 하려면 다음 기능 중 하나를 생성하여 수동으로 노출할 수 있습니다.
-
LoadBalancer또는NodePort유형 서비스 -
Ingress리소스(Kubernetes만 해당) - OpenShift 경로(OpenShift만 해당)
서비스를 생성하기로 결정하는 경우 < kafka_bridge_name> -bridge-service 서비스의 선택기 에서 레이블을 사용하여 서비스에서 트래픽을 라우팅할 Pod를 구성합니다.
# ...
selector:
strimzi.io/cluster: kafka-bridge-name
strimzi.io/kind: KafkaBridge
#...
- 1
- OpenShift 클러스터에서 Kafka 브리지 사용자 정의 리소스의 이름입니다.
6.7. AMQ Streams Operator의 다른 독립 실행형 배포 옵션 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator 및 User Operator의 독립 실행형 배포를 수행할 수 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터를 사용하는 경우 이러한 Operator의 독립 실행형 배포를 고려하십시오.
OpenShift에 Operator를 배포합니다. Kafka는 OpenShift 외부에서 실행할 수 있습니다. 예를 들어 Kafka를 관리 서비스로 사용할 수 있습니다. Kafka 클러스터의 주소와 일치하도록 독립 실행형 Operator의 배포 구성을 조정합니다.
6.7.1. 독립 실행형 주제 Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 주제 관리를 위해 Topic Operator를 독립 실행형 구성 요소로 배포하는 방법을 설명합니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 Topic Operator를 사용할 수 있습니다.
독립 실행형 배포는 모든 Kafka 클러스터에서 작동할 수 있습니다.
독립 실행형 배포 파일은 AMQ Streams에서 제공됩니다. 05-Deployment-strimzi-topic-operator.yaml 배포 파일을 사용하여 Topic Operator를 배포합니다. Kafka 클러스터에 연결하는 데 필요한 환경 변수를 추가하거나 설정합니다.
주제 Operator는 단일 네임스페이스에서 KafkaTopic 리소스를 감시합니다. Topic Operator 구성에서 조사할 네임스페이스와 Kafka 클러스터에 대한 연결을 지정합니다. 단일 Topic Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임스페이스는 하나의 Topic Operator에서만 조사해야 합니다. 둘 이상의 Topic Operator를 사용하려면 각 네임스페이스를 모니터링하도록 구성합니다. 이렇게 하면 여러 Kafka 클러스터가 있는 Topic Operator를 사용할 수 있습니다.
사전 요구 사항
Topic Operator가 연결할 Kafka 클러스터를 실행하고 있습니다.
독립 실행형 Topic Operator가 연결에 맞게 올바르게 구성된 경우 Kafka 클러스터는 베어 메탈 환경, 가상 머신 또는 관리형 클라우드 애플리케이션 서비스에서 실행될 수 있습니다.
절차
install/topic-operator/05-Deployment-strimzi-topic-operator.yaml독립 실행형 배포 파일에서env속성을 편집합니다.독립 실행형 주제 Operator 배포 구성의 예
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_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_ZOOKEEPER_CONNECT4 value: my-cluster-zookeeper-client:2181 - name: STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS5 value: "18000" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS6 value: "120000" - name: STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS7 value: "6" - name: STRIMZI_LOG_LEVEL8 value: INFO - name: STRIMZI_TLS_ENABLED9 value: "false" - name: STRIMZI_JAVA_OPTS10 value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES11 value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA12 value: "false" - name: STRIMZI_TLS_AUTH_ENABLED13 value: "false" - name: STRIMZI_SASL_ENABLED14 value: "false" - name: STRIMZI_SASL_USERNAME15 value: "admin" - name: STRIMZI_SASL_PASSWORD16 value: "password" - name: STRIMZI_SASL_MECHANISM17 value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL18 value: "SSL"- 1
KafkaTopic리소스를 조사할 Topic Operator의 OpenShift 네임스페이스입니다. Kafka 클러스터의 네임스페이스를 지정합니다.- 2
- Kafka 클러스터의 모든 브로커를 검색하고 연결하는 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 중단된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
- 3
- Topic Operator에서 관리하는
KafkaTopic리소스를 식별하는 레이블입니다. Kafka 클러스터의 이름이 될 필요는 없습니다.KafkaTopic리소스에 할당된 레이블일 수 있습니다. 둘 이상의 Topic Operator를 배포하는 경우 레이블은 각각에 대해 고유해야 합니다. 즉, Operator는 동일한 리소스를 관리할 수 없습니다. - 4
- ZooKeeper 클러스터에 연결할 주소의 호스트 및 포트 쌍입니다. Kafka 클러스터가 사용 중인 것과 동일한 ZooKeeper 클러스터여야 합니다.
- 5
- ZooKeeper 세션 시간 초과(밀리초)입니다. 기본값은
18000(18초)입니다. - 6
- 정기적인 조정 간격(밀리초)입니다. 기본값은
120000(2분)입니다. - 7
- Kafka에서 주제 메타데이터를 가져오는 시도 횟수입니다. 각 시도 사이의 시간은 지수 백오프로 정의됩니다. 파티션 또는 복제본 수로 인해 주제 생성에 시간이 더 걸리면 이 값을 늘리는 것이 좋습니다. 기본값은
6번 시도입니다. - 8
- 로깅 메시지를 출력하는 수준입니다. 수준을
ERROR,WARNING,INFO,DEBUG,TRACE로 설정할 수 있습니다. - 9
- Kafka 브로커와의 암호화된 통신에 대한 TLS 지원을 활성화합니다.
- 10
- (선택 사항) Topic Operator를 실행하는 JVM에서 사용하는 Java 옵션입니다.
- 11
- (선택 사항) Topic Operator에 설정된 디버깅(
-D) 옵션입니다. - 12
- (선택 사항) TLS가
STRIMZI_TLS_ENABLED를 통해 활성화되는 경우 신뢰 저장소 인증서 생성에 영향을 미칩니다. 이 환경 변수가 활성화된 경우 브로커는 TLS 인증서에 신뢰할 수 있는 공개 인증 기관을 사용해야 합니다. 기본값은false입니다. - 13
- (선택 사항) mTLS 인증을 위한 키 저장소 인증서를 생성합니다. 이 값을
false로 설정하면 mTLS를 사용하여 Kafka 브로커에 대한 클라이언트 인증이 비활성화됩니다. 기본값은true입니다. - 14
- (선택 사항) Kafka 브로커에 연결할 때 클라이언트 인증에 대해 SASL 지원을 활성화합니다. 기본값은
false입니다. - 15
- (선택 사항) 클라이언트 인증을 위한 SASL 사용자 이름입니다.
STRIMZI_SASL_ENABLED를 통해 SASL이 활성화된 경우에만 필수 항목입니다. - 16
- (선택 사항) 클라이언트 인증을 위한 SASL 암호입니다.
STRIMZI_SASL_ENABLED를 통해 SASL이 활성화된 경우에만 필수 항목입니다. - 17
- (선택 사항) 클라이언트 인증을 위한 SASL 메커니즘입니다.
STRIMZI_SASL_ENABLED를 통해 SASL이 활성화된 경우에만 필수 항목입니다. 값을plain,scram-sha-256또는scram-sha-512로 설정할 수 있습니다. - 18
- (선택 사항) Kafka 브로커와의 통신에 사용되는 보안 프로토콜입니다. 기본값은 "PLAINTEXT"입니다. 이 값을
PLAINTEXT,SSL,SASL_PLAINTEXT,SASL_SSL로 설정할 수 있습니다.
-
공개 인증 기관의 인증서를 사용하는 Kafka 브로커에 연결하려면
STRIMZI_ECDHELIC_CA를true로 설정합니다. 이 속성을true로 설정합니다(예: Amazon AWS MSK 서비스를 사용하는 경우). 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 create -f install/topic-operator배포 상태를 확인합니다.
oc get deployments출력에 배포 이름과 준비 상태가 표시됩니다.
NAME READY UP-TO-DATE AVAILABLE strimzi-topic-operator 1/1 1 1READY에는 준비되거나 예상된 복제본 수가 표시됩니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
6.7.2. 독립 실행형 사용자 Operator 배포 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 사용자 관리를 위한 독립 실행형 구성 요소로 User Operator를 배포하는 방법을 설명합니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터와 함께 독립 실행형 User Operator를 사용할 수 있습니다.
독립 실행형 배포는 모든 Kafka 클러스터에서 작동할 수 있습니다.
독립 실행형 배포 파일은 AMQ Streams에서 제공됩니다. 05-Deployment-strimzi-user-operator.yaml 배포 파일을 사용하여 User Operator를 배포합니다. Kafka 클러스터에 연결하는 데 필요한 환경 변수를 추가하거나 설정합니다.
User Operator는 단일 네임스페이스에서 KafkaUser 리소스를 감시합니다. User Operator 구성에서 조사할 네임스페이스와 Kafka 클러스터에 대한 연결을 지정합니다. 단일 User Operator는 단일 네임스페이스를 조사할 수 있습니다. 하나의 네임스페이스는 User Operator 한 개만 조사해야 합니다. User Operator를 두 개 이상 사용하려면 각각 다른 네임스페이스를 조사하도록 구성합니다. 이렇게 하면 여러 Kafka 클러스터가 있는 User Operator를 사용할 수 있습니다.
사전 요구 사항
User Operator가 연결할 Kafka 클러스터를 실행하고 있습니다.
독립 실행형 User Operator가 연결에 맞게 올바르게 구성된 경우 Kafka 클러스터는 베어 메탈 환경, 가상 머신 또는 관리형 클라우드 애플리케이션 서비스에서 실행될 수 있습니다.
절차
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 - name: STRIMZI_KRAFT_ENABLED20 value: "false"- 1
KafkaUser리소스를 조사할 User Operator의 OpenShift 네임스페이스입니다. 하나의 네임스페이스만 지정할 수 있습니다.- 2
- Kafka 클러스터의 모든 브로커를 검색하고 연결하는 부트스트랩 브로커 주소의 호스트 및 포트 쌍입니다. 서버가 중단된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 브로커 주소를 지정합니다.
- 3
- mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA(인증 기관)의 공개 키(
ca.crt) 값이 포함된 OpenShiftSecret입니다. - 4
- mTLS 인증을 위해 새 사용자 인증서에 서명하는 CA의 개인 키(
ca.key) 값이 포함된 OpenShiftSecret - 5
- User Operator가 관리하는
KafkaUser리소스를 식별하는 레이블입니다. Kafka 클러스터의 이름이 될 필요는 없습니다.KafkaUser리소스에 할당된 레이블일 수 있습니다. 둘 이상의 User Operator를 배포하는 경우 레이블은 각각에 대해 고유해야 합니다. 즉, Operator는 동일한 리소스를 관리할 수 없습니다. - 6
- 정기적인 조정 간격(밀리초)입니다. 기본값은
120000(2분)입니다. - 7
- 컨트롤러 이벤트 큐의 크기입니다. 대기열 크기는 User Operator가 작동할 것으로 예상되는 최대 사용자 수만큼 커야 합니다. 기본값은
1024입니다. - 8
- 사용자 조정을 위한 작업자 풀의 크기입니다. 더 큰 풀에는 더 많은 리소스가 필요할 수 있지만 더 많은
KafkaUser리소스를 처리할 수도 있습니다. 기본값은50입니다. - 9
- Kafka Admin API 및 OpenShift 작업에 대한 작업자 풀의 크기입니다. 더 큰 풀에는 더 많은 리소스가 필요할 수 있지만 더 많은
KafkaUser리소스도 처리합니다. 기본값은4입니다. - 10
- 로깅 메시지를 출력하는 수준입니다. 수준을
ERROR,WARNING,INFO,DEBUG,TRACE로 설정할 수 있습니다. - 11
- 가비지 컬렉션(GC) 로깅을 활성화합니다. 기본값은
true입니다. - 12
- CA의 유효 기간입니다. 기본값은
365일입니다. - 13
- CA의 갱신 기간입니다. 갱신 기간은 현재 인증서의 만료 날짜에서 역으로 측정됩니다. 기본값은 이전 인증서가 만료되기 전에 인증서 갱신을 시작하는
30일입니다. - 14
- (선택 사항) User Operator를 실행하는 JVM에서 사용하는 Java 옵션입니다.
- 15
- (선택 사항) User Operator에 설정된 디버깅(
-D) 옵션 - 16
- (선택 사항) User Operator가 생성한 OpenShift 시크릿의 이름에 대한 접두사입니다.
- 17
- (선택 사항) Kafka 클러스터가 Kafka Admin API를 사용하여 권한 부여 ACL 규칙 관리를 지원하는지 여부를 나타냅니다.
false로 설정하면 User Operator는간단한권한 부여 ACL 규칙이 있는 모든 리소스를 거부합니다. 이는 Kafka 클러스터 로그에서 불필요한 예외를 방지하는 데 도움이 됩니다. 기본값은true입니다. - 18
- (선택 사항) 만료 사용자 인증서가 갱신되는 동안 유지 관리 시간 창을 정의하는 Cron 표현식의 반 연속으로 구분된 목록입니다.
- 19
- (선택 사항) User Operator가 속성 형식으로 사용하는 Kafka 관리자 클라이언트를 구성하기 위한 구성 옵션입니다.
- 20
- (선택 사항) User Operator가 연결하는 Kafka 클러스터가 ZooKeeper 대신 KRaft를 사용하고 있는지 여부를 나타냅니다. Kafka 클러스터가 KRaft를 사용하는 경우 이 변수를
true로 설정합니다. 기본값은false입니다. KRaft 클러스터에서 실행할 때 일부 기능을 사용할 수 없습니다. 예를 들어, 현재 Apache Kafka에서 지원하는 SCRAM-SHA-512 사용자 관리는 비활성화되어 있습니다.
Kafka 클러스터에 연결하는 데 mTLS를 사용하는 경우 연결을 인증하는 데 사용되는 시크릿을 지정합니다. 그렇지 않으면 다음 단계로 이동합니다.
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에는 준비되거나 예상된 복제본 수가 표시됩니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
7장. Kafka 클러스터에 대한 클라이언트 액세스 설정 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams를 배포한 후 Kafka 클러스터에 대한 클라이언트 액세스를 설정할 수 있습니다. 배포를 확인하려면 예제 생산자 및 소비자 클라이언트를 배포할 수 있습니다. 또는 OpenShift 클러스터 내부 또는 외부에서 클라이언트 액세스를 제공하는 리스너를 생성합니다.
7.1. 예제 클라이언트 배포 링크 복사링크가 클립보드에 복사되었습니다!
생산자 및 소비자 클라이언트 예제를 배포하여 메시지를 보내고 받습니다. 이러한 클라이언트를 사용하여 AMQ Streams 배포를 확인할 수 있습니다.
사전 요구 사항
- Kafka 클러스터는 클라이언트에서 사용할 수 있습니다.
절차
Kafka 생산자를 배포합니다.
oc run kafka-producer -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic- 생산자가 실행 중인 콘솔에 메시지를 입력합니다.
- Enter 를 눌러 메시지를 보냅니다.
Kafka 소비자를 배포합니다.
oc run kafka-consumer -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic --from-beginning- 소비자 콘솔에 들어오는 메시지가 표시되는지 확인합니다.
7.2. Kafka 브로커에 연결하도록 리스너 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커에 대한 클라이언트 연결에 리스너를 사용합니다. AMQ Streams는 Kafka 리소스를 통해 리스너를 구성하는 속성과 함께 일반 GenericKafkaListener 스키마를 제공합니다. GenericKafkaListener 는 리스너 구성에 유연한 접근 방식을 제공합니다. OpenShift 클러스터 외부 연결을 위해 OpenShift 클러스터 또는 외부 리스너 내에서 연결하기 위해 속성을 지정하여 내부 리스너를 구성할 수 있습니다.
리스너 구성에서 Kafka를 노출할 연결 유형을 지정합니다. 선택한 유형은 요구 사항 및 환경 및 인프라에 따라 다릅니다. 다음 리스너 유형이 지원됩니다.
- 내부 리스너
-
내부와 동일한 OpenShift 클러스터 내에서 연결 -
broker별
ClusterIP서비스를 사용하여 Kafka를 노출하는cluster-ip
-
- 외부 리스너
-
OpenShift
노드에서 포트를사용하는 NodePort -
LoadBalancer를 사용하여 로드 밸런서 서비스를 사용 -
Kubernetes
Ingress및 Kubernetes용 Ingress NGINX Controller를 사용하기 위한 Ingress(Kubernetes 만 해당) -
OpenShift
및 기본 HAProxy 라우터(OpenShift 전용)를 사용하는 경로경로
-
OpenShift
OpenShift에서 수신 을 사용하지 말고 대신 경로 유형을 사용합니다. Ingress NGINX 컨트롤러는 Kubernetes에서만 사용하기 위한 것입니다. 경로 유형은 OpenShift에서만 지원됩니다.
내부 유형 리스너 구성은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. OpenShift 네트워크에 외부 네트워크에 참여할 수 있습니다. 이 경우 OpenShift 서비스 DNS 도메인(일반적으로 않도록 .cluster.local)을 사용하지내부 유형 리스너를 구성할 수 있습니다. broker ClusterIP 서비스를 기반으로 Kafka 클러스터를 노출하는 cluster-ip 유형의 리스너를 구성할 수도 있습니다. 이는 헤드리스 서비스를 통해 라우팅할 수 없거나 사용자 정의 액세스 메커니즘을 통합하려는 경우 유용한 옵션입니다. 예를 들어 특정 Ingress 컨트롤러 또는 OpenShift Gateway API에 대해 자체 유형의 외부 리스너를 빌드할 때 이 리스너를 사용할 수 있습니다.
외부 리스너는 다른 인증 메커니즘이 필요한 네트워크에서 Kafka 클러스터에 대한 액세스를 처리합니다. 로드 밸런서 또는 경로와 같은 지정된 연결 메커니즘을 사용하여 OpenShift 환경 외부의 클라이언트 액세스를 위해 외부 리스너를 구성할 수 있습니다. 예를 들어 노드 포트가 더 나은 옵션을 제공하는 베어 메탈과 같은 특정 인프라에는 로드 밸런서가 적합하지 않을 수 있습니다.
각 리스너는 Kafka 리소스에서 배열로 정의됩니다.
리스너 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
listeners:
- name: plain
port: 9092
type: internal
tls: false
configuration:
useServiceDnsDomain: true
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external
port: 9094
type: route
tls: true
configuration:
brokerCertChainAndKey:
secretName: my-secret
certificate: my-certificate.crt
key: my-key.key
# ...
이름과 포트가 고유한 경우 필요에 따라 리스너를 구성할 수 있습니다. 인증을 사용하여 보안 연결을 위해 리스너를 구성할 수도 있습니다.
각 연결 유형의 장단점에 대해 자세히 알아보려면 Strimzi에서 Apache Kafka 액세스를 참조하십시오.
외부 리스너를 사용하는 동안 Kafka 클러스터를 스케일링하는 경우 모든 Kafka 브로커의 롤링 업데이트가 트리거될 수 있습니다. 구성에 따라 달라집니다.
7.3. 리스너를 사용하여 Kafka 클러스터에 클라이언트 액세스 설정 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터의 주소를 사용하여 동일한 OpenShift 클러스터의 클라이언트에 대한 액세스를 제공하거나 다른 OpenShift 네임스페이스 또는 OpenShift 외부의 클라이언트에 대한 외부 액세스를 제공할 수 있습니다. 다음 절차에서는 OpenShift 외부 또는 다른 OpenShift 클러스터에서 Kafka 클러스터에 대한 클라이언트 액세스를 구성하는 방법을 설명합니다.
Kafka 리스너는 Kafka 클러스터에 대한 액세스를 제공합니다. 클라이언트 액세스는 다음 구성을 사용하여 보호됩니다.
-
외부 리스너는 TLS 암호화 및 mTLS 인증 및 Kafka
간단한인증이 활성화된 Kafka 클러스터에 대해 구성됩니다. -
KafkaUser는 mTLS 인증 및간단한권한 부여를 위해 정의된 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로 사용자를 인증할 수 없습니다.
AMQ Streams Operator는 구성 프로세스를 자동화하고 인증에 필요한 인증서를 생성합니다.
- Cluster Operator는 리스너를 생성하고 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정하여 Kafka 클러스터와의 인증을 활성화합니다.
- User Operator는 선택한 인증 유형을 기반으로 클라이언트 및 클라이언트 인증에 사용되는 보안 자격 증명을 나타내는 사용자를 생성합니다.
클라이언트 구성에 인증서를 추가합니다.
이 절차에서는 Cluster Operator에서 생성한 CA 인증서가 사용되지만 자체 인증서를 설치하여 교체할 수 있습니다. 외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서를 사용하도록 리스너를 구성할 수도 있습니다.
인증서는 PEM(.crt) 및 PKCS #12(.p12) 형식으로 사용할 수 있습니다. 이 절차에서는 PEM 인증서를 사용합니다. X.509 형식의 인증서를 사용하는 클라이언트와 PEM 인증서를 사용합니다.
동일한 OpenShift 클러스터 및 네임스페이스의 내부 클라이언트의 경우 Pod 사양에 클러스터 CA 인증서를 마운트할 수 있습니다. 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.
사전 요구 사항
- Kafka 클러스터는 OpenShift 클러스터 외부에서 실행되는 클라이언트에서 연결할 수 있습니다.
- Cluster Operator 및 User Operator가 클러스터에서 실행 중입니다.
절차
Kafka 리스너를 사용하여 Kafka 클러스터를 구성합니다.
- 리스너를 통해 Kafka 브로커에 액세스하는 데 필요한 인증을 정의합니다.
Kafka 브로커에서 인증을 활성화합니다.
리스너 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... listeners:1 - name: external2 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이고 포트 9404 및 9999를 제외하고 이미 Prometheus 및 10.0.0.1에 사용됩니다. 리스너 유형에 따라 포트 번호가 Kafka 클라이언트를 연결하는 포트 번호와 동일하지 않을 수 있습니다.
- 4
경로(OpenShift만), 로드 밸런서 ,노드 포트또는수신(Kubernetes만)로 지정된 외부 리스너 유형.내부 리스너는내부또는cluster-ip로 지정됩니다.- 5
- 필수 항목입니다. 리스너의 TLS 암호화입니다.
route및ingress유형 리스너의 경우true로 설정해야 합니다. mTLS 인증의 경우인증속성도 사용합니다. - 6
- 리스너의 클라이언트 인증 메커니즘. mTLS를 사용한 서버 및 클라이언트 인증의 경우
tls: true및authentication.type: tls를 지정합니다. - 7
- (선택 사항) 리스너 유형의 요구 사항에 따라 추가 리스너 구성을 지정할 수 있습니다.
- 8
- 권한 부여는
AclAuthorizerKafka 플러그인을 사용하는단순로 지정됩니다. - 9
- (선택 사항) 슈퍼 사용자는 ACL에 정의된 액세스 제한에 관계없이 모든 브로커에 액세스할 수 있습니다.
주의OpenShift 경로 주소는 Kafka 클러스터의 이름, 리스너의 이름 및 생성된 네임스페이스의 이름으로 구성됩니다. 예를 들면
my-cluster-kafka-listener1-bootstrap-myproject(CLUSTER-NAME-kafka-LISTENER-NAME -bootstrap-NAMESPACE)입니다.경로리스너 유형을 사용하는 경우 주소의 전체 길이가 최대 63자 제한을 초과하지 않도록 주의하십시오.
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를 확인하도록 신뢰 저장소 자격 증명으로 클라이언트를 구성합니다.
공용 클러스터 CA 인증서를 지정합니다.
신뢰 저장소 구성 예
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_TRUSTSTORE_CERTIFICATES_CONFIG, "<ca.crt_file_content>");SSL은 mTLS 인증에 대해 지정된 보안 프로토콜입니다. TLS를 통해 SCRAM-SHA-512 인증에 대해
SASL_SSL을 지정합니다. PEM은 신뢰 저장소의 파일 형식입니다.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>");키 저장소 인증서와 개인 키를 구성에 직접 추가합니다. 를 단일 줄 형식으로 추가합니다.
BEGINCERTIFICATE와ENDCERTIFICATE 구분자 사이에 줄 바꿈 문자(\n)로 시작합니다.\n을 사용하여 원래 인증서에서 각 행을 종료합니다.키 저장소 구성 예
props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "-----BEGIN CERTIFICATE----- \n<user_certificate_content_line_1>\n<user_certificate_content_line_n>\n-----END CERTIFICATE---"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "----BEGIN PRIVATE KEY-----\n<user_key_content_line_1>\n<user_key_content_line_n>\n-----END PRIVATE KEY-----");
7.4. 노드 포트를 사용하여 Kafka 액세스 링크 복사링크가 클립보드에 복사되었습니다!
노드 포트를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 AMQ Streams Kafka 클러스터에 액세스합니다.
브로커에 연결하려면 Kafka 부트스트랩 주소의 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.
이 절차에서는 기본 nodeport 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성을 추가합니다. 예를 들어 nodeport 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.
preferredNodePortAddressType- 노드 주소로 확인되는 첫 번째 주소 유형을 지정합니다.
externalTrafficPolicy- 서비스가 외부 트래픽을 노드 로컬 또는 클러스터 전체 엔드포인트로 라우팅하는지를 지정합니다.
nodePort- 부트스트랩 및 브로커 서비스에 할당된 노드 포트 번호를 덮어씁니다.
리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.
사전 요구 사항
- 실행 중인 Cluster Operator
이 프로세스에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너의 이름은 external 입니다.
절차
외부 리스너를 사용하여
nodeport유형으로Kafka리소스를 구성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external port: 9094 type: nodeport tls: true authentication: type: tls # ... # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>kafka 브로커의 ID를 확인하는 클러스터 CA 인증서가
my-cluster-cluster-ca-cert에 생성됩니다.각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해
NodePort유형 서비스가 생성됩니다.부트스트랩 및 브로커용으로 생성된 노드 포트 서비스
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external-0 NodePort 172.30.55.13 9094:31789/TCP my-cluster-kafka-external-1 NodePort 172.30.250.248 9094:30028/TCP my-cluster-kafka-external-2 NodePort 172.30.115.81 9094:32650/TCP my-cluster-kafka-external-bootstrap NodePort 172.30.30.23 9094:32650/TCP클라이언트 연결에 사용되는 부트스트랩 주소는
Kafka리소스의상태로전달됩니다.부트스트랩 주소의 상태 예
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready listeners: # ... - addresses: - host: ip-10-0-224-199.us-west-2.compute.internal port: 32650 bootstrapServers: 'ip-10-0-224-199.us-west-2.compute.internal:32650' certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external type: external observedGeneration: 2 # ...Kafka리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}' ip-10-0-224-199.us-west-2.compute.internal:32650클러스터 CA 인증서를 추출합니다.
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt브로커에 연결하도록 클라이언트를 구성합니다.
-
Kafka 클라이언트의 부트스트랩 호스트 및 포트를 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다. 예를 들어
ip-10-0-224-199.us-west-2.compute.internal:32650입니다. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.
클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.
-
Kafka 클라이언트의 부트스트랩 호스트 및 포트를 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다. 예를 들어
자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 CA를 추가할 필요가 없습니다.
7.5. 로드 밸런서를 사용하여 Kafka 액세스 링크 복사링크가 클립보드에 복사되었습니다!
로드 밸런서를 사용하여 OpenShift 클러스터 외부의 외부 클라이언트에서 AMQ Streams Kafka 클러스터에 액세스합니다.
브로커에 연결하려면 Kafka 부트스트랩 주소의 호스트 이름 및 포트 번호와 TLS 암호화에 사용되는 인증서를 지정합니다.
이 절차에서는 기본 로드 밸런서 리스너 구성을 보여줍니다. 리스너 속성을 사용하여 TLS 암호화(tls)를 활성화하고 클라이언트 인증 메커니즘(인증)을 지정할 수 있습니다. 구성 속성을 사용하여 추가 구성을 추가합니다. 예를 들어 로드 밸런서 리스너와 함께 다음 구성 속성을 사용할 수 있습니다.
loadBalancerSourceRanges- CIDR(Classless Inter-Domain Routing) 범위의 지정된 목록으로 트래픽을 제한합니다.
externalTrafficPolicy- 서비스가 외부 트래픽을 노드 로컬 또는 클러스터 전체 엔드포인트로 라우팅하는지를 지정합니다.
loadBalancerIP- 로드 밸런서를 생성할 때 특정 IP 주소를 요청합니다.
리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.
사전 요구 사항
- 실행 중인 Cluster Operator
이 프로세스에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너의 이름은 external 입니다.
절차
외부 리스너를 사용하여
loadbalancer유형으로Kafka리소스를 구성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external port: 9095 type: loadbalancer tls: true authentication: type: tls # ... # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>kafka 브로커의 ID를 확인하는 클러스터 CA 인증서도
my-cluster-cluster-ca-cert에도 생성됩니다.LoadBalancer유형 서비스 및 로드 밸런서는 각 Kafka 브로커와 외부 부트스트랩 서비스에 대해 생성됩니다.부트스트랩 및 브로커에 대해 생성된 LoadBalancer 서비스 및 로드 밸런서
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external-0 LoadBalancer 172.30.204.234 9095:30011/TCP my-cluster-kafka-external-1 LoadBalancer 172.30.164.89 9095:32544/TCP my-cluster-kafka-external-2 LoadBalancer 172.30.73.151 9095:32504/TCP my-cluster-kafka-external-bootstrap LoadBalancer 172.30.30.228 9095:30371/TCP NAME EXTERNAL-IP (loadbalancer) my-cluster-kafka-external-0 a8a519e464b924000b6c0f0a05e19f0d-1132975133.us-west-2.elb.amazonaws.com my-cluster-kafka-external-1 ab6adc22b556343afb0db5ea05d07347-611832211.us-west-2.elb.amazonaws.com my-cluster-kafka-external-2 a9173e8ccb1914778aeb17eca98713c0-777597560.us-west-2.elb.amazonaws.com my-cluster-kafka-external-bootstrap a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com클라이언트 연결에 사용되는 부트스트랩 주소는
Kafka리소스의상태로전달됩니다.부트스트랩 주소의 상태 예
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready listeners: # ... - addresses: - host: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com port: 9095 bootstrapServers: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9095 certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external type: external observedGeneration: 2 # ...클라이언트 연결에 사용되는 DNS 주소는 각 로드
밸런서 서비스의 상태로전파됩니다.부트스트랩 로드 밸런서의 상태 예
status: loadBalancer: ingress: - hostname: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com # ...Kafka리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}' a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9095클러스터 CA 인증서를 추출합니다.
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt브로커에 연결하도록 클라이언트를 구성합니다.
-
Kafka 클라이언트의 부트스트랩 호스트 및 포트를 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다. 예를 들어
a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9095. 추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.
클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.
-
Kafka 클라이언트의 부트스트랩 호스트 및 포트를 Kafka 클러스터에 연결할 부트스트랩 주소로 지정합니다. 예를 들어
자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 CA를 추가할 필요가 없습니다.
7.6. OpenShift 경로를 사용하여 Kafka 액세스 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 경로를 사용하여 OpenShift 클러스터 외부 클라이언트에서 AMQ Streams Kafka 클러스터에 액세스합니다.
경로를 사용하려면 Kafka 사용자 정의 리소스에서 경로 유형 리스너에 대한 구성을 추가합니다. 적용되면 구성이 외부 부트스트랩 및 클러스터의 각 브로커에 대한 전용 경로 및 서비스를 생성합니다. 클라이언트는 부트스트랩 서비스를 통해 브로커에 연결하도록 라우팅하는 부트스트랩 경로에 연결합니다. 그런 다음 연결마다 DNS 이름을 사용하여 설정되며, 이 이름은 브로커별 경로 및 서비스를 통해 클라이언트에서 브로커로 트래픽을 라우팅합니다.
브로커에 연결하려면 경로 부트스트랩 주소의 호스트 이름과 TLS 암호화에 사용되는 인증서를 지정합니다. 경로를 사용한 액세스의 경우 포트는 항상 443입니다.
OpenShift 경로 주소는 Kafka 클러스터의 이름, 리스너 이름 및 생성된 프로젝트의 이름으로 구성됩니다. 예를 들어 my-cluster-kafka-external-bootstrap-myproject (<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>)입니다. 주소의 전체 길이가 최대 63자 제한을 초과하지 않도록 주의하십시오.
이 절차에서는 기본 리스너 구성을 보여줍니다. TLS 암호화(tls)를 활성화해야 합니다. 클라이언트 인증 메커니즘(인증)을 지정할 수도 있습니다. 구성 속성을 사용하여 추가 구성을 추가합니다. 예를 들어 경로 리스너와 함께 호스트 구성 속성을 사용하여 부트스트랩 및 인수별 서비스에서 사용하는 호스트 이름을 지정할 수 있습니다.
리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.
TLS 패스스루
AMQ Streams에서 생성한 경로에 대해 TLS 패스스루가 활성화됩니다. Kafka는 TCP를 통해 바이너리 프로토콜을 사용하지만 경로는 HTTP 프로토콜에서 작동하도록 설계되었습니다. 경로를 통해 TCP 트래픽을 라우팅할 수 있도록 AMQ Streams는 SNI(Server Name Indication)를 사용하여 TLS 패스스루를 사용합니다.
SNI는 Kafka 브로커의 연결을 식별하고 전달하는 데 도움이 됩니다. passthrough 모드에서 TLS 암호화는 항상 사용됩니다. 연결이 브로커에 전달되므로 리스너는 수신 인증서가 아닌 내부 클러스터 CA에서 서명한 TLS 인증서를 사용합니다. 자체 리스너 인증서를 사용하도록 리스너를 구성하려면 brokerCertECDHEAndKey 속성을 사용합니다.
사전 요구 사항
- 실행 중인 Cluster Operator
이 프로세스에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너의 이름은 external 입니다.
절차
외부 리스너를 사용하여
경로유형으로Kafka리소스를 구성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external port: 9094 type: route tls: true1 authentication: type: tls # ... # ... zookeeper: # ...- 1
경로유형 리스너의 경우 TLS 암호화를 활성화해야 합니다(true).
리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>kafka 브로커의 ID를 확인하는 클러스터 CA 인증서가
my-cluster-cluster-ca-cert에 생성됩니다.각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해
ClusterIP유형 서비스가 생성됩니다.기본 OpenShift HAProxy 라우터를 사용하여 이를 노출하는 DNS 주소(host/port)를 사용하여 각 서비스에 대해
경로가생성됩니다.경로는 TLS 패스스루를 사용하여 사전 구성됩니다.
부트스트랩 및 브로커에 대해 생성된 경로
NAME HOST/PORT SERVICES PORT TERMINATION my-cluster-kafka-external-0 my-cluster-kafka-external-0-my-project.router.com my-cluster-kafka-external-0 9094 passthrough my-cluster-kafka-external-1 my-cluster-kafka-external-1-my-project.router.com my-cluster-kafka-external-1 9094 passthrough my-cluster-kafka-external-2 my-cluster-kafka-external-2-my-project.router.com my-cluster-kafka-external-2 9094 passthrough my-cluster-kafka-external-bootstrap my-cluster-kafka-external-bootstrap-my-project.router.com my-cluster-kafka-external-bootstrap 9094 passthrough클라이언트 연결에 사용되는 DNS 주소는 각 경로의
상태로전파됩니다.부트스트랩 경로의 상태 예
status: ingress: - host: >- my-cluster-kafka-external-bootstrap-my-project.router.com # ...대상 브로커를 사용하여 OpenSSL
s_client를 사용하여 포트 443에서 클라이언트-서버 TLS 연결을 확인합니다.openssl s_client -connect my-cluster-kafka-external-0-my-project.router.com:443 -servername my-cluster-kafka-external-0-my-project.router.com -showcerts서버 이름은 브로커에 연결을 전달하는 SNI입니다.
연결에 성공하면 브로커의 인증서가 반환됩니다.
브로커의 인증서
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0Kafka리소스의 상태에서 부트스트랩 서비스의 주소를 검색합니다.oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}' my-cluster-kafka-external-bootstrap-my-project.router.com:443주소는 클러스터 이름, 리스너 이름, 프로젝트 이름 및 라우터 도메인(이 예에서는
router.com)으로 구성됩니다.클러스터 CA 인증서를 추출합니다.
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt브로커에 연결하도록 클라이언트를 구성합니다.
- Kafka 클라이언트에서 Kafka 클러스터에 연결할 부트스트랩 주소로 부트스트랩 서비스 및 포트 443의 주소를 지정합니다.
추출된 인증서를 Kafka 클라이언트의 신뢰 저장소에 추가하여 TLS 연결을 구성합니다.
클라이언트 인증 메커니즘을 활성화한 경우 클라이언트에서도 구성해야 합니다.
자체 리스너 인증서를 사용하는 경우 클라이언트의 신뢰 저장소에 CA 인증서를 추가해야 하는지 확인합니다. 공용(외부) CA인 경우 일반적으로 CA를 추가할 필요가 없습니다.
8장. Kafka에 대한 보안 액세스 관리 링크 복사링크가 클립보드에 복사되었습니다!
각 클라이언트에 Kafka 브로커에 대한 액세스를 관리하여 Kafka 클러스터를 보호할 수 있습니다.
Kafka 브로커와 클라이언트 간의 보안 연결은 다음을 포함할 수 있습니다.
- 데이터 교환의 암호화
- ID를 증명하기 위한 인증
- 사용자가 실행하는 작업을 허용 또는 거부할 수 있는 권한 부여
이 장에서는 Kafka 브로커와 클라이언트 간의 보안 연결을 설정하는 방법과 함께 다음 섹션을 설명합니다.
- Kafka 클러스터 및 클라이언트에 대한 보안 옵션
- Kafka 브로커를 보호하는 방법
- OAuth 2.0 토큰 기반 인증 및 권한 부여에 대한 권한 부여 서버를 사용하는 방법
8.1. Kafka의 보안 옵션 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 리소스를 사용하여 Kafka 인증 및 권한 부여에 사용되는 메커니즘을 구성합니다.
8.1.1. 리스너 인증 링크 복사링크가 클립보드에 복사되었습니다!
리스너를 생성할 때 Kafka 브로커에 대한 클라이언트 인증을 구성합니다. Kafka 리소스에서 Kafka.spec.kafka.listeners.authentication 속성을 사용하여 리스너 인증 유형을 지정합니다.
OpenShift 클러스터 내부의 클라이언트의 경우 일반 (암호화 제외) 또는 tls 내부 리스너를 생성할 수 있습니다. 내부 리스너 유형은 헤드리스 서비스와 브로커 Pod에 지정된 DNS 이름을 사용합니다. 헤드리스 서비스의 대안으로, 각 브로커 ClusterIP 서비스를 사용하여 Kafka를 노출하는 내부 리스너의 cluster-ip 유형을 생성할 수도 있습니다. OpenShift 클러스터 외부의 클라이언트의 경우 외부 리스너를 생성하고 노드 포트, 로드 밸런서,수신 (Kubernetes만) 또는 경로 (OpenShift 전용)일 수 있는 연결 메커니즘을 지정합니다.
외부 클라이언트 연결의 구성 옵션에 대한 자세한 내용은 7장. Kafka 클러스터에 대한 클라이언트 액세스 설정 을 참조하십시오.
지원되는 인증 옵션:
- mTLS 인증 (TLS가 활성화된 리스너에서만)
- SCRAM-SHA-512 인증
- OAuth 2.0 토큰 기반 인증
- 사용자 정의 인증
선택하는 인증 옵션은 Kafka 브로커에 대한 클라이언트 액세스를 인증하는 방법에 따라 다릅니다.
사용자 지정 인증을 사용하기 전에 표준 인증 옵션을 살펴보십시오. 사용자 정의 인증은 모든 유형의 kafka 지원 인증을 허용합니다. 더 많은 유연성을 제공할 수 있지만 복잡성을 더할 수도 있습니다.
그림 8.1. Kafka 리스너 인증 옵션
리스너 인증 속성은 해당 리스너와 관련된 인증 메커니즘을 지정하는 데 사용됩니다.
인증 속성이 지정되지 않은 경우 리스너는 해당 리스너를 통해 연결하는 클라이언트를 인증하지 않습니다. 리스너는 인증 없이 모든 연결을 허용합니다.
KafkaUsers 를 관리하기 위해 User Operator를 사용할 때 인증을 구성해야 합니다.
다음 예제에서는 다음을 보여줍니다.
-
SCRAM-SHA-512 인증을 위해 구성된
일반리스너 -
mTLS 인증이 있는
tls리스너 -
mTLS 인증이 있는
외부리스너
각 리스너는 Kafka 클러스터 내에서 고유한 이름과 포트로 구성됩니다.
구독자 간 통신(9091 또는 9090) 및 메트릭(9404)을 위해 예약된 포트를 사용하도록 리스너를 구성할 수 없습니다.
리스너 인증 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
listeners:
- name: plain
port: 9092
type: internal
tls: true
authentication:
type: scram-sha-512
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external
port: 9094
type: loadbalancer
tls: true
authentication:
type: tls
# ...
8.1.1.1. mTLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
mTLS 인증은 항상 Kafka 브로커와 ZooKeeper Pod 간의 통신에 사용됩니다.
AMQ Streams는 TLS(Transport Layer Security)를 사용하여 상호 인증을 사용하거나 사용하지 않고 Kafka 브로커와 클라이언트 간에 암호화된 통신을 제공하도록 Kafka를 구성할 수 있습니다. 상호 또는 양방향 인증의 경우 서버와 클라이언트 모두 인증서를 제공합니다. mTLS 인증을 구성하면 브로커는 클라이언트(클라이언트 인증)를 인증하고 클라이언트는 브로커(서버 인증)를 인증합니다.
Kafka 리소스의 mTLS 리스너 구성에는 다음이 필요합니다.
-
TLS: true:TLS 암호화 및 서버 인증을 지정 -
authentication.type: tls: 클라이언트 인증 지정
Cluster Operator에 의해 Kafka 클러스터를 생성하면 <cluster _name>-cluster-ca-cert라는 이름으로 새 시크릿을 생성합니다. 보안에는 CA 인증서가 포함되어 있습니다. CA 인증서는 PEM 및 PKCS #12 형식입니다. Kafka 클러스터를 확인하려면 클라이언트 구성의 신뢰 저장소에 CA 인증서를 추가합니다. 클라이언트를 확인하려면 사용자 인증서 및 키를 클라이언트 구성의 키 저장소에 추가합니다. mTLS에 대한 클라이언트 구성에 대한 자세한 내용은 8.2.2절. “사용자 인증” 을 참조하십시오.
TLS 인증은 일반적으로 일방향이며 한 당사자가 다른 당사자의 ID를 인증합니다. 예를 들어 웹 브라우저와 웹 서버 간에 HTTPS를 사용하는 경우 브라우저는 웹 서버의 ID 증명을 가져옵니다.
8.1.1.2. SCRAM-SHA-512 인증 링크 복사링크가 클립보드에 복사되었습니다!
SCRAM(Salted Challenge Response Authentication Mechanism)은 암호를 사용하여 상호 인증을 설정할 수 있는 인증 프로토콜입니다. AMQ Streams는 암호화되지 않고 암호화된 클라이언트 연결 모두에서 인증을 제공하기 위해 SASL(Simple Authentication and Security Layer) SCRAM-SHA-512를 사용하도록 Kafka를 구성할 수 있습니다.
SCRAM-SHA-512 인증이 TLS 연결과 함께 사용되는 경우 TLS 프로토콜은 암호화를 제공하지만 인증에는 사용되지 않습니다.
SCRAM의 다음 속성을 사용하면 암호화되지 않은 연결에서도 SCRAM-SHA-512를 안전하게 사용할 수 있습니다.
- 암호는 통신 채널을 통해 명확하게 전송되지 않습니다. 대신 클라이언트와 서버는 인증 사용자의 암호를 알고 있음을 증명하기 위해 서로 어려움을 겪습니다.
- 서버와 클라이언트는 각각 인증 교환에 대한 새로운 과제를 생성합니다. 즉, 재생 공격에 대해 교환이 탄력적입니다.
KafkaUser.spec.authentication.type 이 scram-sha-512 로 구성된 경우 User Operator는 대문자 및 소문자 ASCII 문자 및 숫자로 구성된 임의의 12자 암호를 생성합니다.
8.1.1.3. 네트워크 정책 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 AMQ Streams는 Kafka 브로커에서 활성화된 모든 리스너에 대해 NetworkPolicy 리소스를 자동으로 생성합니다. 이 NetworkPolicy 를 사용하면 애플리케이션이 모든 네임스페이스의 리스너에 연결할 수 있습니다. 네트워크 정책을 리스너 구성의 일부로 사용합니다.
네트워크 수준에서 선택한 애플리케이션 또는 네임스페이스로만 리스너에 대한 액세스를 제한하려면 networkPolicyPeers 속성을 사용합니다. 각 리스너에는 다른 networkPolicyPeers 구성이 있을 수 있습니다. 네트워크 정책 피어에 대한 자세한 내용은 NetworkPolicyPeer API 참조 를 참조하십시오.
사용자 지정 네트워크 정책을 사용하려면 Cluster Operator 구성에서 STRIMZI_NETWORK_POLICY_GENERATION 환경 변수를 false 로 설정할 수 있습니다. 자세한 내용은 13.2.3절. “환경 변수를 사용하여 Cluster Operator 구성”의 내용을 참조하십시오.
OpenShift를 구성하면 AMQ Streams에서 네트워크 정책을 사용하려면 수신 NetworkPolicies 를 지원해야 합니다.
8.1.1.4. 리스너 인증서 제공 링크 복사링크가 클립보드에 복사되었습니다!
TLS 암호화가 활성화된 TLS 리스너 인증서 또는 TLS 리스너에 대해 Kafka 리스너 인증서 라는 고유한 서버 인증서를 제공할 수 있습니다. 자세한 내용은 8.3.4절. “TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공”의 내용을 참조하십시오.
8.1.2. Kafka 권한 부여 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 리소스에서 Kafka.spec.kafka.authorization 속성을 사용하여 Kafka 브로커에 대한 권한을 구성합니다. 권한 부여 속성이 없는 경우 권한 부여가 활성화되지 않으며 클라이언트에는 제한이 없습니다. 활성화되면 권한 부여가 활성화된 모든 리스너에 적용됩니다. 권한 부여 방법은 type 필드에 정의됩니다.
지원되는 권한 부여 옵션:
- 간단한 권한 부여
- OAuth 2.0 인증 ( OAuth 2.0 토큰 기반 인증을 사용하는 경우)
- OOPA(Open Policy Agent) 권한 부여
- 사용자 정의 권한 부여
그림 8.2. Kafka 클러스터 권한 부여 옵션
8.1.2.1. Super 사용자 링크 복사링크가 클립보드에 복사되었습니다!
Super 사용자는 액세스 제한에 관계없이 Kafka 클러스터의 모든 리소스에 액세스할 수 있으며 모든 권한 부여 메커니즘에서 지원합니다.
Kafka 클러스터의 슈퍼 사용자를 지정하려면 사용자 보안 주체 목록을 superUsers 속성에 추가합니다. 사용자가 mTLS 인증을 사용하는 경우 사용자 이름은 CN= 이 접두사가 붙은 TLS 인증서 주체의 공통 이름입니다. User Operator를 사용하지 않고 mTLS에 고유한 인증서를 사용하는 경우 사용자 이름은 전체 인증서 주체입니다. 전체 인증서 주체에는 CN=user,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=my_country_code 필드가 있을 수 있습니다. 존재하지 않는 필드를 모두 생략합니다.
수퍼 사용자가 있는 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
authorization:
type: simple
superUsers:
- CN=client_1
- user_2
- CN=client_3
- CN=client_4,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=US
- CN=client_5,OU=my_ou,O=my_org,C=GB
- CN=client_6,O=my_org
# ...
8.2. Kafka 클라이언트의 보안 옵션 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스를 사용하여 Kafka 클라이언트에 대한 인증 메커니즘, 권한 부여 메커니즘 및 액세스 권한을 구성합니다. 보안 구성 측면에서 클라이언트는 사용자로 표시됩니다.
Kafka 브로커에 대한 사용자 액세스 권한을 인증하고 인증할 수 있습니다. 인증은 액세스를 허용하고 권한 부여는 허용되는 작업에 대한 액세스를 제한합니다.
Kafka 브로커에 대한 제약되지 않은 액세스 권한이 있는 슈퍼 사용자를 생성할 수도 있습니다.
인증 및 권한 부여 메커니즘은 Kafka 브로커에 액세스하는 데 사용되는 리스너의 사양과 일치해야 합니다.
Kafka 브로커에 안전하게 액세스하도록 KafkaUser 리소스를 구성하는 방법에 대한 자세한 내용은 7.3절. “리스너를 사용하여 Kafka 클러스터에 클라이언트 액세스 설정” 을 참조하십시오.
8.2.1. 사용자 처리를 위한 Kafka 클러스터 식별 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스에는 적절한 Kafka 클러스터 이름( Kafka 리소스의 이름에서 파생)을 정의하는 레이블이 포함됩니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
레이블은 User Operator에서 KafkaUser 리소스를 식별하고 새 사용자를 생성하고 사용자를 나중에 처리하는 데 사용됩니다.
레이블이 Kafka 클러스터와 일치하지 않으면 User Operator에서 KafkaUser 를 식별할 수 없으며 사용자가 생성되지 않습니다.
KafkaUser 리소스의 상태가 비어 있으면 레이블을 확인합니다.
8.2.2. 사용자 인증 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 사용자 지정 리소스를 사용하여 Kafka 클러스터에 액세스해야 하는 사용자(클라이언트)의 인증 자격 증명을 구성합니다. KafkaUser.spec 의 인증 속성을 사용하여 자격 증명을 구성합니다. 유형을 지정하면 생성되는 인증 정보를 제어합니다.
지원되는 인증 유형:
-
mTLS인증의 TLS -
외부 인증서를 사용한 mTLS 인증의 경우 TLS-external -
SCRAM-SHA-512 인증을 위한 SCRAM-sha-512 인증
tls 또는 scram-sha-512 가 지정된 경우 User Operator는 사용자를 생성할 때 인증 인증 정보를 생성합니다. tls-external 이 지정된 경우에도 사용자는 mTLS를 계속 사용하지만 인증 자격 증명은 생성되지 않습니다. 고유 인증서를 제공하는 경우 이 옵션을 사용합니다. 인증 유형이 지정되지 않은 경우 User Operator는 사용자 또는 해당 인증 정보를 생성하지 않습니다.
tls-external 을 사용하여 User Operator 외부에서 발행된 인증서를 사용하여 mTLS로 인증할 수 있습니다. User Operator는 TLS 인증서 또는 보안을 생성하지 않습니다. tls 메커니즘을 사용하는 경우와 동일한 방식으로 User Operator를 통해 ACL 규칙 및 할당량을 계속 관리할 수 있습니다. 즉, ACL 규칙 및 할당량을 지정할 때 CN=USER-NAME 형식을 사용합니다. USER-NAME 은 TLS 인증서에 지정된 공통 이름입니다.
8.2.2.1. mTLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
mTLS 인증을 사용하려면 KafkaUser 리소스의 type 필드를 tls 로 설정합니다.
mTLS 인증이 활성화된 사용자의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls
# ...
인증 유형은 Kafka 클러스터에 액세스하는 데 사용되는 Kafka 리스너의 동등한 구성과 일치해야 합니다.
User Operator에 의해 사용자를 생성하면 KafkaUser 리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 mTLS에 대한 개인 및 공개 키가 포함되어 있습니다. 공개 키는 생성될 때 클라이언트 CA(인증 기관)에 의해 서명되는 사용자 인증서에 포함됩니다. 모든 키는 X.509 형식으로 되어 있습니다.
Cluster Operator에서 생성한 클라이언트 CA를 사용하는 경우 클라이언트 CA를 Cluster Operator가 갱신할 때 User Operator에서 생성한 사용자 인증서도 갱신됩니다.
사용자 보안은 PEM 및 PKCS #12 형식으로 키와 인증서를 제공합니다.
사용자 인증 정보가 있는 시크릿 예
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
ca.crt: <public_key> # Public key of the clients CA
user.crt: <user_certificate> # Public key of the user
user.key: <user_private_key> # Private key of the user
user.p12: <store> # PKCS #12 store for user certificates and keys
user.password: <password_for_store> # Protects the PKCS #12 store
클라이언트를 구성할 때 다음을 지정합니다.
- Kafka 클러스터의 ID를 확인하기 위한 공용 클러스터 CA 인증서의 신뢰 저장소 속성
- 사용자 인증 자격 증명의 키 저장소 속성을 사용하여 클라이언트를 확인합니다.
구성은 파일 형식(PEM 또는 PKCS #12)에 따라 다릅니다. 이 예에서는 PKCS #12 저장소와 저장소의 자격 증명에 액세스하는 데 필요한 암호를 사용합니다.
PKCS #12 형식의 mTLS를 사용한 클라이언트 구성 예
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093
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
- 신뢰 저장소 위치에는 Kafka 클러스터의 공개 키 인증서(
ca.p12)가 포함됩니다. Kafka 클러스터가 생성될 때 <cluster_name>-cluster-ca-cert보안의 Cluster Operator에 클러스터 CA 인증서 및 암호가 생성됩니다. - 4
- 신뢰 저장소에 액세스하기 위한 암호(
ca.password)입니다. - 5
- 키 저장소 위치에는 Kafka 사용자의 공개 키 인증서(
user.p12)가 포함됩니다. - 6
- 키 저장소에 액세스하기 위한 암호(
user.password)
8.2.2.2. User Operator 외부에서 발행된 인증서를 사용한 mTLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
User Operator 외부에서 발행된 인증서를 사용하여 mTLS 인증을 사용하려면 KafkaUser 리소스의 type 필드를 tls-external 로 설정합니다. 사용자에 대해 시크릿 및 인증 정보가 생성되지 않습니다.
User Operator 외부에서 발행된 인증서를 사용하는 mTLS 인증이 있는 사용자의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls-external
# ...
8.2.2.3. SCRAM-SHA-512 인증 링크 복사링크가 클립보드에 복사되었습니다!
SCRAM-SHA-512 인증 메커니즘을 사용하려면 KafkaUser 리소스의 type 필드를 scram-sha-512 로 설정합니다.
SCRAM-SHA-512 인증이 활성화된 사용자의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
# ...
User Operator에 의해 사용자를 생성하면 KafkaUser 리소스와 동일한 이름으로 새 시크릿을 생성합니다. 보안에는 암호 키에 생성된 암호 가 포함되어 있으며, 이 암호는 base64로 인코딩됩니다. 암호를 사용하려면 암호를 디코딩해야 합니다.
사용자 인증 정보가 있는 시크릿 예
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
password: Z2VuZXJhdGVkcGFzc3dvcmQ=
sasl.jaas.config: b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkuc2NyYW0uU2NyYW1Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT0ibXktdXNlciIgcGFzc3dvcmQ9ImdlbmVyYXRlZHBhc3N3b3JkIjsK
생성된 암호를 디코딩합니다.
echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
8.2.2.3.1. 사용자 정의 암호 구성 링크 복사링크가 클립보드에 복사되었습니다!
사용자가 생성되면 AMQ Streams에서 임의의 암호를 생성합니다. AMQ Streams에서 생성한 암호 대신 자체 암호를 사용할 수 있습니다. 이를 위해 암호를 사용하여 시크릿을 생성하고 KafkaUser 리소스에서 참조합니다.
SCRAM-SHA-512 인증에 대해 암호가 설정된 사용자의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
password:
valueFrom:
secretKeyRef:
name: my-secret
key: my-password
# ...
8.2.3. 사용자 권한 부여 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 사용자 지정 리소스를 사용하여 Kafka 클러스터에 액세스해야 하는 사용자(클라이언트)의 권한 부여 규칙을 구성합니다. KafkaUser.spec 의 권한 부여 속성을 사용하여 규칙을 구성합니다. 유형을 지정하면 사용되는 규칙을 제어합니다.
간단한 인증을 사용하려면 KafkaUser.spec.authorization 에서 type 속성을 simple 로 설정합니다. 간단한 권한 부여에서는 Kafka Admin API를 사용하여 Kafka 클러스터 내부의 ACL 규칙을 관리합니다. User Operator의 ACL 관리가 활성화되어 있는지 여부에 관계없이 Kafka 클러스터의 권한 부여 구성에 따라 달라집니다.
- 간단한 권한 부여의 경우 ACL 관리가 항상 활성화됩니다.
- OPA 권한 부여의 경우 ACL 관리가 항상 비활성화되어 있습니다. 권한 부여 규칙은 OPA 서버에서 구성됩니다.
- Red Hat Single Sign-On 권한 부여의 경우 Red Hat Single Sign-On에서 직접 ACL 규칙을 관리할 수 있습니다. 간단한 인증자에게 권한을 구성의 폴백 옵션으로 위임할 수도 있습니다. 간단한 작성자로 위임하는 경우 User Operator는 ACL 규칙 관리도 활성화합니다.
-
사용자 지정 권한 부여 플러그인을 사용하여 사용자 정의 권한 부여의 경우
Kafka사용자 정의 리소스의.spec.kafka.authorization구성에서supportsAdminApi속성을 사용하여 지원을 활성화하거나 비활성화합니다.
권한 부여는 클러스터 전체입니다. 권한 부여 유형은 Kafka 사용자 정의 리소스의 동등한 구성과 일치해야 합니다.
ACL 관리가 활성화되지 않은 경우 AMQ Streams는 ACL 규칙이 포함된 경우 리소스를 거부합니다.
User Operator의 독립 실행형 배포를 사용하는 경우 ACL 관리가 기본적으로 활성화됩니다. STRIMZI_ACLS_ADMIN_API_SUPPORTED 환경 변수를 사용하여 비활성화할 수 있습니다.
인증이 지정되지 않은 경우 User Operator는 사용자에 대한 액세스 권한을 프로비저닝하지 않습니다. 이러한 KafkaUser 가 리소스에 계속 액세스할 수 있는지의 여부는 사용 중인 인증자에 따라 달라집니다. 예를 들어 AclAuthorizer 의 경우 allow.everyone.if.no.acl.found 구성에 따라 결정됩니다.
8.2.3.1. ACL 규칙 링크 복사링크가 클립보드에 복사되었습니다!
AclAuthorizer 는 ACL 규칙을 사용하여 Kafka 브로커에 대한 액세스를 관리합니다.
ACL 규칙은 acls 속성에 지정하는 사용자에게 액세스 권한을 부여합니다.
AclRule 오브젝트에 대한 자세한 내용은 AclRule 스키마 참조 를 참조하십시오.
8.2.3.2. Kafka 브로커에 대한 Super 사용자 액세스 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커 구성의 슈퍼 사용자 목록에 사용자를 추가하면 KafkaUser 의 ACL에 정의된 권한 부여 제약 조건에 관계없이 사용자가 클러스터에 대한 무제한 액세스를 허용합니다.
브로커에 대한 슈퍼 사용자 액세스에 대한 자세한 내용은 Kafka 권한 부여 를 참조하십시오.
8.2.3.3. 사용자 할당량 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스에 대한 사양 을 구성하여 사용자가 Kafka 브로커에 대한 구성된 액세스 수준을 초과하지 않도록 할당량을 적용할 수 있습니다. 크기 기반 네트워크 사용량 및 시간 기반 CPU 사용률 임계값을 설정할 수 있습니다. 파티션 변경 할당량을 추가하여 사용자 요청에 대해 파티션 변경 요청이 허용되는 속도를 제어할 수도 있습니다.
사용자 할당량이 있는 KafkaUser 의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
# ...
quotas:
producerByteRate: 1048576
consumerByteRate: 2097152
requestPercentage: 55
controllerMutationRate: 10
이러한 속성에 대한 자세한 내용은 KafkaUserQuotas 스키마 참조 를 참조하십시오.
8.3. Kafka 브로커에 대한 액세스 보안 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커에 대한 보안 액세스를 구축하기 위해 다음을 구성하고 적용합니다.
다음을 수행하는
Kafka리소스- 지정된 인증 유형으로 리스너 생성
- 전체 Kafka 클러스터에 대한 권한 부여 구성
-
리스너를 통해 Kafka 브로커에 안전하게 액세스하는
KafkaUser리소스
설정할 Kafka 리소스를 구성합니다.
- 리스너 인증
- Kafka 리스너에 대한 액세스를 제한하는 네트워크 정책
- Kafka 권한 부여
- 브로커에 대한 제한되지 않은 액세스를 위한 수퍼 사용자
인증은 각 리스너에 대해 독립적으로 구성됩니다. 권한 부여는 항상 전체 Kafka 클러스터에 대해 구성됩니다.
Cluster Operator는 리스너를 생성하고 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정하여 Kafka 클러스터 내에서 인증을 활성화합니다.
자체 인증서를 설치하여 Cluster Operator에서 생성한 인증서를 교체할 수 있습니다.
TLS 암호화가 활성화된 모든 리스너의 고유한 서버 인증서 및 개인 키를 제공할 수도 있습니다. 이러한 사용자 제공 인증서를 Kafka 리스너 인증서 라고 합니다. Kafka 리스너 인증서를 제공하면 조직의 프라이빗 CA 또는 공용 CA와 같은 기존 보안 인프라를 활용할 수 있습니다. Kafka 클라이언트는 리스너 인증서에 서명하는 데 사용된 CA를 신뢰해야 합니다. 필요한 경우 Kafka 리스너 인증서를 수동으로 갱신해야 합니다. 인증서는 PKCS #12 형식(.p12) 및 PEM(.crt) 형식으로 사용할 수 있습니다.
KafkaUser 를 사용하여 특정 클라이언트가 Kafka에 액세스하는 데 사용하는 인증 및 권한 부여 메커니즘을 활성화합니다.
다음을 설정하도록 KafkaUser 리소스를 구성합니다.
- 활성화된 리스너 인증과 일치하도록 인증
- 활성화된 Kafka 권한 부여와 일치하도록 권한 부여
- 클라이언트에서 리소스 사용을 제어하기 위한 할당량
User Operator는 선택한 인증 유형을 기반으로 클라이언트 및 클라이언트 인증에 사용되는 보안 자격 증명을 나타내는 사용자를 생성합니다.
액세스 구성 속성에 대한 자세한 내용은 스키마 참조를 참조하십시오.
8.3.1. Kafka 브로커 보안 링크 복사링크가 클립보드에 복사되었습니다!
이 절차에서는 AMQ Streams를 실행할 때 Kafka 브로커 보안 단계를 보여줍니다.
Kafka 브로커에 대해 구현된 보안은 액세스가 필요한 클라이언트에 대해 구현된 보안과 호환되어야 합니다.
-
Kafka.spec.kafka.listeners[*].authentication은KafkaUser.spec.authentication과 일치합니다. -
Kafka.spec.kafka.authorization과KafkaUser.spec.authorization
이 단계는 mTLS 인증을 사용하는 간단한 권한 부여 및 리스너에 대한 구성을 보여줍니다. 리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.
또는 리스너 인증에 SCRAM-SHA 또는 OAuth 2.0을 사용하고 OAuth 2.0 또는 Kafka 권한 부여 의 경우 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에 무제한 액세스할 수 있는 사용자 보안 주체 목록입니다. mTLS 인증이 사용되는 경우 CN 은 클라이언트 인증서의 공통 이름입니다.
- 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에 생성됩니다.
8.3.2. Kafka에 대한 사용자 액세스 보안 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 사용자를 생성하거나 수정하여 Kafka 클러스터에 대한 보안 액세스가 필요한 클라이언트를 나타냅니다.
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 클라이언트를 구성하는 방법에 대한 자세한 내용은 7.3절. “리스너를 사용하여 Kafka 클러스터에 클라이언트 액세스 설정” 을 참조하십시오.
8.3.3. 네트워크 정책을 사용하여 Kafka 리스너에 대한 액세스 제한 링크 복사링크가 클립보드에 복사되었습니다!
networkPolicyPeers 속성을 사용하여 리스너에 대한 액세스를 선택한 애플리케이션으로만 제한할 수 있습니다.
사전 요구 사항
- Ingress NetworkPolicies를 지원하는 OpenShift 클러스터입니다.
- Cluster Operator가 실행 중입니다.
절차
-
Kafka리소스를 엽니다. networkPolicyPeers속성에서 Kafka 클러스터에 액세스할 수 있는 애플리케이션 포드 또는 네임스페이스를 정의합니다.예를 들어
app레이블이 있는 애플리케이션 Pod의 연결만kafka-client로 설정하도록tls리스너를 구성하려면 다음을 수행하십시오.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls networkPolicyPeers: - podSelector: matchLabels: app: kafka-client # ... zookeeper: # ...리소스를 생성하거나 업데이트합니다.
oc apply를 사용합니다.oc apply -f your-file
8.3.4. TLS 암호화를 위한 자체 Kafka 리스너 인증서 제공 링크 복사링크가 클립보드에 복사되었습니다!
리스너는 Kafka 브로커에 대한 클라이언트 액세스를 제공합니다. TLS를 사용하여 클라이언트 액세스에 필요한 구성을 포함하여 Kafka 리소스에서 리스너를 구성합니다.
기본적으로 리스너는 AMQ Streams에서 생성한 내부 CA(인증 기관) 인증서에서 서명한 인증서를 사용합니다. Kafka 클러스터를 생성할 때 Cluster Operator에 의해 CA 인증서가 생성됩니다. TLS에 대한 클라이언트를 구성할 때 Kafka 클러스터를 확인하기 위해 신뢰 저장소 구성에 CA 인증서를 추가합니다. 자체 CA 인증서를 설치하고 사용할 수도 있습니다. 또는 brokerCertECDHEAndKey 속성을 사용하여 리스너를 구성하고 사용자 정의 서버 인증서를 사용할 수 있습니다.
brokerCertRoleBindingAndKey 속성을 사용하면 리스너 수준에서 자체 사용자 정의 인증서를 사용하여 Kafka 브로커에 액세스할 수 있습니다. 고유한 개인 키 및 서버 인증서를 사용하여 보안을 생성한 다음 리스너의 brokerCertCertECDHEAndKey 구성에 키 와 인증서를 지정합니다. 공용(외부) CA 또는 개인 CA에서 서명한 인증서를 사용할 수 있습니다. 공용 CA에서 서명한 경우 일반적으로 클라이언트의 신뢰 저장소 구성에 추가할 필요가 없습니다. 사용자 정의 인증서는 AMQ Streams에서 관리하지 않으므로 수동으로 갱신해야 합니다.
리스너 인증서는 TLS 암호화 및 서버 인증에만 사용됩니다. TLS 클라이언트 인증에 사용되지 않습니다. TLS 클라이언트 인증에 자체 인증서를 사용하려면 자체 클라이언트 CA를 설치하고 사용해야 합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
각 리스너에는 다음이 필요합니다.
외부 CA에서 서명한 호환 서버 인증서입니다. (X.509 인증서를 PEM 형식으로 제공)
여러 리스너에 하나의 리스너 인증서를 사용할 수 있습니다.
- 주체 대체 이름(SAN)은 각 리스너의 인증서에 지정됩니다. 자세한 내용은 8.3.5절. “Kafka 리스너 서버 인증서의 대체 주체”의 내용을 참조하십시오.
자체 서명된 인증서를 사용하지 않는 경우 인증서에 전체 CA 체인을 포함하는 인증서를 제공할 수 있습니다.
리스너에 대해 TLS 암호화(tls: true)가 구성된 경우에만 brokerCert>-<AndKey 속성을 사용할 수 있습니다.
AMQ Streams는 TLS에 대해 암호화된 개인 키 사용을 지원하지 않습니다. 시크릿에 저장된 개인 키는 이 기능이 작동하려면 암호화되지 않아야 합니다.
절차
개인 키 및 서버 인증서가 포함된 보안을 생성합니다.
oc create secret generic my-secret --from-file=my-listener-key.key --from-file=my-listener-certificate.crt클러스터의
Kafka리소스를 편집합니다.configuration.brokerCertECDHEAndKey속성에서Secret, 인증서 파일 및 개인 키 파일을 사용하도록 리스너를 구성합니다.TLS 암호화가 활성화된
로드밸런서 외부 리스너 구성 예# ... listeners: - name: plain port: 9092 type: internal tls: false - name: external port: 9094 type: loadbalancer tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...TLS 리스너 구성 예
# ... listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...새 구성을 적용하여 리소스를 생성하거나 업데이트합니다.
oc apply -f kafka.yamlCluster Operator는 리스너 구성을 업데이트하는 Kafka 클러스터의 롤링 업데이트를 시작합니다.
참고롤링 업데이트는 리스너가 이미 사용하는
Secret에서 Kafka 리스너 인증서를 업데이트하는 경우에도 시작됩니다.
8.3.5. Kafka 리스너 서버 인증서의 대체 주체 링크 복사링크가 클립보드에 복사되었습니다!
자체 Kafka 리스너 인증서와 함께 TLS 호스트 이름 확인을 사용하려면 각 리스너 에 올바른 SAN(Subject Alternative Names)을 사용해야 합니다. 인증서 SAN은 다음의 호스트 이름을 지정해야 합니다.
- 클러스터의 모든 Kafka 브로커
- Kafka 클러스터 부트스트랩 서비스
CA에서 지원하는 경우 와일드카드 인증서를 사용할 수 있습니다.
8.3.5.1. 내부 리스너를 위한 SAN의 예 링크 복사링크가 클립보드에 복사되었습니다!
내부 리스너 인증서에 SAN의 호스트 이름을 지정하는 데 도움이 되는 다음 예제를 사용합니다.
< cluster-name >을 Kafka 클러스터의 이름으로 바꾸고 < namespace >를 클러스터가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
유형의 와일드카드 예: 내부 리스너
//Kafka brokers
*.<cluster-name>-kafka-brokers
*.<cluster-name>-kafka-brokers.<namespace>.svc
// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc
유형의 Wildcards 예: 내부 리스너
// Kafka brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers.<namespace>.svc
# ...
// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc
유형의 Wildcards 예: cluster-ip 리스너
// Kafka brokers
<cluster-name>-kafka-<listener-name>-0
<cluster-name>-kafka-<listener-name>-0.<namespace>.svc
<cluster-name>-kafka-<listener-name>-1
<cluster-name>-kafka-<listener-name>-1.<namespace>.svc
# ...
// Bootstrap service
<cluster-name>-kafka-<listener-name>-bootstrap
<cluster-name>-kafka-<listener-name>-bootstrap.<namespace>.svc
8.3.5.2. 외부 리스너를 위한 SAN의 예 링크 복사링크가 클립보드에 복사되었습니다!
TLS 암호화가 활성화된 외부 리스너의 경우 인증서에서 지정해야 하는 호스트 이름은 외부 리스너 유형에 따라 다릅니다.
| 외부 리스너 유형 | SAN에서 지정합니다.… |
|---|---|
|
|
모든 Kafka 브로커 일치하는 와일드카드 이름을 사용할 수 있습니다. |
|
|
모든 Kafka 브로커 일치하는 와일드카드 이름을 사용할 수 있습니다. |
|
|
모든 Kafka 브로커 로드 밸런서 및 부트스트랩 로드 밸런서 주소 일치하는 와일드카드 이름을 사용할 수 있습니다. |
|
| Kafka 브로커 Pod를 예약할 수 있는 모든 OpenShift 작업자 노드의 주소입니다. 일치하는 와일드카드 이름을 사용할 수 있습니다. |
8.4. OAuth 2.0 토큰 기반 인증 사용 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 OAUTHB>-<ER 및 PLAIN 메커니즘을 사용한 OAuth 2.0 인증 사용을 지원합니다.
OAuth 2.0을 사용하면 리소스에 대한 제한된 액세스 권한을 부여하는 토큰을 발행하기 위한 중앙 권한 부여 서버를 사용하여 애플리케이션 간 표준화된 토큰 기반 인증 및 권한 부여가 가능합니다.
OAuth 2.0 인증을 구성한 다음 OAuth 2.0 권한 부여 를 설정할 수 있습니다.
OAuth 2.0을 사용하도록 Kafka 브로커 및 클라이언트를 구성해야 합니다. OAuth 2.0 인증은 단순 또는 OPA 기반 Kafka 권한 부여 와 함께 사용할 수도 있습니다.
애플리케이션 클라이언트는 OAuth 2.0 토큰 기반 인증을 사용하여 계정 자격 증명을 노출하지 않고 애플리케이션 서버( 리소스 서버라고 함)의 리소스에 액세스할 수 있습니다.
애플리케이션 클라이언트는 권한 부여 수준을 결정하는 데 사용할 수 있는 인증 수단으로 액세스 토큰을 전달합니다. 권한 부여 서버는 액세스 권한 부여 및 문의를 처리합니다.
AMQ Streams의 컨텍스트에서 다음을 수행합니다.
- Kafka 브로커는 OAuth 2.0 리소스 서버 역할을 합니다.
- Kafka 클라이언트는 OAuth 2.0 애플리케이션 클라이언트 역할을 합니다.
Kafka 클라이언트는 Kafka 브로커에 대해 인증합니다. 브로커 및 클라이언트는 필요한 경우 OAuth 2.0 권한 부여 서버와 통신하여 액세스 토큰을 얻거나 검증합니다.
AMQ Streams 배포를 위해 OAuth 2.0 통합은 다음을 제공합니다.
- Kafka 브로커에 대한 서버 측 OAuth 2.0 지원
- Kafka MirrorMaker, Kafka Connect 및 Kafka Bridge에 대한 클라이언트 측 OAuth 2.0 지원
8.4.1. OAuth 2.0 인증 메커니즘 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 OAuth 2.0 인증을 위해 OAUTHBISTRAER 및 PLAIN 메커니즘을 지원합니다. 두 메커니즘을 모두 사용하면 Kafka 클라이언트가 Kafka 브로커와 인증 세션을 설정할 수 있습니다. 클라이언트, 권한 부여 서버 및 Kafka 브로커 간의 인증 흐름은 각 메커니즘마다 다릅니다.
가능하면 언제든지 OAUTHBECDHEER를 사용하도록 클라이언트를 구성하는 것이 좋습니다. OAUTHBLOGER는 클라이언트 자격 증명이 Kafka 브로커와 공유되지 않기 때문에 PLAIN보다 높은 수준의 보안을 제공합니다. OAUTHB topicER를 지원하지 않는 Kafka 클라이언트에만 PLAIN을 사용하는 것이 좋습니다.
클라이언트 연결에 OAuth 2.0 인증을 사용하도록 Kafka 브로커 리스너를 구성합니다. 필요한 경우 동일한 oauth 리스너에서 OAUTHBISTRAER 및 PLAIN 메커니즘을 사용할 수 있습니다. 각 메커니즘을 지원하는 속성을 oauth 리스너 구성에 명시적으로 지정해야 합니다.
AUTHBLOGER 개요
OAUTHBISTRAER는 Kafka 브로커의 oauth 리스너 구성에서 자동으로 활성화됩니다. 이 속성은 필수는 아니지만 enableOauthBearer 속성을 true 로 설정할 수 있습니다.
# ...
authentication:
type: oauth
# ...
enableOauthBearer: true
많은 Kafka 클라이언트 도구는 프로토콜 수준에서 OAUTHB topicER에 대한 기본 지원을 제공하는 라이브러리를 사용합니다. 애플리케이션 개발을 지원하기 위해 AMQ Streams는 업스트림 Kafka 클라이언트 Java 라이브러리에 대한 OAuth 콜백 핸들러 를 제공합니다(다른 라이브러리에서는 제외). 따라서 자체 콜백 핸들러를 작성할 필요가 없습니다. 애플리케이션 클라이언트는 콜백 처리기를 사용하여 액세스 토큰을 제공할 수 있습니다. Go와 같은 다른 언어로 작성된 클라이언트는 사용자 정의 코드를 사용하여 권한 부여 서버에 연결하고 액세스 토큰을 받아야 합니다.
OAUTHBLOGER를 사용하면 클라이언트는 인증 정보 교환을 위해 Kafka 브로커와 세션을 시작합니다. 여기서 자격 증명은 콜백 처리기에서 제공하는 전달자 토큰의 형식을 취합니다. 콜백을 사용하면 다음 세 가지 방법 중 하나로 토큰 프로비저닝을 구성할 수 있습니다.
- 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
- 구성 시 수동으로 가져온 장기 액세스 토큰
- 구성 시 수동으로 가져온 장기 새로 고침 토큰
프로토콜 수준에서 OAUTHBREER 메커니즘을 지원하는 Kafka 클라이언트에서만 인증을 사용할 수 있습니다.
PLAIN 개요
PLAIN을 사용하려면 Kafka 브로커의 oauth 리스너 구성에서 활성화해야 합니다.
다음 예에서 PLAIN은 OAUTHBECDHEER 외에 기본적으로 활성화되어 있습니다. PLAIN만 사용하려면 enableOauthBearer 를 false 로 설정하여 OAUTHBLOGER를 비활성화할 수 있습니다.
# ...
authentication:
type: oauth
# ...
enablePlain: true
tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token
PLAIN은 모든 Kafka 클라이언트 툴에서 사용하는 간단한 인증 메커니즘입니다. PLAIN을 OAuth 2.0 인증과 함께 사용할 수 있도록 AMQ Streams는 PLAIN 서버 측 콜백을 통해 OAuth 2.0 을 제공합니다.
PLAIN의 AMQ Streams 구현을 사용하면 클라이언트 인증 정보가 ZooKeeper에 저장되지 않습니다. 대신 클라이언트 자격 증명은 OAUTHB learnER 인증이 사용될 때와 유사하게 호환 권한 부여 서버 뒤에 중앙에서 처리됩니다.
OAuth 2.0 over PLAIN 콜백과 함께 사용하면 Kafka 클라이언트는 다음 방법 중 하나를 사용하여 Kafka 브로커로 인증합니다.
- 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
- 구성 시 수동으로 가져온 장기 액세스 토큰
두 방법 모두 클라이언트는 PLAIN 사용자 이름 및 암호 속성을 제공하여 인증서를 Kafka 브로커에 전달해야 합니다. 클라이언트는 이러한 속성을 사용하여 클라이언트 ID와 시크릿 또는 사용자 이름 및 액세스 토큰을 전달합니다.
클라이언트 ID 및 시크릿은 액세스 토큰을 가져오는 데 사용됩니다.
액세스 토큰은 암호 속성 값으로 전달됩니다. $accessToken: 접두사를 사용하거나 사용하지 않고 액세스 토큰을 전달합니다.
-
리스너 구성에서 토큰 끝점(
tokenEndpointUri)을 구성하는 경우 접두사가 필요합니다. -
리스너 구성에서 토큰 끝점(
tokenEndpointUri)을 구성하지 않으면 접두사가 필요하지 않습니다. Kafka 브로커는 암호를 원시 액세스 토큰으로 해석합니다.
암호 가 액세스 토큰으로 설정된 경우 사용자 이름을 Kafka 브로커가 액세스 토큰에서 가져오는 동일한 보안 이름으로 설정해야 합니다. userNameClaim,fallbackUserNameClaim,fallbackUsernamePrefix 및 userInfoEndpointUri 속성을 사용하여 리스너에서 사용자 이름 추출 옵션을 지정할 수 있습니다. 사용자 이름 추출 프로세스는 권한 부여 서버(특히 클라이언트 ID를 계정 이름에 매핑하는 방법)에 따라 달라집니다.
PLAIN을 통한 OAuth는 암호 부여 메커니즘을 지원하지 않습니다. SASL PLAIN을 통해 'proxy'를 통해 클라이언트 자격 증명(client Id + secret) 또는 위에 설명된 액세스 토큰을 메커니즘할 수 있습니다.
8.4.2. OAuth 2.0 Kafka 브로커 구성 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0의 Kafka 브로커 구성은 다음과 같습니다.
- 권한 부여 서버에서 OAuth 2.0 클라이언트 생성
- Kafka 사용자 정의 리소스에서 OAuth 2.0 인증 구성
권한 부여 서버와 관련하여 Kafka 브로커 및 Kafka 클라이언트는 모두 OAuth 2.0 클라이언트로 간주됩니다.
8.4.2.1. 권한 부여 서버의 OAuth 2.0 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
세션 시작 중에 수신된 토큰을 확인하도록 Kafka 브로커를 구성하려면 다음 클라이언트 인증 정보를 사용하여 권한 부여 서버에 OAuth 2.0 클라이언트 정의를 생성하는 것이 좋습니다.
-
kafka의 클라이언트 ID(예:) - 인증 메커니즘으로서의 클라이언트 ID 및 시크릿
권한 부여 서버의 공용이 아닌 인트로스펙션 끝점을 사용하는 경우에만 클라이언트 ID와 시크릿을 사용해야 합니다. 빠른 로컬 JWT 토큰 검증과 마찬가지로 공용 권한 부여 서버 끝점을 사용할 때는 일반적으로 자격 증명이 필요하지 않습니다.
8.4.2.2. Kafka 클러스터의 OAuth 2.0 인증 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 OAuth 2.0 인증을 사용하려면 인증 방법 oauth 를 사용하여 Kafka 클러스터 사용자 정의 리소스의 tls 리스너 구성을 지정합니다.
OAuth 2.0의 인증 방법 유형 확인
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
# ...
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
#...
리스너에서 OAuth 2.0 인증을 구성할 수 있습니다. OAuth 2.0 인증을 TLS 암호화(tls: true)와 함께 사용하는 것이 좋습니다. 암호화가 없으면 연결은 네트워크 도약 및 토큰 도용을 통한 무단 액세스에 취약합니다.
보안 전송 계층이 클라이언트와 통신할 수 있도록 type: oauth 를 사용하여 외부 리스너를 구성합니다.
외부 리스너에서 OAuth 2.0 사용
# ...
listeners:
- name: external
port: 9094
type: loadbalancer
tls: true
authentication:
type: oauth
#...
tls 속성은 기본적으로 false 이므로 활성화해야 합니다.
인증 유형을 OAuth 2.0으로 정의한 경우 빠른 로컬 JWT 검증 또는 인트로스펙션 끝점을 사용하여 토큰 검증 유형으로 구성을 추가합니다.
리스너에 대해 OAuth 2.0을 구성하는 절차는 Kafka 브로커에 대한 OAuth 2.0 지원 구성에 설명되어 있습니다.
8.4.2.3. 빠른 로컬 JWT 토큰 검증 구성 링크 복사링크가 클립보드에 복사되었습니다!
빠른 로컬 JWT 토큰 검증은 JWT 토큰 서명을 로컬에서 확인합니다.
로컬 검사에서 토큰을 확인합니다.
-
액세스 토큰에 대한
Bearer의 (typ) 클레임 값을 포함하여 유형을 준수합니다. - 유효 ( 만료되지 않음)
-
유효한IssuerURI와 일치하는 발급자가 있습니다.
권한 부여 서버에서 발행하지 않은 모든 토큰이 거부되도록 리스너를 구성할 때 validIssuerURI 속성을 지정합니다.
빠른 로컬 JWT 토큰 검증 중에 권한 부여 서버에 연결할 필요가 없습니다. OAuth 2.0 인증 서버에서 노출하는 끝점인 jwksEndpointUri 속성을 지정하여 빠른 로컬 JWT 토큰 검증을 활성화합니다. 엔드포인트에는 Kafka 클라이언트에서 인증 정보로 전송되는 서명된 JWT 토큰의 유효성을 확인하는 데 사용되는 공개 키가 포함되어 있습니다.
권한 부여 서버와의 모든 통신은 TLS 암호화를 사용하여 수행해야 합니다.
AMQ Streams 프로젝트 네임스페이스에서 인증서 신뢰 저장소를 OpenShift Secret으로 구성하고 tlsTrustedCertificates 속성을 사용하여 신뢰 저장소 파일이 포함된 OpenShift 보안을 가리킬 수 있습니다.
JWT 토큰에서 사용자 이름을 올바르게 추출하도록 userNameClaim 을 구성할 수 있습니다. Kafka ACL 권한 부여를 사용하려면 인증 중에 사용자 이름으로 사용자를 식별해야 합니다. (일반적으로 JWT 토큰의 하위 클레임은 사용자 이름이 아닌 고유 ID입니다.)
빠른 로컬 JWT 토큰 검증을 위한 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
#...
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
validIssuerUri: <https://<auth-server-address>/auth/realms/tls>
jwksEndpointUri: <https://<auth-server-address>/auth/realms/tls/protocol/openid-connect/certs>
userNameClaim: preferred_username
maxSecondsWithoutReauthentication: 3600
tlsTrustedCertificates:
- secretName: oauth-server-cert
certificate: ca.crt
#...
8.4.2.4. OAuth 2.0 인트로스펙션 엔드 포인트 구성 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0 인트로스펙션 끝점을 사용한 토큰 검증은 수신된 액세스 토큰을 opaque로 처리합니다. Kafka 브로커는 유효성 검사에 필요한 토큰 정보로 응답하는 인트로스펙션 끝점에 액세스 토큰을 보냅니다. 중요한 것은 특정 액세스 토큰이 유효하고 토큰 만료 시기에 대한 최신 정보를 반환하는 것입니다.
OAuth 2.0 인트로스펙션 기반 검증을 구성하려면 빠른 로컬 JWT 토큰 검증을 위해 지정된 jwksEndpointUri 속성 대신 introspectionEndpointUri 속성을 지정합니다. 일반적으로 인트로스펙션 끝점이 보호되므로 권한 부여 서버에 따라 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
8.4.3. Kafka 브로커에 대한 세션 재인증 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클라이언트와 Kafka 브로커 간의 OAuth 2.0 세션에 대한 Kafka 세션 재인증 을 사용하도록 oauth 리스너를 구성할 수 있습니다. 이 메커니즘은 정의된 기간 후에 클라이언트와 브로커 간에 인증된 세션의 만료를 적용합니다. 세션이 만료되면 클라이언트는 기존 연결을 삭제하는 대신 기존 연결을 재사용하여 새 세션을 즉시 시작합니다.
세션 재인증은 기본적으로 비활성화되어 있습니다. 이를 활성화하려면 oauth 리스너 구성에서 maxSecondsWithoutReauthentication 의 시간 값을 설정합니다. 동일한 속성이 OAUTHB topicER 및 PLAIN 인증에 대한 세션 재인증을 구성하는 데 사용됩니다. 예제 구성은 8.4.6.2절. “Kafka 브로커에 대한 OAuth 2.0 지원 구성” 에서 참조하십시오.
세션 재인증은 클라이언트에서 사용하는 Kafka 클라이언트 라이브러리에서 지원해야 합니다.
세션 재인증은 빠른 로컬 JWT 또는 인트로스펙션 끝점 토큰 검증과 함께 사용할 수 있습니다.
클라이언트 재인증
브로커의 인증된 세션이 만료되면 클라이언트는 연결을 삭제하지 않고 유효한 새 액세스 토큰을 브로커에 전송하여 기존 세션으로 다시 인증해야 합니다.
토큰 검증에 성공하면 기존 연결을 사용하여 새 클라이언트 세션이 시작됩니다. 클라이언트가 다시 인증되지 않으면 브로커는 메시지 전송 또는 수신을 위해 추가 시도를 수행하면 연결을 종료합니다. 브로커에서 재인증 메커니즘이 활성화된 경우 Kafka 클라이언트 라이브러리 2.2 이상을 사용하는 Java 클라이언트는 자동으로 다시 인증됩니다.
세션 재인증은 사용하는 경우 새로 고침 토큰에도 적용됩니다. 세션이 만료되면 클라이언트는 새로 고침 토큰을 사용하여 액세스 토큰을 새로 고칩니다. 그런 다음 클라이언트는 새 액세스 토큰을 사용하여 기존 세션으로 다시 인증합니다.
OAUTHBREER 및 PLAIN의 세션 만료
세션 재인증이 구성되면 세션 만료가 OAUTHB topicER 및 PLAIN 인증에 다르게 작동합니다.
OAUTHBREER 및 PLAIN의 경우 클라이언트 ID 및 시크릿 방법을 사용합니다.
-
브로커의 인증된 세션은 구성된
maxSecondsWithoutReauthentication에서 만료됩니다. - 구성된 시간 전에 액세스 토큰이 만료되면 세션이 일찍 만료됩니다.
수명이 긴 액세스 토큰 방법을 사용하는 PLAIN의 경우:
-
브로커의 인증된 세션은 구성된
maxSecondsWithoutReauthentication에서 만료됩니다. - 구성된 시간 이전에 액세스 토큰이 만료되면 재인증이 실패합니다. 세션 재인증이 시도되지만 PLAIN에는 토큰을 새로 고치는 메커니즘이 없습니다.
maxSecondsWithoutReauthentication 이 구성되지 않은 경우 다시 인증되지 않고도 OAUTHB>-<ER 및 PLAIN 클라이언트는 브로커에 영구적으로 연결된 상태로 유지될 수 있습니다. 인증된 세션은 액세스 토큰 만료로 끝나지 않습니다. 그러나 이는 예를 들어 keycloak 인증을 사용하거나 사용자 정의 인증 기관을 설치하여 권한을 구성할 때 고려할 수 있습니다.
8.4.4. OAuth 2.0 Kafka 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클라이언트는 다음 중 하나로 구성됩니다.
- 권한 부여 서버에서 유효한 액세스 토큰을 가져오는 데 필요한 인증 정보(클라이언트 ID 및 시크릿)
- 권한 부여 서버에서 제공하는 툴을 사용하여 얻은 유효한 장기 액세스 토큰 또는 새로 고침 토큰
Kafka 브로커에 전송된 유일한 정보는 액세스 토큰입니다. 액세스 토큰을 얻기 위해 권한 부여 서버를 통해 인증하는 데 사용되는 인증 정보는 브로커로 전송되지 않습니다.
클라이언트에서 액세스 토큰을 가져오는 경우 권한 부여 서버와 더 이상 통신할 필요가 없습니다.
가장 간단한 메커니즘은 클라이언트 ID 및 시크릿을 사용한 인증입니다. 장기 액세스 토큰 또는 수명이 긴 새로 고침 토큰을 사용하면 권한 부여 서버 도구에 대한 추가 종속성이 있으므로 복잡성이 추가됩니다.
수명이 긴 액세스 토큰을 사용하는 경우 토큰의 최대 수명을 늘리도록 권한 부여 서버에서 클라이언트를 구성해야 할 수 있습니다.
Kafka 클라이언트가 액세스 토큰으로 직접 구성되지 않은 경우 클라이언트는 권한 부여 서버에 연결하여 Kafka 세션 시작 중에 액세스 토큰에 대한 인증 정보를 전송합니다. Kafka 클라이언트가 다음 중 하나를 교환합니다.
- 클라이언트 ID 및 시크릿
- 클라이언트 ID, 새로 고침 토큰 및 (선택 사항) 시크릿
- 사용자 이름 및 암호, 클라이언트 ID 및 (선택 사항) 시크릿
8.4.5. OAuth 2.0 클라이언트 인증 흐름 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0 인증 흐름은 기본 Kafka 클라이언트 및 Kafka 브로커 구성에 따라 다릅니다. 사용된 권한 부여 서버에서도 이 흐름을 지원해야 합니다.
Kafka 브로커 리스너 구성은 클라이언트가 액세스 토큰을 사용하여 인증하는 방법을 결정합니다. 클라이언트는 클라이언트 ID와 시크릿을 전달하여 액세스 토큰을 요청할 수 있습니다.
리스너가 PLAIN 인증을 사용하도록 구성된 경우 클라이언트는 클라이언트 ID와 시크릿 또는 사용자 이름 및 액세스 토큰으로 인증할 수 있습니다. 이러한 값은 PLAIN 메커니즘의 사용자 이름 및 암호 속성으로 전달됩니다.
리스너 구성은 다음 토큰 검증 옵션을 지원합니다.
- 권한 부여 서버에 연결하지 않고도 JWT 서명 확인 및 로컬 토큰 인트로스펙션을 기반으로 빠른 로컬 토큰 검증을 사용할 수 있습니다. 권한 부여 서버는 토큰의 서명을 확인하는 데 사용되는 공용 인증서가 포함된 JWKS 엔드포인트를 제공합니다.
- 권한 부여 서버에서 제공하는 토큰 인트로스펙션 끝점에 대한 호출을 사용할 수 있습니다. 새 Kafka 브로커 연결이 설정될 때마다 브로커는 클라이언트에서 인증된 액세스 토큰을 권한 부여 서버로 전달합니다. Kafka 브로커는 응답을 확인하여 토큰이 유효한지 여부를 확인합니다.
권한 부여 서버에서는 불투명 액세스 토큰만 사용할 수 있으므로 로컬 토큰 검증이 불가능합니다.
Kafka 클라이언트 인증 정보는 다음 유형의 인증에 대해 구성할 수도 있습니다.
- 이전에 생성된 장기 액세스 토큰을 사용한 직접 로컬 액세스
- 새 액세스 토큰이 발행될 수 있도록 권한 서버와 연결합니다(클라이언트 ID와 시크릿 또는 새로 고침 토큰 또는 사용자 이름 및 암호 사용)
SASL OAUTHB topicER 메커니즘을 사용하여 Kafka 인증에 대해 다음 통신 흐름을 사용할 수 있습니다.
클라이언트 ID 및 보안을 사용하는 클라이언트, 브로커가 권한 부여 서버에 대한 검증을 위임함
- Kafka 클라이언트는 클라이언트 ID 및 시크릿과 선택적으로 새로 고침 토큰을 사용하여 권한 부여 서버에서 액세스 토큰을 요청합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
- 권한 부여 서버는 새 액세스 토큰을 생성합니다.
- Kafka 클라이언트는 SASL OAUTHB>-<ER 메커니즘을 사용하여 액세스 토큰을 전달하는 Kafka 브로커로 인증합니다.
- Kafka 브로커는 자체 클라이언트 ID 및 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 끝점을 호출하여 액세스 토큰을 검증합니다.
- 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.
빠른 로컬 토큰 검증을 수행하는 브로커가 있는 클라이언트 ID 및 시크릿을 사용하는 클라이언트
- Kafka 클라이언트는 클라이언트 ID 및 시크릿을 사용하여 토큰 끝점에서 권한 부여 서버와 선택적으로 새로 고침 토큰을 사용하여 인증합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
- 권한 부여 서버는 새 액세스 토큰을 생성합니다.
- Kafka 클라이언트는 SASL OAUTHB>-<ER 메커니즘을 사용하여 액세스 토큰을 전달하는 Kafka 브로커로 인증합니다.
- Kafka 브로커는 JWT 토큰 서명 확인 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬에서 검증합니다.
장기 액세스 토큰을 사용하는 클라이언트 및 인증 서버에 대한 검증을 위임하는 브로커
- Kafka 클라이언트는 SASL OAUTHB>-<ER 메커니즘을 사용하여 장기간의 액세스 토큰을 전달하는 Kafka 브로커로 인증합니다.
- Kafka 브로커는 자체 클라이언트 ID 및 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 끝점을 호출하여 액세스 토큰을 검증합니다.
- 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.
빠른 로컬 검증 수행 브로커를 통해 장기 액세스 토큰을 사용하는 클라이언트
- Kafka 클라이언트는 SASL OAUTHB>-<ER 메커니즘을 사용하여 장기간의 액세스 토큰을 전달하는 Kafka 브로커로 인증합니다.
- Kafka 브로커는 JWT 토큰 서명 확인 및 로컬 토큰 인트로스펙션을 사용하여 로컬에서 액세스 토큰을 검증합니다.
빠른 로컬 JWT 토큰 서명 검증은 토큰이 취소된 경우 권한 부여 서버에 검사가 없기 때문에 수명이 짧은 토큰에만 적합합니다. 토큰 만료는 토큰에 기록되지만 해지는 언제든지 발생할 수 있으므로 권한 부여 서버에 연결하지 않으면 이를 고려할 수 없습니다. 발행된 모든 토큰은 만료될 때까지 유효한 것으로 간주됩니다.
8.4.5.2. SASL PLAIN 메커니즘을 사용하는 클라이언트 인증 흐름의 예 링크 복사링크가 클립보드에 복사되었습니다!
OAuth PLAIN 메커니즘을 사용하여 Kafka 인증에 대해 다음 통신 흐름을 사용할 수 있습니다.
클라이언트 ID 및 시크릿을 사용하는 클라이언트 및 브로커에서 클라이언트의 액세스 토큰을 가져옵니다.
-
Kafka 클라이언트는
clientId를 사용자 이름으로,시크릿을 암호로 전달합니다. -
Kafka 브로커는 토큰 끝점을 사용하여
clientId및시크릿을 권한 부여 서버에 전달합니다. - 클라이언트 인증 정보가 유효하지 않은 경우 권한 부여 서버에서 새 액세스 토큰 또는 오류를 반환합니다.
Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.
- 토큰 인트로스펙션 엔드 포인트가 지정되면 Kafka 브로커는 권한 부여 서버에서 끝점을 호출하여 액세스 토큰을 검증합니다. 토큰 검증에 성공하면 세션이 설정됩니다.
- 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 수행되지 않습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 로컬에서 액세스 토큰을 검증합니다.
클라이언트 ID 및 시크릿 없이 장기 액세스 토큰을 사용하는 클라이언트
- Kafka 클라이언트는 사용자 이름과 암호를 전달합니다. password는 클라이언트를 실행하기 전에 수동으로 가져와 구성한 액세스 토큰의 값을 제공합니다.
암호는 Kafka 브로커 리스너가 인증을 위해 토큰 끝점으로 구성되었는지에 따라
$accessToken:문자열 접두사를 사용하여 전달됩니다.-
토큰 끝점이 구성된 경우 브로커에 클라이언트 시크릿 대신 액세스 토큰이 포함되어 있음을 알리기 위해 암호 앞에
$accessToken:접두사가 추가해야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다. -
Kafka 브로커 리스너에 토큰 끝점이 구성되지 않은 경우(
no-client-credentials 모드강화) 암호는 접두사 없이 액세스 토큰을 제공해야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다. 이 모드에서 클라이언트는 클라이언트 ID와 시크릿을 사용하지 않으며password매개변수는 항상 원시 액세스 토큰으로 해석됩니다.
-
토큰 끝점이 구성된 경우 브로커에 클라이언트 시크릿 대신 액세스 토큰이 포함되어 있음을 알리기 위해 암호 앞에
Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.
- 토큰 인트로스펙션 엔드 포인트가 지정되면 Kafka 브로커는 권한 부여 서버에서 끝점을 호출하여 액세스 토큰을 검증합니다. 토큰 검증에 성공하면 세션이 설정됩니다.
- 로컬 토큰 인트로스펙션을 사용하는 경우 권한 부여 서버에 대한 요청이 없습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 로컬에서 액세스 토큰을 검증합니다.
8.4.6. OAuth 2.0 인증 구성 링크 복사링크가 클립보드에 복사되었습니다!
OAuth 2.0은 Kafka 클라이언트와 AMQ Streams 구성 요소 간의 상호 작용에 사용됩니다.
AMQ Streams에 OAuth 2.0을 사용하려면 다음을 수행해야 합니다.
8.4.6.1. OAuth 2.0 권한 부여 서버 구성 링크 복사링크가 클립보드에 복사되었습니다!
이 절차에서는 일반적으로 AMQ Streams와의 통합을 위해 권한 부여 서버를 구성하기 위해 수행해야 하는 작업을 설명합니다.
이 지침은 제품에 특정하지 않습니다.
단계는 선택한 권한 부여 서버에 따라 다릅니다. OAuth 2.0 액세스 설정 방법에 대한 정보는 권한 부여 서버의 제품 설명서를 참조하십시오.
권한 부여 서버가 이미 배포된 경우 배포 단계를 건너뛰고 현재 배포를 사용할 수 있습니다.
절차
- 클러스터에 권한 부여 서버를 배포합니다.
인증 서버의 CLI 또는 관리 콘솔에 액세스하여 AMQ Streams에 대한 OAuth 2.0을 구성합니다.
이제 AMQ Streams에서 작동하도록 권한 부여 서버를 준비합니다.
-
kafka-broker클라이언트를 구성합니다. - 애플리케이션의 각 Kafka 클라이언트 구성 요소에 대해 클라이언트를 구성합니다.
다음에 수행할 작업
권한 부여 서버를 배포 및 구성한 후 OAuth 2.0을 사용하도록 Kafka 브로커를 구성합니다.
8.4.6.2. Kafka 브로커에 대한 OAuth 2.0 지원 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 인증 서버를 사용하여 브로커 리스너가 OAuth 2.0 인증을 사용하도록 활성화되도록 Kafka 브로커를 구성하는 방법을 설명합니다.
tls: true 가 있는 리스너를 통해 암호화된 인터페이스를 통해 OAuth 2.0을 사용하는 것이 좋습니다. 일반 리스너는 권장되지 않습니다.
권한 부여 서버가 신뢰할 수 있는 CA에서 서명한 인증서를 사용하고 OAuth 2.0 서버 호스트 이름과 일치하는 경우 TLS 연결은 기본 설정을 사용하여 작동합니다. 그렇지 않으면 적절한 인증서로 신뢰 저장소를 구성하거나 인증서 호스트 이름 검증을 비활성화해야 할 수 있습니다.
Kafka 브로커를 구성할 때 새로 연결된 Kafka 클라이언트의 OAuth 2.0 인증 중에 액세스 토큰을 검증하는 데 사용되는 메커니즘에 대한 두 가지 옵션이 있습니다.
시작하기 전에
Kafka 브로커 리스너의 OAuth 2.0 인증 구성에 대한 자세한 내용은 다음을 참조하십시오.
사전 요구 사항
- AMQ Streams 및 Kafka가 실행 중입니다.
- OAuth 2.0 인증 서버가 배포됨
절차
편집기에서
Kafka리소스의 Kafka 브로커 구성(Kafka.spec.kafka)을 업데이트합니다.oc edit kafka my-clusterKafka 브로커
리스너구성을 구성합니다.각 유형의 리스너에 대한 구성은 서로 독립적이므로 동일하지 않아도 됩니다.
다음 예제에서는 외부 리스너에 대해 구성된 구성 옵션을 보여줍니다.
예 1: 빠른 로컬 JWT 토큰 검증 구성
#... - name: external port: 9094 type: loadbalancer tls: true authentication: type: oauth1 validIssuerUri: <https://<auth-server-address>/auth/realms/external>2 jwksEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/certs>3 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
- 토큰에 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 사용자 이름은 사용자를 식별하는 데 사용되는 보안 주체 입니다.
userNameClaim값은 인증 흐름과 사용된 권한 부여 서버에 따라 달라집니다. - 5
- (선택 사항) 액세스 토큰과 동일한 기간 동안 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료되기 위해 남은 시간보다 작으면 실제 토큰 만료 전에 클라이언트가 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되면 세션이 만료되지 않으며 클라이언트는 재인증을 시도하지 않습니다.
- 6
- (선택 사항) 권한 부여 서버에 대한 TLS 연결에 필요한 신뢰할 수 있는 인증서입니다.
- 7
- (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은
false입니다. - 8
- JWKS 인증서는 만료되기 전에 유효한 것으로 간주됩니다. 기본값은
360초입니다. 더 긴 시간을 지정하는 경우 취소된 인증서에 대한 액세스를 허용할 위험을 고려하십시오. - 9
- JWKS 인증서 새로 고침 간격입니다. 간격은 만료 간격보다 최소 60초 짧어야 합니다. 기본값은
300초입니다. - 10
- 연속한 시도 사이에 최소 일시 정지(초)는 JWKS 공개 키를 새로 고침합니다. 알 수 없는 서명 키가 발생하면 JWKS 키 새로 고침은 마지막 새로 고침 시도 이후 지정된 일시 중지를 포함하여 정기적인 일정 외부에서 예약됩니다. 키를 새로 고치면 exponential 백오프 규칙을 따르고
jwksRefreshSeconds에 도달할 때까지 일시 중지를 계속 늘리면 실패한 새로 고침을 다시 시도합니다. 기본값은 1입니다.
예 2: 인트로스펙션 끝점을 사용하여 토큰 검증 구성
- name: external port: 9094 type: loadbalancer tls: true authentication: type: oauth validIssuerUri: <https://<auth-server-address>/auth/realms/external> introspectionEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/token/introspect>1 clientId: kafka-broker2 clientSecret:3 secretName: my-cluster-oauth key: clientSecret userNameClaim: preferred_username4 maxSecondsWithoutReauthentication: 36005 - 1
- 토큰 인트로스펙션 끝점의 URI입니다.
- 2
- 클라이언트를 식별하는 클라이언트 ID입니다.
- 3
- 클라이언트 시크릿 및 클라이언트 ID가 인증에 사용됩니다.
- 4
- 토큰에 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 사용자 이름은 사용자를 식별하는 데 사용되는 보안 주체 입니다.
userNameClaim값은 사용된 권한 부여 서버에 따라 달라집니다. - 5
- (선택 사항) 액세스 토큰과 동일한 기간 동안 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료되기 위해 남은 시간보다 작으면 실제 토큰 만료 전에 클라이언트가 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되면 세션이 만료되지 않으며 클라이언트는 재인증을 시도하지 않습니다.
OAuth 2.0 인증 및 권한 부여 서버 유형에 따라 사용할 수 있는 추가(선택 사항) 구성 설정이 있습니다.
# ... authentication: type: oauth # ... checkIssuer: false1 checkAudience: true2 fallbackUserNameClaim: client_id3 fallbackUserNamePrefix: client-account-4 validTokenType: bearer5 userInfoEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/userinfo6 enableOauthBearer: false7 enablePlain: true8 tokenEndpointUri: https://OAUTH-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 - 1
- 권한 부여 서버에서
iss클레임을 제공하지 않으면 발급자 검사를 수행할 수 없습니다. 이 경우checkIssuer를false로 설정하고validIssuerUri를 지정하지 마십시오. 기본값은true입니다. - 2
- 권한 부여 서버에서
aud(audience) 클레임을 제공하고 오디언스 검사를 적용하려면checkAudience를true로 설정합니다. 대상 검사에서 의도된 토큰 수신자를 식별합니다. 결과적으로 Kafka 브로커는aud클레임에clientId가 없는 토큰을 거부합니다. 기본값은false입니다. - 3
- 권한 부여 서버는 일반 사용자와 클라이언트를 모두 식별하는 단일 속성을 제공하지 않을 수 있습니다. 클라이언트가 자체 이름으로 인증되면 서버에서 클라이언트 ID 를 제공할 수 있습니다. 사용자 이름과 암호를 사용하여 인증할 때 새로 고침 토큰 또는 액세스 토큰을 얻기 위해 서버는 클라이언트 ID 외에도 username 속성을 제공할 수 있습니다. 기본 사용자 ID 속성을 사용할 수 없는 경우 사용할 사용자 이름 클레임(attribute)을 지정하려면 이 대체 옵션을 사용합니다.
- 4
fallbackUserNameClaim이 적용되는 상황에서는 사용자 이름 클레임 값과 대체 사용자 이름 클레임의 값 간에 이름 충돌을 방지해야 할 수도 있습니다. 생산자라는 클라이언트뿐만 아니라생산자라는 일반 사용자도 존재하는 상황을 고려하십시오.이 속성을 사용하여 클라이언트의 사용자 ID에 접두사를 추가할 수 있습니다.You can use this property to add a prefix to the user ID of the client.- 5
- (사용 중인 권한 부여 서버에 따라
introspectionEndpointUri를 사용하는 경우에만 적용 가능) 인트로스펙션 끝점에서 토큰 유형 특성을 반환하거나 반환하지 않거나 다른 값을 포함할 수 있습니다. 인트로스펙션 끝점의 응답에 포함해야 하는 유효한 토큰 유형 값을 지정할 수 있습니다. - 6
- (Introspection
EndpointUri를 사용하는 경우에만) 권한 부여 서버는 Introspection Endpoint 응답으로 식별 가능한 정보를 제공하지 않도록 구성되거나 구현될 수 있습니다. 사용자 ID를 가져오려면userinfo끝점의 URI를 폴백으로 구성할 수 있습니다.userNameClaim,fallbackUserNameClaim,fallbackUserNamePrefix설정이userinfo끝점의 응답에 적용됩니다. - 7
- 이 값을
false로 설정하여 리스너에서 OAUTHBREER 메커니즘을 비활성화합니다. 최소 하나의 PLAIN 또는 OAUTHB possibilityER를 사용하도록 설정해야 합니다. 기본값은true입니다. - 8
- 모든 플랫폼의 클라이언트에 대해 지원되는 리스너에서 PLAIN 인증을 활성화하려면
true로 설정합니다. - 9
- PLAIN 메커니즘에 대한 추가 구성입니다. 지정된 경우 클라이언트는
$accessToken:접두사를 사용하여 액세스 토큰을 암호로전달하여 PLAIN을 통해 인증할 수 있습니다. 프로덕션의 경우 항상https://URL을 사용합니다. - 10
- 이 값을 JsonPath 필터 쿼리로 설정하여 검증 중에 JWT 액세스 토큰에 추가 사용자 지정 규칙을 적용할 수 있습니다. 액세스 토큰에 필요한 데이터가 포함되어 있지 않으면 거부됩니다.
introspectionEndpointUri를 사용하는 경우 사용자 정의 검사가 인트로스펙션 끝점 응답 JSON에 적용됩니다. - 11
- 토큰 끝점에 전달된
대상매개변수입니다. 구독자 간 인증을 위한 액세스 토큰을 가져올 때 대상 사용자가 사용됩니다.An audience is used when obtaining an access token for inter-broker authentication. 또한clientId및시크릿을 사용하여 PLAIN 클라이언트 인증을 통해 OAuth 2.0에 대한 클라이언트 이름에 사용됩니다. 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠만 가져올 수 있습니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다. - 12
- 토큰 끝점에 전달된
범위매개변수입니다. 범위는broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다. 또한clientId및시크릿을 사용하여 PLAIN 클라이언트 인증을 통해 OAuth 2.0에 대한 클라이언트 이름에 사용됩니다. 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠만 가져올 수 있습니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다. - 13
- 권한 부여 서버에 연결할 때 연결 제한 시간(초)입니다. 기본값은 60입니다.
- 14
- 권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
- 15
- 권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은
0입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면connectTimeoutSeconds및readTimeoutSeconds옵션에 대한 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에서 사용할 수 없게 할 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다. - 16
- 권한 부여 서버에 실패한 HTTP 요청의 다른 재시도를 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 일시 중지가 적용되지 않습니다. 실패한 요청으로 인해 많은 문제가 요청별 네트워크 결함 또는 프록시 문제로 신속하게 해결될 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하 상태에 있거나 트래픽이 높은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 재시도 횟수 가능성을 높일 수 있습니다.
- 17
- JWT 토큰 또는 인트로스펙션 끝점 응답에서 그룹 정보를 추출하는 데 사용되는 JsonPath 쿼리입니다. 이 옵션은 기본적으로 설정되어 있지 않습니다. 이 옵션을 구성하면 사용자 정의 작성자가 사용자 그룹을 기반으로 권한 결정을 내릴 수 있습니다.
- 18
- 하나의 구분된 단일 문자열로 반환될 때 그룹 정보를 구문 분석하는 데 사용되는 구분 기호입니다. 기본값은 ','(comma)입니다.
- 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
로그 또는 Pod 상태 전환을 확인하여 업데이트를 확인합니다.
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.
다음에 수행할 작업
8.4.6.3. OAuth 2.0을 사용하도록 Kafka Java 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커와의 상호 작용에 OAuth 2.0을 사용하도록 Kafka 생산자 및 소비자 API를 구성합니다. 클라이언트 pom.xml 파일에 콜백 플러그인을 추가한 다음 OAuth 2.0에 대한 클라이언트를 구성합니다.
클라이언트 구성에 다음을 지정합니다.
SASL(Simple Authentication and Security Layer) 보안 프로토콜:
-
TLS 암호화 연결을 통한 인증에 필요한
SASL_SSL 암호화되지 않은 연결을 통한 인증을 위한
SASL_PLAINTEXT프로덕션에는
SASL_SSL과 로컬 개발에SASL_PLAINTEXT를 사용하십시오.SASL_SSL을 사용하는 경우 추가ssl.truststore구성이 필요합니다. OAuth 2.0 권한 부여 서버에 대한 보안 연결(http://)에는 truststore 구성이 필요합니다. OAuth 2.0 권한 부여 서버를 확인하려면 권한 부여 서버의 CA 인증서를 클라이언트 구성의 신뢰 저장소에 추가합니다. PEM 또는 PKCS #12 형식으로 신뢰 저장소를 구성할 수 있습니다.
-
TLS 암호화 연결을 통한 인증에 필요한
Kafka SASL 메커니즘:
-
전달자 토큰
을사용하여 자격 증명 교환을 위한 태그 -
클라이언트 인증 정보(clientId + secret) 또는 액세스 토큰을 전달하는
PLAIN
-
전달자 토큰
SASL 메커니즘을 구현하는 module(Java Authentication and Authorization Service) 모듈:
-
org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule -
org.apache.kafka.common.security.plain.PlainLoginModule은 PLAIN 메커니즘을 구현합니다.
-
다음 인증 방법을 지원하는 SASL 인증 속성:
- OAuth 2.0 클라이언트 자격 증명
- OAuth 2.0 암호 부여(더 이상 사용되지 않음)
- 액세스 토큰
- 토큰 새로 고침
SASL 인증 속성을 10.0.0.1 구성(sasl.jaas.config)으로 추가합니다. 인증 속성을 구성하는 방법은 OAuth 2.0 권한 부여 서버에 액세스하는 데 사용 중인 인증 방법에 따라 다릅니다. 이 절차에서는 속성 파일에 속성이 지정된 다음 클라이언트 구성으로 로드됩니다.
인증 속성을 환경 변수로 또는 Java 시스템 속성으로 지정할 수도 있습니다. Java 시스템 속성의 경우 setProperty 를 사용하여 -D 옵션을 사용하여 명령줄에서 설정할 수 있습니다.
사전 요구 사항
- AMQ Streams 및 Kafka가 실행 중입니다.
- OAuth 2.0 인증 서버가 Kafka 브로커에 대한 OAuth 액세스를 위해 배포 및 구성
- Kafka 브로커는 OAuth 2.0에 대해 구성됩니다.
절차
OAuth 2.0 지원이 포함된 클라이언트 라이브러리를 Kafka 클라이언트의
pom.xml파일에 추가합니다.<dependency> <groupId>io.strimzi</groupId> <artifactId>kafka-oauth-client</artifactId> <version>0.12.0.redhat-00006</version> </dependency>속성 파일에 다음 구성을 지정하여 클라이언트 속성을 구성합니다.
- 보안 프로토콜
- SASL 메커니즘
사용 중인 방법에 따른 module 및 인증 속성
예를 들어
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 - 1
- TLS 암호화 연결을 위한
SASL_SSL보안 프로토콜. 로컬 개발에만 암호화되지 않은 연결에서는SASL_PLAINTEXT를 사용하십시오. - 2
- SASL 메커니즘을
OAUTHB learnER 또는PLAIN으로 지정합니다. - 3
- Kafka 클러스터에 대한 보안 액세스를 위한 신뢰 저장소 구성입니다.
- 4
- 권한 부여 서버 토큰 끝점의 URI입니다.
- 5
- 클라이언트 ID: 권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름입니다.
- 6
- 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
- 7
- 위치에는 권한 부여 서버의 공개 키 인증서(
truststore.p12)가 포함됩니다. - 8
- 신뢰 저장소에 액세스하기 위한 암호입니다.
- 9
- truststore 유형입니다.
- 10
- (선택 사항) 토큰 끝점에서 토큰을 요청하는
범위입니다. 권한 부여 서버에 범위를 지정하기 위해 클라이언트가 필요할 수 있습니다. - 11
- (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다.
권한 부여 서버에 대상을 지정하기 위해 클라이언트가 필요할 수 있습니다.
password grant mechanism properties
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \1 oauth.client.secret="<client_secret>" \2 oauth.password.grant.username="<username>" \3 oauth.password.grant.password="<password>" \4 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.scope="<scope>" \ oauth.audience="<audience>" ;- 1
- 클라이언트 ID: 권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름입니다.
- 2
- (선택 사항) 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
- 3
- 암호 부여 인증에 대한 사용자 이름입니다. OAuth 암호 부여 구성(사용자 이름 및 암호)은 OAuth 2.0 암호 부여 방법을 사용합니다. 암호 부여를 사용하려면 제한된 권한이 있는 권한 부여 서버에서 클라이언트에 대한 사용자 계정을 만듭니다. 계정이 서비스 계정처럼 작동해야 합니다. 인증에 사용자 계정이 필요하지만 새로 고침 토큰을 사용하는 것이 필요한 환경에서 사용합니다.
- 4
- 암호 부여 인증의 암호입니다.참고
SASL PLAIN은 OAuth 2.0 암호 부여 방법을 사용하여 사용자 이름과 암호(암호 부여) 전달을 지원하지 않습니다.
액세스 토큰 속성
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.access.token="<access_token>" ;1 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \- 1
- Kafka 클라이언트의 장기 액세스 토큰입니다.
토큰 속성 새로 고침
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \1 oauth.client.secret="<client_secret>" \2 oauth.refresh.token="<refresh_token>" ;3 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \
OAUTH 2.0 인증에 대한 클라이언트 속성을 Java 클라이언트 코드로 입력합니다.
클라이언트 속성 입력 표시 예
Properties props = new Properties(); try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) { props.load(reader); }- Kafka 클라이언트가 Kafka 브로커에 액세스할 수 있는지 확인합니다.
8.4.6.4. Kafka 구성 요소에 대한 OAuth 2.0 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 구성 요소를 구성하는 방법을 설명합니다.
다음을 위한 인증을 구성할 수 있습니다.
- Kafka Connect
- Kafka MirrorMaker
- Kafka 브리지
이 시나리오에서는 Kafka 구성 요소와 권한 부여 서버가 동일한 클러스터에서 실행됩니다.
시작하기 전에
Kafka 구성 요소에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 KafkaClientAuthenticationOAuth 스키마 참조 를 참조하십시오. 스키마 참조에는 구성 옵션의 예가 포함되어 있습니다.
사전 요구 사항
- AMQ Streams 및 Kafka가 실행 중입니다.
- OAuth 2.0 인증 서버가 Kafka 브로커에 대한 OAuth 액세스를 위해 배포 및 구성
- Kafka 브로커는 OAuth 2.0에 대해 구성됩니다.
절차
클라이언트 시크릿을 생성하고 구성 요소에 환경 변수로 마운트합니다.
예를 들어, 여기서는 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 - 1
- (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은
false입니다. - 2
- 권한 부여 서버가 JWT 토큰 내에
typ(유형) 클레임을 반환하지 않으면checkAccessTokenType: false를 적용하여 토큰 유형 검사를 건너뛸 수 있습니다. 기본값은true입니다. - 3
- 불투명 토큰을 사용하는 경우 액세스 토큰이 JWT 토큰으로 처리되지 않도록
accessTokenIsJwt: false를 적용할 수 있습니다. - 4
- (선택 사항) 토큰 끝점에서 토큰을 요청하는
범위입니다. 권한 부여 서버에 범위를 지정하기 위해 클라이언트가 필요할 수 있습니다. 이 경우 이모든것입니다. - 5
- (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다.
권한 부여 서버에 대상을 지정하기 위해 클라이언트가 필요할 수 있습니다. 이 경우kafka입니다. - 6
- (선택 사항) 권한 부여 서버에 연결할 때 연결 제한 시간(초)입니다. 기본값은 60입니다.
- 7
- (선택 사항) 권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
- 8
- (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은
0입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면connectTimeoutSeconds및readTimeoutSeconds옵션에 대한 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에서 사용할 수 없게 할 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다. - 9
- (선택 사항) 권한 부여 서버에 실패한 HTTP 요청의 다른 재시도를 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 일시 중지가 적용되지 않습니다. 실패한 요청으로 인해 많은 문제가 요청별 네트워크 결함 또는 프록시 문제로 신속하게 해결될 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하 상태에 있거나 트래픽이 높은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 재시도 횟수 가능성을 높일 수 있습니다.
Kafka 리소스 배포에 변경 사항을 적용합니다.
oc apply -f your-file로그 또는 Pod 상태 전환을 확인하여 업데이트를 확인합니다.
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w롤링 업데이트는 OAuth 2.0 인증을 사용하여 Kafka 브로커와 상호 작용하도록 구성 요소를 구성합니다.
8.5. OAuth 2.0 토큰 기반 권한 부여 사용 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 Red Hat Single Sign-On Authorization Services 를 통해 OAuth 2.0 토큰 기반 권한 부여를 지원하므로 보안 정책 및 권한을 중앙에서 관리할 수 있습니다.
Red Hat Single Sign-On에 정의된 보안 정책 및 권한은 Kafka 브로커의 리소스에 대한 액세스 권한을 부여하는 데 사용됩니다. 사용자와 클라이언트는 Kafka 브로커에서 특정 작업을 수행하기 위해 액세스를 허용하는 정책과 대조됩니다.
Kafka는 기본적으로 모든 사용자에게 브로커에 대한 전체 액세스를 허용하고, ACL(액세스 제어 목록)을 기반으로 권한을 구성할 수 있도록 AclAuthorizer 플러그인도 제공합니다.
zookeeper는 사용자 이름을 기반으로 리소스에 대한 액세스를 부여하거나 거부하는 ACL 규칙을 저장합니다. 그러나 Red Hat Single Sign-On을 통한 OAuth 2.0 토큰 기반 권한 부여는 Kafka 브로커에 대한 액세스 제어를 구현하는 방법에 대해 훨씬 더 큰 유연성을 제공합니다. 또한 OAuth 2.0 권한 부여 및 ACL을 사용하도록 Kafka 브로커를 구성할 수 있습니다.
8.5.1. OAuth 2.0 인증 메커니즘 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams의 OAuth 2.0 권한 부여에서는 Red Hat Single Sign-On 서버 권한 부여 서비스 REST 엔드포인트를 사용하여 특정 사용자에게 정의된 보안 정책을 적용하고 해당 사용자에게 다양한 리소스에 부여된 권한 목록을 제공하여 Red Hat Single Sign-On으로 토큰 기반 인증을 확장합니다. 정책은 역할 및 그룹을 사용하여 사용자와 권한을 일치시킵니다. OAuth 2.0 권한 부여는 Red Hat Single Sign-On 인증 서비스에서 사용자에게 수신된 부여 목록에 따라 권한을 로컬로 적용합니다.
8.5.1.1. Kafka 브로커 사용자 정의 인증 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat Single Sign-On 작성자(KeycloakRBACAuthorizer)는 AMQ Streams를 통해 제공됩니다. Red Hat Single Sign-On에서 제공하는 인증 서비스에 Red Hat Single Sign-On REST 엔드포인트를 사용하려면 Kafka 브로커에 사용자 정의 인증 기관을 구성합니다.
작성자는 필요에 따라 권한 부여 서버에서 부여된 권한 목록을 가져와서 Kafka 브로커에 로컬로 권한 부여를 적용하여 각 클라이언트 요청에 대해 신속하게 승인 결정을 내립니다.
8.5.2. OAuth 2.0 권한 부여 지원 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Red Hat Single Sign-On 인증 서비스를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 브로커를 구성하는 방법을 설명합니다.
사전 준비 사항
특정 사용자에 대해 요청하거나 제한하려는 액세스를 고려하십시오. Red Hat Single Sign-On 그룹,역할,클라이언트 및 사용자를 결합하여 Red Hat Single Sign-On에서 액세스를 구성할 수 있습니다.
일반적으로 그룹은 조직의 부서 또는 지리적 위치에 따라 사용자와 일치시키는 데 사용됩니다. 및 역할은 해당 기능에 따라 사용자와 일치시키는 데 사용됩니다.
Red Hat Single Sign-On을 사용하면 사용자와 그룹을 LDAP에 저장할 수 있지만 클라이언트와 역할은 이러한 방식으로 저장할 수 없습니다. 권한 부여 정책 구성 방법을 선택하는 데 사용자 데이터에 대한 스토리지 및 액세스 요소가 될 수 있습니다.
Super 사용자에게 는 Kafka 브로커에 구현된 권한 부여와 관계없이 Kafka 브로커에 대한 제한되지 않은 액세스 권한이 항상 있습니다.
사전 요구 사항
- AMQ Streams는 토큰 기반 인증에 Red Hat Single Sign-On과 함께 OAuth 2.0을 사용하도록 구성해야 합니다. 권한을 설정할 때 동일한 Red Hat Single Sign-On 서버 엔드포인트를 사용합니다.
-
재인증을 활성화하려면 OAuth 2.0 인증을
maxSecondsWithoutReauthentication옵션으로 구성해야 합니다.
절차
- Red Hat Single Sign-On 관리 콘솔에 액세스하거나 OAuth 2.0 인증을 설정할 때 생성한 Kafka 브로커 클라이언트에 대한 인증 서비스를 활성화하려면 Red Hat Single Sign-On Admin CLI를 사용합니다.
- 권한 부여 서비스를 사용하여 클라이언트에 대한 리소스, 권한 부여 범위, 정책 및 권한을 정의합니다.
- 역할 및 그룹을 할당하여 사용자 및 클라이언트에 권한을 바인딩합니다.
편집기에서 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 connectTimeoutSeconds: 6010 readTimeoutSeconds: 6011 httpRetries: 212 #...- 1
- 유형
keycloak을 사용하면 Red Hat Single Sign-On 인증을 사용할 수 있습니다. - 2
- Red Hat Single Sign-On 토큰 끝점의 URI입니다. 프로덕션의 경우 항상
https://URL을 사용합니다. 토큰 기반oauth인증을 구성할 때jwksEndpointUri를 로컬 JWT 검증을 위한 URI로 지정합니다.tokenEndpointUriURI의 호스트 이름은 동일해야 합니다. - 3
- 권한 부여 서비스가 활성화된 Red Hat Single Sign-On의 OAuth 2.0 클라이언트 정의의 클라이언트 ID입니다. 일반적으로
kafka는 ID로 사용됩니다. - 4
- (선택 사항) Red Hat Single Sign-On 인증 서비스 정책에서 액세스를 거부하는 경우 Kafka
AclAuthorizer에 대한 권한 부여 기본값은false입니다. - 5
- (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은
false입니다. - 6
- (선택 사항) 지정된 수퍼 사용자입니다.
- 7
- (선택 사항) 권한 부여 서버에 대한 TLS 연결에 필요한 신뢰할 수 있는 인증서입니다.
- 8
- (선택 사항) 연속 두 개의 연속 부여 새로 고침 실행 사이의 시간입니다. 즉 활성 세션에서 Red Hat Single Sign-On에서 사용자의 권한 변경을 감지할 수 있는 최대 시간입니다. 기본값은 60입니다.
- 9
- (선택 사항) 활성 세션에 대한 부여를 새로 고치는 데 사용할 스레드 수입니다. 기본값은 5입니다.
- 10
- (선택 사항) Red Hat Single Sign-On 토큰 엔드포인트에 연결할 때 연결 제한 시간(초)입니다. 기본값은 60입니다.
- 11
- (선택 사항) Red Hat Single Sign-On 토큰 엔드포인트에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
- 12
- (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 재시도하지 않고 재시도할 최대 횟수입니다. 기본값은
0입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면connectTimeoutSeconds및readTimeoutSeconds옵션에 대한 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에서 사용할 수 없게 할 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
- 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
로그 또는 Pod 상태 전환을 확인하여 업데이트를 확인합니다.
oc logs -f ${POD_NAME} -c kafka oc get pod -w롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.
- Kafka 브로커에 특정 역할을 가진 클라이언트 또는 사용자로 액세스하여 구성된 권한을 확인하고, 필요한 액세스 권한이 있는지 확인하거나, 보유하지 않은 권한이 없는지 확인합니다.
8.5.3. Red Hat Single Sign-On 권한 부여 서비스에서 정책 및 권한 관리 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션에서는 Red Hat Single Sign-On Authorization Services 및 Kafka에서 사용하는 권한 부여 모델에 대해 설명하고 각 모델에서 중요한 개념을 정의합니다.
Kafka에 액세스할 수 있는 권한을 부여하려면 Red Hat Single Sign-On에서 OAuth 클라이언트 사양 을 생성하여 Red Hat Single Sign-On 인증 서비스 오브젝트를 Kafka 리소스에 매핑할 수 있습니다. Kafka 권한은 Red Hat Single Sign-On 인증 서비스 규칙을 사용하여 사용자 계정 또는 서비스 계정에 부여됩니다.
다음은 주제 생성 및 나열과 같은 공통 Kafka 작업에 필요한 다양한 사용자 권한의 예입니다.
8.5.3.1. Kafka 및 Red Hat Single Sign-On 권한 부여 모델 개요 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 및 Red Hat Single Sign-On 인증 서비스는 다른 권한 부여 모델을 사용합니다.
Kafka 인증 모델
Kafka의 권한 부여 모델은 리소스 유형을 사용합니다. Kafka 클라이언트가 브로커에 작업을 수행할 때 브로커는 구성된 KeycloakRBACAuthorizer 를 사용하여 작업 및 리소스 유형에 따라 클라이언트의 권한을 확인합니다.
Kafka는 5가지 리소스 유형을 사용하여 액세스를 제어합니다. Topic,Group,Cluster,TransactionalId, DelegationToken. 각 리소스 유형에는 사용 가능한 권한 집합이 있습니다.
주제
-
개발 -
write -
read -
delete -
describe -
DescribeConfigs -
변경 -
AlterConfigs
그룹
-
read -
describe -
delete
Cluster
-
개발 -
describe -
변경 -
DescribeConfigs -
AlterConfigs -
IdempotentWrite -
ClusterAction
TransactionalId
-
describe -
write
DelegationToken
-
describe
Red Hat Single Sign-On 인증 서비스 모델
Red Hat Single Sign-On Authorization Services 모델에는 권한 정의 및 부여 범위, 권한 부여범위,정책 및 권한 부여 에 대한 4가지 개념이 있습니다.
- Resources
- 리소스는 허용된 작업과 리소스를 일치시키는 데 사용되는 리소스 정의 집합입니다. 리소스는 개별 항목(예: 또는 동일한 접두사로 시작하는 이름이 있는 모든 항목)일 수 있습니다. 리소스 정의는 사용 가능한 권한 부여 범위 집합과 연관되며, 리소스에서 사용 가능한 모든 작업 집합을 나타냅니다. 이러한 작업의 하위 집합만 실제로 허용됩니다.
- 권한 부여 범위
- 권한 부여 범위는 특정 리소스 정의에서 사용 가능한 모든 작업의 집합입니다. 새 리소스를 정의할 때 모든 범위 집합의 범위를 추가합니다.
- Policies
정책은 계정 목록과 일치하는 조건을 사용하는 권한 부여 규칙입니다. 정책은 다음과 일치할 수 있습니다.
- 클라이언트 ID 또는 역할을 기반으로 하는 서비스 계정
- 사용자 이름, 그룹 또는 역할을 기반으로 하는 사용자 계정 입니다.
- 권한
- 권한은 특정 리소스 정의의 권한 부여 범위 하위 집합을 사용자 집합에 부여합니다.
8.5.3.2. Red Hat Single Sign-On 인증 서비스를 Kafka 인증 모델에 매핑 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 권한 부여 모델은 Kafka에 대한 액세스를 제어하는 Red Hat Single Sign-On 역할 및 리소스를 정의하는 기반으로 사용됩니다.
사용자 계정 또는 서비스 계정에 Kafka 권한을 부여하려면 먼저 Kafka 브로커에 대한 Red Hat Single Sign-On에 OAuth 클라이언트 사양 을 생성합니다. 그런 다음 클라이언트에서 Red Hat Single Sign-On 인증 서비스 규칙을 지정합니다. 일반적으로 브로커를 나타내는 OAuth 클라이언트의 클라이언트 ID는 kafka 입니다. AMQ Streams와 함께 제공되는 설정 파일의 예는 kafka 를 OAuth 클라이언트 ID로 사용합니다.
Kafka 클러스터가 여러 개인 경우 모든 클러스터에 단일 OAuth 클라이언트(Kafka)를 사용할 수 있습니다. 권한 부여 규칙을 정의하고 관리할 수 있는 단일 통합 공간을 제공합니다. 그러나 서로 다른 OAuth 클라이언트 ID(예: my-cluster-kafka 또는 cluster-dev-kafka)를 사용하고 각 클라이언트 구성 내에서 각 클러스터에 대한 권한 부여 규칙을 정의할 수도 있습니다.
kafka 클라이언트 정의에 Red Hat Single Sign-On 관리 콘솔에서 Authorization Enabled 옵션이 활성화되어 있어야 합니다.
모든 권한은 kafka 클라이언트의 범위 내에 있습니다. 다른 OAuth 클라이언트 ID로 구성된 Kafka 클러스터가 서로 다른 경우 동일한 Red Hat Single Sign-On 영역의 일부인 경우에도 각각 별도의 권한 집합이 필요합니다.
Kafka 클라이언트가 OAUTHBISTRAER 인증을 사용하는 경우 Red Hat Single Sign-On 작성자(KeycloakRBACAuthorizer)는 현재 세션의 액세스 토큰을 사용하여 Red Hat Single Sign-On 서버에서 부여 목록을 검색합니다. 권한을 검색하기 위해 작성자는 Red Hat Single Sign-On Authorization Services 정책 및 권한을 평가합니다.
Kafka 권한의 권한 부여 범위
초기 Red Hat Single Sign-On 구성은 일반적으로 각 Kafka 리소스 유형에서 수행할 수 있는 모든 가능한 작업 목록을 생성하기 위해 권한 부여 범위를 업로드하는 것입니다. 이 단계는 권한을 정의하기 전에 한 번만 수행됩니다. 권한 부여 범위를 업로드하는 대신 수동으로 추가할 수 있습니다.
권한 부여 범위에는 리소스 유형에 관계없이 가능한 모든 Kafka 권한이 포함되어야 합니다.
-
개발 -
write -
read -
delete -
describe -
변경 -
DescribeConfig -
AlterConfig -
ClusterAction -
IdempotentWrite
권한이 필요하지 않은 경우(예: IdempotentWrite), 권한 부여 범위 목록에서 생략할 수 있습니다. 그러나 이 권한은 Kafka 리소스에서 대상으로 할 수 없습니다.
권한 검사에 대한 리소스 패턴
리소스 패턴은 권한 검사를 수행할 때 대상 리소스와 일치하는 패턴에 사용됩니다. 일반 패턴 형식은 RESOURCE-TYPE:PATTERN-NAME 입니다.
리소스 유형은 Kafka 권한 부여 모델을 미러링합니다. 이 패턴은 두 가지 일치 옵션을 허용합니다.
-
정확한 일치 (지표가
*로 끝나지 않는 경우) -
접두사 일치 (일정이
*로 끝나는 경우)
리소스의 패턴 예
Topic:my-topic
Topic:orders-*
Group:orders-*
Cluster:*
또한 일반 패턴 형식 앞에 kafka-cluster:CLUSTER-NAME 을 붙일 수 있습니다. 여기서 CLUSTER-NAME 은 Kafka 사용자 정의 리소스의 metadata.name 을 나타냅니다.
클러스터 접두사가 있는 리소스의 패턴 예
kafka-cluster:my-cluster,Topic:*
kafka-cluster:*,Group:b_*
kafka-cluster 접두사가 없는 경우 kafka-cluster:* 로 간주됩니다.
리소스를 정의할 때 리소스와 관련된 가능한 권한 부여 범위 목록과 연결할 수 있습니다. 대상 리소스 유형에 적합한 모든 작업을 설정합니다.
모든 리소스에 권한 부여 범위를 추가할 수 있지만 리소스 유형에서 지원하는 범위만 액세스 제어로 간주됩니다.
액세스 권한 적용을 위한 정책
정책은 하나 이상의 사용자 계정 또는 서비스 계정에 대한 권한을 대상으로 하는 데 사용됩니다. 대상은 다음을 참조할 수 있습니다.
- 특정 사용자 또는 서비스 계정
- 영역 역할 또는 클라이언트 역할
- 사용자 그룹
- 클라이언트 IP 주소와 일치하는 JavaScript 규칙
정책에는 고유한 이름이 지정되고 재사용하여 여러 리소스에 대한 여러 권한을 대상으로 할 수 있습니다.
액세스 권한을 부여할 수 있는 권한
세분화된 권한을 사용하여 사용자에게 액세스 권한을 부여하는 정책, 리소스 및 권한 부여 범위를 함께 가져옵니다.
각 권한의 이름은 어떤 사용자에게 부여하는 권한을 명확하게 정의해야 합니다. 예를 들어 Dev Team B는 x로 시작하는 주제에서 읽을 수 있습니다.
8.5.3.3. Kafka 작업에 필요한 권한 예 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제에서는 Kafka에서 공통 작업을 수행하는 데 필요한 사용자 권한을 보여줍니다.
주제 만들기
주제를 생성하려면 특정 주제 또는 Cluster:kafka-cluster 에 대해 Create 권한이 필요합니다.
bin/kafka-topics.sh --create --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
주제 나열
사용자에게 지정된 항목에 대한 Describe 권한이 있는 경우 해당 항목이 나열됩니다.
bin/kafka-topics.sh --list \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
주제 세부 정보 표시
주제 세부 사항을 표시하려면 항목에 대해 권한이 필요합니다.
설명 및 설명
bin/kafka-topics.sh --describe --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
항목에 대한 메시지 생성
항목에 메시지를 생성하려면 항목에 대해 설명 및 쓰기 권한이 필요합니다.
주제가 아직 생성되지 않았으며 자동 생성 항목이 활성화되어 있으면 주제를 만들 수 있는 권한이 필요합니다.
bin/kafka-console-producer.sh --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties
주제의 메시지 사용
주제의 메시지를 사용하려면 항목에 대해 설명 및 읽기 권한이 필요합니다. 주제에서 사용하는 것은 일반적으로 소비자 그룹에 소비자 오프셋을 저장하는 데 의존하며, 소비자 그룹에 대한 추가 설명 및 읽기 권한이 필요합니다.
일치하려면 두 개의 리소스 가 필요합니다. 예를 들면 다음과 같습니다.
Topic:my-topic
Group:my-group-*
bin/kafka-console-consumer.sh --topic my-topic --group my-group-1 --from-beginning \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --consumer.config /tmp/config.properties
idempotent 생산자를 사용하여 항목에 메시지 생성
주제로 생성할 수 있는 권한뿐만 아니라 Cluster:kafka-cluster 리소스에 추가 IdempotentWrite 권한이 필요합니다.
일치하려면 두 개의 리소스 가 필요합니다. 예를 들면 다음과 같습니다.
Topic:my-topic
Cluster:kafka-cluster
bin/kafka-console-producer.sh --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties --producer-property enable.idempotence=true --request-required-acks -1
소비자 그룹 나열
소비자 그룹을 나열할 때 사용자에게 Describe 권한이 있는 그룹만 반환됩니다. 또는 사용자에게 Cluster:kafka-cluster 에 대한 Describe 권한이 있는 경우 모든 소비자 그룹이 반환됩니다.
bin/kafka-consumer-groups.sh --list \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
소비자 그룹 세부 정보 표시
소비자 그룹의 세부 사항을 표시하려면 그룹 및 그룹과 연결된 항목에 대한 설명 권한이 필요합니다.
bin/kafka-consumer-groups.sh --describe --group my-group-1 \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
주제 구성 변경
주제 구성을 변경하려면 항목에 대해 설명 및 대체 권한이 필요합니다.
bin/kafka-topics.sh --alter --topic my-topic --partitions 2 \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
Kafka 브로커 구성 표시
kafka-configs.sh 를 사용하여 브로커 구성을 가져오려면 Cluster:kafka-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 에 대해 DescribeConfigs 및 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 에 대해 설명 및 대체 권한이 필요합니다. 또한 사용 권한에 대해 설명해야 합니다.Also, Describe permissions are required on the topics involved.
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --execute \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
파티션 재할당을 확인하려면 Cluster:kafka-cluster 및 관련 주제 각각에 대해 파티션 할당을 확인하고 AlterConfigs 권한이 필요합니다.
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --verify \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
8.5.4. Red Hat Single Sign-On 인증 서비스 사용 링크 복사링크가 클립보드에 복사되었습니다!
이 예에서는 키cloak 권한 부여와 함께 Red Hat Single Sign-On 인증 서비스를 사용하는 방법을 설명합니다. Kafka 클라이언트에 대한 액세스 제한을 적용하려면 Red Hat Single Sign-On 인증 서비스를 사용합니다. Red Hat Single Sign-On Authorization Services는 권한 부여 범위, 정책 및 권한을 사용하여 리소스에 대한 액세스 제어를 정의하고 적용합니다.
Red Hat Single Sign-On Authorization Services REST 엔드포인트는 인증된 사용자를 위한 리소스에 대한 승인된 권한 목록을 제공합니다. Kafka 클라이언트가 인증된 세션을 설정한 후 Red Hat Single Sign-On 서버에서 첫 번째 조치로 부여(권한) 목록은 Red Hat Single Sign-On 서버에서 가져옵니다. 권한 부여 변경 사항이 감지되도록 목록이 백그라운드에서 새로 고쳐집니다. 권한 부여는 빠른 권한 결정을 제공하기 위해 각 사용자 세션에 대해 Kafka 브로커에 로컬로 캐시되고 적용됩니다.
AMQ Streams는 구성 파일 예제 를 제공합니다. 다음은 Red Hat Single Sign-On 설정을 위한 다음 예제 파일이 있습니다.
kafka-ephemeral-oauth-single-keycloak-authz.yaml-
Red Hat Single Sign-On을 사용하여 OAuth 2.0 토큰 기반 인증에 대해 구성된
Kafka사용자 지정 리소스의 예입니다. 사용자 정의 리소스를 사용하여키cloak권한 부여 및 토큰 기반oauth인증을 사용하는 Kafka 클러스터를 배포할 수 있습니다. kafka-authz-realm.json- 샘플 그룹, 사용자, 역할 및 클라이언트로 구성된 Red Hat Single Sign-On 영역의 예입니다. 영역을 Red Hat Single Sign-On 인스턴스로 가져와서 Kafka에 액세스할 수 있는 세분화된 권한을 설정할 수 있습니다.
Red Hat Single Sign-On으로 예제를 시도하려면 다음 파일을 사용하여 표시된 순서대로 이 섹션에 설명된 작업을 수행합니다.
인증
토큰 기반 oauth 인증을 구성할 때 jwksEndpointUri 를 로컬 JWT 검증을 위한 URI로 지정합니다. keycloak 인증을 구성할 때 tokenEndpointUri 를 Red Hat Single Sign-On 토큰 끝점의 URI로 지정합니다. 두 URI의 호스트 이름은 동일해야 합니다.
그룹 또는 역할 정책이 포함된 대상 권한
Red Hat Single Sign-On에서 서비스 계정이 있는 기밀 클라이언트는 클라이언트 ID와 시크릿을 사용하여 자체 이름으로 서버에 인증할 수 있습니다. 이 기능은 일반적으로 특정 사용자(예: 웹 사이트)의 에이전트가 아닌 자체 이름으로 작동하는 마이크로 서비스에 편리합니다. 서비스 계정에는 일반 사용자와 같은 역할이 할당될 수 있습니다. 그러나 그룹을 할당할 수는 없습니다. 결과적으로 서비스 계정을 사용하여 마이크로 서비스에 대한 권한을 대상으로 지정하려면 그룹 정책을 사용할 수 없으며 대신 역할 정책을 사용해야 합니다. 반대로 사용자 이름 및 암호를 사용한 인증이 필요한 일반 사용자 계정으로만 특정 권한을 제한하려면 역할 정책이 아닌 그룹 정책을 사용하여 이를 수행할 수 있습니다. 이는 ClusterManager 로 시작하는 권한에 대해 이 예에서 사용되는 것입니다. 일반적으로 CLI 툴을 사용하여 클러스터 관리 수행은 대화식으로 수행됩니다. 결과 액세스 토큰을 사용하여 Kafka 브로커에 인증하기 전에 사용자가 로그인해야 하는 것이 좋습니다. 이 경우 액세스 토큰은 클라이언트 애플리케이션이 아닌 특정 사용자를 나타냅니다.
8.5.4.1. Red Hat Single Sign-On 관리 콘솔에 액세스 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat Single Sign-On을 설정한 다음 관리 콘솔에 연결하고 사전 구성된 영역을 추가합니다. 예제 kafka-authz-realm.json 파일을 사용하여 영역을 가져옵니다. Admin Console에서 영역에 대해 정의된 권한 부여 규칙을 확인할 수 있습니다. 규칙은 예제 Red Hat Single Sign-On 영역을 사용하도록 구성된 Kafka 클러스터의 리소스에 대한 액세스 권한을 부여합니다.
사전 요구 사항
- 실행 중인 OpenShift 클러스터.
-
AMQ Streams
examples/security/keycloak-authorization/kafka-authz-realm.json파일은 사전 구성된 영역을 포함합니다.
절차
- 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이 예제에서는 시크릿 이름이 credentials
-keycloak이라고 가정합니다.사용자 이름
admin과 가져온 암호를 사용하여 관리 콘솔에 로그인합니다.https://HOSTNAME을 사용하여 KubernetesIngress에 액세스합니다.이제 Admin Console을 사용하여 예제 영역을 Red Hat Single Sign-On에 업로드할 수 있습니다.
- Add CloudEvent를 클릭하여 예제 영역을 가져옵니다.
examples/security/keycloak-authorization/kafka-authz-realm.json파일을 추가한 다음 Create 를 클릭합니다.이제 관리 콘솔의 현재 영역으로
kafka-authz가 있습니다.기본 보기는 마스터 영역을 표시합니다.
Red Hat Single Sign-On 관리 콘솔에서 클라이언트 > kafka > Authorization > Settings 로 이동하여 결정 전략이 승인으로 설정되어 있는지 확인합니다.
검증 정책은 클라이언트가 Kafka 클러스터에 액세스하기 위해 하나 이상의 정책을 충족해야 함을 의미합니다.
Red Hat Single Sign-On 관리 콘솔에서 그룹,사용자,역할, 클라이언트로 이동 하여 영역 구성을 확인합니다.
- 그룹
-
그룹은사용자 그룹을 생성하고 사용자 권한을 설정하는 데 사용됩니다. groups은 이름이 할당된 사용자 집합입니다. 사용자를 지역, 조직 또는 부서 단위로 구분하는 데 사용됩니다. 그룹을 LDAP ID 공급자에 연결할 수 있습니다. 예를 들어 Kafka 리소스에 대한 권한을 부여하기 위해 사용자 정의 LDAP 서버 관리자 사용자 인터페이스를 통해 사용자를 그룹 멤버로 만들 수 있습니다. - 사용자
-
사용자는사용자를 생성하는 데 사용됩니다. 이 예제에서는alice및bob가 정의됩니다.Alice는ClusterManager그룹의 멤버이며bob는ClusterManager-my-cluster그룹의 멤버입니다. 사용자는 LDAP ID 공급자에 저장할 수 있습니다. - 역할
-
역할은사용자 또는 클라이언트를 특정 권한을 갖는 것으로 표시합니다. 역할은 그룹과 유사한 개념입니다. 일반적으로 조직의 역할을 가진 사용자를 태그 하고 필수 권한을 갖는 데 사용됩니다. 역할은 LDAP ID 공급자에 저장할 수 없습니다. LDAP가 요구 사항인 경우 대신 그룹을 사용하고 Red Hat Single Sign-On 역할을 그룹에 추가하여 사용자에게 해당 역할을 할당받을 수 있습니다. - 클라이언트
클라이언트에는 특정 구성이 있을 수 있습니다. 예에서는kafka,kafka-cli,team-a-client및team-b-client클라이언트가 구성됩니다.-
kafka클라이언트는 Kafka 브로커가 액세스 토큰 검증에 필요한 OAuth 2.0 통신을 수행하는 데 사용됩니다. 이 클라이언트에는 Kafka 브로커에서 권한을 수행하는 데 사용되는 권한 부여 서비스 리소스 정의, 정책 및 권한 부여 범위도 포함되어 있습니다. 권한 부여 구성은 Authorization Enabled 가 Settings 탭에서 전환될 때 표시되는 Authorization 탭의kafka클라이언트에 정의되어 있습니다. -
kafka-cli클라이언트는 액세스 토큰 또는 새로 고침 토큰을 가져오기 위해 사용자 이름 및 암호로 인증할 때 Kafka 명령줄 툴에서 사용하는 공용 클라이언트입니다. -
team-a-client및team-b-client클라이언트는 특정 Kafka 항목에 대한 부분 액세스 권한이 있는 서비스를 나타내는 기밀 클라이언트입니다.
-
Red Hat Single Sign-On 관리 콘솔에서 권한 부여 > 권한으로 이동하여 영역에 정의된 리소스 및 정책을 사용하는 승인된 권한을 확인합니다.
예를 들어
kafka클라이언트에는 다음과 같은 권한이 있습니다.Dev Team A can write to topics that start with x_ on any cluster Dev Team B can read from topics that start with x_ on any cluster Dev Team B can update consumer group offsets that start with x_ on any cluster ClusterManager of my-cluster Group has full access to cluster config on my-cluster ClusterManager of my-cluster Group has full access to consumer groups on my-cluster ClusterManager of my-cluster Group has full access to topics on my-cluster- Dev Team A
-
Dev Team A realm 역할은 모든 클러스터에서
x_로 시작하는 항목에 쓸 수 있습니다. 이를 통해Topic:x_*,Describe및Write범위,Dev Team A정책이 결합되어 있습니다.Dev Team A정책은Dev Team A라는 영역 역할이 있는 모든 사용자와 일치합니다. - Dev Team B
-
Dev Team B 영역 역할은 모든 클러스터에서
x_로 시작하는 주제에서 읽을 수 있습니다. 이를 통해Topic:x_*,Group:x_*리소스,설명및읽기범위,Dev Team B정책이 결합되어 있습니다.Dev Team B정책은Dev Team B라는 영역 역할이 있는 모든 사용자와 일치합니다. 사용자 및 클라이언트 일치에는 주제에서 읽고x_로 시작하는 이름이 있는 주제 및 소비자 그룹에 대해 소비된 오프셋을 업데이트할 수 있습니다.
8.5.4.2. Red Hat Single Sign-On 인증을 사용하여 Kafka 클러스터 배포 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat Single Sign-On 서버에 연결하도록 구성된 Kafka 클러스터를 배포합니다. 예제 kafka-ephemeral-oauth-single-keycloak-authz.yaml 파일을 사용하여 Kafka 사용자 정의 리소스로 Kafka 클러스터를 배포합니다. 이 예제에서는 keycloak 권한 부여 및 oauth 인증을 사용하여 단일 노드 Kafka 클러스터를 배포합니다.
사전 요구 사항
- Red Hat Single Sign-On 권한 부여 서버는 OpenShift 클러스터에 배포되어 예제 영역을 사용하여 로드됩니다.
- Cluster Operator가 OpenShift 클러스터에 배포됩니다.
-
AMQ Streams
예제/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml사용자 정의 리소스
절차
배포된 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.pemKubernetes
Ingress를 사용하여 보안(HTTPS)을 연결하면 인증서가 필요합니다.일반적으로 단일 인증서는 없지만 인증서 체인이 있습니다.
/tmp/sso.pem파일에 마지막으로 나열된 최상위 발급자 CA만 제공해야 합니다. 수동으로 추출하거나 다음 명령을 사용할 수 있습니다.인증서 체인에서 최상위 CA 인증서를 추출하는 명령 예
split -p "-----BEGIN CERTIFICATE-----" sso.pem sso- for f in $(ls sso-*); do mv $f $f.pem; done cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt참고신뢰할 수 있는 CA 인증서는 일반적으로
openssl명령을 사용하는 것이 아니라 신뢰할 수 있는 소스에서 가져옵니다.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 -
8.5.4.3. CLI Kafka 클라이언트 세션에 대한 TLS 연결 준비 링크 복사링크가 클립보드에 복사되었습니다!
대화형 CLI 세션에 대한 새 Pod를 생성합니다. TLS 연결을 위해 Red Hat Single Sign-On 인증서가 있는 신뢰 저장소를 설정합니다. 신뢰 저장소는 Red Hat Single Sign-On 및 Kafka 브로커에 연결하는 것입니다.
사전 요구 사항
Red Hat Single Sign-On 권한 부여 서버는 OpenShift 클러스터에 배포되어 예제 영역을 사용하여 로드됩니다.
Red Hat Single Sign-On 관리 콘솔에서 클라이언트에 할당된 역할이 클라이언트 > 서비스 계정 역할에 표시되는지 확인합니다.
- Red Hat Single Sign-On과 연결하도록 구성된 Kafka 클러스터는 OpenShift 클러스터에 배포됩니다.
절차
AMQ Streams Kafka 이미지를 사용하여 새 대화형 Pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.
NS=sso oc run -ti --restart=Never --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 kafka-cli -n $NS -- /bin/sh참고이미지 다운로드에서
oc시간이 초과되면 후속 시도로 인해 AlreadyExists 오류가 발생할 수 있습니다.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이 필요하지 않습니다. 자세한 내용은 7장. Kafka 클러스터에 대한 클라이언트 액세스 설정의 내용을 참조하십시오.Kafka 브로커의 인증서를 신뢰 저장소에 추가합니다.
keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias my-cluster-kafka -storepass $STOREPASS -import -file /tmp/my-cluster-kafka-ca.crt -noprompt권한이 부여된 액세스 권한을 확인하기 위해 세션을 열린 상태로 유지합니다.
8.5.4.4. CLI Kafka 클라이언트 세션을 사용하여 Kafka에 대한 권한 있는 액세스 확인 링크 복사링크가 클립보드에 복사되었습니다!
대화형 CLI 세션을 사용하여 Red Hat Single Sign-On 영역을 통해 적용된 권한 부여 규칙을 확인합니다. Kafka의 예제 생산자 및 소비자 클라이언트를 사용하여 점검을 적용하여 액세스 수준이 다른 사용자 및 서비스 계정에 주제를 생성합니다.
team-a-client 및 team-b-client 클라이언트를 사용하여 권한 부여 규칙을 확인합니다. alice admin 사용자를 사용하여 Kafka에서 추가 관리 작업을 수행합니다.
이 예제에서 사용된 AMQ Streams Kafka 이미지에는 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 OAUTHBLOGER 메커니즘이 사용됩니다. 이 메커니즘을 사용하려면 클라이언트 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 사용자의 인증 속성을 사용하여 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이 요청은 주제에 액세스할 수 있는
Not authorized to access topics: [my-topic]오류를 반환합니다.team-a-client에는a_로 시작하는 항목에 대해 지원되는 모든 작업을 수행할 수 있는 권한을 부여하는Dev Team A역할이 있지만x_로 시작하는 항목에만 쓸 수 있습니다.my-topic이라는 주제는 해당 규칙과 일치하지 않습니다.a_ECDHE에 주제를 작성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-a-client.properties First message Second messageKafka에 메시지가 성공적으로 생성됩니다.
- Ctrl+C를 눌러 CLI 애플리케이션을 종료합니다.
요청에 대한
Authorization GRANTED의 디버그 로그가 Kafka 컨테이너 로그를 확인합니다.oc logs my-cluster-kafka-0 -f -n $NS
권한 있는 액세스로 메시지 사용
team-a-client 구성을 사용하여 a_ECDHE 주제의 메시지를 사용합니다.
주제
a_ECDHE에서 메시지를 가져옵니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --from-beginning --consumer.config /tmp/team-a-client.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_ECDHE 주제에서 모든 메시지를수신합니다.
권한 있는 액세스로 Kafka 삭제
team-a-client 는 클러스터 수준 액세스 권한이 없는 계정이지만 일부 관리 작업과 함께 사용할 수 있습니다.
주제 나열.
bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --lista_ECDHE 주제가반환됩니다.소비자 그룹을 나열합니다.
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_ECDHE에 주제를 작성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-b-client.properties Message 1이 요청은 항목에 액세스할 수
있는 Not authorized to access topics: [a_ECDHE]오류를 반환합니다.기록
b_ECDHE.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic b_messages \ --producer.config /tmp/team-b-client.properties Message 1 Message 2 Message 3Kafka에 메시지가 성공적으로 생성됩니다.
x_ECDHE 주제를 작성할 수 있습니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 1항목에 액세스할 수 있는 권한이 없음: [x_ECDHE]오류가 반환되고team-b-client는 주제x_ECDHE 에서만 읽을 수 있습니다.team-a-client를 사용하여 x_ECDHE 주제를 작성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1이 요청은 항목에 액세스할 수 있는
Not authorized to access topics: [x_ECDHE]오류를 반환합니다.team-a-client는x_ECDHE 항목에 쓸 수 있지만 아직 없는 경우 주제를 만들 수 있는 권한이 없습니다.team-a-client가x_ECDHE 항목에 쓰기 전에 관리자의 고급 사용자가 파티션 및 복제본 수와 같은 올바른 구성으로 생성해야 합니다.
권한이 있는 admin 사용자로 Kafka 관리
admin 사용자 alice 를 사용하여 Kafka를 관리합니다. Alice 는 Kafka 클러스터의 모든 항목을 관리할 수 있는 전체 액세스 권한을 갖습니다.
x_ECDHE 주제를alice로 만듭니다.bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --topic x_messages --create --replication-factor 1 --partitions 1주제가 성공적으로 생성되었습니다.
모든 주제를
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 Team A및Dev Team B역할에는 모두x_로 시작하는 항목에 대한 자세한 권한이 있지만 해당 역할에 대한 자세한 권한이 없기 때문에 다른 팀의 주제를 볼 수 없습니다.team-a-client를 사용하여x_ECDHE 항목에 대한 메시지를생성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1 Message 2 Message 3alice가x_ECDHE주제를 만들었으므로 Kafka에 메시지가 성공적으로 생성됩니다.team-b-client를 사용하여x_ECDHE 항목에 대한 메시지를생성합니다.bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 4 Message 5이 요청은 항목에 액세스할 수 있는
Not authorized to access topics: [x_ECDHE]오류를 반환합니다.team-b-client를 사용하여x_ECDHE 주제의 메시지를사용합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-b-client.properties --group x_consumer_group_b소비자는
x_ECDHE 주제에서 모든 메시지를수신합니다.team-a-client를 사용하여x_ECDHE 주제의 메시지를사용합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group x_consumer_group_a이 요청은 항목에 액세스할 수 있는
Not authorized to access topics: [x_ECDHE]오류를 반환합니다.team-a-client를 사용하여a_로 시작하는 소비자 그룹의 메시지를 사용합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_a이 요청은 항목에 액세스할 수 있는
Not authorized to access topics: [x_ECDHE]오류를 반환합니다.Dev Team A에는x_로 시작하는 항목에 대한읽기액세스 권한이 없습니다.alice를 사용하여x_ECDHE 항목에 대한 메시지를생성합니다.bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/alice.propertiesKafka에 메시지가 성공적으로 생성됩니다.
Alice는 모든 주제에서 읽거나 쓸 수 있습니다.alice를 사용하여 클러스터 구성을 읽습니다.bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --entity-type brokers --describe --entity-default이 예제의 클러스터 구성은 비어 있습니다.
9장. TLS 인증서 관리 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 Kafka 및 AMQ Streams 구성 요소 간 암호화된 통신을 위해 TLS를 지원합니다.
통신은 항상 다음 구성 요소 간에 암호화됩니다.
- Kafka와 ZooKeeper 간의 통신
- Kafka 브로커 간 Interbroker 통신
- ZooKeeper 노드 간 상호 통신
- AMQ Streams Operator와 Kafka 브로커 및 ZooKeeper 노드와의 통신
Kafka 클라이언트와 Kafka 브로커 간의 통신은 클러스터 구성 방법에 따라 암호화됩니다. Kafka 및 AMQ Streams 구성 요소의 경우 TLS 인증서도 인증에 사용됩니다.
Cluster Operator는 클러스터 내에서 암호화 및 인증을 활성화하기 위해 TLS 인증서를 자동으로 설정 및 갱신합니다. Kafka 브로커와 클라이언트 간의 암호화 또는 mTLS 인증을 활성화하려면 다른 TLS 인증서도 설정합니다.
CA(인증 기관) 인증서는 Cluster Operator에 의해 생성되어 구성 요소 및 클라이언트의 ID를 확인합니다. Cluster Operator에서 생성한 CA를 사용하지 않으려면 자체 클러스터 및 클라이언트 CA 인증서를 설치할 수 있습니다.
TLS 암호화가 활성화된 TLS 리스너 또는 외부 리스너에 대한 Kafka 리스너 인증서를제공할 수도 있습니다. Kafka 리스너 인증서를 사용하여 이미 보유하고 있는 보안 인프라를 통합합니다.
제공하는 인증서는 Cluster Operator에 의해 갱신되지 않습니다.
그림 9.1. TLS로 보호되는 통신 아키텍처의 예
9.1. 내부 클러스터 CA 및 클라이언트 CA 링크 복사링크가 클립보드에 복사되었습니다!
암호화를 지원하기 위해 각 AMQ Streams 구성 요소에는 고유한 개인 키와 공개 키 인증서가 필요합니다. 모든 구성 요소 인증서는 클러스터 CA라는 내부 CA(인증 기관)에 의해 서명됩니다.
마찬가지로 mTLS를 사용하여 AMQ Streams에 연결하는 각 Kafka 클라이언트 애플리케이션은 개인 키와 인증서를 사용해야 합니다. 클라이언트 CA라는 두 번째 내부 CA는 Kafka 클라이언트 의 인증서에 서명하는 데 사용됩니다.
클러스터 CA 및 클라이언트 CA에는 자체 서명된 공개 키 인증서가 모두 있습니다.
Kafka 브로커는 클러스터 CA 또는 클라이언트 CA에서 서명한 인증서를 신뢰하도록 구성됩니다. 클라이언트가 ZooKeeper와 같이 클라이언트가 연결할 필요가 없는 구성 요소(예: 클러스터 CA에서 서명한 인증서만 신뢰). 외부 리스너에 대한 TLS 암호화가 비활성화되지 않은 경우 클라이언트 애플리케이션은 클러스터 CA에서 서명한 인증서를 신뢰해야 합니다. mTLS 인증을 수행하는 클라이언트 애플리케이션에서도 마찬가지입니다.
기본적으로 AMQ Streams는 클러스터 CA 또는 클라이언트 CA에서 발급한 CA 인증서를 자동으로 생성하고 갱신합니다. Kafka.spec.clusterCa 및 Kafka.spec.clientsCa 오브젝트에서 이러한 CA 인증서 관리를 구성할 수 있습니다.
클러스터 CA 또는 클라이언트 CA의 CA 인증서를 자체 인증서로 교체할 수 있습니다. 자세한 내용은 9.7.1절. “자체 CA 인증서 및 개인 키 설치”의 내용을 참조하십시오. 자체 CA 인증서를 제공하는 경우 만료되기 전에 해당 인증서를 갱신해야 합니다.
9.2. Operator가 생성한 보안 링크 복사링크가 클립보드에 복사되었습니다!
시크릿은 Kafka 및 KafkaUser 와 같은 사용자 정의 리소스가 배포될 때 생성됩니다. AMQ Streams는 이러한 보안을 사용하여 Kafka 클러스터, 클라이언트 및 사용자에 대한 개인 키 및 공개 키 인증서를 저장합니다. 보안은 Kafka 브로커 간 및 브로커와 클라이언트 간 TLS 암호화 연결을 설정하는 데 사용됩니다. mTLS 인증에도 사용됩니다.
클러스터 및 클라이언트 보안은 항상 쌍입니다. 하나는 공개 키가 있고 하나는 개인 키가 포함되어 있습니다.
- 클러스터 보안
- 클러스터 시크릿에는 Kafka 브로커 인증서에 서명하는 클러스터 CA 가 포함되어 있습니다. 클라이언트가 연결하면 인증서를 사용하여 Kafka 클러스터와의 TLS 암호화 연결을 설정합니다. 인증서는 브로커 ID를 확인합니다.
- 클라이언트 시크릿
- 클라이언트 시크릿에는 사용자가 자체 클라이언트 인증서에 서명할 수 있는 클라이언트 CA 가 포함되어 있습니다. 이를 통해 Kafka 클러스터에 대한 상호 인증을 허용합니다. 브로커는 인증서를 통해 클라이언트의 ID를 검증합니다.
- 사용자 시크릿
- 사용자 시크릿에는 개인 키와 인증서가 포함됩니다. 새 사용자를 생성할 때 클라이언트 CA에서 시크릿을 생성하고 서명합니다. 키와 인증서는 클러스터에 액세스할 때 사용자를 인증하고 권한을 부여하는 데 사용됩니다.
9.2.1. PEM 또는 PKCS #12 형식의 키와 인증서를 사용한 TLS 인증 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams에서 생성한 보안은 PEM(Privacy Enhanced>-<) 및 PKCS #12(Public-Key Cryptography Standards) 형식의 개인 키와 인증서를 제공합니다. PEM 및 PKCS #12는 SSL 프로토콜을 사용하여 TLS 통신을 위한 OpenSSL이 생성한 키 형식입니다.
Kafka 클러스터 및 사용자에 대해 생성된 시크릿에 포함된 인증 정보를 사용하는 상호 TLS(mTLS) 인증을 구성할 수 있습니다.
mTLS를 설정하려면 먼저 다음을 수행해야 합니다.
Kafka 클러스터를 배포할 때 클러스터를 확인하기 위해 < cluster_name>-cluster-ca-cert 시크릿이 공개 키로 생성됩니다. 공개 키를 사용하여 클라이언트에 대한 신뢰 저장소를 구성합니다.
KafkaUser 를 생성할 때 < kafka_user_name > 시크릿은 사용자(클라이언트)를 확인하기 위한 키와 인증서로 생성됩니다. 이러한 자격 증명을 사용하여 클라이언트의 키 저장소를 구성합니다.
Kafka 클러스터 및 클라이언트가 mTLS를 사용하도록 설정하여 시크릿에서 인증 정보를 추출하여 클라이언트 구성에 추가합니다.
- PEM 키 및 인증서
PEM의 경우 클라이언트 구성에 다음을 추가합니다.
- truststore
-
클러스터의 CA 인증서인 <
cluster_name>-cluster-ca-cert보안의ca.crt입니다.
-
클러스터의 CA 인증서인 <
- 키 저장소
-
사용자의 공용 인증서인 &
lt;kafka_user_name> 시크릿의user.crt입니다. -
사용자의 개인 키인 <kafka_user_name> 시크릿의 user.key입니다.
-
사용자의 공용 인증서인 &
- PKCS #12 키 및 인증서
PKCS #12의 경우 클라이언트 구성에 다음을 추가합니다.
- truststore
-
ca.p12는클러스터의 CA 인증서인 <cluster_name>-cluster-ca-cert보안입니다. -
<
cluster_name>-cluster-ca-cert보안의 CA.password는 공용 클러스터 CA 인증서에 액세스하는 암호입니다.
-
- 키 저장소
-
user.p12는 사용자의 공개 키 인증서인 <kafka_user_name> 시크릿의 이름입니다. -
Kafka 사용자의 공개 키 인증서에 액세스하는 암호인 <
kafka_user_name> 시크릿의user.password.
-
PKCS #12는 Java에서 지원되므로 인증서 값을 Java 클라이언트 구성에 직접 추가할 수 있습니다. 보안 스토리지 위치에서 인증서를 참조할 수도 있습니다. PEM 파일을 사용하면 단일 줄 형식으로 클라이언트 구성에 직접 인증서를 추가해야 합니다. Kafka 클러스터와 클라이언트 간에 TLS 연결을 설정하는 데 적합한 형식을 선택합니다. PEM에 익숙하지 않은 경우 PKCS #12를 사용합니다.
모든 키는 2048비트 크기이며 기본적으로 초기 생성일로부터 365일 동안 유효합니다. 유효 기간을 변경할 수 있습니다.
9.2.2. Cluster Operator가 생성한 보안 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 다음 인증서를 생성합니다. 이 인증서는 OpenShift 클러스터에 시크릿으로 저장됩니다. AMQ Streams는 기본적으로 이러한 보안을 사용합니다.
클러스터 CA 및 클라이언트 CA에는 개인 키 및 공개 키에 대한 별도의 시크릿이 있습니다.
<cluster_name>-cluster-ca- 클러스터 CA의 개인 키를 포함합니다. AMQ Streams 및 Kafka 구성 요소는 개인 키를 사용하여 서버 인증서에 서명합니다.
<cluster_name>-cluster-ca-cert- 클러스터 CA의 공개 키를 포함합니다. Kafka 클라이언트는 공개 키를 사용하여 TLS 서버 인증으로 연결되는 Kafka 브로커의 ID를 확인합니다.
<cluster_name>-clients-ca- 클라이언트 CA의 개인 키를 포함합니다. Kafka 클라이언트는 Kafka 브로커에 연결할 때 개인 키를 사용하여 mTLS 인증에 대한 새 사용자 인증서에 서명합니다.
<cluster_name>-clients-ca-cert- 클라이언트 CA의 공개 키를 포함합니다. Kafka 브로커는 mTLS 인증을 사용할 때 공개 키를 사용하여 Kafka 브로커에 액세스하는 클라이언트의 ID를 확인합니다.
AMQ Streams 구성 요소 간 통신에는 개인 키와 클러스터 CA에서 서명한 공개 키 인증서가 포함되어 있습니다.
<cluster_name>-kafka-brokers- Kafka 브로커를 위한 개인 키 및 공개 키가 포함되어 있습니다.
<cluster_name>-zookeeper-nodes- ZooKeeper 노드의 개인 키 및 공개 키가 포함되어 있습니다.
<cluster_name>-cluster-operator-certs- Cluster Operator와 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-entity-topic-operator-certs- Topic Operator와 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-entity-user-operator-certs- User Operator와 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-cruise-control-certs- Cruise Control 및 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키와 공개 키가 포함되어 있습니다.
<cluster_name>-kafka-exporter-certs- Kafka 내보내기 및 Kafka 또는 ZooKeeper 간의 통신을 암호화하기 위한 개인 키 및 공개 키가 포함되어 있습니다.
클러스터 CA에서 서명한 인증서 대신 Kafka 리스너 인증서를 사용하여 Kafka 브로커에 연결하는 고유한 서버 인증서 및 개인 키를 제공할 수 있습니다.
9.2.3. 클러스터 CA 보안 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 CA 보안은 Kafka 클러스터에서 Cluster Operator에 의해 관리됩니다.
클라이언트에는 <cluster_name> -cluster-ca-cert 보안만 필요합니다. 다른 모든 클러스터 시크릿은 AMQ Streams 구성 요소에서 액세스할 수 있습니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 적용할 수 있습니다.
< cluster_name> -cluster-ca-cert 의 CA 인증서는 TLS를 통해 Kafka 브로커 인증서에 연결할 때 Kafka 클라이언트 애플리케이션에서 신뢰해야 합니다.
| 필드 | 설명 |
|---|---|
|
| 클러스터 CA의 현재 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
| 클러스터 CA의 현재 인증서입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Kafka 브로커 Pod의 인증서 < num>. <cluster |
|
|
Kafka 브로커 Pod의 개인 키 < |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
ZooKeeper 노드 인증서 < num>. <cluster |
|
|
ZooKeeper Pod의 개인 키 < |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Cluster Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster |
|
| Cluster Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Topic Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster |
|
| Topic Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
User Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster |
|
| User Operator와 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Cruise Control과 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster |
|
| Cruise Control과 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
|
Kafka 내보내기 및 Kafka 또는 ZooKeeper 간의 mTLS 통신 인증서. <cluster |
|
| Kafka 내보내기 및 Kafka 또는 ZooKeeper 간의 mTLS 통신을 위한 개인 키입니다. |
9.2.4. 클라이언트 CA 보안 링크 복사링크가 클립보드에 복사되었습니다!
클라이언트 CA 보안은 Kafka 클러스터에서 Cluster Operator에 의해 관리됩니다.
< cluster_name> -clients-ca-cert 의 인증서는 Kafka 브로커를 신뢰하는 인증서입니다.
& lt;cluster_name> -clients-ca 보안은 클라이언트 애플리케이션 인증서에 서명하는 데 사용됩니다. User Operator를 사용하지 않고 애플리케이션 인증서를 발급하려는 경우 AMQ Streams 구성 요소 및 관리 액세스에서 이 시크릿에 액세스할 수 있어야 합니다. 필요한 경우 OpenShift 역할 기반 액세스 제어를 사용하여 적용할 수 있습니다.
| 필드 | 설명 |
|---|---|
|
| client CA의 현재 개인 키입니다. |
| 필드 | 설명 |
|---|---|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. |
|
| client CA의 현재 인증서입니다. |
9.2.5. User Operator가 생성한 사용자 보안 링크 복사링크가 클립보드에 복사되었습니다!
사용자 보안은 User Operator가 관리합니다.
User Operator를 사용하여 사용자를 생성하면 사용자 이름을 사용하여 시크릿이 생성됩니다.
| 시크릿 이름 | 보안 내 필드 | 설명 |
|---|---|---|
|
|
| 인증서 및 키를 저장하기 위한 PKCS #12 저장소 |
|
| PKCS #12 저장소를 보호하기 위한 암호입니다. | |
|
| 클라이언트 CA에서 서명한 사용자 인증서 | |
|
| 사용자의 개인 키 |
9.2.6. 클러스터 CA 보안에 라벨 및 주석 추가 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 사용자 정의 리소스에서 clusterCaCert 템플릿 속성을 구성하면 Cluster Operator가 생성한 Cluster CA 보안에 사용자 정의 레이블 및 주석을 추가할 수 있습니다. 레이블 및 주석은 오브젝트를 식별하고 컨텍스트 정보를 추가하는 데 유용합니다. AMQ Streams 사용자 정의 리소스에서 템플릿 속성을 구성합니다.
보안에 레이블 및 주석을 추가하는 템플릿 사용자 정의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
template:
clusterCaCert:
metadata:
labels:
label1: value1
label2: value2
annotations:
annotation1: value1
annotation2: value2
# ...
9.2.7. CA 시크릿에서 ownerReference 비활성화 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 클러스터 및 클라이언트 CA 보안은 Kafka 사용자 정의 리소스로 설정된 ownerReference 속성을 사용하여 생성됩니다. 즉, Kafka 사용자 정의 리소스가 삭제되면 OpenShift에서 CA 시크릿도 삭제됩니다(가장).
새 클러스터에 CA를 재사용하려면 Kafka 구성에서 클러스터의 generateSecretOwnerReference 속성과 클라이언트 CA 시크릿을 false 로 설정하여 ownerReference 를 비활성화할 수 있습니다. ownerReference 가 비활성화되면 해당 Kafka 사용자 정의 리소스가 삭제될 때 OpenShift에서 CA 시크릿을 삭제하지 않습니다.
클러스터 및 클라이언트 CA에 대해 ownerReference 가 비활성화된 Kafka 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
clusterCa:
generateSecretOwnerReference: false
clientsCa:
generateSecretOwnerReference: false
# ...
9.3. 인증서 갱신 및 유효 기간 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 CA 및 클라이언트 CA 인증서는 유효 기간이라는 제한된 기간 동안만 유효합니다. 일반적으로 인증서가 생성된 후 몇 일로 정의됩니다.
Cluster Operator가 자동으로 생성한 CA 인증서의 경우 다음의 유효 기간을 구성할 수 있습니다.
-
Kafka.spec.clusterCa.validityDays의 클러스터 CA 인증서 -
Kafka.spec.clientsCa.validityDays의 클라이언트 CA 인증서
두 인증서의 기본 유효 기간은 365일입니다. 수동으로 설치한 CA 인증서에는 자체 유효 기간이 정의되어 있어야 합니다.
CA 인증서가 만료되면 해당 인증서를 계속 신뢰하는 구성 요소와 클라이언트는 CA 개인 키로 서명한 인증서가 있는 피어의 연결을 수락하지 않습니다. 구성 요소 및 클라이언트는 대신 새 CA 인증서를 신뢰해야 합니다.
서비스 손실 없이 CA 인증서 갱신을 허용하기 위해 Cluster Operator는 이전 CA 인증서가 만료되기 전에 인증서 갱신을 시작합니다.
Cluster Operator에서 생성한 인증서의 갱신 기간을 구성할 수 있습니다.
-
Kafka.spec.clusterCa.renewalDays의 클러스터 CA 인증서 -
Kafka.spec.clientsCa.renewalDays의 클라이언트 CA 인증서
두 인증서의 기본 갱신 기간은 30일입니다.
갱신 기간은 현재 인증서의 만료 날짜에서 이전을 측정합니다.
갱신 기간에 대한 유효 기간
Not Before Not After
| |
|<--------------- validityDays --------------->|
<--- renewalDays --->|
Kafka 클러스터를 생성한 후 유효성 및 갱신 기간을 변경하려면 Kafka 사용자 정의 리소스를 구성 및 적용하고 CA 인증서를 수동으로 갱신합니다. 인증서를 수동으로 갱신하지 않으면 다음에 인증서가 자동으로 갱신될 때 새 기간이 사용됩니다.
인증서 유효 기간 및 갱신 기간에 대한 Kafka 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
clusterCa:
renewalDays: 30
validityDays: 365
generateCertificateAuthority: true
clientsCa:
renewalDays: 30
validityDays: 365
generateCertificateAuthority: true
# ...
갱신 기간 동안 Cluster Operator의 동작은 클러스터 CA 및 클라이언트 CA의 generate properties 설정에 따라 다릅니다.
true-
속성이
true로 설정되면 CA 인증서가 Cluster Operator에 의해 자동으로 생성되고 갱신 기간 내에 자동으로 갱신됩니다. false-
속성이
false로 설정되면 Cluster Operator에 의해 CA 인증서가 생성되지 않습니다. 자체 인증서를 설치하는 경우 이 옵션을 사용합니다.
9.3.1. 자동으로 생성된 CA 인증서가 있는 갱신 프로세스 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 CA 인증서를 갱신할 때 이 순서로 다음 프로세스를 수행합니다.
새 CA 인증서를 생성하지만 기존 키를 유지합니다.
새 인증서는 해당
시크릿내의이름으로이전 인증서를 대체합니다.새 클라이언트 인증서( ZooKeeper 노드, Kafka 브로커 및 Entity Operator의 경우)를 생성합니다.
서명 키가 변경되지 않았기 때문에 반드시 필요한 것은 아니지만 CA 인증서와 동기화된 클라이언트 인증서의 유효 기간을 유지합니다.
- ZooKeeper 노드를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.
- Kafka 브로커를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.
Topic 및 User Operator를 다시 시작하여 새 CA 인증서를 신뢰하고 새 클라이언트 인증서를 사용합니다.
사용자 인증서는 클라이언트 CA에서 서명합니다. 클라이언트 CA가 갱신되면 User Operator가 생성한 사용자 인증서가 갱신됩니다.
9.3.2. 클라이언트 인증서 갱신 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 Kafka 클러스터를 사용하는 클라이언트 애플리케이션을 인식하지 못합니다.
클러스터에 연결하고 올바르게 작동하는지 확인하려면 클라이언트 애플리케이션이 다음을 수행해야 합니다.
- <cluster> - cluster-ca-cert 보안에 게시된 클러스터 CA 인증서를 신뢰합니다.
< user-name> 보안에 게시된 인증 정보를 사용하여 클러스터에 연결합니다.
사용자 보안은 PEM 및 PKCS #12 형식으로 인증 정보를 제공하거나 SCRAM-SHA 인증을 사용할 때 암호를 제공할 수 있습니다. 사용자가 생성될 때 User Operator에서 사용자 인증 정보를 생성합니다.
인증서를 업데이트한 후에도 클라이언트가 계속 작동하는지 확인해야 합니다. 갱신 프로세스는 클라이언트 구성 방법에 따라 다릅니다.
클라이언트 인증서와 키를 수동으로 프로비저닝하는 경우 새 클라이언트 인증서를 생성하고 갱신 기간 내에 클라이언트가 새 인증서를 사용하는지 확인해야 합니다. 갱신 기간이 끝나면 이를 수행하지 않으면 클라이언트 애플리케이션이 클러스터에 연결할 수 없습니다.
동일한 OpenShift 클러스터 및 네임스페이스 내에서 실행되는 워크로드의 경우 시크릿을 볼륨으로 마운트할 수 있으므로 클라이언트 Pod가 현재 Secrets 상태에서 키 저장소 및 신뢰 저장소를 구성할 수 있습니다. 이 절차에 대한 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.
9.3.3. Cluster Operator에서 생성한 CA 인증서를 수동으로 갱신 링크 복사링크가 클립보드에 복사되었습니다!
각 인증서 갱신 기간이 시작될 때 Cluster Operator에서 생성한 클러스터 및 클라이언트 CA 인증서가 자동으로 갱신됩니다. 그러나 strimzi.io/force-renew 주석을 사용하여 인증서 갱신 기간이 시작되기 전에 이러한 인증서 중 하나 또는 둘 다를 수동으로 갱신할 수 있습니다. 보안상의 이유로 이 작업을 수행하거나 인증서에 대한 갱신 또는 유효 기간을 변경한 경우 이 작업을 수행할 수 있습니다.
갱신된 인증서는 이전 인증서와 동일한 개인 키를 사용합니다.
자체 CA 인증서를 사용하는 경우 force-renew 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
- CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.
절차
갱신하려는 CA 인증서가 포함된 보안에
strimzi.io/force-renew주석을 적용합니다.Expand 표 9.13. 인증서 갱신을 강제 적용하는 보안에 대한 주석 certificate Secret 주석 명령 클러스터 CA
KAFKA-CLUSTER-NAME-cluster-ca-cert
oc annotate secret KAFKA-CLUSTER-NAME-cluster-ca-cert strimzi.io/force-renew=trueClients CA
KAFKA-CLUSTER-NAME-clients-ca-cert
oc annotate secret KAFKA-CLUSTER-NAME-clients-ca-cert strimzi.io/force-renew=true다음 조정 시 Cluster Operator는 주석이 달린 보안에 대한 새 CA 인증서를 생성합니다.
유지 관리 시간 기간이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 내에 첫 번째 조정 시 새 CA 인증서를 생성합니다.클라이언트 애플리케이션은 Cluster Operator가 갱신한 클러스터 및 클라이언트 CA 인증서를 다시 로드해야 합니다.
CA 인증서가 유효한 기간을 확인합니다.
예를 들어
openssl명령을 사용합니다.oc get secret CA-CERTIFICATE-SECRET -o 'jsonpath={.data.CA-CERTIFICATE}' | base64 -d | openssl x509 -subject -issuer -startdate -enddate -nooutCA-CERTIFICATE-SECRET 은
시크릿의 이름입니다. 이는 클러스터 CA 인증서의 경우KAFKA-CLUSTER-NAME-cluster-ca-cert이고 클라이언트 CA 인증서에 대한KAFKA-CLUSTER-NAME-clients-ca-cert입니다.ca -CERTIFICATE 는 CA 인증서의 이름입니다(예:
jsonpath={.data.ca\.crt}).이 명령은 CA 인증서의 유효 기간인
notBefore및notAfter날짜를 반환합니다.예를 들어 클러스터 CA 인증서의 경우 다음을 수행합니다.
subject=O = io.strimzi, CN = cluster-ca v0 issuer=O = io.strimzi, CN = cluster-ca v0 notBefore=Jun 30 09:43:54 2020 GMT notAfter=Jun 30 09:43:54 2021 GMT시크릿에서 이전 인증서를 삭제합니다.
구성 요소가 새 인증서를 사용하는 경우 이전 인증서가 계속 활성화되어 있을 수 있습니다. 기존 인증서를 삭제하여 잠재적인 보안 위험을 제거합니다.
9.3.4. Cluster Operator에서 생성한 CA 인증서에서 사용하는 개인 키 교체 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 CA 및 Cluster Operator에서 생성한 클라이언트 CA 인증서에서 사용하는 개인 키를 교체할 수 있습니다. 개인 키가 교체되면 Cluster Operator가 새 개인 키에 대한 새 CA 인증서를 생성합니다.
자체 CA 인증서를 사용하는 경우 force-replace 주석을 사용할 수 없습니다. 대신 자체 CA 인증서를 갱신하는 절차를 따르십시오.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
- CA 인증서 및 개인 키가 설치된 Kafka 클러스터입니다.
절차
갱신하려는 개인 키가 포함된 보안에
strimzi.io/force-replace주석을 적용합니다.Expand 표 9.14. 개인 키 교체 명령 개인 키 Secret 주석 명령 클러스터 CA
CLUSTER-NAME-cluster-ca
oc annotate secret CLUSTER-NAME-cluster-ca strimzi.io/force-replace=trueClients CA
CLUSTER-NAME-clients-ca
oc annotate secret CLUSTER-NAME-clients-ca strimzi.io/force-replace=true
다음 조정 시 Cluster Operator는 다음을 수행합니다.
-
주석이 달린 보안에 대한 새 개인 키 생성
- 새 CA 인증서 생성
유지 관리 시간이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 내에 첫 번째 조정 시 새 개인 키 및 CA 인증서를 생성합니다.
클라이언트 애플리케이션은 Cluster Operator가 갱신한 클러스터 및 클라이언트 CA 인증서를 다시 로드해야 합니다.
9.4. TLS 연결 링크 복사링크가 클립보드에 복사되었습니다!
9.4.1. zookeeper 통신 링크 복사링크가 클립보드에 복사되었습니다!
모든 포트의 ZooKeeper 노드와 클라이언트 간 통신은 TLS를 사용하여 암호화됩니다.
Kafka 브로커와 ZooKeeper 노드 간의 통신도 암호화됩니다.
9.4.2. Kafka inter-broker 통신 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커 간의 통신은 항상 TLS를 사용하여 암호화됩니다. Kafka 컨트롤러와 브로커 간 연결은 포트 9090에서 내부 컨트롤 플레인 리스너 를 사용합니다. 브로커 간 데이터 복제는 AMQ Streams Operator, Cruise Control 또는 Kafka Exporter의 내부 연결과 포트 9091에서 복제 리스너 를 사용합니다. 이러한 내부 리스너는 Kafka 클라이언트에서 사용할 수 없습니다.
9.4.3. 주제 및 사용자 Operator 링크 복사링크가 클립보드에 복사되었습니다!
모든 Operator는 Kafka 및 ZooKeeper와의 통신을 위해 암호화를 사용합니다. 주제 및 사용자 Operator에서 ZooKeeper와 통신할 때 TLS 사이드카가 사용됩니다.
9.4.4. 크루즈 컨트롤 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤은 Kafka 및 ZooKeeper와의 통신을 위해 암호화를 사용합니다. TLS 사이드카는 ZooKeeper와 통신할 때 사용됩니다.
9.4.5. Kafka 클라이언트 연결 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 브로커와 클라이언트 간의 암호화 또는 암호화되지 않은 통신은 spec.kafka.listeners 의 tls 속성을 사용하여 구성됩니다.
9.5. 클러스터 CA를 신뢰하도록 내부 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 클러스터 내부에 위치하는 Kafka 클라이언트를 구성하는 방법 - TLS 리스너에 연결 - 클러스터 CA 인증서를 신뢰하는 방법을 설명합니다.
내부 클라이언트에서 이를 수행하는 가장 쉬운 방법은 볼륨 마운트를 사용하여 필요한 인증서 및 키가 포함된 보안에 액세스하는 것입니다.
Java 기반 Kafka Producer, Consumer 및 Streams API에 대해 클러스터 CA에서 서명한 신뢰 인증서를 구성하는 단계를 따르십시오.
클러스터 CA의 인증서 형식 PKCS #12(.p12) 또는 PEM(.crt)에 따라 수행할 단계를 선택합니다.
이 단계에서는 Kafka 클러스터의 ID를 클라이언트 pod에 확인하는 클러스터 보안을 마운트하는 방법을 설명합니다.
사전 요구 사항
- Cluster Operator가 실행 중이어야 합니다.
-
OpenShift 클러스터 내에
Kafka리소스가 있어야 합니다. - TLS를 사용하여 연결할 OpenShift 클러스터 내에 Kafka 클라이언트 애플리케이션이 필요하며 클러스터 CA 인증서를 신뢰해야 합니다.
-
클라이언트 애플리케이션은
Kafka리소스와 동일한 네임스페이스에서 실행 중이어야 합니다.
PKCS #12 형식(.p12) 사용
클라이언트 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를 사용할 때( mTLS 인증 포함 또는 없이) SSL입니다. -
security.protocol: TLS를 통해 SCRAM-SHA 인증을 사용할 때 SASL_SSL.
-
-
SSL.truststore.location인증서를 가져온 신뢰 저장소 위치가 있습니다. -
SSL.truststore.password에는 신뢰 저장소에 액세스하기 위한 암호가 있습니다. -
SSL.truststore.type=PKCS12: truststore 유형을 식별합니다.
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 연결을 구성하려면 추출된 인증서를 사용합니다.
9.6. 클러스터 CA를 신뢰하도록 외부 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift 클러스터 외부에 있는 Kafka 클라이언트를 구성하는 방법 - 외부 리스너에 연결 - 클러스터 CA 인증서를 신뢰하는 방법을 설명합니다. 클라이언트를 설정하는 경우 및 갱신 기간 동안 이전 클라이언트 CA 인증서가 교체되면 다음 절차를 따르십시오.
Java 기반 Kafka Producer, Consumer 및 Streams API에 대해 클러스터 CA에서 서명한 신뢰 인증서를 구성하는 단계를 따르십시오.
클러스터 CA의 인증서 형식 PKCS #12(.p12) 또는 PEM(.crt)에 따라 수행할 단계를 선택합니다.
이 단계에서는 Kafka 클러스터의 ID를 확인하는 클러스터 시크릿에서 인증서를 가져오는 방법을 설명합니다.
& lt;cluster_name> -cluster-ca-cert 보안에는 CA 인증서 갱신 기간 동안 두 개 이상의 CA 인증서가 포함되어 있습니다. 고객은 모든 항목을 신뢰 저장소에 추가해야 합니다.
사전 요구 사항
- Cluster Operator가 실행 중이어야 합니다.
-
OpenShift 클러스터 내에
Kafka리소스가 있어야 합니다. - TLS를 사용하여 연결할 OpenShift 클러스터 외부의 Kafka 클라이언트 애플리케이션이 필요하며 클러스터 CA 인증서를 신뢰해야 합니다.
PKCS #12 형식(.p12) 사용
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 클라이언트를 구성합니다.
보안 프로토콜 옵션:
-
security.protocol: TLS를 사용할 때 SSL입니다. -
security.protocol: TLS를 통해 SCRAM-SHA 인증을 사용할 때 SASL_SSL.
-
-
SSL.truststore.location인증서를 가져온 신뢰 저장소 위치가 있습니다. -
SSL.truststore.password에는 신뢰 저장소에 액세스하기 위한 암호가 있습니다. 이 속성은 신뢰 저장소에 필요하지 않은 경우 생략할 수 있습니다. -
SSL.truststore.type=PKCS12: truststore 유형을 식별합니다.
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 연결을 구성하려면 추출된 인증서를 사용합니다.
9.7. 자체 CA 인증서 및 개인 키 사용 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator에서 생성한 기본값을 사용하는 대신 자체 CA 인증서 및 개인 키를 설치하고 사용합니다. 클러스터 및 클라이언트 CA 인증서 및 개인 키를 교체할 수 있습니다.
다음과 같은 방법으로 자체 CA 인증서 및 개인 키를 사용하도록 전환할 수 있습니다.
- Kafka 클러스터를 배포하기 전에 고유한 CA 인증서 및 개인 키를 설치합니다.
- Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 직접 교체
Kafka 클러스터를 배포한 후 기본 CA 인증서 및 개인 키를 교체하는 단계는 자체 CA 인증서 및 개인 키를 갱신하는 데 사용되는 것과 동일합니다.
자체 인증서를 사용하는 경우 자동으로 갱신되지 않습니다. 만료되기 전에 CA 인증서 및 개인 키를 갱신해야 합니다.
갱신 옵션:
- CA 인증서만 갱신
- CA 인증서 및 개인 키 갱신 (또는 기본값 교체)
9.7.1. 자체 CA 인증서 및 개인 키 설치 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 및 클라이언트 CA 인증서 및 Cluster Operator가 생성한 개인 키를 사용하는 대신 고유한 CA 인증서 및 개인 키를 설치합니다.
기본적으로 AMQ Streams는 다음 클러스터 CA 및 클라이언트 CA 시크릿 을 사용하여 자동으로 갱신됩니다.
클러스터 CA 보안
-
<cluster_name>-cluster-ca -
<cluster_name>-cluster-ca-cert
-
클라이언트 CA 보안
-
<cluster_name>-clients-ca -
<cluster_name>-clients-ca-cert
-
고유한 인증서를 설치하려면 동일한 이름을 사용합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
Kafka 클러스터는 아직 배포되지 않았습니다.
Kafka 클러스터를 이미 배포한 경우 기본 CA 인증서를 자체 CA로 교체 할 수 있습니다.
클러스터 CA 또는 클라이언트 CA에 대해 PEM 형식의 자체 X.509 인증서 및 키입니다.
루트 CA가 아닌 클러스터 또는 클라이언트 CA를 사용하려면 인증서 파일에 전체 체인을 포함해야 합니다. 체인은 다음 순서에 있어야 합니다.
- 클러스터 또는 클라이언트 CA
- 하나 이상의 중간 CA
- 루트 CA
- 체인의 모든 CA는 X509v3 Basic Constraints 확장을 사용하여 구성해야 합니다. 기본 제한 조건은 인증서 체인의 경로 길이를 제한합니다.
- 인증서를 변환하는 OpenSSL TLS 관리 툴입니다.
사전 준비 사항
Cluster Operator는 PEM(Privacy Enhanced>-<) 및 PKCS #12(Public-Key Cryptography Standards) 형식으로 키와 인증서를 생성합니다. 자체 인증서를 두 형식으로 추가할 수 있습니다.
일부 애플리케이션은 PEM 인증서를 사용할 수 없으며 PKCS #12 인증서만 지원합니다. PKCS #12 형식의 클러스터 인증서가 없는 경우 OpenSSL TLS 관리 도구를 사용하여 ca.crt 파일에서 생성합니다.
인증서 생성 명령 예
openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt
& lt;P12_password>를 사용자 암호로 바꿉니다.
절차
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& lt;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-GENERATIONoc annotate secret CA-KEY-SECRET strimzi.io/ca-key-generation=CA-KEY-GENERATION-
주석
strimzi.io/ca-cert-generation=CA-CERTIFICATE-GENERATION은 새 CA 인증서 생성을 정의합니다. 주석
strimzi.io/ca-key-generation=CA-KEY-GENERATION은 새 CA 키 생성을 정의합니다.자체 CA 인증서에 대해 증분 값(
strimzi.io/ca-cert-generation=0)으로 0(zero)부터 시작합니다. 인증서를 갱신할 때 더 높은 증분 값을 설정합니다.
-
주석
생성된 CA를 사용하지 않도록
또는Kafka.spec.clusterCaKafka.spec.clientsCa오브젝트를 구성하여 클러스터의 Kafka 리소스를 생성합니다.사용자가 제공하는 인증서를 사용하도록 클러스터 CA를 구성하는 조각
Kafka리소스의 예kind: Kafka version: kafka.strimzi.io/v1beta2 spec: # ... clusterCa: generateCertificateAuthority: false
9.7.2. 자체 CA 인증서 갱신 링크 복사링크가 클립보드에 복사되었습니다!
자체 CA 인증서를 사용하는 경우 수동으로 인증서를 갱신해야 합니다. Cluster Operator는 자동으로 업데이트하지 않습니다. 만료되기 전에 갱신 기간에 CA 인증서를 갱신합니다.
CA 인증서를 갱신하고 동일한 개인 키를 계속할 때 이 절차의 단계를 수행합니다. 자체 CA 인증서 및 개인 키를 갱신하는 경우 9.7.3절. “CA 인증서 및 개인 키를 별도로 갱신하거나 교체” 를 참조하십시오.
절차에서는 PEM 형식으로 CA 인증서 갱신을 설명합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
- PEM 형식의 새 클러스터 또는 클라이언트 X.509 인증서가 있습니다.
절차
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로 변경합니다.Secret(시크릿)에 주석이 없으면 값은0으로 처리되므로 값이1인 주석을 추가합니다.AMQ 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는 ZooKeeper, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행하여 새 CA 인증서를 신뢰합니다.
유지 관리 시간이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 내에 첫 번째 조정 시 Pod를 롤오버합니다.
9.7.3. CA 인증서 및 개인 키를 별도로 갱신하거나 교체 링크 복사링크가 클립보드에 복사되었습니다!
자체 CA 인증서 및 개인 키를 사용하는 경우 수동으로 갱신해야 합니다. Cluster Operator는 자동으로 업데이트하지 않습니다. 만료되기 전에 갱신 기간에 CA 인증서를 갱신합니다. 동일한 절차를 사용하여 AMQ Streams Operator에서 생성한 CA 인증서 및 개인 키를 자체로 교체할 수도 있습니다.
CA 인증서 및 개인 키를 갱신하거나 교체할 때 이 절차의 단계를 수행합니다. 자체 CA 인증서만 갱신하는 경우 9.7.2절. “자체 CA 인증서 갱신” 를 참조하십시오.
이 절차에서는 CA 인증서 및 개인 키 갱신을 PEM 형식으로 설명합니다.
다음 단계를 진행하기 전에 새 CA 인증서의 CN(Common Name)이 현재 CA 인증서와 다른지 확인합니다. 예를 들어 Cluster Operator가 인증서를 자동으로 갱신하면 버전을 식별하기 위해 v<version_number > 접미사가 추가됩니다. 갱신할 때마다 다른 접미사를 추가하여 자체 CA 인증서와 동일하게 수행합니다. 다른 키를 사용하여 새 CA 인증서를 생성하면 시크릿에 저장된 현재 CA 인증서를 유지합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
- PEM 형식의 새 클러스터 또는 클라이언트 X.509 인증서와 키가 있어야 합니다.
절차
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로 변경됩니다.
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 >는 YECDHE -MONTH-DAYTHOUR-MINUTE-SECONDZ 형식의 인증서 만료 날짜입니다. 예:ca-2022-01-26T17-32-00Z.crt:. 현재 CA 인증서를 유지하기 위해 속성의 값을 그대로 둡니다.새 CA 인증서를 base64로 인코딩합니다.
cat <path_to_new_certificate> | base64CA 인증서를 업데이트합니다.
데이터에새ca.crt속성을 생성하고 이전 단계의 base64로ca.crt속성 값으로 base64로 인코딩된 CA 인증서를 복사합니다.CA 인증서 생성 주석의 값을 늘립니다.
strimzi.io/ca-cert-generation주석을 더 높은 증분 값으로 업데이트합니다. 예를 들어strimzi.io/ca-cert-generation=0을strimzi.io/ca-cert-generation = 1로 변경합니다.Secret(시크릿)에 주석이 없으면 값은0으로 처리되므로 값이1인 주석을 추가합니다.AMQ 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-2022-01-26T17-32-00Z.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F...2 metadata: annotations: strimzi.io/ca-cert-generation: "1"3 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
새 CA 인증서에 서명하는 데 사용되는 CA 키의
Secret을 업데이트합니다.기존 보안을 편집하여 새 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=0으로 변경하십시오. 시크릿에주석이없는 경우0으로 처리되므로 값이1인 주석을 추가합니다.AMQ 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는 ZooKeeper, Kafka 및 기타 구성 요소의 롤링 업데이트를 수행하여 새 CA 인증서를 신뢰합니다. 롤링 업데이트가 완료되면 Cluster Operator가 새 CA 키로 서명한 새 서버 인증서를 생성하기 위해 새 업데이트를 시작합니다.
유지 관리 시간이 구성된 경우 Cluster Operator는 다음 유지 관리 시간 내에 첫 번째 조정 시 Pod를 롤오버합니다.
10장. 브로커를 추가하거나 제거하여 클러스터 스케일링 링크 복사링크가 클립보드에 복사되었습니다!
브로커를 추가하여 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는 파티션을 자동으로 다시 할당하지 않습니다. 가장 좋은 방법은 Cruise Control을 사용하는 것입니다. 클러스터를 확장 또는 축소할 때 Cruise Control의 add-brokers 및 remove-brokers 모드를 사용할 수 있습니다.
-
Kafka 클러스터를 확장한 후
add-brokers모드를 사용하여 기존 브로커에서 새로 추가된 브로커로 파티션 복제본을 이동합니다. -
Kafka 클러스터를 축소하기 전에
remove-brokers모드를 사용하여 제거할 브로커에서 파티션 복제본을 이동합니다.
브로커 축소 시 클러스터에서 제거할 특정 Pod를 지정할 수 없습니다. 대신 브로커 제거 프로세스는 가장 많은 번호가 지정된 Pod에서 시작됩니다.
11장. Cruise Control을 사용하여 클러스터 재조정 링크 복사링크가 클립보드에 복사되었습니다!
Cruise Control은 다음 Kafka 작업을 지원하는 오픈 소스 시스템입니다.
- 클러스터 워크로드 모니터링
- 사전 정의된 제약 조건을 기반으로 클러스터 재조정
이 작업은 브로커 Pod를 보다 효율적으로 사용하는 더 균형 있는 Kafka 클러스터를 실행하는 데 도움이 됩니다.
일반적인 클러스터는 시간이 지남에 따라 균등하게 로드될 수 있습니다. 대량의 메시지 트래픽을 처리하는 파티션이 사용 가능한 브로커에 균등하게 분배되지 않을 수 있습니다. 클러스터를 재조정하려면 관리자는 브로커의 부하를 모니터링하고 사용 중인 파티션을 여유 용량이 있는 브로커에 수동으로 다시 할당해야 합니다.
Cruise Control은 클러스터 재조정 프로세스를 자동화합니다. CPU, 디스크 및 네트워크 로드를 기반으로 클러스터의 리소스 사용률의 워크로드 모델을 구성하고 더 균형 있는 파티션 할당에 대한 최적화 제안(승인 또는 거부할 수 있음)을 생성합니다. 구성 가능한 최적화 목표 세트는 이러한 제안을 계산하는 데 사용됩니다.
특정 모드에서 최적화 제안을 생성할 수 있습니다. 기본 전체 모드는 모든 브로커에서 파티션을 재조정합니다. add-brokers 및 remove-brokers 모드를 사용하여 클러스터를 확장 또는 축소할 때 변경 사항을 수용할 수도 있습니다.
최적화 제안을 승인하면 Cruise Control을 Kafka 클러스터에 적용합니다. KafkaRebalance 리소스를 사용하여 최적화 제안을 구성하고 생성합니다. 최적화 제안이 자동으로 또는 수동으로 승인되도록 주석을 사용하여 리소스를 구성할 수 있습니다.
AMQ Streams는 Cruise Control에 대한 구성 파일 예제 를 제공합니다.
11.1. Cruise Control 구성 요소 및 기능 링크 복사링크가 클립보드에 복사되었습니다!
Cruise Control은 4가지 주요 구성 요소(Load Monitor, Analyzer, Anomaly Detector, Executor-및 클라이언트 상호 작용을 위한 REST API)로 구성됩니다. AMQ Streams는 REST API를 사용하여 다음 Cruise Control 기능을 지원합니다.
- 최적화 목표에서 최적화 제안을 생성합니다.
- 최적화 제안을 기반으로 Kafka 클러스터 재조정.
- 최적화 목표
최적화 목표는 리밸런스에서 달성하려는 특정 목적을 설명합니다. 예를 들어 목표는 주제 복제본을 브로커에 더 균등하게 배포하는 것입니다. 설정을 통해 포함할 목표를 변경할 수 있습니다. 목표는 하드 목표 또는 소프트 목표로 정의됩니다. Cruise Control 배포 구성을 통해 어려운 목표를 추가할 수 있습니다. 또한 각 카테고리에 적합한 기본, 기본 및 사용자 제공 목표를 보유하고 있습니다.
- 어려운 목표는 사전 설정되며 최적화 제안에 만족해야합니다.
- 최적화 제안에 성공하려면 소프트 목표를 충족할 필요가 없습니다. 즉, 모든 어려운 목표를 충족한다는 것을 의미하면 따로 설정할 수 있습니다.
- 주요 목표는 Cruise Control에서 상속됩니다. 일부는 하드 목표로 사전 설정되어 있습니다. 주요 목표는 기본적으로 최적화 제안에 사용됩니다.
- 기본 목표는 기본적으로 주요 목표와 동일합니다. 고유한 기본 목표 집합을 지정할 수 있습니다.
- 사용자 제공 목표는 특정 최적화 제안을 생성하도록 구성된 기본 목표의 서브 세트입니다.
- 최적화 제안
최적화 제안은 리밸런스에서 달성하려는 목표를 포함합니다. 최적화 제안을 생성하여 제안된 변경 사항 및 리밸런스로 가능한 결과에 대한 요약을 생성합니다. 목표는 특정 우선 순위로 평가됩니다. 그런 다음 제안을 승인하거나 거부하도록 선택할 수 있습니다. 조정된 목표를 통해 다시 실행하도록 제안을 거부할 수 있습니다.
세 가지 모드 중 하나에서 최적화 제안을 생성할 수 있습니다.
-
full은 기본 모드이며 전체 리밸런스를 실행합니다. -
Add-brokers는 Kafka 클러스터를 확장할 때 브로커를 추가한 후 사용하는 모드입니다. -
remove-brokers는 Kafka 클러스터를 축소할 때 브로커를 제거하기 전에 사용하는 모드입니다.
-
다른 Cruise Control 기능은 현재 지원되지 않습니다. 여기에는 자체 복구, 알림, 쓰기-자유 목표, 주제 복제 요소 변경을 포함하여 현재 지원되지 않습니다.
11.2. 최적화 목표 개요 링크 복사링크가 클립보드에 복사되었습니다!
최적화 목표는 Kafka 클러스터의 워크로드 재배포 및 리소스 사용률에 대한 제약입니다. Kafka 클러스터를 재조정하기 위해 Cruise Control은 최적화 목표를 사용하여 최적화 제안을 생성하며 승인 또는 거부할 수 있습니다.
11.2.1. 우선 순위의 목표 순서 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 Cruise Control 프로젝트에서 개발한 대부분의 최적화 목표를 지원합니다. 지원되는 목표는 기본 우선 순위 순으로 다음과 같습니다.
- ack-awareness
- 일련의 주제를 위한 브로커당 최소 리더 복제본 수
- 복제본 용량
용량 목표
- 디스크 용량
- 네트워크 인바운드 용량
- 네트워크 아웃 바운드 용량
- CPU 용량
- 복제본 배포
- 잠재적인 네트워크 출력
리소스 배포 목표
- 디스크 사용률 배포
- 네트워크 인바운드 사용 배포
- 네트워크 아웃바운드 사용률 배포
- CPU 사용률 배포
- Leader bytes-in rate distribution
- 주제 복제본 배포
- 리더 복제본 배포
- 기본 리더 선택
- Intra-broker 디스크 용량
- Intra-broker 디스크 사용 배포
각 최적화 목표에 대한 자세한 내용은 Cruise Control 10.0.0.1의 목표를 참조하십시오.
"자신의" 목표를 쓰고 Kafka 할당자 목표는 아직 지원되지 않습니다.
11.2.2. AMQ Streams 사용자 정의 리소스의 목표 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 및 KafkaRebalance 사용자 정의 리소스에서 최적화 목표를 구성합니다. Cruise Control에는 충족해야 하는 하드 최적화 목표 및 주요, 기본, 사용자 제공 최적화 목표를 위한 구성이 있습니다.
다음 설정에서 최적화 목표를 지정할 수 있습니다.
-
주요 목표 ECDHE-
Kafka.spec.cruiseControl.config.goals -
하드 목표 ECDHE-
Kafka.spec.cruiseControl.config.hard.goals -
기본 목표 ECDHE-
Kafka.spec.cruiseControl.config.default.goals -
사용자 제공 목표 ECDHE-
KafkaRebalance.spec.goals
리소스 배포 목표는 브로커 리소스에 대한 용량 제한 의 영향을 받습니다.
11.2.3. 하드 및 소프트 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
어려운 목표는 최적화 제안에 충족해야 하는 목표입니다. 어려운 목표로 구성되지 않은 목표는 소프트 목표로 알려져 있습니다. 소프트 목표를 최선의 목표로 생각할 수 있습니다: 최적화 제안서에 충족할 필요는 없지만 최적화 계산에 포함됩니다. 하나 이상의 소프트 목표를 위반하지만 모든 어려운 목표를 충족하는 최적화 제안은 유효합니다.
크루즈 컨트롤은 모든 어려운 목표를 충족하고 가능한 한 많은 소프트 목표를 충족하는 최적화 제안을 계산합니다 (우선 순위에서). 모든 어려운 목표를 충족 하지 않는 최적화 제안은 Cruise Control에 의해 거부되고 승인을 위해 사용자에게 전송되지 않습니다.
예를 들어, 주제의 복제본을 클러스터 전체에 균등하게 배포하는 소프트 목표를 가질 수 있습니다(대상 복제본 배포 목표). 크루즈 컨트롤은 설정된 모든 하드 목표를 충족할 수 있도록 하는 경우 이 목표를 무시합니다.
Cruise Control에서 다음과 같은 주요 최적화 목표는 하드 목표로 사전 설정됩니다.
RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal
Kafka.spec.cruiseControl.config 에서 hard.goals 속성을 편집하여 Cruise Control 배포 구성에서 하드 목표를 구성합니다.
-
Cruise Control에서 사전 설정된 하드 목표를 상속하려면
Kafka.spec.cruiseControl.config에서hard.goals속성을 지정하지 마십시오. -
사전 설정된 하드 목표를 변경하려면 정규화된 도메인 이름을 사용하여
hard.goals속성에서 원하는 목표를 지정합니다.
하드 최적화 목표를 위한 Kafka 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
topicOperator: {}
userOperator: {}
cruiseControl:
brokerCapacity:
inboundNetwork: 10000KB/s
outboundNetwork: 10000KB/s
config:
# Note that `default.goals` (superset) must also include all `hard.goals` (subset)
default.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal
hard.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal
# ...
구성된 하드 목표 수를 늘리면 Cruise Control이 유효한 최적화 제안을 생성할 가능성을 줄일 수 있습니다.
skipHardGoalCheck: true 가 KafkaRebalance 사용자 정의 리소스에 지정된 경우 Cruise Control은 사용자 제공 최적화 목표 목록( KafkaRebalance.spec.goals)에 구성된 모든 하드 목표(hard.goals)가 포함되어 있는지 확인하지 않습니다. 따라서 사용자 제공 최적화 목표 중 일부가 hard.goals 목록에 있지만 전부는 아니지만 skipHardGoalCheck: true 가 지정된 경우에도 Cruise Control은 하드 목표로 처리합니다.
11.2.4. 주요 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
최적화 목표는 모든 사용자가 사용할 수 있습니다. 주요 최적화 목표에 나열되지 않은 목표는 Cruise Control 운영에서 사용할 수 없습니다.
Cruise Control 배포 구성을 변경하지 않는 한 AMQ Streams는 다음과 같은 주요 최적화 목표를 Cruise Control에서 우선 순위 순으로 상속합니다.
RackAwareGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal
이러한 목표 중 일부는 어려운 목표로 설정됩니다.
복잡성을 줄이기 위해 KafkaRebalance 리소스에서 사용할 하나 이상의 목표를 완전히 제외할 필요가 없는 한 상속된 주요 최적화 목표를 사용하는 것이 좋습니다. 기본 최적화 목표의 우선 순위 순서는 기본 최적화 목표를 위한 구성에서 수정할 수 있습니다.
필요한 경우 Cruise Control 배포 구성: Kafka.spec.cruiseControl.config.goals에서 주요 최적화 목표를 구성합니다.
-
상속된 주요 최적화 목표를 수락하려면
Kafka.spec.cruiseControl.config에서goals속성을 지정하지 마십시오. -
상속된 주요 최적화 목표를 수정해야 하는 경우 목표 구성 옵션에서 목표 목록을, 우선 순위 순으로 지정합니다.
최적화 제안을 생성할 때 오류를 방지하려면 Kafka.spec.cruiseControl.config 의 목표 또는 default.goals 에 대한 변경 사항이 hard.goals 속성에 지정된 모든 하드 목표를 포함해야 합니다. 명확히하기 위해 주요 최적화 목표 및 기본 목표에 대해 어려운 목표 (subset로)를 지정해야 합니다.
11.2.5. 기본 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤은 기본 최적화 목표를 사용하여 캐시된 최적화 제안을 생성합니다. 캐시된 최적화 제안에 대한 자세한 내용은 11.3절. “최적화 제안 개요” 을 참조하십시오.
KafkaRebalance 사용자 정의 리소스에서 사용자 제공 최적화 목표를 설정하여 기본 최적화 목표를 재정의할 수 있습니다.
Cruise Control 배포 구성에서 default.goals 를 지정하지 않으면 주요 최적화 목표는 기본 최적화 목표로 사용됩니다. 이 경우 캐시된 최적화 제안은 주요 최적화 목표를 사용하여 생성됩니다.
-
기본 설정으로 기본 최적화 목표를 사용하려면
Kafka.spec.cruiseControl.config에서default.goals속성을 지정하지 마십시오. -
기본 최적화 목표를 수정하려면
Kafka.spec.cruiseControl.config에서default.goals속성을 편집합니다. 주요 최적화 목표의 하위 집합을 사용해야 합니다.
기본 최적화 목표를 위한 Kafka 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
topicOperator: {}
userOperator: {}
cruiseControl:
brokerCapacity:
inboundNetwork: 10000KB/s
outboundNetwork: 10000KB/s
config:
# Note that `default.goals` (superset) must also include all `hard.goals` (subset)
default.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal
hard.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal
# ...
기본 최적화 목표를 지정하지 않으면 주요 최적화 목표를 사용하여 캐시된 제안이 생성됩니다.
11.2.6. 사용자 제공 최적화 목표 링크 복사링크가 클립보드에 복사되었습니다!
사용자 제공 최적화 목표는 특정 최적화 제안에 대해 구성된 기본 목표를 좁힙니다. KafkaRebalance 사용자 정의 리소스의 spec.goals 에서 필요에 따라 설정할 수 있습니다.
KafkaRebalance.spec.goals
사용자 제공 최적화 목표는 다양한 시나리오에 대한 최적화 제안을 생성할 수 있습니다. 예를 들어 디스크 용량 또는 디스크 사용률을 고려하지 않고 Kafka 클러스터에서 리더 복제본 배포를 최적화할 수 있습니다. 따라서 리더 복제본 배포를 위한 단일 사용자 제공 목표를 포함하는 KafkaRebalance 사용자 정의 리소스를 생성합니다.
사용자 제공 최적화 목표는 다음과 같습니다.
- 구성된 모든 하드 목표를 포함하거나 오류가 발생합니다.
- 주요 최적화 목표의 서브 세트 표시
최적화 제안을 생성할 때 구성된 하드 목표를 무시하려면 skipHardGoalCheck: true 속성을 KafkaRebalance 사용자 정의 리소스에 추가합니다. 11.6절. “최적화 제안 생성”을 참조하십시오.
11.3. 최적화 제안 개요 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안을 생성하고 제안된 변경 사항을 적용하도록 KafkaRebalance 리소스를 구성합니다. 최적화 제안은 파티션 워크로드가 브로커 사이에 더욱 균등하게 분산되는 Kafka 클러스터를 생성할 수 있는 제안된 변경 사항에 대한 요약입니다.
각 최적화 제안은 브로커 리소스에 대한 구성된 용량 제한에 따라 이를 생성하는 데 사용된 최적화 목표 집합을 기반으로 합니다.
모든 최적화 제안은 제안된 리밸런스(Rebalance)의 영향에 대한 추정치 입니다. 제안을 승인하거나 거부할 수 있습니다. 최적화 제안을 먼저 생성하지 않고 클러스터 리밸런스를 승인할 수 없습니다.
다음 재조정 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.
-
full -
add-brokers -
remove-brokers
11.3.1. 재조정 모드 링크 복사링크가 클립보드에 복사되었습니다!
KafkaRebalance 사용자 정의 리소스의 spec.mode 속성을 사용하여 재조정 모드를 지정합니다.
full-
전체모드는 클러스터의 모든 브로커에서 복제본을 이동하여 전체 리밸런스를 실행합니다.spec.mode속성이KafkaRebalance사용자 정의 리소스에 정의되지 않은 경우 기본 모드입니다. add-brokers-
add-brokers모드는 하나 이상의 브로커를 추가하여 Kafka 클러스터를 확장한 후 사용됩니다. 일반적으로 Kafka 클러스터를 확장한 후 새 브로커는 새로 생성된 주제의 파티션만 호스팅하는 데 사용됩니다. 새 항목이 생성되지 않은 경우 새로 추가된 브로커는 사용되지 않으며 기존 브로커는 동일한 부하에 남아 있습니다. 브로커를 클러스터에 추가한 직후add-brokers모드를 사용하면 재조정 작업이 기존 브로커에서 새로 추가된 브로커로 복제본을 이동합니다.KafkaRebalance사용자 정의 리소스의spec.brokers속성을 사용하여 새 브로커를 목록으로 지정합니다. remove-brokers-
remove-brokers모드는 하나 이상의 브로커를 제거하여 Kafka 클러스터를 축소하기 전에 사용됩니다. Kafka 클러스터를 축소하면 복제본을 호스팅하더라도 브로커가 종료됩니다. 이로 인해 복제되지 않은 파티션이 발생할 수 있으며 일부 파티션의 최소 ISR (in-sync replicas)이 발생할 수 있습니다. 이러한 잠재적인 문제를 방지하기 위해remove-brokers모드는 제거할 브로커에서 복제본을 이동합니다. 이러한 브로커가 더 이상 복제본을 호스팅하지 않으면 축소 작업을 안전하게 실행할 수 있습니다.KafkaRebalance사용자 정의 리소스의spec.brokers속성의 목록으로 제거할 브로커를 지정합니다.
일반적으로 전체 리밸런스 모드를 사용하여 브로커에 부하를 분산하여 Kafka 클러스터를 재조정합니다. Add-brokers 및 remove-brokers 모드를 사용하여 클러스터를 확장 또는 축소하고 그에 따라 복제본을 리밸런싱할 때만 사용합니다.
리밸런스를 실행하는 절차는 실제로 세 가지 모드에서 동일합니다. 유일한 차이점은 spec.mode 속성을 통해 모드를 지정하는 것이며, 필요한 경우 spec.brokers 속성을 통해 추가되거나 제거될 브로커를 나열하는 것입니다.
11.3.2. 최적화 제안의 결과 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안이 생성되면 요약 및 브로커 로드가 반환됩니다.
- 요약
-
요약은
KafkaRebalance리소스에 포함되어 있습니다. 요약에서는 제안된 클러스터 재조정에 대한 개요를 제공하고 관련 변경 사항의 규모를 나타냅니다. 성공적으로 생성된 최적화 제안에 대한 요약은KafkaRebalance리소스의Status.OptimizationResult속성에 포함됩니다. 제공된 정보는 전체 최적화 제안의 요약입니다. - 브로커 로드
- 브로커 로드는 데이터를 JSON 문자열로 포함하는 ConfigMap에 저장됩니다. 브로커 로드는 제안된 리밸런스 값 전후에 표시되므로 클러스터의 각 브로커에 미치는 영향을 확인할 수 있습니다.
11.3.3. 최적화 제안 수동 승인 또는 거부 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안 요약은 제안된 변경 범위를 보여줍니다.
KafkaRebalance 리소스의 이름을 사용하여 명령줄에서 요약을 반환할 수 있습니다.
최적화 제안 요약 반환
oc describe kafkarebalance <kafka_rebalance_resource_name> -n <namespace>
jq 명령줄 JSON 구문 분석 도구를 사용할 수도 있습니다.
jq를 사용하여 최적화 제안 요약 반환
oc get kafkarebalance -o json | jq <jq_query>.
요약을 사용하여 최적화 제안을 승인하거나 거부할지 여부를 결정합니다.
- 최적화 제안 승인
-
KafkaRebalance리소스의strimzi.io/rebalance주석을 설정하여 최적화 제안을승인합니다. Cruise Control은 Kafka 클러스터에 제안을 적용하고 클러스터 재조정 작업을 시작합니다. - 최적화 제안 거부
-
최적화 제안을 승인하지 않도록 선택하는 경우 최적화 목표를 변경하거나 성능 튜닝 옵션을 업데이트한 다음 다른 제안을 생성할 수 있습니다.
strimzi.io/refresh주석을 사용하여KafkaRebalance리소스에 대한 새로운 최적화 제안을 생성할 수 있습니다.
최적화 제안을 사용하여 리밸런스에 필요한 변동을 평가합니다. 예를 들어 요약은 브로커 간 및 intra-broker 동작에 대해 설명합니다. inter-broker를 재조정하면 별도의 브로커 간에 데이터가 이동합니다. Intra-broker 재조정은 JBOD 스토리지 구성을 사용할 때 동일한 브로커의 디스크 간에 데이터를 이동합니다. 이러한 정보는 향후 조치를 취하지 않고 제안을 승인하지 않더라도 유용할 수 있습니다.
재조정할 때 Kafka 클러스터에 대한 추가 부하로 인해 최적화 제안을 거부하거나 승인을 지연할 수 있습니다.
다음 예에서 제안은 별도의 브로커 간의 데이터 재조정을 제안합니다. 리밸런스에는 브로커 전반에서 총 12MB의 데이터, 즉 55개의 파티션 복제본의 이동이 포함됩니다. 파티션 복제본 간 이동은 성능에 큰 영향을 미치지만 총 데이터 양은 크지 않습니다. 총 데이터가 훨씬 크면 제안을 거부하거나 리밸런스를 승인하여 Kafka 클러스터 성능에 미치는 영향을 제한할 수 있습니다.
성능 튜닝 옵션을 재조정하면 데이터 이동의 영향을 줄일 수 있습니다. 리밸런스 기간을 확장할 수 있는 경우 리밸런스를 더 작은 일괄 처리로 나눌 수 있습니다. 한 번에 데이터 이동이 줄어드는 경우 클러스터의 부하가 줄어듭니다.
최적화 제안 요약 예
Name: my-rebalance
Namespace: myproject
Labels: strimzi.io/cluster=my-cluster
Annotations: API Version: kafka.strimzi.io/v1alpha1
Kind: KafkaRebalance
Metadata:
# ...
Status:
Conditions:
Last Transition Time: 2022-04-05T14:36:11.900Z
Status: ProposalReady
Type: State
Observed Generation: 1
Optimization Result:
Data To Move MB: 0
Excluded Brokers For Leadership:
Excluded Brokers For Replica Move:
Excluded Topics:
Intra Broker Data To Move MB: 12
Monitored Partitions Percentage: 100
Num Intra Broker Replica Movements: 0
Num Leader Movements: 24
Num Replica Movements: 55
On Demand Balancedness Score After: 82.91290759174306
On Demand Balancedness Score Before: 78.01176356230222
Recent Windows: 5
Session Id: a4f833bd-2055-4213-bfdd-ad21f95bf184
이 제안은 24 개의 파티션 리더를 다른 브로커로 이동할 것입니다. 이렇게 하려면 성능에 낮은 영향을 미치는 ZooKeeper 구성을 변경해야 합니다.
균형 점수는 최적화 제안이 승인되기 전과 후에 Kafka 클러스터의 전반적인 균형을 측정한 것입니다. 균형 점수는 최적화 목표를 기반으로 합니다. 모든 목표를 충족하는 경우 점수는 100입니다. 충족되지 않는 각 목표에 대해 점수가 줄어듭니다. balancedness 점수를 비교하여 Kafka 클러스터가 리밸런스를 따르는 것보다 균형이 낮은지 확인합니다.
11.3.4. 최적화 제안 자동 승인 링크 복사링크가 클립보드에 복사되었습니다!
시간을 절약하기 위해 최적화 제안 승인 프로세스를 자동화할 수 있습니다. 자동화를 통해 최적화 제안을 생성할 때 클러스터 재조정으로 바로 전환됩니다.
최적화 제안 자동 승인 메커니즘을 활성화하려면 strimzi.io/rebalance-auto-approval 주석을 true 로 설정하여 KafkaRebalance 리소스를 생성합니다. 주석을 설정하지 않거나 false 로 설정하면 최적화 제안에 수동 승인이 필요합니다.
자동 승인 메커니즘이 활성화된 재조정 요청 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaRebalance
metadata:
name: my-rebalance
labels:
strimzi.io/cluster: my-cluster
annotations:
strimzi.io/rebalance-auto-approval: "true"
spec:
mode: # any mode
# ...
최적화 제안을 자동으로 승인할 때 상태를 확인할 수 있습니다. 재조정이 완료되면 KafkaRebalance 리소스의 상태가 Ready 로 이동합니다.
11.3.5. 최적화 제안 요약 속성 링크 복사링크가 클립보드에 복사되었습니다!
다음 표에서는 최적화 제안의 요약 섹션에 포함된 속성을 설명합니다.
| JSON 속성 | 설명 |
|---|---|
|
| 클러스터 브로커 디스크 간에 전송할 총 파티션 복제본 수입니다.
리밸런스 작업 중 성능에 미치는 영향: 비교적 높지만 |
|
| 아직 지원되지 않습니다. 빈 목록이 반환됩니다. |
|
| 별도의 브로커 간에 이동할 파티션 복제본 수입니다. 리밸런스 작업 중 성능에 미치는 영향 (Relatively high). |
|
| 최적화 제안이 생성되기 전과 후에 Kafka 클러스터의 전반적인 균형을 측정합니다.
점수는 각 소프트 목표의
|
|
|
동일한 브로커의 디스크 간에 이동할 각 파티션 복제본의 크기 합계입니다(
리밸런스 작업 중 성능에 미치는 영향: 변수. 수가 클수록 클러스터 재조정에 걸리는 시간이 길어집니다. 동일한 브로커에서 디스크 간에 많은 양의 데이터를 이동하는 것은 별도의 브로커보다 낮은 영향을 미칠 수 있습니다( |
|
| 최적화 제안이 기반이 되는 지표 창 수입니다. |
|
|
별도의 브로커로 이동할 각 파티션 복제본의 크기 합계( 리밸런스 작업 중 성능에 미치는 영향: 변수. 수가 클수록 클러스터 재조정에 걸리는 시간이 길어집니다. |
|
|
최적화 제안에 따라 Kafka 클러스터의 파티션 백분율입니다. |
|
|
|
|
| 리더가 서로 다른 복제본으로 전환될 파티션 수입니다. 여기에는 ZooKeeper 설정 변경이 포함됩니다. 리밸런스 작업 중 성능에 미치는 영향 (Relatively low). |
|
| 아직 지원되지 않습니다. 빈 목록이 반환됩니다. |
11.3.6. 브로커 로드 속성 링크 복사링크가 클립보드에 복사되었습니다!
브로커 로드는 JSON 형식 문자열로 KafkaRebalance 사용자 정의 리소스와 이름이 동일한 ConfigMap에 저장됩니다. 이 JSON 문자열은 각 브로커 ID에 대한 키가 있는 JSON 오브젝트로 구성되며 각 브로커의 여러 지표에 연결됩니다. 각 메트릭은 세 가지 값으로 구성됩니다. 첫 번째는 최적화 제안이 적용되기 전에 지표 값이고, 두 번째는 제안이 적용된 후의 예상 지표 값이며, 세 번째는 처음 두 값(이전의 -) 간의 차이점입니다.
ConfigMap은 KafkaRebalance 리소스가 ProposalReady 상태에 있을 때 표시되고 재조정이 완료된 후에도 유지됩니다.
ConfigMap 이름을 사용하여 명령줄에서 데이터를 볼 수 있습니다.
ConfigMap 데이터 반환
oc describe configmaps <my_rebalance_configmap_name> -n <namespace>
jq 명령줄 JSON 구문 분석기 툴을 사용하여 ConfigMap에서 JSON 문자열을 추출할 수도 있습니다.
jq를 사용하여 ConfigMap에서 JSON 문자열 추출
oc get configmaps <my_rebalance_configmap_name> -o json | jq '.["data"]["brokerLoad.json"]|fromjson|.'
다음 표에서는 최적화 제안의 브로커 로드 ConfigMap에 포함된 속성을 설명합니다.
| JSON 속성 | 설명 |
|---|---|
|
| 파티션 리더인 이 브로커의 복제본 수입니다. |
|
| 이 브로커의 복제본 수입니다. |
|
| 정의된 용량의 백분율로 CPU 사용률입니다. |
|
| 정의된 용량의 백분율로 디스크 사용률입니다. |
|
| 절대 디스크 사용량(MB)입니다. |
|
| 브로커의 총 네트워크 출력 비율입니다. |
|
| 이 브로커의 모든 파티션 리더 복제본에 대한 네트워크 입력 속도입니다. |
|
| 이 브로커의 모든 후속 복제본에 대한 네트워크 입력 속도입니다. |
|
| 이 브로커가 현재 호스팅하는 모든 복제본의 리더가 될 경우 실현되는 가상 최대 네트워크 출력 속도입니다. |
11.3.7. 캐시된 최적화 제안 링크 복사링크가 클립보드에 복사되었습니다!
Cruise Control은 구성된 기본 최적화 목표에 따라 캐시된 최적화 제안을 유지합니다. 워크로드 모델에서 생성되는 캐시된 최적화 제안은 Kafka 클러스터의 현재 상태를 반영하도록 15분마다 업데이트됩니다. 기본 최적화 목표를 사용하여 최적화 제안을 생성하는 경우 Cruise Control은 최근 캐시된 제안을 반환합니다.
캐시된 최적화 제안 새로 고침 간격을 변경하려면 Cruise Control 배포 구성에서 proposal.expiration.ms 설정을 편집합니다. Cruise Control 서버의 로드가 증가해도 빠르게 변경되는 클러스터의 경우 더 짧은 간격을 고려해 보십시오.
11.4. 성능 튜닝 개요 리밸런스 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 리밸런스에 대해 여러 성능 튜닝 옵션을 조정할 수 있습니다. 이러한 옵션은 리밸런스에서 파티션 복제 및 리더십 변동이 실행되는 방법과 리밸런스 작업에 할당된 대역폭을 제어합니다.
11.4.1. 파티션 재할당 명령 링크 복사링크가 클립보드에 복사되었습니다!
최적화 제안은 별도의 파티션 재할당 명령으로 구성됩니다. 제안을 승인 하면 Cruise Control 서버에서 이러한 명령을 Kafka 클러스터에 적용합니다.
파티션 재할당 명령은 다음 유형의 작업으로 구성됩니다.
파티션 이동: 파티션 복제본과 해당 데이터를 새 위치로 전송합니다. 파티션 동작은 다음 두 가지 형식 중 하나를 취할 수 있습니다.
- inter-broker 이동: 파티션 복제본이 다른 브로커의 로그 디렉터리로 이동됩니다.
- intra-broker 이동: 파티션 복제본은 동일한 브로커의 다른 로그 디렉터리로 이동됩니다.
- 리더십 이동: 파티션 복제본의 리더를 전환하는 작업이 포함됩니다.
cruise Control은 일괄 처리로 Kafka 클러스터에 파티션 재할당 명령을 다시 할당합니다. 재조정 중 클러스터 성능은 각 배치에 포함된 각 유형의 이동 수에 따라 영향을 받습니다.
11.4.2. 복제본 이동 전략 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 재조정 성능은 파티션 재할당 명령의 배치에 적용되는 복제본 이동 전략 의 영향을 받습니다. 기본적으로 Cruise Control은 BaseReplica>-<mentStrategy 를 사용하여 생성된 순서대로 명령을 적용합니다. 그러나 제안 초기에 매우 큰 파티션 재할당이 있는 경우 이 전략은 다른 재할당을 적용하는 속도가 느려질 수 있습니다.
크루즈 컨트롤은 최적화 제안에 적용할 수 있는 네 가지 대체 복제 이동 전략을 제공합니다.
-
PrioritizeSmallReplica>-<mentStrategy: 크기 조정 순서에 따라 재할당을 수행합니다. -
PrioritizeLargeReplica>-<mentStrategy: 크기 조정 순서에 따라 재할당을 수행합니다. -
PostponeUrpReplica>-<mentStrategy: 동기화되지 않은 파티션 복제본에 대한 재할당을 우선합니다. -
PrioritizeMinIrWithOfflineReplicasStrategy: 오프라인 복제본이 있는 (At/Under)MinISR 파티션을 사용하여 재할당합니다.Kafka사용자 정의 리소스의 사양에서cruiseControl.config.concurrency.adjuster.min.isr.check.enabled가true로 설정된 경우에만 이 전략이 작동합니다.
이러한 전략은 시퀀스로 구성할 수 있습니다. 첫 번째 전략은 내부 논리를 사용하여 두 파티션 재할당을 비교하려고 합니다. 재할당이 동일한 경우 순서를 결정하는 순서의 다음 전략으로 전달합니다.
11.4.3. Intra-broker 디스크 밸런싱 링크 복사링크가 클립보드에 복사되었습니다!
동일한 브로커에서 디스크 간에 많은 양의 데이터를 이동해도 별도의 브로커 간에 미치는 영향은 적습니다. 동일한 브로커에서 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포를 실행하는 경우 Cruise Control은 디스크 간에 파티션의 균형을 조정할 수 있습니다.
단일 디스크와 함께 JBOD 스토리지를 사용하는 경우 intra-broker 디스크 밸런싱을 통해 파티션의 균형을 조정할 디스크가 없기 때문입니다.
intra-broker 디스크 균형을 수행하려면 KafkaRebalance.spec 에서 rebalanceDisk 를 true 로 설정합니다. rebalanceDisk 를 true 로 설정할 때 Cruise Control이 자동으로 intra-broker 목표를 설정하고 inter-broker 목표를 무시하므로 KafkaRebalance.spec 에서 goal 필드를 설정하지 마십시오. 크루즈 컨트롤은 동시에 inter-broker 및 intra-broker 밸런싱을 수행하지 않습니다.
11.4.4. 튜닝 옵션 재조정 링크 복사링크가 클립보드에 복사되었습니다!
cruise Control은 위에서 설명한 리밸런스 매개변수를 튜닝하기 위한 몇 가지 구성 옵션을 제공합니다. Kafka 또는 최적화 제안 수준을 사용하여 Cruise Control을 구성하고 배포 할 때 이러한 튜닝 옵션을 설정할 수 있습니다.
-
Cruise Control 서버 설정은
Kafka.spec.cruiseControl.config아래의 Kafka 사용자 정의 리소스에서 설정할 수 있습니다. -
개별 리밸런스 성능 구성은
KafkaRebalance.spec아래에 설정할 수 있습니다.
관련 구성은 다음 표에 요약되어 있습니다.
| 크루즈 컨트롤 속성 | KafkaRebalance 속성 | Default | 설명 |
|---|---|---|---|
|
|
| 5 | 각 파티션 할당 일괄 처리의 최대 인수 수 |
|
|
| 2 | 각 파티션의 할당 일괄 처리의 인브로버 파티션의 최대 수 |
|
|
| 1000 | 각 파티션 재할당 배치에서 최대 파티션 리더십 변경 수 |
|
|
| null (제한 없음) | 파티션 재할당에 할당할 대역폭(초당 바이트 수) |
|
|
|
|
생성된 제안에 대해 파티션 재할당 명령을 실행하는 순서를 결정하는 데 사용되는 전략 목록(우선 순위 순서)입니다. 서버 설정의 경우 전략 클래스의 정규화된 이름(각 클래스 이름 시작에 |
| - |
| false | 동일한 브로커에서 디스크 공간 사용률의 균형을 조정하는 인브로커 디스크 밸런싱을 활성화합니다. 여러 디스크가 있는 JBOD 스토리지를 사용하는 Kafka 배포에만 적용됩니다. |
기본 설정을 변경하면 재조정하는 데 걸리는 시간과 재조정 중에 Kafka 클러스터에 배치된 로드에 영향을 미칩니다. 낮은 값을 사용하면 부하가 줄어들지만 소요되는 시간이 증가하며 그 반대의 경우도 마찬가지입니다.
11.5. Kafka를 사용하여 Cruise Control 구성 및 배포 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터와 함께 Cruise Control을 배포하도록 Kafka 리소스를 구성합니다. Kafka 리소스의 cruiseControl 속성을 사용하여 배포를 구성할 수 있습니다. Kafka 클러스터당 Cruise Control의 하나의 인스턴스를 배포합니다.
Cruise Control config 에서 목표 구성을 사용하여 최적화 제안을 생성하기 위한 최적화 목표를 지정합니다. brokerCapacity 를 사용하여 리소스 배포와 관련된 목표에 대한 기본 용량 제한을 변경할 수 있습니다. 브로커가 이기종 네트워크 리소스가 있는 노드에서 실행중인 경우 덮어쓰기 를 사용하여 각 브로커에 대한 네트워크 용량 제한을 설정할 수 있습니다.
cruiseControl 구성에 빈 개체({})를 사용하는 경우 모든 속성은 기본값을 사용합니다.
Cruise Control의 구성 옵션에 대한 자세한 내용은 사용자 정의 리소스 API 참조 를 참조하십시오.
사전 요구 사항
- OpenShift 클러스터
- 실행 중인 Cluster Operator
절차
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
- 크루즈 제어 구성. 표준 크루즈 제어 구성을 제공할 수 있으며 AMQ Streams에서 직접 관리하지 않는 속성으로 제한될 수 있습니다.
- 4
- 최적화 목표 구성: 기본 최적화 목표(
default.goals), 주요 최적화 목표(대상) 및 하드목표(hard.goals)에 대한 구성을 포함할 수 있습니다. - 5
- Cruise Control API에 대한 읽기 전용 액세스에 대해 CORS를 활성화 및 구성합니다.
- 6
- 지원되는 리소스 예약, 현재
cpu및memory요청, 사용할 수 있는 최대 리소스를 지정하기 위한 제한입니다. - 7
- 크루즈 제어 로거 및 로그 수준은 ConfigMap을 통해 직접 (
인라인) 또는 간접적으로 (외부) 추가. 사용자 지정 ConfigMap을log4j.properties키에 배치해야 합니다. 크루즈 컨트롤에는rootLogger.level이라는 단일 로거가 있습니다. 로그 수준을 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 또는 OFF로 설정할 수 있습니다. - 8
- 템플릿 사용자 지정. 여기서는 추가 보안 속성으로 Pod가 예약됩니다.
- 9
- 컨테이너(liveness)를 다시 시작할 시기와 컨테이너가 트래픽을 수락할 수 있는 시기(가용성)를 확인할 수 있는 상태 점검입니다.
- 10
- Prometheus 지표가 활성화되었습니다. 이 예에서는 Prometheus ScanSetting 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에는 준비되거나 예상된 복제본 수가 표시됩니다.AVAILABLE출력에1이 표시되면 배포가 성공적으로 수행됩니다.
자동 생성 주제
다음 표에서는 Cruise Control을 배포할 때 자동으로 생성되는 세 가지 주제를 보여줍니다. Cruise Control이 제대로 작동하려면 이러한 항목이 필요하며 삭제하거나 변경하지 않아야 합니다. 지정된 구성 옵션을 사용하여 주제의 이름을 변경할 수 있습니다.
| 자동 생성 주제 구성 | 기본 주제 이름 | 생성됨 | 함수 |
|---|---|---|---|
|
|
| AMQ Streams Metrics Reporter | 각 Kafka 브로커의 Metrics Reporter의 원시 지표를 저장합니다. |
|
|
| 크루즈 컨트롤 | 각 파티션에 대해 파생된 지표를 저장합니다. 이는 메트릭 샘플 집계기( Metric Sample Aggregator )에 의해 생성됩니다. |
|
|
| 크루즈 컨트롤 |
Cruise Control에 필요한 레코드 제거를 방지하기 위해 자동 생성된 항목에서 로그 압축을 비활성화합니다.
Cruise Control이 활성화된 Kafka 클러스터에서 자동 생성된 항목의 이름이 변경되면 이전 주제를 삭제하지 않고 수동으로 제거해야 합니다.
다음에 수행할 작업
Cruise Control을 구성하고 배포한 후 최적화 제안을 생성할 수 있습니다.
11.6. 최적화 제안 생성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaRebalance 리소스를 생성하거나 업데이트할 때 Cruise Control은 구성된 최적화 목표에 따라 Kafka 클러스터에 대한 최적화 제안을 생성합니다. 최적화 제안서에서 정보를 분석하고 승인할지 여부를 결정합니다. 최적화 제안 결과를 사용하여 Kafka 클러스터를 재조정할 수 있습니다.
다음 모드 중 하나에서 최적화 제안을 실행할 수 있습니다.
-
전체(기본값) -
add-brokers -
remove-brokers
사용하는 모드는 Kafka 클러스터에서 이미 실행 중인지 또는 Kafka 클러스터를 축소하기 전에 재조정할지 아니면 스케일링 후 재조정할지 여부에 따라 다릅니다. 자세한 내용은 브로커 스케일링을 사용하여 모드 리밸런싱 을 참조하십시오.
사전 요구 사항
- AMQ Streams 클러스터에 Cruise Control을 배포 했습니다.
- 최적화 목표를 구성하고 브로커 리소스에 대한 용량 제한(선택 사항)을 구성했습니다.
Cruise Control 구성에 대한 자세한 내용은 11.5절. “Kafka를 사용하여 Cruise Control 구성 및 배포” 을 참조하십시오.
절차
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
- 스케일 다운 작업에서 제거할 브로커 목록입니다. 이 속성은 필수입니다.
참고다음 단계 및 리밸런스를 승인하거나 중지하는 단계는 사용 중인 리밸런스 모드에 관계없이 동일합니다.
기본 목표를 사용하는 대신 사용자 제공 최적화 목표를 구성하려면
목표속성을 추가하고 하나 이상의 목표를 입력합니다.다음 예에서 랙 인식 및 복제본 용량은 사용자 제공 최적화 목표로 구성됩니다.
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 수에 직접 매핑하지 않습니다. 이는 Kafka.spec.kafka.resources.limits.cpu 에 구성된 CPU의 사이클이 있는 브로커당 단일 가상 CPU를 갖는 것과 같습니다. CPU 사용률과 용량 사이의 비율은 동일하게 유지되므로 리밸런스 동작에는 영향을 미치지 않습니다.
다음에 수행할 작업
11.7. 최적화 제안 승인 링크 복사링크가 클립보드에 복사되었습니다!
Cruise Control에서 생성한 최적화 제안을 승인할 수 있습니다. 상태가 ProposalReady 인 경우 그런 다음 크루즈 컨트롤은 최적화 제안 사항을 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>리밸런싱-
Rebalancingstatus는 재조정이 진행 중임을 나타냅니다. Ready-
Ready상태는 리밸런스가 완료되었음을 나타냅니다. NotReady-
NotReady상태는 오류가 발생했음을 나타냅니다.KafkaRebalance리소스의 문제 수정을 참조하십시오.
상태가
Ready로 변경되면 리밸런스가 완료됩니다.동일한
KafkaRebalance사용자 정의 리소스를 사용하여 다른 최적화 제안을 생성하려면refresh주석을 사용자 정의 리소스에 적용합니다. 이렇게 하면 사용자 정의 리소스가PendingProposal또는ProposalReady상태로 이동합니다. 그런 다음 원하는 경우 최적화 제안을 검토하고 승인 할 수 있습니다.
11.8. 클러스터 리밸런스 중지 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 재조정 작업이 시작되면 완료되고 Kafka 클러스터의 전반적인 성능에 영향을 줄 수 있습니다.
진행 중인 클러스터 리밸런스 작업을 중지하려면 KafkaRebalance 사용자 정의 리소스에 stop 주석을 적용합니다. 그러면 Cruise Control이 파티션 재할당의 현재 배치를 완료한 다음 리밸런스를 중지하도록 지시합니다. 리밸런스가 중지되면 완료된 파티션 재할당이 이미 적용되어 있으므로 리밸런스 작업을 시작하기 전에 Kafka 클러스터의 상태가 다를 때 다릅니다. 추가 재조정이 필요한 경우 새로운 최적화 제안을 생성해야 합니다.
중간(중지됨) 상태에서 Kafka 클러스터의 성능이 초기 상태보다 저하될 수 있습니다.
사전 요구 사항
-
KafkaRebalance사용자 정의 리소스에 승인하여 최적화 제안을승인했습니다. -
KafkaRebalance사용자 정의 리소스의 상태는재조정입니다.
절차
OpenShift에서
KafkaRebalance리소스에 주석을 답니다.oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance=stopKafkaRebalance리소스의 상태를 확인합니다.oc describe kafkarebalance rebalance-cr-name-
상태가
Stopped로 변경될 때까지 기다립니다.
11.9. KafkaRebalance 리소스 문제 해결 링크 복사링크가 클립보드에 복사되었습니다!
KafkaRebalance 리소스를 생성하거나 Cruise Control과 상호 작용할 때 문제가 발생하면 오류를 리소스 상태에 보고하고 이를 수정하는 방법에 대한 세부 정보와 함께 오류가 보고됩니다. 리소스도 NotReady 상태로 이동합니다.
클러스터 리밸런스 작업을 계속 진행하려면 KafkaRebalance 리소스 자체 또는 전체 Cruise Control 배포에서 문제를 수정해야 합니다. 문제에는 다음이 포함될 수 있습니다.
-
KafkaRebalance리소스의 잘못 구성된 매개변수입니다. -
KafkaRebalance리소스에 Kafka 클러스터를 지정하는strimzi.io/cluster레이블이 없습니다. -
Cruise Control 서버는
Kafka리소스의cruiseControl속성이 누락되어 있지 않습니다. - Cruise Control 서버에 연결할 수 없습니다.
문제를 해결한 후 KafkaRebalance 리소스에 refresh 주석을 추가해야 합니다. "새로 고침" 과정에서 Cruise Control Server에서 새로운 최적화 제안이 요청됩니다.
사전 요구 사항
- 최적화 제안을 승인했습니다.
-
리밸런스 작업의
KafkaRebalance사용자 정의 리소스의 상태는NotReady입니다.
절차
KafkaRebalance상태에서 오류에 대한 정보를 가져옵니다.oc describe kafkarebalance rebalance-cr-name-
KafkaRebalance리소스에서 문제를 해결합니다. OpenShift에서
KafkaRebalance리소스에 주석을 답니다.oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance=refreshKafkaRebalance리소스의 상태를 확인합니다.oc describe kafkarebalance rebalance-cr-name-
상태가
PendingProposal, 또는ProposalReady로 변경될 때까지 기다립니다.
12장. 파티션 재할당 툴 사용 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터를 스케일링할 때 브로커를 추가 또는 제거하고 파티션 분배 또는 주제 복제 요소를 업데이트해야 할 수 있습니다. 파티션 및 주제를 업데이트하려면 kafka-reassign-partitions.sh 도구를 사용할 수 있습니다.
AMQ Streams Cruise Control 통합이나 Topic Operator는 주제의 복제 요인을 변경할 수 없습니다. 그러나 kafka-reassign-partitions.sh 도구를 사용하여 주제의 복제 요소를 변경할 수 있습니다.
또한 이 도구를 사용하여 성능을 개선하기 위해 파티션을 다시 할당하고 여러 브로커 간에 파티션 분배의 균형을 조정할 수 있습니다. 그러나 자동화된 파티션 재할당 및 클러스터 재조정에 Cruise Control 을 사용하는 것이 좋습니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.
kafka-reassign-partitions.sh 툴을 브로커 컨테이너 내부가 아닌 별도의 대화형 Pod로 실행하는 것이 좋습니다. 브로커 컨테이너 내에서 Kafka bin/ 스크립트를 실행하면 JVM이 Kafka 브로커와 동일한 설정으로 시작되어 잠재적으로 중단될 수 있습니다. 별도의 Pod에서 kafka-reassign-partitions.sh 툴을 실행하면 이 문제를 방지할 수 있습니다. -ti 옵션을 사용하여 Pod를 실행하면 Pod 내에서 쉘 명령을 실행하기 위해 터미널로 대화형 Pod가 생성됩니다.
터미널에서 대화형 Pod 실행
oc run helper-pod -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 --rm=true --restart=Never -- bash
12.1. 파티션 재할당 툴 개요 링크 복사링크가 클립보드에 복사되었습니다!
파티션 재할당 툴은 Kafka 파티션 및 브로커를 관리하기 위한 다음과 같은 기능을 제공합니다.
- 파티션 복제본 재배포
- 브로커를 추가하거나 제거하여 클러스터를 확장 및 축소하고 Kafka 파티션을 많이 로드된 브로커에서 활용도가 낮은 브로커로 이동합니다. 이렇게 하려면 이동할 주제와 파티션과 이동 위치를 식별하는 파티션 재할당 계획을 만들어야 합니다. 클러스터 재조정 프로세스를 자동화 하므로 이러한 유형의 작업에 cruise Control이 권장됩니다.
- 상태 조정 주제 복제 요인 및 축소
- Kafka 주제의 복제 요소를 늘리거나 줄입니다. 이렇게 하려면 파티션에서 기존 복제 할당을 식별하고 복제 요소가 변경된 업데이트된 할당을 식별하는 파티션 재할당 계획을 만들어야 합니다.
- 기본 리더 변경
- Kafka 파티션의 기본 리더를 변경합니다. 현재 기본 리더를 사용할 수 없거나 클러스터의 브로커 전체에 로드를 재배포하려는 경우 유용할 수 있습니다. 이렇게 하려면 복제본 순서를 변경하여 각 파티션의 새로운 기본 리더를 지정하는 파티션 재할당 계획을 생성해야 합니다.
- 특정 JBOD 볼륨을 사용하도록 로그 디렉터리 변경
- 특정 JBOD 볼륨을 사용하도록 Kafka 브로커의 로그 디렉터리를 변경합니다. Kafka 데이터를 다른 디스크 또는 스토리지 장치로 이동하려는 경우 유용할 수 있습니다. 이렇게 하려면 각 항목에 대한 새 로그 디렉터리를 지정하는 파티션 재할당 계획을 만들어야 합니다.
12.1.1. 파티션 재할당 계획 생성 링크 복사링크가 클립보드에 복사되었습니다!
파티션 재할당 도구(kafka-reassign-partitions.sh)는 현재 브로커에서 새 브로커로 이동해야 하는 파티션을 지정하는 파티션 할당 계획을 생성하여 작동합니다.
이 계획에 만족하는 경우 이를 실행할 수 있습니다. 그런 다음 도구는 다음을 수행합니다.
- 파티션 데이터를 새 브로커로 마이그레이션
- Kafka 브로커에서 메타데이터를 업데이트하여 새 파티션 할당을 반영합니다.
- Kafka 브로커를 롤링 재시작하여 새 할당이 적용되도록 트리거합니다.
파티션 재할당 툴에는 세 가지 모드가 있습니다.
--generate- 일련의 주제와 브로커를 가져와서 JSON 파일을 다시 할당하면 해당 주제의 파티션이 해당 브로커에 할당됩니다. 이는 전체 주제에서 작동하기 때문에 일부 주제의 일부 파티션만 다시 할당하려는 경우에만 사용할 수 없습니다.
--execute- JSON 파일을 다시 할당하고 클러스터의 파티션과 브로커에 적용합니다. 결과적으로 파티션을 얻는 브로커는 파티션 리더의 비만족이됩니다. 지정된 파티션에 대해 새 브로커가 ISR (in-sync replicas)에 가입되어 참여하면 이전 브로커는 후속 조치를 중단하고 해당 복제본을 삭제합니다.
--verify-
--execute단계와 동일한 재 할당 JSON 파일을 사용하여--verify는 파일의 모든 파티션이 의도된 브로커로 이동되었는지 확인합니다. 재할당이 완료되면--verify는 적용되는 트래픽 제한 (--throttle)도 제거합니다. 제거되지 않는 한 throttles는 재할당이 완료된 후에도 클러스터에 계속 영향을 미칩니다.
지정된 시간에 클러스터에서 하나의 재할당을 실행할 수 있으며 실행 중인 재할당을 취소할 수 없습니다. 재할당을 취소해야 하는 경우 완료될 때까지 기다린 다음 다른 재할당을 수행하여 첫 번째 재할당의 영향을 되돌립니다. kafka-reassign-partitions.sh 는 출력의 일부로 이 reassignment JSON을 출력합니다. 매우 큰 reassignment는 in-progress reassignment를 중지해야 하는 경우 다수의 작은 재할당으로 분류해야 합니다.
12.1.2. 파티션 재할당 JSON 파일에서 주제 지정 링크 복사링크가 클립보드에 복사되었습니다!
툴은 다시 할당할 주제를 지정하는 재할당 JSON 파일을 사용합니다. 특정 파티션을 이동하려면 JSON 파일을 다시 할당하거나 파일을 수동으로 생성할 수 있습니다.
reassignment JSON 파일의 구조는 다음과 같습니다.
{
"version": 1,
"partitions": [
<PartitionObjects>
]
}
여기서 <ECDHEObjects >는 다음과 같이 쉼표로 구분된 오브젝트 목록입니다.
{
"topic": <TopicName>,
"partition": <Partition>,
"replicas": [ <AssignedBrokerIds> ]
}
다음은 topic-a 의 파티션 4 를 브로커 2,4 및 7 에 할당하고 topic-b 의 파티션 2 를 브로커 1,5 및 7 에 할당하는 예제입니다.
파티션 재할당 파일 예
{
"version": 1,
"partitions": [
{
"topic": "topic-a",
"partition": 4,
"replicas": [2,4,7]
},
{
"topic": "topic-b",
"partition": 2,
"replicas": [1,5,7]
}
]
}
JSON에 포함되지 않은 파티션은 변경되지 않습니다.
12.1.3. JBOD 볼륨 간 파티션 할당 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 JBOD 스토리지를 사용하는 경우 특정 볼륨과 해당 로그 디렉터리(각 볼륨에 단일 로그 디렉터리가 있음) 간에 파티션을 다시 할당하도록 선택할 수 있습니다. 특정 볼륨에 파티션을 다시 할당하려면 JSON 파일의 reassignment JSON 파일에서 log_dirs 옵션을 <ECDHE Objects >에 추가합니다.
{
"topic": <TopicName>,
"partition": <Partition>,
"replicas": [ <AssignedBrokerIds> ],
"log_dirs": [ <AssignedLogDirs> ]
}
log_dirs 오브젝트에는 replicas 오브젝트에 지정된 복제본 수와 동일한 수의 로그 디렉터리가 포함되어야 합니다. 값은 로그 디렉터리의 절대 경로 또는 any 키워드여야 합니다.
로그 디렉터리를 지정하는 파티션 재 할당 파일 예
{
"topic": "topic-a",
"partition": 4,
"replicas": [2,4,7].
"log_dirs": [ "/var/lib/kafka/data-0/kafka-log2", "/var/lib/kafka/data-0/kafka-log4", "/var/lib/kafka/data-0/kafka-log7" ]
}
12.1.4. 파티션 재할당 제한 링크 복사링크가 클립보드에 복사되었습니다!
파티션 재할당은 브로커 간에 대량의 데이터를 전송해야 하므로 프로세스가 느려질 수 있습니다. 클라이언트에 미치는 영향을 방지하려면 재할당 프로세스를 제한할 수 있습니다. kafka-reassign-partitions.sh 툴과 함께 --throttle 매개변수를 사용하여 재할당을 제한합니다. 브로커 간 파티션 이동에 대한 초당 최대 임계값을 바이트 단위로 지정합니다. 예를 들어 --throttle 5000000 은 50MBps의 파티션을 이동하는 최대 임계값을 설정합니다.
제한으로 인해 재할당이 완료되는 데 시간이 더 오래 걸릴 수 있습니다.
- 목축이 너무 낮으면 새로 할당된 브로커는 게시 중인 레코드를 계속 유지할 수 없으며 재할당은 완료되지 않습니다.
- 목회자가 너무 높으면 고객은 영향을 받습니다.
예를 들어 생산자의 경우 이는 일반 대기 시간보다 높은 것으로 확인 대기 중인 것으로 나타날 수 있습니다. 소비자의 경우 폴링 간 대기 시간이 길기 때문에 발생하는 처리량이 감소한 것으로 나타날 수 있습니다.
12.2. 파티션을 다시 할당하기 위한 JSON 파일 재 할당 생성 링크 복사링크가 클립보드에 복사되었습니다!
kafka-reassign-partitions.sh 도구를 사용하여 JSON 파일을 다시 할당하여 Kafka 클러스터를 확장한 후 파티션을 다시 할당합니다. 브로커를 추가하거나 제거해도 기존 파티션을 자동으로 재배포하지 않습니다. 파티션 배포의 균형을 조정하고 새 브로커를 최대한 활용하기 위해 kafka-reassign-partitions.sh 도구를 사용하여 파티션을 다시 할당할 수 있습니다.
Kafka 클러스터에 연결된 대화형 Pod 컨테이너에서 툴을 실행합니다.
다음 절차에서는 mTLS를 사용하는 보안 재 할당 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
연결을 설정하려면 다음이 필요합니다.
- Kafka 클러스터가 생성될 때 Cluster Operator가 생성한 클러스터 CA 인증서 및 암호
- Kafka 클러스터에 대한 클라이언트 액세스를 위해 사용자가 생성할 때 User Operator가 생성한 사용자 CA 인증서 및 암호
이 절차에서는 CA 인증서 및 해당 암호가 PKCS #12(.p12 및 .password) 형식으로 포함된 사용자 시크릿과 클러스터에서 추출됩니다. 암호를 사용하면 인증서가 포함된 .p12 저장소에 액세스할 수 있습니다. .p12 저장소를 사용하여 Kafka 클러스터에 대한 연결을 인증하는 신뢰 저장소 및 키 저장소를 지정합니다.
사전 요구 사항
- 실행 중인 Cluster Operator가 있어야 합니다.
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있습니다.TLS 암호화 및 mTLS 인증을 통한 Kafka 구성
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... listeners: # ... - name: tls port: 9093 type: internal tls: 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를 배포하면
Kafka클러스터 이름( <cluster_name> -cluster-ca-cert )을 사용하여 클러스터CA 인증서가 있는 보안이 생성됩니다. 예:my-cluster-cluster-ca-cert.AMQ Streams Kafka 이미지를 사용하여 새 대화형 Pod 컨테이너를 실행하여 실행 중인 Kafka 브로커에 연결합니다.
oc run --restart=Never --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 <interactive_pod_name> -- /bin/sh -c "sleep 3600"& lt;interactive_pod_name& gt;을 Pod 이름으로 바꿉니다.
클러스터 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 사용자를 생성하면 Kafka 사용자 이름으로 사용자 CA 인증서가 있는 시크릿이 생성됩니다. 예를 들면my-user입니다.사용자 CA 인증서를 대화형 Pod 컨테이너에 복사합니다.
oc cp user.p12 <interactive_pod_name>:/tmpCA 인증서를 사용하면 대화형 Pod 컨테이너가 TLS를 사용하여 Kafka 브로커에 연결할 수 있습니다.
config.properties파일을 생성하여 Kafka 클러스터에 대한 연결을 인증하는 데 사용되는 신뢰 저장소 및 키 저장소를 지정합니다.이전 단계에서 추출한 인증서와 암호를 사용합니다.
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 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명령을 사용하여 reassignment JSON을 생성합니다.my-topic의 파티션을 지정된 브로커로 이동하는 명령의 예bin/kafka-reassign-partitions.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --topics-to-move-json-file /tmp/topics.json \ --broker-list 0,1,2,3,4 \ --generate
12.3. 브로커를 추가한 후 파티션 할당 링크 복사링크가 클립보드에 복사되었습니다!
kafka-reassign-partitions.sh 툴로 생성된 재할당 파일을 사용하여 Kafka 클러스터의 브로커 수를 늘리면 파티션을 다시 할당합니다. 재할당 파일은 파티션이 확대된 Kafka 클러스터의 브로커에 다시 할당되는 방법을 설명해야 합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다.
다음 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동화된 파티션 재할당 및 클러스터 재조정에는 Cruise Control이 권장됩니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.
사전 요구 사항
-
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있습니다. -
reassignment.json이라는 reassignment JSON 파일을 생성했습니다. - 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
-
Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된
KafkaUser로 연결됩니다.
JSON 파일 할당 생성을 참조하십시오.
절차
-
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 간 제한 속도를 초당 바이트 단위로
--throttle옵션을 전달할 수도 있습니다. 예를 들면 다음과 같습니다.bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute이 명령은 두 개의 reassignment JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 저장해야 합니다. 두 번째 JSON 오브젝트는 reassignment JSON 파일에서 전달된 대상 재할당입니다.
reassignment 중에 throttle을 변경해야 하는 경우 다른 제한 비율로 동일한 명령을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute브로커 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을 저장한 경우 되돌리기 파일을 삭제할 수 있습니다.
12.4. 브로커를 제거하기 전에 파티션 다시 할당 링크 복사링크가 클립보드에 복사되었습니다!
kafka-reassign-partitions.sh 툴로 생성된 재할당 파일을 사용하여 Kafka 클러스터의 브로커 수를 줄이기 전에 파티션을 다시 할당합니다. 재할당 파일은 파티션을 Kafka 클러스터의 나머지 브로커에 다시 할당하는 방법을 설명해야 합니다. 파일에 지정된 재할당을 브로커에 적용한 다음 새 파티션 할당을 확인합니다. 번호가 많은 Pod의 브로커가 먼저 제거됩니다.
다음 절차에서는 TLS를 사용하는 보안 확장 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
kafka-reassign-partitions.sh 툴을 사용할 수 있지만 자동화된 파티션 재할당 및 클러스터 재조정에는 Cruise Control이 권장됩니다. 크루즈 컨트롤은 다운타임 없이 한 브로커에서 다른 브로커로 주제를 이동할 수 있으며 파티션을 다시 할당하는 가장 효율적인 방법입니다.
사전 요구 사항
-
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있습니다. -
reassignment.json이라는 reassignment JSON 파일을 생성했습니다. - 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
-
Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된
KafkaUser로 연결됩니다.
JSON 파일 할당 생성을 참조하십시오.
절차
-
이 작업을 수행하지 않은 경우 대화형 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 간 제한 속도를 초당 바이트 단위로
--throttle옵션을 전달할 수도 있습니다. 예를 들면 다음과 같습니다.bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute이 명령은 두 개의 reassignment JSON 오브젝트를 출력합니다. 첫 번째는 이동 중인 파티션에 대한 현재 할당을 기록합니다. 나중에 다시 할당해야 하는 경우 로컬 파일(포드의 파일이 아님)에 저장해야 합니다. 두 번째 JSON 오브젝트는 reassignment JSON 파일에서 전달된 대상 재할당입니다.
reassignment 중에 throttle을 변경해야 하는 경우 다른 제한 비율로 동일한 명령을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute브로커 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을 저장한 경우 되돌리기 파일을 삭제할 수 있습니다.
모든 파티션 재할당이 완료되면 제거되는 브로커는 클러스터의 파티션에 대해 책임을 지지 않습니다. 브로커의 데이터 로그 디렉터리에 라이브 파티션 로그가 없는지 확인하여 이를 확인할 수 있습니다. 브로커의 로그 디렉터리에 확장된 정규식
\.[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속성을 편집하여 브로커 수를 줄일 수 있습니다.
12.5. 주제의 복제 요소 변경 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클러스터에서 주제의 복제 요소를 변경하려면 kafka-reassign-partitions.sh 도구를 사용합니다. 이 작업은 Kafka 클러스터에 연결된 대화형 Pod 컨테이너에서 툴을 실행하고 다시 할당 파일을 사용하여 주제 복제본 변경 방법을 설명하는 방식으로 수행할 수 있습니다.
다음 절차에서는 TLS를 사용하는 보안 프로세스를 설명합니다. TLS 암호화 및 mTLS 인증을 사용하는 Kafka 클러스터가 필요합니다.
사전 요구 사항
-
내부 TLS 암호화 및 mTLS 인증으로 구성된
Kafka리소스를 기반으로 실행 중인 Kafka 클러스터가 있습니다. - 실행 중인 Kafka 브로커에 연결된 대화형 Pod 컨테이너를 실행하고 있습니다.
-
reassignment.json이라는 reassignment JSON 파일을 생성했습니다. -
Kafka 클러스터 및 해당 주제를 관리할 수 있는 권한을 지정하는 ACL 규칙으로 구성된
KafkaUser로 연결됩니다.
JSON 파일 할당 생성을 참조하십시오.
이 절차에서는 my-topic 이라는 항목에 4개의 복제본이 있으며 이를 3개로 줄이고자 합니다. topics.json 이라는 JSON 파일은 주제를 지정하고 reassignment.json 파일을 생성하는 데 사용되었습니다.
JSON 파일의 예: my-topic지정
{
"version": 1,
"topics": [
{ "topic": "my-topic"}
]
}
절차
이 작업을 수행하지 않은 경우 대화형 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를 사용하여 주제의 각 파티션에 대한 목록의 마지막 복제본을 제거합니다.각 파티션에 대한 마지막 주제 복제본 제거
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스크립트를 사용하여 주제 복제를 변경합니다.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를 제거하는 효과가 있습니다.--describe옵션과 함께bin/kafka-topics.sh명령을 실행하여 주제 변경 결과를 확인합니다.bin/kafka-topics.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --describe주제의 복제본 수 감소 결과
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4
13장. AMQ Streams Operator 사용 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams Operator를 사용하여 Kafka 클러스터 및 Kafka 주제 및 사용자를 관리합니다.
13.1. AMQ Streams Operator를 사용하여 네임스페이스 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
Operator는 네임스페이스에서 AMQ Streams 리소스를 조사하고 관리합니다. Cluster Operator는 단일 네임스페이스, 여러 네임스페이스 또는 OpenShift 클러스터의 모든 네임스페이스를 조사할 수 있습니다. Topic Operator 및 User Operator는 단일 네임스페이스를 조사할 수 있습니다.
-
Cluster Operator는
Kafka리소스를 감시합니다. -
주제 Operator는
KafkaTopic리소스를 감시합니다. -
User Operator는
KafkaUser리소스를 조사합니다.
Topic Operator 및 User Operator는 네임스페이스에서 단일 Kafka 클러스터만 조사할 수 있습니다. 또한 단일 Kafka 클러스터에만 연결할 수 있습니다.
여러 주제 Operator에서 동일한 네임스페이스를 조사하는 경우 이름 충돌 및 주제 삭제가 발생할 수 있습니다. 각 Kafka 클러스터는 이름이 동일한 Kafka 주제(예: __consumer_offsets)를 사용하기 때문입니다. 하나의 주제 Operator만 지정된 네임스페이스를 감시하는지 확인합니다.
단일 네임스페이스에서 여러 User Operator를 사용하는 경우 지정된 사용자 이름이 있는 사용자는 둘 이상의 Kafka 클러스터에 존재할 수 있습니다.
Cluster Operator를 사용하여 Topic Operator 및 User Operator를 배포하는 경우 기본적으로 Cluster Operator가 배포한 Kafka 클러스터를 확인합니다. Operator 구성에서 watchedNamespace 를 사용하여 네임스페이스를 지정할 수도 있습니다.
각 Operator의 독립 실행형 배포의 경우 네임스페이스를 지정하고 구성을 조사할 Kafka 클러스터에 연결합니다.
13.2. Cluster Operator 사용 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator를 사용하여 Kafka 클러스터 및 기타 Kafka 구성 요소를 배포합니다.
13.2.1. RBAC(역할 기반 액세스 제어) 리소스 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 OpenShift 리소스에 액세스해야 하는 AMQ Streams 구성 요소에 대한 RBAC 리소스를 생성하고 관리합니다.
Cluster Operator가 작동하려면 Kafka 및 KafkaConnect 와 같은 Kafka 리소스와 상호 작용하고 ConfigMap,Pod,배포,StatefulSet 및 Service 와 같은 관리형 리소스와 상호 작용하려면 OpenShift 클러스터 내 권한이 필요합니다.
권한은 OpenShift 역할 기반 액세스 제어(RBAC) 리소스를 통해 지정됩니다.
-
ServiceAccount -
Role및ClusterRole -
RoleBinding및ClusterRoleBinding
13.2.1.1. AMQ Streams 구성 요소에 대한 권한 위임 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 strimzi-cluster-operator 라는 서비스 계정에서 실행됩니다. AMQ Streams 구성 요소에 대한 RBAC 리소스를 생성할 수 있는 권한을 부여하는 클러스터 역할이 할당됩니다. 역할 바인딩은 클러스터 역할과 서비스 계정을 연결합니다.
OpenShift는 하나의 ServiceAccount 에서 작동하는 구성 요소가 ServiceAccount 부여에 없는 다른 ServiceAccount 권한을 부여하지 못하도록 합니다. Cluster Operator는 관리하는 리소스에 필요한 RoleBinding 및 ClusterRoleBinding RBAC 리소스를 생성하므로 동일한 권한을 제공하는 역할이 필요합니다.
다음 표에는 Cluster Operator가 생성한 RBAC 리소스에 대해 설명합니다.
| 이름 | 사용 대상 |
|---|---|
|
| Kafka 브로커 Pod |
|
| zookeeper Pod |
|
| Kafka Connect Pod |
|
| MirrorMaker Pod |
|
| MirrorMaker 2 Pod |
|
| Kafka 브리지 Pod |
|
| 엔터티 Operator |
| 이름 | 사용 대상 |
|---|---|
|
| Cluster Operator |
|
| Cluster Operator |
|
| Cluster Operator |
|
| 클러스터 Operator, 랙 기능(사용 시) |
|
| Cluster Operator, Topic Operator, User Operator |
|
| 랙을 위한 Cluster Operator, Kafka 클라이언트 |
| 이름 | 사용 대상 |
|---|---|
|
| Cluster Operator |
|
| 랙을 위한 Cluster Operator, Kafka 브로커 |
|
| 랙을 위한 Cluster Operator, Kafka 클라이언트 |
| 이름 | 사용 대상 |
|---|---|
|
| Cluster Operator |
|
| 랙을 위한 Cluster Operator, Kafka 브로커 |
13.2.1.2. ServiceAccount를 사용하여 Cluster Operator 실행 링크 복사링크가 클립보드에 복사되었습니다!
ServiceAccount 를 사용하여 Cluster Operator를 실행하는 것이 가장 좋습니다.
Cluster Operator의 ServiceAccount 예
apiVersion: v1
kind: ServiceAccount
metadata:
name: strimzi-cluster-operator
labels:
app: strimzi
그런 다음 Operator의 Deployment 는 spec.template.spec.serviceAccountName 에 이를 지정해야 합니다.
Cluster Operator의 부분 배포 예
apiVersion: apps/v1
kind: Deployment
metadata:
name: strimzi-cluster-operator
labels:
app: strimzi
spec:
replicas: 1
selector:
matchLabels:
name: strimzi-cluster-operator
strimzi.io/kind: cluster-operator
template:
# ...
12행입니다. 여기서 strimzi-cluster-operator 는 serviceAccountName 으로 지정됩니다.
13.2.1.3. ClusterRole 리소스 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 ClusterRole 리소스를 사용하여 리소스에 필요한 액세스 권한을 제공합니다. OpenShift 클러스터 설정에 따라 클러스터 관리자가 클러스터 역할을 생성하는 데 필요할 수 있습니다.
클러스터 관리자 권한은 ClusterRole 리소스를 생성하는 경우에만 필요합니다. Cluster Operator는 클러스터 관리자 계정에서 실행되지 않습니다.
ClusterRole 리소스는 최소 권한 원칙을 따르고 Kafka 구성 요소의 클러스터를 작동하기 위해 Cluster Operator에 필요한 권한만 포함합니다. 첫 번째 할당된 권한 세트를 사용하면 Cluster Operator에서 StatefulSet,Deployment,Pod, ConfigMap 과 같은 OpenShift 리소스를 관리할 수 있습니다.
권한을 위임하려면 Cluster Operator에 모든 클러스터 역할이 필요합니다.
Cluster Operator는 strimzi-cluster-operator-namespaced 및 strimzi-cluster-operator-global 클러스터 역할을 사용하여 네임스페이스 범위의 리소스 수준 및 클러스터 범위 리소스 수준에서 권한을 부여합니다.
Cluster Operator의 네임스페이스 리소스가 있는 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-cluster-operator-namespaced
labels:
app: strimzi
rules:
# Resources in this role are used by the operator based on an operand being deployed in some namespace. When needed, you
# can deploy the operator as a cluster-wide operator. But grant the rights listed in this role only on the namespaces
# where the operands will be deployed. That way, you can limit the access the operator has to other namespaces where it
# does not manage any clusters.
- apiGroups:
- "rbac.authorization.k8s.io"
resources:
# The cluster operator needs to access and manage rolebindings to grant Strimzi components cluster permissions
- rolebindings
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "rbac.authorization.k8s.io"
resources:
# The cluster operator needs to access and manage roles to grant the entity operator permissions
- roles
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- ""
resources:
# The cluster operator needs to access and delete pods, this is to allow it to monitor pod health and coordinate rolling updates
- pods
# The cluster operator needs to access and manage service accounts to grant Strimzi components cluster permissions
- serviceaccounts
# The cluster operator needs to access and manage config maps for Strimzi components configuration
- configmaps
# The cluster operator needs to access and manage services and endpoints to expose Strimzi components to network traffic
- services
- endpoints
# The cluster operator needs to access and manage secrets to handle credentials
- secrets
# The cluster operator needs to access and manage persistent volume claims to bind them to Strimzi components for persistent data
- persistentvolumeclaims
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "apps"
resources:
# The cluster operator needs to access and manage deployments to run deployment based Strimzi components
- deployments
- deployments/scale
- deployments/status
# The cluster operator needs to access and manage stateful sets to run stateful sets based Strimzi components
- statefulsets
# The cluster operator needs to access replica-sets to manage Strimzi components and to determine error states
- replicasets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "" # legacy core events api, used by topic operator
- "events.k8s.io" # new events api, used by cluster operator
resources:
# The cluster operator needs to be able to create events and delegate permissions to do so
- events
verbs:
- create
- apiGroups:
# Kafka Connect Build on OpenShift requirement
- build.openshift.io
resources:
- buildconfigs
- buildconfigs/instantiate
- builds
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- networking.k8s.io
resources:
# The cluster operator needs to access and manage network policies to lock down communication between Strimzi components
- networkpolicies
# The cluster operator needs to access and manage ingresses which allow external access to the services in a cluster
- ingresses
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- route.openshift.io
resources:
# The cluster operator needs to access and manage routes to expose Strimzi components for external access
- routes
- routes/custom-host
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- image.openshift.io
resources:
# The cluster operator needs to verify the image stream when used for Kafka Connect image build
- imagestreams
verbs:
- get
- apiGroups:
- policy
resources:
# The cluster operator needs to access and manage pod disruption budgets this limits the number of concurrent disruptions
# that a Strimzi component experiences, allowing for higher availability
- poddisruptionbudgets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
Cluster Operator의 클러스터 범위 리소스가 있는 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-cluster-operator-global
labels:
app: strimzi
rules:
- apiGroups:
- "rbac.authorization.k8s.io"
resources:
# The cluster operator needs to create and manage cluster role bindings in the case of an install where a user
# has specified they want their cluster role bindings generated
- clusterrolebindings
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- storage.k8s.io
resources:
# The cluster operator requires "get" permissions to view storage class details
# This is because only a persistent volume of a supported storage class type can be resized
- storageclasses
verbs:
- get
- apiGroups:
- ""
resources:
# The cluster operator requires "list" permissions to view all nodes in a cluster
# The listing is used to determine the node addresses when NodePort access is configured
# These addresses are then exposed in the custom resource states
- nodes
verbs:
- list
strimzi-cluster-operator-leader-election 클러스터 역할은 리더 선택에 필요한 권한을 나타냅니다.
리더 선택 권한이 있는 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-cluster-operator-leader-election
labels:
app: strimzi
rules:
- apiGroups:
- coordination.k8s.io
resources:
# The cluster operator needs to access and manage leases for leader election
# The "create" verb cannot be used with "resourceNames"
- leases
verbs:
- create
- apiGroups:
- coordination.k8s.io
resources:
# The cluster operator needs to access and manage leases for leader election
- leases
resourceNames:
# The default RBAC files give the operator only access to the Lease resource names strimzi-cluster-operator
# If you want to use another resource name or resource namespace, you have to configure the RBAC resources accordingly
- strimzi-cluster-operator
verbs:
- get
- list
- watch
- delete
- patch
- update
strimzi-kafka-broker 클러스터 역할은 랙 인식을 사용하는 Kafka Pod의 init 컨테이너에서 필요한 액세스를 나타냅니다.
strimzi- <cluster_name> -kafka-init 라는 역할 바인딩은 strimzi > -kafka 서비스 계정 액세스 권한을 부여합니다. rack 기능을 사용하지 않고 클러스터가 -kafka-broker 역할을 사용하여 <cluster_namenodeport 를 통해 노출되지 않으면 바인딩이 생성되지 않습니다.
Cluster Operator의 ClusterRole 을 통해 OpenShift 노드에 대한 액세스를 Kafka 브로커 Pod에 위임할 수 있습니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-kafka-broker
labels:
app: strimzi
rules:
- apiGroups:
- ""
resources:
# The Kafka Brokers require "get" permissions to view the node they are on
# This information is used to generate a Rack ID that is used for High Availability configurations
- nodes
verbs:
- get
strimzi-entity-operator 클러스터 역할은 Topic Operator 및 User Operator에 필요한 액세스를 나타냅니다.
Topic Operator는 상태 정보를 사용하여 OpenShift 이벤트를 생성하므로 < cluster_name> -entity-operator 서비스 계정이 strimzi-entity-operator 역할에 바인딩되어 strimzi-entity-operator 역할 바인딩을 통해 이 액세스 권한을 부여합니다.
Cluster Operator의 ClusterRole 을 통해 이벤트에 대한 액세스를 Topic 및 User Operator에 위임할 수 있습니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-entity-operator
labels:
app: strimzi
rules:
- apiGroups:
- "kafka.strimzi.io"
resources:
# The entity operator runs the KafkaTopic assembly operator, which needs to access and manage KafkaTopic resources
- kafkatopics
- kafkatopics/status
# The entity operator runs the KafkaUser assembly operator, which needs to access and manage KafkaUser resources
- kafkausers
- kafkausers/status
verbs:
- get
- list
- watch
- create
- patch
- update
- delete
- apiGroups:
- ""
resources:
- events
verbs:
# The entity operator needs to be able to create events
- create
- apiGroups:
- ""
resources:
# The entity operator user-operator needs to access and manage secrets to store generated credentials
- secrets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
strimzi-kafka-client 클러스터 역할은 랙 인식을 사용하는 Kafka 클라이언트가 필요로 하는 액세스를 나타냅니다.
Cluster Operator의 ClusterRole 을 통해 OpenShift 노드에 대한 액세스를 Kafka 클라이언트 기반 Pod에 위임할 수 있습니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-kafka-client
labels:
app: strimzi
rules:
- apiGroups:
- ""
resources:
# The Kafka clients (Connect, Mirror Maker, etc.) require "get" permissions to view the node they are on
# This information is used to generate a Rack ID (client.rack option) that is used for consuming from the closest
# replicas when enabled
- nodes
verbs:
- get
13.2.1.4. ClusterRoleBinding 리소스 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 ClusterRoleBinding 및 RoleBinding 리소스를 사용하여 ClusterRole 을 ServiceAccount 와 연결합니다. 클러스터 역할 바인딩은 클러스터 범위 리소스가 포함된 클러스터 역할에 필요합니다.
Cluster Operator의 ClusterRoleBinding 예
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: strimzi-cluster-operator
labels:
app: strimzi
subjects:
- kind: ServiceAccount
name: strimzi-cluster-operator
namespace: myproject
roleRef:
kind: ClusterRole
name: strimzi-cluster-operator-global
apiGroup: rbac.authorization.k8s.io
권한 위임에 사용되는 클러스터 역할에도 클러스터 역할 바인딩이 필요합니다.
Cluster Operator 및 Kafka 브로커 랙 인식에 대한 ClusterRoleBinding 의 예
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: strimzi-cluster-operator-kafka-broker-delegation
labels:
app: strimzi
# The Kafka broker cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Kafka brokers.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
- kind: ServiceAccount
name: strimzi-cluster-operator
namespace: myproject
roleRef:
kind: ClusterRole
name: strimzi-kafka-broker
apiGroup: rbac.authorization.k8s.io
Cluster Operator 및 Kafka 클라이언트 랙 인식에 대한 ClusterRoleBinding 의 예
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: strimzi-cluster-operator-kafka-client-delegation
labels:
app: strimzi
# The Kafka clients cluster role must be bound to the cluster operator service account so that it can delegate the
# cluster role to the Kafka clients using it for consuming from closest replica.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
- kind: ServiceAccount
name: strimzi-cluster-operator
namespace: myproject
roleRef:
kind: ClusterRole
name: strimzi-kafka-client
apiGroup: rbac.authorization.k8s.io
네임스페이스된 리소스만 포함하는 클러스터 역할은 역할 바인딩만 사용하여 바인딩됩니다.
Cluster Operator의 RoleBinding 예
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: strimzi-cluster-operator
labels:
app: strimzi
subjects:
- kind: ServiceAccount
name: strimzi-cluster-operator
namespace: myproject
roleRef:
kind: ClusterRole
name: strimzi-cluster-operator-namespaced
apiGroup: rbac.authorization.k8s.io
Cluster Operator 및 Kafka 브로커 랙 인식에 대한 RoleBinding 의 예
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: strimzi-cluster-operator-entity-operator-delegation
labels:
app: strimzi
# The Entity Operator cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Entity Operator.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
- kind: ServiceAccount
name: strimzi-cluster-operator
namespace: myproject
roleRef:
kind: ClusterRole
name: strimzi-entity-operator
apiGroup: rbac.authorization.k8s.io
13.2.2. Cluster Operator 로깅을 위한 ConfigMap 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 Operator 로깅은 strimzi-cluster-operator 라는 ConfigMap 을 통해 구성됩니다.
Cluster Operator를 설치할 때 로깅 구성이 포함된 ConfigMap 이 생성됩니다. 이 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 옵션에서 시간(초)을 설정합니다.
Cluster Operator를 배포할 때 ConfigMap 이 누락되면 기본 로깅 값이 사용됩니다.
Cluster Operator가 배포된 후 ConfigMap 이 실수로 삭제되면 가장 최근에 로드된 로깅 구성이 사용됩니다. 새 ConfigMap 을 생성하여 새 로깅 구성을 로드합니다.
ConfigMap 에서 monitorInterval 옵션을 제거하지 마십시오.
13.2.3. 환경 변수를 사용하여 Cluster Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
환경 변수를 사용하여 Cluster Operator를 구성할 수 있습니다. 지원되는 환경 변수는 여기에 나열되어 있습니다.
환경 변수는 배포 구성 파일에서 Cluster Operator의 컨테이너 이미지에 대해 지정됩니다. (install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml)
STRIMZI_NAMESPACEOperator가 작동하는 쉼표로 구분된 네임스페이스 목록입니다. 설정하지 않으면 빈 문자열로 설정하거나
*로 설정하면 Cluster Operator가 모든 네임스페이스에서 작동합니다.Cluster Operator 배포에서는 Downward API를 사용하여 Cluster Operator가 배포된 네임스페이스로 자동 설정할 수 있습니다.
Cluster Operator 네임스페이스 구성 예
env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespaceSTRIMZI_FULL_RECONCILIATION_INTERVAL_MS- 기본값은 120000ms입니다. 정기적인 조정 간격( 밀리초)입니다.
STRIMZI_OPERATION_TIMEOUT_MS- 선택 사항: 기본 300000ms. 내부 작업 시간(밀리초)입니다. 일반 OpenShift 작업이 일반 OpenShift 작업보다 오래 걸리는 클러스터에서 AMQ Streams를 사용하면 이 값을 늘립니다(예: Docker 이미지 다운로드 속도가 느려짐).
STRIMZI_ZOOKEEPER_ADMIN_SESSION_TIMEOUT_MS-
선택 사항: 기본 10000ms. Cluster Operator의 ZooKeeper admin 클라이언트에 대한 세션 제한 시간(밀리초)입니다. 클러스터 Operator의 ZooKeeper 요청이 시간 초과 문제로 인해 정기적으로 실패하는 경우 값을 늘립니다. ZooKeeper 서버 측에
maxSessionTimeout구성을 통해 허용되는 최대 세션 시간이 있습니다. 기본적으로 최대 세션 시간 제한 값은 40000ms의 기본tickTime(기본값은 2000)의 20배입니다. 더 높은 시간 초과가 필요한 경우maxSessionTimeoutZooKeeper 서버 구성 값을 변경합니다. STRIMZI_OPERATIONS_THREAD_POOL_SIZE- 선택 사항: 기본값은 10입니다. Cluster Operator가 실행하는 다양한 비동기 및 차단 작업에 사용되는 작업자 스레드 풀 크기입니다.
STRIMZI_OPERATOR_NAME- 선택 사항: 기본값은 Pod의 호스트 이름입니다. Operator 이름은 OpenShift 이벤트를 내보낼 때 AMQ Streams 인스턴스를 식별합니다.
STRIMZI_OPERATOR_NAMESPACECluster Operator가 실행 중인 네임스페이스의 이름입니다. 이 변수를 수동으로 구성하지 마십시오. Downward API를 사용합니다.
env: - name: STRIMZI_OPERATOR_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespaceSTRIMZI_OPERATOR_NAMESPACE_LABELS선택 사항: AMQ Streams Cluster Operator가 실행 중인 네임스페이스의 레이블입니다. 네임스페이스 레이블을 사용하여 네트워크 정책에서 네임스페이스 선택기를 구성합니다. 네트워크 정책을 사용하면 AMQ Streams 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선택 사항:
{COMPONENT_NAME}사용자 정의 리소스에서 생성한 모든 Pod에 적용할 하나 이상의 사용자 지정 레이블입니다. 사용자 정의 리소스가 생성되거나 다음에 조정될 때 Cluster Operator는 Pod에 레이블을 지정합니다.라벨은 다음 구성 요소에 적용할 수 있습니다.
-
KAFKA -
KAFKA_CONNECT -
KAFKA_CONNECT_BUILD -
ZOOKEEPER -
ENTITY_OPERATOR -
KAFKA_MIRROR_MAKER2 -
KAFKA_MIRROR_MAKER -
CRUISE_CONTROL -
KAFKA_BRIDGE -
KAFKA_EXPORTER
-
STRIMZI_CUSTOM_RESOURCE_SELECTOR선택 사항: Cluster Operator에서 처리하는 사용자 정의 리소스를 필터링하는 라벨 선택기입니다. Operator는 라벨이 지정된 라벨이 설정된 사용자 정의 리소스에서만 작동합니다. 이러한 레이블이 없는 리소스는 Operator에서 표시되지 않습니다. 라벨 선택기는 Kafka ,
,KafkaConnectKafkaBridge,KafkaMirrorMaker,KafkaMirrorMaker2리소스에 적용됩니다.KafkaRebalance및KafkaConnector리소스는 해당 Kafka 및 Kafka Connect 클러스터에 일치하는 라벨이 있는 경우에만 작동합니다.env: - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR value: label1=value1,label2=value2STRIMZI_KAFKA_IMAGES-
필수 항목입니다. Kafka 버전에서 해당 버전의 Kafka 브로커가 포함된 해당 Docker 이미지로 매핑됩니다. 필요한 구문은 공백 또는 쉼표로 구분된 <
version> = <image>쌍입니다. 예:3.3.1=registry.redhat.io/amq-streams/kafka-33-rhel8:2.4.0, 3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0. 이는Kafka리소스의Kafka.spec.kafka.version속성이 지정되었지만 Kafka 리소스의Kafka.spec.kafka.image가 아닌 경우 사용됩니다. STRIMZI_DEFAULT_KAFKA_INIT_IMAGE-
Optional, default
registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.4.0.Kafka리소스에서kafka-init-image로 지정된 이미지가 없는 경우 init 컨테이너에 기본적으로 사용할 이미지 이름입니다. init 컨테이너는 랙 지원과 같은 초기 구성 작업을 위한 브로커보다 먼저 시작됩니다. STRIMZI_KAFKA_CONNECT_IMAGES-
필수 항목입니다. Kafka 버전에서 해당 버전에 대한 Kafka Connect의 해당 Docker 이미지로 매핑합니다. 필요한 구문은 공백 또는 쉼표로 구분된 <
version> = <image>쌍입니다. 예:3.3.1=registry.redhat.io/amq-streams/kafka-33-rhel8:2.4.0, 3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0. 이는KafkaConnect.spec.version속성이 지정되었지만KafkaConnect.spec.image가 아닌 경우 사용됩니다. STRIMZI_KAFKA_MIRROR_MAKER_IMAGES-
필수 항목입니다. Kafka 버전에서 해당 버전의 MirrorMaker에 대한 해당 Docker 이미지로 매핑합니다. 필요한 구문은 공백 또는 쉼표로 구분된 <
version> = <image>쌍입니다. 예:3.3.1=registry.redhat.io/amq-streams/kafka-33-rhel8:2.4.0, 3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0. 이는KafkaMirrorMaker.spec.version속성이 지정되었지만KafkaMirrorMaker.spec.image가 아닌 경우 사용됩니다. STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE-
Optional, default
registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.4.0.Kafka리소스에서Kafka.spec.entityOperator.topicOperator.image로 지정된 이미지가 없는 경우 Topic Operator를 배포할 때 사용할 이미지 이름입니다. STRIMZI_DEFAULT_USER_OPERATOR_IMAGE-
Optional, default
registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.4.0.Kafka리소스에서Kafka.spec.entityOperator.userOperator.image로 지정된 이미지가 없는 경우 User Operator를 배포할 때 사용할 이미지 이름입니다. STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE-
Optional, default
registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0.Kafka리소스에서Kafka.spec.entityOperator.tlsSidecar.image로 지정된 이미지가 없는 경우 Entity Operator에 대한 사이드카 컨테이너를 배포할 때 사용할 이미지 이름입니다. 사이드카는 TLS 지원을 제공합니다. STRIMZI_IMAGE_PULL_POLICY-
선택 사항: Cluster Operator가 관리하는 모든 Pod의 컨테이너에 적용되는
ImagePullPolicy입니다. 유효한 값은Always,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 도메인 이름이 있습니다.예를 들어, broker 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- 선택 사항: 기본 300000ms. 추가 커넥터를 사용하여 새 Kafka Connect 이미지를 빌드하는 시간(밀리초)입니다. AMQ Streams를 사용하여 많은 커넥터가 포함된 컨테이너 이미지를 빌드하거나 느린 컨테이너 레지스트리를 사용하는 경우 이 값을 늘리는 것이 좋습니다.
STRIMZI_NETWORK_POLICY_GENERATION선택 사항, 기본값
true. 리소스에 대한 네트워크 정책입니다. 네트워크 정책은 Kafka 구성 요소 간 연결을 허용합니다.네트워크 정책 생성을 비활성화하려면 이 환경 변수를
false로 설정합니다. 예를 들어 사용자 지정 네트워크 정책을 사용하려는 경우 이 작업을 수행할 수 있습니다. 사용자 지정 네트워크 정책을 사용하면 구성 요소 간 연결 유지 관리를 보다 효과적으로 제어할 수 있습니다.STRIMZI_DNS_CACHE_TTL-
선택 사항: 기본
30. 로컬 DNS 확인기에서 성공적인 이름 조회를 캐시하는 시간(초)입니다. 음수 값은 영구적으로 캐시를 의미합니다. 0은 캐시하지 않음을 의미합니다. 이는 긴 캐싱 정책이 적용되므로 연결 오류를 방지하는 데 유용할 수 있습니다. STRIMZI_POD_SET_RECONCILIATION_ONLY-
선택 사항, 기본
false.true로 설정하면 Cluster Operator는StrimziPodSet리소스 및 기타 사용자 정의 리소스(Kafka,KafkaConnect등)에 대한 변경 사항만 무시됩니다. 이 모드는 필요한 경우 Pod를 다시 생성하지만 클러스터에서 다른 변경 사항은 발생하지 않도록 하는 데 유용합니다. STRIMZI_FEATURE_GATES- 선택 사항: 기능 게이트 에 의해 제어되는 기능 및 기능을 활성화하거나 비활성화합니다.
STRIMZI_POD_SECURITY_PROVIDER_CLASS-
선택 사항: Pod 및 컨테이너에 대한 보안 컨텍스트 구성을 제공하는 데 사용할 수 있는 플러그형
PodSecurityProvider클래스에 대한 구성입니다.
13.2.3.1. 리더 선택 환경 변수 링크 복사링크가 클립보드에 복사되었습니다!
추가 Cluster Operator 복제본을 실행할 때 리더 선택 환경 변수를 사용합니다. 주요 오류로 인한 중단 방지를 방지하기 위해 추가 복제본을 실행할 수 있습니다.
STRIMZI_LEADER_ELECTION_ENABLED-
선택 사항, 비활성화됨(
false)은 기본적으로 사용됩니다. 리더 선택을 활성화하거나 비활성화하여 추가 Cluster Operator 복제본을 CloudEvent에서 실행할 수 있습니다.
리더 선택 기능은 기본적으로 비활성화되어 있습니다. 설치 시 이 환경 변수를 적용할 때만 활성화됩니다.
STRIMZI_LEADER_ELECTION_LEASE_NAME-
리더 선택을 할 때 필요합니다. 리더 선택에 사용되는 OpenShift
Lease리소스의 이름입니다. STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE리더 선택을 할 때 필요합니다. 리더 선택에 사용된 OpenShift
리스리소스가 생성되는 네임스페이스입니다. Downward API를 사용하여 Cluster Operator가 배포된 네임스페이스에 구성할 수 있습니다.env: - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.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- 선택 사항: 기본 15000ms. 인수된 임대 기간의 유효 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RENEW_DEADLINE_MS- 선택 사항: 기본 10000ms. 리더가 리더십을 유지하기 위해 시도해야 하는 기간을 지정합니다.
STRIMZI_LEADER_ELECTION_RETRY_PERIOD_MS- 선택 사항: 기본 2000ms. 리더에 의해 임대 잠금에 대한 업데이트 빈도를 지정합니다.
13.2.3.2. 네트워크 정책을 사용하여 Cluster Operator 액세스 제한 링크 복사링크가 클립보드에 복사되었습니다!
STRIMZI_OPERATOR_NAMESPACE_LABELS 환경 변수를 사용하여 네임스페이스 레이블을 사용하여 Cluster Operator의 네트워크 정책을 설정합니다.
Cluster Operator는 관리하는 리소스와 동일한 네임스페이스 또는 별도의 네임스페이스에서 실행할 수 있습니다. 기본적으로 STRIMZI_OPERATOR_NAMESPACE 환경 변수는 하향 API를 사용하여 Cluster Operator가 실행 중인 네임스페이스를 찾도록 구성됩니다. Cluster Operator가 리소스와 동일한 네임스페이스에서 실행 중인 경우 로컬 액세스만 필요하며 AMQ Streams에서 허용됩니다.
Cluster Operator가 관리하는 리소스에 대한 별도의 네임스페이스에서 실행 중인 경우 네트워크 정책을 구성하지 않는 한 OpenShift 클러스터의 모든 네임스페이스에 액세스할 수 있습니다. 네임스페이스 레이블을 추가하면 Cluster Operator에 대한 액세스가 지정된 네임스페이스로 제한됩니다.
Cluster Operator 배포에 구성된 네트워크 정책
#...
env:
# ...
- name: STRIMZI_OPERATOR_NAMESPACE_LABELS
value: label1=value1,label2=value2
#...
13.2.3.3. 정기적인 조정의 시간 간격 설정 링크 복사링크가 클립보드에 복사되었습니다!
STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 변수를 사용하여 정기적인 조정을 위한 시간 간격을 설정합니다.
Cluster Operator는 OpenShift 클러스터에서 수신한 적용 가능한 클러스터 리소스에 대한 모든 알림에 반응합니다. Operator가 실행되고 있지 않거나 어떠한 이유로 알림이 수신되지 않으면 리소스가 실행 중인 OpenShift 클러스터 상태와 동기화되지 않습니다. 장애 조치(failover)를 올바르게 처리하기 위해 Cluster Operator에서 정기적인 조정 프로세스를 실행하여 리소스 상태를 현재 클러스터 배포와 비교하여 모든 항목에 일관된 상태를 유지할 수 있습니다.
13.2.4. 기본 프록시 설정으로 Cluster Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
HTTP 프록시 뒤에서 Kafka 클러스터를 실행하는 경우 클러스터 내부 및 외부에서 데이터를 전달할 수 있습니다. 예를 들어 프록시 외부에서 데이터를 푸시하고 가져오는 커넥터를 사용하여 Kafka Connect를 실행할 수 있습니다. 또는 프록시를 사용하여 권한 부여 서버에 연결할 수 있습니다.
프록시 환경 변수를 지정하도록 Cluster Operator 배포를 구성합니다. Cluster Operator는 표준 프록시 구성(HTTP_PROXY,HTTPS_PROXY, NO_PROXY)을 환경 변수로 허용합니다. 프록시 설정은 모든 AMQ Streams 컨테이너에 적용됩니다.
프록시 주소 형식은 http://IP-ADDRESS:PORT-NUMBER 입니다. 이름 및 암호를 사용하여 프록시를 설정하려면 형식은 http://USERNAME:PASSWORD@IP-ADDRESS:PORT-NUMBER 입니다.
사전 요구 사항
-
CustomResourceDefinition및 RBAC(ClusterRole,RoleBinding) 리소스를 생성하고 관리하려면 권한이 있는 계정이 필요합니다.
절차
Cluster Operator에 프록시 환경 변수를 추가하려면
Deployment구성 (install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml)을 업데이트합니다.Cluster Operator의 프록시 구성 예
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "HTTP_PROXY" value: "http://proxy.com"1 - name: "HTTPS_PROXY" value: "https://proxy.com"2 - name: "NO_PROXY" value: "internal.com, other.domain.com"3 # ...또는 배포를 직접
편집합니다.oc edit deployment strimzi-cluster-operator배포를 직접 편집하는 대신 YAML 파일을 업데이트한
경우변경 사항을 적용합니다.oc create -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
13.2.5. 리더 선택을 사용하여 여러 Cluster Operator 복제본 실행 링크 복사링크가 클립보드에 복사되었습니다!
기본 Cluster Operator 구성을 사용하면 리더 선택을 수행할 수 있습니다. 리더 선택을 사용하여 Cluster Operator의 여러 병렬 복제본을 실행합니다. 하나의 복제본은 활성 리더로 선택되며 배포된 리소스를 운영합니다. 다른 복제본은 ReadWriteMany 모드에서 실행됩니다. 리더가 중지되거나 실패하면 새로운 리더로IR스 복제본 중 하나가 선택되고 배포된 리소스 운영을 시작합니다.
기본적으로 AMQ Streams는 항상 리더 복제본인 단일 Cluster Operator 복제본과 함께 실행됩니다. 단일 Cluster Operator 복제본이 중지되거나 실패하면 OpenShift에서 새 복제본을 시작합니다.
여러 복제본에서 Cluster Operator를 실행하는 것은 필수 사항은 아닙니다. 그러나 대규모 중단의 경우 복제본이 CloudEvent에 있는 것이 좋습니다. 예를 들어 여러 작업자 노드 또는 전체 가용성 영역이 실패했다고 가정합니다. 이로 인해 Cluster Operator Pod와 많은 Kafka Pod가 동시에 중단될 수 있습니다. 후속 Pod 예약으로 인해 리소스 부족이 발생하는 경우 단일 Cluster Operator를 실행할 때 작업이 지연될 수 있습니다.
13.2.5.1. Cluster Operator 복제본 구성 링크 복사링크가 클립보드에 복사되었습니다!
latency 모드에서 추가 Cluster Operator 복제본을 실행하려면 복제본 수를 늘리고 리더 선택을 활성화해야 합니다. 리더 선택을 구성하려면 리더 선택 환경 변수를 사용합니다.
필요한 변경을 수행하려면 install/cluster-operator/ 에 있는 다음 Cluster Operator 설치 파일을 구성합니다.
- 060-Deployment-strimzi-cluster-operator.yaml
- 022-ClusterRole-strimzi-cluster-operator-role.yaml
- 022-RoleBinding-strimzi-cluster-operator.yaml
리더 선택에는 모니터링 중인 네임스페이스 대신 Cluster Operator가 실행 중인 네임스페이스를 대상으로 하는 자체 ClusterRole 및 RoleBinding RBAC 리소스가 있습니다.
기본 배포 구성은 Cluster Operator와 동일한 네임스페이스에 strimzi-cluster-operator 라는 Lease 리소스를 생성합니다. Cluster Operator는 리스를 사용하여 리더 선택을 관리합니다. RBAC 리소스는 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사용 가능한 환경 변수에 대한 자세한 내용은 13.2.3.1절. “리더 선택 환경 변수” 을 참조하십시오.
리더 선택에 사용된
Lease리소스에 대해 다른 이름 또는 네임스페이스를 지정한 경우 RBAC 리소스를 업데이트합니다.(선택 사항)
022-ClusterRole-strimzi-cluster-operator-role.yaml파일에서ClusterRole리소스를 편집합니다.resourceNames를Lease리소스 이름으로 업데이트합니다.임대에 대한 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리소스를 편집합니다.Lease리소스의 이름과 생성된 네임스페이스로subjects.name및subjects.namespace를 업데이트합니다.임대에 대한 RoleBinding 참조 업데이트
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi subjects: - kind: ServiceAccount name: my-strimzi-cluster-operator namespace: myproject # ...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에는 준비되거나 예상된 복제본 수가 표시됩니다.AVAILABLE출력에 올바른 복제본 수가 표시되면 배포가 성공한 것입니다.
13.2.6. FIPS 지원 링크 복사링크가 클립보드에 복사되었습니다!
연방 정보 처리 표준(FIPS)은 컴퓨터 보안 및 상호 운용성을 위한 표준입니다. FIPS 지원 OpenShift 클러스터에서 AMQ Streams를 실행하는 경우 AMQ Streams 컨테이너 이미지에 사용된 OpenJDK가 FIPS 모드로 자동 전환됩니다. 버전 2.4에서 AMQ Streams는 FIPS 지원 OpenShift 클러스터에서 변경 또는 특별한 구성없이 실행할 수 있습니다. OpenJDK의 FIPS 호환 보안 라이브러리만 사용합니다.
최소 암호 길이
FIPS 모드에서 실행되는 경우 SCRAM-SHA-512 암호는 32자 이상이어야 합니다. AMQ Streams 2.4에서 AMQ Streams User Operator의 기본 암호 길이도 32자로 설정됩니다. 32자 미만의 암호 길이를 사용하는 사용자 지정 구성이 있는 Kafka 클러스터가 있는 경우 구성을 업데이트해야 합니다. 32자 미만의 암호가 있는 사용자가 있는 경우 필요한 길이로 암호를 다시 생성해야 합니다. 예를 들어 사용자 시크릿을 삭제하고 User Operator가 적절한 길이로 새 암호를 생성할 때까지 대기하여 이를 수행할 수 있습니다.
FIPS 지원 OpenShift 클러스터를 사용하는 경우 일반 OpenShift 클러스터에 비해 메모리 사용량이 증가할 수 있습니다. 문제를 방지하기 위해 최소 512Mi에 대한 메모리 요청을 늘리는 것이 좋습니다.
13.2.6.1. FIPS 모드 비활성화 링크 복사링크가 클립보드에 복사되었습니다!
FIPS 지원 OpenShift 클러스터에서 실행할 때 AMQ Streams가 FIPS 모드로 자동 전환합니다. Cluster Operator의 배포 구성에서 FIPS_MODE 환경 변수를 비활성화 하도록 설정하여 FIPS 모드를 비활성화합니다. FIPS 모드가 비활성화되면 AMQ Streams는 모든 구성 요소에 대해 OpenJDK에서 FIPS를 자동으로 비활성화합니다. FIPS 모드가 비활성화된 경우 AMQ Streams는 FIPS와 호환되지 않습니다. AMQ Streams Operator 및 모든 피연산자는 FIPS가 활성화되지 않은 OpenShift 클러스터에서 실행되는 경우와 동일한 방식으로 실행됩니다.
절차
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
13.3. Topic Operator 사용 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스를 사용하여 항목을 생성, 수정 또는 삭제할 때 Topic Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.
KafkaTopic 리소스에 대한 자세한 내용은 KafkaTopic 스키마 참조 를 참조하십시오.
Topic Operator 배포
Cluster Operator 또는 독립 실행형 Operator로 Topic Operator를 배포할 수 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 Topic Operator를 사용합니다.
배포 지침은 다음을 참조하십시오.
독립 실행형 Topic Operator를 배포하려면 Kafka 클러스터에 연결할 환경 변수를 설정해야 합니다. Cluster Operator가 설정한 대로 Cluster Operator를 사용하여 Topic Operator를 배포하는 경우 이러한 환경 변수를 설정할 필요가 없습니다.
13.3.1. Kafka 주제 리소스 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스는 파티션 및 복제본 수를 포함한 주제를 구성하는 데 사용됩니다.
KafkaTopic 의 전체 스키마는 KafkaTopic 스키마 참조에 설명되어 있습니다.
13.3.1.1. 주제 처리를 위한 Kafka 클러스터 식별 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스에는 해당 리소스가 속한 Kafka 클러스터 이름에서 파생된 Kafka 클러스터의 이름을 지정하는 레이블이 포함되어 있습니다.
예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: topic-name-1
labels:
strimzi.io/cluster: my-cluster
레이블은 Topic Operator에서 KafkaTopic 리소스를 식별하고 새 주제를 생성하고 주제의 후속 처리에 사용됩니다.
레이블이 Kafka 클러스터와 일치하지 않으면 Topic Operator에서 KafkaTopic 을 식별할 수 없으며 항목이 생성되지 않습니다.
13.3.1.2. Kafka 주제 사용 권장 사항 링크 복사링크가 클립보드에 복사되었습니다!
주제로 작업할 때 일관성이 유지되어야 합니다. 항상 OpenShift에서 KafkaTopic 리소스 또는 주제에서 직접 작동합니다. 지정된 항목에 대해 두 방법 간에 정기적으로 전환하지 않도록 합니다.
주제의 특성을 반영하는 주제 이름을 사용하고 나중에 이름을 변경할 수 없다는 점에 유의하십시오.
Kafka에서 주제를 생성하는 경우 유효한 OpenShift 리소스 이름인 이름을 사용합니다. 그렇지 않으면 Topic Operator는 OpenShift 규칙을 준수하는 이름으로 해당 KafkaTopic 을 생성해야 합니다.
OpenShift의 식별자 및 이름에 대한 요구 사항에 대한 자세한 내용은 오브젝트 이름 및 ID 를 참조하십시오.
13.3.1.3. Kafka 주제 이름 지정 규칙 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 및 OpenShift는 Kafka 및 KafkaTopic.metadata.name 의 주제 이름 지정에 대해 자체 검증 규칙을 적용합니다. 서로 유효하지 않은 이름 각각에 대해 유효한 이름이 있습니다.
spec.topicName 속성을 사용하면 OpenShift의 Kafka 항목에 유효하지 않은 이름으로 Kafka에서 유효한 항목을 생성할 수 있습니다.
spec.topicName 속성은 Kafka 이름 지정 검증 규칙을 상속합니다.
- 이름은 249자를 초과해서는 안 됩니다.
-
Kafka 주제의 유효한 문자는 ASCII 영숫자, .
.,_, 및-입니다. -
이름은
.또는....의 이름은 사용할 수 없습니다.하지만 이름이 exampleTopic. 또는과 같은 이름으로 사용할 수 있습니다..exampleTopic
spec.topicName 은 변경되지 않아야 합니다.
예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: topic-name-1
spec:
topicName: topicName-1
# ...
- 1
- OpenShift에서 대문자가 잘못되었습니다.
다음으로 변경할 수 없음:
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: topic-name-1
spec:
topicName: name-2
# ...
Kafka Streams와 같은 일부 Kafka 클라이언트 애플리케이션은 Kafka에서 프로그래밍 방식으로 항목을 생성할 수 있습니다. 이러한 항목에 유효하지 않은 OpenShift 리소스 이름이 있는 경우 Topic Operator는 Kafka 이름을 기반으로 유효한 metadata.name 을 제공합니다. 유효하지 않은 문자가 교체되고 이름에 해시가 추가됩니다. 예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: mytopic---c55e57fe2546a33f9e603caf57165db4072e827e
spec:
topicName: myTopic
# ...
13.3.2. 주제 Operator 주제 저장소 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator는 Kafka를 사용하여 주제 구성을 키-값 쌍으로 설명하는 주제 메타데이터를 저장합니다. 주제 저장소는 Kafka 주제를 사용하여 상태를 유지하는 Kafka Streams 키-값 메커니즘을 기반으로 합니다.
주제 메타데이터는 메모리 내 캐시되며 Topic Operator 내에서 로컬로 액세스합니다. 로컬 메모리 내 캐시에 적용되는 작업에서의 업데이트는 디스크의 백업 주제 저장소에 유지됩니다. 주제 저장소는 Kafka 주제 또는 OpenShift KafkaTopic 사용자 정의 리소스의 업데이트와 지속적으로 동기화됩니다. 이러한 방식으로 설정된 주제 저장소를 사용하여 작업이 신속하게 처리되지만 메모리 내 캐시 충돌은 영구 스토리지에서 자동으로 다시 채워집니다.
13.3.2.1. 내부 주제 저장소 주제 링크 복사링크가 클립보드에 복사되었습니다!
내부 주제에서는 주제 저장소의 주제 메타데이터 처리를 지원합니다.
__strimzi_store_topic- 주제 메타데이터를 저장하기 위한 입력 주제
__strimzi-topic-operator-kstreams-topic-store-changelog- 컴팩트한 주제 저장소 값의 로그 유지
주제 Operator를 실행하는 데 필수 항목이므로 이러한 주제를 삭제하지 마십시오.
13.3.2.2. ZooKeeper에서 주제 메타데이터 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams의 이전 릴리스에서는 주제 메타데이터가 ZooKeeper에 저장되었습니다. 새 프로세스에서는 이 요구 사항을 제거하여 Kafka 클러스터에 메타데이터를 가져오고 Topic Operator를 제어할 수 있습니다.
AMQ Streams 2.4로 업그레이드할 때 주제 저장소의 Topic Operator 제어로의 전환이 원활합니다. 메타데이터가 찾아 ZooKeeper에서 마이그레이션되며 이전 저장소는 삭제됩니다.
13.3.2.3. ZooKeeper를 사용하여 주제 메타데이터를 저장하는 AMQ Streams 버전으로 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
주제 메타데이터의 스토리지에 ZooKeeper를 사용하는 1.7 이전의 AMQ Streams 버전으로 되돌리는 경우 여전히 Cluster Operator를 이전 버전으로 다운그레이드한 다음 Kafka 브로커 및 클라이언트 애플리케이션을 이전 Kafka 버전으로 다운그레이드합니다.
그러나 Kafka 클러스터의 부트스트랩 주소를 지정하여 kafka-admin 명령을 사용하여 주제 저장소에 생성된 주제도 삭제해야 합니다. 예를 들면 다음과 같습니다.
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
명령은 Kafka 클러스터에 액세스하는 데 사용되는 리스너 및 인증 유형에 대응해야 합니다.
Topic Operator는 Kafka의 주제 상태에서 ZooKeeper 주제 메타데이터를 재구성합니다.
13.3.2.4. Operator 주제 복제 및 스케일링 주제 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator에서 관리하는 항목에 대해 권장되는 구성은 3 항목 복제 요소와 최소 2 개의 동기화 복제본입니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 10
replicas: 3
config:
min.insync.replicas: 2
#...
동기화 복제본은 생산자 애플리케이션의 acks 구성과 함께 사용됩니다. acks 구성은 메시지를 성공적으로 수신한 것으로 승인되기 전에 메시지를 복제해야 하는 후속 파티션의 수를 결정합니다. Topic Operator는 acks=all 로 실행되며, 여기서 모든 동기화 복제본에서 메시지를 확인해야 합니다.
브로커를 추가하거나 제거하여 Kafka 클러스터를 스케일링할 때 복제 요소 구성이 변경되지 않고 복제본이 자동으로 다시 할당되지 않습니다. 그러나 kafka-reassign-partitions.sh 도구를 사용하여 복제 요소를 변경하고 복제본을 브로커에 수동으로 다시 할당할 수 있습니다.
대안으로 Cruise Control for AMQ Streams의 통합은 주제의 복제 요소를 변경할 수는 없지만 Kafka를 재조정하기 위해 생성하는 최적화 제안에는 파티션 복제를 전송하고 파티션 리더십을 변경하는 명령이 포함됩니다.
13.3.2.5. 주제의 변경 사항 처리 링크 복사링크가 클립보드에 복사되었습니다!
Topic Operator가 해결해야 하는 근본적인 문제는 단일 정보 소스가 없다는 것입니다. KafkaTopic 리소스와 Kafka 주제 모두 Topic Operator와 독립적으로 수정할 수 있다는 것입니다. 이로 인해 Topic Operator가 각 끝에서 변경 사항을 실시간으로 관찰하지 못할 수 있습니다. 예를 들어 Topic Operator가 다운된 경우입니다.
이를 해결하기 위해 Topic Operator는 주제 저장소의 각 항목에 대한 정보를 유지합니다. Kafka 클러스터 또는 OpenShift에서 변경이 발생하면 다른 시스템 및 주제 저장소의 상태를 확인하여 모든 항목을 동기화 상태로 유지하기 위해 변경해야 하는 사항을 확인합니다. Topic Operator가 시작될 때마다 그리고 실행되는 동안 주기적으로 동일한 문제가 발생합니다.
예를 들어 Topic Operator가 실행되고 있지 않고 my-topic 라는 KafkaTopic 이 생성되었다고 가정합니다. 주제 Operator가 시작되면 주제 저장소에 my-topic에 대한 정보가 포함되어 있지 않으므로 마지막 실행 후 KafkaTopic 이 생성되었음을 추측할 수 있습니다. 주제 Operator는 my-topic에 해당하는 항목을 생성하고 주제 저장소에 my-topic의 메타데이터도 저장합니다.
Kafka 주제 구성을 업데이트하거나 KafkaTopic 사용자 정의 리소스를 통해 변경 사항을 적용하면 Kafka 클러스터 조정 후 주제 저장소가 업데이트됩니다.
또한 주제 저장소는 Topic Operator에서 주제 구성이 Kafka 주제에서 변경되고 변경 사항이 호환되지 않는 한 OpenShift KafkaTopic 사용자 정의 리소스를 통해 업데이트되는 시나리오를 관리할 수 있습니다. 예를 들어 동일한 주제 구성 키를 변경할 수 있지만 다른 값으로 변경할 수 있습니다. 호환되지 않는 변경의 경우 Kafka 구성이 우선하며 KafkaTopic 이 적절하게 업데이트됩니다.
또한 KafkaTopic 리소스를 사용하여 oc delete -f KAFKA-TOPIC-CONFIG-FILE 명령을 사용하여 항목을 삭제할 수도 있습니다. 이 작업을 수행하려면 Kafka 리소스의 spec.kafka.config 에서 delete.topic.enable 을 true (기본값)로 설정해야 합니다.
13.3.3. Kafka 주제 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaTopic 리소스의 속성을 사용하여 Kafka 주제를 구성합니다.
oc apply 를 사용하여 주제를 만들거나 수정하고 oc delete 를 사용하여 기존 주제를 삭제할 수 있습니다.
예를 들면 다음과 같습니다.
-
oc apply -f <topic_config_file> -
oc delete KafkaTopic <topic_name>
다음 절차에서는 10개의 파티션과 2개의 복제본으로 주제를 생성하는 방법을 설명합니다.
시작하기 전에
변경하기 전에 다음을 고려하는 것이 중요합니다.
- Kafka는 파티션 수 감소를 지원하지 않습니다.
-
키가 있는 항목에 대해
spec.partitions를 늘리면 레코드 분할 방법이 변경되며, 주제에서 의미 있는 파티셔닝 을 사용할 때 특히 문제가 될 수 있습니다. AMQ Streams는
KafkaTopic리소스를 통해 다음과 같은 변경을 지원하지 않습니다.-
spec.replicas를 사용하여 처음에 지정된 복제본 수 변경 -
spec.topicName을 사용하여 주제 이름 변경
-
사전 요구 사항
- mTLS 인증 및 TLS 암호화를 사용하는 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
- 실행 중인 Topic Operator(일반적으로 Entity Operator를 사용하여 배포)
-
Kafka리소스의spec.kafka.config에 있는delete.topic.enable=true(default)를 삭제합니다.
절차
KafkaTopic리소스를 구성합니다.Kafka 주제 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: orders labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2작은 정보주제를 수정할 때
oc get kafkatopic orders -o yaml을 사용하여 현재 리소스 버전을 가져올 수 있습니다.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
13.3.4. 리소스 요청 및 제한을 사용하여 Topic Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
CPU 및 메모리와 같은 리소스를 Topic Operator에 할당하고 사용할 수 있는 리소스 양을 제한할 수 있습니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
절차
필요에 따라 편집기에서 Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka MY-CLUSTERKafka리소스의spec.entityOperator.topicOperator.resources속성에서 Topic Operator에 대한 리소스 요청 및 제한을 설정합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # Kafka and ZooKeeper sections... entityOperator: topicOperator: resources: requests: cpu: "1" memory: 500Mi limits: cpu: "1" memory: 500Mi새 구성을 적용하여 리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>
13.4. User Operator 사용 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스를 사용하여 사용자를 생성, 수정 또는 삭제할 때 User Operator는 이러한 변경 사항이 Kafka 클러스터에 반영되도록 합니다.
KafkaUser 리소스에 대한 자세한 내용은 KafkaUser 스키마 참조 를 참조하십시오.
User Operator 배포
Cluster Operator 또는 독립 실행형 Operator로 User Operator를 배포할 수 있습니다. Cluster Operator에서 관리하지 않는 Kafka 클러스터에서 독립 실행형 User Operator를 사용합니다.
배포 지침은 다음을 참조하십시오.
독립 실행형 User Operator를 배포하려면 Kafka 클러스터에 연결할 환경 변수를 설정해야 합니다. Cluster Operator가 설정한 대로 Cluster Operator를 사용하여 User Operator를 배포하는 경우 이러한 환경 변수를 설정할 필요가 없습니다.
13.4.1. Kafka 사용자 구성 링크 복사링크가 클립보드에 복사되었습니다!
KafkaUser 리소스의 속성을 사용하여 Kafka 사용자를 구성합니다.
oc apply 를 사용하여 사용자를 생성하거나 수정하고 oc delete 를 사용하여 기존 사용자를 삭제할 수 있습니다.
예를 들면 다음과 같습니다.
-
oc apply -f <user_config_file> -
oc delete KafkaUser <user_name>
사용자는 Kafka 클라이언트를 나타냅니다. Kafka 사용자를 구성할 때 클라이언트가 Kafka에 액세스하기 위해 필요한 사용자 인증 및 권한 부여 메커니즘을 활성화합니다. 사용된 메커니즘은 동등한 Kafka 구성과 일치해야 합니다. Kafka 및 KafkaUser 리소스를 사용하여 Kafka 브로커에 대한 액세스를 보호하는 방법에 대한 자세한 내용은 Kafka 브로커에 대한 액세스 보안을 참조하십시오.
사전 요구 사항
- mTLS 인증 및 TLS 암호화를 사용하는 Kafka 브로커 리스너로 구성된 실행 중인 Kafka 클러스터입니다.
- 실행 중인 User Operator(일반적으로 Entity Operator를 사용하여 배포)
절차
KafkaUser리소스를 구성합니다.이 예제에서는 ACL을 사용하여 mTLS 인증 및 간단한 인증을 지정합니다.
Kafka 사용자 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: # Example consumer Acls for topic my-topic using consumer group my-group - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read host: "*" - resource: type: group name: my-group patternType: literal operations: - Read host: "*" # Example Producer Acls for topic my-topic - resource: type: topic name: my-topic patternType: literal operations: - Create - Describe - Write host: "*"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
13.4.2. 리소스 요청 및 제한을 사용하여 User Operator 구성 링크 복사링크가 클립보드에 복사되었습니다!
CPU 및 메모리와 같은 리소스를 User Operator에 할당하고 사용할 수 있는 리소스 양을 제한할 수 있습니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
절차
필요에 따라 편집기에서 Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka MY-CLUSTERKafka리소스의spec.entityOperator.userOperator.resources속성에서 User Operator에 대한 리소스 요청 및 제한을 설정합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # Kafka and ZooKeeper sections... entityOperator: userOperator: resources: requests: cpu: "1" memory: 500Mi limits: cpu: "1" memory: 500Mi파일을 저장하고 편집기를 종료합니다. Cluster Operator는 변경 사항을 자동으로 적용합니다.
13.5. 기능 게이트 구성 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams Operator는 기능 게이트 를 지원하여 특정 기능 및 기능을 활성화하거나 비활성화합니다. 기능 게이트를 활성화하면 관련 Operator의 동작이 변경되고 AMQ Streams 배포에 기능이 도입됩니다.
Feature gate에는 enabled 또는 disabled 의 기본 상태가 있습니다.
기능 게이트의 기본 상태를 수정하려면 Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 사용합니다. 이 단일 환경 변수를 사용하여 여러 기능 게이트를 수정할 수 있습니다. 쉼표로 구분된 기능 게이트 이름 및 접두사 목록을 지정합니다. + 접두사를 사용하면 기능 게이트가 활성화되고 접두사는 이를 비활성화합니다.
FeatureGate1 을 활성화하고 FeatureGate2를 비활성화하는 기능 게이트 구성의 예
env:
- name: STRIMZI_FEATURE_GATES
value: +FeatureGate1,-FeatureGate2
13.5.1. ControlPlaneListener 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
ControlPlaneListener 기능 게이트가 GA로 이동했습니다. 즉, 이제 영구적으로 활성화되며 비활성화할 수 없습니다. ControlPlaneListener 를 활성화하면 Kafka 컨트롤러와 브로커 간 연결은 포트 9090에서 내부 컨트롤 플레인 리스너 를 사용합니다. 브로커 간 데이터 복제는 AMQ Streams Operator, Cruise Control 또는 Kafka Exporter의 내부 연결과 포트 9091에서 복제 리스너 를 사용합니다.
ControlPlaneListener 기능 게이트가 영구적으로 활성화되면 AMQ Streams 1.7 및 이전 버전과 AMQ Streams 2.3 이상 간에 더 이상 직접 업그레이드하거나 다운그레이드할 수 없습니다. 먼저 AMQ Streams 버전 중 하나를 통해 먼저 업그레이드하거나 다운그레이드하고, ControlPlaneListener 기능 게이트를 비활성화한 다음 (기능 게이트가 활성화된 상태에서) 대상 버전으로 다운그레이드하거나 업그레이드해야 합니다.
13.5.2. ServiceAccountPatching 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
ServiceAccountPatching 기능 게이트는 GA로 이동했으며 이는 이제 영구적으로 활성화되고 비활성화될 수 없음을 의미합니다. ServiceAccountPatching 을 활성화하면 Cluster Operator는 항상 서비스 계정을 조정하고 필요한 경우 업데이트합니다. 예를 들어 사용자 정의 리소스의 template 속성을 사용하여 서비스 계정 레이블 또는 주석을 변경하면 Operator는 기존 서비스 계정 리소스에서 자동으로 업데이트합니다.
13.5.3. UseStrimziPodSets 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
UseStrimziPodSets 기능 게이트에는 기본 상태가 enabled 입니다.
UseStrimziPodSets 기능 게이트는 StrimziPodSet 이라는 Pod를 관리하기 위한 리소스를 도입합니다. 기능 게이트를 사용하면 이 리소스가 StatefulSets 대신 사용됩니다. AMQ Streams는 OpenShift 대신 포드 생성 및 관리를 처리합니다. StatefulSets 대신 StrimziPodSets를 사용하면 기능을 더 많이 제어할 수 있습니다.
이 기능 게이트가 비활성화되면 AMQ Streams는 StatefulSets를 사용하여 ZooKeeper 및 Kafka 클러스터에 대한 Pod를 생성하고 관리합니다. AMQ Streams는 StatefulSet을 생성하고 OpenShift는 StatefulSet 정의에 따라 Pod를 생성합니다. 포드가 삭제되면 OpenShift에서 다시 생성합니다. StatefulSets를 사용하려면 다음과 같은 제한 사항이 있습니다.
- Pod는 항상 인덱스 번호에 따라 생성 또는 제거
- StatefulSet의 모든 Pod에는 유사한 구성이 필요합니다.
- StatefulSet에서 Pod의 스토리지 구성 변경은 복잡함
UseStrimziPodSets 기능 게이트 비활성화
UseStrimziPodSets 기능 게이트를 비활성화하려면 Cluster Operator 구성의 STRIMZI_FEATURE_GATES 환경 변수에서 -UseStrimziPodSets 를 지정합니다.
AMQ Streams 2.0 및 이전 버전으로 다운그레이드할 때 UseStrimziPodSets 기능 게이트를 비활성화해야 합니다.
13.5.4. (Preview) UseKRaft 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
UseKRaft 기능 게이트는 기본 비활성 상태가 있습니다.
UseKRaft 기능 게이트는 ZooKeeper 없이 KRaft(Kafka Raft 메타데이터) 모드에서 Kafka 클러스터를 배포합니다. 이 기능 게이트는 현재 개발 및 테스트용으로만 사용됩니다.
KRaft 모드는 Apache Kafka 또는 AMQ Streams의 프로덕션에 적합하지 않습니다.
UseKRaft 기능 게이트가 활성화되면 Kafka 클러스터는 ZooKeeper 없이 배포됩니다. Kafka 사용자 지정 리소스의 .spec.zookeeper 속성은 무시되지만 여전히 존재해야합니다. UseKRaft 기능 게이트는 Kafka 클러스터 노드 및 해당 역할을 구성하는 API를 제공합니다. API는 아직 개발 중이며 KRaft 모드가 production-ready가 되기 전에 변경될 것으로 예상됩니다.
현재 AMQ Streams의 KRaft 모드에는 다음과 같은 주요 제한 사항이 있습니다.
- ZooKeeper가 있는 Kafka 클러스터에서 KRaft 클러스터로 이동하거나 다른 방법으로는 지원되지 않습니다.
- Apache Kafka 버전 또는 AMQ Streams Operator의 업그레이드 및 다운그레이드는 지원되지 않습니다. 사용자가 클러스터를 삭제하고, Operator를 업그레이드하고 새 Kafka 클러스터를 배포해야 할 수 있습니다.
-
Topic Operator는 지원되지 않습니다.
spec.entityOperator.topicOperator속성은Kafka사용자 정의 리소스에서 제거해야 합니다. - SCRAM-SHA-512 인증은 지원되지 않습니다.
-
JBOD 스토리지는 지원되지 않습니다.
type: jbod스토리지를 사용할 수 있지만 JBOD 어레이는 하나의 디스크만 포함할 수 있습니다. -
모든 Kafka 노드에는
컨트롤러및브로커KRaft 역할이 모두 있습니다. 별도의컨트롤러및브로커노드가 있는 Kafka 클러스터는 지원되지 않습니다.
UseKRaft 기능 게이트 활성화
UseKRaft 기능 게이트를 활성화하려면 Cluster Operator 구성의 STRIMZI_FEATURE_GATES 환경 변수에 +UseKRaft 를 지정합니다.
UseKRaft 기능 게이트는 UseStrimziPodSets 기능 게이트에 따라 다릅니다. UseKRaft 기능 게이트를 활성화할 때 UseStrimziPodSets 기능 게이트도 활성화되어 있는지 확인합니다.
13.5.5. (Preview) StableConnectIdentities 기능 게이트 링크 복사링크가 클립보드에 복사되었습니다!
StableConnectIdentities 기능 게이트는 비활성화됨의 기본 상태가 있습니다.
StableConnectIdentities 기능 게이트는 StrimziPodSet 리소스를 사용하여 OpenShift Deployment 리소스를 사용하는 대신 Kafka Connect 및 Kafka MirrorMaker 2 Pod를 관리합니다. StrimziPodSets 는 Pod에 안정적인 이름과 안정적인 주소를 제공하며 롤링 업그레이드 중에 변경되지 않습니다. 이를 통해 커넥터 작업 재조정 횟수를 최소화하는 데 도움이 됩니다.
StableConnectIdentities 기능 게이트 활성화
StableConnectIdentities 기능 게이트를 활성화하려면 Cluster Operator 구성의 STRIMZI_FEATURE_GATES 환경 변수에 +StableConnectIdentities 를 지정합니다.
AMQ Streams 2.3 및 이전 버전으로 다운그레이드할 때 StableConnectIdentities 기능 게이트를 비활성화해야 합니다.
13.5.6. 기능 게이트 릴리스 링크 복사링크가 클립보드에 복사되었습니다!
기능 게이트는 완성의 세 단계가 있습니다.
- alpha - 일반적으로 비활성화됨
- beta - 일반적으로 기본적으로 활성화됨
- GA(General Availability) - 일반적으로 항상 사용 가능
알파 단계 기능은 실험적 또는 불안정하거나 변경되거나 프로덕션 사용을 위해 충분히 테스트되지 않을 수 있습니다. 베타 단계 기능은 잘 테스트되었으며 해당 기능은 변경되지 않습니다. GA 단계 기능은 안정적이고 향후 변경해서는 안 됩니다. 알파 단계 및 베타 단계 기능은 유용하지 않은 경우 제거됩니다.
-
ControlPlaneListener기능 게이트는 AMQ Streams 2.3에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다. -
ServiceAccountPatching기능 게이트는 AMQ Streams 2.3에서 GA 단계로 이동했습니다. 이제 영구적으로 활성화되며 비활성화할 수 없습니다. -
UseStrimziPodSets기능 게이트는 AMQ Streams 2.3에서 베타 단계로 이동했습니다. StatefulSets에 대한 지원이 완전히 제거될 때 AMQ Streams의 향후 릴리스에서 GA로 이동합니다. -
UseKRaft기능 게이트는 개발 용도로만 사용할 수 있으며 현재 베타 단계로 이동할 계획이 없습니다. -
StableConnectIdentities기능 게이트는 알파 단계에 있으며 기본적으로 비활성화되어 있습니다.
기능 게이트는 GA에 도달하면 제거될 수 있습니다. 즉, 기능이 AMQ Streams 핵심 기능에 통합되었으며 더 이상 비활성화할 수 없습니다.
| 기능 게이트 | alpha | 베타 | GA |
|---|---|---|---|
|
| 1.8 | 2.0 | 2.3 |
|
| 1.8 | 2.0 | 2.3 |
|
| 2.1 | 2.3 | 향후 릴리스(예: 계획) |
|
| 2.2 | - | - |
|
| 2.4 | 향후 릴리스(예: 계획) | - |
기능 게이트가 활성화된 경우 특정 AMQ Streams 버전에서 업그레이드 또는 다운그레이드하기 전에 이를 비활성화해야 할 수 있습니다. 다음 표는 AMQ Streams 버전을 업그레이드하거나 다운그레이드할 때 비활성화해야 하는 기능 게이트를 보여줍니다.
| Feature gate 비활성화 | AMQ Streams 버전에서 업그레이드 | AMQ Streams 버전으로 다운그레이드 |
|---|---|---|
|
| 1.7 이상 | 1.7 이상 |
|
| - | 2.0 이상 |
|
| - | 2.3 이전 버전 |
13.6. Prometheus 지표를 사용하여 Operator 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams Operator는 Prometheus 지표를 노출합니다. 메트릭은 자동으로 활성화되며 다음에 대한 정보를 포함합니다.
- 조정 수
- Operator가 처리하는 Custom Resources 수
- 조정 기간
- Operator의 JVM 지표
또한 AMQ Streams는 Operator 에 대한 예제 Grafana 대시보드를 제공합니다.
14장. AMQ Streams에 대한 메트릭 및 대시보드 설정 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus 및 Grafana를 사용하여 AMQ Streams 배포를 모니터링할 수 있습니다.
대시보드의 주요 메트릭을 보고 특정 조건에서 트리거되는 경고를 설정하여 AMQ Streams 배포를 모니터링할 수 있습니다. 메트릭은 AMQ Streams의 각 구성 요소에서 사용할 수 있습니다.
oauth 인증 및 opa 또는 keycloak 권한 부여와 관련된 메트릭을 수집할 수도 있습니다. Kafka 리소스의 리스너 구성에서 enableMetrics 속성을 true 로 설정하여 이 작업을 수행합니다. 예를 들어 spec.kafka.listeners.authentication 및 spec.kafka.authorization 에서 enableMetrics 를 true 로 설정합니다. 마찬가지로 KafkaBridge,KafkaConnect, KafkaMirrorMaker , 사용자 정의 리소스에서 KafkaMirrorMaker 2oauth 인증에 대한 지표를 활성화할 수 있습니다.
지표 정보를 제공하기 위해 AMQ Streams는 Prometheus 규칙 및 Grafana 대시보드를 사용합니다.
AMQ Streams의 각 구성 요소에 대한 규칙 세트로 구성된 경우 Prometheus는 클러스터에서 실행 중인 Pod의 주요 메트릭을 사용합니다. 그런 다음 Grafana는 대시보드에서 해당 지표를 시각화합니다. AMQ Streams에는 배포에 맞게 사용자 지정할 수 있는 Grafana 대시보드 예제가 포함되어 있습니다.
AMQ Streams는 사용자 정의 프로젝트(OpenShift 기능) 모니터링을 사용하여 Prometheus 설정 프로세스를 단순화합니다.
요구 사항에 따라 다음을 수행할 수 있습니다.
Prometheus 및 Grafana가 설정된 경우 모니터링을 위해 AMQ Streams에서 제공하는 Grafana 대시보드 예제를 사용할 수 있습니다.
또한 분산 추적을 설정하여 메시지를 엔드투엔드로 추적하도록 배포를 구성할 수 있습니다.
AMQ Streams는 Prometheus 및 Grafana의 설치 파일 예를 제공합니다. AMQ Streams 모니터링을 시도할 때 이러한 파일을 시작점으로 사용할 수 있습니다. 추가 지원을 받으려면 Prometheus 및 Grafana 개발자 커뮤니티에 참여해 보십시오.
메트릭 및 모니터링 툴에 대한 지원 문서
메트릭 및 모니터링 툴에 대한 자세한 내용은 지원 문서를 참조하십시오.
- Prometheus
- Prometheus 구성
- Kafka Exporter
- Grafana Labs
- Apache Kafka 모니터링은 Apache Kafka 에서 노출하는 CloudEvent 메트릭에 대해 설명합니다.
- zookeeperer에서 Apache ZooKeeper 에 의해 노출되는 CloudEvent 메트릭에 대해 설명합니다.
14.1. Kafka 내보내기로 소비자 지연 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 내보내기 는 Apache Kafka 브로커 및 클라이언트의 모니터링을 개선하는 오픈 소스 프로젝트입니다. Kafka 클러스터와 함께 Kafka 내보내기를 배포하도록 Kafka 리소스를 구성할 수 있습니다. Kafka Exporter는 오프셋, 소비자 그룹, 소비자 지연 및 주제와 관련된 Kafka 브로커에서 추가 지표 데이터를 추출합니다. 예를 들어 지표 데이터가 느린 소비자를 식별하는 데 사용됩니다. 지연 데이터는 Prometheus 지표로 노출되며 분석을 위해 Grafana에 표시될 수 있습니다.
Kafka Exporter는 소비자 그룹에 대해 커밋된 오프셋에 대한 정보를 저장하는 __consumer_offsets 주제에서 읽습니다. Kafka 내보내기가 제대로 작동하려면 소비자 그룹을 사용 중이어야 합니다.
Kafka Exporter의 Grafana 대시보드는 AMQ Streams에서 제공하는 여러 가지 Grafana 대시보드 중 하나입니다.
Kafka Exporter는 소비자 지연 및 소비자 오프셋과 관련된 추가 메트릭만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.
소비자 지연은 프로덕션 속도 및 메시지 소비 속도의 차이를 나타냅니다. 특히 지정된 소비자 그룹의 소비자 지연은 파티션의 마지막 메시지와 해당 소비자가 현재 선택 중인 메시지 간의 지연을 나타냅니다.
지연은 파티션 로그의 끝과 관련하여 소비자 오프셋의 위치를 반영합니다.
생산자와 소비자 오프셋 간의 소비자 지연
이러한 차이점은 생산자 오프셋과 소비자 오프셋 간의 CloudEvent라고 합니다. Kafka 브로커 주제 파티션의 읽기 및 쓰기 위치입니다.
주제가 100개의 메시지 1초를 스트리밍한다고 가정합니다. 생산자 오프셋(주제 파티션 헤드)과 소비자가 읽은 마지막 오프셋 사이에 1000개의 메시지 지연은 10초 지연을 의미합니다.
소비자 지연 모니터링의 중요성
(near) 실시간 데이터 처리에 의존하는 애플리케이션의 경우 소비자 지연을 모니터링하여 너무 크지 않은지 확인하는 것이 중요합니다. 지연이 클수록 프로세스가 실시간 처리 목표에서 더 많이 이동합니다.
예를 들어 소비자 지연은 제거되지 않은 오래된 데이터를 너무 많이 소비하거나 계획되지 않은 종료를 통해 소비한 결과일 수 있습니다.
소비자 지연 감소
Grafana 차트를 사용하여 지연을 분석하고 작업을 줄이는 작업이 영향을 받는 소비자 그룹에 영향을 미치는지 확인합니다. 예를 들어 Kafka 브로커가 지연을 줄이기 위해 조정되면 대시보드에 소비자 그룹 차트가 내려가고 분별 차트가 소비되는 메시지가 표시됩니다.
지연을 줄이기 위한 일반적인 작업은 다음과 같습니다.
- 새 소비자를 추가하여 확장 소비자 그룹
- 메시지에 대한 보존 시간이 항목에 남아 있게 늘립니다.Increase the retention time for a message to remain in a topic.
- 메시지 버퍼를 늘리기 위한 디스크 용량 추가
소비자 지연을 줄이기 위한 조치는 기본 인프라에 따라 다르며 AMQ Streams가 지원하는 사용 사례에 따라 다릅니다. 예를 들어 지연된 소비자는 브로커가 디스크 캐시에서 가져오기 요청을 처리할 수 있다는 이점이 적습니다. 그리고 특정 경우에는 소비자가 캡처될 때까지 메시지를 자동으로 삭제하는 것이 허용될 수 있습니다.
14.2. Cruise Control 작업 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
cruise Control은 브로커, 주제 및 파티션의 사용률을 추적하기 위해 Kafka 브로커를 모니터링합니다. Cruise Control은 자체 성능을 모니터링하기 위한 일련의 메트릭도 제공합니다.
Cruise Control 지표 보고자는 Kafka 브로커에서 원시 메트릭 데이터를 수집합니다. 데이터는 Cruise Control에 의해 자동으로 생성되는 항목에 생성됩니다. 메트릭은 Kafka 클러스터에 대한 최적화 제안을 생성하는 데 사용됩니다.
Cruise Control 작업 실시간 모니터링에 대해 Cruise Control 메트릭을 사용할 수 있습니다. 예를 들어 Cruise Control 메트릭을 사용하여 실행 중인 재조정 작업의 상태를 모니터링하거나 작업 성능에서 감지된 모든 이상 사항에 대한 경고를 제공할 수 있습니다.
Cruise Control 구성에서 PrometheusECDHE Exporter 를 활성화하여 Cruise Control 메트릭을 노출합니다.
센서로 알려진 사용 가능한 Cruise Control 지표의 전체 목록은 Cruise Control 문서를 참조하십시오.
14.2.1. Cruise Control 지표 노출 링크 복사링크가 클립보드에 복사되었습니다!
Cruise Control 작업에 지표를 노출하려면 Cruise Control을 배포하고 배포에 Prometheus 지표를 활성화하도록 Kafka 리소스를 구성합니다. 자체 구성을 사용하거나 AMQ Streams에서 제공하는 kafka-cruise-control-metrics.yaml 파일 예제를 사용할 수 있습니다.
Kafka 리소스에서 CruiseControl 속성의 metricsConfig 에 구성을 추가합니다. 이 구성을 사용하면 Prometheus>-< Exporter 에서 HTTP 끝점을 통해 Cruise Control 지표를 노출할 수 있습니다. HTTP 끝점은 Prometheus 서버에서 스크랩합니다.
Cruise Control의 메트릭 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
Spec:
# ...
cruiseControl:
# ...
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: cruise-control-metrics
key: metrics-config.yml
---
kind: ConfigMap
apiVersion: v1
metadata:
name: cruise-control-metrics
labels:
app: strimzi
data:
metrics-config.yml: |
# metrics configuration...
14.2.2. Cruise Control 지표 보기 링크 복사링크가 클립보드에 복사되었습니다!
Cruise Control 메트릭을 노출하면 Prometheus 또는 다른 적절한 모니터링 시스템을 사용하여 메트릭 데이터에 대한 정보를 볼 수 있습니다. AMQ Streams는 Cruise Control 지표의 시각화를 표시하는 Grafana 대시보드 예제 를 제공합니다. 대시보드는 strimzi-cruise-control.json 이라는 JSON 파일입니다. Grafana 대시보드를 활성화할 때 노출된 지표는 모니터링 데이터를 제공합니다.
14.2.2.1. 균형 점수 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤 메트릭에는 균형 점수가 포함됩니다. Balancedness는 Kafka 클러스터에 워크로드를 균등하게 분산하는 방법에 대한 척도입니다.
균형 점수(balanceness-score)에 대한 크루즈 컨트롤 메트릭은 KafkaRebalance 리소스의 balancedness 점수와 다를 수 있습니다. cruise Control은 KafkaRebalance 리소스에 사용되는 default .goals를 사용하여 각 점수를 계산합니다. oma .goals 와 동일하지 않을 수 있는omaly.detectionly.detection.goals 는 Kafka 사용자 정의 리소스의 spec.cruiseControl.config 에 지정됩니다.
KafkaRebalance 리소스를 새로 고침하면 최적화 제안을 가져옵니다. 다음 조건 중 하나가 적용되는 경우 최신 캐시된 최적화 제안을 가져옵니다.
-
KafkaRebalance
목표는Kafka리소스의default.goals섹션에 구성된 값과 일치합니다. -
KafkaRebalance
목표는지정되지 않습니다.
그렇지 않으면 Cruise Control은 KafkaRebalance 목표를 기반으로 새로운 최적화 제안을 생성합니다. 새로 고침할 때마다 새 제안이 생성되는 경우 성능 모니터링에 영향을 미칠 수 있습니다.
14.2.2.2. 이상 탐지에 대한 경고 링크 복사링크가 클립보드에 복사되었습니다!
크루즈 컨트롤의 이상성 탐지 는 브로커 실패와 같은 최적화 목표 생성을 차단하는 조건에 대한 메트릭 데이터를 제공합니다. 더 많은 가시성을 원한다면 anomaly detect에서 제공하는 메트릭을 사용하여 경고를 설정하고 알림을 보낼 수 있습니다. Cruise Control의 변명 도를 설정하여 지정된 알림 채널을 통해 이러한 메트릭을 기반으로 경고를 라우팅할 수 있습니다. 또는 이상 탐지기에서 제공하는 지표 데이터를 스크랩하고 경고를 생성하도록 Prometheus를 설정할 수 있습니다. 그런 다음 Prometheus Alertmanager는 Prometheus에서 생성한 경고를 라우팅할 수 있습니다.
Cruise Control 문서는 AnomalyDetector 메트릭 및 이상적으로 알림기에 대한 정보를 제공합니다.
14.3. 메트릭 파일 예 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams에서 제공하는 예제 구성 파일에서 Grafana 대시보드 및 기타 메트릭 구성 파일 예제 를 찾을 수 있습니다.
AMQ Streams와 함께 제공되는 메트릭 파일의 예
metrics
├── grafana-dashboards
│ ├── 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
- 다른 AMQ Streams 구성 요소의 Grafana 대시보드의 예.
- 2
- Grafana 이미지의 설치 파일입니다.
- 3
- 노드의 OpenShift cAdvisor 에이전트 및 kubelet에서 직접 제공되는 CPU, 메모리, 디스크 볼륨 사용량에 대한 메트릭을 스크랩하는 추가 구성입니다.
- 4
- Alertmanager를 통해 알림을 전송하기 위한 후크 정의.
- 5
- Alertmanager 배포 및 구성을 위한 리소스입니다.
- 6
- Prometheus Alertmanager와 함께 사용할 경고 규칙 예(Prometheus와 함께 배포됨).
- 7
- Prometheus 이미지의 설치 리소스 파일
- 8
- Prometheus Operator에서 변환한 PodMonitor 정의는 Pod에서 직접 메트릭 데이터를 스크랩할 수 있도록 Prometheus 서버의 작업으로 변환됩니다.
- 9
- 지표가 활성화된 Kafka 브리지 리소스
- 10
- Kafka Connect에 대한 Prometheus>-< Exporter 재지정 규칙을 정의하는 지표 구성입니다.
- 11
- Cruise Control에 대한 Prometheus ScanSetting Exporter 재지정 규칙을 정의하는 지표 구성입니다.
- 12
- Prometheus ScanSetting Exporter를 정의하는 지표 구성에서는 Kafka 및 ZooKeeper에 대한 재지정 규칙 재지정 규칙입니다.
- 13
- Kafka MirrorECDHE 2.0에 대한 Prometheus ScanSetting Exporter 재레이블 규칙을 정의하는 지표 구성입니다.
14.3.1. Prometheus 지표 구성의 예 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 Prometheus>-< Exporter 를 사용하여 HTTP 끝점을 통해 지표를 노출합니다. 이 값은 Prometheus 서버에서 스크랩할 수 있습니다.
Grafana 대시보드는 사용자 정의 리소스 구성에서 AMQ Streams 구성 요소에 대해 정의된 Prometheus>-< Exporter 재레이블 규칙을 사용합니다.
레이블은 이름-값 쌍입니다. 레이블 재레이블은 레이블을 동적으로 작성하는 프로세스입니다. 예를 들어 레이블 값은 Kafka 서버 이름 및 클라이언트 ID에서 파생될 수 있습니다.
AMQ Streams는 사용자 정의 리소스 구성 YAML 파일의 예와 레이블 지정 규칙을 제공합니다. Prometheus 지표 구성을 배포할 때 사용자 정의 리소스 예제를 배포하거나 자체 사용자 정의 리소스 정의에 메트릭 구성을 복사할 수 있습니다.
| 구성 요소 | 사용자 정의 리소스 | YAML 파일 예 |
|---|---|---|
| Kafka 및 ZooKeeper |
|
|
| Kafka Connect |
|
|
| Kafka MirrorMaker 2 |
|
|
| Kafka 브리지 |
|
|
| 크루즈 컨트롤 |
|
|
14.3.2. 경고 알림에 대한 Prometheus 규칙 예 링크 복사링크가 클립보드에 복사되었습니다!
경고 알림에 대한 Prometheus 규칙의 예는 AMQ Streams에서 제공하는 지표 구성 파일 예제와 함께 제공됩니다. 규칙은 Prometheus 배포에서 사용하기 위해 예제 prometheus-rules.yaml 파일에 지정됩니다.
경고 규칙은 메트릭에서 관찰되는 특정 조건에 대한 알림을 제공합니다. 규칙은 Prometheus 서버에 선언되지만 Prometheus Alertmanager는 경고 알림을 담당합니다.
Prometheus 경고 규칙은 지속적으로 평가되는 PromQL 표현식을 사용하여 조건을 설명합니다.
경고 표현식이 true가 되면 조건이 충족되고 Prometheus 서버는 경고 데이터를 Alertmanager로 보냅니다. 그런 다음 Alertmanager는 배포에 대해 구성된 통신 방법을 사용하여 알림을 보냅니다.
경고 규칙 정의에 대한 일반 지점:
-
for속성을 규칙과 함께 사용하여 경고가 트리거되기 전에 조건이 지속되는 기간을 결정합니다. -
눈금은 기본 ZooKeeper 시간 단위이며, 밀리초 단위로 측정되고
Kafka.spec.zookeeper.config의tickTime매개변수를 사용하여 구성됩니다. 예를 들어, ZooKeepertickTime=3000인 경우 3 눈금 (3 x 3000)이 9000밀리초와 같습니다. -
ZookeeperRunningOutOfSpace및 경고의 가용성은 사용된 OpenShift 구성 및 스토리지 구현에 따라 달라집니다. 특정 플랫폼에 대한 스토리지 구현은 메트릭이 경고를 제공하는 데 필요한 사용 가능한 공간에 대한 정보를 제공하지 못할 수 있습니다.
Alertmanager는 이메일, 채팅 메시지 또는 기타 알림 방법을 사용하도록 구성할 수 있습니다. 특정 요구에 따라 예제 규칙의 기본 구성을 조정합니다.
14.3.2.1. 규칙 변경 예 링크 복사링크가 클립보드에 복사되었습니다!
prometheus-rules.yaml 파일에는 다음 구성 요소에 대한 예제 규칙이 포함되어 있습니다.
- Kafka
- ZooKeeper
- 엔터티 Operator
- Kafka Connect
- Kafka 브리지
- MirrorMaker
- Kafka Exporter
각 예제 규칙에 대한 설명은 파일에서 제공됩니다.
14.3.3. Grafana 대시보드 예 링크 복사링크가 클립보드에 복사되었습니다!
메트릭을 제공하기 위해 Prometheus를 배포하는 경우 AMQ Streams와 함께 제공되는 Grafana 대시보드 예제를 사용하여 AMQ Streams 구성 요소를 모니터링할 수 있습니다.
예제 대시보드는 examples/metrics/grafana-dashboards 디렉터리에서 JSON 파일로 제공됩니다.
모든 대시보드는 JVM 메트릭과 구성 요소에 대한 지표를 제공합니다. 예를 들어, AMQ Streams Operator의 Grafana 대시보드는 처리하는 조정 또는 사용자 정의 리소스의 수에 대한 정보를 제공합니다.
예제 대시보드는 Kafka에서 지원하는 모든 메트릭을 표시하지 않습니다. 대시보드는 모니터링을 위한 대표 지표 세트로 채워집니다.
| 구성 요소 | JSON 파일 예 |
|---|---|
| AMQ Streams Operator |
|
| Kafka |
|
| ZooKeeper |
|
| Kafka Connect |
|
| Kafka MirrorMaker 2 |
|
| Kafka 브리지 |
|
| 크루즈 컨트롤 |
|
| Kafka Exporter |
|
Kafka Exporter에 메트릭을 사용할 수 없는 경우 아직 클러스터에 트래픽이 없기 때문에 Kafka Exporter Grafana 대시보드에 숫자 필드에 대한 N/A 가 표시되고 그래프에 대한 데이터 없음이 표시됩니다.
14.4. Prometheus 지표 구성 배포 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams와 함께 Prometheus를 사용하도록 Prometheus 지표 구성을 배포합니다. metricsConfig 속성을 사용하여 Prometheus 지표를 활성화하고 구성합니다.
자체 구성 또는 AMQ Streams와 함께 제공되는 사용자 정의 리소스 구성 파일 예제 를 사용할 수 있습니다.
-
kafka-metrics.yaml -
kafka-connect-metrics.yaml -
kafka-mirror-maker-2-metrics.yaml -
kafka-bridge-metrics.yaml -
kafka-cruise-control-metrics.yaml
예제 구성 파일에는 Prometheus 지표를 활성화하는 데 필요한 규칙 및 구성의 레이블이 다시 지정되었습니다. Prometheus는 대상 HTTP 끝점에서 메트릭을 스크랩합니다. 예제 파일은 AMQ Streams를 사용하여 Prometheus를 시도할 수 있는 좋은 방법입니다.
재레이블 규칙 및 메트릭 구성을 적용하려면 다음 중 하나를 수행하십시오.
- 사용자 정의 리소스에 예제 구성을 복사
- 메트릭 구성을 사용하여 사용자 정의 리소스 배포
Kafka Exporter 메트릭을 포함하려면 Kafka 리소스에 kafkaExporter 구성을 추가합니다.
Kafka Exporter는 소비자 지연 및 소비자 오프셋과 관련된 추가 메트릭만 제공합니다. 일반 Kafka 메트릭의 경우 Kafka 브로커 에서 Prometheus 지표를 구성해야 합니다.
다음 절차에서는 Kafka 리소스에 Prometheus 지표 구성을 배포하는 방법을 설명합니다. 다른 리소스에 예제 파일을 사용할 때 프로세스는 동일합니다.
절차
Prometheus 구성을 사용하여 예제 사용자 정의 리소스를 배포합니다.
예를 들어 각
Kafka리소스에 대해kafka-metrics.yaml파일을 적용합니다.예제 구성 배포
oc apply -f kafka-metrics.yaml또는
kafka-metrics.yaml의 예제 구성을 자체Kafka리소스에 복사할 수 있습니다.예제 구성 복사
oc edit kafka <kafka-configuration-file>metricsConfig속성 및Kafka리소스에 참조하는ConfigMap을 복사합니다.Kafka의 메트릭 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... metricsConfig:1 type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: kafka-metrics key: kafka-metrics-config.yml --- kind: ConfigMap2 apiVersion: v1 metadata: name: kafka-metrics labels: app: strimzi data: kafka-metrics-config.yml: | # metrics configuration...참고Kafka Bridge의 경우
enableMetrics속성을 지정하고true로 설정합니다.apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: # ... bootstrapServers: my-cluster-kafka:9092 http: # ... enableMetrics: true # ...Kafka Exporter를 배포하려면
kafkaExporter구성을 추가합니다.kafkaExporter구성은Kafka리소스에만 지정됩니다.Kafka Exporter를 배포하기 위한 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafkaExporter: image: my-registry.io/my-org/my-exporter-cluster:latest1 groupRegex: ".*"2 topicRegex: ".*"3 resources:4 requests: cpu: 200m memory: 64Mi limits: cpu: 500m memory: 128Mi logging: debug5 enableSaramaLogging: true6 template:7 pod: metadata: labels: label1: value1 imagePullSecrets: - name: my-docker-credentials securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe:8 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe:9 initialDelaySeconds: 15 timeoutSeconds: 5 # ...- 1
- ADVANCED OPTION: 컨테이너 이미지 구성 - 특별한 경우에만 권장됩니다.
- 2
- 메트릭에 포함할 소비자 그룹을 지정하는 정규식입니다.
- 3
- 메트릭에 포함할 주제를 지정하는 정규식입니다.
- 4
- 예약할 CPU 및 메모리 리소스입니다.
- 5
- 지정된 심각도(디버그, info, warn, error, fatal) 이상으로 메시지를 기록하기 위한 로깅 구성입니다.
- 6
- Kafka Exporter에서 사용하는 Go 클라이언트 라이브러리인 Sarama 로깅을 활성화하는 부울입니다.
- 7
- 배포 템플릿 및 포드 사용자 지정.
- 8
- 상태 점검 준비 프로브.
- 9
- 상태 점검 활동성 프로브.
Kafka 내보내기가 제대로 작동하려면 소비자 그룹을 사용 중이어야 합니다.
14.5. OpenShift에서 Kafka 메트릭 및 대시보드 보기 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams가 OpenShift Container Platform에 배포되면 사용자 정의 프로젝트에 대한 모니터링을 통해 메트릭이 제공됩니다. 이 OpenShift 기능을 통해 개발자는 자체 프로젝트(예: Kafka 프로젝트)를 모니터링하기 위해 별도의 Prometheus 인스턴스에 액세스할 수 있습니다.
사용자 정의 프로젝트에 대한 모니터링이 활성화된 경우 openshift-user-workload-monitoring 프로젝트에는 다음 구성 요소가 포함됩니다.
- Prometheus Operator
- Prometheus 인스턴스(매개 Prometheus Operator가 자동으로 배포)
- Thanos Ruler 인스턴스
AMQ Streams는 이러한 구성 요소를 사용하여 메트릭을 사용합니다.
클러스터 관리자는 사용자 정의 프로젝트에 대한 모니터링을 활성화한 다음 개발자 및 기타 사용자에게 자체 프로젝트 내에서 애플리케이션을 모니터링할 수 있는 권한을 부여해야 합니다.
Grafana 배포
Kafka 클러스터가 포함된 프로젝트에 Grafana 인스턴스를 배포할 수 있습니다. 그런 다음 Grafana 대시보드 예제를 사용하여 Grafana 사용자 인터페이스에서 AMQ Streams에 대한 Prometheus 지표를 시각화할 수 있습니다.
openshift-monitoring 프로젝트는 코어 플랫폼 구성 요소에 대한 모니터링을 제공합니다. 이 프로젝트에서 Prometheus 및 Grafana 구성 요소를 사용하여 OpenShift Container Platform 4.x에서 AMQ Streams에 대한 모니터링을 구성하지 마십시오.
절차 개요
OpenShift Container Platform에서 AMQ Streams 모니터링을 설정하려면 다음 절차를 순서대로 따르십시오.
14.5.1. 사전 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
- 예제 YAML 파일을 사용하여 Prometheus 지표 구성을 배포 했습니다.
-
사용자 정의 프로젝트에 대한 모니터링 이 활성화됩니다. 클러스터 관리자가 OpenShift 클러스터에
cluster-monitoring-config구성 맵을 생성했습니다. -
클러스터 관리자에게
monitoring-rules-edit또는monitoring-edit역할이 할당되었습니다.
cluster-monitoring-config 구성 맵을 생성하고 사용자 정의 프로젝트를 모니터링할 수 있는 권한을 사용자에게 부여하는 방법에 대한 자세한 내용은 OpenShift Container Platform 모니터링을 참조하십시오. https://access.redhat.com/documentation/en-us/openshift_container_platform/4.13/html/monitoring/index
14.5.3. Prometheus 리소스 배포 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus를 사용하여 Kafka 클러스터에서 모니터링 데이터를 가져옵니다.
자체 Prometheus 배포를 사용하거나 AMQ Streams에서 제공하는 예제 메트릭 구성 파일을 사용하여 Prometheus를 배포할 수 있습니다. 예제 파일을 사용하려면 PodMonitor 리소스를 구성하고 배포합니다. PodMonitors 는 Apache Kafka, ZooKeeper, Operator, Kafka Bridge 및 Cruise Control에 대한 Pod에서 직접 데이터를 스크랩합니다.
그런 다음 Alertmanager에 대한 경고 규칙 예제를 배포합니다.
사전 요구 사항
- 실행 중인 Kafka 클러스터입니다.
- AMQ 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 14sPod가 반환되지 않으면 사용자 정의 프로젝트에 대한 모니터링이 비활성화됩니다. 14.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
Kafka와 같이 메트릭을 스크랩할 Pod가 실행 중인 프로젝트입니다.
Kafka 클러스터가 실행 중인 프로젝트에
strimzi-pod-monitor.yaml파일을 배포합니다.oc apply -f strimzi-pod-monitor.yaml -n MY-PROJECT동일한 프로젝트에 예제 Prometheus 규칙을 배포합니다.
oc apply -f prometheus-rules.yaml -n MY-PROJECT
14.5.4. Grafana의 서비스 계정 생성 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams의 Grafana 인스턴스는 cluster-monitoring-view 역할이 할당된 서비스 계정으로 실행해야 합니다.
모니터링을 위한 메트릭을 제공하기 위해 Grafana를 사용하는 경우 서비스 계정을 생성합니다.
사전 요구 사항
절차
Kafka 클러스터가 포함된 프로젝트에서 Grafana의
ServiceAccount를 생성합니다.oc create sa grafana-service-account -n my-project이 예에서는
my-project네임스페이스에grafana-service-account라는 서비스 계정이 생성됩니다.cluster-monitoring-view역할을 GrafanaServiceAccount에 할당하는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를 배포할 때 액세스 토큰이 필요합니다.
14.5.5. Prometheus 데이터 소스를 사용하여 Grafana 배포 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus 지표를 제공하도록 Grafana를 배포합니다. Grafana 애플리케이션에는 OpenShift Container Platform 모니터링 스택에 대한 구성이 필요합니다.
OpenShift Container Platform에는 openshift-monitoring 프로젝트에 Thanos Querier 인스턴스가 포함되어 있습니다. Thanos Querier는 플랫폼 지표를 집계하는 데 사용됩니다.
필요한 플랫폼 지표를 사용하려면 Grafana 인스턴스에 Thanos Querier에 연결할 수 있는 Prometheus 데이터 소스가 필요합니다. 이 연결을 구성하려면 토큰을 사용하여 Thanos Querier와 함께 실행되는 oauth-proxy 사이드카에 대해 인증하는 구성 맵을 생성합니다. datasource.yaml 파일은 구성 맵의 소스로 사용됩니다.
마지막으로 Kafka 클러스터가 포함된 프로젝트에 볼륨으로 마운트된 구성 맵을 사용하여 Grafana 애플리케이션을 배포합니다.
사전 요구 사항
절차
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:9.4.7 ports: - name: grafana containerPort: 3000 protocol: TCP volumeMounts: - name: grafana-data mountPath: /var/lib/grafana - name: grafana-logs mountPath: /var/log/grafana - name: grafana-config mountPath: /etc/grafana/provisioning/datasources/datasource.yaml readOnly: true subPath: datasource.yaml readinessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 15 periodSeconds: 20 volumes: - name: grafana-data emptyDir: {} - name: grafana-logs emptyDir: {} - name: grafana-config configMap: name: grafana-config --- apiVersion: v1 kind: Service metadata: name: grafana labels: app: strimzi spec: ports: - name: grafana port: 3000 targetPort: 3000 protocol: TCP selector: name: grafana type: ClusterIPKafka 클러스터가 포함된 프로젝트에 Grafana 애플리케이션을 배포합니다.
oc apply -f <grafana-application> -n <my-project>
14.5.6. Grafana 서비스에 대한 경로 생성 링크 복사링크가 클립보드에 복사되었습니다!
Grafana 서비스를 노출하는 경로를 통해 Grafana 사용자 인터페이스에 액세스할 수 있습니다.
절차
grafana서비스에 대한 엣지 경로를 생성합니다.oc create route edge <my-grafana-route> --service=grafana --namespace=KAFKA-NAMESPACE
14.5.7. Grafana 대시보드 예제 가져오기 링크 복사링크가 클립보드에 복사되었습니다!
Grafana를 사용하여 사용자 정의 대시보드에서 Prometheus 지표의 시각화를 제공합니다.
AMQ Streams는 JSON 형식의 Grafana에 대한 대시보드 구성 파일의 예를 제공합니다.
-
examples/metrics/grafana-dashboards
이 절차에서는 예제 Grafana 대시보드를 사용합니다.
예제 대시보드는 주요 메트릭을 모니터링하는 데 적합하지만 Kafka에서 지원하는 모든 메트릭을 표시하지는 않습니다. 인프라에 따라 예제 대시보드를 수정하거나 다른 메트릭을 추가할 수 있습니다.
사전 요구 사항
절차
Grafana 서비스에 대한 경로 세부 정보를 가져옵니다. 예를 들면 다음과 같습니다.
oc get routes NAME HOST/PORT PATH SERVICES MY-GRAFANA-ROUTE MY-GRAFANA-ROUTE-amq-streams.net grafana- 웹 브라우저에서 경로 호스트 및 포트의 URL을 사용하여 Grafana 로그인 화면에 액세스합니다.
사용자 이름과 암호를 입력한 다음 로그인을 클릭합니다.
기본 Grafana 사용자 이름과 암호는 모두
admin입니다. 처음 로그인하면 암호를 변경할 수 있습니다.- 구성 > 데이터 소스에서 Prometheus 데이터 소스가 생성되었는지 확인합니다. 데이터 소스는 14.5.5절. “Prometheus 데이터 소스를 사용하여 Grafana 배포” 에서 생성되었습니다.
- + 아이콘을 클릭한 다음 가져오기 를 클릭합니다.
-
examples/metrics/grafana-dashboards에서 가져올 대시보드의 JSON을 복사합니다. - JSON을 텍스트 상자에 붙여넣고 Load 를 클릭합니다.
- Grafana 대시보드 예제에 대해 5-7단계를 반복합니다.
가져온 Grafana 대시보드는 대시보드 홈 페이지에서 볼 수 있습니다.
15장. 분산 추적 소개 링크 복사링크가 클립보드에 복사되었습니다!
분산 추적은 분산 시스템의 애플리케이션 간 트랜잭션 진행 상황을 추적합니다. 마이크로 서비스 아키텍처에서 추적은 서비스 간 트랜잭션 진행 상황을 추적합니다. 추적 데이터는 애플리케이션 성능을 모니터링하고 대상 시스템 및 최종 사용자 애플리케이션 관련 문제를 조사하는 데 유용합니다.
AMQ Streams에서 추적을 사용하면 소스 시스템에서 Kafka로의 메시지 엔드 투 엔드 추적을 용이하게 하고 Kafka에서 시스템 및 애플리케이션을 대상으로 지정할 수 있습니다. 분산 추적은 Grafana 대시보드의 메트릭 모니터링과 구성 요소 로거를 보완합니다.
추적 지원은 다음 Kafka 구성 요소에 빌드됩니다.
- 소스 클러스터에서 대상 클러스터로 메시지를 추적할 MirrorMaker
- Kafka Connect에서 사용하고 생성한 메시지를 추적하기 위한 Kafka Connect
- Kafka 및 HTTP 클라이언트 애플리케이션 간 메시지 추적을 위한 Kafka Bridge
Kafka 브로커에서는 추적이 지원되지 않습니다.
사용자 정의 리소스를 통해 이러한 구성 요소의 추적을 활성화하고 구성합니다. spec.template 속성을 사용하여 추적 구성을 추가합니다.
spec.tracing.type 속성을 사용하여 추적 유형을 지정하여 추적을 활성화합니다.
OpenTelemetry-
type: opentelemetry를 지정하여 OpenTelemetry를 사용합니다. 기본적으로 OpenTelemetry는 OTLP (OpenTelemetry Protocol) 내보내기 및 끝점을 사용하여 추적 데이터를 가져옵니다. Jaeger 추적을 포함하여 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. 이를 위해 추적 구성에서 OpenTelemetry 내보내기 및 끝점을 변경합니다. jaeger-
OpenTracing 및 Jaeger 클라이언트를 사용하여 추적 데이터를 가져오려면
type:jaeger를 지정합니다.
type: jaeger tracing에 대한 지원은 더 이상 사용되지 않습니다. 이제 Jaeger 클라이언트가 사용 중지되고 OpenTracing 프로젝트가 아카이브됩니다. 따라서 향후 Kafka 버전에 대한 지원을 보장할 수 없습니다. 가능한 경우 type: jaeger 추적은 2023년 6월까지 유지 관리하고 나중에 삭제합니다. 최대한 빨리 OpenTelemetry로 마이그레이션하십시오.
15.1. 추적 옵션 링크 복사링크가 클립보드에 복사되었습니다!
Jaeger 추적 시스템과 함께 OpenTelemetry 또는 OpenTracing (더 이상 사용되지 않음)을 사용합니다.
OpenTelemetry 및 OpenTracing은 추적 또는 모니터링 시스템과 독립적 인 API 사양을 제공합니다.
API를 사용하여 추적을 위한 애플리케이션 코드를 계측합니다.
- 계측된 애플리케이션은 분산 시스템에서 개별 요청에 대한 추적을 생성합니다.
- 추적은 시간 경과에 따른 특정 작업 단위를 정의하는 기간으로 구성됩니다.
Jaeger는 마이크로 서비스 기반 분산 시스템의 추적 시스템입니다.
- Jaeger는 추적 API를 구현하고 조정을 위한 클라이언트 라이브러리를 제공합니다.
- Jaeger 사용자 인터페이스를 사용하면 추적 데이터를 쿼리, 필터링 및 분석할 수 있습니다.
간단한 쿼리를 보여주는 Jaeger 사용자 인터페이스
15.2. 추적을 위한 환경 변수 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 구성 요소에 대한 추적을 활성화하거나 Kafka 클라이언트의 추적기를 초기화하는 경우 환경 변수를 사용합니다.
환경 변수 추적은 변경될 수 있습니다. 최신 정보는 OpenTelemetry 문서 및 OpenTracing 설명서 를 참조하십시오.
다음 표에서는 추적 프로그램을 설정하기 위한 주요 환경 변수에 대해 설명합니다.
| 속성 | 필수 항목 | 설명 |
|---|---|---|
|
| 제공됨 | OpenTelemetry의 Jaeger 추적 서비스의 이름입니다. |
|
| 제공됨 | 추적에 사용되는 내보내기입니다. |
|
| 제공됨 |
추적에 사용되는 내보내기입니다. 기본적으로 |
| 속성 | 필수 항목 | 설명 |
|---|---|---|
|
| 제공됨 | Jaeger 추적 프로그램의 이름입니다. |
|
| 없음 |
UDP(User Datagram Protocol)를 통해 |
|
| 없음 |
UDP를 통해 |
15.3. 분산 추적 설정 링크 복사링크가 클립보드에 복사되었습니다!
사용자 정의 리소스에서 추적 유형을 지정하여 Kafka 구성 요소에서 분산 추적을 활성화합니다. 메시지의 엔드 투 엔드 추적을 위해 Kafka 클라이언트의 계측 추적기입니다.
분산 추적을 설정하려면 다음 절차를 순서대로 수행합니다.
- MirrorMaker, Kafka Connect 및 Kafka Bridge에 대한 추적 활성화
클라이언트의 추적을 설정합니다.
추적기를 사용하여 클라이언트 장치:
15.3.1. 사전 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
분산 추적을 설정하기 전에 Jaeger 백엔드 구성 요소가 OpenShift 클러스터에 배포되었는지 확인합니다. OpenShift 클러스터에 Jaeger를 배포하는 데 Jaeger Operator를 사용하는 것이 좋습니다.
배포 지침은 Jaeger 문서를 참조하십시오.
AMQ Streams 이외의 애플리케이션 및 시스템의 추적 설정은 이 콘텐츠의 범위를 벗어납니다.
15.3.2. MirrorMaker, Kafka Connect 및 Kafka Bridge 리소스에서 추적 활성화 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker, MirrorMaker 2, Kafka Connect 및 AMQ Streams Kafka Bridge에서 분산 추적이 지원됩니다. 추적기 서비스를 지정하고 활성화하도록 구성 요소의 사용자 정의 리소스를 구성합니다.
리소스에서 추적을 활성화하면 다음 이벤트가 트리거됩니다.
- 인터셉터 클래스는 구성 요소의 통합 소비자 및 생산자에서 업데이트됩니다.
- MirrorMaker, MirrorMaker 2 및 Kafka Connect의 경우 추적 에이전트는 리소스에 정의된 추적 구성을 기반으로 추적기를 초기화합니다.
- Kafka 브리지의 경우 리소스에 정의된 추적 구성을 기반으로 하는 추적자는 Kafka 브리지 자체에서 초기화합니다.
OpenTelemetry 또는 OpenTracing을 사용하는 추적을 활성화할 수 있습니다.
MirrorMaker 및 MirrorMaker 2에서 추적
MirrorMaker 및 MirrorMaker 2의 경우 메시지는 소스 클러스터에서 대상 클러스터로 추적됩니다. 추적 데이터는 MirrorMaker 또는 MirrorMaker 2 구성 요소를 입력하고 떠나는 메시지를 기록합니다.
Kafka Connect에서 추적
Kafka Connect의 경우 Kafka Connect에서 생성하고 사용하는 메시지만 추적됩니다. Kafka Connect와 외부 시스템 간에 전송된 메시지를 추적하려면 해당 시스템의 커넥터에서 추적을 구성해야 합니다.
Kafka 브리지의 추적
Kafka 브리지의 경우 Kafka 브리지에서 생성 및 사용하는 메시지가 추적됩니다. Kafka 브리지를 통해 메시지를 보내고 받을 클라이언트 애플리케이션에서 들어오는 HTTP 요청도 추적됩니다. 엔드 투 엔드 추적을 유지하려면 HTTP 클라이언트에서 추적을 구성해야 합니다.
절차
각 KafkaMirrorMaker,KafkaMirrorMaker2,KafkaConnect 및 KafkaBridge 리소스에 대해 다음 단계를 수행합니다.
spec.template속성에서 tracer 서비스를 구성합니다.- 추적 환경 변수를 템플릿 구성 속성으로 사용합니다.
-
OpenTelemetry의 경우
spec.tracing.type속성을opentelemetry로 설정합니다. -
OpenTracing의 경우
spec.tracing.type속성을jaeger로 설정합니다.
OpenTelemetry를 사용하는 Kafka Connect의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...OpenTelemetry를 사용하는 MirrorMaker의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker metadata: name: my-mirror-maker spec: #... template: mirrorMakerContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...OpenTelemetry를 사용한 MirrorMaker 2의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...OpenTelemetry를 사용하는 Kafka 브리지의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: #... template: bridgeContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...OpenTracing을 사용하는 Kafka Connect의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: #... template: connectContainer: env: - name: JAEGER_SERVICE_NAME value: my-jaeger-service - name: JAEGER_AGENT_HOST value: jaeger-agent-name - name: JAEGER_AGENT_PORT value: "6831" tracing: type: jaeger #...OpenTracing을 사용하는 MirrorMaker의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker metadata: name: my-mirror-maker spec: #... template: mirrorMakerContainer: env: - name: JAEGER_SERVICE_NAME value: my-jaeger-service - name: JAEGER_AGENT_HOST value: jaeger-agent-name - name: JAEGER_AGENT_PORT value: "6831" tracing: type: jaeger #...OpenTracing을 사용하는 MirrorMaker 2의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: JAEGER_SERVICE_NAME value: my-jaeger-service - name: JAEGER_AGENT_HOST value: jaeger-agent-name - name: JAEGER_AGENT_PORT value: "6831" tracing: type: jaeger #...OpenTracing을 사용하는 Kafka 브리지의 추적 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: #... template: bridgeContainer: env: - name: JAEGER_SERVICE_NAME value: my-jaeger-service - name: JAEGER_AGENT_HOST value: jaeger-agent-name - name: JAEGER_AGENT_PORT value: "6831" tracing: type: jaeger #...리소스를 생성하거나 업데이트합니다.
oc apply -f <resource_configuration_file>
15.3.3. Kafka 클라이언트의 추적 초기화 링크 복사링크가 클립보드에 복사되었습니다!
추적기를 초기화한 다음 분산 추적을 위해 클라이언트 애플리케이션을 계측합니다. Kafka 생산자 및 소비자 클라이언트 및 Kafka Streams API 애플리케이션을 조정할 수 있습니다. OpenTracing 또는 OpenTelemetry에 대해 추적기를 초기화할 수 있습니다.
추적 환경 변수 세트를 사용하여 추적 프로그램을 구성하고 초기화합니다.
절차
각 클라이언트 애플리케이션에서 추적기에 대한 종속성을 추가합니다.
클라이언트 애플리케이션의
pom.xml파일에 Maven 종속성을 추가합니다.OpenTelemetry의 종속 항목
<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId> <version>1.18.0.redhat-00001</version> </dependency> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-kafka-clients-{OpenTelemetryKafkaClient}</artifactId> <version>1.18.0.redhat-00001</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> <version>1.18.0.redhat-00001</version> </dependency>OpenTracing의 종속 항목
<dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>1.8.1.redhat-00002</version> </dependency> <dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-kafka-client</artifactId> <version>0.1.15.redhat-00006</version> </dependency>- 추적 환경 변수를 사용하여 추적 프로그램의 구성을 정의합니다.
환경 변수를 사용하여 초기화되는 추적기를 생성합니다.
OpenTelemetry용 추적기 생성
OpenTelemetry ot = GlobalOpenTelemetry.get();OpenTracing용 추적기 생성
Tracer tracer = Configuration.fromEnv().getTracer();추적기를 글로벌 추적기로 등록합니다.
GlobalTracer.register(tracer);클라이언트 사용 방법:
15.3.4. 추적을 위한 생산자 및 소비자 측정 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 생산자 및 소비자에서 추적할 수 있는 장치 애플리케이션 코드를 제공합니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Java 생산자 및 소비자 애플리케이션 코드를 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.
OpenTelemetry 및 OpenTracing 계측 프로젝트는 생산자와 소비자의 계측을 지원하는 클래스를 제공합니다.
- 데코레이터 장치
- 데코레이터 계측의 경우 추적을 위한 수정된 생산자 또는 소비자 인스턴스를 생성합니다. 데코레이터 장치는 OpenTelemetry 및 OpenTracing과는 다릅니다.
- 인터셉터 계측
- 인터셉터 계측의 경우 소비자 또는 생산자 구성에 추적 기능을 추가합니다. 인터셉터 계측은 OpenTelemetry 및 OpenTracing의 경우 동일합니다.
사전 요구 사항
추적 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);OpenTracing을 위한 데코레이터 계측 예
//producer instance KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps); TracingKafkaProducer<Integer, String> tracingProducer = new TracingKafkaProducer<>(producer, tracer); TracingKafkaProducer.send(...) //consumer instance KafkaConsumer<Integer, String> consumer = new KafkaConsumer<>(consumerProps); TracingKafkaConsumer<Integer, String> tracingConsumer = new TracingKafkaConsumer<>(consumer, tracer); tracingConsumer.subscribe(Collections.singletonList("mytopic")); ConsumerRecords<Integer, String> records = tracingConsumer.poll(1000); ConsumerRecord<Integer, String> record = ... SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);인터셉터를 사용하려면 생산자 또는 소비자 구성에서 인터셉터 클래스를 설정합니다.
일반적인 방법으로
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);
15.3.5. 추적을 위한 Kafka Streams 애플리케이션 조정 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Streams API 애플리케이션에서 추적을 활성화하는 장치 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Kafka Streams API 애플리케이션을 조정합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.
- 데코레이터 장치
-
데코레이터 계측의 경우 추적을 위해 수정된 Kafka Streams 인스턴스를 생성합니다. OpenTracing 계측 프로젝트는 Kafka Streams 계측을 지원하는
TracingKafkaClientSupplier클래스를 제공합니다. Kafka Streams에 추적을 제공하는TracingKafkaClientSupplier공급업체 인터페이스의 래핑된 인스턴스를 생성합니다. OpenTelemetry의 경우 프로세스는 동일하지만 지원을 제공하기 위해 사용자 정의TracingKafkaClientSupplier클래스를 생성해야 합니다. - 인터셉터 계측
- 인터셉터 계측의 경우 Kafka Streams 생산자 및 소비자 구성에 추적 기능을 추가합니다.
사전 요구 사항
추적 JAR를 프로젝트에 종속 항목으로 추가하여 Kafka Streams 애플리케이션에서 계측을 활성화합니다.
-
OpenTelemetry를 사용하여 Kafka Streams를 측정하려면 사용자 지정
TracingKafkaClientSupplier를 작성해야 합니다. 사용자 정의
TracingKafkaClientSupplier는 Kafka의DefaultKafkaClientSupplier를 확장하여 생산자 및 소비자 생성 방법을 재정의하여 Telemetry 관련 코드로 인스턴스를 래핑할 수 있습니다.사용자 정의
TracingKafkaClientSupplier의 예private class TracingKafkaClientSupplier extends DefaultKafkaClientSupplier { @Override public Producer<byte[], byte[]> getProducer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getProducer(config)); } @Override public Consumer<byte[], byte[]> getConsumer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getConsumer(config)); } @Override public Consumer<byte[], byte[]> getRestoreConsumer(Map<String, Object> config) { return this.getConsumer(config); } @Override public Consumer<byte[], byte[]> getGlobalConsumer(Map<String, Object> config) { return this.getConsumer(config); } }
절차
각 Kafka Streams API 애플리케이션에 대해 다음 단계를 수행합니다.
데코레이터 패턴을 사용하려면
TracingKafkaClientSupplier공급업체 인터페이스 인스턴스를 생성한 다음KafkaStreams에 공급업체 인터페이스를 제공합니다.데코레이터 장치 예
KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer); KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier); streams.start();인터셉터를 사용하려면 Kafka Streams 생산자 및 소비자 구성에서 인터셉터 클래스를 설정합니다.
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());
15.3.6. 다른 OpenTelemetry 추적 시스템 소개 링크 복사링크가 클립보드에 복사되었습니다!
기본 OTLP 시스템 대신 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. AMQ Streams와 함께 제공되는 Kafka 이미지에 필요한 아티팩트를 추가하여 이 작업을 수행합니다. 필요한 구현 특정 환경 변수도 설정해야 합니다. 그런 다음 OTEL_TRACES_EXPORTER 환경 변수를 사용하여 새 추적 구현을 활성화합니다.
다음 절차에서는 Zipkin 추적을 구현하는 방법을 설명합니다.
절차
AMQ Streams Kafka 이미지의
/opt/kafka/libs/디렉터리에 추적 아티팩트를 추가합니다.Red Hat Ecosystem Catalog 에서 Kafka 컨테이너 이미지를 기본 이미지로 사용하여 새 사용자 지정 이미지를 생성할 수 있습니다.
Zipkin에 대한 OpenTelemetry 아티팩트
io.opentelemetry:opentelemetry-exporter-zipkin새 추적 구현에 대한 추적 내보내기 및 끝점을 설정합니다.
Zikpin tracer 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-zipkin-service - name: OTEL_EXPORTER_ZIPKIN_ENDPOINT value: http://zipkin-exporter-host-name:9411/api/v2/spans1 - name: OTEL_TRACES_EXPORTER value: zipkin2 tracing: type: opentelemetry #...
15.3.7. 사용자 정의 범위 이름 링크 복사링크가 클립보드에 복사되었습니다!
추적 범위는 작업 이름, 시작 시간 및 기간이 있는 Jaeger의 논리 작업 단위입니다. 기간에는 이름이 기본 제공되지만, 사용하는 Kafka 클라이언트 계측에서 사용자 지정 범위 이름을 지정할 수 있습니다.
사용자 지정 범위 이름을 지정하는 것은 선택 사항이며 생산자 및 소비자 클라이언트 계측에서 데코레이터 패턴을 사용하는 경우에만 적용됩니다. ???
15.3.7.1. OpenTelemetry의 기간 이름 지정 링크 복사링크가 클립보드에 복사되었습니다!
사용자 지정 기간 이름은 OpenTelemetry를 사용하여 직접 지정할 수 없습니다. 대신 클라이언트 애플리케이션에 코드를 추가하여 범위 이름을 검색하여 추가 태그 및 속성을 추출합니다.
속성을 추출하기 위한 코드 예
//Defines attribute extraction for a producer
private static class ProducerAttribExtractor implements AttributesExtractor < ProducerRecord < ? , ? > , Void > {
@Override
public void onStart(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord) {
set(attributes, AttributeKey.stringKey("prod_start"), "prod1");
}
@Override
public void onEnd(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
set(attributes, AttributeKey.stringKey("prod_end"), "prod2");
}
}
//Defines attribute extraction for a consumer
private static class ConsumerAttribExtractor implements AttributesExtractor < ConsumerRecord < ? , ? > , Void > {
@Override
public void onStart(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord) {
set(attributes, AttributeKey.stringKey("con_start"), "con1");
}
@Override
public void onEnd(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
set(attributes, AttributeKey.stringKey("con_end"), "con2");
}
}
//Extracts the attributes
public static void main(String[] args) throws Exception {
Map < String, Object > configs = new HashMap < > (Collections.singletonMap(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"));
System.setProperty("otel.traces.exporter", "jaeger");
System.setProperty("otel.service.name", "myapp1");
KafkaTracing tracing = KafkaTracing.newBuilder(GlobalOpenTelemetry.get())
.addProducerAttributesExtractors(new ProducerAttribExtractor())
.addConsumerAttributesExtractors(new ConsumerAttribExtractor())
.build();
15.3.7.2. OpenTracing의 범위 이름 지정 링크 복사링크가 클립보드에 복사되었습니다!
OpenTracing에 대한 사용자 지정 범위 이름을 지정하려면 생산자와 소비자를 계측할 때 BiFunction 오브젝트를 추가 인수로 전달합니다.
기본 제공 이름에 대한 자세한 내용은 OpenTracing Apache Kafka 클라이언트 계측에서 클라이언트 애플리케이션 코드를 계측 하기 위해 사용자 지정 범위 이름을 지정합니다.
16장. AMQ Streams 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams를 버전 2.4로 업그레이드하여 새로운 기능 및 개선 사항, 성능 개선 사항 및 보안 옵션을 활용할 수 있습니다.
업그레이드의 일부로 Kafka를 지원되는 최신 버전으로 업그레이드합니다. 각 Kafka 릴리스에는 AMQ Streams 배포에 새로운 기능, 개선 사항 및 버그 수정이 포함되어 있습니다.
최신 버전에 문제가 발생하면 AMQ Streams를 이전 버전으로 다운그레이드 할 수 있습니다.
AMQ Streams의 릴리스 버전은 AMQ Streams 소프트웨어 다운로드 페이지에서 사용할 수 있습니다.
다운타임 및 가용성 업그레이드
고가용성을 위해 주제를 구성하는 경우 AMQ Streams 업그레이드로 인해 해당 주제의 데이터를 게시 및 읽는 소비자 및 생산자의 다운타임이 발생하지 않습니다. 고가용성 주제는 최소 3가지 이상의 복제 요인과 브로커에 균등하게 분산된 파티션이 있습니다.
AMQ Streams를 업그레이드하면 프로세스의 다른 단계에서 모든 브로커가 다시 시작되는 롤링 업데이트를 트리거합니다. 롤링 업데이트 중에 일부 브로커가 온라인 상태가 아닌 전체 클러스터 가용성이 일시적으로 줄어듭니다. 클러스터 가용성이 감소하면 브로커 오류가 발생할 가능성이 증가하여 메시지가 손실될 수 있습니다.
16.1. AMQ Streams 업그레이드 경로 링크 복사링크가 클립보드에 복사되었습니다!
두 가지 업그레이드 경로가 가능합니다.
- 증분 업그레이드
- 이전 마이너 버전에서 AMQ Streams를 버전 2.4로 업그레이드
- 다중 버전 업그레이드
단일 업그레이드 내의 이전 버전에서 버전 2.4로 AMQ Streams 업그레이드( 하나 이상의 중간 버전 생략).
예를 들어 AMQ Streams 2.2에서 AMQ Streams 2.4로 직접 업그레이드할 수 있습니다.
16.1.1. 지원되는 Kafka 버전 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams 업그레이드 프로세스를 시작하기 전에 업그레이드할 Kafka 버전을 결정합니다. AMQ Streams 지원 구성에서 지원되는 Kafka 버전을 검토할 수 있습니다.
- Kafka 3.4.0은 프로덕션용으로 지원됩니다.
- Kafka 3.3.1은 AMQ Streams 2.4로 업그레이드할 때만 지원됩니다.
사용 중인 AMQ Streams 버전에서 지원하는 Kafka 버전만 사용할 수 있습니다. AMQ Streams 버전에서 지원하는 경우 더 높은 Kafka 버전으로 업그레이드할 수 있습니다. 경우에 따라 이전에 지원되는 Kafka 버전으로 다운그레이드할 수도 있습니다.
16.1.2. 1.7 이전 AMQ Streams 버전에서 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
버전 1.7 이전 버전에서 AMQ Streams의 최신 버전으로 업그레이드하는 경우 다음을 수행하십시오.
- 표준 시퀀스에 따라 AMQ Streams를 버전 1.7으로 업그레이드합니다.
-
AMQ Streams와 함께 제공되는 API 변환 툴 을 사용하여 AMQ Streams 사용자 정의 리소스를
v1beta2로 변환합니다. 다음 중 하나를 수행합니다.
-
AMQ Streams 1.8로 업그레이드(
ControlPlaneListener기능 게이트가 기본적으로 비활성화되어 있는 경우) -
ControlPlaneListener기능 게이트가 비활성화되어 있는 AMQ Streams 2.0 또는 2.2(ControlPlaneListener기능 게이트가 기본적으로 활성화되어 있는 위치)로 업그레이드
-
AMQ Streams 1.8로 업그레이드(
-
ControlPlaneListener기능 게이트를 활성화합니다. - 표준 시퀀스에 따라 AMQ Streams 2.4로 업그레이드합니다.
AMQ Streams 사용자 정의 리소스는 릴리스 1.7에서 v1beta2 API 버전을 사용하기 시작했습니다. AMQ Streams 1.8 이상으로 업그레이드하기 전에 CRD 및 사용자 정의 리소스를 변환해야 합니다. API 변환 툴 사용에 대한 자세한 내용은 AMQ Streams 1.7 업그레이드 설명서 를 참조하십시오.
버전 1.7로 처음 업그레이드하는 대신 버전 1.7에서 사용자 지정 리소스를 설치한 다음 리소스를 변환할 수 있습니다.
이제 AMQ Streams에서 ControlPlaneListener 기능이 영구적으로 활성화됩니다. 비활성화된 AMQ Streams 버전으로 업그레이드한 다음 Cluster Operator 구성에서 STRIMZI_FEATURE_GATES 환경 변수를 사용하여 활성화해야 합니다.
ControlPlaneListener 기능 게이트 비활성화
env:
- name: STRIMZI_FEATURE_GATES
value: -ControlPlaneListener
ControlPlaneListener 기능 게이트 활성화
env:
- name: STRIMZI_FEATURE_GATES
value: +ControlPlaneListener
16.2. 필수 업그레이드 순서 링크 복사링크가 클립보드에 복사되었습니다!
다운타임 없이 브로커 및 클라이언트를 업그레이드하려면 AMQ Streams 업그레이드 절차를 순서대로 완료해야 합니다.
OpenShift 클러스터 버전이 지원되는지 확인합니다.
AMQ Streams 2.4는 OpenShift 4.10에서 4.13으로 지원됩니다.
다운타임을 최소화하여 OpenShift를 업그레이드 할 수 있습니다.
- Cluster Operator 업그레이드.
- 모든 Kafka 브로커 및 클라이언트 애플리케이션을 지원되는 최신 Kafka 버전으로 업그레이드 합니다.
- 선택 사항: 소비자 및 Kafka Streams 애플리케이션을 업그레이드하여 파티션 재조정에 증분 협업 재조정 프로토콜을 사용합니다.
16.3. 다운타임을 최소화하여 OpenShift 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift를 업그레이드하는 경우 OpenShift 업그레이드 설명서를 참조하여 업그레이드 경로와 노드를 올바르게 업그레이드하는 단계를 확인합니다. OpenShift를 업그레이드하기 전에 사용 중인 AMQ Streams 버전에 지원되는 버전을 확인하십시오.
업그레이드를 수행할 때 Kafka 클러스터를 계속 사용할 수 있어야 합니다.
다음 전략 중 하나를 사용할 수 있습니다.
- Pod 중단 예산 구성
다음 방법 중 하나로 Pod를 롤링합니다.
- AMQ Streams Drain cleaner 사용
- Pod에 주석을 수동으로 적용하여
Pod를 롤오버하는 방법 중 하나를 사용하기 전에 Pod 중단 예산을 구성해야 합니다.
Kafka가 작동 상태를 유지하려면 고가용성을 위해 주제도 복제해야 합니다. 이를 위해 최소 3개의 복제 요소와 최소 동기화 복제본 수를 복제 요인보다 작은 1개로 지정하는 주제 구성이 필요합니다.
고가용성을 위해 복제된 Kafka 주제
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 1
replicas: 3
config:
# ...
min.insync.replicas: 2
# ...
고가용성 환경에서 Cluster Operator는 다운타임이 발생하지 않도록 업그레이드 프로세스 중 항목에 대해 최소 수의 동기화 복제본을 유지 관리합니다.
16.3.1. AMQ Streams Drain cleaner를 사용하여 Pod 롤링 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams DrainCleaner 툴을 사용하여 업그레이드 중에 노드를 제거할 수 있습니다. AMQ Streams DrainCleaner는 롤링 업데이트 Pod 주석으로 Pod에 주석을 답니다. 그러면 제거된 Pod의 롤링 업데이트를 수행하도록 Cluster Operator에 알립니다.
Pod 중단 예산을 사용하면 지정된 시간에 지정된 수의 Pod만 사용할 수 없습니다. Kafka 브로커 Pod의 계획된 유지 관리 기간 동안 Pod 중단 예산은 Kafka가 고가용성 환경에서 계속 실행되도록 합니다.
Kafka 구성 요소에 대한 템플릿 사용자 지정을 사용하여 Pod 중단 예산을 지정합니다. 기본적으로 Pod 중단 예산을 사용하면 지정된 시간에 단일 Pod만 사용할 수 없습니다.
이렇게 하려면 maxUnavailable 을 0 (zero)으로 설정합니다. 최대 Pod 중단 예산을 0으로 줄이면 자발적으로 중단되는 것이 방지되므로 Pod를 수동으로 제거해야 합니다.
Pod 중단 예산 지정
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
template:
podDisruptionBudget:
maxUnavailable: 0
# ...
16.3.2. 주제를 사용 가능한 상태로 유지하면서 Pod 수동 롤링 링크 복사링크가 클립보드에 복사되었습니다!
업그레이드하는 동안 Cluster Operator를 통해 Pod 수동 롤링 업데이트를 트리거할 수 있습니다. Pod 리소스를 사용하여 롤링 업데이트를 통해 새 Pod로 리소스의 Pod를 재시작합니다. AMQ Streams DrainCleaner를 사용하는 것과 마찬가지로 Pod 중단 예산에 대해 maxUnavailable 값을 0으로 설정해야 합니다.
드레인해야 하는 Pod를 확인해야 합니다. 그런 다음 Pod 주석을 추가하여 업데이트합니다.
여기에서 주석은 Kafka 브로커를 업데이트합니다.
Kafka 브로커 Pod에서 수동 롤링 업데이트 수행
oc annotate pod <cluster_name>-kafka-<index> strimzi.io/manual-rolling-update=true
< ;cluster_name& gt;을 클러스터 이름으로 교체합니다. Kafka 브로커 Pod의 이름은 < cluster-name> -kafka- <index >입니다. 여기서 < index >는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다. 예: my-cluster-kafka-0.
16.4. Cluster Operator 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
동일한 방법을 사용하여 초기 배포 방법과 동일한 방법으로 Cluster Operator를 업그레이드합니다.
- 설치 파일 사용
- 설치 YAML 파일을 사용하여 Cluster Operator를 배포한 경우 설치 파일을 사용하여 Cluster Operator 업그레이드에 설명된 대로 Operator 설치 파일을 수정하여 업그레이드를 수행합니다.
- OperatorHub 사용
OperatorHub에서 AMQ Streams를 배포한 경우 OLM(Operator Lifecycle Manager)을 사용하여 AMQ Streams Operator의 업데이트 채널을 새 AMQ Streams 버전으로 변경합니다.
채널을 업데이트하면 선택한 업그레이드 전략에 따라 다음 유형의 업그레이드 중 하나가 시작됩니다.
- 자동 업그레이드가 시작됩니다.
- 설치를 시작하기 전에 승인이 필요한 수동 업그레이드
참고stable 채널에 가입하면 채널을 변경하지 않고 자동 업데이트를 받을 수 있습니다. 그러나 자동 업데이트 활성화는 사전 설치 업그레이드 단계가 누락될 가능성이 있기 때문에 권장되지 않습니다. 버전별 채널에서만 자동 업그레이드를 사용합니다.
OperatorHub를 사용하여 Operator 업그레이드에 대한 자세한 내용은 설치된 Operator(OpenShift 문서) 업그레이드를 참조하십시오.
16.4.1. Cluster Operator 업그레이드에서 Kafka 버전 오류를 반환합니다. 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator를 업그레이드하고 지원되지 않는 Kafka 버전 오류를 가져오는 경우 Kafka 클러스터 배포에는 새 Operator 버전에서 지원하지 않는 이전 Kafka 버전이 있습니다. 이 오류는 모든 설치 방법에 적용됩니다.
이 오류가 발생하면 Kafka를 지원되는 Kafka 버전으로 업그레이드합니다. Kafka 리소스의 spec.kafka.version 을 지원되는 버전으로 변경합니다.
oc 를 사용하여 Kafka 리소스의 상태에서 이와 같은 오류 메시지를 확인할 수 있습니다.
Kafka 상태 확인 오류 확인
oc get kafka <kafka_cluster_name> -n <namespace> -o jsonpath='{.status.conditions}'
< kafka_cluster_name >을 Kafka 클러스터의 이름으로 바꾸고 < namespace >를 Pod가 실행 중인 OpenShift 네임스페이스로 바꿉니다.
16.4.2. OperatorHub를 사용하여 AMQ Streams 1.7 또는 이전 버전에서 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
OperatorHub를 사용하여 AMQ Streams 1.7 또는 이전 버전에서 업그레이드하는 경우 필요한 작업
AMQ Streams Operator 를 버전 2.4로 업그레이드하기 전에 다음 사항을 변경해야 합니다.
-
사용자 정의 리소스 및 CRD를
v1beta2로 변환 -
ControlPlaneListener기능 게이트가 비활성화된 AMQ Streams 버전으로 업그레이드
이러한 요구 사항은 16.1.2절. “1.7 이전 AMQ Streams 버전에서 업그레이드” 에 설명되어 있습니다.
AMQ Streams 1.7 이상에서 업그레이드하는 경우 다음을 수행하십시오.
- AMQ Streams 1.7로 업그레이드
- AMQ Streams 소프트웨어 다운로드 페이지에서 AMQ Streams 1.8과 함께 제공되는 Red Hat AMQ Streams API Conversion Tool 을 다운로드합니다.
사용자 정의 리소스 및 CRD를
v1beta2로 변환합니다.자세한 내용은 AMQ Streams 1.7 업그레이드 설명서를 참조하십시오.
- OperatorHub에서 AMQ Streams Operator 의 1.7 버전을 삭제합니다.
또한 AMQ Streams Operator 버전 2.4를 삭제합니다.
존재하지 않는 경우 다음 단계로 이동합니다.
AMQ Streams Operator에 대한 승인 전략이 자동으로 설정된 경우 Operator의 2.4 버전이 클러스터에 이미 있을 수 있습니다. 사용자 정의 리소스 및 CRD를 릴리스 전에
v1beta2API 버전으로 변환 하지 않은 경우 Operator에서 관리하는 사용자 정의 리소스 및 CRD는 이전 API 버전을 사용합니다. 결과적으로 2.4 Operator가 Pending 상태로 유지됩니다. 이 경우 AMQ Streams Operator 버전 2.4 및 버전 1.7을 삭제해야 합니다.두 Operator를 모두 삭제하면 새 Operator 버전이 설치될 때까지 조정이 일시 중지됩니다. 사용자 정의 리소스에 대한 변경 사항이 지연되지 않도록 다음 단계를 즉시 수행합니다.
OperatorHub에서 다음 중 하나를 수행합니다.
-
AMQ Streams Operator 의 1.8 버전으로 업그레이드합니다(여기서
ControlPlaneListener기능 게이트는 기본적으로 비활성화됨). -
ControlPlaneListener 기능 게이트가 비활성화된 상태로 AMQ Streams Operator 의 버전 2.0 또는 2.2로 업그레이드(기본적으로
기능 게이트가 활성화된 경우)ControlPlaneListener
-
AMQ Streams Operator 의 1.8 버전으로 업그레이드합니다(여기서
AMQ Streams Operator 버전 2.4로 즉시 업그레이드합니다.
설치된 2.4 Operator는 클러스터를 감시하고 롤링 업데이트를 수행합니다. 이 프로세스 중에 클러스터 성능이 일시적으로 저하될 수 있습니다.
16.4.3. 설치 파일을 사용하여 Cluster Operator 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 AMQ Streams 2.4를 사용하도록 Cluster Operator 배포를 업그레이드하는 방법을 설명합니다.
설치 YAML 파일을 사용하여 Cluster Operator를 배포한 경우 다음 절차를 따르십시오.
Cluster Operator에서 관리하는 Kafka 클러스터의 가용성은 업그레이드 작업의 영향을 받지 않습니다.
해당 버전으로 업그레이드하는 방법에 대한 자세한 내용은 특정 버전의 AMQ Streams를 지원하는 설명서를 참조하십시오.
사전 요구 사항
- 기존 Cluster Operator 배포를 사용할 수 있습니다.
- AMQ Streams 2.4 릴리스 아티팩트를 다운로드 했습니다.
절차
-
기존 Cluster Operator 리소스(
/install/cluster-operator디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. 새로운 Cluster Operator 버전에서 모든 변경 사항을 덮어씁니다. - AMQ Streams 버전 2.4에서 사용할 수 있는 지원되는 구성 옵션을 반영하도록 사용자 정의 리소스를 업데이트합니다.
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
Deployment에서 하나 이상의 환경 변수를 수정한 경우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}'이미지 태그는 새 Operator 버전을 표시합니다. 예를 들면 다음과 같습니다.
registry.redhat.io/amq-streams/strimzi-kafka-34-rhel8:2.4.0
Cluster Operator가 버전 2.4로 업그레이드되었지만 관리하는 클러스터에서 실행 중인 Kafka 버전은 변경되지 않습니다.
Cluster Operator 업그레이드 후 Kafka 업그레이드를 수행해야 합니다.
16.5. AMQ Streams를 업그레이드할 때 FIPS 모드로 전환 링크 복사링크가 클립보드에 복사되었습니다!
FIPS 지원 OpenShift 클러스터에서 FIPS 모드에서 실행되도록 AMQ Streams를 업그레이드합니다. AMQ Streams 2.4까지 FIPS_MODE 환경 변수를 사용하여 FIPS 모드를 비활성화한 경우에만 FIPS 지원 OpenShift 클러스터에서 실행할 수 있었습니다. 릴리스 2.4에서 AMQ Streams는 FIPS 모드를 지원합니다. FIPS_MODE 가 비활성화된 상태로 설정된 FIPS 지원 OpenShift 클러스터에서 AMQ Streams를 실행하는 경우 이 프로세스에 따라 활성화할 수 있습니다.
사전 요구 사항
- FIPS 지원 OpenShift 클러스터
-
FIPS_MODE환경 변수가disabled로 설정된 기존 Cluster Operator 배포
절차
-
Cluster Operator를 버전 2.4 이상으로 업그레이드하지만
FIPS_MODE환경 변수를disabled로 설정합니다. 2.3 이전 AMQ Streams 버전을 처음 배포한 경우 FIPS가 활성화된 상태에서 지원되지 않는 PKCS #12 저장소에서 이전 암호화 및 다이제스트 알고리즘을 사용할 수 있습니다. 업데이트된 알고리즘으로 인증서를 재생성하려면 클러스터 및 클라이언트 CA 인증서를 갱신합니다.
-
Cluster Operator에서 생성한 CA를 갱신하려면
force-renew주석을 CA 보안에 추가하여 갱신을 트리거합니다. -
자체 CA를 갱신하려면 CA 보안에 새 인증서를 추가하고
ca-cert-generation주석을 더 높은 증분 값으로 업데이트하여 업데이트를 캡처합니다.
-
Cluster Operator에서 생성한 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 모드가 활성화된 상태에서 실행됩니다.
16.6. Kafka 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator를 2.4로 업그레이드한 다음 다음 단계는 모든 Kafka 브로커를 지원되는 최신 Kafka 버전으로 업그레이드하는 것입니다.
Kafka 브로커의 롤링 업데이트를 통해 Kafka 업그레이드는 Cluster Operator에서 수행합니다.
Cluster Operator는 Kafka 클러스터 구성을 기반으로 롤링 업데이트를 시작합니다.
Kafka.spec.kafka.config 에…이 포함된 경우 | Cluster Operator가…을 시작합니다. |
|---|---|
|
|
단일 롤링 업데이트 업데이트 후 |
|
| 롤링 업데이트 2개 |
|
| 롤링 업데이트 2개 |
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는 ZooKeeper에 대한 롤링 업데이트를 시작합니다.
- 단일 롤링 업데이트는 ZooKeeper 버전이 변경되지 않은 경우에도 발생합니다.
- 새로운 버전의 Kafka에 새로운 ZooKeeper 버전이 필요한 경우 추가 롤링 업데이트가 수행됩니다.
16.6.1. Kafka 버전 링크 복사링크가 클립보드에 복사되었습니다!
Kafka의 로그 메시지 형식 버전 및broker 간 프로토콜 버전은 각각 메시지에 추가된 로그 형식 버전 및 클러스터에 사용된 Kafka 프로토콜 버전을 지정합니다. 올바른 버전을 사용하려면 업그레이드 프로세스에는 기존 Kafka 브로커를 구성하고 클라이언트 애플리케이션(소유자 및 생산자)에 대한 코드를 변경해야 합니다.
다음 표는 Kafka 버전의 차이점을 보여줍니다.
| AMQ Streams 버전 | Kafka 버전 | inter-broker 프로토콜 버전 | 로그 메시지 형식 버전 | zookeeper 버전 |
|---|---|---|---|---|
| 2.4 | 3.4.0 | 3.4 | 3.4 | 3.6.3 |
| 2.3 | 3.3.1 | 3.3 | 3.3 | 3.6.3 |
AMQ Streams 2.4에서는 Kafka 3.4.0을 사용하지만 업그레이드를 위해 Kafka 3.3.1도 지원됩니다.
inter-broker 프로토콜 버전
Kafka에서broker 간 통신에 사용되는 네트워크 프로토콜을 인스턴스 간 프로토콜 이라고 합니다. Kafka의 각 버전에는broker 간 프로토콜의 호환 버전이 있습니다. 프로토콜의 마이너 버전은 일반적으로 이전 표에 표시된 Kafka의 마이너 버전과 일치하도록 증가합니다.
inter-broker 프로토콜 버전은 Kafka 리소스에서 cluster wide을 설정합니다. 이를 변경하려면 Kafka.spec.kafka.config 에서 inter.broker.protocol.version 속성을 편집합니다.
로그 메시지 형식 버전
생산자가 Kafka 브로커에 메시지를 보내면 특정 형식을 사용하여 메시지가 인코딩됩니다. 형식은 Kafka 릴리스 간에 변경될 수 있으므로 메시지는 인코딩된 메시지 형식의 버전을 지정합니다.
특정 메시지 형식 버전을 설정하는 데 사용되는 속성은 다음과 같습니다.
-
topic의
message.format.version속성 -
Kafka 브로커의
log.message.format.version속성
Kafka 3.0.0에서 메시지 형식 버전 값은 inter.broker.protocol.version 과 일치하는 것으로 간주되며 설정할 필요가 없습니다. 값은 사용된 Kafka 버전을 반영합니다.
Kafka 3.0.0 이상으로 업그레이드할 때 inter.broker.protocol.version 을 업데이트할 때 이러한 설정을 제거할 수 있습니다. 그렇지 않으면 업그레이드할 Kafka 버전에 따라 메시지 형식 버전을 설정합니다.
항목에 대한 message.format.version 의 기본값은 Kafka 브로커에 설정된 log.message.format.version 에 의해 정의됩니다. 주제 구성을 수정하여 topic.version of a topic를 수동으로 설정할 수 있습니다.
16.6.2. 클라이언트 업그레이드 전략 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 클라이언트를 업그레이드하면 새 버전의 Kafka에 도입된 기능, 수정 사항 및 개선 사항의 이점을 누릴 수 있습니다. 업그레이드된 클라이언트는 다른 업그레이드된 Kafka 구성 요소와의 호환성을 유지합니다. 클라이언트의 성능과 안정성도 향상될 수 있습니다.
Kafka 클라이언트 및 브로커를 업그레이드하여 원활하게 전환하는 데 가장 적합한 접근 방법을 고려하십시오. 선택한 업그레이드 전략은 브로커 또는 클라이언트를 먼저 업그레이드하는지 여부에 따라 달라집니다. Kafka 3.0부터 브로커와 클라이언트를 순서에 상관없이 독립적으로 업그레이드할 수 있습니다. 클라이언트 또는 브로커 업그레이드 결정은 먼저 업그레이드해야 하는 애플리케이션 수와 허용 가능한 다운타임과 같은 몇 가지 요인에 따라 달라집니다.
브로커 전에 클라이언트를 업그레이드하는 경우 일부 새로운 기능은 브로커가 아직 지원하지 않기 때문에 작동하지 않을 수 있습니다. 그러나 브로커는 다른 버전으로 실행되는 생산자 및 소비자를 처리하고 다른 로그 메시지 버전을 지원할 수 있습니다.
Kafka 3.0 이전 버전을 사용할 때 클라이언트 업그레이드
Kafka 3.0 이전에는 log.message.format.version 속성(또는 주제 수준의 message.format.version 속성)을 사용하여 브로커에 대해 특정 메시지 형식을 구성합니다. 이로 인해 브로커는 오래된 메시지 형식을 사용하는 이전 Kafka 클라이언트를 지원할 수 있었습니다. 그렇지 않으면 브로커는 상당한 성능 비용으로 제공된 이전 클라이언트의 메시지를 변환해야합니다.
Apache Kafka Java 클라이언트는 버전 0.11 이후의 최신 메시지 형식 버전을 지원했습니다. 모든 클라이언트가 최신 메시지 버전을 사용하는 경우 브로커를 업그레이드할 때 log.message.format.version 또는 message.format.version 덮어쓰기를 제거할 수 있습니다.
그러나 이전 메시지 형식 버전을 사용하는 클라이언트가 있는 경우 먼저 클라이언트를 업그레이드하는 것이 좋습니다. 소비자와 함께 시작한 다음 브로커를 업그레이드할 때 log.message.format.version 또는 message.format.version 을 제거하기 전에 생산자를 업그레이드하십시오. 이를 통해 모든 클라이언트가 최신 메시지 형식 버전을 지원할 수 있으며 업그레이드 프로세스가 원활하게 수행됩니다.
이 메트릭을 사용하여 Kafka 클라이언트 이름 및 버전을 추적할 수 있습니다.
-
Kafka.server:type=socket-server-metrics,clientSoftwareName=<name>,clientSoftwareVersion=<version>,listener=<listener>,networkProcessor=<processor>
다음 Kafka 브로커 메트릭은 메시지 down-conversion의 성능을 모니터링하는 데 도움이 됩니다.
-
Kafka
.network:type=RequestMetrics,name=MessageConversionsTimeMs,request={Produce|Fetch}는 메시지 변환을 수행하는 데 걸리는 시간에 대한 메트릭을 제공합니다. -
Kafka
.server:type=BrokerTopicMetrics,name={Produce|Fetch}MessageConversionsPerSec,topic=([-.w]+)는 일정 기간 동안 변환된 메시지 수에 대한 지표를 제공합니다.
16.6.3. Kafka 버전 및 이미지 매핑 링크 복사링크가 클립보드에 복사되었습니다!
Kafka를 업그레이드할 때 STRIMZI_KAFKA_IMAGES 환경 변수 및 Kafka.spec.kafka.version 속성에 대한 설정을 고려하십시오.
-
각
Kafka리소스는Kafka.spec.kafka.version을 사용하여 구성할 수 있습니다. Cluster Operator의
STRIMZI_KAFKA_IMAGES환경 변수는 Kafka 버전과 해당 버전이 지정된Kafka리소스에서 요청할 때 사용할 이미지 간 매핑을 제공합니다.-
Kafka.spec.kafka.image가 구성되지 않은 경우 지정된 버전의 기본 이미지가 사용됩니다. -
Kafka.spec.kafka.image가 구성된 경우 기본 이미지가 재정의됩니다.
-
Cluster Operator는 이미지에 실제로 예상 버전의 Kafka 브로커가 포함되어 있는지 확인할 수 없습니다. 지정된 이미지가 지정된 Kafka 버전에 해당하는지 확인합니다.
16.6.4. Kafka 브로커 및 클라이언트 애플리케이션 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams Kafka 클러스터를 지원되는 최신 Kafka 버전 및 broker 간 프로토콜 버전으로 업그레이드합니다.
또한 클라이언트 업그레이드를 위한 전략을 선택해야 합니다. Kafka 클라이언트는 이 절차의 6단계에서 업그레이드됩니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
-
AMQ Streams Kafka 클러스터를 업그레이드하기 전에 Kafka 리소스의
Kafka.spec.kafka.config속성에 새Kafka버전에서 지원되지 않는 설정 옵션이 포함되어 있지 않은지 확인합니다.
절차
Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka <my_cluster>구성된 경우
inter.broker.protocol.version및log.message.format.version속성이 현재 버전으로 설정되어 있는지 확인합니다.예를 들어 Kafka 버전 3.3.1에서 3.4.0으로 업그레이드하는 경우 현재 버전은 3.3입니다.
kind: Kafka spec: # ... kafka: version: 3.3.1 config: log.message.format.version: "3.3" inter.broker.protocol.version: "3.3" # ...log.message.format.version및inter.broker.protocol.version이 구성되지 않은 경우 AMQ 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.3.1에서 3.4.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.4.01 config: log.message.format.version: "3.3"2 inter.broker.protocol.version: "3.3"3 # ...주의새 Kafka 버전의
inter.broker.protocol.version이 변경되면 Kafka를 다운그레이드할 수 없습니다. The inter-broker protocol version determines the schemas used for persistent metadata stored by the broker, including messages written to__consumer_offsets. 다운그레이드된 클러스터는 메시지를 이해할 수 없습니다.Kafka 클러스터의 이미지가 Kafka 사용자 정의 리소스인
Kafka.spec.kafka.에 정의된 경우 새 Kafka 버전이 있는 컨테이너 이미지를 가리키도록 이미지를 업데이트합니다.image편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
Pod 상태 전환을 확인하여 롤링 업데이트의 진행 상황을 확인합니다.
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'롤링 업데이트를 통해 각 Pod가 새 Kafka 버전에 브로커 바이너리를 사용하고 있는지 확인합니다.
클라이언트 업그레이드를 위한 선택한 전략에 따라 모든 클라이언트 애플리케이션을 업그레이드하여 새 버전의 클라이언트 바이너리를 사용합니다.
필요한 경우 Kafka Connect 및 MirrorMaker의
version속성을 Kafka의 새 버전으로 설정합니다.-
Kafka Connect의 경우
KafkaConnect.spec.version을 업데이트합니다. -
MirrorMaker의 경우
KafkaMirrorMaker.spec.version을 업데이트합니다. -
MirrorMaker 2의 경우
KafkaMirrorMaker2.spec.version을 업데이트합니다.
-
Kafka Connect의 경우
구성된 경우 새
inter.broker.protocol.version버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 9 단계로 이동합니다.예를 들어 Kafka 3.4.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.4.0 config: log.message.format.version: "3.3" inter.broker.protocol.version: "3.4" # ...- Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
구성된 경우 새
log.message.format.version버전을 사용하도록 Kafka 리소스를 업데이트합니다. 그렇지 않으면 10 단계로 이동합니다.예를 들어 Kafka 3.4.0으로 업그레이드하는 경우 다음을 수행합니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.4.0 config: log.message.format.version: "3.4" inter.broker.protocol.version: "3.4" # ...중요Kafka 3.0.0에서
inter.broker.protocol.version이3.0이상으로 설정되면log.message.format.version옵션이 무시되고 설정할 필요가 없습니다.Cluster Operator가 클러스터를 업데이트할 때까지 기다립니다.
- Kafka 클러스터 및 클라이언트는 이제 새 Kafka 버전을 사용합니다.
- 브로커는 inter-broker 프로토콜 버전과 Kafka의 새 버전의 메시지 형식 버전을 사용하여 메시지를 전송하도록 구성됩니다.
필요한 경우 Kafka 업그레이드 후 증분 협력 재조정 프로토콜을 사용하도록 소비자를 업그레이드 할 수 있습니다.
16.7. 소비자를 협업 재조정으로 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 소비자 및 Kafka Streams 애플리케이션을 업그레이드하여 기본 성능 재조정 프로토콜 대신 파티션 재조정에 증분 협업 재조정 프로토콜을 사용할 수 있습니다. 새 프로토콜은 Kafka 2.4.0에 추가되었습니다.
소비자는 파티션 할당을 협력적인 리밸런스(cooperative rebalance)로 유지하고, 균형 잡힌 클러스터를 달성하는 데 필요한 경우 프로세스의 마지막에만 파티션 할당을 취소합니다. 이렇게 하면 소비자 그룹 또는 Kafka Streams 애플리케이션의 사용할 수 없게 됩니다.
증분 협업 재조정 프로토콜로 업그레이드하는 것은 선택 사항입니다. eager rebalance 프로토콜은 계속 지원됩니다.
사전 요구 사항
절차
증분 협업 재조정 프로토콜을 사용하도록 Kafka 소비자를 업그레이드하려면 다음을 수행합니다.
-
Kafka 클라이언트
.jar파일을 새 버전으로 교체합니다. -
소비자 구성에서
파티션.assignment.strategy에cooperative-sticky를 추가합니다. 예를 들어범위전략이 설정된 경우 구성을cooperative-sticky로 변경합니다. - 그룹의 각 소비자를 차례로 재시작하고 사용자가 다시 시작한 후 그룹에 다시 참여할 때까지 기다립니다.
-
소비자 구성에서 이전
partition.assignment.strategy를 제거하여 그룹의 각 소비자를 재구성하고cooperative-sticky전략만 남습니다. - 그룹의 각 소비자를 차례로 재시작하고 사용자가 다시 시작한 후 그룹에 다시 참여할 때까지 기다립니다.
증분 공동 조정 프로토콜을 사용하도록 Kafka Streams 애플리케이션을 업그레이드하려면 다음을 수행합니다.
-
Kafka Streams
.jar파일을 새 버전으로 교체합니다. -
Kafka Streams 구성에서
upgrade.from구성 매개변수를 업그레이드 중인 Kafka 버전(예: 2.3)으로 설정합니다. - 각 스트림 프로세서(노드)를 차례로 다시 시작합니다.
-
Kafka Streams 구성에서
upgrade.from구성 매개변수를 제거합니다. - 그룹의 각 소비자를 차례로 다시 시작합니다.
17장. AMQ Streams 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
업그레이드한 AMQ Streams 버전에 문제가 발생하면 이전 버전으로 설치를 되돌릴 수 있습니다.
YAML 설치 파일을 사용하여 AMQ Streams를 설치한 경우 이전 릴리스의 YAML 설치 파일을 사용하여 다음 다운그레이드 절차를 수행할 수 있습니다.
이전 AMQ Streams 버전이 사용 중인 Kafka 버전을 지원하지 않는 경우 메시지에 추가된 로그 메시지 형식 버전이 일치하는 경우 Kafka를 다운그레이드할 수도 있습니다.
다음 다운그레이드 지침은 설치 파일을 사용하여 AMQ Streams를 설치한 경우에만 적합합니다. OperatorHub와 같은 다른 방법을 사용하여 AMQ Streams를 설치한 경우 문서에 지정하지 않는 한 해당 방법으로 다운그레이드를 지원하지 않을 수 있습니다. 성공적으로 다운그레이드 프로세스를 유지하려면 지원되는 접근 방식을 사용해야 합니다.
17.1. Cluster Operator를 이전 버전으로 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams에 문제가 발생하면 설치를 되돌릴 수 있습니다.
다음 절차에서는 Cluster Operator 배포를 이전 버전으로 다운그레이드하는 방법을 설명합니다.
사전 요구 사항
- 기존 Cluster Operator 배포를 사용할 수 있습니다.
- 이전 버전의 설치 파일을 다운로드 했습니다.
사전 준비 사항
AMQ Streams 기능 게이트 의 다운그레이드 요구 사항을 확인합니다. 기능 게이트가 영구적으로 활성화되어 있는 경우 대상 버전으로 다운그레이드하기 전에 비활성화할 수 있는 버전으로 다운그레이드해야 할 수 있습니다.
절차
-
기존 Cluster Operator 리소스(
/install/cluster-operator디렉터리)에 대한 구성 변경 사항을 기록해 두십시오. 이전 버전의 Cluster Operator에서 모든 변경 사항을 덮어씁니다. - 사용자 정의 리소스를 복원하여 다운그레이드 중인 AMQ 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
Deployment에서 하나 이상의 환경 변수를 수정한 경우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}'이미지 태그는 새 AMQ Streams 버전과 Kafka 버전을 표시합니다. 예를 들어
NEW-STRIMZI-VERSION-kafka-CURRENT-KAFKA-VERSION입니다.
Cluster Operator가 이전 버전으로 다운그레이드되었습니다.
17.2. Kafka 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 버전 다운그레이드는 Cluster Operator에서 수행합니다.
17.2.1. 다운그레이드에 대한 Kafka 버전 호환성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 다운그레이드는 호환 현재 및 대상 Kafka 버전 및 메시지가 기록된 상태에 따라 달라집니다.
해당 버전이 해당 클러스터에서 사용된 inter.broker.protocol.version 설정을 지원하지 않는 경우 이전 Kafka 버전으로 되돌리거나 최신 log.message.format.version 을 사용하는 메시지 로그에 메시지가 추가되었습니다.
inter.broker.protocol.version 은 __consumer_offsets 에 기록된 메시지의 스키마와 같이 브로커가 저장한 영구 메타데이터에 사용되는 스키마를 결정합니다. 클러스터에서 이전에 사용된 inter.broker.protocol.version 을 이해하지 못하는 Kafka 버전으로 다운그레이드하면 브로커에서 이해할 수 없는 데이터가 발생합니다.
Kafka의 대상 다운그레이드 버전에는 다음을 수행합니다.
-
현재 버전과 동일한
log.message.format.version과 동일한 경우 브로커의 단일 롤링 재시작을 수행하여 Cluster Operator가 다운그레이드됩니다. 다른
log.message.format.version, downgrading은 실행중인 클러스터에 항상log.message.format.version이 downgraded 버전에서 사용하는 버전으로 설정된 경우에만 가능합니다. 일반적으로log.message.format.version이 변경되기 전에 업그레이드 절차가 중단된 경우에만 해당합니다. 이 경우 다운그레이드에는 다음이 필요합니다.- 두 버전의 interbroker 프로토콜이 다른 경우 브로커의 롤링 재시작 두 개
- 동일한 경우 단일 롤링 재시작
새 버전이 log.message.format.version 의 기본값을 사용하는 경우를 포함하여 이전 버전에서 지원하지 않는 log.message.format.version 을 사용한 경우 다운그레이딩이 불가능합니다. 예를 들어 log.message.format.version 이 변경되지 않았기 때문에 이 리소스는 Kafka 버전 3.3.1로 다운그레이드될 수 있습니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
# ...
kafka:
version: 3.4.0
config:
log.message.format.version: "3.3"
# ...
log.message.format.version 을 "3.4" 로 설정하거나 값이 없는 경우 다운그레이드를 사용할 수 없으므로 매개변수가 3.4의 3.4.0 브로커에 대한 기본값을 가져왔습니다.
Kafka 3.0.0에서 inter.broker.protocol.version 이 3.0 이상으로 설정되면 log.message.format.version 옵션이 무시되고 설정할 필요가 없습니다.
17.2.2. Kafka 브로커 및 클라이언트 애플리케이션 다운그레이드 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams Kafka 클러스터를 3.4.0에서 3.3.1로 다운그레이드하는 등 더 낮은 Kafka 버전으로 다운그레이드합니다.
사전 요구 사항
- Cluster Operator가 실행 중입니다.
AMQ Streams Kafka 클러스터를 다운그레이드하기 전에
Kafka리소스에 대해 다음을 확인합니다.- 중요: Kafka 버전의 호환성.
-
Kafka.spec.kafka.config에는 다운그레이드된 Kafka 버전에서 지원하지 않는 옵션이 포함되어 있지 않습니다. Kafka.spec.kafka.config에는log.message.format.version및inter.broker.protocol.version이 있습니다. 이 버전은 다운그레이드된 Kafka 버전에서 지원합니다.Kafka 3.0.0에서
inter.broker.protocol.version이3.0이상으로 설정되면log.message.format.version옵션이 무시되고 설정할 필요가 없습니다.
절차
Kafka 클러스터 구성을 업데이트합니다.
oc edit kafka KAFKA-CONFIGURATION-FILEKafka.spec.kafka.version을 변경하여 이전 버전을 지정합니다.예를 들어 Kafka 3.4.0에서 3.3.1으로 다운그레이드하는 경우:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.3.11 config: log.message.format.version: "3.3"2 inter.broker.protocol.version: "3.3"3 # ...참고log.message.format.version및inter.broker.protocol.version의 값은 해당 값이 부동 소수점 숫자로 해석되지 않도록 문자열이어야 합니다.Kafka 버전의 이미지가 Cluster Operator의
STRIMZI_KAFKA_IMAGES에 정의된 이미지와 다른 경우Kafka.spec.kafka.image를 업데이트합니다.편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
로그 또는 Pod 상태 전환을 확인하여 업데이트를 확인합니다.
oc logs -f CLUSTER-OPERATOR-POD-NAME | grep -E "Kafka version downgrade from [0-9.]+ to [0-9.]+, phase ([0-9]+) of \1 completed"oc get pod -wINFO수준 메시지가 있는지 Cluster Operator 로그를 확인합니다.Reconciliation #NUM(watch) Kafka(NAMESPACE/NAME): Kafka version downgrade from FROM-VERSION to TO-VERSION, phase 1 of 1 completed이전 버전의 클라이언트 바이너리를 사용하도록 모든 클라이언트 애플리케이션(소유자)을 다운그레이드합니다.
Kafka 클러스터 및 클라이언트는 이제 이전 Kafka 버전을 사용합니다.
주제 메타데이터 스토리지에 ZooKeeper를 사용하는 1.7 이전의 AMQ Streams 버전으로 되돌리는 경우 Kafka 클러스터에서 내부 주제 저장소 주제를 삭제합니다.
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-34-rhel8:2.4.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
18장. 대량의 메시지 처리 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams 배포에서 대량의 메시지를 처리해야 하는 경우 구성 옵션을 사용하여 처리량과 대기 시간을 최적화할 수 있습니다.
생산자 및 소비자 구성은 Kafka 브로커에 대한 요청의 크기와 빈도를 제어하는 데 도움이 될 수 있습니다. 구성 옵션에 대한 자세한 내용은 다음을 참조하십시오.
Kafka Connect 런타임 소스 커넥터(MirrorMaker 2) 및 싱크 커넥터에서 사용하는 생산자 및 소비자와 동일한 구성 옵션을 사용할 수도 있습니다.
- 소스 커넥터
- Kafka Connect 런타임의 생산자는 Kafka 클러스터로 메시지를 보냅니다.
- MirrorMaker 2의 경우 소스 시스템이 Kafka이므로 소비자는 소스 Kafka 클러스터에서 메시지를 검색합니다.
- 싱크 커넥터
- Kafka Connect 런타임의 소비자는 Kafka 클러스터에서 메시지를 검색합니다.
소비자의 경우 단일 가져오기 요청에서 가져온 데이터 양을 늘려 대기 시간을 줄일 수 있습니다. fetch.max.bytes 및 max.partition.fetch.bytes 속성을 사용하여 가져오기 요청 크기를 늘립니다. max.poll.records 속성을 사용하여 소비자 버퍼에서 반환된 메시지 수에 대한 최대 제한을 설정할 수도 있습니다.
MirrorMaker 2의 경우 소스의 메시지를 가져오는 특정 소비자와 관련된 소스 커넥터 수준(consumer.*)에서 , fetch.max.bytes max.poll.records 값을 구성합니다.
생산자의 경우 단일 생성 요청에 전송된 메시지 일괄 처리 크기를 늘릴 수 있습니다. batch.size 속성을 사용하여 배치 크기를 늘립니다. 배치 크기가 클수록 전송 준비가 된 미결 메시지 수와 메시지 큐의 백로그 크기를 줄일 수 있습니다. 동일한 파티션에 전송되는 메시지가 함께 배치됩니다. 배치 크기에 도달하면 생성 요청이 대상 클러스터로 전송됩니다. 배치 크기를 늘리면 생성 요청이 지연되고 더 많은 메시지가 일괄 처리에 추가되어 브로커에게 동시에 전송됩니다. 이렇게 하면 많은 수의 메시지를 처리하는 몇 가지 주제 파티션이 있는 경우 처리량이 향상될 수 있습니다.
생산자가 적절한 생산자 배치 크기에 대해 처리하는 레코드의 수와 크기를 고려합니다.
linger.ms 를 사용하여 생산자 로드가 감소할 때 요청을 지연하기 위해 대기 시간을 밀리초 단위로 추가합니다. 지연은 최대 배치 크기 미만인 경우 배치에 더 많은 레코드를 추가할 수 있음을 의미합니다.
대상 Kafka 클러스터로 메시지를 보내는 특정 생산자와 관련된 소스 커넥터 수준(producer.override.*)에서 batch.size 및 linger.ms 값을 구성합니다.
Kafka Connect 소스 커넥터의 경우 대상 Kafka 클러스터에 대한 데이터 스트리밍 파이프라인은 다음과 같습니다.
Kafka Connect 소스 커넥터의 데이터 스트리밍 파이프라인
외부 데이터 소스 → (Kafka Connect 작업) 소스 메시지 큐 → 생산자 버퍼 → 대상 Kafka 주제
Kafka Connect 싱크 커넥터의 경우 대상 외부 데이터 소스에 대한 데이터 스트리밍 파이프라인은 다음과 같습니다.
Kafka Connect 싱크 커넥터의 데이터 스트리밍 파이프라인
소스 Kafka 주제 → (Kafka Connect 작업) 싱크 메시지 큐 → 소비자 버퍼 → 외부 데이터 소스
MirrorMaker 2의 경우 대상 Kafka 클러스터에 대한 데이터 미러링 파이프라인은 다음과 같습니다.
MirrorMaker 2의 데이터 미러링 파이프라인
소스 Kafka 주제 → (Kafka Connect 작업) 소스 메시지 큐 → 생산자 버퍼 → 대상 Kafka 주제
생산자는 버퍼의 메시지를 대상 Kafka 클러스터의 항목으로 보냅니다. 이러한 상황이 발생하는 동안 Kafka Connect 작업은 데이터 소스를 계속 폴링하여 소스 메시지 큐에 메시지를 추가합니다.
소스 커넥터의 생산자 버퍼 크기는 producer.override.buffer.memory 속성을 사용하여 설정됩니다. 작업은 버퍼가 플러시되기 전에 지정된 시간 초과 기간(offset.flush.timeout.ms)을 기다립니다. 이는 전송된 메시지가 브로커에 의해 승인되고 커밋된 데이터를 오프셋할 수 있는 충분한 시간이어야 합니다. 소스 작업에서는 종료 중을 제외하고 생산자가 오프셋을 커밋하기 전에 메시지 큐를 비우기를 기다리지 않습니다.
생산자가 소스 메시지 큐의 메시지 처리량을 유지할 수 없는 경우 max.block.ms 에 의해 바인딩된 시간 내에 버퍼에 사용 가능한 공간이 있을 때까지 버퍼가 차단됩니다. 이 기간 동안 버퍼에 아직 승인되지 않은 모든 메시지가 전송됩니다. 이러한 메시지가 승인되고 플러시될 때까지 새 메시지가 버퍼에 추가되지 않습니다.
다음 구성 변경을 시도하여 미해결 메시지의 기본 소스 메시지 대기열을 관리 가능한 크기로 유지할 수 있습니다.
-
offset.flush.timeout.ms의 기본값(밀리초)을 늘립니다. - CPU 및 메모리 리소스가 충분한지 확인
다음을 수행하여 병렬로 실행되는 작업 수를 늘립니다.
-
tasksMax속성을 사용하여 병렬로 실행되는 작업 수 늘리기 -
replicas속성을 사용하여 작업을 실행하는 작업자 노드 수 늘리기
-
사용 가능한 CPU 및 메모리 리소스 및 작업자 노드 수에 따라 병렬로 실행할 수 있는 작업 수를 고려하십시오. 원하는 효과가 있을 때까지 구성 값을 계속 조정해야 할 수 있습니다.
18.1. 대용량 메시지에 대한 Kafka Connect 구성 링크 복사링크가 클립보드에 복사되었습니다!
Kafka Connect가 소스 외부 데이터 시스템에서 데이터를 가져와서 Kafka Connect 런타임 생산자에 전달하여 대상 클러스터에 복제되도록 합니다.
다음 예제는 KafkaConnect 사용자 정의 리소스를 사용하는 Kafka Connect 구성을 보여줍니다.
대량의 메시지를 처리하기 위한 Kafka Connect 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect-cluster
annotations:
strimzi.io/use-connector-resources: "true"
spec:
replicas: 3
config:
offset.flush.timeout.ms: 10000
# ...
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
# ...
KafkaConnector 사용자 정의 리소스를 사용하여 관리하는 소스 커넥터에 대한 생산자 구성이 추가됩니다.
대량의 메시지를 처리하기 위한 소스 커넥터 구성 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
name: my-source-connector
labels:
strimzi.io/cluster: my-connect-cluster
spec:
class: org.apache.kafka.connect.file.FileStreamSourceConnector
tasksMax: 2
config:
producer.override.batch.size: 327680
producer.override.linger.ms: 100
# ...
ScanSettingSourceConnector 및 ScanSettingSinkConnector 는 예제 커넥터로 제공됩니다. KafkaConnector 리소스로 배포하는 방법에 대한 자세한 내용은 6.4.3.3절. “KafkaConnector 리소스 배포” 을 참조하십시오.
싱크 커넥터에 대한 소비자 구성이 추가되었습니다.
대량의 메시지를 처리하기 위한 싱크 커넥터 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
name: my-sink-connector
labels:
strimzi.io/cluster: my-connect-cluster
spec:
class: org.apache.kafka.connect.file.FileStreamSinkConnector
tasksMax: 2
config:
consumer.fetch.max.bytes: 52428800
consumer.max.partition.fetch.bytes: 1048576
consumer.max.poll.records: 500
# ...
KafkaConnector 사용자 지정 리소스 대신 Kafka Connect API를 사용하여 커넥터를 관리하는 경우 커넥터 구성을 JSON 오브젝트로 추가할 수 있습니다.
대량의 메시지를 처리하기 위한 소스 커넥터 구성 추가에 대한 curl 요청의 예
curl -X POST \
http://my-connect-cluster-connect-api:8083/connectors \
-H 'Content-Type: application/json' \
-d '{ "name": "my-source-connector",
"config":
{
"connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector",
"file": "/opt/kafka/LICENSE",
"topic":"my-topic",
"tasksMax": "4",
"type": "source"
"producer.override.batch.size": 327680
"producer.override.linger.ms": 100
}
}'
18.2. 대량의 메시지를 위한 MirrorMaker 2 구성 링크 복사링크가 클립보드에 복사되었습니다!
MirrorMaker 2는 소스 클러스터에서 데이터를 가져와서 Kafka Connect 런타임 생산자에 전달하여 대상 클러스터에 복제됩니다.
다음 예제에서는 KafkaMirrorMaker2 사용자 정의 리소스를 사용하는 MirrorMaker 2의 구성을 보여줍니다.
대량의 메시지를 처리하기 위한 MirrorMaker 2 구성의 예
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
version: 3.4.0
replicas: 1
connectCluster: "my-cluster-target"
clusters:
- alias: "my-cluster-source"
bootstrapServers: my-cluster-source-kafka-bootstrap:9092
- alias: "my-cluster-target"
config:
offset.flush.timeout.ms: 10000
bootstrapServers: my-cluster-target-kafka-bootstrap:9092
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector:
tasksMax: 2
config:
producer.override.batch.size: 327680
producer.override.linger.ms: 100
consumer.fetch.max.bytes: 52428800
consumer.max.partition.fetch.bytes: 1048576
consumer.max.poll.records: 500
# ...
resources:
requests:
cpu: "1"
memory: Gi
limits:
cpu: "2"
memory: 4Gi
18.3. MirrorMaker 2 메시지 흐름 확인 링크 복사링크가 클립보드에 복사되었습니다!
Prometheus 및 Grafana를 사용하여 배포를 모니터링하는 경우 MirrorMaker 2 메시지 흐름을 확인할 수 있습니다.
AMQ Streams와 함께 제공되는 MirrorMaker 2 Grafana 대시보드 예제에는 플러시 파이프라인과 관련된 다음 메트릭이 표시되어 있습니다.
- Kafka Connect의 미결 메시지 큐의 메시지 수
- 생산자 버퍼의 사용 가능한 바이트
- 오프셋 커밋 타임아웃(밀리초)
이러한 메트릭을 사용하여 메시지 볼륨에 따라 구성을 조정할 필요가 있는지 여부를 평가할 수 있습니다.
19장. Kafka 재시작에 대한 정보 검색 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 OpenShift 클러스터에서 Kafka Pod를 다시 시작한 후 Pod가 재시작되는 이유를 설명하는 Pod의 네임스페이스로 OpenShift 이벤트를 내보냅니다. 클러스터 동작을 이해하는 데 도움이 필요한 경우 명령줄에서 재시작 이벤트를 확인할 수 있습니다.
Prometheus와 같은 메트릭 수집 툴을 사용하여 재시작 이벤트를 내보내고 모니터링할 수 있습니다. 출력을 적절한 형식으로 내보낼 수 있는 이벤트 내보내기와 함께 메트릭 툴을 사용합니다.
19.1. 재시작 이벤트의 이유 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator는 특정 이유로 재시작 이벤트를 시작합니다. 재시작 이벤트에 대한 정보를 가져와서 이유를 확인할 수 있습니다.
지정된 이유는 Pod 생성 및 관리에 StrimziPodSet 또는 StatefulSet 리소스를 사용 중인지 여부에 따라 달라집니다.
| StrimziPodSet | StatefulSet | 설명 |
|---|---|---|
| CaCertHasOldGeneration | CaCertHasOldGeneration | Pod는 여전히 이전 CA로 서명된 서버 인증서를 사용하고 있으므로 인증서 업데이트의 일부로 다시 시작해야 합니다. |
| CaCertRemoved | CaCertRemoved | 만료된 CA 인증서가 제거되었으며 Pod가 현재 인증서와 함께 실행되도록 다시 시작됩니다. |
| CaCertRenewed | CaCertRenewed | CA 인증서가 갱신되었으며 Pod가 업데이트된 인증서와 함께 실행되도록 다시 시작됩니다. |
| ClientCaCertKeyReplaced | ClientCaCertKeyReplaced | 클라이언트 CA 인증서에 서명하는 데 사용된 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 다시 시작됩니다. |
| ClusterCaCertKeyReplaced | ClusterCaCertKeyReplaced | 클러스터의 CA 인증서에 서명하는 데 사용된 키가 교체되었으며 CA 갱신 프로세스의 일부로 Pod가 재시작됩니다. |
| ConfigChangeRequiresRestart | ConfigChangeRequiresRestart | 일부 Kafka 구성 속성은 동적으로 변경되지만 다른 값은 브로커를 다시 시작해야 합니다. |
| CustomListenerCaCertChanged | CustomListenerCaCertChanged | Kafka 네트워크 리스너를 보호하는 데 사용되는 CA 인증서가 변경되었으며 이를 사용하도록 Pod가 다시 시작됩니다. |
| FileSystemResizeNeeded | FileSystemResizeNeeded | 파일 시스템 크기가 증가하고 이를 적용하려면 다시 시작해야 합니다. |
| KafkaCertificatesChanged | KafkaCertificatesChanged | Kafka 브로커가 사용하는 하나 이상의 TLS 인증서가 업데이트되었으며 이를 사용하려면 재시작이 필요합니다. |
| ManualRollingUpdate | ManualRollingUpdate |
재시작을 트리거하기 위해 Pod 또는 |
| PodForceRestartOnError | PodForceRestartOnError | Pod를 다시 시작하여 수정해야 하는 오류가 발생했습니다. |
| PodHasOldRevision | JbodVolumesChanged |
Kafka 볼륨에서 디스크가 추가 또는 제거되었으며 변경 사항을 적용하려면 재시작이 필요합니다. |
| PodHasOldRevision | PodHasOldGeneration |
Pod가 의 멤버인 |
| PodStuck | PodStuck | Pod는 여전히 보류 중이며 예약되지 않았거나 예약할 수 없으므로 Operator에서 Pod를 마지막 시도에서 재시작했습니다. |
| PodUnresponsive | PodUnresponsive | AMQ Streams는 Pod에 연결할 수 없어 브로커가 올바르게 시작되지 않음을 나타낼 수 있으므로 Operator에서 문제를 해결하려고 시도합니다. |
19.2. 이벤트 필터 재시작 링크 복사링크가 클립보드에 복사되었습니다!
명령줄에서 재시작 이벤트를 확인할 때 OpenShift 이벤트 필드에서 필터링할 필드 선택기 를 지정할 수 있습니다.
필드 선택기로 이벤트를 필터링하는 경우 다음 필드 를 사용할 수 있습니다.
regardingObject.kind-
다시 시작한 오브젝트와 재시작 이벤트의 경우 kind는 항상
Pod입니다. regarding.namespace- Pod가 속한 네임스페이스입니다.
regardingObject.name-
Pod의 이름입니다(예:
strimzi-cluster-kafka-0). regardingObject.uid- Pod의 고유 ID입니다.
reason-
pod가 재시작된 이유(예:
JbodVolumesChanged). reportingController-
보고 구성 요소는 항상 AMQ Streams 재시작 이벤트용으로
strimzi.io/cluster-operator입니다. source-
Source는reportingController의 이전 버전입니다. 보고 구성 요소는 항상 AMQ Streams 재시작 이벤트용으로strimzi.io/cluster-operator입니다. type-
Warning또는Normal인 이벤트 유형입니다. AMQ Streams 재시작 이벤트의 경우 유형은Normal입니다.
이전 버전의 OpenShift에서는 접두사를 사용하는 필드에 대신 involvedObject 접두사가 사용될 수 있습니다. reportingController 는 이전에 reportingComponent 라고 했습니다.
19.3. Kafka 재시작 확인 링크 복사링크가 클립보드에 복사되었습니다!
oc 명령을 사용하여 Cluster Operator에서 시작한 재시작 이벤트를 나열합니다. reportingController 또는 소스 이벤트 필드를 사용하여 Cluster Operator를 보고 구성 요소로 설정하여 Cluster Operator에서 내보내는 재시작 이벤트를 필터링합니다.
사전 요구 사항
- Cluster Operator가 OpenShift 클러스터에서 실행 중입니다.
절차
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 -
source
20장. AMQ Streams 관리 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams를 관리하려면 Kafka 클러스터 및 관련 리소스를 원활하게 실행하기 위해 다양한 작업을 수행해야 합니다. oc 명령을 사용하여 리소스 상태를 확인하고, 롤링 업데이트를 위한 유지 관리 창을 구성하고, AMQ Streams Drain cleaner 및 Kafka Static Quota 플러그인과 같은 툴을 활용하여 배포를 효과적으로 관리합니다.
20.1. 사용자 정의 리소스 작업 링크 복사링크가 클립보드에 복사되었습니다!
oc 명령을 사용하여 AMQ Streams 사용자 정의 리소스에서 정보를 검색하고 다른 작업을 수행할 수 있습니다.
사용자 정의 리소스의 status 하위 리소스와 함께 oc 를 사용하면 리소스에 대한 정보를 가져올 수 있습니다.
20.1.1. 사용자 정의 리소스에서 oc 작업 수행 링크 복사링크가 클립보드에 복사되었습니다!
get,describe,edit, delete 와 같은 oc 명령을 사용하여 리소스 유형에 대해 작업을 수행합니다. 예를 들어 oc get kafkatopics 는 모든 Kafka 주제 목록을 검색하고 oc get kafkas 는 배포된 모든 Kafka 클러스터를 검색합니다.
리소스 유형을 참조할 때 단수 및 복수 이름을 모두 사용할 수 있습니다. oc get kafkas 는 oc get kafka 와 동일한 결과를 가져옵니다.
리소스의 짧은 이름을 사용할 수도 있습니다. 짧은 이름을 학습하면 AMQ Streams를 관리할 때 시간을 절약할 수 있습니다. Kafka 의 짧은 이름은 k 이므로 oc get k 를 실행하여 모든 Kafka 클러스터를 나열할 수도 있습니다.
oc get k
NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS
my-cluster 3 3
| AMQ Streams 리소스 | 긴 이름 | 짧은 이름 |
|---|---|---|
| Kafka | kafka | k |
| Kafka Topic | kafkatopic | kt |
| Kafka 사용자 | kafkauser | ku |
| Kafka Connect | kafkaconnect | kc |
| Kafka Connector | kafkaconnector | kctr |
| Kafka Mirror Maker | kafkamirrormaker | kmm |
| Kafka MirrorECDHE 2 | kafkamirrormaker2 | kmm2 |
| Kafka 브리지 | kafkabridge | kb |
| Kafka 리밸런스 | kafkarebalance | kr |
20.1.1.1. 리소스 카테고리 링크 복사링크가 클립보드에 복사되었습니다!
사용자 정의 리소스의 카테고리는 oc 명령에서도 사용할 수 있습니다.
모든 AMQ Streams 사용자 정의 리소스는 카테고리 strimzi 에 속하므로 strimzi 를 사용하여 하나의 명령으로 모든 AMQ Streams 리소스를 가져올 수 있습니다.
예를 들어 oc get strimzi 를 실행하면 지정된 네임스페이스에 모든 AMQ Streams 사용자 정의 리소스가 나열됩니다.
oc get strimzi
NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS
kafka.kafka.strimzi.io/my-cluster 3 3
NAME PARTITIONS REPLICATION FACTOR
kafkatopic.kafka.strimzi.io/kafka-apps 3 3
NAME AUTHENTICATION AUTHORIZATION
kafkauser.kafka.strimzi.io/my-user tls simple
oc get strimzi -o name 명령은 모든 리소스 유형 및 리소스 이름을 반환합니다. -o name 옵션은 type/name 형식으로 출력을 가져옵니다.
oc get strimzi -o name
kafka.kafka.strimzi.io/my-cluster
kafkatopic.kafka.strimzi.io/kafka-apps
kafkauser.kafka.strimzi.io/my-user
이 strimzi 명령을 다른 명령과 결합할 수 있습니다. 예를 들어 단일 명령에서 모든 리소스를 삭제하도록 oc delete 명령으로 전달할 수 있습니다.
oc delete $(oc get strimzi -o name)
kafka.kafka.strimzi.io "my-cluster" deleted
kafkatopic.kafka.strimzi.io "kafka-apps" deleted
kafkauser.kafka.strimzi.io "my-user" deleted
예를 들어 새로운 AMQ Streams 기능을 테스트할 때 단일 작업에서 모든 리소스를 삭제하는 것이 유용할 수 있습니다.
20.1.1.2. 하위 리소스의 상태 쿼리 링크 복사링크가 클립보드에 복사되었습니다!
-o 옵션에 전달할 수 있는 다른 값이 있습니다. 예를 들어 -o yaml 을 사용하면 YAML 형식으로 출력이 표시됩니다. -o json 을 사용하면 JSON으로 반환합니다.
oc get --help 에서 모든 옵션을 볼 수 있습니다.
가장 유용한 옵션 중 하나는 JSONPath 지원 이며, Kubernetes API를 쿼리하기 위해 JSONPath 표현식을 전달할 수 있습니다. JSONPath 표현식은 리소스의 특정 부분을 추출하거나 탐색할 수 있습니다.
예를 들어 JSONPath 표현식 {.status.listeners[?(@.name=="tls")].bootstrapServers} 를 사용하여 Kafka 사용자 정의 리소스의 상태에서 부트스트랩 주소를 가져와서 Kafka 클라이언트에서 사용할 수 있습니다.
여기에서 이 명령은 tls 라는 리스너의 bootstrapServers 값을 찾습니다.
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="tls")].bootstrapServers}{"\n"}'
my-cluster-kafka-bootstrap.myproject.svc:9093
이름 조건을 변경하면 다른 Kafka 리스너의 주소를 가져올 수도 있습니다.
jsonpath 를 사용하여 사용자 정의 리소스에서 다른 속성 또는 속성 그룹을 추출할 수 있습니다.
20.1.2. AMQ Streams 사용자 정의 리소스 상태 정보 링크 복사링크가 클립보드에 복사되었습니다!
상태 속성은 특정 사용자 지정 리소스에 대한 상태 정보를 제공합니다.
다음 표에는 상태 정보(배포 시)와 상태 속성을 정의하는 스키마를 제공하는 사용자 정의 리소스가 나열되어 있습니다.
스키마에 대한 자세한 내용은 사용자 정의 리소스 API 참조 를 참조하십시오.
| AMQ Streams 리소스 | 스키마 참조 | …에 상태 정보를 게시합니다. |
|---|---|---|
|
|
| Kafka 클러스터 |
|
|
| Kafka 클러스터의 Kafka 주제 |
|
|
| Kafka 클러스터의 Kafka 사용자 |
|
|
| Kafka Connect 클러스터 |
|
|
|
|
|
|
| Kafka MirrorMaker 2 클러스터 |
|
|
| Kafka MirrorMaker 클러스터 |
|
|
| AMQ Streams Kafka 브리지 |
|
|
| 리밸런스 상태 및 결과 |
리소스의 status 속성은 리소스 상태에 대한 정보를 제공합니다. status.conditions 및 status.observedGeneration 속성은 모든 리소스에 공통입니다.
status.conditions-
상태 조건은 리소스의 현재 상태를 설명합니다. 상태 조건 속성은
사양에지정된 구성에 정의된 대로 원하는 상태를 얻는 리소스와 관련된 진행 상황을 추적하는 데 유용합니다. 상태 조건 속성은 리소스 상태가 변경된 시간과 이유를 제공하며 Operator가 원하는 상태를 실현하는 것을 방지하거나 지연시키는 이벤트 세부 정보를 제공합니다. status.observedGeneration-
마지막으로 관찰된 생성은 Cluster Operator의 최신 리소스 조정을 나타냅니다.
observedGeneration값이metadata.generation값(현재 배포 버전)과 다른 경우 Operator는 아직 최신 업데이트를 리소스에 처리하지 않았습니다. 이러한 값이 동일하면 상태 정보는 리소스에 대한 최근 변경 사항을 반영합니다.
상태 속성에서는 리소스 관련 정보도 제공합니다. 예를 들어 KafkaStatus 는 리스너 주소 및 Kafka 클러스터의 ID를 제공합니다.
AMQ Streams는 사용자 정의 리소스의 상태를 생성하고 유지 관리하며, 주기적으로 사용자 정의 리소스의 현재 상태를 평가하고 그에 따라 해당 상태를 업데이트합니다. oc edit 를 사용하여 사용자 정의 리소스에서 업데이트를 수행할 때 (예: 해당 상태는 편집할 수 없습니다. 또한 상태를 변경하면 Kafka 클러스터의 구성에 영향을 미치지 않습니다.
여기에서 Kafka 사용자 정의 리소스의 상태 속성이 표시됩니다.
Kafka 사용자 정의 리소스 상태
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
spec:
# ...
status:
clusterId: XP9FP2P-RByvEy0W4cOEUA
conditions:
- lastTransitionTime: '2023-01-20T17:56:29.396588Z'
status: 'True'
type: Ready
listeners:
- addresses:
- host: my-cluster-kafka-bootstrap.prm-project.svc
port: 9092
bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9092'
name: plain
type: plain
- addresses:
- host: my-cluster-kafka-bootstrap.prm-project.svc
port: 9093
bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9093'
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: tls
type: tls
- addresses:
- host: >-
2054284155.us-east-2.elb.amazonaws.com
port: 9095
bootstrapServers: >-
2054284155.us-east-2.elb.amazonaws.com:9095
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: external2
type: external2
- addresses:
- host: ip-10-0-172-202.us-east-2.compute.internal
port: 31644
bootstrapServers: 'ip-10-0-172-202.us-east-2.compute.internal:31644'
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: external1
type: external1
observedGeneration: 3
상태에 나열된 Kafka 부트스트랩 주소가 해당 끝점 또는 Kafka 클러스터가 Ready 상태에 있음을 나타내는 것은 아닙니다.
상태 정보에 액세스
명령줄에서 리소스의 상태 정보에 액세스할 수 있습니다. 자세한 내용은 20.1.3절. “사용자 정의 리소스의 상태 검색”의 내용을 참조하십시오.
20.1.3. 사용자 정의 리소스의 상태 검색 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 사용자 정의 리소스의 상태를 찾는 방법을 설명합니다.
사전 요구 사항
- OpenShift 클러스터.
- Cluster Operator가 실행 중입니다.
절차
사용자 정의 리소스를 지정하고
-o jsonpath옵션을 사용하여 표준 JSONPath 표현식을 적용하여status속성을 선택합니다.oc get kafka <kafka_resource_name> -o jsonpath='{.status}'이 표현식은 지정된 사용자 정의 리소스에 대한 모든 상태 정보를 반환합니다.
status.listeners또는status.observedGeneration과 같은 점 표기법을 사용하여 원하는 상태 정보를 세부적으로 조정할 수 있습니다.
20.2. 사용자 정의 리소스 조정 일시 중지 링크 복사링크가 클립보드에 복사되었습니다!
수정 사항을 수행하거나 업데이트할 수 있도록 AMQ Streams Operator에서 관리하는 사용자 정의 리소스의 조정을 일시 중지하는 것이 유용한 경우도 있습니다. 조정이 일시 중지되면 Operator에서 일시 중지가 종료될 때까지 사용자 정의 리소스에 대한 변경 사항을 무시합니다.
사용자 정의 리소스의 조정을 일시 중지하려면 구성에서 strimzi.io/pause-reconciliation 주석을 true 로 설정합니다. 이렇게 하면 적절한 Operator가 사용자 정의 리소스의 조정을 일시 중지하도록 지시합니다. 예를 들어 KafkaConnect 리소스에 주석을 적용하여 Cluster Operator의 조정을 일시 중지할 수 있습니다.
pause 주석이 활성화된 사용자 정의 리소스도 생성할 수 있습니다. 사용자 정의 리소스가 생성되지만 무시됩니다.
사전 요구 사항
- 사용자 정의 리소스를 관리하는 AMQ Streams Operator가 실행 중입니다.
절차
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로 설정하거나 주석을 제거할 수 있습니다.
20.3. 롤링 업데이트를 위한 유지 관리 시간 링크 복사링크가 클립보드에 복사되었습니다!
유지 관리 시간 창을 사용하면 Kafka 및 ZooKeeper 클러스터의 특정 롤링 업데이트를 편리하게 시작할 수 있습니다.
20.3.1. 유지 관리 기간 개요 링크 복사링크가 클립보드에 복사되었습니다!
대부분의 경우 Cluster Operator는 해당 Kafka 리소스에 대한 변경 사항에 따라 Kafka 또는 ZooKeeper 클러스터만 업데이트합니다. 이를 통해 Kafka 리소스에 변경 사항을 적용할 시기를 계획하여 Kafka 클라이언트 애플리케이션에 미치는 영향을 최소화할 수 있습니다.
그러나 Kafka 및 ZooKeeper 클러스터에 대한 일부 업데이트는 Kafka 리소스에 대한 해당 변경없이 발생할 수 있습니다. 예를 들어 관리하는 CA(인증 기관) 인증서가 만료에 가까운 경우 Cluster Operator는 롤링 재시작을 수행해야 합니다.
Pod를 롤링 재시작하면(올바른 브로커 및 주제 구성 가정)의 가용성에 는 영향을 미치지 않지만 Kafka 클라이언트 애플리케이션의 성능에 영향을 미칠 수 있습니다. 유지 관리 시간 창을 사용하면 Kafka 및 ZooKeeper 클러스터의 다양한 롤링 업데이트를 편리하게 시작할 수 있습니다. 유지 관리 시간 창이 클러스터에 대해 구성되지 않은 경우 예측 가능한 높은 로드 기간 동안과 같이 불편한 시간에 이러한 spontaneous 롤링 업데이트가 발생할 수 있습니다.
20.3.2. 유지 관리 시간 창 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kafka.spec.maintenanceTimeWindows 속성에 문자열 배열을 입력하여 유지 관리 시간 창을 구성합니다. 각 문자열은 UTC (Coordinated Universal Time)로 해석되는 cron 표현식 입니다. 실제 용도는 Greenwich Mean Time과 동일합니다.
다음 예는 자정에 시작하고 01:59am (UTC)에 종료되는 단일 유지 관리 기간을 구성합니다. 이 기간은 연중 무휴일, 월요일, 주거장, 수요일 및 추위에 있습니다.
# ...
maintenanceTimeWindows:
- "* * 0-1 ? * SUN,MON,TUE,WED,THU *"
# ...
실제로, 구성된 유지 관리 기간 동안 필요한 CA 인증서 갱신을 완료할 수 있도록 Kafka 리소스의 Kafka.spec.clusterCa.renewalDays 및 Kafka.spec.clientsCa.renewalDays 속성과 함께 유지 관리 창을 설정해야 합니다.
AMQ Streams는 지정된 창에 따라 유지보수 작업을 정확하게 예약하지 않습니다. 대신 각 조정에 대해 유지 관리 기간이 현재 "열기"인지 확인합니다. 즉, 지정된 시간 내에 유지 관리 작업 시작이 Cluster Operator 조정 간격까지 지연될 수 있습니다. 따라서 유지 보수 시간은 적어도 이 기간이 길어야 합니다.
20.3.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>
20.4. Kafka 및 ZooKeeper 클러스터의 롤링 업데이트 수동 시작 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 리소스의 주석을 사용하여 Cluster Operator를 통해 Kafka 및 ZooKeeper 클러스터의 롤링 업데이트를 수동으로 트리거할 수 있습니다. 롤링 업데이트는 새 리소스 Pod를 다시 시작합니다.
일반적으로 특정 Pod 또는 Pod 세트에서 롤링 업데이트를 수동으로 수행하는 것은 예외적인 경우에만 필요합니다. 그러나 Pod를 직접 삭제하는 대신 Cluster Operator를 통해 롤링 업데이트를 수행하는 경우 다음을 확인합니다.
- Pod의 수동 삭제는 다른 Pod를 병렬로 삭제하는 등 동시 Cluster Operator 작업과 충돌하지 않습니다.
- Cluster Operator 논리는 in-sync 복제본 수와 같은 Kafka 구성 사양을 처리합니다.
20.4.1. Pod 관리 주석을 사용하여 롤링 업데이트 수행 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Kafka 클러스터 또는 ZooKeeper 클러스터의 롤링 업데이트를 트리거하는 방법을 설명합니다.
업데이트를 트리거하려면 클러스터에서 실행 중인 Pod를 관리하는 데 사용 중인 리소스에 주석을 추가합니다. StatefulSet 또는 StrimziPodSet 리소스 ( UseStrimziPodSets 기능 게이트를 활성화한 경우)에 주석을 답니다.
사전 요구 사항
수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator 및 Kafka 클러스터가 필요합니다.
절차
수동으로 업데이트하려는 Kafka 또는 ZooKeeper Pod를 제어하는 리소스의 이름을 찾습니다.
예를 들어 Kafka 클러스터의 이름이 my-cluster 인 경우 해당 이름은 my-cluster-kafka 및 my-cluster-zookeeper 입니다.
oc annotate을 사용하여 OpenShift에서 적절한 리소스에 주석을 답니다.StatefulSet에 주석을 달기
oc annotate statefulset <cluster_name>-kafka strimzi.io/manual-rolling-update=true oc annotate statefulset <cluster_name>-zookeeper strimzi.io/manual-rolling-update=trueStrimziPodSet에 주석 처리
oc annotate strimzipodset <cluster_name>-kafka strimzi.io/manual-rolling-update=true oc annotate strimzipodset <cluster_name>-zookeeper strimzi.io/manual-rolling-update=true- 다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다). 조정 프로세스에서 주석을 탐지한 한 주석이 감지되면 주석이 달린 리소스 내의 모든 Pod의 롤링 업데이트가 트리거됩니다. 모든 Pod의 롤링 업데이트가 완료되면 리소스에서 주석이 제거됩니다.
20.4.2. Pod 주석을 사용하여 롤링 업데이트 수행 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OpenShift Pod 주석을 사용하여 기존 Kafka 클러스터 또는 ZooKeeper 클러스터의 롤링 업데이트를 수동으로 트리거하는 방법을 설명합니다. 여러 Pod에 주석이 추가되면 동일한 조정 실행 내에서 연속 롤링 업데이트가 수행됩니다.
사전 요구 사항
수동 롤링 업데이트를 수행하려면 실행 중인 Cluster Operator 및 Kafka 클러스터가 필요합니다.
사용된 주제 복제 요인에 관계없이 Kafka 클러스터에서 롤링 업데이트를 수행할 수 있습니다. 그러나 Kafka가 업데이트 중에 작동을 유지하려면 다음이 필요합니다.
- 업데이트하려는 노드로 실행되는 고가용성 Kafka 클러스터 배포입니다.
고가용성을 위해 복제된 항목입니다.
주제 구성에서는 최소 3개의 복제 요소와 최소 동기화 복제본 수를 복제 요인보다 작은 1개로 지정합니다.
고가용성을 위해 복제된 Kafka 주제
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
절차
수동으로 업데이트하려는 Kafka 또는 ZooKeeper
Pod이름을 찾습니다.예를 들어 Kafka 클러스터의 이름이 my-cluster 인 경우 해당
Pod이름은 my-cluster-kafka-index 및 my-cluster-zookeeper-index 입니다. 인덱스 는 0에서 시작하여 총 복제본 수에서 1을 뺀 값입니다.OpenShift에서
포드리소스에 주석을 답니다.oc annotate:oc annotate pod cluster-name-kafka-index strimzi.io/manual-rolling-update=true oc annotate pod cluster-name-zookeeper-index strimzi.io/manual-rolling-update=true-
다음 조정이 수행될 때까지 기다립니다(기본적으로 2분 마다). 조정 프로세스에서 주석을 탐지한 경우 주석이 있는
Pod의 롤링 업데이트가 트리거됩니다. Pod의 롤링 업데이트가 완료되면Pod에서 주석이 제거됩니다.
20.5. AMQ Streams Drain cleaner를 사용하여 Pod 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 업그레이드, 유지 관리 또는 Pod 일정 변경 중에 Kafka 및 ZooKeeper Pod가 제거될 수 있습니다. Kafka 브로커 및 ZooKeeper Pod가 AMQ Streams에 의해 배포된 경우 AMQ Streams DrainCleaner 툴을 사용하여 Pod 제거를 처리할 수 있습니다. AMQ Streams DrainCleaner는 OpenShift 대신 제거를 처리합니다. Kafka 배포의 podDisruptionBudget 을 0 (0)으로 설정해야 합니다. 그러면 더 이상 OpenShift에서 포드를 자동으로 제거할 수 없습니다.
AMQ Streams DrainCleaner를 배포하면 Cluster Operator를 사용하여 OpenShift 대신 Kafka Pod를 이동할 수 있습니다. Cluster Operator는 항목이 복제되지 않도록 합니다. Kafka는 제거 프로세스 중에 계속 작동할 수 있습니다. OpenShift 작업자 노드가 연속으로 드레이닝되므로 Cluster Operator가 항목이 동기화될 때까지 기다립니다.
승인 Webhook는 Kubernetes API에 대한 Pod 제거 요청의 AMQ Streams Drain cleaner에게 알립니다. 그런 다음 AMQ Streams DrainCleaner는 드레인할 Pod에 롤링 업데이트 주석을 추가합니다. 그러면 제거된 Pod의 롤링 업데이트를 수행하도록 Cluster Operator에 알립니다.
AMQ Streams DrainCleaner를 사용하지 않는 경우 Pod 주석을 추가하여 롤링 업데이트를 수동으로 수행할 수 있습니다.
Webhook 구성
AMQ Streams DrainCleaner 배포 파일에는 ValidatingWebhookConfiguration 리소스 파일이 포함되어 있습니다. 리소스는 Webhook를 Kubernetes API에 등록하기 위한 구성을 제공합니다.
이 구성은 Pod 제거 요청 시 실행할 Kubernetes API에 대한 규칙 을 정의합니다. 규칙은 pod/eviction 하위 리소스와 관련된 CREATE 작업만 가로채도록 지정합니다. 이러한 규칙이 충족되면 API에서 알림을 전달합니다.
clientConfig 는 웹 후크를 노출하는 AMQ Streams DrainCleaner 서비스 및 /drainer 끝점을 가리킵니다. Webhook에서는 인증이 필요한 보안 TLS 연결을 사용합니다. caBundle 속성은 HTTPS 통신을 검증할 인증서 체인을 지정합니다. 인증서는 Base64로 인코딩됩니다.
Pod 제거 알림에 대한 Webhook 구성
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
# ...
webhooks:
- name: strimzi-drain-cleaner.strimzi.io
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods/eviction"]
scope: "Namespaced"
clientConfig:
service:
namespace: "strimzi-drain-cleaner"
name: "strimzi-drain-cleaner"
path: /drainer
port: 443
caBundle: Cg==
# ...
20.5.1. AMQ Streams DrainCleaner 배포 파일 다운로드 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams Drain cleaner를 배포하고 사용하려면 배포 파일을 다운로드해야 합니다.
AMQ Streams DrainCleaner 배포 파일은 AMQ Streams 소프트웨어 다운로드 페이지에서 사용할 수 있습니다.
20.5.2. 설치 파일을 사용하여 AMQ Streams DrainCleaner 배포 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams DrainCleaner를 Cluster Operator 및 Kafka 클러스터가 실행 중인 OpenShift 클러스터에 배포합니다.
사전 요구 사항
- AMQ Streams DrainCleaner 배포 파일을 다운로드 했습니다.
- 업데이트하려는 OpenShift 작업자 노드에서 실행 중인 고가용성 Kafka 클러스터 배포가 있어야 합니다.
고가용성을 위해 주제가 복제됩니다.
주제 구성에서는 최소 3개의 복제 요소와 최소 동기화 복제본 수를 복제 요인보다 작은 1개로 지정합니다.
고가용성을 위해 복제된 Kafka 주제
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
Kafka 또는 ZooKeeper 제외
Clearer 작업의 Kafka 또는 ZooKeeper Pod를 포함하지 않으려면 DrainCleaner 배포 구성 파일에서 기본 환경 변수를 변경하십시오.
-
Kafka Pod를 제외하려면
STRIMZI_DRAIN_KAFKA를false로 설정합니다. -
ZooKeeper Pod를 제외하려면
STRIMZI_DRAIN_ZOOKEEPER를false로 설정합니다.
ZooKeeper Pod를 제외하는 설정 예
apiVersion: apps/v1
kind: Deployment
spec:
# ...
template:
spec:
serviceAccountName: strimzi-drain-cleaner
containers:
- name: strimzi-drain-cleaner
# ...
env:
- name: STRIMZI_DRAIN_KAFKA
value: "true"
- name: STRIMZI_DRAIN_ZOOKEEPER
value: "false"
# ...
절차
Kafka리소스의설정을 사용하여 Kafka 배포에 대한 Pod 중단 예산을 구성합니다.템플릿Pod 중단 예산 지정
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: template: podDisruptionBudget: maxUnavailable: 0 # ... zookeeper: template: podDisruptionBudget: maxUnavailable: 0 # ...최대 Pod 중단 예산을 0으로 줄이면 자발적으로 중단되는 경우 OpenShift가 Pod를 자동으로 제거하지 못하도록 하여 AMQ Streams DrainCleaner 및 AMQ Streams Cluster Operator에서 다른 작업자 노드에서 OpenShift가 예약할 Pod를 롤포팅하도록 합니다.
AMQ Streams DrainCleaner를 사용하여 ZooKeeper 노드를 드레인하려면 ZooKeeper에 대해 동일한 구성을 추가합니다.
Kafka리소스를 업데이트합니다.oc apply -f <kafka_configuration_file>AMQ Streams Drain cleaner를 배포합니다.
OpenShift에서 DrainCleaner를 실행하려면
/install/drain-cleaner/openshift디렉터리에 리소스를 적용합니다.oc apply -f ./install/drain-cleaner/openshift
20.5.3. AMQ Streams Drain cleaner 사용 링크 복사링크가 클립보드에 복사되었습니다!
Cluster Operator와 함께 AMQ Streams DrainCleaner를 사용하여 드레인된 노드에서 Kafka 브로커 또는 ZooKeeper Pod를 이동합니다. AMQ Streams DrainCleaner를 실행하면 롤링 업데이트 Pod 주석이 있는 Pod에 주석을 추가합니다. Cluster Operator는 주석을 기반으로 롤링 업데이트를 수행합니다.
사전 요구 사항
절차
Kafka 브로커 또는 ZooKeeper Pod를 호스팅하는 지정된 OpenShift 노드를 드레이닝합니다.
oc get nodes oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --forceAMQ Streams DrainCleaner 로그에서 제거 이벤트를 확인하여 Pod에 재시작을 위해 주석이 추가되었는지 확인합니다.
AMQ Streams Drain cleaneder log show annotations of pods
INFO ... Received eviction webhook for Pod my-cluster-zookeeper-2 in namespace my-project INFO ... Pod my-cluster-zookeeper-2 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-zookeeper-2 in namespace my-project found and annotated for restart INFO ... Received eviction webhook for Pod my-cluster-kafka-0 in namespace my-project INFO ... Pod my-cluster-kafka-0 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-kafka-0 in namespace my-project found and annotated for restartCluster Operator 로그에서 조정 이벤트를 확인하여 롤링 업데이트를 확인합니다.
클러스터 Operator 로그 표시 롤링 업데이트
INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-zookeeper-2 INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-kafka-0 INFO AbstractOperator:500 - Reconciliation #13(timer) Kafka(my-project/my-cluster): reconciled
20.5.4. AMQ Streams DrainCleaner에서 사용하는 TLS 인증서 감시 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 DrainCleaner 배포는 인증에 사용하는 TLS 인증서가 포함된 시크릿을 감시합니다. Drain cleaner는 인증서 갱신과 같은 변경 사항을 조사합니다. 변경 사항을 감지하면 TLS 인증서를 다시 로드하도록 다시 시작합니다. Drain Clearer 설치 파일은 기본적으로 이 동작을 사용할 수 있습니다. 그러나 DrainCleaner 설치 파일의 배포 구성 (060- )에서 Deployment.yamlSTRIMZI_CERTIFICATE_WATCH_ENABLED 환경 변수를 false 로 설정하여 인증서 감시를 비활성화할 수 있습니다.
STRIMZI_CERTIFICATE_WATCH_ENABLED 를 활성화하면 다음 환경 변수를 사용하여 TLS 인증서를 감시할 수도 있습니다.
| 환경 변수 | 설명 | Default |
|---|---|---|
|
| 인증서 감시를 활성화하거나 비활성화합니다. |
|
|
| DrainCleaner가 배포되고 인증서 보안이 존재하는 네임스페이스 |
|
|
| 드레인 클리너 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 을 구성합니다.
20.6. 레이블 및 주석을 사용하여 서비스 검색 링크 복사링크가 클립보드에 복사되었습니다!
서비스 검색을 사용하면 AMQ Streams와 동일한 OpenShift 클러스터에서 실행되는 클라이언트 애플리케이션이 Kafka 클러스터와 상호 작용할 수 있습니다.
Kafka 클러스터에 액세스하는 데 사용되는 서비스에 대해 서비스 검색 레이블 및 주석이 생성됩니다.
- 내부 Kafka 부트스트랩 서비스
- HTTP 브리지 서비스
레이블은 서비스를 검색 가능하게 하는 데 도움이 되며, 주석은 클라이언트 애플리케이션에서 연결하는 데 사용할 수 있는 연결 세부 정보를 제공합니다.
서비스 검색 레이블인 strimzi.io/discovery 는 서비스 리소스에 대해 true 로 설정됩니다. 서비스 검색 주석에는 동일한 키가 있으며, 서비스마다 JSON 형식으로 연결 세부 정보를 제공합니다.
내부 Kafka 부트스트랩 서비스의 예
apiVersion: v1
kind: Service
metadata:
annotations:
strimzi.io/discovery: |-
[ {
"port" : 9092,
"tls" : false,
"protocol" : "kafka",
"auth" : "scram-sha-512"
}, {
"port" : 9093,
"tls" : true,
"protocol" : "kafka",
"auth" : "tls"
} ]
labels:
strimzi.io/cluster: my-cluster
strimzi.io/discovery: "true"
strimzi.io/kind: Kafka
strimzi.io/name: my-cluster-kafka-bootstrap
name: my-cluster-kafka-bootstrap
spec:
#...
HTTP 브리지 서비스 예
apiVersion: v1
kind: Service
metadata:
annotations:
strimzi.io/discovery: |-
[ {
"port" : 8080,
"tls" : false,
"auth" : "none",
"protocol" : "http"
} ]
labels:
strimzi.io/cluster: my-bridge
strimzi.io/discovery: "true"
strimzi.io/kind: KafkaBridge
strimzi.io/name: my-bridge-bridge-service
20.6.1. 서비스에 대한 연결 세부 정보 반환 링크 복사링크가 클립보드에 복사되었습니다!
명령줄 또는 해당 API 호출에서 서비스를 가져올 때 검색 레이블을 지정하여 서비스를 찾을 수 있습니다.
oc get service -l strimzi.io/discovery=true
연결 세부 정보는 서비스 검색 레이블을 검색할 때 반환됩니다.
20.7. 영구 볼륨에서 클러스터 복구 링크 복사링크가 클립보드에 복사되었습니다!
PV(영구 볼륨)가 있는 경우 Kafka 클러스터를 복구할 수 있습니다.
예를 들어 다음과 같은 작업을 수행할 수 있습니다.
- 실수로 네임스페이스가 삭제됨
- 전체 OpenShift 클러스터가 손실되지만 PV는 인프라에 남아 있습니다.
20.7.1. 네임스페이스 삭제에서 복구 링크 복사링크가 클립보드에 복사되었습니다!
영구 볼륨과 네임스페이스 간의 관계로 인해 네임스페이스를 삭제할 수 있습니다. PV( PersistentVolume )는 네임스페이스 외부에 있는 스토리지 리소스입니다. PV는 네임스페이스 내에 있는 PVC( PersistentVolumeClaim )를 사용하여 Kafka Pod에 마운트됩니다.
PV의 회수 정책은 네임스페이스가 삭제될 때 작동하는 방법을 클러스터에 지시합니다. 회수 정책이 다음과 같이 설정된 경우:
- 삭제 (기본값)는 네임스페이스 내에서 PVC가 삭제되면 PV가 삭제됩니다.
- 유지 관리: 네임스페이스가 삭제되면 PV가 삭제되지 않습니다.
네임스페이스가 실수로 삭제되면 PV에서 복구할 수 있도록 persistentVolumeReclaimPolicy 속성을 사용하여 PV 사양에서 Retain 으로 정책을 재설정해야 합니다.
apiVersion: v1
kind: PersistentVolume
# ...
spec:
# ...
persistentVolumeReclaimPolicy: Retain
또는 PV는 관련 스토리지 클래스의 회수 정책을 상속할 수 있습니다. 스토리지 클래스는 동적 볼륨 할당에 사용됩니다.
스토리지 클래스에 대해 reclaimPolicy 속성을 구성하면 스토리지 클래스를 사용하는 PV가 적절한 회수 정책을 사용하여 생성됩니다. 스토리지 클래스는 storageClassName 속성을 사용하여 PV용으로 구성됩니다.
apiVersion: v1
kind: StorageClass
metadata:
name: gp2-retain
parameters:
# ...
# ...
reclaimPolicy: Retain
apiVersion: v1
kind: PersistentVolume
# ...
spec:
# ...
storageClassName: gp2-retain
Retain 을 회수 정책으로 사용하지만 전체 클러스터를 삭제하려면 PV를 수동으로 삭제해야 합니다. 그렇지 않으면 삭제되지 않으며 리소스에 불필요한 영향을 미칠 수 있습니다.
20.7.2. OpenShift 클러스터 손실에서 복구 링크 복사링크가 클립보드에 복사되었습니다!
클러스터가 손실되면 디스크/ 볼륨의 데이터를 사용하여 인프라 내에 보존된 경우 클러스터를 복구할 수 있습니다. 복구 절차는 PV가 복구되고 수동으로 생성될 수 있다고 가정하여 네임스페이스 삭제와 동일합니다.
20.7.3. 영구 볼륨에서 삭제된 클러스터 복구 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 PV(영구 볼륨)에서 삭제된 클러스터를 복구하는 방법을 설명합니다.
이 경우 Topic Operator는 Kafka에 항목이 있는지 확인하지만 KafkaTopic 리소스는 존재하지 않습니다.
클러스터를 재생성하기 위해 단계에 도달하면 다음 두 가지 옵션이 있습니다.
모든
KafkaTopic리소스를 복구할 수 있는 옵션 1 을 사용합니다.따라서 해당 주제를 Topic Operator에서 삭제하지 않도록 클러스터가 시작되기 전에
KafkaTopic리소스를 복구해야 합니다.모든
KafkaTopic리소스를 복구할 수 없는 경우 옵션 2 를 사용합니다.이 경우 Topic Operator 없이 클러스터를 배포하고 Topic Operator 주제 저장소 메타데이터를 삭제한 다음 해당 주제에서
KafkaTopic리소스를 재생성할 수 있도록 Topic Operator로 Kafka 클러스터를 재배포합니다.
Topic Operator가 배포되지 않은 경우 PVC( PersistentVolumeClaim ) 리소스만 복구하면 됩니다.
사전 준비 사항
이 절차에서는 데이터 손상을 방지하려면 PV를 올바른 PVC에 마운트해야 합니다. PVC에 volumeName 이 지정되며 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 myprojectPVC를 적절한 PV에 연결하여 원래 PVC 리소스 사양을 다시 생성합니다.
예를 들면 다음과 같습니다.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-0-my-cluster-kafka-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: gp2-retain volumeMode: Filesystem volumeName: pvc-7e1f67f9-3317-11ea-a650-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-34-rhel8:2.4.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete명령은 Kafka 클러스터에 액세스하는 데 사용되는 리스너 및 인증 유형에 대응해야 합니다.
topicOperator속성을 사용하여 Kafka 클러스터를 재배포하여 Topic Operator를 활성화하여KafkaTopic리소스를 다시 생성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {}1 #...
- 1
- 여기서는 추가 속성이 없는 기본 구성을 보여줍니다.
EntityTopicOperatorSpec스키마 참조에 설명된 속성을 사용하여 필요한 구성을 지정합니다.
KafkaTopic리소스를 나열하여 복구를 확인합니다.oc get KafkaTopic
20.8. Kafka 정적 할당량 플러그인을 사용하여 브로커에 대한 제한 설정 링크 복사링크가 클립보드에 복사되었습니다!
Kafka 정적 할당량 플러그인을 사용하여 Kafka 클러스터의 브로커에 대한 처리량 및 스토리지 제한을 설정합니다. 플러그인을 활성화하고 Kafka 리소스를 구성하여 제한을 설정합니다. 브로커와 상호 작용하는 클라이언트에 제한을 두도록 바이트 비율 임계값 및 스토리지 할당량을 설정할 수 있습니다.
생산자 및 소비자 대역폭에 대한 바이트 비율 임계값을 설정할 수 있습니다. 총 제한은 브로커에 액세스하는 모든 클라이언트에 분배됩니다. 예를 들어, 생산자에 대해 40MBps의 바이트 비율 임계값을 설정할 수 있습니다. 두 생산자가 실행 중인 경우 각각 20MBps의 처리량으로 제한됩니다.
스토리지 할당량은 소프트 제한과 하드 제한 사이에 Kafka 디스크 스토리지 제한을 제한합니다. 제한은 사용 가능한 모든 디스크 공간에 적용됩니다. 생산자는 소프트 및 하드 제한 사이에 점진적으로 느려집니다. 제한으로 인해 디스크가 너무 빨리 채워지고 용량을 초과할 수 있습니다. 전체 디스크는 수정하기 어려운 문제로 이어질 수 있습니다. 하드 제한은 최대 스토리지 제한입니다.
JBOD 스토리지의 경우 제한이 모든 디스크에 적용됩니다. 브로커가 두 개의 1TB 디스크를 사용하고 있고 할당량이 1.1TB인 경우 하나의 디스크가 채워지고 다른 디스크는 거의 비어 있습니다.
사전 요구 사항
- Kafka 클러스터를 관리하는 Cluster Operator가 실행 중입니다.
절차
Kafka리소스의 구성에 plugin 속성을 추가합니다.plugin 속성은 이 설정 예제에 표시되어 있습니다.
Kafka 정적 할당량 플러그인 구성의 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... config: client.quota.callback.class: io.strimzi.kafka.quotas.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>
20.9. AMQ Streams 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔 또는 CLI를 사용하여 OperatorHub에서 OpenShift 4.10에서 4.13으로 AMQ Streams를 설치 제거할 수 있습니다.
AMQ Streams를 설치하는 데 사용한 것과 동일한 방법을 사용합니다.
AMQ Streams를 설치 제거할 때 배포용으로 특별히 생성된 리소스를 식별하고 AMQ Streams 리소스에서 참조해야 합니다.
이러한 리소스는 다음과 같습니다.
- 보안(사용자 정의 CA 및 인증서, Kafka Connect 시크릿 및 기타 Kafka 시크릿)
-
로깅
ConfigMaps(외부유형의 경우)
Kafka , ,Kafka ConnectKafkaMirrorMaker 또는 KafkaBridge 구성에서 참조하는 리소스입니다.
CustomResourceDefinitions 를 삭제하면 해당 사용자 정의 리소스(Kafka,KafkaConnect,KafkaMirrorMaker 또는 KafkaBridge)와 해당 리소스에 종속된 리소스(Deployments, StatefulSets 및 기타 종속 리소스)의 가비지 컬렉션이 생성됩니다.
20.9.1. 웹 콘솔을 사용하여 OperatorHub에서 AMQ Streams 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 OperatorHub에서 AMQ Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.
콘솔에서 단계를 수행하거나 대체 CLI 명령을 사용할 수 있습니다.
사전 요구 사항
-
cluster-admin또는strimzi-admin권한이 있는 계정을 사용하여 OpenShift Container Platform 웹 콘솔에 액세스합니다. 삭제할 리소스를 식별했습니다.
다음
ocCLI 명령을 사용하여 리소스를 찾고 AMQ Streams를 제거할 때 해당 리소스가 제거되었는지 확인할 수도 있습니다.AMQ Streams 배포와 관련된 리소스를 찾는 명령
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>& lt;resource_type >을 검사 중인 리소스 유형(예:
secret또는configmap)으로 바꿉니다.
절차
- OpenShift 웹 콘솔에서 Operator > 설치된 Operator로 이동합니다.
설치된 AMQ Streams Operator의 경우 옵션 아이콘( 세 개의 수직점)을 선택하고 Uninstall Operator 를 클릭합니다.
Operator는 설치된 Operator에서 제거됩니다.
- 홈 > 프로젝트로 이동하여 AMQ Streams 및 Kafka 구성 요소를 설치한 프로젝트를 선택합니다.
인벤토리 아래의 옵션을 클릭하여 관련 리소스를 삭제합니다.
리소스는 다음과 같습니다.
- 배포
- StatefulSets
- Pods
- 서비스
- ConfigMaps
- 보안
작은 정보검색을 사용하여 Kafka 클러스터의 이름으로 시작하는 관련 리소스를 찾습니다. 워크로드에서 리소스를 찾을 수도 있습니다.
대체 CLI 명령
CLI 명령을 사용하여 OperatorHub에서 AMQ Streams를 제거할 수 있습니다.
AMQ 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
20.9.2. CLI를 사용하여 AMQ Streams 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 oc 명령줄 툴을 사용하여 AMQ Streams를 제거하고 배포와 관련된 리소스를 제거하는 방법을 설명합니다.
사전 요구 사항
-
cluster-admin또는strimzi-admin권한이 있는 계정을 사용하여 OpenShift 클러스터에 액세스할 수 있습니다. 삭제할 리소스를 식별했습니다.
다음
ocCLI 명령을 사용하여 리소스를 찾고 AMQ Streams를 제거할 때 해당 리소스가 제거되었는지 확인할 수도 있습니다.AMQ Streams 배포와 관련된 리소스를 찾는 명령
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>& lt;resource_type >을 검사 중인 리소스 유형(예:
secret또는configmap)으로 바꿉니다.
절차
Cluster Operator
배포, 관련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 -n my-project
20.10. 자주하는 질문 링크 복사링크가 클립보드에 복사되었습니다!
21장. AMQ Streams에서 미터링 사용 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift에서 사용할 수 있는 미터링 툴을 사용하여 다양한 데이터 소스에서 미터링 보고서를 생성할 수 있습니다. 클러스터 관리자는 미터링을 사용하여 클러스터에서 발생하는 상황을 분석할 수 있습니다. 자체적으로 작성하거나 사전 정의된 SQL 쿼리를 사용하여 사용 가능한 다양한 데이터 소스에서 데이터를 처리하는 방법을 정의할 수 있습니다. Prometheus를 기본 데이터 소스로 사용하여 Pod, 네임스페이스 및 대부분의 기타 OpenShift 리소스에 대한 보고서를 생성할 수 있습니다.
OpenShift Metering Operator를 사용하여 설치된 AMQ Streams 구성 요소를 분석하여 Red Hat 서브스크립션을 준수하는지 여부를 확인할 수도 있습니다.
AMQ Streams에서 미터링을 사용하려면 먼저 OpenShift Container Platform에 Metering Operator 를 설치하고 구성해야 합니다.
21.1. 미터링 리소스 링크 복사링크가 클립보드에 복사되었습니다!
미터링에는 많은 리소스가 있으며, 기능 미터링을 보고하는 기능과 함께 미터링 배포 및 설치를 관리하는 데 사용할 수 있습니다. 미터링은 다음 CRD를 사용하여 관리합니다.
| 이름 | 설명 |
|---|---|
|
| 배포에 대해 미터링 스택을 구성합니다. 미터링 스택을 구성하는 각 구성 요소를 제어하기 위한 사용자 정의 및 구성 옵션이 포함되어 있습니다. |
|
| 사용할 쿼리, 쿼리를 실행할 빈도 및 결과를 저장할 위치를 제어합니다. |
|
|
|
|
| ReportQueries 및 Reports에서 사용할 수 있는 데이터를 제어합니다. 미터링 내에서 사용할 수 있도록 다양한 데이터베이스에 대한 액세스를 구성할 수 있습니다. |
21.2. AMQ Streams의 미터링 라벨 링크 복사링크가 클립보드에 복사되었습니다!
다음 표에는 AMQ Streams 인프라 구성 요소 및 통합의 미터링 라벨이 나열되어 있습니다.
| 레이블 | 가능한 값 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 인프라
|
| 애플리케이션
| |
|
|
|
예
인프라 예(인프라 구성 요소가 entity-operator임)
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2023.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.4 rht.subcomp=entity-operator rht.subcomp_t=infrastructure애플리케이션 예(통합 배포 이름이 kafka-bridge임)
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2023.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.4 rht.subcomp=kafka-bridge rht.subcomp_t=application
부록 A. 서브스크립션 사용 링크 복사링크가 클립보드에 복사되었습니다!
AMQ Streams는 소프트웨어 서브스크립션을 통해 제공됩니다. 서브스크립션을 관리하려면 Red Hat 고객 포털에서 계정에 액세스하십시오.
귀하의 계정에 액세스
- access.redhat.com 으로 이동합니다.
- 아직 계정이 없는 경우 계정을 생성합니다.
- 계정에 로그인합니다.
서브스크립션 활성화
- access.redhat.com 으로 이동합니다.
- 내 서브스크립션으로 이동합니다.
- 서브스크립션을 활성화하여 16자리 활성화 번호를 입력합니다.
Zip 및 Tar 파일 다운로드
zip 또는 tar 파일에 액세스하려면 고객 포털을 사용하여 다운로드할 관련 파일을 찾습니다. RPM 패키지를 사용하는 경우에는 이 단계가 필요하지 않습니다.
- 브라우저를 열고 access.redhat.com/downloads 에서 Red Hat 고객 포털 제품 다운로드 페이지에 로그인합니다.
- INTEGRAT ION 및 AUTOMATION 카테고리에서 Apache Kafka의 AMQ Streams 를 찾습니다.
- 원하는 AMQ Streams 제품을 선택합니다. Software Download 페이지가 열립니다.
- 구성 요소에 대한 다운로드 링크를 클릭합니다.
DNF로 패키지 설치
패키지 및 모든 패키지 종속 항목을 설치하려면 다음을 사용합니다.
dnf install <package_name>
로컬 디렉터리에서 이전에 다운로드한 패키지를 설치하려면 다음을 사용합니다.
dnf install <path_to_download_package>
2023-07-28에 최종 업데이트된 문서