엔지니어링

Kubernetes 통합 가시성 자습서: K8s 클러스터 설정 및 데모 앱 배포

이 블로그에서는 Kubernetes 통합 가시성 자습서 블로그 시리즈에 사용할 환경을 구성하는 방법을 안내해 드립니다. 제1부: 로그 모니터링 및 분석을 먼저 진행하고 이 포스팅을 시작하시기 바랍니다. 이 포스팅은 독립적인 게시물이 아니라 블로그 시리즈의 일부입니다. 제1부 포스팅을 먼저 보신 후 다시 오셔서 자습서 환경을 설정하세요.

1단계: 무료 Elasticsearch Service 배포 시작

이 자습서에서 Elastic Stack을 시작하고 실행하는 가장 쉬운 방법은 Elastic Cloud의 ElasticSearch Service 무료 체험판을 14일 동안 사용해 보는 것입니다. 몇 번의 클릭만으로(신용 카드 필요 없음) 클러스터를 실행하게 됩니다. 또는 원하는 경우 Elastic Stack을 다운로드하여 로컬로 설치하세요. 이 자습서의 모든 지침은 하드웨어에서 독립 실행형 Elasticsearch 클러스터와 함께 작동하도록 쉽게 수정할 수 있습니다. 

2단계: Minikube 단일 노드 Kubernetes 클러스터 설정

이제 Elastic Stack을 배포하여 실행 중이므로 Minikube 환경을 구축해 보겠습니다.

Kubernetes 환경 준비

이 단계별 안내를 통해 로그, 메트릭 및 애플리케이션 성능 데이터 캡처와 같은 나머지 자습서 활동을 실행할 수 있는 단일 노드 Minikube 환경을 설정하겠습니다. Strigo.io 클래스, GKE, AWS 독립 실행형 호스트처럼 자습서를 지원하는 환경을 만드는 다른 방법들도 있지만, 이 예에서는 Google Cloud에서 캡처한 스크린샷을 사용하여 Debian 9 호스트 환경 생성을 간략히 설명하려고 합니다.

참고: 클라우드 환경이나 자체 서버 중 하나에서 자체 Kubernetes 클러스터를 실행 중인 경우에는 이 부분이 필요 없습니다. 준비된 자체 Kubernetes 클러스터가 없는 경우에만 다음 단계를 실행하세요.

초기 구성

Debian 9 서버를 만드세요. 더 낮은 사양부터 시작한 다음 필요하다면 더 높은 사양을 시도해 보세요. 필요한 사양은 다음과 같습니다.

  • CPU 2개 또는 4개
  • 8GB 또는 16GB RAM
  • 100GB 디스크 공간
  • Debian 9 Linux OS(Stretch)
  • 선택한 서버의 30080-30085 포트에 대한 외부 연결을 확인하세요. 이를 위해서는 서버에 대한 방화벽 규칙을 구성해야 할 수도 있습니다.

Google Cloud의 구성 예:

필수 구성 요소 패키지 설치

다음 단계에서는 Debian 9 서버에 자체 Kubernetes 단일 노드 클러스터를 설치합니다. 다음 명령을 실행하여 시작하세요.

$ sudo apt-get install -y git tmux

내 Github 리포지토리에서 코드 확인

다음 명령을 실행하여 내 GitHub 리포지토리에서 예제 코드를 복제하세요.

$ git clone https://github.com/michaelhyatt/k8s-o11y-workshop

필수 구성 요소 설치

다음 명령을 실행하여 kubectl, Minikube, Docker를 설치하세요.

$ cd k8s-o11y-workshop
$ ./install/install-debian9.sh

Minikube와 Kubernetes 시작

이 명령은 Minikube 환경을 시작합니다.

$ ./install/start_k8s.sh

다음 명령을 실행하고 서비스가 Running 상태인지 확인하여 환경이 오류 없이 실행 중인지 확인하세요.

$ kubectl get pods --namespace=kube-system

출력은 다음과 같아야 합니다.

