0527_Kubernetes_Helm, ArtifactHUB, Chart / Monitoring : Prometheus, Logging : EFK - ElasticSearch + FluentBit + Kibana

HYOJU DO·2022년 5월 27일
1

Kubernetes

목록 보기
13/13
post-thumbnail

Helm


k8s 패키지 관리

🎈 사용하지 않는 아키텍쳐 (v2)

현재 3버전만 사용
Helm v3는 Tiller 사용 x
✔️ Version 3는 Client가 API 서버에 바로 요청

다양한 helm 저장소(레포지토리) 존재 ➜ 중앙 집중화 x
Helm Client : 명령어 ➜ Helm chart에서 패키지 가져 옴

용어

  • Chart : yaml 파일 모음 (여러 yaml 파일을 tar.zip으로 묶어놓은 것)
    ex. Wordpress를 구성하는 다양한 yaml 파일을 하나의 패키지로 만들어서 관리
  • Release : 쿠버네티스 오브젝트 리소스(from 패키지 to 클러스터에 생성한 인스턴스)
    ➕ 인스턴스 : 논리적인 것을 눈에 보이는 형태로 만든 것?

Helm 설치 from Apt(Ubuntu)

$ curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null

$ sudo apt-get install apt-transport-https --yes

$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

$ sudo apt-get update

$ sudo apt-get install helm

exit 후 재접속

sudo 없이 Helm 사용
~/.zshrc 파일에서 plugins에 helm 추가


ArtifactHUB

: Helm Chart 검색 사이트
➜ 실제로 패키지를 가지고 있는 레포지토리 x
차트 구조로 Git에 올려놓으면 Git이 서버가 됨
ex. Bitnami Chart GitHUB -> WP


Chart(차트) 구조

<Chart Name>/
  Chart.yaml
  values.yaml
  templates/
  # +@
  • chart.yaml : 차트의 메타데이터
  • values.yaml : 패키지 커스터마이즈 -> 사용자화 할 수 있는 값 제공(value)
  • templates : YAML 오브젝트 파일

사용자 ➜ 어떤 value가 있는지만 파악해서 변경 해서 사용


✔️ Required State before Using Helm

  • 관리할 kubernetes cluster 존재
  • kubeconfig 필요
  • helm 설치 및 구성

ArtifactHub 에서 Chart 검색

$ helm search hub wordpress

Bitnami repository에서 저장소 추가
주소는 중요하지만 이름은 중요 x

$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm repo add xyz https://charts.bitnami.com/bitnami # repo 이름 xyz로 레포지토리 추가

저장소 추가 확인

$ helm repo list

저장소 삭제

$ helm repo remove bitnami

실제 연결 된 레포지토리(저장소)에서 Chart 검색
$ helm search repo [pattern]

$ helm search repo wordpress
NAME                    CHART VERSION   APP VERSION     DESCRIPTION                                       
bitnami/wordpress       14.2.7          5.9.3           WordPress is the world's most popular blogging ...
bitnami/wordpress-intel 1.3.0           5.9.3           WordPress for Intel is the most popular bloggin...

이름 양식 : [레지스트리 이름]/[Chart 이름]


Helm을 사용한 Wordpress 구현

Chart 설치
$ helm install [realease 이름] [chart 이름]

$ helm install mywordpress bitnami/wordpress
NAME: mywordpress
LAST DEPLOYED: Fri May 27 02:36:01 2022
NAMESPACE: default      # NS 사용
STATUS: deployed        # 상태
REVISION: 1             # 자체적 업데이트 기능
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 14.2.7
APP VERSION: 5.9.3
...                     # 설명 (NOTES.txt 파일 내용) -> 없을 수도 있음

release 확인
$ helm list

$ helm list                                 
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                 APP VERSION
mywordpress     default         1               2022-05-27 02:36:01.239981111 +0000 UTC deployed        wordpress-14.2.7      5.9.3  

release 삭제

$ helm uninstall mywordpress

생성 된 리소스 확인

$ kubectl get all  
NAME                                          READY   STATUS    RESTARTS       AGE
pod/mywordpress-7fc5c797f7-jw6bp              0/1     Pending   0              4m55s
pod/mywordpress-mariadb-0                     0/1     Pending   0              4m54s
pod/nfs-client-provisioner-758f8cd4d6-svrqw   1/1     Running   2 (163m ago)   2d4h

