kubernetes 환경에서 elasticsearch를 설치하는 방법을 정리하였습니다. 비록 테스트 환경이지만 실제 운영환경처럼 구성하기 위해 3대의 마스터 노드와 2대의 데이터 노드로 구성하였습니다(현업에서 직접 사용할 경우 보다 더 여유 있는 구성을 추천드립니다) 3대의 마스터 노드 중 실제로 마스터의 역할을 수행하는 것은 1대이며 나머지 2대의 마스터 노드는 현재 마스터 노드의 문제가 발생할 경우 마스터로 승격할 수 있도록 Standby 형식으로 구성하였습니다.

 

1. Helm chart 다운로드

저는 kubernets 환경에서 elasticsearch를 설치하기 위해 helm을 사용하였습니다. 아래 링크의 helm으로 구성하였습니다.
https://artifacthub.io/packages/helm/elastic/elasticsearch

 

elasticsearch 8.5.1 · elastic/elastic

Official Elastic helm chart for Elasticsearch

artifacthub.io

 

helm 명령어를 통하여 repo를 추가하고 다운로드합니다.

# helm repo 추가
$ helm repo add elastic https://helm.elastic.co

# helm 파일 다운로드
$ helm pull elastic/elasticsearch
$ ls -al
drwxr-xr-x@  6 hsw  staff    192  6 25 09:45 .
drwxr-xr-x@  9 hsw  staff    288  6 25 09:44 ..
-rw-r--r--@  1 hsw  staff  28898  6 25 09:45 elasticsearch-8.5.1.tgz

# helm 압축 출기
$ tar -zxvf elasticsearch-8.5.1.tgz
$ ls -al
drwxr-xr-x@  6 hsw  staff    192  6 25 09:45 .
drwxr-xr-x@  9 hsw  staff    288  6 25 09:44 ..
drwxr-xr-x@ 12 hsw  staff    384  6 25 10:26 elasticsearch
-rw-r--r--@  1 hsw  staff  28898  6 25 09:45 elasticsearch-8.5.1.tgz

 

2. values.yaml 수정

elasticsearch 디렉토리로 이동하여 values 값을 설정합니다. 저의 경우 values.yaml 파일을 직접적으로 수정하는 것보다는 새로운 yaml을 구성하여 values.yaml 파일을 override 하여 사용하는 것을 선호하기 때문에 마스터 노드와 데이터 노드 별로 설정파일을 구성하여 작업하였습니다.

master.yaml 파일 구성

마스터 노드는 3대로 구성되어 있고 클러스터 유지를 위해 CPU는 4 코어, Memory는 16GB로 여유 있게 구성하였습니다. 그리고 Lucene의 메모리 사용을 위해 16GB의 절반인 8GB만 JVM옵션으로 설정을 하였습니다.

tolerations, nodeAffinity의 경우 사용자 환경에 맞게 설정하여 사용해 주세요 사용법은 링크를 달아놨습니다.
tolerations : https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/
nodeAffinity : https://kubernetes.io/ko/docs/concepts/scheduling-eviction/assign-pod-node/

##################################
# cluster info
createCert: false
clusterName: "elasticsearch"
nodeGroup: "master"
replicas: 3
imageTag: "7.10.2"

roles:
- master

##################################
# nodeAffinity
tolerations:
- key: "develop/elasticsearch-master"
  operator: "Exists"

nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
  nodeSelectorTerms:
    - matchExpressions:
      - key: develop/group
        operator: In
        values:
        - elasticsearch-master

##################################
# cluster config
# 테스트 환경이라 보안 설정을 끔
esConfig:
  elasticsearch.yml: |
    xpack.security.enabled: false

# AWS S3 스냅샷 테스트를 위한 설정
esJvmOptions:
  jvm.options: |
    -Des.allow_insecure_settings=true

##################################
# resources
esJavaOpts: "-Xmx8g -Xms8g"

resources:
  requests:
    cpu: 4
    memory: "16Gi"
  limits:
    cpu: 4
    memory: "16Gi"

volumeClaimTemplate:
  resources:
    requests:
      storage: 10Gi
  storageClassName: openebs

