1. 문제 배경
사전 준비 단계에서 이미지, 설정, 권한, 저장소를 분리했지만 실제 서비스는 아직 실행되지 않은 상태였다.
Kubernetes에서는 서비스를 단순히 실행하는 것이 아니라, 각 서비스의 역할과 성격에 맞게 리소스를 나눠서 배포해야 한다.
특히 이번 구조에서는 다음 기준이 중요했다.
- 상태 저장 여부
- 다른 서비스의 접근 필요 여부
- 지속적으로 실행되어야 하는지 여부
- 후속 처리 서비스가 의존하는 리소스가 먼저 준비되어 있는지 여부
이번 단계에서는 Kafka, Redis, PostgreSQL과 같은 기반 서비스를 먼저 배포하고, 이후 Spark Streaming 서비스가 안정적으로 구독할 수 있도록 Kafka topic도 초기화 단계에서 함께 준비했다.
2. 목표
- NaviSafe 주요 서비스를 Kubernetes 리소스로 분리하여 배포
- 서비스 간 연결 구조 구성
- Spark Streaming이 의존하는 Kafka topic 사전 생성
- 이후 데이터 처리 흐름이 실행될 수 있는 기반 환경 준비
3. 배포 대상 서비스
이번 단계에서 배포한 주요 구성 요소는 다음과 같다.
- Zookeeper / Kafka
→ 메시지 브로커 구성 - Redis
→ 중간 버퍼 및 실시간 데이터 저장 - PostgreSQL + PostGIS
→ 공간 데이터 및 최종 데이터 저장 - Kafka Topic
→ Spark Streaming 구독 입력 경로
이 구성 요소들은 이후 Spark Streaming과 Airflow가 정상적으로 동작하기 위해 먼저 준비되어 있어야 하는 기반 서비스에 해당한다.
4. 리소스 설계 기준
서비스를 배포할 때 다음 기준으로 리소스를 나눴다.
4-1) StatefulSet
- Kafka
- Zookeeper
- MySQL
이 리소스들은 데이터 유지가 필요하고, Pod 이름 및 순서가 의미를 가지는 서비스다. 따라서 일반 Deployment보다 StatefulSet이 더 적절했다.
4-2) Deployment
- Redis
Redis는 현재 구조에서 단일 인스턴스로 운용했고, Pod가 재생성되더라도 동일한 방식으로 다시 실행되면 되는 형태였기 때문에 Deployment로 구성했다.
4-3) Service
- Kafka Service
- Redis Service
- MySQL Service
Pod는 재생성될 때마다 IP가 변경될 수 있기 때문에, 다른 서비스들이 안정적으로 접근할 수 있도록 Service를 통해 고정된 접근 경로를 구성했다.
4-4) Job
- Kafka Topic 초기화 Job
Kafka topic은 애플리케이션 로직 안에서 매번 생성하기보다, 초기화 단계에서 먼저 준비되어 있어야 하는 기반 리소스에 가까웠다.
따라서 별도 Job으로 분리해 한 번 생성하는 방식으로 구성했다.
5. 서비스 배포
각 리소스는 YAML 기준으로 배포했다.
kubectl apply -f zookeeper.yaml
kubectl apply -f kafka.yaml
kubectl apply -f redis-service.yaml
kubectl apply -f redis-deployment.yaml
kubectl apply -f mysql-service.yaml
kubectl apply -f mysql-statefulset.yaml
kubectl apply -f spark-rbac.yaml

이 과정을 통해 클러스터 내부에서 기반 서비스들이 먼저 실행되도록 구성했다.
spark-rbac.yaml은 이후 Spark 작업이 Kubernetes 리소스에 접근할 수 있도록 사전에 준비한 권한 설정이다.
6. Kafka Topic 초기화, Spark Streaming 실행 및 S3 접근 키 설정
이번 파이프라인에서는 다음 두 개의 topic이 필요했다.
- outbreak_topic
- emergency_alert_topic
초기에는 Airflow DAG에서 topic을 생성한 뒤 데이터를 적재하도록 구성했지만, Spark Streaming 서비스를 먼저 실행하는 구조에서는 topic이 없는 상태로 구독을 시도하면서 오류가 발생했다.
이후 topic은 데이터 적재 이전에 미리 준비되어 있어야 하는 기반 리소스로 보고, 별도 초기화 단계에서 먼저 생성하도록 순서를 조정했다.
6-1) Kafka Topic 초기화 Job 실행
kubectl apply -f kafka-topic-init.yaml
이 방식으로 topic을 먼저 생성해두면 이후 Spark Streaming 서비스는 topic이 존재하는 상태에서 안정적으로 구독을 시작할 수 있다.
6-2) Kafka Topic 생성 확인
kubectl exec -it kafka-0 -- bash
kafka-topics.sh --bootstrap-server localhost:9092 --list

