1주차 - Amzaon EKS 설치 및 기본 사용

728x90

EKS란

  • Elastic Kubernetes Service는 AWS 자체 Kubernetes 서비스로 컨트롤 플레인 또는 노드를 설치, 운영 및 유지 관리할 필요 없이 Kubernetes를 사용할 수 있는 관리형 서비스
  • 여러 AWS 가용 영역에 걸쳐 Kubernetes 컨트롤 플레인을 실행하고 크기를 조정하여 높은 가용성을 보장
  • 오픈 소스 Kubernetes 소프트웨어의 최신 버전을 실행하므로 Kubernetes 커뮤니티에서 모든 기존 플러그 인과 도구를 사용할 수 있음
  • 지원 버전 : 보통 5~6개의 마이너 버전 지원(현재 1.25~1.29)
    • 평균 3개월마다 새 버전 제공, 처음 14개월 지원, 추가 12개월 연장 지원(비용 추가)

 

EKS 아키텍처 (컨트롤 플레인 / 데이터 플레인)

  • EKS 컨트롤 플레인 : AWS Managed VPC - 3개 AZ, API NLB, ETCD ELB
    • 여러 가용 영역에 컨트롤 플레인 컴포넌트 구성 →  사실 EKS는 AWS에서 제공하는 Kubernetes 서비스 상품으로편리하게 Kubernetes 사용 및 관리 할 수 있다고만 생각을 했는데, 여러 가용영역에 구성이 되어 Auto Scaling 및 장애 발생에 대하여 분산 구성되어 있다는 부분을 새롭게 알게 되었다.

  • EKS 데이터 플레인 : Customer VPC - EKS owned ENI, 관리형 노드 그룹(Managed node groups)
    • 컨트롤 플레인과 마찬가디로 여러 가용 영역에 데이터 플레인이 구성되어 있으며, 컨트롤 플레인과의 통신은 자체 ENI(EKS owend ENI)를 통하여 통신 → ENI 확인 시 소유주와 인스턴스 소유자가 다름

 

EKS Cluster Endpoint

  • API 서버 엔드포인트 엑세스 - Public
    • API 서버 → (EKS owned ENI) 워커노드 kubelet, 워커노드 → (퍼블릭 도메인) 제어부
    • 사용자 kubectl → (퍼블릭 도메인) API 서버

  • API 서버 엔드포인트 엑세스 - Public / Private(권장)
    • API 서버 → (EKS owned ENI) 워커노드 kubelet, 워커노드 → ( 프라이빗 도메인, EKS owned ENI ) 제어부
    • 사용자 kubectl → (퍼블릭 도메인) API 서버

 

  • API 서버 엔드포인트 엑세스 - Private
    • API 서버 → (EKS owned ENI) 워커노드 kubelet, 워커노드 
    • 사용자 kubectl → (프라이빗 도메인, EKS owned ENI ) API 서버

 

EKS 배포(실습)

 

기본 인프라 배포

  • AWS CloudFormation을 통해 작업용 ec2 및 VPC, PublicSubnet1, 2, Private Subnet1, 2 생성
  • IAM User 자격증명 설정 → aws cli를 사용하여 생성된 VPC 정보 및 노드그룹이 위치할 Subnet 정보 확인

(yjsong@myeks:default) [root@myeks-host ~]# echo $AWS_DEFAULT_REGION
ap-northeast-2
(yjsong@myeks:default) [root@myeks-host ~]# echo $CLUSTER_NAME
myeks
(yjsong@myeks:default) [root@myeks-host ~]# echo $VPCID
vpc-03ef2eb1a4858a86f
(yjsong@myeks:default) [root@myeks-host ~]# echo $PubSubnet1,$PubSubnet2
subnet-0e5972aa9b085e26d,subnet-0efa5d31588f26ef6

 

EKS 배포 

  • EKS 배포는 AWS Console, Terraform, eksctl등 다양하게 배포할 수 있음
  • 스터디에서는 빠르고 사용하기 쉬운 eksctl를 통해 EKS 배포 진행
    • eksctl은 EKS 클러스터 구축 및 관리를 하기 위한 오픈소스 명령줄 도구 → eksctl를 통해 eks 클러스터 배포 시 내부적으로는 CloudFormation을 사용하여 배포

