새소식

반응형
k8s/CloudNet@

[CloudNet@] AWS EKS Workshop Study - 4주차.

  • -
728x90
반응형

 

 

안녕하세요 늑대양입니다 😍

 

 

 

늑대양 연두 버전!!

 

 

 

 

이번에 CloudNet@에서 진행하는 AWS EKS Workshop Study(AEWS)에 참여하여 관련 내용을 공유드리고자 합니다.

 

 

 

AEWS Study #4주차

 

 

오늘은 AEWS 스터디 4주차 학습 내용을 안내해드리록하겠습니다.

 

 

 

CloudNet@ 팀 블로그 메인 커버

 

 

 

 

CloudNet@ 팀 블로그 Main URL:

https://www.notion.so/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863

 

CloudNet@ Blog

CloudNet@ 팀에서 Cloud Infra & Network 기술에 대한 정보를 공유하는 블로그 입니다.

www.notion.so

 

 

 

 

AWS EKS Workshop Study - 4주차

4주차 학습 주제: EKS Observability

Index.

  • 실습 환경 배포 (업데이트)
  • EKS Console
  • Logging in EKS
  • Container Insights metrics in Amazon CloudWatch & Fluent Bit (Logs)
  • Metrics-server & kwatch & botkube
  • 프로메테우스 스택
  • 그라파나
  • 그라파나 얼럿
  • kubecost
  • OpenTelemetry(OTel)
  • (실습 완료 후) 자원 삭제
  • 4주차 과제

 

 

실습 환경 배포 (업데이트)

CloudFormation을 통해, 기존 주차 실습에 사용한 대부분의 리소스 배포 완료!

 

  • 4주차 실습에서는 워커노드에 t3.xlarge 타입을 활용

 

 

 

 

 

AWS LB/ExternalDNS/EBS/EFS, kube-ops-view 설치

# ExternalDNS
MyDomain=<자신의 도메인>
echo "export MyDomain=<자신의 도메인>" >> /etc/profile
MyDomain=gasida.link
echo "export MyDomain=gasida.link" >> /etc/profile
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
echo $MyDomain, $MyDnzHostedZoneId
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -

# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"
echo -e "Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5"

# AWS LB Controller
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

# EBS csi driver 설치 확인
eksctl get addon --cluster ${CLUSTER_NAME}
kubectl get pod -n kube-system -l 'app in (ebs-csi-controller,ebs-csi-node)'
kubectl get csinodes

# gp3 스토리지 클래스 생성
kubectl get sc
cat <<EOT > gp3-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp3
allowVolumeExpansion: true
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  allowAutoIOPSPerGBIncrease: 'true'
  encrypted: 'true'
EOT
kubectl apply -f gp3-sc.yaml
kubectl get sc

# EFS csi driver 설치
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \
    --namespace kube-system \
    --set image.repository=602401143452.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/eks/aws-efs-csi-driver \
    --set controller.serviceAccount.create=false \
    --set controller.serviceAccount.name=efs-csi-controller-sa

# EFS 스토리지클래스 생성 및 확인
curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
sed -i "s/fs-92107410/$EfsFsId/g" storageclass.yaml
kubectl apply -f storageclass.yaml
kubectl get sc efs-sc

 

 

gp3 스토리지 클래스 생성! (이건 EKS 전환시 필수이므로 기억 필수!!)

 

 

 

스터디 중 잘 사용하고 있는 kubeopsview!

 

 

 

EFS SC까지 생성!!

 

 

 

설치 정보 확인

# 이미지 정보 확인
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c

# eksctl 설치/업데이트 addon 확인
eksctl get addon --cluster $CLUSTER_NAME

# IRSA 확인
eksctl get iamserviceaccount --cluster $CLUSTER_NAME

 

 

설치 정보 확인!

 

 

 

 

EKS Console

쿠버네티스 API를 통해, 리소스 및 정보를 확인 가능!

 

EKS 관련 ClusterRole 확인

 

 

AWS 콘솔에서 myeks cluster에 적용된 다양한 IAM Role 확인 가능!

 

 

 

 

EKS Workshop URL: https://www.eksworkshop.com/docs/observability/resource-view/

 

View resources in EKS console | EKS Workshop

In this lab, we'll view all Kubernetes API resource types using the AWS Management Console for Amazon EKS. You will be able to view and explore all standard Kubernetes API resource types such as configuration, authorization resources, policy resources, ser

www.eksworkshop.com

 

 

