아래 공식문서를 참고하여 시크릿을 적용
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을 참조해서 사용한다.
'DevOps' 카테고리의 다른 글
[Harbor] EKS 환경에서 Harbor 고가용성(HA)으로 구성하기 (2) | 2024.06.08 |
---|---|
[Grafana Loki] 청크 중복성 제거하기 (ingester에만 chunk cache 적용) (0) | 2024.05.10 |
[Ansible] 사용자 계정 생성 및 apache http 설치 실습 (0) | 2024.02.04 |
[Ansible] 반복문, 조건문, 핸들러, 블록, Recsue 등 개념 정리 (0) | 2024.01.20 |
[Ansible] 기본 개념 정리 (0) | 2024.01.09 |