##################################
# service
protocol: http
service:
  type: NodePort
  nodePort: "30090"

data.yaml 파일 구성

데이터 노드의 경우 마스터 노드보다 더 많은 요청을 처리하고 데이터 관리를 수행하기 때문에 마스터 노드보다 더 여유 있는 스펙으로 리소스를 구성하였습니다. 데이터 노드 또한 마스터 노드처럼 사용자의 환경에 맞는 값으로 구성해 주세요

##################################
# cluster info
createCert: false
clusterName: "elasticsearch"
nodeGroup: "data"
replicas: 2
imageTag: "7.10.2"

roles:
- data
- ingest

##################################
# nodeAffinity
tolerations:
- key: "develop/elasticsearch-data"
  operator: "Exists"

nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
  nodeSelectorTerms:
    - matchExpressions:
      - key: develop/group
        operator: In
        values:
        - elasticsearch-data

##################################
# cluster config
# 테스트 환경이라 보안 설정을 끔
esConfig:
  elasticsearch.yml: |
    xpack.security.enabled: false

# AWS S3 스냅샷 테스트를 위한 설정
esJvmOptions:
  jvm.options: |
    -Des.allow_insecure_settings=true

##################################
# resources
esJavaOpts: "-Xmx16g -Xms16g"

resources:
  requests:
    cpu: 8
    memory: "32Gi"
  limits:
    cpu: 8
    memory: "32Gi"

volumeClaimTemplate:
  resources:
    requests:
      storage: 200Gi
  storageClassName: openebs

##################################
# service
# UI 사용을 위해 NodePort로 설정
protocol: http
service:
  type: NodePort
  nodePort: "30091"

Makefile 구성

저는 지속적으로 지웠다 설치했다는 반복 하는데 편리하기 위해 Makefile을 구성하였습니다.

PREFIX := es
TIMEOUT := 1200s
NAMESPACE := elasticsearch

install:
helm upgrade --wait --timeout=$(TIMEOUT) --install -n $(NAMESPACE) --create-namespace --values override-master.yaml $(PREFIX)-master .
helm upgrade --wait --timeout=$(TIMEOUT) --install -n $(NAMESPACE) --create-namespace --values override-data.yaml $(PREFIX)-data .

purge:
helm del $(PREFIX)-master -n $(NAMESPACE)
helm del $(PREFIX)-data -n $(NAMESPACE)

 

3. 설치 진행

Makefile을 이용하여 설치를 진행합니다.

# elasticsearch 설치
$ make install

 

설치 작업이 완료 되면 Elasticsearch는 다음과 같이 구성됩니다.

pod/elasticsearch-data-0             1/1     Running     0       1d
pod/elasticsearch-data-1             1/1     Running     0       1d
pod/elasticsearch-master-0           1/1     Running     0       1d
pod/elasticsearch-master-1           1/1     Running     0       1d
pod/elasticsearch-master-2           1/1     Running     0       1d

service/elasticsearch-data               NodePort    10.233.47.200  <none>   9200:30091/TCP,9300:31095/TCP   1d
service/elasticsearch-data-headless      ClusterIP   None           <none>   9200/TCP,9300/TCP               1d
service/elasticsearch-master             NodePort    10.233.56.28   <none>   9200:30090/TCP,9300:32277/TCP   1d
service/elasticsearch-master-headless    ClusterIP   None           <none>   9200/TCP,9300/TCP               1d

statefulset.apps/elasticsearch-data         2/2     1d
statefulset.apps/elasticsearch-master       3/3     1d

 

4. Elasticsearch 삭제

테스트가 끝나고 elasticsearch를 지우기 위해서는 다음과 같이 진행하면 됩니다.

# Elasticsearch 제거
$ make purge

 

본 문서는 2023년 7월에 작성된 문서입니다.

Artifact Hub는 Kubernetes 커뮤니티의 중앙 리소스 저장소로서, 다양한 애플리케이션 패키지, Helm 차트, OPA 정책, Falco 규칙 등을 검색, 탐색 및 공유할 수 있는 오픈 소스 플랫폼입니다. 즉 Artifact Hub는 사용자와 Helm chart repository를 중개하는 역할을 수행하고 있습니다. 오늘은 Helm package를 Artifact Hub에 등록하여 사용하는 방법에 대하여 정리하였습니다.

 

