kind로 Elasticsearch 3노드 클러스터 구성

kind cluster
 ├─ elasticsearch-0
 ├─ elasticsearch-1
 └─ elasticsearch-2

 

1. Headless Service 생성

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
spec:
  clusterIP: None
  selector:
    app: elasticsearch
  ports:
    - name: http
      port: 9200

 

Headless Service는 Pod별 DNS를 생성해줍니다. StatefulSet과 함께 엘라스틱서치 노드 간 통신에 필요합니다.

 

2. StatefulSet 설정

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
spec:
  replicas: 3
  serviceName: elasticsearch
  selector:
    matchLabels:
      app: elasticsearch
  template:
    spec:
      containers:
        - name: elasticsearch
          image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
          env:
            - name: discovery.seed_hosts
              value: "elasticsearch-0.elasticsearch,elasticsearch-1.elasticsearch,elasticsearch-2.elasticsearch"
            - name: cluster.initial_master_nodes
              value: "elasticsearch-0,elasticsearch-1,elasticsearch-2"

최초 마스터 노드 후보 값Headless Service 이름이 맞아야 한다는 것입니다.

 

※ 상태 확인

kubectl get pods
kubectl port-forward svc/elasticsearch 9200:9200
curl http://localhost:9200/_cluster/health?pretty

 

 

Python으로 Elasticsearch에 데이터 적재하기 

from elasticsearch import Elasticsearch, helpers
from datetime import datetime
import uuid

es = Elasticsearch("http://localhost:9200")
index_name = "logs-test"

if not es.indices.exists(index=index_name):
    es.indices.create(index=index_name)

docs = []
for i in range(10):
    docs.append({
        "_index": index_name,
        "_id": str(uuid.uuid4()),
        "_source": {
            "message": f"hello elasticsearch {i}",
            "timestamp": datetime.utcnow().isoformat()
        }
    })

helpers.bulk(es, docs)
print("데이터 적재 완료")

 

python python_app_name.py

 

🧠 마무리 요약

오늘 정리한 내용을 간단히 요약하면 아래와 같습니다.

  • 쿠버네티스는 컨테이너 운영 자동화를 위해 등장한 표준 플랫폼이다.
  • Pod는 언제든 죽고 다시 생성될 수 있기 때문에 Service로 접근해야 한다.
  • Deployment vs StatefulSet은 상태 저장 여부에 따라 선택한다.
  • kind는 Docker 기반으로 로컬에서 Kubernetes 클러스터를 띄울 수 있는 훌륭한 도구다.
  • Elasticsearch 같은 상태 저장 시스템은 StatefulSet + Headless Service 구조로 운영해야 한다.

최근 Docker 기반 서비스의 운영 자동화에 대한 필요를 느끼면서 Kubernetes를 본격적으로 공부하게 되었습니다.

Docker만으로 여러 서버/서비스를 관리하는데는 한계가 있었고, 쿠버네티스는 이런 환경을 훨씬 안정적으로 관리할 수 있게 해주었습니다.

 

이번 포스팅에서는 쿠버네티스의 핵심 개념과 작동 원리, 그리고 Kind를 활용한 로컬 실습 환경 구성까지 정리해보려고 합니다.

 

🧠 쿠버네티스란?

쿠버네티스(Kubernetes)는 여러 서버(Node) 위에서 컨테이너화된 애플리케이션을 자동으로 배포·확장·운영할 수 있게 해주는 오픈소스 플랫폼입니다.

Docker는 개별 컨테이너 실행에 유리하지만, 다음과 같은 문제가 발생합니다:

  • 컨테이너가 증가하면 어디에 배치할지 관리가 어려움
  • 서버 장애 시 자동 복구가 필요
  • 트래픽 증가에 따른 자동 확장 필요

쿠버네티스는 이러한 문제를 자동화해주며, 서비스 안정성과 운영 효율을 높여줍니다.

소규모 서비스이거나 테스트용일때는 Docker로 개발하는게 효율적이지만 서비스의 규모가 커지면 쿠버네티스가 효율적입니다.

 

📦 쿠버네티스를 사용하면 효율적인 이유

