엔지니어링

Kubernetes의 Elastic Cloud 시작하기: 배포

아직 알파 단계에 있지만, 최근에 있었던 Kubernetes의 Elastic Cloud(ECK) 발표는 Elasticsearch 커뮤니티와 Kubernetes 커뮤니티 양쪽 모두의 상당한 관심을 불러일으켰습니다. Elastic Stack의 개발자가 개발하고 지원하는 ECK는 Kubernetes에서 Elastic을 배포하는 가장 좋은 방법입니다. 블로그 두 개로 이루어진 이 시리즈의 목표는 다음 작업의 단계별 프로세스를 차근차근 소개해 드리는 것입니다.

  1. Kubernetes 클러스터로 ECK 배포(Minikube 또는 GKE)
  2. ECK로 Elastic Stack 배포
  3. ECK 내에서 Elasticsearch와 Kibana 확장 및 업그레이드
  4. Elastic APM으로 계측된 샘플 애플리케이션 배포 및 APM 데이터를 ECK가 관리하는 Elasticsearch 클러스터로 전송
  5. DaemonSet으로 Metricbeat를 Kubernetes로 배포하고 Metricbeat를 ECK가 관리하는 Elasticsearch 클러스터에 안전하게 연결

블로그가 끝날 때는 아래 다이어그램에 나와 있는 대로의 시스템을 갖게 됩니다. 이 첫 번째 블로그에서는 ECK와 Elastic Stack 배포에 중점을 둡니다.

ECK 배포 다이어그램

또한 ECK에 대한 보다 최신 정보를 보려면 빠른 시작 페이지나 제품 페이지를 참조하실 수 있습니다.

k8s 클러스터 생성하기

ECK와 Elastic Stack을 배포하기 전에, Kubernetes 클러스터 준비 작업을 마쳐야 합니다. 이 블로그의 목적을 위해서는 Minikube 또는 Google Kubernetes Engine(GKE)이 그 작업을 하게 됩니다. 우리는 또한 OpenShift, Amazon EKS, Microsoft AKS 같은 다른 Kubernetes 배포도 지원합니다. ECK, Elasticsearch, Kibana, APM 서버 및 샘플 애플리케이션을 배포하려고 하기 때문에, 클러스터에 16GB RAM과 4개의 코어를 제공할 것을 권장합니다. Kubernetes 클러스터에 12GB RAM을 제공할 수도 있지만 16GB인 경우 확실히 원활한 환경을 갖출 수 있습니다.

Minikube

Minikube를 사용하고자 하는 경우, 설치 지침에 따라 이를 설치합니다. 일단 설치되면, 다음과 같이 필요한 리소스로 Minikube를 구성하고 시작합니다.

minikube config set memory 16384 
minikube config set cpus 4
minikube start

Kubernetes 대시보드는 Kubernetes 클러스터 모니터링과 관리에 매우 편리합니다. 다음 명령 하나로 Minikube를 위한 대시보드를 활성화할 수 있습니다.

minikube dashboard

브라우저 창이 자동으로 열리며 Kubernetes 대시보드가 표시됩니다. 됐습니다. 이제 다음으로 넘어갈 준비가 되었습니다.

Google Kubernetes Engine(GKE)

GKE를 사용하고자 하는 경우, Google 설명서에 따라 클러스터를 구성합니다. 제 GKE 클러스터는 15GB RAM과 4개의 vCPU를 장착한 노드 한 개로 구성되어 있습니다. 더 작은 클러스터를 선택할 수도 있지만 12GB RAM 미만은 안됩니다. 또한 GKE로 작업하려면, gcloud command-line 도구가 필요합니다.

일단 GKE 클러스터를 실행 중이면, 다음 명령을 사용하여 클러스터에 연결하고 필요한 권한을 설정합니다. GKE의 경우, 클러스터 관리 권한이 있어야 합니다. 반드시 프로젝트 이름, 영역 이름, 클러스터 이름, 사용자 ID를 자신의 것으로 바꿔야 합니다.