시작하기 전에

Helm chart repository는 github으로 구성하고 Artifact Hub를 이용하여 Helm chart repository와 중개하도록 구성하였습니다.

 

1. github repo 생성

자신의 github에 helm package를 등록할 수 있도록 github repository를 생성하여 줍니다. 저는 repository 명을 test-nginx라고 명시하였습니다.

 

2. 실습 디렉토리 구성

helm-nginx 디렉토리는 실제 helm chart를 작성하였고 test-nginx는 방금 생성한 github repo를 clone 한 디렉토리입니다. helm-nginx 디렉토리에서 작성된 helm chart를 test-nginx에 package 하여 github에 push를 할 예정입니다.

 

3. Helm chart 작성

helm-nginx 디렉토리로 이동하여 helm chart를 간단하게 구성도록합니다. 이번 실습에서는 불필요한 부분은 제거하고 values.yaml파일과 templates/deployment.yaml만 작업하였습니다.

values.yaml

위에 사진과 내용이 동일합니다. (실습 복붙용)

name: test-nginx

replicas: 1

imageTag: latest

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

deployment.yaml

위에 사진과 내용이 동일합니다. (실습 복붙용)

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: {{ .Values.name }}
  name: {{ .Values.name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Values.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        resources:
{{ toYaml .Values.resources | indent 10 }}

정상적으로 작성되었는지 확인

--dry-run 옵션을 통해 실제로 생성하지 않고 helm이 잘 작성되었는지 확인할 수 있습니다.

$ helm install test --dry-run .
# 결과
NAME: test
LAST DEPLOYED: Sat Jul  1 13:51:49 2023
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: helm-nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test-nginx
  name: test-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-nginx
  template:
    metadata:
      labels:
        app: test-nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        resources:
          limits:
            cpu: 500m
            memory: 128Mi
          requests:
            cpu: 250m
            memory: 64Mi

 

4. helm package 생성

상위 디렉토리인 helm 디렉토리로 이동하여 helm package 명령을 수행하여 package를 생성합니다.

# helm package 생성
$ helm package ./helm-nginx/ --destination ./test-nginx

# helm index 생성
$ helm repo index ./test-nginx

# 결과 확인
$ ls -al ./test-nginx/
total 24
drwxr-xr-x 3 hsw hsw 4096 Jul  1 14:52 .
drwxr-xr-x 4 hsw hsw 4096 Jul  1 14:27 ..
drwxr-xr-x 8 hsw hsw 4096 Jul  1 14:53 .git
-rw-r--r-- 1 hsw hsw    6 Jul  1 14:27 README.md
-rw-r--r-- 1 hsw hsw  799 Jul  1 14:27 helm-nginx-0.1.0.tgz
-rw-r--r-- 1 hsw hsw  397 Jul  1 14:52 index.yaml

 

5. github push

$ git add .
$ git commit -m "create helm package"
$ git push

 

6. github pages 설정

Settings - Pages로 이동하여 다음과 같이 설정합니다. 3번까지 수행한 후 해당 페이지를 새로고침 하면 4번처럼 주소가 나옵니다. 해당 주소를 복사하고 있다가 Artifact Hub 설정에서 사용합니다.

 

7. Artifact Hub에 등록하기

Artifact Hub에 접속하여 로그인합니다.

https://artifacthub.io/

 

Artifact Hub

Find, install and publish Kubernetes packages

artifacthub.io

 

우측 상단 User 아이콘 클릭 후 Control Panel을 선택하여 줍니다.

 

ADD REPOSITORY를 선택하게 되면 다음과 같이 화면이 나오는데 여기서 해당된 값을 입력합니다.

  • Kind : Helm charts
  • Name : 등록될 Repository 이름
  • Display name : 사용자에게 보이는 이름
  • Url : 등록할 github 주소

ADD 버튼을 클릭하여 추가하게 되면 다음과 같이 Repo가 생성됩니다.

Repo 설정이 완료되었다면 일정 시간 간격(약 30분)으로 Repo 스캔을 하게 됩니다. 스캔이 완료되면 해당 Repo를 통하여 helm을 이용해 배포할 수 있습니다.

 

'Kubernetes' 카테고리의 다른 글

kubernetes max pods 개수 수정  (0) 2024.07.31
[Helm] Helm 기본 명령어  (0) 2023.07.15
2023 CKA(Certified Kubernetes Administrator) 취득 후기  (0) 2023.07.01

본 문서는 2023년 7월에 작성된 문서입니다.

Helm은 Kubernetes 애플리케이션을 배포, 관리 및 업데이트하기 위한 패키지 관리 도구입니다. Helm은 Kubernetes 클러스터에서 애플리케이션을 쉽게 설치하고 관리하기 위한 기능을 제공합니다. Helm은 "차트"라고 하는 패키지 형식을 사용하여 Kubernetes 애플리케이션을 정의합니다. 차트는 Kubernetes 리소스 (파드, 서비스, 볼륨 등)를 정의하는 템플릿 파일과 해당 애플리케이션을 배포하고 구성하는 데 필요한 매개변수 및 값들을 포함합니다. 이러한 차트를 사용하여 애플리케이션을 쉽게 배포하고 업데이트할 수 있습니다.

helm 설치

아래 링크를 통하여 helm 설치를 진행하여 줍니다.

https://helm.sh/docs/intro/install/

 

Installing Helm

Learn how to install and get running with Helm.

helm.sh

helm repository

helm으로 설치를 진행하기 위해서는 chart를 가지고 있는 repository를 등록하여 사용해야 합니다.

# 설치하는데 필요한 chart를 가져오는 repository를 등록합니다.
helm repo add 레포지토리명 레포지토리주소

# 등록한 repository에서 설치할 수 있는 목록을 출력합니다.
helm search 레포지토리명

# 등록한 repository를 최신으로 update합니다.
helm repo update

helm install

앞에서 repo를 등록하였다면 이제는 등록된 repo를 이용하여 kubernets에 설치 작업을 진행할 수 있습니다.

helm install -n 네임스페이스 --create-namespace 앱이름 레포지토리명/설치할앱

helm upgrade

기존에 설치했던 설정값이 변경되었을 경우 helm upgrade를 통하여 변경된 내용을 적용할 수 있습니다.

helm upgrade -n 네임스페이스 앱이름 레포지토리명/설치할앱

helm delete

더 이상 배포한 앱을 사용하지 않는다면 helm delete를 통해 자원을 반납할 수 있습니다.

helm delete -n 네임스페이스 앱이름

 

[실습] helm을 이용하여 kubernetes에 nginx 설치하기

이번에 실습 예시로 helm을 이용하여 kubernets 환경에 nginx를 기본 값으로 설치하는 방법에 대해서 알아보겠습니다. helm의 repository는 ArtifactHub에서 검색할 수 있습니다. 

https://artifacthub.io/

 

Artifact Hub

Find, install and publish Kubernetes packages

artifacthub.io

 

ArtifactHub에서 nginx를 검색하면 다음과 같이 나오는데요 여기서 중요하게 봐야 되는 것 3가지가 있습니다.

먼저 어느 단체에서 만들었는지 그리고 Star를 몇개 받았는지 마지막으로 인증된 helm chart인지를 확인하여 사용자에게 가장 합리적인 것을 선택하여 줍니다.

 

페이지로 들어오면 다음과 같은 화면이 나옵니다. 이 페이지에서 helm chart에 대한 상세한 설명이 나오니 정확한 정보를 확인하기 위해서는 해당 페이지를 참고하는 것을 추천드립니다.

이제 Kubernetes 환경에 nginx를 설치하기 위해서는 INSTALL 버튼을 클릭하여 줍니다.

 

화면에 출력된 명령어를 입력하게 되면 자신의 환경에 nginx가 설치됩니다.

결과 확인

$ kubectl get po
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6ff77558fc-qzgw5   1/1     Running   0          15s

설치 내역 삭제하기

helm delete my-nginx

 

 

 

+ Recent posts