eksctl를 통해 EKS 배포 시 Cloud Formation 스택이 생성된 것을 확인

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.28 --ssh-access --external-dns-access --verbose 4

 

myeks이름의 EKS 배포

 

API 서버 엔드폰인트 엑세스가 Public으로 설정

 

EKS 배포 시 Auto Scaling이 자동으로 생성 및 설정되 있는것을 확인
EC2 인스턴스 목록에서 EKS 노드 그룹이 생성된 것을 확인

 

■ kubectl 명령어를 통해 Node 정보 확인

(yjsong@myeks:default) [root@myeks-host ~]# kubectl get nodes -o wide -v=6
I0310 04:21:16.521582   15115 loader.go:395] Config loaded from file:  /root/.kube/config
I0310 04:21:17.377346   15115 round_trippers.go:553] GET https://D70041ED8E25F076BB6586F09D0C67F1.gr7.ap-northeast-2.eks.amazonaws.com/api/v1/nodes?limit=500 200 OK in 840 milliseconds
NAME                                               STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP     OS-IMAGE         KERNEL-VERSION                  CONTAINER-RUNTIME
ip-192-168-1-244.ap-northeast-2.compute.internal   Ready    <none>   10h   v1.28.5-eks-5e0fdde   192.168.1.244   52.79.249.154   Amazon Linux 2   5.10.210-201.852.amzn2.x86_64   containerd://1.7.11
ip-192-168-2-44.ap-northeast-2.compute.internal    Ready    <none>   10h   v1.28.5-eks-5e0fdde   192.168.2.44    3.34.4.108      Amazon Linux 2   5.10.210-201.852.amzn2.x86_64   containerd://1.7.11

 

dig 명령어를 통하여 API주소 확인 시 Public IP를 확인 할 수 있음

(yjsong@myeks:default) [root@myeks-host ~]# dig +short $APIDNS
3.37.161.229
13.209.135.210

 

■ eksctl을 통하여 노드 추가 및 삭제 (Autoscaling)

(yjsong@myeks:default) [root@myeks-host ~]# eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 3 --nodes-min 3 --nodes-max 6
2024-03-10 04:34:59 [ℹ]  scaling nodegroup "myeks-nodegroup" in cluster myeks
2024-03-10 04:34:59 [ℹ]  initiated scaling of nodegroup
2024-03-10 04:34:59 [ℹ]  to see the status of the scaling run `eksctl get nodegroup --cluster myeks --region ap-northeast-2 --name myeks-nodegroup`

(yjsong@myeks:default) [root@myeks-host ~]# kubectl get nodes -o wide
NAME                                               STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP     OS-IMAGE         KERNEL-VERSION                  CONTAINER-RUNTIME
ip-192-168-1-209.ap-northeast-2.compute.internal   Ready    <none>   13s   v1.28.5-eks-5e0fdde   192.168.1.209   43.201.35.142   Amazon Linux 2   5.10.210-201.852.amzn2.x86_64   containerd://1.7.11
ip-192-168-1-244.ap-northeast-2.compute.internal   Ready    <none>   10h   v1.28.5-eks-5e0fdde   192.168.1.244   52.79.249.154   Amazon Linux 2   5.10.210-201.852.amzn2.x86_64   containerd://1.7.11
ip-192-168-2-44.ap-northeast-2.compute.internal    Ready    <none>   10h   v1.28.5-eks-5e0fdde   192.168.2.44    3.34.4.108      Amazon Linux 2   5.10.210-201.852.amzn2.x86_64   containerd://1.7.11

 

EKS Cluster Endpoint를 Public에서 Public/Private로 변경

aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME --resources-vpc-config endpointPublicAccess=true,publicAccessCidrs="$(curl -s ipinfo.io/ip)/32",endpointPrivateAccess=true

728x90

'AEWS Study' 카테고리의 다른 글

5주차 - EKS Autoscaling - (Node Autoscaling)  (0) 2024.04.05
5주차 - EKS Autoscaling - (Pod Autoscaling)  (0) 2024.04.05
4주차 - EKS Observability  (0) 2024.03.31
3주차 - EKS Storage & Nodegroup  (0) 2024.03.24
2주차 - EKS Networking  (0) 2024.03.16