Roo Code 바이브 코딩 실전 - Kafka Cluster Helm template 만들기
kafka-cluster 배포용 yaml 을 Helm template 형식으로 변환하는 예제를 Roo Code 를 이용하여 바이브 코딩으로 제작하는 과정을 설명합니다.
목차
1. Roo Code 기본설정
2.k8s 배포용도의 kafka-cluster yaml
3.Roo Code 이용한 Helm 템플릿 만들기 실전
4.마치며
1. Roo Code 기본설정
Roo Code는 VS Code에 플러그인으로 설치해서 사용하며, 간단한 설정을 마치면 바로 사용할 수 있다.
Roo Code 에 대한 상세한 설명과 바이브코딩에 관한 더 궁금한 내용은 이 글에서 확인할 수 있다.
Roo Code
- VS Code Extensions: Roo Code 검색 후 install
- Roo Code versions : 3.34.8 기준 (작성 시점 최신)
- install 후 Roo Code 설정
- LLM API 제공자와 API 키, 모델(claude-sonnet-4-5)을 입력하고, 자동 승인(읽기, 쓰기, 브라우저, MCP, Todo) 설정, 언어 설정등을 선택한다.

2. k8s 배포용도의 kafka-cluster yaml
kafka cluster를 한꺼번에 배포하기 위해 controller, broker, kafak, kafka-connect, kafka-user, kafka-topic 을 multi 로 배포할 수 있는 yaml 을 만들어 관리하고 있으나, resource 와 volume 정보만 update 를 편리하게 하기 위해 helm template 으로 전환하고자 한다.
# kafka-cluster
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: controller
namespace: "kafka"
labels:
strimzi.io/cluster: "kafka-cluster"
spec:
replicas: 3
roles:
- controller
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 50Gi
kraftMetadata: shared
class: longhorn
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: broker
namespace: "kafka"
labels:
strimzi.io/cluster: "kafka-cluster"
spec:
replicas: 3
roles:
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 50Gi
class: longhorn
kraftMetadata: shared
---
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: "kafka-cluster"
namespace: "kafka"
annotations:
strimzi.io/node-pools: enabled
strimzi.io/kraft: enabled
spec:
kafka:
version: 4.0.0
metadataVersion: "4.0"
template:
kafkaContainer:
env:
- name: KAFKA_OPTS
value: "-Duser.timezone=Asia/Seoul"
listeners:
- name: tls
type: cluster-ip
port: 9093
tls: false
authentication:
type: oauth
clientId: "KEYCLOAK_CLIENT_ID"
clientSecret:
key: client-secret
secretName: kafka-cluster-oauth-secret
checkIssuer: true
checkAccessTokenType: true
accessTokenIsJwt: true
checkAudience: false
enableOauthBearer: true
validIssuerUri: "KEYCLOAK_URL/realms/KEYCLOAK_REALM"
jwksEndpointUri: "KEYCLOAK_URL/realms/KEYCLOAK_REALM/protocol/openid-connect/certs"
userNameClaim: preferred_username
customClaimCheck: "'KEYCLOAK_CLIENT_ID' in @.realm_access.roles"
tlsTrustedCertificates:
- secretName: keycloak-tls
certificate: ca.crt
config:
offsets.topic.replication.factor: 3
transaction.state.log.replication.factor: 3
transaction.state.log.min.isr: 2
default.replication.factor: 3
min.insync.replicas: 2
auto.create.topics.enable: false
num.partitions: 3
delete.topic.enable: true
authorization:
type: simple
logging:
type: inline
loggers:
kafka.root.logger.level: INFO
entityOperator:
topicOperator: {}
userOperator: {}
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: "kafka-cluster"
namespace: "kafka"
labels:
strimzi.io/cluster: "kafka-cluster"
annotations:
strimzi.io/use-connector-resources: "true"
spec:
image: paasup/kafka-connect:0.2
replicas: 1
bootstrapServers: "kafka-cluster-kafka-tls-bootstrap.kafka.svc.cluster.local:9093"
config:
group.id: "kafka-cluster-default-connect"
offset.storage.topic: "kafka-cluster.connect-offsets"
config.storage.topic: "kafka-cluster.connect-configs"
status.storage.topic: "kafka-cluster.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"
authentication:
type: oauth
tokenEndpointUri: "KEYCLOAK_URL/realms/KEYCLOAK_REALM/protocol/openid-connect/token"
clientId: "KEYCLOAK_CLIENT_ID-kafka-connect"
clientSecret:
secretName: kafka-connect-oauth-secret
key: client-secret
tlsTrustedCertificates:
- secretName: keycloak-tls
pattern: "ca.crt"
template:
connectContainer:
volumeMounts:
- name: truststore-volume
mountPath: /mnt/truststore/truststore.jks
subPath: truststore.jks
readOnly: true
pod:
volumes:
- name: truststore-volume
secret:
secretName: truststore
logging:
type: inline
loggers:
rootLogger.level: INFO
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: "service-account-KEYCLOAK_CLIENT_ID-kafka-connect"
namespace: "kafka"
labels:
strimzi.io/cluster: "kafka-cluster"
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
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
labels:
strimzi.io/cluster: kafka-cluster
name: "kafka-cluster-connect-offsets"
namespace: "kafka"
spec:
partitions: 1
replicas: 3
topicName: "kafka-cluster.connect-offsets"
config:
cleanup.policy: compact
retention.ms: 604800000
segment.bytes: 1073741824
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
labels:
strimzi.io/cluster: kafka-cluster
name: "kafka-cluster-connect-configs"
namespace: "kafka"
spec:
partitions: 1
replicas: 3
topicName: "kafka-cluster.connect-configs"
config:
cleanup.policy: compact
retention.ms: 604800000
segment.bytes: 1073741824
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
labels:
strimzi.io/cluster: kafka-cluster
name: "kafka-cluster-connect-status"
namespace: "kafka"
spec:
partitions: 1
replicas: 3
topicName: "kafka-cluster.connect-status"
config:
cleanup.policy: compact
retention.ms: 604800000
segment.bytes: 1073741824
3. Roo Code 이용한 Helm 템플릿 만들기 실전
1) VS Code 에서 위 yaml 을 kafka-cluster.yaml 로 저장한다.
2) Roo Code chat 창에 다음과 같이 입력하고 메시지를 보낸다.