NAME                          TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
service/kubernetes            ClusterIP      10.233.0.1      <none>            443/TCP                      4d13h
service/mywordpress           LoadBalancer   10.233.37.252   192.168.100.241   80:32514/TCP,443:31270/TCP   4m55s
service/mywordpress-mariadb   ClusterIP      10.233.27.4     <none>            3306/TCP                     4m56s
service/nginx-svc-lb          LoadBalancer   10.233.24.166   192.168.100.240   80:32404/TCP,443:31238/TCP   2d2h

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mywordpress              0/1     1            0           4m55s
deployment.apps/nfs-client-provisioner   1/1     1            1           2d4h

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/mywordpress-7fc5c797f7              1         1         0       4m55s
replicaset.apps/nfs-client-provisioner-758f8cd4d6   1         1         1       2d4h

NAME                                   READY   AGE
statefulset.apps/mywordpress-mariadb   0/1     4m55s



Customization

Chart 정보 확인
$ helm show
repository에 저장 된 파일의 내용이 그대로 출력

$ helm show readme bitnami/wordpress
$ helm show chart bitnami/wordpress 
$ helm show values bitnami/wordpress

🎈 Chart 다운시 변수 변경
--set xx.xx=xx 옵션

레플리카 수 변경

$ helm install mywp bitnami/wordpress --set repicaCount=2

--set ➜ ini 형식(a=b), 계층적 구조는 . 으로 구분

$ helm install mywp bitnami/wordpress --set repicaCount=2 --set service.type=NodePort

파라미터 여러 개 ➜ --set 여러 번


Upgrade & Rollback

release Upgrade

변수 파일을 만들어서 파일로 제공

$ helm show values bitnami/wordpress > wp-value.yaml

변경 내용 업그레이드
$ helm upgrade [release이름] [이름] -f [적용할 파일]

$ helm upgrade mywp bitnami/wordpress -f wp-value.yaml

Release 확인

$ helm list

revision 변경 확인

➜ 내용 upgrade 할 때마다 revision 1씩 증가

$ kubectl get all

릴리즈 upgrade 히스토리 확인

$ helm history mywp

release RollBack

원하는 release revision으로 복구
$ helm rollback [release][release 번호]

$ helm rollback mywp 1

realease 일부만 업그레이드
wp-value2.yaml

replicaCount: 1

service:
  type: LoadBalancer

release 업그레이드

$ helm upgrade mywp bitnami/wordpress -f wp-value2.yaml

릴리즈 정보 확인
$ helm status [release 이름]

$ helm status mywp

패키지 생성

디렉토리 생성
기본 뼈대가 만들어져있고 변경해서 사용

$ helm create mypkg
$ cd mypkg
$ tree

패키지 생성 (tgz 파일)
$ helm package

$ helm package mypkg

생성 확인

$ ls
mypkg  ✔️mypkg-0.1.0.tgz  wp-value.yaml



Monitoring & Logging


Prometheus Monitoring

CPU, Memory, Network IO, Disk IO

  • Heapster + InfluxDB : 사용 x
  • metrics-server : DB x ➜ 실시간 확인만 가능
    ➜ CPU, Memory만 측정 가능
  • Prometheus (De facto)

Prometheus Architecture

해당 Architecture를 Helm chart로 한 번에 구성할 예정

각 구성 요소는 파드로 작동
빨간색 테두리 ➜ 프로메테우스 기능

prometheus server

  • Retrieval : read(회수/수집) ➜ 메트릭을 요청해서 가져오는 형태

    • Prometheus targets : VM, Pod, BM, 애플리케이션 ...에 대한 정보
    • Jobs/exporters : 데이터를 가지고 옴
    • pull metrics : 메트릭스(수집 가능한 요소) 가져오기(pull)
    • Push Gateway : short-lived jobs의 생명 주기가 끝나기 전에 메트릭스 받아옴
    • Short-lived Jobs : 생명 주기가 짧은 작업
  • TSDM (Time Series DB, 시계열 DB)
    시간대별로 데이터를 정렬한 DB
    ➜ CPU 사용량 등을 시간 순에 맞추어서 local (pvc-pv)에 저장

  • HTTP Server (Dashboard)
    ➜ 데이터 시각화에 특화
    promQL 이라는 언어를 새로 만들었음 (여러 측정값들을 검색할 수 있는 언어)
    v 모니터링 용도의 인터페이스 제공하지 않기 때문에 사용하지 않을 예정

  • prometheus + [grafana]
    시각화 오픈 소스

  • Service Discovery
    요청 대상이 누구인지 특정
    k8s ➜ api server에게 질의하고 응답 받기 ✔️
    file_sd ➜ 타겟이 되는 서버, 애플리케이션을 직접 파일로 지정 가능

  • Alert Manager
    ➜ 알림 전송(push)
    using e-mail, Slack, Pagerduty ...
    pagerduty -> 알림 통합 관리 SaaS
    요즘은 slack 쓰는 것이 일반적 형태

