개발놀이터

AWS EKS Cluster 구축 본문

배포/kubernetes

AWS EKS Cluster 구축

마늘냄새폴폴 2024. 9. 25. 20:09

저는 정말 어리석은 선택을 하고 2주라는 시간을 날려버렸습니다. 바로 쿠버네티스를 온프레미스로 구현하는 것이었는데요. 초심자에겐 정말 지옥같은 경험이었습니다. 

 

근데 그 클러스터를 EC2인스턴스에서 구축하려고 했다는 것이 정말 어리석었죠. EC2 인스턴스는 비용절감을 위해 껐다 켰다 하고 있었는데 어느날 EC2를 켜보니 Calico가 안되더군요. 그걸로 하루를 날려먹고 쿠버네티스 클러스터를 재구축하면서 마무리지었습니다. 

 

그리고 쿠버네티스 서비스의 LoadBalancer 타입을 시험해보고싶어서 Metallb를 구축하려다가 이것도 안되서 포기했습니다... 

 

결국 EC2인스턴스에서 온프레미스처럼 쿠버네티스를 구축하려 했던 저의 미련한 실수였습니다. 

 

온프레미스로 쿠버네티스를 구축하면 뭔가 한단계 성장할 것 같았거든요. 마치 저에게 있어서 바닐라JS로 리액트를 만드는 것과 같은 난이도였습니다. 

 

모든 것을 포기하고 EKS로 노선을 틀었습니다. 이번 포스팅에선 EKS 클러스터 구축과 간단하게 EKS의 특징을 정리해보도록 하겠습니다. 

 

EKS란?

EKS는 쉽게 얘기해서 AWS에서 쿠버네티스를 조금 더 쉽게 사용할 수 있게끔 도와주는 완전 관리형 클라우드 서비스입니다. 

 

보통 쿠버네티스 클러스터를 구축하면 kube-system 네임스페이스를 가진 파드들 (kube-apiserver, kube-proxy 등등) 을 관리하는 Control Plane이 있기 마련입니다. 

 

하지만 EKS는 EKS Cluster 그 자체가 Control Plane으로서 API 서버도 존재하고 클러스터를 전반적으로 관리해줍니다. 

 

이후 EKS에 대해서 자세히 간단하게만 정리하자면

 

  • 마스터 노드 (Control Plane) 관리할 필요 없음
  • 노드간 네트워크 신경쓰지 않아도 됨
  • 파드의 외부 노출을 위한 External IP 관리 할 필요 없음
  • 노드에 자원 부족하면 ASG를 이용해서 자동으로 노드 늘어남
  • IAM으로 EKS 클러스터에 접근 권한 세세하게 관리 가능
  • CloudWatch로 메트릭 서버 관리할 필요 없음
  • 이외에도 각종 AWS 서비스들과 통합 가능 (SNS, SQS, DynamoDB, S3, EBS, EFS)

클라우드 서비스들이 다 그렇지만 클라우드로 모든것을 관리하기 시작하면 정말 믿도끝도없이 사용할 수 있는게 클라우드인 것 같습니다. 

 

그만큼 EKS와 다른 AWS서비스들간의 통합은 정말 무서운 것 같습니다. 

 

 

EKS 클러스터 구축

우선 EKS 클러스터를 만들기 위한 IAM을 만들어줘야합니다. 

 

 

신뢰할 수 있는 유형을 AWS 서비스로, 그리고 서비스에 EKS를, 사용 사례에는 EKS -Cluster를 선택합니다. 

 

다음다음 하다보면 결국 AmazonEKSClusterPolicy 정책을 선택하게 되고 이를 생성하면 됩니다. 

 

이제 EKS를 선택해서 클러스터 생성을 누르고 진행하면 됩니다. 

 

 

이름에 원하는 이름을, 클러스터 서비스 역할에 우리가 방금 만든 IAM Role을 넣고 쿠버네티스 버전을 설정합니다. 

 

제가 언급하지 않는 것들은 디폴트 값으로 설정해도 전혀 상관 없습니다!

 

 

네트워크에 VPC를 선택하고 그 VPC안에 있는 서브넷을 선택해주면 됩니다. EKS를 위해서라면 최소 2개의 서브넷이 있어야합니다. 그리고 쿠버네티스 클러스터에 접근을 위한 보안 그룹을 설정해줘야합니다. 

 

