Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

우당탕탕 개발일지

모니터링 구축 본문

Cloud

모니터링 구축

YUDENG 2024. 1. 5. 03:17

 

쿠버네티스는(Kubernetes)는 컨테이너 오케스트레이션 시스템으로, 여러 컨테이너화된 애플리케이션을 관리하고 배포하는 데 사용된다. 쿠버네티스는 클러스터 내에서 여러 노드에서 실행되는 애플리케이션을 효과적으로 관리하기 위한 다양한 메트릭을 수집하고 제공한다. 메트릭(Metric)은 클러스터의 상태를 모니터링하고 최적화하기 위해 사용된다.

 

* 메트릭(Metric)이란?

서버의 상태를 측정한 항목이나 지표. CPU 사용량, 메모리 사용량, 디스크 공간, 네트워크 트래픽, 요청 처리량, 응답 시간 등이 있다.

 

선수 작업

[ awscli 설치 ]

# sudo apt remove awscli

# sudo apt install unzip

# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

# unzip awscliv2.zip

# sudo ./aws/install

# aws --version

# rm -f awscliv2.zip

# aws configure

 

[ eksctl 설치 ]

# 환경변수 설정
ARCH=amd64
PLATFORM=$(uname -s)_$ARCH

# curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz"

# tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz

# sudo mv /tmp/eksctl /usr/local/bin

# eksctl version

 

[ kubectl 설치 ]

# curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.3/2023-11-14/bin/linux/amd64/kubectl

# chmod +x ./kubectl

# mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH

# echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

 

[ Helm 설치 ]

# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

# chmod 700 get_helm.sh

# ./get_helm.sh

# helm version

 

[ cluster.yaml 작성 ]

---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: jenkins-eks # 생성할 EKS 클러스터명
  region: us-east-2 # 클러스터를 생성할 리전
  version: "1.27"

vpc:
  cidr: "20.0.0.0/16" # 클러스터에서 사용할 VPC의 CIDR
  nat:
    gateway: HighlyAvailable

managedNodeGroups:
  - name: node-group # 클러스터의 노드 그룹명
    instanceType: t3.medium # 클러스터 워커 노드의 인스턴스 타입
    desiredCapacity: 2 # 클러스터 워커 노드의 갯수
    volumeSize: 20  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
    privateNetworking: true
    ssh:
      enableSsm: true
    iam:
      withAddonPolicies:
        imageBuilder: true # Amazon ECR에 대한 권한 추가
        albIngress: true  # albIngress에 대한 권한 추가
        cloudWatch: true # cloudWatch에 대한 권한 추가
        autoScaler: true # auto scaling에 대한 권한 추가
        ebs: true # EBS CSI Driver에 대한 권한 추가

cloudWatch:
  clusterLogging:
    enableTypes: ["*"]

iam:
  withOIDC: true

 

[ EKS cluster 배포 ]

eksctl create cluster -f cluster.yaml

 

클러스터 생성

 

 

Metrics Server

쿠버네티스는 자신의 상태를 자동으로 모니터링해서 보여주지 않기 때문에 metric-server가 필요하다.

메트릭 서버는 클러스터 전체의 리소스 사용 데이터를 수집한다.

각 노드에 설치되어 있는 kubelet을 통하여 노드나 컨테이너의 CPU, Memory 사용량과 같은 데이터를 수집할 수 있다.

 

(1) Metrics Server 설치

# kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

 

(2) deployment 설정 수정

# kubectl edit deployments.apps -n kube-system metrics-server

 

" --kubelet-insecure-tls " 설정 추가

 

" hostNetwork: true " 설정 추가

 

(3) 실행 확인

// node 사용량 확인
# kubectl top node

// pod 사용량 확인
# kubectl top po

 

 

EBS-SC CSI DRIVER

kubernetes에서 AWS EBS 사용을 위해 기본적으로 제공하는 storage class 타입은 io1, gp2, sc1, st1 이다. gp3, io2 타입의 EBS를 사용하기 위해서 Amazon EBS CSI Driver 를 설치해야한다.

 

(1) 권한 부여

 

(2) 생성

eksctl create addon --name aws-ebs-csi-driver --cluster <클러스터 이름> --service-account-role-arn arn:aws:iam::<계정 ID>:role/AmazonEKS_EBS_CSI_DriverRole --force

 

[참고] Helm 차트 사용 방법

# helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
# helm repo update
# helm upgrade --install aws-ebs-csi-driver \
    -n amazone-ebs \
    -f values.yaml \
    aws-ebs-csi-driver/aws-ebs-csi-driver

 

모니터링

모니터링 시스템은 기본적으로 데이터 수집 => 통합 => 시각화 단계로 되어있다. 모니터링이라는 것은 자신의 상황에 맞게 어느 서버에 어떠한 옵션들을 설정하는지에 따라 천차만별로 달라진다. 모니터링의 범주는 다음과 같다.

  • HTTP 요청 수신
  • HTTP 400 응답 송신
  • 함수 시작
  • if 문의 else에 도달
  • 함수 종료
  • 사용자 로그인
  • 디스크에 데이터 쓰기
  • 네트워크에서 데이터 읽기
  • 커널에 추가 메모리 요청

 

Prometheus와 Grafana는 모니터링 시스템에서 널리 사용되는 오픈 소스 도구이다.

Prometheus 모니터링 데이터를 수집하고 저장하며, Grafana는 이 데이터를 가져와 시각적으로 표현하여 사용자에게 이해하기 쉬운 대시보드를 제공한다.

 

1. Prometheus

 

프로메테우스를 이루는 기본 요소는 단 두개이다.

  • Prometheus Server
  • Node Exporter

 

프로메테우스 기본 아키텍처

Node Exporter는 어떤 정보를 수집할지에 대해서 정의를 해두고 정해진 시간마다 정보를 수집한다. 그리고 네트워크를 통해서 Prometheus Server가 가지고 갈 수 있도록 네트워크 데몬으로 존재한다. 

 

 

(1) 프로메테우스 배포

# kubectl create namespace monitoring

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

# helm upgrade -i prometheus prometheus-community/prometheus \
    --namespace monitoring \
    --set alertmanager.persistentVolume.storageClass="gp2",server.persistentVolume.storageClass="gp2"
   
# helm pull prometheus-community/prometheus
# tar xvfz prometheus-25.8.2.tgz

프로메테우스 폴더 파일

 

(2) prometheus 폴더 내 values.yaml 파일 수정

- existingClaim을 prometheus-server로 변경 (449번 줄)

 

- type을 LoadBalancer로 설정 (668번 줄)

- extraFlags에서 storage.tsdb.no-lockfile 항목 주석 해제 (226번 줄)

 

(3) 프로메테우스 설치

# helm install monitoring prometheus-community/prometheus -f values.yaml

# kubectl get pods -n monitoring

 

2. ACM 인증서 발급

https://www.gabia.com/

 

3. Grafana

 

(1) 그라파나 배포

# kubectl get namespace monitoring

# helm repo add grafana https://grafana.github.io/helm-charts

# helm repo update

# touch grafana.yaml

 

(2) grafana.lyaml 파일 작성

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
spec:
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      securityContext:
        fsGroup: 472
        supplementalGroups:
          - 0
      containers:
        - name: grafana
          image: grafana/grafana:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000
              name: http-grafana
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /robots.txt
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 30
            successThreshold: 1
            timeoutSeconds: 2
          livenessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 3000
            timeoutSeconds: 1
          resources:
            requests:
              cpu: 250m
              memory: 750Mi
          volumeMounts:
            - mountPath: /var/lib/grafana
              name: grafana-pv
      volumes:
        - name: grafana-pv
          persistentVolumeClaim:
            claimName: grafana-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
spec:
  ports:
    - port: 3000
      protocol: TCP
      targetPort: http-grafana
  selector:
    app: grafana
  sessionAffinity: None
  type: LoadBalancer

 

(3) kubectl 서버에 전송

# kubectl apply -f grafana.yaml --namespace=monitoring

 

 

https://grafana.com/docs/grafana/latest/setup-grafana/installation/kubernetes/

 

Deploy Grafana on Kubernetes | Grafana documentation

Enterprise Open source Deploy Grafana on Kubernetes You can use Grafana Cloud to avoid installing, maintaining, and scaling your own instance of Grafana. Create a free account to get started, which includes free forever access to 10k metrics, 50GB logs, 50

grafana.com

 

[참고]

- Grafana의 기본 포트 → 3000

- 지원되는 데이터베이스  SQLite 3, MySQL 5.7+, PostgreSQL 12+

 

4. Ingress 배포

 

(1) ingress.lyaml 파일 작성

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: monitoring
  name: monitoring-ingress
  annotations:
    # Ingress Core Settings
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=60
    # SSL Settings
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/certificate-arn: ACM인증서 ARN
    alb.ingress.kubernetes.io/ssl-redirect: '443'
spec:
  rules:
  - host: prometheus.자기 도메인
    http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus-server
                port:
                  number: 80
  - host: grafana.자기 도메인
    http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: grafana
                port:
                  number: 80

 

kubectl apply -f ingress.yaml

 

5. Route53 설정

6. Grafana 설정

728x90

'Cloud' 카테고리의 다른 글

SAA - AWS 서비스 종류  (0) 2024.02.02
AWS RDS + MySQL + Node.js  (1) 2024.01.18
Linux Git  (0) 2023.12.12
테라폼 3-Tier 아키텍처 구축(2) - VPC, EC2  (1) 2023.11.26
테라폼 3-Tier 아키텍처 구축(1) - 보안그룹  (0) 2023.11.26