kafka-cluster

This commit is contained in:
ychangkim
2025-12-02 13:33:13 +09:00
parent 688d6c7c34
commit 257c6915f1
13 changed files with 1184 additions and 0 deletions
@@ -0,0 +1,55 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "kafka-cluster.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
*/}}
{{- define "kafka-cluster.fullname" -}}
{{- if .Values.nameOverride }}
{{- .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- .Release.Name | default "kafka-cluster" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "kafka-cluster.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "kafka-cluster.labels" -}}
helm.sh/chart: {{ include "kafka-cluster.chart" . }}
{{ include "kafka-cluster.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "kafka-cluster.selectorLabels" -}}
app.kubernetes.io/name: {{ include "kafka-cluster.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the namespace to use
*/}}
{{- define "kafka-cluster.namespace" -}}
{{- if .Values.namespaceOverride }}
{{- .Values.namespaceOverride }}
{{- else }}
{{- .Release.Namespace }}
{{- end }}
{{- end }}
@@ -0,0 +1,53 @@
{{- if .Values.kafkaConnect.enabled }}
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: {{ include "kafka-cluster.fullname" . }}
namespace: {{ include "kafka-cluster.namespace" . }}
labels:
strimzi.io/cluster: {{ include "kafka-cluster.fullname" . }}
{{- include "kafka-cluster.labels" . | nindent 4 }}
annotations:
strimzi.io/use-connector-resources: "true"
spec:
image: {{ .Values.kafkaConnect.image }}
replicas: {{ .Values.kafkaConnect.replicas }}
bootstrapServers: {{ include "kafka-cluster.fullname" . }}-kafka-tls-bootstrap.{{ include "kafka-cluster.namespace" . }}.svc.cluster.local:{{ .Values.listener.port }}
config:
group.id: {{ include "kafka-cluster.fullname" . }}-default-connect
offset.storage.topic: {{ include "kafka-cluster.fullname" . }}.connect-offsets
config.storage.topic: {{ include "kafka-cluster.fullname" . }}.connect-configs
status.storage.topic: {{ include "kafka-cluster.fullname" . }}.connect-status
key.converter: org.apache.kafka.connect.json.JsonConverter
value.converter: org.apache.kafka.connect.json.JsonConverter
plugin.path: /opt/kafka/plugins
topic.creation.enable: "true"
{{- if .Values.oauth.enabled }}
authentication:
type: oauth
tokenEndpointUri: {{ .Values.oauth.keycloakUrl }}/realms/{{ .Values.oauth.keycloakRealm }}/protocol/openid-connect/token
clientId: {{ .Values.oauth.keycloakClientId }}-kafka-connect
clientSecret:
secretName: {{ .Values.kafkaConnect.oauthSecretName }}
key: client-secret
tlsTrustedCertificates:
- secretName: {{ .Values.oauth.tlsSecretName }}
pattern: {{ .Values.oauth.tlsCertificate | quote }}
{{- end }}
template:
connectContainer:
volumeMounts:
- name: truststore-volume
mountPath: /mnt/truststore/truststore.jks
subPath: truststore.jks
readOnly: true
pod:
volumes:
- name: truststore-volume
secret:
secretName: {{ .Values.kafkaConnect.truststoreSecretName }}
logging:
type: inline
loggers:
rootLogger.level: {{ .Values.logging.connect.rootLoggerLevel }}
{{- end }}
@@ -0,0 +1,33 @@
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: broker
namespace: {{ include "kafka-cluster.namespace" . }}
labels:
strimzi.io/cluster: {{ include "kafka-cluster.fullname" . }}
{{- include "kafka-cluster.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.broker.replicas }}
roles:
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: {{ .Values.broker.storage.size }}
class: {{ .Values.broker.storage.class }}
kraftMetadata: shared
{{- if .Values.broker.resources }}
resources:
{{- if .Values.broker.resources.requests }}
requests:
cpu: {{ .Values.broker.resources.requests.cpu }}
memory: {{ .Values.broker.resources.requests.memory }}
{{- end }}
{{- if .Values.broker.resources.limits }}
limits:
cpu: {{ .Values.broker.resources.limits.cpu }}
memory: {{ .Values.broker.resources.limits.memory }}
{{- end }}
{{- end }}
@@ -0,0 +1,33 @@
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: controller
namespace: {{ include "kafka-cluster.namespace" . }}
labels:
strimzi.io/cluster: {{ include "kafka-cluster.fullname" . }}
{{- include "kafka-cluster.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.controller.replicas }}
roles:
- controller
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: {{ .Values.controller.storage.size }}
kraftMetadata: shared
class: {{ .Values.controller.storage.class }}
{{- if .Values.controller.resources }}
resources:
{{- if .Values.controller.resources.requests }}
requests:
cpu: {{ .Values.controller.resources.requests.cpu }}
memory: {{ .Values.controller.resources.requests.memory }}
{{- end }}
{{- if .Values.controller.resources.limits }}
limits:
cpu: {{ .Values.controller.resources.limits.cpu }}
memory: {{ .Values.controller.resources.limits.memory }}
{{- end }}
{{- end }}
@@ -0,0 +1,53 @@
{{- if .Values.kafkaConnect.enabled }}
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
labels:
strimzi.io/cluster: {{ include "kafka-cluster.fullname" . }}
{{- include "kafka-cluster.labels" . | nindent 4 }}
name: {{ include "kafka-cluster.fullname" . }}-connect-offsets
namespace: {{ include "kafka-cluster.namespace" . }}
spec:
partitions: {{ .Values.connectTopics.partitions }}
replicas: {{ .Values.connectTopics.replicas }}
topicName: {{ include "kafka-cluster.fullname" . }}.connect-offsets
config:
cleanup.policy: {{ .Values.connectTopics.config.cleanupPolicy }}
retention.ms: {{ .Values.connectTopics.config.retentionMs }}
segment.bytes: {{ .Values.connectTopics.config.segmentBytes }}
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
labels:
strimzi.io/cluster: {{ include "kafka-cluster.fullname" . }}
{{- include "kafka-cluster.labels" . | nindent 4 }}
name: {{ include "kafka-cluster.fullname" . }}-connect-configs
namespace: {{ include "kafka-cluster.namespace" . }}
spec:
partitions: {{ .Values.connectTopics.partitions }}
replicas: {{ .Values.connectTopics.replicas }}
topicName: {{ include "kafka-cluster.fullname" . }}.connect-configs
config:
cleanup.policy: {{ .Values.connectTopics.config.cleanupPolicy }}
retention.ms: {{ .Values.connectTopics.config.retentionMs }}
segment.bytes: {{ .Values.connectTopics.config.segmentBytes }}
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
labels:
strimzi.io/cluster: {{ include "kafka-cluster.fullname" . }}
{{- include "kafka-cluster.labels" . | nindent 4 }}
name: {{ include "kafka-cluster.fullname" . }}-connect-status
namespace: {{ include "kafka-cluster.namespace" . }}
spec:
partitions: {{ .Values.connectTopics.partitions }}
replicas: {{ .Values.connectTopics.replicas }}
topicName: {{ include "kafka-cluster.fullname" . }}.connect-status
config:
cleanup.policy: {{ .Values.connectTopics.config.cleanupPolicy }}
retention.ms: {{ .Values.connectTopics.config.retentionMs }}
segment.bytes: {{ .Values.connectTopics.config.segmentBytes }}
{{- end }}
@@ -0,0 +1,31 @@
{{- if .Values.kafkaConnect.enabled }}
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: service-account-{{ .Values.oauth.keycloakClientId }}-kafka-connect
namespace: {{ include "kafka-cluster.namespace" . }}
labels:
strimzi.io/cluster: {{ include "kafka-cluster.fullname" . }}
{{- include "kafka-cluster.labels" . | nindent 4 }}
spec:
authorization:
type: simple
acls:
- resource:
type: topic
name: "*"
patternType: literal
operations:
- Read
- Describe
- DescribeConfigs
- Write
- resource:
type: group
name: "*"
patternType: literal
operations:
- Read
- Write
- Describe
{{- end }}
+80
View File
@@ -0,0 +1,80 @@
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: {{ include "kafka-cluster.fullname" . }}
namespace: {{ include "kafka-cluster.namespace" . }}
labels:
{{- include "kafka-cluster.labels" . | nindent 4 }}
annotations:
strimzi.io/node-pools: enabled
strimzi.io/kraft: enabled
spec:
kafka:
version: {{ .Values.kafka.version }}
metadataVersion: {{ .Values.kafka.metadataVersion | quote }}
template:
kafkaContainer:
env:
- name: KAFKA_OPTS
value: "-Duser.timezone={{ .Values.kafka.timezone }}"
listeners:
- name: tls
type: cluster-ip
port: {{ .Values.listener.port }}
tls: {{ .Values.listener.tls }}
{{- if .Values.oauth.enabled }}
authentication:
type: oauth
clientId: {{ .Values.oauth.keycloakClientId | quote }}
clientSecret:
key: {{ .Values.oauth.secretKey }}
secretName: {{ .Values.oauth.secretName }}
checkIssuer: true
checkAccessTokenType: true
accessTokenIsJwt: true
checkAudience: false
enableOauthBearer: true
validIssuerUri: {{ .Values.oauth.keycloakUrl }}/realms/{{ .Values.oauth.keycloakRealm }}
jwksEndpointUri: {{ .Values.oauth.keycloakUrl }}/realms/{{ .Values.oauth.keycloakRealm }}/protocol/openid-connect/certs
userNameClaim: preferred_username
customClaimCheck: "'{{ .Values.oauth.keycloakClientId }}' in @.realm_access.roles"
tlsTrustedCertificates:
- secretName: {{ .Values.oauth.tlsSecretName }}
certificate: {{ .Values.oauth.tlsCertificate }}
{{- end }}
config:
offsets.topic.replication.factor: {{ .Values.config.offsetsTopicReplicationFactor }}
transaction.state.log.replication.factor: {{ .Values.config.transactionStateLogReplicationFactor }}
transaction.state.log.min.isr: {{ .Values.config.transactionStateLogMinIsr }}
default.replication.factor: {{ .Values.config.defaultReplicationFactor }}
min.insync.replicas: {{ .Values.config.minInsyncReplicas }}
auto.create.topics.enable: {{ .Values.config.autoCreateTopicsEnable }}
num.partitions: {{ .Values.config.numPartitions }}
delete.topic.enable: {{ .Values.config.deleteTopicEnable }}
authorization:
type: simple
logging:
type: inline
loggers:
kafka.root.logger.level: {{ .Values.logging.kafka.rootLoggerLevel }}
entityOperator:
topicOperator:
{{- if .Values.entityOperator.topicOperator.resources }}
resources:
requests:
memory: {{ .Values.entityOperator.topicOperator.resources.requests.memory }}
cpu: {{ .Values.entityOperator.topicOperator.resources.requests.cpu }}
limits:
memory: {{ .Values.entityOperator.topicOperator.resources.limits.memory }}
cpu: {{ .Values.entityOperator.topicOperator.resources.limits.cpu }}
{{- end }}
userOperator:
{{- if .Values.entityOperator.userOperator.resources }}
resources:
requests:
memory: {{ .Values.entityOperator.userOperator.resources.requests.memory }}
cpu: {{ .Values.entityOperator.userOperator.resources.requests.cpu }}
limits:
memory: {{ .Values.entityOperator.userOperator.resources.limits.memory }}
cpu: {{ .Values.entityOperator.userOperator.resources.limits.cpu }}
{{- end }}