본 페이지는 AWS EKS Workshop 실습 스터디의 일환으로 매주 실습 결과와 생각을 기록하는 장으로써 작성하였습니다.
💡과정 수행 中, 이해되지 않는 내용은 페이지 마지막에 학습 후 의문점으로 작성하겠습니다.
웹 페이지 확대가 아닌 이미지 자체를 확대할 수 있는 방법을 알고 계신다면 공유 부탁드립니다.🥲
Amazon Elastic Kubernetes Service
워크샵 설명을 읽어보면서 왜인지 모르게 ‘네가 필요한 건 여기 다 있으니까 너는 애플리케이션만 들고오면 돼!’ 같은 느낌을 받았다.
Elastic Container Service
심플하다. Kubernetes Based EKS보다 덜 복잡한 대신 비어있는 부분은 전부 AWS 서비스가 채워주는 느낌이 든다.
상기 What does mean 내용에서 언급한 ‘네가 필요한 건 여기 다 있으니까 너는 애플리케이션만 들고오면 돼!’에서 하기와 같이 첨언한 느낌이다.
비교적 간단한(비교적이라는 단어를 추가했음에 유의하자) MSA 서비스가 필요할 때 유용한 서비스라는 생각이 든다.
Elastic Kubernetes Service
유연하다. Kubernetes 기반 서비스라 그런지 여러가지 오픈소스, 써드파티 라이브러리, 개발자 도구를 조합할 수 있다.
예를 들자면 CNCF에서 제공하는 오픈소스 프로젝트나 기타 써드파티 라이브러리를 조합하여 본인만의 Custom EKS를 구축할 수 있다.
💡사용성에 중점을 둔 나의 설명으로는 ECS vs EKS 대결 구도보다는 상황 또는 규모에 따라 적절한 서비스를 택하면 되지 않을까라는 결론을 내리고 싶다.
1.24.2
Major.Minor.Patch
💡etcd : 클러스터의 구성 및 상태 정보를 저장하는 분산형 Key-Value 저장소
💡EKS owned Elastic Network Interface
컨트롤 플레인과 워커노드 사이 연결 통로 역할을 하는 ENI
MicroVM
VM을 가동하는데 최소한의 기능과 장치를 구현한 경량화 가상머신
가상머신의 장점인 보안성과 컨테이너의 빠른 속도를 취합한 기술이며 보통 MicroVM을 먼저 실행시키고 해당 VM 내부에 컨테이너를 생성하는 구조로 사용한다.
$sudo su -
# 자격 구성 등록
# AdministratorAccess 정책을 부여한 IAM User의 자격 증명을 입력한다.
$aws configure
AWS Access Key ID [None]: <생성한 액세스 키 아이디>
AWS Secret Access Key [None]: <생성한 시크릿 액세스 키>
Default region name [None]: ap-northeast-2
Default output format [None]: json
# VPC ID 환경변수 등록
$export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
$echo "export VPCID=$VPCID" >> /etc/profile
$echo $VPCID
vpc-01...
# Subnet 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)
$echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
$echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
$echo $PubSubnet1
subnet-096...
$echo $PubSubnet2
subnet-058...
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.24 --ssh-access --external-dns-access --dry-run | yh
...
vpc:
autoAllocateIPv6: false
cidr: 192.168.0.0/16
clusterEndpoints:
privateAccess: false
publicAccess: true
id: vpc-01b6...
manageSharedNodeSecurityGroupRules: true
nat:
gateway: Disable
subnets:
public:
ap-northeast-2a:
az: ap-northeast-2a
cidr: 192.168.1.0/24
id: subnet-096...
ap-northeast-2c:
az: ap-northeast-2c
cidr: 192.168.2.0/24
id: subnet-058...
# Deploy EKS Cluster & Managed node grops
# ssh-access : 노드로 ssh 접속 허용
# external-dns-access : ExternalDNS 허용
# verbose : 로그 레벨 설정(0 ~ 5)
$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.24 --ssh-access --external-dns-access --verbose 4
...
2023-04-25 11:06:06 [▶] setting current-context to eljoe@myeks.ap-northeast-2.eksctl.io
2023-04-25 11:06:06 [✔] saved kubeconfig as "/root/.kube/config"
eksctl create cluster
명령어를 입력하면 CloudFormation을 통해 스택 배포가 진행되므로 해당 콘솔에서 진행 상황을 확인할 수 있다.$kubectl krew list
PLUGIN VERSION
ctx v0.9.4
get-all v1.3.8
krew v0.4.3
ns v0.9.4
$kubectl ctx
eljoe@myeks.ap-northeast-2.eksctl.io
$kubectl ns
default
kube-node-lease
kube-public
kube-system
# 네임스페이스 활성화
(eljoe@myeks:N/A) [root@myeks-host ~]# kubectl ns default
Context "eljoe@myeks.ap-northeast-2.eksctl.io" modified.
Active namespace is "default".
# default로 변경된 것을 확인한다.
(eljoe@myeks:default) [root@myeks-host ~]#
# 클러스터 정보 확인
$kubectl cluster-info
Kubernetes control plane is running at https://24F9A0BCA38046CD70B1F02A211771D8.yl4.ap-northeast-2.eks.amazonaws.com
# EKS 클러스터 정보 확인
$eksctl get cluster
# API 서버 퍼블릭 엔드포인트 확인
$aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint
https://24F9A0BCA38046CD70B1F02A211771D8.yl4.ap-northeast-2.eks.amazonaws.com
ssh-access
옵션을 통해 ssh 접속을 허용하였으므로 접속을 위한 설정을 진행한다.# 노드 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
myeks-myeks-nodegroup-Node | 192.168.2.193 | 3.34.134.155 | running
myeks-myeks-nodegroup-Node | 192.168.1.80 | 3.36.94.216 | running
# 노드 Private IP 환경변수 등록
$N1=192.168.1.80
$N2=192.168.2.193
# 노드 보안그룹 환경변수 등록
$NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query "SecurityGroups[*].[GroupId]" --output text)
$echo $NGSGID
sg-09759...
# 노드 보안그룹에 bastion에서 접속 가능하게 인바운드 규칙 추가
$aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32
# bastion에서 ping 테스트
$ping -c 2 $N1
$ping -c 2 $N2
# 워커 노드 SSH 접속
$ssh -i ~/.ssh/id_rsa ec2-user@$N1
$ssh -i ~/.ssh/id_rsa ec2-user@$N2
$ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp
ESTAB 0 0 192.168.1.80:60786 3.34.155.17:443 users:(("kube-proxy",pid=3088,fd=11))
ESTAB 0 0 192.168.1.80:59072 43.200.114.234:443 users:(("kubelet",pid=2841,fd=40))
# 노드 내 kubeproxy와 kubelet이 클러스터의 API 서버 퍼블릭 엔드포인트 IP와 통신하는 것을 확인할 수 있다.
$nslookup 24F9A0BCA38046CD70B1F02A211771D8.yl4.ap-northeast-2.eks.amazonaws.com
Server: 192.168.0.2
Address: 192.168.0.2#53
Non-authoritative answer:
Name: 24F9A0BCA38046CD70B1F02A211771D8.yl4.ap-northeast-2.eks.amazonaws.com
Address: 3.34.155.17
Name: 24F9A0BCA38046CD70B1F02A211771D8.yl4.ap-northeast-2.eks.amazonaws.com
Address: 43.200.114.234
# Bastion 터미널을 하나 더 열어서 아래와 같이 데몬셋 파드 하나에 bash를 실행한다
$kubectl exec daemonsets/aws-node -it -n kube-system -c aws-node -- bash
bash-4.2#
# 마지막 줄에 kubelet이 통신하는 IP를 ENI 콘솔에서 검색해보면 소유자와 요청자 ID가 다른 것을 확인할 수 있다.
# 해당 ENI가 EKS 컨트롤 플레인과 데이터 플레인 사이 연결 통로 역할을 하는 EKS owned ENI이다.
$ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp
ESTAB 0 0 [::ffff:192.168.2.193]:10250 [::ffff:192.168.2.134]:41606 users:(("kubelet",pid=2842,fd=7))