✅ EKS 환경에서 HPA, VPA, CA수행을 위한 사전 작업을 따로 빼서 정리한 글입니다.
여기를 통해 사전 작업이 완료된 기본 환경을 CloudFormation을 통해 다운받을 수 있습니다.🗂️
CloudFormation을 이용하여 EBS, EFS, AWS LB Controller가 설치된 상태로 이후 작업을 진행.
클러스터에서 AWS 자원에 접근하기 위한 IRSA 생성 또한 완료된 상태이다.
이후 작업...⬇️
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에서 들어오는 트래픽을 허용해주는 작업을 "노드 보안 그룹"쪽에 수행해 줘야한다.
// 노드 보안 그룹 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
프로메테우스
그라파나
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"
클러스터 내의 노드와 배포되는 파드의 정보를 가시성있게 확인할 수 있는 뷰어 서버이다.
// 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 사용율, 비용정보를 확인할 수 있다.
이제 HPA, VPA, CA(+karpenter)를 진행하기 위한 기본적인 구성이 완료되었다. 본격적으로 HPA, VPA, CA(+karpenter)를 진행해 보자!🥳