저는 22번, 80번, 443번 포트를 열어줬습니다. 

 

 

지표에 대한 설정은 추후에 CloudWatch와 연동할 수 있기 때문에 일단은 선택하지 않았고 Control Plane 로깅은 모두 선택해줍니다. 

 

 

추가 기능을 선택할 때는 디폴트로 위의 사진처럼 네개가 선택되어있습니다. EKS Pod Identity는 파드에 접근하는 권한을 IAM으로 관리할 수 있도록 해주는 것인데 저는 일단 로컬PC인 맥북에서 클러스터에 접근할 거고 그 클러스터에 대한 접근을 IAM으로 관리할 것이지 파드에 관해서는 IAM이 필요없어서 선택하지 않았습니다. 

 

 

추가기능에 대한 버전을 선택할 수 있는데 저는 일단 다 디폴트로 설정했습니다. 

 

다음은 검토단계이고 모든 것을 확인한 뒤 생성을 누르고 5분정도 기다리면 생성이 됩니다.

 

 

짠! 이렇게 설정이 됐습니다. 이제 맥북에서 붙어보겠습니다. 

 

윈도우에서 AWS CLI를 설치하는 방법은 다루지 않도록 하겠습니다. 

 

터미널을 열고 homebrew를 이용해서 aws-cli를 설치합니다. 

 

brew install aws-cli

 

설치가 완료되면 버전을 확인하여 정상적으로 설치됐는지 확인합니다. 

 

aws --version

 

그리고 이제 IAM으로 붙어볼건데요. 이제 이 클러스터에 접근해서 AWS의 서비스들을 이것저것 조작하기 위해서 IAM 사용자를 만들어줄겁니다. 

 

IAM 사용자를 만들어보겠습니다. 

 

먼저 사용자 이름을 입력하고 다음을 누릅니다. 

 

 

직접 정책 연결을 선택하고 권한 정책에서 검색을 통해 하나씩 체크박스를 선택해주면 되는데요. 

 

  • AmazonEKS_CNI_Policy
  • AmazonEKSServicePolicy
  • AmazonEKSWorkerNodePolicy
  • AmazonEKSVPCResourceController
  • AWSElasticLoadBalancingFullAccess
  • AmazonEC2ContainerRegistryFullAccess, AmazonEC2ContainerRegistryReadOnly (ReadOnly만 해도 되는데 저는 로컬에서 ECR로 직접 이미지를 전송할거라 FullAccess로 해줬습니다.)

이렇게 일곱가지를 추가해줍니다. 

 

그리고 이렇게 만든 IAM 사용자를 csv로 관리해주시면 좋습니다! csv 다운로드를 눌러서 관리하도록 하겠습니다. 

 

그리고 다시 맥북으로 와서 AWS IAM 사용자를 내 PC에서 등록해보겠습니다. 

 

aws configure

 

여기서 Access Key와 Secret Key를 입력하라고 하는데 csv에 있는 정보를 그대로 적으시면 됩니다. 

 

region name에는 ap-northeast-2를, format은 json으로 설정해줍니다. 

 

거의 다왔습니다. 이제 EKS클러스터에서 IAM 사용자를 등록해보겠습니다. 

 

 

클러스터 내부에서 "엑세스" 탭에 "엑세스 항목 생성"을 선택합니다. 

 

 

아까 우리가 만든 IAM 사용자를 선택해줍니다. 나머지는 디폴트로!

 

 

저는 우선 제가 어드민이 되어야하기 때문에 모든 권한이 들어있는 정책을 선택했습니다. 이거 말고도 읽기 권한만 부여하는 ViewPolicy라던가 다양한 정책들이 있습니다. 

 

그리고 생성을 누르면 끝!

 

진짜 마지막! 워커 노드를 생성해보겠습니다. 

 

 

"컴퓨팅"탭에서 "노드 그룹 추가" 버튼을 클릭합니다. 저는 이미 만들어뒀습니다. 원래 이곳은 비어있는 공간입니다. 

 

노드 = EC2이기 때문에 EC2에게도 IAM 역할을 부여해줘야합니다. 

 

 

