[EKS] HPA, VPA, CA 사전 구성 요소 설치 작업

vinca·2024년 3월 5일
0

Introduction

✅ EKS 환경에서 HPA, VPA, CA수행을 위한 사전 작업을 따로 빼서 정리한 글입니다.
여기를 통해 사전 작업이 완료된 기본 환경을 CloudFormation을 통해 다운받을 수 있습니다.🗂️

사전 작업

CloudFormation을 이용하여 EBS, EFS, AWS LB Controller가 설치된 상태로 이후 작업을 진행.
클러스터에서 AWS 자원에 접근하기 위한 IRSA 생성 또한 완료된 상태이다.

이후 작업...⬇️

external DNS 설치

external DNS의 경우 사전에 클러스터 생성 시, 미리 –-external-dns-access 옵션을 클러스터 생성 시 준게 아니라면 IRSA를 생성해주는 작업이 필요하다.

MyDomain=<자신의 도메인>
MyDnsHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
echo $MyDomain, $MyDnsHostedZoneId
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/externaldns.yaml
MyDomain=$MyDomain MyDnsHostedZoneId=$MyDnsHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -

Bastion Host 트래픽 허용

먼저 Bastion Host에서 노드로 명령을 보내기 위해서는 Bastion Host에서 들어오는 트래픽을 허용해주는 작업을 "노드 보안 그룹"쪽에 수행해 줘야한다.

// 노드 보안 그룹 ID를 변수 선언
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)

// 노드 보안 그룹에 정책 추가 - 작업용 인스턴스에서 노드로 모든 통신 허용
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32

메트릭 서버 설치

// 메트릭 서버 배포
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 top node

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

HPA나 VPA가 동작할 때, 이러한 메트릭 서버에게 API를 요청해서 해당 메트릭으로부터 정보를 수집하고 HPA/VPA를 동작시킨다.

프로메테우스 & 그라파나 설치

// ACM 인증서 변수 선언
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`; echo $CERT_ARN

// monitoring 네임 스페이스 생성
kubectl create ns monitoring

// helm chart repository 추가
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"

  verticalPodAutoscaler:
    enabled: true

  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
EOT

// 프로메테우스 스택 배포
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

ingress 도메인으로 웹 접속 시, 그라파나의 기본 계정은 다음과 같다.

  • ID : admin
  • PW : prom-operator
  • 프로메테우스

  • 그라파나

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"

클러스터 내의 노드와 배포되는 파드의 정보를 가시성있게 확인할 수 있는 뷰어 서버이다.

EKS Node Viewer 설치

// go 설치
yum install -y go

// EKS Node Viewer 설치 (2분 이상 소요)
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@v0.5.0
// 신규 터미널에서 실행
cd ~/go/bin
./eks-node-viewer

노드에 대한 CPU 사용율, 비용정보를 확인할 수 있다.

✔️ fin.

이제 HPA, VPA, CA(+karpenter)를 진행하기 위한 기본적인 구성이 완료되었다. 본격적으로 HPA, VPA, CA(+karpenter)를 진행해 보자!🥳

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글