자동 복구(Self-healing) 죽은 컨테이너 자동 재시작
자동 확장(Auto-scaling) 트래픽에 따라 Pod 수 자동 조절
롤링 업데이트 무중단 배포 가능
자원 관리 CPU/메모리 요청/제한 관리
운영 표준화 YAML 선언형 관리

 

☸️ 쿠버네티스의 구조와 동작 방식

쿠버네티스는 다음처럼 구성됩니다.

  • Cluster : 여러 서버(Node)를 묶은 전체 집합
  • Control Plane : 클러스터를 관리하는 두뇌
  • Node : Pod가 실행되는 서버(실제 서버 / VM / Docker)
  • Pod : 컨테이너 실행 단위
  • Deployment/StatefulSet : Pod 관리 단위
  • Service : 네트워크 접근 지점 제공

특히 Pod는 언제든지 죽고 재생성될 수 있으며, 내부 IP도 변경됩니다. 그래서 Pod IP로 직접 통신하지 않고, Service라는 고정된 접점을 통해 통신합니다.

 

🚦 Deployment vs StatefulSet

쿠버네티스에서 워크로드를 관리하는 두 가지 주요 객체입니다.

Deployment

  • Stateless 애플리케이션용
  • 항상 지정한 개수(replicas)를 유지
  • 새로운 배포 시 무중단 업데이트 가능

StatefulSet

  • Stateful 애플리케이션용
  • Pod 이름/스토리지 고정
  • DB, 검색엔진, 메시징 큐 등 상태가 중요한 서비스에 적합

예를 들어 Elasticsearch, Kafka 등은 상태(stateful)가 있기 때문에 StatefulSet으로 운영합니다. (즉 Pod가 재생성되어도 이름/데이터가 유지되어야 함)

 

🛠️ 로컬 실습 환경 — kind란?

kind (Kubernetes in Docker) 는 Docker 위에서 쿠버네티스 클러스터 전체를 띄울 수 있는 실습용 도구입니다.
kind는 Kubernetes를 흉내내는 것이 아니라, 실제 Kubernetes 클러스터와 동일한 방식으로 동작하기 때문에 실습과 학습에 매우 적합합니다.

 

간단히 말하면:

Docker 컨테이너가 “쿠버네티스 노드(Node)”로 동작함

이 때문에 개인 PC 환경에서도 복잡한 클라우드 설정 없이 바로 Kubernetes를 띄울 수 있습니다.

 

Kind 실습은 다음 포스팅에서 작성하도록 하겠습니다.

docker에서 test로 hadoop을 공부하고 있는 도중,
namenode와 datanode가 서로 연결되지 않아 
데이터를 전송하지 못하는 상황이 발생하였습니다.

datanode가 연결되지 않는 원인을 찾아
core-site.xml을 수정하는 해결 방법을 시도하려고 하였으나,
debian9라는 오래된 운영체제의 이슈로 vi/vim/nano 모두 편집기가 실행되지 않았습니다.

이때, 편집기 없이 내부에 있는 텍스트를 수정하기 위한 방법을 공유드립니다.

 

sed 명령어로 파일 수정하기

  • sed는 스트림 편집기로, 파일의 내용을 변경할 때 유용합니다. 기존 파일을 덮어쓰거나, 필요한 내용을 파일에 추가할 수 있습니다.

sed -i 's/old-text/new-text/' 경로

 

-> 이 명령은 old-text를 찾아 new-text로 바꿉니다.

 

변경 전 :

 

변경 후 :

ubuntu 환경에서

패키지 업데이트를 위해 sudo update 명령어를 실행하였으나

 

0% [Connecting to download.docker.com] 에서 멈춰 진행되지 않았습니다.

 

관련된 에러 해결 방법에 대해 공유합니다.

 

우선, 에러의 원인은 IPv6 문제로 인해 연결에 실패하였습니다.

IPv6의 비활성화를 통해 해결이 가능했습니다.

 

[해결 방법]

1. sysctl.conf 파일 수정:

vi /etc/sysctl.conf

 

 

2. 아래 내용을 추가합니다.(IPv6 비활성화)

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

 

3. 위 내용을 서버에 적용합니다.

sudo sysctl -p

 

IPv6를 비활성화하니 정상작동 되었습니다 ~

'데이터 엔지니어 > 서버' 카테고리의 다른 글