Prometheus 설치

Prometheus 실제 Git 차트

🎈 kube-prometheus-stack Chart
: Prometheus Operator로 만든 stack
➜ Grafana Dashboard 까지 한 번에 설치 가능

crd를 통해서 리소스 커스텀 정의 가능

$ kubectl api-resources | grep crd

Custom Resource는 OperatorFramework + CRD로 생성
operator은 리소스 만들어지는 순서 등의 세세한 사항도 정의 가능


🎈 설치

프로메테우스 Helm 레포지토리 추가

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update

작업 디렉토리 : ~/yaml/helm/prometheus

변경할 환경변수 정보에 대한 yaml 파일 작성
prom-values.yaml

grafana:
  service:
    type: LoadBlancer

monitor NS 생성
별도의 NS 만들어서 관리하는 것이 좋음

$ kubectl create ns monitor

kube-prometheus-stack Release 설치

$ helm install prom prometheus-community/kube-prometheus-stack -f prom-values.yaml -n monitor

monitor NS로 이동
➜ 이동하지 않을 시 default NS에 있기 때문에 확인 불가

$ kubens monitor

생성 된 오브젝트 확인

$ kubectl get all

🎈 설치 확인

설치 완료 후, 브라우저에서 192.168.100.240 으로 접속
로그인 정보 values 파일에서 확인

  • ID : admin
  • PW : prom-operator

좌측 상단 general/home 열어보면 dashboard 검색 가능



EFK Logging


💡 도구들이 주기적으로 업데이트 되므로 수시로 확인 필수!
Log는 중요한 정보이므로 항상 주시하기


🎈 Logging 도구 조합

1) ELK : Elastic Search + Logstash(Java) + Kibana
2) EFK Stack

  • Elastic Search + Fluentd(Ruby) + Kibana
  • Elastic Search + Fluent Bit(오픈 소스 C-가볍) + Kibana V

3) Elastic Stack : Elastic Search + Beat + Kibana


🎈 EFK 도구 🌟

  • Fluent bit : 로그 수집기 (로그 저장소)
  • Elastic Search : 검색엔진 로그 수집 (로그 검색소)
  • Kibana : 로그 데이터 시각화

Elastic Search 레포지토리 다운 및 레포지토리 정보 업데이트

$ helm repo add elastic https://helm.elastic.co
$ helm repo update 

레포지토리 정보 확인 / Elastic Search 레포지토리 생성 확인

$ helm repo list
$ helm search repo elastic

EFK 실습 전용 디렉토리 생성

$ mkdir efk && cd efk

Elastric Search에 대한 변수 정보를 es-value.yaml 파일에 저장

$ helm show values elastic/elasticsearch > es-value.yaml

es-value.yaml 수정

18 replicas: 1
19 minimumMasterNodes: 1

80 resources:
81   requests:
82     cpu: "500m"
83     memory: "1Gi"
84   limits:
85     cpu: "500m"
86     memory: "1Gi"

logging NS 생성 후 해당 NS에서 Elastic Search 생성

$ kubectl create ns logging
$ helm install elastic elastic/elasticsearch -f es-value.yaml -n logging   



Fluent Bit

FluentBit GitHub Repository
➜ output에 보면 k8s와 연동시키는 내용 있음

Fluent Bit 디렉토리 복제해오기

$ git clone https://github.com/fluent/fluent-bit-kubernetes-logging.git

작업 디렉토리 : ~/fluent-bit-kubernetes-logging

$ cd fluent-bit-kubernetes-logging                     

Fluent Bit 정보 확인

$ ls