EKS 콘솔을 통해, 클러스터에 대한 대부분의 정보 확인 가능!

 

 

 

Logging in EKS

Observability in Amazon EKS

 

Amazon EKS 컨트롤 플레인 로깅 - Amazon EKS

로그 스트림 데이터가 증가함에 따라 로그 스트림 이름이 교체됩니다. 특정 로그 유형에 대해 여러 로그 스트림이 있는 경우 최신 Last Event Time(마지막 이벤트 시간)으로 로그 스트림 이름을 찾아

docs.aws.amazon.com

 

 

Control plane logging

  • 로그 이름 (/aws/eks/<cluster-name>/cluster)
  1. Kubernetes API server component logs (api) – kube-apiserver-<nnn...>
  2. Audit (audit) – kube-apiserver-audit-<nnn...>
  3. Authenticator (authenticator) – authenticator-<nnn...>
  4. Controller manager (controllerManager) – kube-controller-manager-<nnn...>
  5. Scheduler (scheduler) – kube-scheduler-<nnn...>

 

 

로깅을 활성화하기 전 콘솔 화면

 

 

 

# 모든 로깅 활성화
aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME \
    --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'

# 로그 그룹 확인
aws logs describe-log-groups | jq

# 로그 tail 확인 : aws logs tail help
aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more

# 신규 로그를 바로 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --follow

# 필터 패턴
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --filter-pattern <필터 패턴>

# 로그 스트림이름
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix <로그 스트림 prefix> --follow
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix kube-controller-manager --follow
kubectl scale deployment -n kube-system coredns --replicas=1
kubectl scale deployment -n kube-system coredns --replicas=2

# 시간 지정: 1초(s) 1분(m) 1시간(h) 하루(d) 한주(w)
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m

# 짧게 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m --format short

 

 

 

로깅 활성화 완료!!

 

 

Control plane에 대한 로깅을 활성화하면 Log streams이 생성

 

 

 

터미널에서 확인 가능한 로그를 동일하게 확인 가능!!

 

 

CloudWatch Log Insights

URL: https://www.eksworkshop.com/docs/observability/logging/cluster-logging/log-insights/

 

CloudWatch Log Insights | EKS Workshop

CloudWatch Logs Insights enables you to interactively search and analyze your log data in CloudWatch Logs. You can perform queries to help you more efficiently and effectively respond to operational issues. If an issue occurs, you can use CloudWatch Logs I

www.eksworkshop.com

 

 

CloudWatch log insights 실습 - NodeNotReady

 

 

 

kube-apiserver-audit 로그에서 userAgent 정렬 예시

 

 

# CloudWatch log insights - Query 예시

# EC2 Instance가 NodeNotReady 상태인 로그 검색
fields @timestamp, @message
| filter @message like /NodeNotReady/
| sort @timestamp desc

# kube-apiserver-audit 로그에서 userAgent 정렬해서 아래 4개 필드 정보 검색
fields userAgent, requestURI, @timestamp, @message
| filter @logStream ~= "kube-apiserver-audit"
| stats count(userAgent) as count by userAgent
| sort count desc

#
fields @timestamp, @message
| filter @logStream ~= "kube-scheduler"
| sort @timestamp desc

#
fields @timestamp, @message
| filter @logStream ~= "authenticator"
| sort @timestamp desc

#
fields @timestamp, @message
| filter @logStream ~= "kube-controller-manager"
| sort @timestamp desc

 

 

 

# AWS CLI를 활용한 로그 쿼리 예시

aws logs get-query-results --query-id $(aws logs start-query \
--log-group-name '/aws/eks/myeks/cluster' \
--start-time `date -d "-1 hours" +%s` \
--end-time `date +%s` \
--query-string 'fields @timestamp, @message | filter @logStream ~= "kube-scheduler" | sort @timestamp desc' \
| jq --raw-output '.queryId')

 

 

CLI를 활용해서도 로그 쿼리 가능!!

 

 

로깅 옵션 OFF

# EKS Control Plane 로깅(CloudWatch Logs) 비활성화
eksctl utils update-cluster-logging --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --disable-types all --approve

# 로그 그룹 삭제
aws logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster

 

 

 

 

update-cluster-logging 옵션을 통해서, 로깅 비활성화 진행

 

 

EKS 관련 log-group-name 은 /aws/eks/<Cluster Name>/cluster 이므로 관련 로그 손쉽게 삭제 가능!

 

 

 

컨테이너(파드) 로깅 with NGINX

