1. 기본 인프라 배포
이번 실습은 IAM 사용자 계정을 통해 관리 콘솔에 접근하고 액세스 키를 활용해 awscli 도구를 사용합니다.
해당 작업을 수행하지 않았다면 아래 토글을 확장해 작업을 선행하고 본격적인 실습에 들어갑니다.
IAM 사용자 생성 및 액세스 키 생성
1.1. CloudFormation을 통한 기본 인프라 배포
해당 링크를 클릭하면 AWS CloudFormation 페이지로 연결되며, 파라미터를 입력(키 페어, 작업 PC의 공인 IP 주소/32) 후 스택을 실행합니다.
Note: AWS 관리 콘솔에 로그인 할때 IAM 사용자 계정으로 진행합니다.
AWS CloudFormation에 의해 생성이 완료되면 관리 콘솔에서 생성된 인프라들을 확인합니다.
1.2. EKS 관리용 인스턴스 정보 확인
AWS CloudFormation 스택의 출력 탭에서 eksctlhost의 퍼블릭 IP를 확인합니다.
해당 IP로 EKS 관리용 인스턴스(myeks-host)에 SSH로 접속하고 아래 명령어를 통해 정보를 확인합니다.
사용자 확인
whoami
Bash
복사
•
whoami를 입력하여 root 사용자임을 확인합니다.
Note: root 사용자로 전환하도록 미리 설정해 두었으며, 접속 타이밍에 따라 ec2-user 사용자라면 sudo su -를 입력하여 root 사용자로 전환합니다.
기본 설치 도구 확인
kubectl version --client=true -o yaml | yh
Bash
복사
# kubectl 버전 확인
eksctl version
Bash
복사
# eksctl 버전 확인
aws --version
Bash
복사
# awscli 버전 확인
docker info | yh
Bash
복사
# 도커 정보 확인
Note: 실습 진행 시점에 따라 버전 정보가 다를 수도 있습니다.
awscli 사용을 위한 IAM 자격 증명
aws ec2 describe-instances | jq
Bash
복사
# awscli로 인스턴스 정보 확인 (IAM 자격 증명 X)
aws configure
Bash
복사
# IAM 사용자 자격 구성
•
IAM 사용자의 액세스 키 생성할 때 저장한 xxxx_accesskeys.csv 파일을 열어 값을 참조합니다.
•
aws configure를 입력하여 Access Key ID, Secret Access Key, Region 코드를 입력합니다.
•
IAM 자격 증명이 이루어지면 awscli 도구로 인스턴스 정보를 다시 확인합니다.
EKS를 배포할 VPC 정보 확인
echo $CLUSTER_NAME
Bash
복사
# CLUSTER_NAME 변수 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq
Bash
복사
# EKS를 배포할 VPC 정보 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId
Bash
복사
# EKS를 배포할 VPC ID 값만 확인
EKS를 배포할 VPC ID 변수 저장
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
Bash
복사
# VPCID 변수에 VPC ID 값을 저장
echo "export VPCID=$VPCID" >> /etc/profile
Bash
복사
# VPCID를 전역 변수로 선언
echo $VPCID
Bash
복사
# VPCID 변수 호출
EKS를 배포할 VPC의 서브넷 정보 확인
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq
Bash
복사
# EKS를 배포할 VPC의 전체 서브넷 정보 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" | jq
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" | jq
Bash
복사
# EKS를 배포할 VPC의 퍼블릭 서브넷 정보 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text
Bash
복사
# EKS를 배포할 VPC의 퍼블릭 서브넷 ID 값만 확인
EKS를 배포할 퍼블릭 서브넷 ID 변수 저장
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
Bash
복사
# 변수에 퍼블릭 서브넷 ID 값을 저장
echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
Bash
복사
# 퍼블릭 서브넷 ID를 전역 변수로 선언
echo $PubSubnet1
echo $PubSubnet2
Bash
복사
# 퍼블릭 서브넷 ID 변수 호출
변수 호출 (종합)
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PubSubnet1,$PubSubnet2
Bash
복사
# 변수 확인
2. 관리 콘솔에서 Amazon EKS 배포
2.1. Amazon EKS 클러스터 생성 (관리 콘솔)
Amazon EKS 클러스터 생성에 앞서 IAM 역할이 필요합니다.
먼저 EKS 클러스터 IAM 역할을 생성 후 다음 작업을 진행합니다.
[관리 콘솔] EKS 클러스터 IAM Role 생성
•
AWS IAM 역할 메뉴로 진입합니다.
•
역할 만들기 버튼을 클릭합니다.
•
신뢰할 수 있는 엔터티 유형은 [AWS 서비스]로 선택합니다.
•
사용 사례는 다른 AWS 서비스의 사용 사례에서 [EKS] 선택 후 [EKS - Cluster]를 선택하고 다음 버튼을 클릭합니다.
•
연결되는 정책인 AmazonEKSClusterPolicy를 확인하고 다음 버튼을 클릭합니다.
•
역할 이름을 eksClusterRole로 입력하고 역할 생성 버튼을 클릭합니다.
[관리 콘솔] EKS 클러스터 추가 생성
•
•
[클러스터 구성] 영역에서 이름은 myeks로 입력합니다.
•
[클러스터 구성] 영역에서 Kubernetes 버전은 [1.26]으로 선택합니다.
•
[클러스터 구성] 영역에서 클러스터 서비스 역할은 [eksClusterRole]을 선택하고 다음 버튼을 클릭합니다.
•
[네트워킹] 영역에서 VPC는 [myeks-VPC]를 선택합니다.
•
[네트워킹] 영역에서 서브넷은 [myeks-PublicSubnet1]과 [myeks-PublicSubnet2]를 선택합니다.
•
[클러스터 엔드포인트 액세스] 영역에서 [퍼블릭]을 선택하고 다음 버튼을 클릭합니다.
•
[로깅 구성] 영역은 별도의 설정 없이 다음 버튼을 클릭합니다.
•
[추가 기능 선택] 영역은 기본값을 유지하고 다음 버튼을 클릭합니다.
•
[선택한 추가 기능 설정 구성] 영역은 별도의 설정 없이 다음 버튼을 클릭합니다.
•
[검토 및 생성] 영역의 내용을 살펴보고 생성 버튼을 클릭합니다.
Note: 설정을 마치고 약 5분 정도 대기 시간이 흐른 뒤 EKS 클러스터 생성이 완료됩니다.
EKS 클러스터 정보를 kubeconfig에 등록
•
myeks-host에서 생성한 EKS 클러스터와 통신을 위해 kubeconfig 생성 및 업데이트가 필요합니다.
aws eks update-kubeconfig --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME
Bash
복사
# EKS 클러스터 정보 업데이트
cat ~/.kube/config | yh
Bash
복사
# kubeconfig 정보 확인
kubeoff
Bash
복사
# kube_ps1 비활성화
kubectl get svc
Bash
복사
# 생성한 Kubernetes 서비스 확인
2.2. Amazon EKS 노드 생성 (관리 콘솔)
Amazon EKS 노드 생성에 앞서 IAM 역할이 필요합니다.
먼저 EKS 노드 IAM 역할을 생성 후 다음 작업을 진행할 것인데 이번에는 관리 콘솔이 아닌 awscli를 통해 작업을 진행하겠습니다.
EKS 노드 IAM Role의 신뢰 엔터티 설정
cat <<EOT > node-role-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOT
Bash
복사
# EKS 노드 IAM 역할의 신뢰 대상 지정 파일 생성
EKS 노드 IAM Role 생성
aws iam create-role \
--role-name eksNodeRole \
--assume-role-policy-document file://"node-role-trust-policy.json"
Bash
복사
# EKS 노드 IAM 역할 생성 (eksNodeRole)
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \
--role-name eksNodeRole
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \
--role-name eksNodeRole
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
--role-name eksNodeRole
Bash
복사
# EKS 노드 IAM 역할에 정책 연결
EKS 노드 IAM Role 확인
aws iam get-role --role-name eksNodeRole | jq
Bash
복사
# EKS 노드 IAM 역할 확인
aws iam list-attached-role-policies --role-name eksNodeRole | jq
Bash
복사
# EKS 노드 IAM 역할에 연결된 정책 확인
[관리 콘솔] EKS 관리형 노드 그룹 생성
•
•
[노드 그룹] 영역에서 노드 그룹 추가 버튼을 클릭합니다.
•
[노드 그룹 구성] 영역에서 이름을 myeks-nodegroup으로 입력합니다.
•
[노드 그룹 구성] 영역에서 노드 IAM 역할을 [eksNodeRole]으로 선택하고 다음 버튼을 클릭합니다.
•
[컴퓨팅 및 조정 구성 설정] 영역은 기본 값으로 유지하고 다음 버튼을 클릭합니다.
•
[노드 그룹 네트워크 구성] 영역에서 노드에 대한 원격 액세스 허용을 체크하여 확장하며 팝업에서 활성화 버튼을 클릭합니다.
•
EC2 키 페어는 자신의 키파일을 선택합니다.
•
보안 그룹은 [eks-cluster-sg-myeks-XXXX]를 선택하고 다음 버튼을 클릭합니다.
•
[검토 및 생성] 영역의 내용을 살펴보고 생성 버튼을 클릭합니다.
Note: 설정을 마치고 약 3분 정도 대기 시간이 흐른 뒤 EKS 관리형 노드 그룹 생성이 완료됩니다.
생성이 완료되면 Amazon EKS 관리 콘솔에서 생성된 자원을 확인합니다.
Warning: 노드 그룹이 정상적으로 생성되지 않는다면 아래 토글 내용을 확인해 보길 바랍니다.
EKS 클러스터의 IAM OIDC 생성
2.3. Amazon EKS 클러스터 삭제 (관리 콘솔)
Amazon EKS 클러스터 삭제를 할때 노드가 생성되어 있다면 노드 먼저 삭제해야 합니다.
[관리 콘솔] EKS 관리형 노드 그룹 삭제
•
해당 링크를 클릭하여 생성된 myeks_nodegroup 페이지로 진입합니다.
•
우측 상단에 삭제 버튼을 클릭합니다.
•
[삭제 노드 그룹] 팝업 창에서 myeks_nodegroup을 입력하고 삭제 버튼을 클릭합니다.
Note: 삭제를 진행하고 약 5분 정도 대기 시간이 흐른 뒤 EKS 관리형 노드 그룹 삭제가 완료됩니다.
[관리 콘솔] EKS 클러스터 삭제
•
Amazon EKS 클러스터 메뉴에 진입합니다.
•
생성된 클러스터인 myeks를 선택하고 우측에 삭제 버튼을 클릭합니다.
•
[삭제 클러스터] 팝업 창에서 myeks을 입력하고 삭제 버튼을 클릭합니다.
Note: 삭제를 진행하고 약 3분 정도 대기 시간이 흐른 뒤 EKS 클러스터 삭제가 완료됩니다.
3. eksctl에서 Amazon EKS 배포
3.1. Amazon EKS 클러스터 생성 (eksctl)
eksctl 도구로 Amazon EKS 클러스터를 다음과 같은 명령어로 생성합니다.
eksctl에 활용할 변수 확인
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PubSubnet1
echo $PubSubnet2
Bash
복사
# 변수 확인
eksctl 사용 연습(배포 없이 확인만)
[eksctl] EKS 클러스터 & 관리형 노드 그룹 생성
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--nodegroup-name=$CLUSTER_NAME-nodegroup \
--node-type=t3.medium \
--node-volume-size=30 \
--vpc-public-subnets "$PubSubnet1,$PubSubnet2" \
--version 1.26 \
--ssh-access \
--external-dns-access \
--dry-run | yh
Bash
복사
# EKS 클러스터 및 관리형 노드 그룹 생성 전 정보 확인 (dry-run 옵션)
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--nodegroup-name=$CLUSTER_NAME-nodegroup \
--node-type=t3.medium \
--node-volume-size=30 \
--vpc-public-subnets "$PubSubnet1,$PubSubnet2" \
--version 1.26 \
--ssh-access \
--external-dns-access \
--verbose 4
Bash
복사
# EKS 클러스터 및 관리형 노드 그룹 생성
Note: eksctl 도구로 EKS 클러스터를 배포하면 약 15~20분 정도 대기 시간이 흐른 뒤 EKS 클러스터 생성이 완료됩니다.
3.2. Amazon EKS 클러스터 정보 확인 및 설정 (eksctl)
eksctl 도구로 앞서 생성한 Amazon EKS 클러스터 정보를 다음과 같은 명령어로 확인합니다.
krew 플러그인 확인
kubectl krew list
Bash
복사
# krew로 설치한 플러그인 확인
kubeon
Bash
복사
# kube_ps1 활성화
kubectl ctx
Bash
복사
# ctx 플러그인 확인
kubectl ns
kubectl ns default
Bash
복사
# ns 플러그인 확인
kubectl get-all
Bash
복사
# 모든 네임스페이스의 모든 리소스 확인
EKS 클러스터 정보 확인
kubectl cluster-info
Bash
복사
# kubectl을 통한 클러스터 정보 확인
eksctl get cluster
Bash
복사
# eksctl을 통한 클러스터 정보 확인
aws eks describe-cluster --name $CLUSTER_NAME | jq
Bash
복사
# awscli를 통한 클러스터 정보 확인 (상세)
aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint
Bash
복사
# awscli를 통한 클러스터 정보 확인 (API 서버 주소만 추출)
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS
Bash
복사
# API 서버 주소 변수 저장 및 dig 조회
curl -k -s https://$APIDNS | jq
curl -k -s https://$APIDNS/version | jq
Bash
복사
# API 서버 접속
EKS 노드 그룹 정보 확인
eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup
Bash
복사
# eksctl을 통한 노드 그룹 정보 확인
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-nodegroup | jq
Bash
복사
# awscli를 통한 노드 그룹 정보 확인 (상세)
kubectl get node
kubectl get node -owide
kubectl get node -v=6
Bash
복사
# kubectl을 통한 노드 정보 확인
파드 정보 확인
kubectl get pod
Bash
복사
# 현재 네임스페이스에 파드 정보 확인
kubectl get pod -A
Bash
복사
# 모든 네임스페이스에 파드 정보 확인
kubectl get pod -n kube-system
kubectl get pod -n kube-system -owide
Bash
복사
# kube-system 네임스페이스에 파드 정보 확인
워커 노드의 프라이빗 IP 확인 및 변수 지정
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
Bash
복사
# EC 인스턴스의 프라이빗/퍼블릭 IP 확인
kubectl get node -o jsonpath={.items[0].status.addresses[0].address}
kubectl get node -o jsonpath={.items[1].status.addresses[0].address}
export N1=$(kubectl get node -o jsonpath={.items[0].status.addresses[0].address})
export N2=$(kubectl get node -o jsonpath={.items[1].status.addresses[0].address})
echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile
echo $N1
echo $N2
Bash
복사
# 워커 노드의 프라이빗 IP 주소를 변수에 입력 및 확인
kubectl get node -o jsonpath={.items[0].status.addresses[3].address}
kubectl get node -o jsonpath={.items[1].status.addresses[3].address}
export NN1=$(kubectl get node -o jsonpath={.items[0].status.addresses[3].address})
export NN2=$(kubectl get node -o jsonpath={.items[1].status.addresses[3].address})
echo "export NN1=$NN1" >> /etc/profile
echo "export NN2=$NN2" >> /etc/profile
echo $NN1
echo $NN2
Bash
복사
# 워커 노도의 노드 이름을 변수에 입력 및 확인
워커 노드 SSH 접속 및 명령어 입력
ssh ec2-user@$N1
exit
ssh ec2-user@$N2
exit
Bash
복사
# 워커 노드 SSH 접속 후 빠져 나오기
ssh ec2-user@$N1 hostname
ssh ec2-user@$N2 hostname
Bash
복사
# 워커 노드 SSH 접속하여 명령어만 반환
워커 노드의 프로세스 정보 확인
ssh ec2-user@$N1 sudo systemctl status kubelet
ssh ec2-user@$N2 sudo systemctl status kubelet
Bash
복사
# kubelet 상태 정보
ssh ec2-user@$N1 sudo pstree
ssh ec2-user@$N1 sudo ps afxuwww
ssh ec2-user@$N2 sudo pstree
ssh ec2-user@$N2 sudo ps afxuwww
Bash
복사
# 프로세스 확인
ssh ec2-user@$N1 sudo ps axf |grep /usr/bin/containerd
ssh ec2-user@$N2 sudo ps axf |grep /usr/bin/containerd
Bash
복사
# 컨테이너 런타임 확인
워커 노드의 네트워크 정보 확인
ssh ec2-user@$N1 sudo ip -c addr
ssh ec2-user@$N2 sudo ip -c addr
Bash
복사
# 인터페이스 IP 주소 확인
ssh ec2-user@$N1 sudo ip -c route
ssh ec2-user@$N2 sudo ip -c route
Bash
복사
# 라우팅 테이블 확인
ssh ec2-user@$N1 sudo iptables -t nat -S
ssh ec2-user@$N2 sudo iptables -t nat -S
Bash
복사
# NAT iptables 확인
워커 노드의 스토리지 정보 확인
ssh ec2-user@$N1 lsblk
ssh ec2-user@$N2 lsblk
Bash
복사
# 스토리지 정보
워커 노드의 통신 대상 확인
ssh ec2-user@$N1 sudo ss -tnp
ssh ec2-user@$N2 sudo ss -tnp
Bash
복사
# TCP 세션 확인 (kubelet과 kubeproxy의 Peer IP 확인)
dig +short $APIDNS
Bash
복사
# API 서버 주소 dig 조회
kubectl node-shell $NN1
exit
Bash
복사
# 새로운 터미널에서 kebectl으로 노드에 bash 셸 접근
EKS 보안 그룹 확인
aws ec2 describe-security-groups --query 'SecurityGroups[*].[GroupId, GroupName]' --output text | grep myeks
Bash
복사
# 보안 그룹 ID와 이름 확인
aws ec2 describe-security-groups --group-ids --output yaml sg-XXXXXXXXXXX | yh
Bash
복사
# 각각의 보안 그룹 정보 확인
파드 배포
watch -d 'kubectl get pod,svc'
Bash
복사
# 새로운 터미널에서 파드와 서비스 모니터링
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml
cat mario.yaml | yh
Bash
복사
# 슈퍼마리오 디플로이먼트 다운 및 확인
kubectl apply -f mario.yaml
Bash
복사
# 슈퍼마리오 디플로이먼트 배포
kubectl get deploy,svc,ep mario
Bash
복사
# 슈퍼마리오 디플로이먼트 배포 확인 (CLB 확인)
kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Mario URL = http://"$1 }'
Bash
복사
# 슈퍼마리오 CLB 주소 추출
생성한 파드 삭제
kubectl delete -f mario.yaml
Bash
복사
# 생성한 파드 삭제
관리형 노드 그룹에 노드 추가 및 삭제
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done
Bash
복사
# 새로운 터미널에서 EC2 인스턴스 생성 모니터링
eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup
Bash
복사
# EKS 노드 그룹 정보 확인
eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 3 --nodes-min 3 --nodes-max 6
Bash
복사
# EKS 노드 수 증가 (2개 -> 3개)
eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 2 --nodes-min 2 --nodes-max 4
Bash
복사
# EKS 노드 수 감소 (3개 -> 2개)
4. 실습 환경 삭제
eksctl 도구와 awscli 도구로 실습에 진행한 모든 자원을 삭제합니다.
Amazon EKS 클러스터 삭제
eksctl delete cluster --name $CLUSTER_NAME
Bash
복사
# eksctl 도구로 Amazon EKS 클러스터 삭제
Warning: Amazon EKS 클러스터(+노드 그룹) 삭제는 약 10분 정도 소요됩니다.
반드시 클러스터 삭제를 확인하고 다음 단계를 진행합니다.
기본 인프라 삭제
aws cloudformation delete-stack --stack-name $CLUSTER_NAME
Bash
복사
# awscli 도구로 기본 인프라 삭제
Warning: 기본 인프라 삭제는 약 5분 정도 소요됩니다.
정상적으로 자원 삭제 되었는지 꼭 확인을 합니다.
여기까지 1장 실습을 마칩니다.
수고하셨습니다 :)