[서버] GPU 서버 구축기  (0) 2024.08.12
[AWS] EC2 - 9090port로 접속 안되는 이슈 해결  (0) 2023.09.11
[서버]TCP 통신  (0) 2022.07.06

회사에서 모델학습을 위해 GPU서버를 요청해서 드디어 받았습니다.

 

사용을 하기 위해 구축을하였는데,

이때 발생한 오류들을 기록하면서 공유하도록 하겠습니다.

 

1. NVIDIA 드라이버 설치

#1. 드라이버 설치를 위해 기존 드라이버 제거(필요시)
sudo apt-get purge nvidia*

#2. 드라이버 목록 업데이트:
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update

#3. NVIDIA 드라이버 설치
sudo apt-get install nvidia-driver-535

#4. 시스템 재부팅
sudo reboot

#5. 설치 확인
nvidia-smi

 

# 설치 완료시 화면 

2. CUDA 툴킷 설치 

# 1.cuda 11.8버전 다운로드
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run

# 2.cuda 툴킷 설치
sudo sh cuda_11.8.0_520.61.05_linux.run

# 3.환경 변수 설정
echo 'export PATH=/usr/local/cuda-11.2/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

 

 

## 설치시 발생했던 오류

1. cuda 툴킷을 실행하면서 GCC버전 오류로 인해 cuda 툴킷 설치 불가

해결방법

기존 GCC버전을 임시로 변경 -> 호환 가능한 GCC 설치 및 링크 -> cuda 설치 -> 설치 후 기존 GCC 복구

# 1. 기존 GCC 백업
sudo mv /usr/bin/gcc /usr/bin/gcc-backup
sudo mv /usr/bin/g++ /usr/bin/g++-backup

# 2. 호환 가능한 GCC 설치 및 링크
sudo ln -s /usr/bin/gcc-10 /usr/bin/gcc
sudo ln -s /usr/bin/g++-10 /usr/bin/g++

# 3. cuda 설치 
sudo sh cuda_11.8.0_520.61.05_linux.run

# 4. 설치 후 기존 GCC 복구
sudo rm /usr/bin/gcc
sudo rm /usr/bin/g++
sudo mv /usr/bin/gcc-backup /usr/bin/gcc
sudo mv /usr/bin/g++-backup /usr/bin/g++

 

이후에는 패키지 및 라이브러리를 설치해서 사용하실 수 있습니다.

2일전까지 정상적으로 돌아갔던 코드가 오늘 갑자기 

 

OSError: [WinError 193] %1은(는) 올바른 Win32 응용 프로그램이 아닙니다

 

라는 에러를 띄우며 selenium이 실행되지 않았습니다.

저와 같은 에러가 발생한 분들이 많아 보였고, 해결방법을 찾아봤습니다.

 

위 에러가 발생한 원인은 다음과 같습니다.

새로운 Chromedriver 배포판에 Chromedriver 바이너리 옆에 THIRD_PARTY_NOTICES.chromedriver가 포함된 것 같습니다.

잘못된 크롬 드라이버로 인해 selenium이 실행되지 않은것으로 보입니다.

 

 

해결방법 아래와 같습니다.

1.pip install webdriver-manager --upgrade 를 통해서  webdriver-manager의 버전을 4.0.2버전으로 업그레이 해주시고,

2. print(ChromeDriverManager().install()) 로 현재 chromedriver의 설치 위치를 찾아 폴더를 삭제해줍니다.

3. 그리고 다시 실행하면 정상적으로 selenium이 실행됩니다.

 

- 개념 

LTV(Life Time Value)는 고객 한 명이 회사에게 전체 수명 동안 가져다주는 가치를 측정합니다.

 

- 필요성

신규고객 획득비용 (CAC) 설정 기준이되며, 효율적인 마케팅 채널을 파악하여 예산을 분배할 수 있습니다.

 

- LTV 계산법

LTV = ARPU x 리텐션

ARPU :유저당 주문금액(매출/유저수)

그룹을 코호트로 쪼개어서 LTV 비교 분석

 

- 유의사항 

1. 고객 평가 주기의 결정 

 이는 고객이 회사와 상호작용하는 주기를 나타내며, 예를들어 일년 또는 여러 해 등이 될 수 있습니다. 고객 평가 주기는 비즈니스의 성격과 상품 또는 서비스의 특성에 따라 결정 됩니다.

 