NAME                                 READY   STATUS    RESTARTS   AGE
coredns-5644d7b6d9-jhjlm             1/1     Running   0          106s
coredns-5644d7b6d9-npwr7             1/1     Running   0          105s
etcd-minikube                        1/1     Running   0          55s
kube-addon-manager-minikube          1/1     Running   0          43s
kube-apiserver-minikube              1/1     Running   0          57s
kube-controller-manager-minikube     1/1     Running   0          47s
kube-proxy-fm476                     1/1     Running   0          105s
kube-scheduler-minikube              1/1     Running   0          50s
kube-state-metrics-57cd6fdf9-gfgl8   1/1     Running   0          102s
storage-provisioner                  1/1     Running   0          101s

Minikube 단일 노드 Kubernetes 클러스터가 현재 실행 중입니다.

3단계: 데모 애플리케이션 배포

이제 Kubernetes 클러스터를 실행 중이니 데모 애플리케이션을 배포해 봅시다.

연결 세부 정보와 암호 만들기 및 업데이트

Theia 편집기가 실행 중인지 확인하세요. vim과 nano 같은 다른 편집기를 사용하여 install/create_secrets.sh 파일을 편집할 수도 있습니다.

$ kubectl get pods

출력은 다음과 같아야 합니다.

NAME                     READY   STATUS    RESTARTS   AGE
theia-86d9888954-npk7l   1/1     Running   0          74s

Elastic Cloud 클러스터 설정에서 다음 세부 정보를 기록했는지 확인하세요.

  • cloud_id - “:” 형식이어야 함
  • cloud_auth - “elastic:” 형식이어야 함
  • apm_url - https://로 시작하는 APM 서버의 URL
  • apm_token - APM 서버에 연결하기 위한 비밀 토큰

이러한 세부 정보는 이 서버에서 실행 중인 구성 요소를 Elastic Cloud 클러스터와 연결하는 Kubernetes 암호를 만드는 데 사용됩니다.

서버의 공용 IP 주소를 찾고 http://:30083에서 브라우저 창을 여세요.

편집기에서 install/create_secrets.sh 파일을 열고 위의 4가지 세부 정보를 업데이트한 다음, 마지막에 파일을 저장합니다.

터미널 창에서 다음 명령을 실행하여 암호를 생성합니다.

$ ./install/create_secrets.sh

Beats 설정 실행

Elastic Stack은 Elasticsearch로 데이터를 보낼 수 있는 다양한 Beats를 제공합니다. k8s 로그 파일을 추적하기 위해 Filebeat를 사용하겠습니다. Kubernetes 자체를 포함해 애플리케이션 및 시스템 포드로부터 다양한 메트릭스를 수집하기 위해서는 Metricbeat를 사용하겠습니다.

Beats 설정에서는 수집 파이프라인, 인덱스 템플릿, 즉시 사용 가능한 Kibana 시각화 등 데이터 수집과 관련된 모든 아티팩트를 생성해야 합니다. 명령 한 번으로 위의 모든 것을 처리할 수 있으며, Kubernetes 클러스터에 배포된 Beat당 한 번만 실행하면 됩니다.

Metricbeat와 Filebeat 설정 작업을 실행하려면 다음 설정 명령을 실행하세요.

$ kubectl create -f $HOME/k8s-o11y-workshop/filebeat/filebeat-setup.yml
$ kubectl create -f $HOME/k8s-o11y-workshop/metricbeat/metricbeat-setup.yml

그런 다음 ContainerCreation에서 Running으로 상태가 바뀌는지 관찰하여 작업이 완료되기를 기다렸다가, 마지막으로 다음과 같은 kubectl 명령을 사용하여 Completed로 상태가 바뀌도록 합니다.

$ kubectl get pods --namespace=kube-system

결과 포드 상태는 다음과 비슷해야 합니다.

NAME                                 READY   STATUS      RESTARTS   AGE
coredns-5644d7b6d9-jhjlm             1/1     Running     0          2d
coredns-5644d7b6d9-npwr7             1/1     Running     0          2d
etcd-minikube                        1/1     Running     0          2d
filebeat-init-nkghj                  0/1     Completed   0          2m
kube-addon-manager-minikube          1/1     Running     0          2d
kube-apiserver-minikube              1/1     Running     0          2d
kube-controller-manager-minikube     1/1     Running     0          2d
kube-proxy-fm476                     1/1     Running     0          2d
kube-scheduler-minikube              1/1     Running     0          2d
kube-state-metrics-57cd6fdf9-gfgl8   1/1     Running     0          2d
storage-provisioner                  1/1     Running     0          2d
metricbeat-init-gm6wj                0/1     Completed   0          2m