아까 EKS 역할을 만들었던것처럼 IAM > 역할 > 역할 생성을 누르고 EKS와 마찬가지로 신뢰할 수 있는 엔티티를 AWS 서비스로, 서비스, 사용 사례는 EC2를 선택해줍니다. 

 

그리고 AmazonEC2FullAccess를 정책으로 선택하면 역할과 정책이 연결되는 것입니다. 이렇게 IAM 역할을 만들고 나서 다시 노드 그룹으로 넘어가겠습니다. 

 

 

이름을 입력하고 노드 IAM역할에 방금 만든 역할을 선택하고 모두 디폴트로 설정합니다. 

 

이 화면에서 Kubernetes 레이블이라는 부분이 있는데 이 노드가 만들어질 때 어떤 라벨을 달고 있을지 결정하는 것입니다. 뒤에서 더 나오겠지만 노드그룹에는 몇개의 노드를 유지할 것인지 정할 수 있는데 이 노드마다 전부 라벨을 붙인 상태에서 노드가 추가되는 것입니다. 

 

즉, 우리는 노드의 자원이 부족하면 노드를 늘려서 파드가 배치되게 해야하는데 보통 파드에는 node selector가 존재합니다. 이 파드가 어떤 노드에 배치되어야 하는지 정하는 속성이죠. 

 

하지만 원래같으면 노드가 생성되고 라벨을 수작업으로 붙여줘야합니다. 때문에 즉각적인 대응이 어렵고 유연성이 떨어지죠. 항상 개발자가 컴퓨터 앞에 그것도 노드의 자원을 체크하면서 노드가 생성되는 것을 모니터링할 수 없으니까요. 

 

때문에, 이 라벨을 달아주는 것이 꽤나 도움이 됩니다. 

 

 

이어서 인스턴스 유형을 설정하고 디스크 크기를 설정합니다. 저는 가격이 저렴한 t3a로 설정했습니다. AMI는 아마존 리눅스로 설정했구요. 

 

 

아래로 내리면 노드를 몇개씩 관리할 것인지 설정할 수 있습니다. 저는 두개의 노드가 필요하기 때문에 두개로 설정하겠습니다. 

 

 

뒤이어 네트워크 구성을 선택해야하는데 맨처음 EKS 클러스터를 만들 때 VPC를 선택했기 때문에 어떤 서브넷에만 노드를 생성할 것인지 정하면 됩니다. 

 

저는 디폴트 서브넷에 모두 들어갈 수 있게 설정했습니다. 

 

이제 생성을 누르면 짜잔! 

 

 

맨처음 사진을 그대로 사용했습니다! 이 화면이 뜨게 되는 것이죠. 그리고 EC2로 가보면?

 

 

이렇게 인스턴스가 생성된 것을 볼 수 있습니다. 

 

이제 진짜진짜 마지막으로 우리의 개인 PC에 연결한 IAM사용자를 eks 사용자로 인식해야합니다. 

 

다음과 같은 명령어를 입력합니다. 

 

aws eks update-kubeconfig --name {EKS 클러스터 이름}

 

이렇게 하면 kubeconfig가 자동으로 설정됩니다. 

 

그리고 kubectl 명령어를 날려보면?

 

 

와우 노드가 연결됐습니다. 

 

 

마치며

이렇게 EKS 클러스터를 만들어봤습니다. IAM이랑 연결하는 것 때문에 꽤 많은 시간을 잡아먹었지만 일단 해결됐습니다. 저는 IAM 사용자에게 어드민 권한을 주었지만 다른 IAM사용자를 만들고 이 사용자는 View권한만 준다던가 하는 방식으로 활용할 수도 있을 것 같네요. 

 

EKS가 편리한 것이 로컬에서 쿠버네티스 클러스터에 접근할 수 있으니 마치 minikube로 실습하듯이 쿠버네티스를 공부해볼 수 있습니다. minikube에선 불가능했던 External IP를 부여하는 것이나 다양한 것들을 직접 실환경처럼 실습해볼 수 있겠네요.

 

앞으로 다양한 EKS의 포스팅들이 업로드될 것이니 많은 기대바랍니다. 

 

정말 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요!