2. 잔존 가치 계산 

잔존 가치는 고객이 관계를 유지할 동안 회사에 제공할 것으로 예상되는 가치를 나타냅니다. 이를 정확하게 계산하기 위해서는 고객의 구매이력, 이탈률, 가치창출 가능성 등을 종합적으로 고려해야 합니다.

 

3. 고객 유형 및 세분화 

서로 다른 고객 그룹은 회사에 서로 다른 가치를 제공할 수 있으며, 이를 고려하여 LTV를 계산하는 것이 더욱 정확한 결과를 얻을 수 있습니다.

 

4. 기간 내 변동 요인 고려 

LTV는 시간이 지남에 따라 변할 수 있습니다. 

 마케팅 캠페인, 경쟁사의 활동, 경제적 변동 등이 영향을 미칠 수 있습니다.

 

5. 지속적인 모니터링과 업데이트

고객의 구매 행동이나 시장 상황의 변화에 따라 LTV는 변할 수 있으며, 이러한 변화를 감지하고 대응하기 위해 지속적인 모니터링이 필요합니다.

 

- 정리 

1. LTV는 효율적인 마케팅 채널을 파악하여 예산을 분배할 수 있게 해줍니다.

 

'데이터분석 > 분석방법론' 카테고리의 다른 글

[분석방법론] 퍼널 분석  (0) 2024.04.28
[분석방법론] RFM 분석  (0) 2024.04.23
[분석방법론] 코호트 분석  (0) 2024.04.23
[분석방법론] A/B Test  (2) 2024.04.19

- 개념 

고객들이 우리가 설계한 유저 경험 루트를 따라 잘 도착하고 있는지 확인해보기 위해 최초 유입부터 최종 목적지까지 단계를 나누어서 살펴보는 분석 기법입니다.

각 단계를 통과할 때마다 유저 수가 줄어들게 되는데 그림으로 그려보면 점점 좁아지는 형태의 깔대기(Funnel)모양이라 퍼널 분석이라고 말합니다.

각각의 단계를 넘어가는 것은 전환(Conversion)이라고 부르고 그 비율은 전환율(Conversion rate)이 됩니다.

 

- 필요성

얼마나 많은 사람들이 최종 단계까지 도착하는지, 또 어디에서 많이 이탈하는지 확인할 수 있습니다.

 

- 유의사항

1. 정의된 단계의 일관성 : 각 단계는 명확하게 정의되고 일관성 있어야 합니다. 각 단계가 어떤 행동을 나타내는지 명확히 이해되어야 하며, 여러 사람이 동일한 기준으로 단계를 측정할 수 있어야 합니다.

2. 퍼널에서의 드롭아웃 이유 분석 : 사용자가 퍼널의 특정 단계를 완료하지 못한 이유를 분석하는 것이 중요합니다. 이를 통해 장애물을 제거하고 사용자 경험을 향상시킬 수 있습니다.

3. 시간적 관념 고려 : 특정 기간에 사용자의 퍼널 경로가 어떻게 변하는지를 이해하고 분석하는 것이 중요합니다.

4. 다차원 분석 : 단순히 사용자가 특정 단계를 통과하는 것 이상으로, 다양한 특성에 따라 사용자를 세분화하고 분석해야 합니다. 이를 통해 다양한 사용자 그룹의 행동을 이해하고 개별적인 전략을 수립할 수 있습니다.

 

- 정리

1. 퍼널 분석은 최초 유입부터 최종 목적지까지 단계를 나누어서 사용자 경험을 살펴보는 분석 기법입니다.

2. 단계에 따라 사용자들의 이탈 지점을 파악하는데 도움이 되는 분석기법입니다.

 

- 참조문서

https://datarian.io/blog/funnel-analysis

 

'데이터분석 > 분석방법론' 카테고리의 다른 글

[분석방법론] LTV 분석  (1) 2024.04.28
[분석방법론] RFM 분석  (0) 2024.04.23
[분석방법론] 코호트 분석  (0) 2024.04.23
[분석방법론] A/B Test  (2) 2024.04.19

+ Recent posts