[CryptoStream] GCS 요청수 문제 해결하고 비용 줄이기
·
프로젝트/CryptoStream
많은 수의 insert 요청으로 인한 GCS 비용 문제GCS Consumer는 Kafka의 topic에서 메시지를 읽어오고, JSON 타입의 호가창 데이터를 GCS bucket에 저장하는 역할을 합니다.이러한 적재 과정에서 실시간성을 보장하기 위해, Kafka Consumer의 파라미터 설정을 fetch_max_wait_ms=0으로 하여 topic에 메시지가 있다면 바로 읽어오고 처리하는 방식으로 구현했었습니다.이는 GCS bucket에 최신의 데이터를 유지할 수 있다는 장점이 있지만, 초 당 많은 insert 요청이 발생하여 GCS 비용이 증가하는 문제가 발생했습니다. 실제로 데이터 파이프라인을 운영해본 결과, GCS 비용으로만 하루에 ₩150,000 ~ ₩200,000의 비용이 발생했습니다. 또한 b..
[k8s] RBAC
·
DevOps/Kubernetes
RBAC (Role-Based Access Control)Kubernetes에서 사용자와 서비스 계정에 권한을 부여해서, 클러스터 리소스에 대한 접근을 제어하는 기능kubectl을 사용하는 사용자와 쿠버네티스 API를 사용하는 내부 컴포넌트에 대해 적용Kubernetes API 서버에서 권한을 관리 권한 부여 흐름Role을 사용하여 리소스에 대한 권한 정책을 설정하고, 해당 Role을 RoleBinding을 통해 특정 사용자 또는 서비스 계정에 부여예시Role에 Pod 읽기 및 쓰기 권한을 추가RoleBinding을 사용하여 해당 Role을 사용자에게 바인딩사용자는 특정 Pod에 대해 읽기 및 쓰기 작업을 수행 가능 권한 부여 방식에 따른 범위 차이Role과 RoleBinding은 네임스페이스 내 리소스..
[k8s] Volume
·
DevOps/Kubernetes
EmptyDirPod 내 컨테이너들 간에 데이터를 공유하기 위해 제공되는 임시 스토리지 볼륨볼륨을 컨테이너 파일 시스템의 특정 지점과 연결Pod와 같은 라이프사이클을 가짐 (Pod가 삭제되면 볼륨도 삭제)동일 Pod의 컨테이너들이 하나의 볼륨을 공유하도록 할 수 있음 EmptyDir 예시volumes에 볼륨을 정의하고, VolumesMounts에서 컨테이너의 디렉터리와 볼륨을 마운트apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 volumeMounts: - name: nginx-volum..
[CryptoStream] Kafka 도입기
·
프로젝트/CryptoStream
도입 배경현재 데이터 파이프라인에서 메시지 브로커로 Redis Stream을 사용하고 있으며, 이를 운영하며 다음과 같은 문제점이 있음을 확인했습니다. 늘어나는 메모리 부담Redis Stream는 기본적으로 데이터를 캐시 메모리에 저장합니다.데이터 파이프라인에서 3일치의 데이터를 저장하기 위해, ticker 하나당 1,500,000건을 Redis Stream에 저장하고 있으며, 6개 ticker의 데이터를 수집 했을 때 지속적으로 메모리 사용량이 증가하여 최대 4.5GiB를 사용함을 확인했습니다.이를 기준으로 ticker 하나당 3일치 데이터를 저장하기 위해서는 약 0.75GiB의 메모리가 필요함을 추정할 수 있습니다.현재 원화 마켓에서 거래 중인 코인은 155개입니다. 이를 모두 Redis Stream..
[k8s] ConfigMap & Secret
·
DevOps/Kubernetes
ConfigMap애플리케이션에서 사용할 설정 데이터를 저장하고 관리하기 위한 객체문자열 데이터를 키-값 쌍으로 저장하거나 파일 형식으로 저장환경 변수, 명령줄 인자, 설정 파일, 포트 등과 같은 비밀이 아닌 데이터를 외부에서 설정하고, 이를 Pod 등의 매니페스트에서 불러와 사용 ConfigMap 매니페스트 apiVersion: v1kind: ConfigMapmetadata: name: example-configdata: database_url: "postgresql://user:password@host:port/dbname"data: ConfigMap에 저장할 데이터를 정의 환경 변수로 ConfigMap 사용apiVersion: v1kind: Podmetadata: name: app-podspec..
[k8s] Service
·
DevOps/Kubernetes
Service애플리케이션 간 통신을 가능하게 하는 추상화된 네트워크 리소스로, Pod의 네트워크 주소를 추상화하여 안정적인 연결을 제공 Service의 필요성변경되는 Pod의 IP 주소: Pod은 생성, 삭제, 교체가 반복되며, IP 주소가 동적으로 변경되는데, 애플리케이션 간 통신에서 변경된 IP 주소를 추적하는 것은 어려움Service를 통한 안정적 연결: Service는 고정된 가상 IP(ClusterIP)를 제공하여, Pod의 실제 IP 변경과 무관하게 애플리케이션이 안정적으로 통신할 수 있도록 함 주요 특징고유한 IP 주소: Service는 자신만의 IP 주소를 가지며, Service가 삭제될 때까지 바뀌지 않음서비스 디스커버리 기능: Service 생성시 IP 주소가 클러스터 내 DNS 서버에..
[k8s] Deployment
·
DevOps/Kubernetes
컨트롤러쿠버네티스에서 리소스를 관리하는 객체로, 시스템의 현재 상태(actual state)와 원하는 상태(desired state)를 지속적으로 비교하여 차이를 자동으로 수정하는 역할을 수행컨트롤러는 특정 리소스의 상태를 확인하고, 쿠버네티스 API와 상호작용하여 시스템을 원하는 상태로 유지컨트롤러는 레이블 셀렉터를 통해 자신이 관리하는 리소스를 식별 컨트롤러의 필요성Pod는 일회성의 생애 주기를 가짐으로, 유실 시 자동으로 복구되지 않음따라서 컨트롤러를 통해 Pod의 복제본 수 유지, 스케일링, Pod 유실 시 복구 등과 관리 작업을 자동으로 수행해야함 주요 컨트롤러Deployment: Pod의 복제본 수를 관리하고, Pod를 최신 상태로 유지ReplicaSet: 지정된 수의 Pod를 항상 실행되도록..
[k8s] Pod
·
DevOps/Kubernetes
Pod하나 이상의 컨테이너를 포함하는 쿠버네티스의 가장 작은 배포 단위Pod는 컨테이너와 같이 한 번 사용되고 폐기되는 일회성 임시 엔티티로 간주됨 주요 특징단위 관리: 하나 이상의 컨테이너 또는 볼륨을 포함하며 이를 관리함공유 네트워크: Pod 내의 모든 컨테이너는 동일한 네트워크를 공유고유한 IP: 고유한 가상 IP를 가지며, 이를 통해 클러스터 내 다른 Pod들과 통신공유 볼륨: Pod 내의 컨테이너는 동일한 볼륨을 공유하여 데이터를 교환클러스터 내 실행: Pod는 클러스터 중 하나의 노드에서 실행됨Pod의 라이프사이클Pod가 생성, 실행, 종료되는 일련의 과정으로, Pod는 여러 상태를 거치면서 실행됨Pending (대기 중): Pod가 생성되었지만, 아직 클러스터 내에서 적합한 노드에 할당되지 ..