gcloud config set project elastic-sa 
gcloud config set compute/zone us-central1-a
gcloud config set container/cluster aquan
gcloud auth login
gcloud container clusters get-credentials aquan --zone us-central1-a --project elastic-sa
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co
kubectl create clusterrolebinding adam.quan-cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co

끝으로, Kubernetes command-line 도구를 사용해 Minikube 또는 GKE와 상호 작용을 해보겠습니다. 지침에 따라 kubectl을 설치합니다. kubectl 버전 1.11 이상을 설치하셔야 합니다.

이 블로그를 위해 사용되는 아티팩트는 이 GitHub 리포지토리에서 다운로드받으실 수 있습니다.

Elasticsearch 오퍼레이터 배포

ECK를 배포하기 위해 명령 한 개만 있으면 된다는 것이 믿어지시나요? 사실입니다. 다음 명렁만 실행시키면 최신 ECK 0.9.0(이 글을 쓰는 시점 기준)을 배포할 수 있습니다. 쉽고 간단합니다.

kubectl apply -f https://download.elastic.co/downloads/eck/0.9.0/all-in-one.yaml

일단 배포되면, 다음 명령을 사용하여 오퍼레이터의 로그를 모니터링하고 모든 것이 잘 진행되고 있는지 확인할 수 있습니다. ECK를 실행하는 데 몇 분 밖에 걸리지 않습니다.

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

Elastic Stack 배포

ECK가 실행되고 있으므로, Elastic Stack을 배포할 준비가 끝났습니다. 이것 또한 명령 하나면 됩니다. apm_es_kibana.yaml을 확인하고 Kibana와 APM 서버가 elasticsearchRef를 사용하여 서로 통신할 수 있도록 얼마나 쉽게 구성할 수 있는지 보세요.

다음과 같이 배포를 사용자 정의할 수 있는 수많은 방법이 있습니다.

  • Pod 템플릿
  • 노드 구성
  • 가상 메모리
  • 사용자 정의 HTTP 인증서
  • 보안 설정

다음 명령으로 스택을 배포합니다.

kubectl apply -f apm_es_kibana.yaml

kubectl 또는 Kubernetes 대시보드로 Elasticsearch, Kibana, APM 서버의 상태를 확인하고 모두 정상적으로 작동하며 준비 완료되어 있는지 확인합니다.

kubectl get elasticsearch,kibana,apmserver

일단 세 개의 구성요소가 모두 정상적으로 작동하면, Elasticsearch 클러스터가 실행되고 데이터가 들어올 준비가 된 것입니다. ECK는 우리를 위해 수많은 업무를 수행합니다. 더 진행하기 전에, ECK가 우리 클러스터를 위해 실제로 무엇을 했는지 살펴보겠습니다.

  • 보안이 ECK를 위해 켜져 있습니다. ECK가 배포한 모든 Elastic Stack 리소스는 기본으로 보안이 유지됩니다. elastic 사용자에게 프로비저닝된 내장된 기본 인증과 Elasticsearch 클러스터로 향하고 Elasticsearch 클러스터로부터 나오고 Elasticsearch 클러스터 내에 있는 네트워크 트래픽이 TLS로 보안이 유지됩니다.
  • 인증서: 기본적으로, 자체 서명된 CA 인증서가 각 클러스터에 대해 사용됩니다. 사용자 정의 HTTPS 인증서가 구성될 수 있습니다.
  • 기본 서비스 노출: ClusterIP 서비스가 클러스터와 Kibana를 위해 자동으로 생성됩니다. 필요한 경우, LoadBalancer 유형이 되도록 확실히 구성할 수 있습니다.

Elasticsearch, Kibana, APM Server가 실행되는 상태에서, Kibana로부터 이를 살펴보겠습니다.

Kibana 액세스

기본적으로, Kibana는 클러스터 내에서 접근 가능한 클러스터 IP를 통해 서비스로 노출되지만 인터넷에는 노출되지 않습니다. 그러나 다음과 같은 포트 전달 명령을 사용해 랩탑에서 Kibana에 접근 가능하도록 할 수 있습니다.