# NGINX 웹서버 배포
helm repo add bitnami https://charts.bitnami.com/bitnami

# 사용 리전의 인증서 ARN 확인
CERT_ARN=$(aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text)
echo $CERT_ARN

# 도메인 확인
echo $MyDomain

# 파라미터 파일 생성
cat <<EOT > nginx-values.yaml
service:
    type: NodePort

ingress:
  enabled: true
  ingressClassName: alb
  hostname: nginx.$MyDomain
  path: /*
  annotations: 
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
    alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
    alb.ingress.kubernetes.io/success-codes: 200-399
    alb.ingress.kubernetes.io/load-balancer-name: $CLUSTER_NAME-ingress-alb
    alb.ingress.kubernetes.io/group.name: study
    alb.ingress.kubernetes.io/ssl-redirect: '443'
EOT
cat nginx-values.yaml | yh

# 배포
helm install nginx bitnami/nginx --version 14.1.0 -f nginx-values.yaml

# 확인
kubectl get ingress,deploy,svc,ep nginx
kubectl get targetgroupbindings # ALB TG 확인

# 접속 주소 확인 및 접속
echo -e "Nginx WebServer URL = https://nginx.$MyDomain"
curl -s https://nginx.$MyDomain
kubectl logs deploy/nginx -f

# 반복 접속
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done

# (참고) 삭제 시
helm uninstall nginx

 

 

 

nginx-values.yaml

 

 

배포된 nginx 파드

 

 

ALB 타입으로 배포된 host 정보 확인!!

 

 

nginx 디플로이먼트에 대해 로깅 / LB 헬스 체크 및 Bastion에서 curl 한 로그 확인 가능!

 

 

 

컨테이너 로그는 표준 출력(stdout), 표준 에러(stderr)로 보내는 것을 권고!!
이러한 권고 사항에 따라 작성 및 생성된 컨테이너 애플리케이션의 로그는 굳이 파드에 직접 접속하지 않고 외부에서 kubectl logs 명령어로 확인 가능!!

 

 

컨테이너 로그 파일 위치 확인!! 표준 출력, 표준 에러 출력에 맞게 작성된 것으로 보이는 nginx

 

 

 

 

Container Insights metrics in Amazon CloudWatch & Fluent Bit (Logs)

CCI (CloudWatch Container Insight)
노드에 CloudWatch Agent 파드와 FluentBit 파드가 데몬셋으로 배치되어 메트릭과 로그를 수집!

 

 

Fluent Bit

Fluent Bit 아키텍처 - Image Source:&nbsp;https://aws.amazon.com/ko/blogs/containers/fluent-bit-integration-in-cloudwatch-container-insights-for-eks/

 

 

Fluent Bit 아키텍처에 대한 이해는 크게 세 가지 부분 수집, 저장, 시각화 로 나눠서 이해해보자!

  • 수집: Fluent Bit 컨테이너를 데몬셋으로 동작시키고 application, host, dataplane 로그를 CloudWatch Logs로 전송!
    • Log group 이름 규칙: /aws/containerinsights/<CLUSTER NAME>/<로그 분류>
      • 로그 분류에는 다음의 카테고리 확인 가능!
        • application
        • dataplane
        • host
        • performance
  • 저장: CloudWatch Logs에 로그를 저장! 로그 그룹 별 리텐션 기간 설정 가능!
  • 시각화: CloudWatch의 Logs Insights를 사용하여 로그를 분석할 수 있으며, CloudWatch 대시보드로 시각화!

 

실습을 통해, Fluent Bit 배포 진행

 

 

 

Amazon CloudWatch Container Insights:

Container Insights - Image Source:&nbsp;https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/90-monitoring

 

  • CloudWatch Container Insight는 컨테이너형 애플리케이션 및 마이크로 서비스에 대한 모니터링, 트러블 슈팅 및 알람을 위한 완전 관리형 관측 서비스
  • CloudWatch Container Insight를 사용하면 CloudWatch 콘솔에서 자동화된 대시보드를 통해 container metrics, Prometeus metrics, application logs 및 performance log events를 탐색, 분석 및 시각화 가능!!

 

 

Fluent Bit을 통해 수집된 로그 그룹, CloudWatch에서 확인 가능

 

 

 

Container Insights에서 클러스터에 대한 모니터링 가능

 

 

Container Insights의 container map에서 위와 같이 확인 가능

 

 

 

Metrics-server & kwatch & botkube

Metrics-server
kubelet으로부터 수집한 리소스 메트릭을 수집 및 집계하는 클러스터 애드온 구성 요소

 

Metrics-Server - Image Source:&nbsp;https://kubernetes.io/ko/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/

 

  • cAdvisor : kubelet에 포함된 컨테이너 메트릭을 수집, 집계, 노출하는 데몬

 

 

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

# 메트릭 서버 확인 : 메트릭은 15초 간격으로 cAdvisor를 통하여 가져옴
kubectl get pod -n kube-system -l k8s-app=metrics-server
kubectl api-resources | grep metrics
kubectl get apiservices |egrep '(AVAILABLE|metrics)'

# 노드 메트릭 확인
kubectl top node

# 파드 메트릭 확인
kubectl top pod -A
kubectl top pod -n kube-system --sort-by='cpu'
kubectl top pod -n kube-system --sort-by='memory'

 

 

metrics-server 배포 확인

 

 

노드 및 파드 메트릭 확인 실습!

 

 

kwatch

kwatch
kwatch는 Kubernetes 클러스터의 모든 변경 사항을 모니터링하고, 실행 중인 앱의 충돌을 실시간으로 감지하고, 채널에 알림(슬랙, 디스코드 등)을 즉시 게시할 수 있도록 도와줍니다!!

 

 

# configmap 생성
cat <<EOT > ~/kwatch-config.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: kwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: kwatch
  namespace: kwatch
data:
  config.yaml: |
    alert:
      slack:
        webhook: '<해당 webhook 설정 칸에 알림을 받고 싶은 slack의 webhook URL 정보 입력!!>'
        title: $NICK-EKS
        #text:
    pvcMonitor:
      enabled: true
      interval: 5
      threshold: 70
EOT
kubectl apply -f kwatch-config.yaml

# 배포
kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.8.3/deploy/deploy.yaml

 

 

kwatch 관련 리소스를 배포하면 슬랙에서 확인 가능!

 

 

# pod 모니터링용 터미널 추가!
watch kubectl get pod

# 잘못된 이미지 정보의 파드 배포
kubectl apply -f https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/nginx-error-pod.yml
kubectl get events -w

# 이미지 업데이트 방안2 : set 사용 - iamge 등 일부 리소스 값을 변경 가능!
kubectl set 
kubectl set image pod nginx-19 nginx-pod=nginx:1.19

# 삭제
kubectl delete pod nginx-19

# kwatch 삭제
kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.8.3/deploy/deploy.yaml

 

 

 

잘못된 컨테이너 이미지 정보로 파드 배포 진행 - ErrImagePull STATUS

 

kubeopsview에서도 동일하게 확인 가능

 

 

슬랙에서도 동일한 이슈에 대해, 확인 가능!!

 

 

프로메테우스 스택

프로메테우스 (Prometheus)

Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud

 

 

Prometheus Architecture - Image Source: https://prometheus.io/docs/introduction/overview/

 

 

 

프로메테우스 제공 기능:

  • 시계열 데이터를 스크래핑하고 저장하는 prometheus server
  • 응용 프로그램 코드를 계측하기 위한 client library
  • Short-lived jobs를 지원하기 위한 push gateway
  • HAProxy, StatsD, Graphite 등과 같은 서비스를 위한 exporters
  • 경보를 처리하는 alertmanager
  • 다양한 지원 도구

 

 

프로메테우스-스택 설치

kube-prometheus-stack collects Kubernetes manifests, Grafana dashboards, and Prometheus rules combined with documentation and scripts to provide easy to operate end-to-end Kubernetes cluster monitoring with Prometheus using the Prometheus Operator.

 

  • 모니터링에 필요한 여러 요소를 단일 차트(스택)으로 제공
    • 시각화(그라파나)
    • 이벤트 메시지 정책(경고 임계값, 수준) 등

 

# 모니터링
kubectl create ns monitoring
watch kubectl get pod,pvc,svc,ingress -n monitoring

# 사용 리전의 인증서 ARN 확인
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

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

# 파라미터 파일 생성
cat <<EOT > monitor-values.yaml
prometheus:
  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: "10GiB"

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - prometheus.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - grafana.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

defaultRules:
  create: false
kubeControllerManager:
  enabled: false
kubeEtcd:
  enabled: false
kubeScheduler:
  enabled: false
alertmanager:
  enabled: false

# alertmanager:
#   ingress:
#     enabled: true
#     ingressClassName: alb
#     hosts: 
#       - alertmanager.$MyDomain
#     paths: 
#       - /*
#     annotations:
#       alb.ingress.kubernetes.io/scheme: internet-facing
#       alb.ingress.kubernetes.io/target-type: ip
#       alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
#       alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
#       alb.ingress.kubernetes.io/success-codes: 200-399
#       alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
#       alb.ingress.kubernetes.io/group.name: study
#       alb.ingress.kubernetes.io/ssl-redirect: '443'
EOT
cat monitor-values.yaml | yh

# 배포
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.27.2 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring


# 확인
## grafana : 프로메테우스는 메트릭 정보를 저장하는 용도로 사용하며, 그라파나로 시각화 처리
## prometheus-0 : 모니터링 대상이 되는 파드는 ‘exporter’라는 별도의 사이드카 형식의 파드에서 모니터링 메트릭을 노출, pull 방식으로 가져와 내부의 시계열 데이터베이스에 저장
## node-exporter : 노드익스포터는 물리 노드에 대한 자원 사용량(네트워크, 스토리지 등 전체) 정보를 메트릭 형태로 변경하여 노출
## operator : 시스템 경고 메시지 정책(prometheus rule), 애플리케이션 모니터링 대상 추가 등의 작업을 편리하게 할수 있게 CRD 지원
## kube-state-metrics : 쿠버네티스의 클러스터의 상태(kube-state)를 메트릭으로 변환하는 파드

helm list -n monitoring
kubectl get pod,svc,ingress -n monitoring
kubectl get-all -n monitoring
kubectl get prometheus,servicemonitors -n monitoring
kubectl get crd | grep monitoring

 

 

 

monitoring 네임스페이스에 프로메테우스 스택 배포

 

 

watch 명령어에서 확인했듯이 ALB 타입의 그라파나, 프로메테우스 리스너 확인 가능!

 

1 - CPU의 avg 유휴 시간을 1분 간격으로 샘플링하여 계산

 

 

 

그라파나

Grafana
Grafana open source software enables you to query, visualize, alert on, and explore your metrics, logs, and traces wherever they are stored. Grafana OSS provides you with tools to turn your time-series database (TSDB) data into insightful graphs and visualizations.

 

 

Grafana: The open observability platform | Grafana Labs

Your observability stack Operational dashboards for your data here, there, or anywhere

grafana.com

 

 

  • TSDB 데이터를 시각화, 다양한 데이터 형식 지원(메트릭, 로그, 트레이스 등)
  • 그라파나는 시각화 솔루션으로 데이터 자체를 저장하지 않음 → 현재 실습 환경에서는 데이터 소스 프로메테우스를 사용
  • 접속 정보 확인 및 로그인 : 기본 계정 - admin / prom-operator

 

 

# 그라파나 버전 확인
kubectl exec -it -n monitoring deploy/kube-prometheus-stack-grafana -- grafana-cli --version
grafana cli version 9.5.1

# ingress 확인
kubectl get ingress -n monitoring kube-prometheus-stack-grafana
kubectl describe ingress -n monitoring kube-prometheus-stack-grafana

# ingress 도메인으로 웹 접속 : 기본 계정 - admin / prom-operator
echo -e "Grafana Web URL = https://grafana.$MyDomain"

 

 

Connections(=Data source) 정보 확인

 

 

kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus
NAME                                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kube-prometheus-stack-prometheus   ClusterIP   10.100.96.163   <none>        9090/TCP   15m

NAME                                         ENDPOINTS            AGE
endpoints/kube-prometheus-stack-prometheus   192.168.3.103:9090   15m

 

 

 

1 Kubernetes All-in-one Cluster Monitoring KR (17900) 대시보드 확인

 

 

# 테스트용 netshoot 파드 배포
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: netshoot-pod
spec:
  containers:
  - name: netshoot-pod
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF
kubectl get pod netshoot-pod

# 접속 확인
kubectl exec -it netshoot-pod -- nslookup kube-prometheus-stack-prometheus.monitoring
kubectl exec -it netshoot-pod -- curl -s kube-prometheus-stack-prometheus.monitoring:9090/graph -v ; echo

# 삭제
kubectl delete pod netshoot-pod

 

 

 

netshoot 파드를 활용한 데이터 소스 확인

 

 

 

 

kubecost

kubecost
OpenCost 를 기반으로 구축되었으며, AWS에서 적극 지원!
쿠버네티스 리소스별 비용 분류에 대한 가시화 제공

 

kubecost URL: https://www.kubecost.com/

 

Kubecost | Kubernetes cost monitoring and management

Kubecost provides real-time cost visibility and insights for teams using Kubernetes, helping you continuously reduce your cloud costs.

www.kubecost.com

 

 

kubecost architecture

 

 

# kubecost 설치
# yaml 파일 작성
cat <<EOT > cost-values.yaml
global:
  grafana:
    enabled: true
    proxy: false

priority:
  enabled: false
networkPolicy:
  enabled: false
podSecurityPolicy:
  enabled: false

persistentVolume:
    storageClass: "gp3"

prometheus:
  kube-state-metrics:
    disabled: false
  nodeExporter:
    enabled: true

reporting:
  productAnalytics: true
EOT

# kubecost chart 에 프로메테우스가 포함되어 있으니, 기존 프로메테우스-스택은 삭제하자 : node-export 포트 충돌 발생
helm uninstall -n monitoring kube-prometheus-stack

# 배포
kubectl create ns kubecost
helm install kubecost oci://public.ecr.aws/kubecost/cost-analyzer --version 1.103.2 --namespace kubecost -f cost-values.yaml

# 배포 확인
kubectl get-all -n kubecost
kubectl get all -n kubecost

# kubecost-cost-analyzer 파드 IP변수 지정 및 접속 확인
CAIP=$(kubectl get pod -n kubecost -l app=cost-analyzer -o jsonpath={.items[0].status.podIP})
curl -s $CAIP:9090

# 외부에서 bastion EC2 접속하여 특정 파드 접속 방법 : socat(SOcket CAT) 활용 - 링크
yum -y install socat
socat TCP-LISTEN:80,fork TCP:$CAIP:9090
웹 브라우저에서 bastion EC2 IP로 접속

 

 

 

데이터를 가져오는데 15분 이상 소요되는 것으로 확인

 

 

 

OpenTelemetry(OTel)

EKS Add-on ADOT

관련 URL: https://ersia.tistory.com/30

 

[Study][Amazon EKS] EKS Add-On ADOT 사용해보기

EKS ADOT(AWS Distro for OpenTelemetry) EKS ADOT를 사용하기에 앞서 해당 Add-On이 어떤 것인지 이해하기 위한 정보를 먼저 찾아보았다. APM(Application Performance Monitoring) 이란? 서비스 중인 어플리케이션의 성능

ersia.tistory.com

 

 

 

ADOT, AMP 및 AMG를 사용한 모니터링

관련 URL: https://kschoi728.tistory.com/97

 

[4주차] EKS Observability - ADOT, AMP 및 AMG를 사용한 모니터링

CloudNet@ 팀의 AWS EKS Workshop Study 4주차 정리입니다. # EKS Immersion Workshop 의 내용입니다. ADOT (AWS Distro for Open Telemetry) 안전한 AWS 지원 Open Telemetry 프로젝트 배포판입니다. CNCF(Cloud Native Computing Foundation)

kschoi728.tistory.com

 

 

(실습 완료 후) 자원 삭제

Helm Chart 삭제

helm uninstall -n kube-system kube-ops-view
helm uninstall nginx
helm uninstall botkube --namespace botkube
helm uninstall -n monitoring kube-prometheus-stack

 

 

EKS Cluster & CloudFormation 삭제

eksctl delete cluster --name $CLUSTER_NAME && aws cloudformation delete-stack --stack-name $CLUSTER_NAME

 

 

(Optional) 로깅 삭제

# EKS Control Plane 로깅(CloudWatch Logs) 비활성화
eksctl utils update-cluster-logging --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --disable-types all --approve
# 로그 그룹 삭제 : 컨트롤 플레인
aws logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster

---
# 로그 그룹 삭제 : 데이터 플레인
aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/application
aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/dataplane
aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/host
aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/performance

 

 

 

4주차 과제

Understanding and Cost Optimizing Amazon EKS Control Plane Logs

관련 URL: https://aws.amazon.com/ko/blogs/containers/understanding-and-cost-optimizing-amazon-eks-control-plane-logs/

 

Understanding and Cost Optimizing Amazon EKS Control Plane Logs | Amazon Web Services

Amazon Elastic Kubernetes Service (Amazon EKS) is a managed container service that provides a highly available single-tenant control plane to run and scale Kubernetes applications in the cloud or on-premises. Logs are an important way to debug problems, au

aws.amazon.com

 

 

 

 

 

긴 글 읽어주셔서 감사합니다 😄

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.