암호 만들기를 잊었을 때를 대비해서...

이 단계에서 오류가 발생하는 가장 일반적인 이유는 잘못된 Elastic Cloud 자격 증명일 것입니다. 클라우드 클러스터에 연결할 수 없음을 나타내는 오류가 표시되는 경우에만 다음 단계를 진행하세요.

  1. 이전 섹션과 같이 4개의 클라우드 및 APM 값을 다시 확인합니다.
  2. 다음과 같이 자격 증명과 Beats 설정 작업을 삭제합니다.
    $ kubectl delete secret cloud-secret --namespace=kube-system
    $ kubectl delete secret cloud-secret
    $ kubectl delete secret apm-secret
    
  3. 위의 섹션에 따라 Theia 웹 편집기에서 또는 vim/nano 편집기를 통해 자격 증명을 업데이트합니다.
  4. 다음 명령을 다시 실행하여 암호를 재생성합니다.
    $ ./install/create_secrets.sh
    
  5. Beats 설정 명령을 재시도합니다.

Beats 배포

Filebeat와 Metricbeat를 배포하려면 다음 두 명령을 실행하세요.

$ kubectl create -f $HOME/k8s-o11y-workshop/filebeat/filebeat.yml
$ kubectl create -f $HOME/k8s-o11y-workshop/metricbeat/metricbeat.yml

Beats가 실행 중인지 확인하려면 다음 명령을 실행하세요.

$ kubectl get pods --namespace=kube-system

다음과 같이 세 개의 Kubernetes 포드가 추가로 실행 중이어야 합니다. 하나는 Filebeat용이고 두 개는 Metricbeat용입니다.

NAME                                 READY   STATUS      RESTARTS   AGE
coredns-5644d7b6d9-jhjlm             1/1     Running     0          2d
coredns-5644d7b6d9-npwr7             1/1     Running     0          2d
etcd-minikube                        1/1     Running     0          2d
filebeat-init-nkghj                  0/1     Completed   0          2d
filebeat-wnltr                       1/1     Running     0          4m
kube-addon-manager-minikube          1/1     Running     0          2d
kube-apiserver-minikube              1/1     Running     0          2d
kube-controller-manager-minikube     1/1     Running     0          2d
kube-proxy-fm476                     1/1     Running     0          2d
kube-scheduler-minikube              1/1     Running     0          2d
kube-state-metrics-57cd6fdf9-gfgl8   1/1     Running     0          2d
metricbeat-777d6c6c45-gzfwr          1/1     Running     0          4m
metricbeat-init-rjz4q                0/1     Completed   0          4m
metricbeat-vxbj5                     1/1     Running     0          4m
storage-provisioner                  1/1     Running     0          2d

Beats가 Elastsearch로 데이터를 전송하는지 확인

Beats가 Elastic Cloud 클러스터에 성공적으로 연결하고 데이터를 보내고 있는지 추가로 확인하려면 Kibana에서 Logs 앱과 Metrics 앱을 여세요. 거기서 어떤 작업이 진행 중이어야 합니다.

애플리케이션 구성 요소 배포

MySQL 배포:

$ kubectl create -f $HOME/k8s-o11y-workshop/mysql/mysql.yml

Metrics 앱에서 실행되는 포드를 보고 포드 메뉴에서 선택해 MySQL 로그를 관찰하여 컨테이너가 작동 중인지 확인합니다.

MySQL 로그 라인에서 다음과 같이 "연결 준비"를 기다립니다.

다음과 같이 petclinic 앱과 NGINX 프록시를 배포합니다.

$ kubectl create -f $HOME/k8s-o11y-workshop/petclinic/petclinic.yml
$ kubectl create -f $HOME/k8s-o11y-workshop/nginx/nginx.yml

모든 구성 요소가 실행 중인지 확인합니다.

Kibana의 Metrics 앱에서 실행 중인 모든 구성 요소를 봅니다.

petclinic UI 확인은 http://:30080에서 할 수 있습니다. kubectl get services 명령을 사용하여 petclinic 웹 애플리케이션의 공용 IP 주소를 얻을 수 있습니다.

준비가 다 끝났습니다. 이제 정기적으로 예약된 자습서인 Kubernetes 통합 가시성 자습서: 로그 모니터링 및 분석으로 돌아가셔도 됩니다.