LICENSE                                                 fluent-bit-role-binding-1.22.yaml
README.md                                               fluent-bit-role-binding.yaml
fluent-bit-config-kafka-rest.yml                        fluent-bit-role.yaml
fluent-bit-daemonset-kafka-rest.yml                     fluent-bit-service-account.yaml
fluent-bit-openshift-security-context-constraints.yaml  output
fluent-bit-role-1.22.yaml                               testpod.yml

Fluent Bit와 관련된 svc, role, rolebinding 생성

$ kubectl create -f fluent-bit-service-account.yaml 
$ kubectl create -f fluent-bit-role-1.22.yaml      
$ kubectl create -f fluent-bit-role-binding-1.22.yaml 

작업 디렉토리 : sfluent-bit-kubernetes-logging/output/elasticsearch

$ cd fluent-bit-kubernetes-logging/output/elasticsearch
$ ls

fluent-bit-configmap.yaml  fluent-bit-ds-minikube.yaml  fluent-bit-ds.yaml
  • fluent-bit-configmap.yaml : 공통으로 적용되는 인증 정보
  • fluent-bit-ds.yaml : 데몬셋 파일

fluent-bit-ds.yaml 파일 수정

32 - name: FLUENT_ELASTICSEARCH_HOST
     value: "elasticsearch-master"

ConfigMap, Daemonset 생성

$ kubectl create -f fluent-bit-configmap.yaml  
$ kubectl create -f fluent-bit-ds.yaml 

Kibana

Kibana 변수 파일을 로컬에 파일로 저장

$ helm show values elastic/kibana > kibana-value.yaml 

kibana-value.yaml 파일 수정

49
resources:
  requests:
    cpu: "500m"
    memory: "1Gi"
  limits:
    cpu: "500m"
    memory: "1Gi"

120
  type: LoadBalancer

환경변수 변경 파일 적용하여 kibana 다운

$ helm install kibana elastic/kibana -f kibana-value.yaml -n logging

Portfowarding

$ kubectl port-forward -n logging elasticsearch-master-0 9200:9200

Portfowarding 확인

$ curl localhost:9200

You know --- 라고 나와야 성공


🎈 접속 확인

➜ 웹브라우저에서 192.168.100.240:5601 으로 접속
Kibana는 인증서가 없어서 무인증 접속이므로 주의
서비스 포트는 5601

로그 인덱싱
explore my own 선택 logstash-시간이기 때문에 (하루에 하나씩 만들어짐) 필요하면 분리가능 좌측 상단 햄버거바 ➜ stack management ➜ kibana ➜ index pattern

create index pattern
logstash (우측에서 확인)

  • Name : logstash-* ➜ 하루에 1개 생성
  • Timestamp field : @timestamp

수집한 로그 확인
햄버거바 ➜analytics ➜ discover


📌 --- 강의 보기
ssh node2 접속

3.14* 검색?


EFK 설치 후 파드 삭제해도 상관 x
Elastic Search가 로그 기록



💡 TIP


Theme : powelevel10k

zshell powerlebel10k 테마 설치

레포지토리 복제

$ git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

적용

$ exec zsh

or

$ exit 후 재접속

재설정

$ p10k configure

kubens & kubectx

컨텍스트 사용시 사용하는 명령어

패키지 다운로드

$ wget https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubectx
$ wget https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubens

설치

$ sudo install kubectx /usr/local/bin
$ sudo install kubens /usr/local/bin 

확인

$ which kubectx
/usr/local/bin/kubectx

$ which kubens
/usr/local/bin/kubens

kubectx

컨텍스트 확인

$ kubectx

컨텍스트 변경

$ kubectx [컨텍스트 이름]

kubens

NS 확인

$ kubens

NS 변경
~/.kube/config 파일 수정 없이 사용자 NS 변경 가능

$ kubens [NS 이름] 

manifest : 오브젝트를 정의하는 코드(yaml 파일)

🌟 오픈소스의 LISENSE 🌟

➕ 참고 : 라이선스 종류

항상 라이센스 고지할 것
오픈소스라고 해서 무조건 다 사용할 수 있는 것 x
코드 공개와는 무관
이중 라이센스 사용시 오픈소스로 취급 x
LISENSE.txt 참고



profile
Be on CLOUD nine! ☁️ ( 수정 예정 == 📌)

0개의 댓글