3) 필요한 코드들을 Roo 가 자동으로 생성하고 저장하면서 작업을 진행한다.
자동승인 설정에 쓰기를 체크해 놓았기 때문에 개발자는 타이핑없이 눈으로 진행상황을 보기만 하면 된다. (최후 단계에서 쉘 실행을 위해 승인 요청이 나타날 수 있다.)

4) 잠시 후 작업이 완료되면 최종 결과 리포트를 보여 주고, 추후 작업까지도 안내해 준다.

5) 최종 생성 파일들

6) resources 들을 update 하는 것이 목적이었는데, 관련 설정들이 values.yaml 에 빠져있는 것을 확인했다. 참고가 되는 kafka-cluster.yaml 의 controller, broker, kafka 에 Resources 관련 내용을 추가하고, 다시 Roo 한테 작업을 지시한다.
kafka-cluster.yaml 수정
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
...
spec:
...
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
...
spec:
...
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
---
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
...
spec:
...
entityOperator:
topicOperator:
resources:
requests:
memory: 128Mi
cpu: 100m
limits:
memory: 256Mi
cpu: 200m
userOperator:
resources:
requests:
memory: 128Mi
cpu: 100m
limits:
memory: 256Mi
cpu: 200mRoo chat 명령

Roo 가 다시 알아서 작업을 진행하고 결과를 리포트 한다.

7) values.yaml 을 체크해 보니, entityOperator 부분에 있는 enable: true 부분이 필요없을 것 같아 다시 요청해 본다. 수정할 부분을 마우스로 드래그 한 후 Roo Code 창에서 Add To Context 부분을 클릭하면 Roo Chat 창으로 드래그 한 영역이 들어가면서 추가로 명령어를 추가 할 수 있다. 이 기능은 작업을 요청하려는 부분을 모호하게 하지 않고 명확히 하려고 할때 사용한다.

Roo Chat 명령

Roo가 다시 작업을 자동으로 진행하고 결과를 리포트 한다.

8) 마지막으로, 파일들을 확인해 보니 의도한 대로 코드들이 작성되었다. 이제 콘솔에서 실제 helm install 명령어를 이용해서 배포가 정상적으로 되는지도 체크해 본다. 에러가 발생하면 다시 Roo Code 한테 에러 난 부분에 대해 설명해 주고 수정 요청을 하면 알아서 코드를 맞게 수정해 준다.
4. 마치며
helm cli 를 이용하여 helm template 을 하나하나 만들 수도 있지만, go template 형식을 사용하여 코드를 만들어야 하고 helm 에서 제공하는 function 들을 혼합해야 하기때문에 실수할 가능성도 많고, 작업이 만만치 않다. 그러나 Roo Code를 이용해서 바이브 코딩을 한 결과, 세번의 몇마디 요청으로 이 모든 작업을 손쉽게 처리하였다. 하루종일 걸릴 수 있는 작업이 실제 걸린 시간은 채 몇 분도 걸리지 않은 셈이다.
이 글을 보시는 여러분도 Roo Code 를 이용하여 간단한 코드부터 적용을 시작하여 바이브 코딩에 익숙해져 보기 바란다.
별첨. Roo Code 바이브 코딩 시리즈
이 글은 AI와 함께하는 새로운 개발 패러다임 "바이브 코딩"과 Roo Code 활용 시리즈의 일부입니다:
-
- 바이브 코딩의 개념과 AI 코딩 도구 비교 분석
- Roo Code 소개 및 기본 설치 방법
-
- Roo Code의 모든 기능과 설정 완전 가이드
- 모드, API 구성, 자동 승인 등 고급 활용법
-
Roo Code 바이브 코딩 실전 - Kafka Cluster Helm template 만들기
- 실제 프로젝트를 통한 바이브 코딩 실습
- Kafka 클러스터 Helm 템플릿 변환 과정