목차
1. Amazon EKS 원클릭 배포
    1.1. CloudFormation 스택 생성
    1.2. CloudFormation 스택 생성 확인
2. Amazon EKS 원클릭 배포 정보 확인
    2.1. 기본 정보 확인
    2.2. 기본 설정 작업
3. 실습 환경 삭제


1. Amazon EKS 원클릭 배포


이번 실습은 5장의 실습을 위한 기본 인프라 환경과 Amazon EKS 클러스터 배포에 대해 CloudFormation을 통해 원클릭 배포를 수행하는 가이드입니다.

Amazon EKS 원클릭 배포를 통해 실습 구성의 시간 절약과 함께 각 실습의 목표 학습 내용만 집중할 수 있을 것입니다.


1.1. CloudFormation 스택 생성

해당 링크를 클릭하면 AWS CloudFormation 페이지로 연결되며, 파라미터를 입력 후 스택을 생성합니다.

Note: AWS 관리 콘솔에 로그인 할때 IAM 사용자 계정으로 진행합니다.


[관리 콘솔] CloudFormation 파라미터 설정

  • 스택 생성 페이지에서 다음 버튼을 클릭합니다.
  • 스택 이름은 [myeks]로 입력합니다.
  • KeyName은 [각자의 키페어]를 선택합니다.
  • MyIAMUserAccessKeyID는 [각자의 액세스 키 ID 값]을 입력합니다.
  • MyIAMUserSecretAccessKey는 [각자의 시크릿 액세스 키 값]을 입력합니다.
  • SgIngressSshCidr는 [각자의 PC의 퍼블릭 IP 주소/32]로 입력합니다.
  • 나머지 파라미터는 기본 값을 유지하고 다음 버튼을 클릭합니다.


Warning: 설정을 마치고 약 20분 정도 대기 시간이 흐른 뒤 기본 인프라 환경과 Amazon EKS 클러스터 생성이 완료됩니다. 반드시 해당 대기 시간이 지난 후 다음 작업을 수행합니다.



1.2. CloudFormation 스택 생성 확인

Amazon EKS 원클릭 배포를 수행하면 AWS CloudFormation 스택 9개가 생성됩니다.


CloudFormation 스택 정보

  • myeks: 기본 인프라 생성을 정의한 스택
  • eksctl-myeks-cluster: eks 클러스터 생성을 정의한 스택
  • eksctl-myeks-addon-vpc-cni: vpc cni를 위한 IAM 역할을 정의한 스택
  • eksctl-myeks-nodegroup-ng1: eks 클러스터의 관리형 노드 그룹을 정의한 스택
  • eksctl-myeks-addon-iamserviceaccount-kube-system-aws-load-balancer-controller: aws load balancer controller를 위한 IRSA를 정의한 스택
  • eksctl-myeks-addon-ebs-csi-driver: ebs-csi-driver를 정의한 스택
  • eksctl-myeks-addon-efs-csi-driver: efs-csi-driver를 정의한 스택
  • eksctl-myeks-addon-iamserviceaccount-kube-system-ebs-csi-controller-sa: ebs-csi-controller를 위한 IRSA를 정의한 스택
  • eksctl-myeks-addon-iamserviceaccount-kube-system-efs-csi-controller-sa: efs-csi-controller를 위한 IRSA를 정의한 스택

Note: myeks 스택의 출력 탭에서 작업용 인스턴스의 퍼블릭 IP 주소를 확인할 수 있습니다.




2. Amazon EKS 원클릭 배포 정보 확인


AWS CloudFormation 스택의 출력 탭에서 eksctlhost의 퍼블릭 IP를 확인합니다.
해당 IP로 EKS 관리용 인스턴스(myeks-bastion-EC2)에 SSH로 접속하고 아래 명령어를 통해 정보를 확인합니다.


2.1. 기본 정보 확인

Amazon EKS 원클릭으로 배포된 기본 정보와 설정을 진행합니다.


Default Namespace로 적용

1
2
// Default Namespace로 위치 변경
kubectl ns default


노드의 프라이빗 IP 변수 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//  3대의 워커노드의 Private IP 주소 변수 저장
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})

N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})

N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})

// 3대의 워커노드의 Private IP 주소 전역 변수로 선언 및 확인
echo "export N1=$N1" >> /etc/profile

echo "export N2=$N2" >> /etc/profile

echo "export N3=$N3" >> /etc/profile

echo $N1, $N2, $N3


작업용 인스턴스에서 노드로 보안 그룹 설정

1
2
3
4
5
// 노드 보안 그룹 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


워커 노드 SSH 접근 확인

1
2
// N1, N2, N3 워커 노드에 SSH 접속 후 hostname 명령어 수행
for node in $N1 $N2 $N3; do ssh ec2-user@$node hostname; done


2.2. 기본 설정 작업

5장에서 실습할 다양한 도구 설치와 기본 설정을 수행합니다.


AWS Load Balancer Controller 설치

1
2
3
4
5
6
7
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


ExternalDNS 설치

1
2
3
4
5
6
7
8
9
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 -


kube-ops-view 설치

1
2
3
4
5
6
7
8
9
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 Cert Manager 인증서 변수화

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


프로메테우스 스택 설치

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// 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


메트릭 서버 설치

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 메트릭 서버 배포
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'


EKS Node Viewer 설치

1
2
3
4
5
6
7
8
9
10
// 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




3. 실습 환경 삭제


Amazon EKS 원클릭을 통해 배포된 모든 자원을 삭제합니다.


helm chart 삭제

1
2
3
helm uninstall -n monitoring kube-prometheus-stack

helm uninstall -n kube-system kube-ops-view


Amazon EKS 원클릭 배포의 삭제

1
2
3
// Amazon EKS 원클릭 배포의 삭제
eksctl delete cluster --name $CLUSTER_NAME \
  && aws cloudformation delete-stack --stack-name $CLUSTER_NAME

Warning: Amazon EKS 원클릭 배포의 삭제는 약 15분 정도 소요됩니다. 삭제가 완료될 때 까지 SSH 연결 세션을 유지합니다.


Warning: 만약에 CloudFormation 스택이 삭제되지 않는다면 수동으로 VPC(myeks-VPC)를 삭제 후 CloudFormation 스택을 다시 삭제해 주세요.




여기까지 5장의 Amazon EKS 원클릭 배포와 기본 설정 실습을 마칩니다.
수고하셨습니다 :)