Roo Code 바이브 코딩 실전 - Kafka Cluster Helm template 만들기

kafka-cluster 배포용 yaml 을 Helm template 형식으로 변환하는 예제를 Roo Code 를 이용하여 바이브 코딩으로 제작하는 과정을 설명합니다.

Roo Code 바이브 코딩 실전 - Kafka Cluster Helm template 만들기

목차

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: 200m

Roo 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 활용 시리즈의 일부입니다:

  1. Roo Code와 함께하는 바이브 코딩

    • 바이브 코딩의 개념과 AI 코딩 도구 비교 분석
    • Roo Code 소개 및 기본 설치 방법
  2. Roo Code 사용 가이드

    • Roo Code의 모든 기능과 설정 완전 가이드
    • 모드, API 구성, 자동 승인 등 고급 활용법
  3. Roo Code 바이브 코딩 실전 - Kafka Cluster Helm template 만들기

    • 실제 프로젝트를 통한 바이브 코딩 실습
    • Kafka 클러스터 Helm 템플릿 변환 과정

Subscribe to PAASUP IDEAS

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe