우당탕탕 개발일지
모니터링 구축 본문
쿠버네티스는(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 인증서 발급
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/
[참고]
- 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 설정
'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 |