본문 바로가기

DevOps

[Strimzi Kafka Connect] 손쉽게 커넥터 Config에 시크릿 적용하기

반응형

 

아래 공식문서를 참고하여 시크릿을 적용

 

https://strimzi.io/blog/2021/07/22/using-kubernetes-config-provider-to-load-data-from-secrets-and-config-maps/

 

Using Kubernetes Configuration Provider to load data from Secrets and Config Maps

Using Kubernetes Configuration Provider to load data from Secrets and Config Maps When running Apache Kafka on Kubernetes, you will sooner or later probably need to use Config Maps or Secrets. Either to store something in them, or load them into your Kafka

strimzi.io

 


 

1. 개요

Strimzi의 KafkaConnect CR을 사용 시 Connector를 등록할 때 민감정보를 어떻게 해야 하는지 햇갈리는 경우가 있을 수 있다. 필자 또한 그랬다.

 

Strimzi에서는 Secrets 또는 ConfigMaps을 Volume으로 마운트하거나 환경 변수로 매핑하는 것이 충분하지 않거나 최적이 아닌 여러 사용 사례를 확인했다는 이유KubernetesConfigProvider를 만들었다고 한다.

 

 

KubernetesConfigProvider을 사용하면 ConfigMap이나 Secrets을 직접 참조할 수 있으며 Pod에서 아무것도 지정할 필요가 없어지게 된다.

 

우리가 필요한 건 단지 Secret 혹은 ConfigMap에 데이터를 접근할 수 있는 권한만 있으면 된다.

 

그럼 어떤식으로 사용하면 될까?

 

아주 간단하다.

(단, 여기서는 Secrets에 접근할 수 있는 Role, RoleBinding, ServiceAccount는 알아서 세팅해두었다고 가정한다.)

 

 

1. KafkaConnect config에 다음의 설정을 추가한다.

config.providers=secrets,configmaps
config.providers.secrets.class=io.strimzi.kafka.KubernetesSecretConfigProvider
config.providers.configmaps.class=io.strimzi.kafka.KubernetesConfigMapConfigProvider

 

 

2. 커넥터 컨피그에 신나게 사용한다.

option=${configmaps:my-namespace/my-config-map:field1}

 

 


2. 사용 예시

필자는 Strimzi KafkaConnect를 Helm Chart로 만들어 개발자들에게 제공하고 있기 때문에 위 설정들을 모두 Helm Chart 안에 구성해두었다.

 

1. spec.config에 KubernetesXXXXXConfigProvider 추가

  config:
    {{- toYaml .Values.kafkaConnect.config | nindent 4 }}
    {{- if $.Values.kafkaConnect.secrets.enabled }}
    config.providers: secrets
    config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider
    {{- end }}

 

 

 

2. Role, RoleBinding 추가

참조할 Secret을 명시해준다.

{{- if $.Values.kafkaConnect.secrets.enabled }}
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: {{ .Values.global.fullnameOverride }}-role
  namespace: {{ .Values.global.namespace.name }}
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    resourceNames: ["kafka-connect-secret"]
    verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: {{ .Values.global.fullnameOverride }}-role-binding
  namespace: {{ .Values.global.namespace.name }}
subjects:
  - kind: ServiceAccount
    name: {{ .Values.global.fullnameOverride }}-connect
    namespace: {{ .Values.global.namespace.name }}
roleRef:
  kind: Role
  name: {{ .Values.global.fullnameOverride }}-role
  apiGroup: rbac.authorization.k8s.io
{{- end }}

 

 

 

3. Connector 설정 등록 시 아래와 같이 사용해준다.

${secrets:<<Namespace>>/<<Secret>>:<<Key>>}

 

아래 예시는 Debezium Source Connector를 연결한 예시이다.

 

 

 

Strimzi를 사용하여 KafkaConnect를 운영하고자 하는 누군가에게는 도움이 될만한 글일 것 같아 작성해본다.

 

Kubernetes Secret을 생성하는 과정을 AWS SecretsManager와 External Secrets을 활용했으며 이 부분은 주제를 벗어나기 때문에 따로 작성은 안했다.

 

아무튼 3줄 요약하자면 다음과 같다.

 

1. k8s Secret을 만들어둔다.

2. KafkaConnect config에 KubernetesSecretConfigProvider를 추가해준다. (Role, RoleBinding도 필요)

3. Connector Config에 ${secrets:<<Namespace>>/<<Secret>>:<<Key>>} 형식대로 Secret을 참조해서 사용한다.

 

 

 

반응형