6-3) aws s3 ACCESS_KEY_ID 설정
kubectl create secret generic aws-secret \
--from-literal=AWS_ACCESS_KEY_ID=[] \
--from-literal=AWS_SECRET_ACCESS_KEY=[] \
--from-literal=AWS_REGION=ap-southeast-2 \
--from-literal=S3_BUCKET=navisafe-data-jh \
6-4) Spark Streaming 서비스 실행
kubectl apply -f outbreak-streaming.yaml
kubectl apply -f emergency-alert-streaming.yaml
7. 실행 상태 확인
배포 이후 각 서비스가 정상적으로 실행 중인지 확인했다.
kubectl get pod

또한 Kafka topic 초기화 Job은 실행 완료 이후 Completed 상태가 된 것을 확인했다.
8. 핵심 포인트
이번 단계에서 중요한 점은 서비스를 한 번에 올린 것이 아니라, 각 서비스의 성격에 맞게 리소스를 나눠서 배포했다는 점이다.
- 상태 저장 서비스 → StatefulSet
- 반복 실행 서비스 → Deployment
- 서비스 간 연결 → Service
- 초기화 작업 → Job
특히 Kafka topic은 단순 부가 설정이 아니라, Spark Streaming 서비스가 정상적으로 시작되기 위해 먼저 준비되어야 하는 의존 리소스라는 점을 확인할 수 있었다.
9. 마치며
이번 단계에서는 실제 데이터 처리 이전에 필요한 기반 서비스를 먼저 Kubernetes 클러스터 위에 구성했다.
특히 Kafka, Redis, MySQL과 같은 서비스들은 단순 실행이 아니라
- 상태 저장 여부
- 서비스 간 연결 구조
- 초기화 순서
- 후속 서비스 의존성
을 고려해 리소스를 분리할 필요가 있었다.
또한 Spark Streaming이 안정적으로 실행되기 위해서는 Kafka topic 역시 사전에 준비되어 있어야 했고, 이를 별도 Job으로 분리하면서 초기화 작업과 지속 실행 서비스를 구분할 수 있었다.
이를 통해 이후 데이터 파이프라인이 안정적으로 동작할 수 있는 기반 환경을 먼저 준비할 수 있었다.
다음 글
다음 단계에서는 Airflow를 Kubernetes 환경에 배포하고, 실제 데이터가 Kafka → Spark Streaming → Redis → MySQL, S3 로 이어지는 전체 흐름이 정상적으로 연결되는지를 검증할 예정이다.
특히 이번에는 단순 서비스 실행 여부가 아니라,
- Airflow DAG를 통한 데이터 생성
- Kafka topic 데이터 적재
- Spark Streaming의 실시간 구독 및 처리
- Redis 저장 확인
- MySQL, S3 최종 적재 확인
과정을 순차적으로 확인하면서, 실제 데이터 파이프라인이 Kubernetes 환경에서 정상적으로 동작하는지를 검증할 예정이다.
또한 Spark Streaming을 DAG 실행 시마다 생성하는 구조가 아니라, Kafka topic을 지속적으로 구독하는 상시 실행 서비스 형태로 구성하면서 스트리밍 기반 처리 구조도 함께 확인할 예정이다.
'Navisafe > Infrastructure' 카테고리의 다른 글
| 미니 PC 서버 Kubernetes 배포 (2) - Airflow 기반 데이터 파이프라인 동작 검증 (0) | 2026.05.12 |
|---|---|
| 미니 PC 서버 Kubernetes 배포 준비 - Namespace · Secret · Spark Operator 구성 (0) | 2026.05.12 |
| 미니 PC 서버에 k3s 기반 Kubernetes 운영 환경 구성 (1) | 2026.05.11 |
| Spark 연동을 위한 AWS RDS(MySQL) 환경 구성 (0) | 2026.05.03 |
| AWS S3를 활용한 데이터 저장 구조 설계 (0) | 2026.05.02 |