kubectl port-forward service/kibana-sample-kb-http 5601

Kibana로 로그인할 수 있기 전에, 기본 elastic 사용자의 자격 증명을 확인해야 합니다. kubectl을 실행하여 비밀을 확인한 다음, 그 비밀을 검사하여 그 비밀의 JSON 경로를 찾아낼 수 있습니다. 다음은 우리 사례에 있어 정확한 비밀과 경로입니다.

echo `kubectl get secret elasticsearch-sample-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode`

elastic 사용자를 위한 비밀번호가 표시됩니다. 메모장에 이 비밀번호를 복사하여 저장합니다.

이제, 브라우저를 열고 https://localhost:5601에 접속합니다. 우리는 자체 서명된 인증서를 사용하고 있기 때문에, 브라우저의 보안 경고를 수락해야 합니다. 방금 검색한 elastic 사용자와 비밀번호를 사용해 Kibana에 로그인합니다. Kibana의 홈페이지로 이동하게 됩니다. 우리 클러스터는 이제 준비가 완전히 끝났습니다!

확장 및 업그레이드

ECK 내의 Elasticsearch 클러스터 확장 및 업그레이드는 kubectl로 배포 구성을 변경하고 적용하는 것만큼 간단합니다.

확장

다음 섹션에서는 elasticsearch 컨테이너의 메모리 크기를 2GB에서 3GB로 변경하여 배포 매니페스트 apm_es_kibana.yaml을 수정합니다.

        containers: 
- name: elasticsearch
resources:
limits:
memory: 3Gi

파일을 저장하고 다음 명령으로 노드를 확장합니다.

kubectl apply -f apm_es_kibana.yaml

Kubernetes 콘솔로 즉시 전환합니다. 이 콘솔에서 새로운 Elasticsearch pod가 생성되고 있는 것을 보게 됩니다. ECK는 가동 중단 시간 없이 Elasticsearch 노드를 확장하고 있습니다. 몇 분 안에 새로운 pod가 실행되는 것을 보게 되며, 원래 pod는 사라지게 됩니다. 예전 pod의 데이터 또한 원활하게 이전되었습니다.

더 많은 노드를 이에 추가하는 것 같이 다른 방법들로도 확실히 클러스터를 확장할 수 있습니다. 어떤 식으로 이를 수행하든, 간단한 kubectl apply 명령입니다.

Elasticsearch pod가 생성되고 있습니다

업그레이드

이제, 배포 매니페스트 파일 apm_es_kibana.yaml 내에서 Elasticsearch, Kibana, APM 서버의 버전을 7.1.0에서 7.2.0으로 간단히 변경하여 클러스터를 7.2.0으로 업그레이드해보겠습니다. 저장하고 다음 명령으로 업그레이드를 적용합니다.

kubectl apply -f apm_es_kibana.yaml

마찬가지로, Kubernetes 콘솔에서 가동 중단 시간 없이 ECK가 원활하게 Elasticsearch, Kibana, APM 서버를 업그레이드하고 있는 것을 볼 수 있습니다.

업그레이드 프로세스가 완료되면, 이제 Elastic Stack의 버전 7.2.0을 실행 중인 것을 확인하세요. 지금쯤이면 ECK가 꽤 강력하다는 확신이 드시나요? 그러시길 바랍니다.

요약

Kubernetes의 Elastic Cloud를 이용한 이 빠른 시작 환경을 즐기셨기를, 그것이 정말 얼마나 쉬운지 알게 되셨기를 바랍니다. 이 블로그의 2부에서는 APM으로 계측된 간단한 애플리케이션을 배포하고 이를 통해 APM 데이터를 ECK가 관리하는 우리 클러스터로 전송하도록 해보겠습니다. 또한 Metricbeat를 Kubernetes로 배포하여 메트릭 데이터를 클러스터로 전송하겠습니다.