AWS EKS를 활용한 쿠버네티스 클러스터 구축
이번 글에서는 AWS EKS를 활용하여 쿠버네티스 클러스터를 구축해 볼 것이다.
사실 필자는 스터디 팀원들과 상용 오픈을 목표로 자체 프로젝트를 진행중인데, 돈을 많이 쓰지 않으면서 최대한 효율적으로 PaaS 환경을 구축하기 위해, AWS에 Kops를 활용해서 쿠버네티스 클러스터 구축/활용해 본 경험이 있다(마스터노드를 한개만 사용해도 되기 때문에 가격이 더 저렴했다. 물론 프로젝트가 어느정도 안정기에 도달하여 트래픽이 늘게 되면 AWS EKS를 도입할 생각이었다). 하지만 회사에서 진행하는 클라우드 교육 과제의 일환으로 AWS EKS로 쿠버네티스 클러스터를 구축하게 되어 이렇게 글을 남긴다.
이 글은 보는 사람이 최대한 이해하기 쉽도록 eksctl이 아닌 AWS Management Console을 활용하여 실습을 진행할 것이다.
또한 EKS 클러스터는 프라이빗 서브넷에 구축하여 외부에서(내 로컬 제외) 접근 불가능하게 할 것이며(보안을 위해), 로드밸런서(잉그레스)만 퍼블릭 서브넷에 생성하여 로드밸런서를 통해서만 AWS EKS 클러스터 내 서비스 호출 가능하도록 구축할 것이다.
이 글의 진행순서는 다음과 같다
1. 실습 전 준비사항
2. Amazon EKS 클러스터 생성 및 kubeconfig 생성
3. 워커 노드 그룹 생성
1. 실습 전 준비사항
AWS EKS를 활용하여 쿠버네티스 클러스터를 구축하기 위해선 몇가지 준비사항이 있다.
1. 로컬환경(Windows10) 에 AWS CLI 설치
2. AWS CLI 자격증명 구성
3. 로컬 환경(Windows10) 에 kubectl 설치
4. Amazon EKS 클러스터 IAM 역할 생성
5. Amazon EKS 클러스터 VPC 및 서브넷 생성
하나씩 차근차근 진행해보도록 하자.
1.1. 로컬환경(Windows10) 에 AWS CLI 설치
로컬환경에 AWS CLI(Command Line Interface)를 설치해야 한다. 이 AWS CLI을 활용하여 자격증명(aws configure)을 진행해야 로컬환경에서 AWS 환경(쿠버네티스 클러스터)으로 접속이 가능하기 때문이다. 설치 방법은 해당 블로그를 참고하면 된다(https://twofootdog.tistory.com/32)
1.2 AWS CLI 자격증명 구성
AWS CLI 자격증명을 하는 방법은 두 가지 정도가 있다. IAM에서 신규 사용자를 추가하고 해당 계정에 로컬에서 하고싶은 작업에 대한 권한을 부여한 후 자격증명을 구성하는 방법이 있고, AWS 루트 사용자 계정으로 자격증명을 구성하는 방법이 있다. 필자는 AWS 루트 사용자 계정으로 진행해 보도록 하겠다.
우선 AWS에 로그인 한 후 우측 상단의 계정명을 클릭한 후 [내 보안 자격 증명]을 선택한다.
그 다음 [엑세스 키] -> [새 엑세스 키 만들기]를 선택하여 자격증명에 사용할 엑세스 키를 생성한 후 다운로드 한다.
다운로드 된 .csv 키 파일을 열어 AWSAccessKeyId와 AWSSecretKey를 확인한다. 그리고 터미널을 실행시킨 후 "aws configure" 명령어를 입력하여 자격증명 구성을 시작한다. 입력값은 AWSAccessKeyId, AWSSecretKey, region, output format을 입력한다.
$ aws configure
AWS Access Key ID [****************V5XQ]: AKIAIGRJLJ46XXXXXXX
AWS Secret Access Key [****************Pd8k]: w0Q0EF1uaP1Nj0/a5nXXXXXXXXXXXXXXXhuVF
Default region name [ap-northeast-2]: ap-northeast-2
Default output format [json]: json
1.3. 로컬환경(Windows10) 에 kubectl 설치
자격증명이 완료되었으니 이제 kubectl을 설치해보자. kubectl은 쿠버네티스 클러스터를 제어하기 위한 커맨드라인 도구이다. 로컬환경에서 쿠버네티스 클러스터를 제어할 것이기 때문에 kubectl 설치가 필요하다.
kubectl은 https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html 에서 쿠버네티스 버전에 맞게 다운로드 받으면 된다.
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/linux/amd64/kubectl
다운로드가 완료되었으면 터미널(git-bash)에서 kubectl 실행을 위한 환경변수(PATH)를 추가해준다. PATH는 $PATH 뒤에 kubectl이 설치된 경로를 입력한다.
$ vi ~/.bash_profile
~/.bash_profile 내용 입력 : export PATH="$PATH:/c/util/aws/"
환경변수 추가가 완료되었으면 bash_profile을 적용한다음 kubectl을 실행해보자.
$ source ~/.bash_profile # bash_profile 적용
$ kubectl version # kubectl 실행
1.4. Amazon EKS 클러스터 IAM 역할 생성
다음으로 IAM 역할을 생성해보자.
IAM 역할을 생성하는 이유는 조금 후에 Amazon EKS를 만들 때 IAM 역할이 필요하기 때문이다. 때문에 EKS 클러스터용 IAM 역할을 사전에 만들어놔야 한다.
[AWS Management Console]을 실행하고 [IAM] -> [역할] -> [역할 만들기]를 선택한 후 [사용 사례 선택]에서 [EKS] -> [EKS - Cluster]를 선택한 후 [다음: 권한]을 클릭한다.
[역할 이름]을 기입하고 IAM 역할을 만든다.
1.5. Amazon EKS 워커 노드 그룹 IAM 역할 생성
EKS 클러스터의 IAM 역할을 생성했다면 EKS 워커 노드 그룹의 역할도 생성하자.
워커 노드 그룹이란 간단하게 이야기하면 쿠버네티스 클러스터 리소스들이 올라갈 EC2 인스턴스 그룹이라고 보면 된다.
[AWS Management Console]을 실행하고 [IAM] -> [역할] -> [역할 만들기]를 선택한 후 [사용 사례 선택]에서 [EC2]를 선택한 후 [다음: 권한]을 클릭한다.
[권한]에서는 AmazonEKSWorkerNodePolicy, AmazonEKS_CNI_Policy, AmazonEC2ContainerRegistryReadOnly 를 선택한 후 IAM을 생성한다.
1.6. Amazon EKS 클러스터 VPC 및 서브넷 생성
다음으로 Amazon EKS가 사용할 VPC 및 서브넷을 생성해야 한다. 사실 수작업으로 만들어 줄 수도 있지만, 메뉴얼에 나와있는대로 AWS CloudFormation을 활용하여 만들어보도록 하자. 만약 수작업으로 진행하고 싶다면 다음 글을 참조하길 바란다(https://twofootdog.tistory.com/27)
자 그럼 AWS CloudFormation을 활용하여 VPC 및 서브넷을 만들어보자. EKS의 경우 2개 이상의 가용 영역에서 서브넷이 필요하다. 쿠버네티스의 Pod는 프라이빗 서브넷에서 실행되고, 이 Pod로 트래픽을 로드밸런싱하는 로드밸런서는 퍼블릿 서브넷에 위치시켜야 하기 때문에 프라이빗 및 퍼블릿 서비스넷이 있는 VPC를 사용하는 것이 좋다.
우선 [AWS Management Console]을 실행하고 [CloudFormation] -> [스택 생성]을 선택한다.
[스택 생성]에서는 [준비된 템플릿], [Amazon S3]를 선택하고 Amazon S3 URL에 다음과 같이 입력하고 [다음]을 누른다.
https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-06-10/amazon-eks-vpc-private-subnets.yaml
[스택 세부 정보 지정]에서는 [스택 이름]을 입력하고, [파라미터]에서는 VpcBlock, PublicSubnetBlock, PrivateSubnetBlock을 입력한다. AWS에서는 로드밸런서에서 사용할 IP 주소가 많도록 기본값을 유지하는 것을 권장한다고 한다.
[스택 옵션 구성]을 작성한다. [태그]에 태그를 넣었고(선택 사항), 권한은 입력하지 않았다.
작업을 완료하면 아래와 같이 vpc 및 서브넷이 생성되는 것을 확인할 수 있다.
2. Amazon EKS 클러스터 생성 및 kubeconfig 파일 생성
사전작업이 완료되었으니 이제 본격적으로 Amazon EKS를 만들어보자.
[Amazon Management Console]에서 [Elastic Kubernetes Service]를 선택한 후 [Amazon EKS] -> [클러스터] -> [클러스터 생성]을 선택한다.
[클러스터 구성]에서는 [이름]을 입력하고, [Kubernetes 버전]에서는 원하는 쿠버네티스 버전을 선택한다. [클러스터 서비스 역할]에서는 사전작업에서 만들었던 EKS용 IAM역할을 선택한다.
그 다음 [네트워킹 지정]에서는 VPC, 서브넷 정보, 보안그룹 등을 입력한다.
[VPC] : 사전작업 시 생성했던 VPC를 선택한다.
[서브넷] : 사전작업 시 생성했던 서브넷을 입력하는데, 이 글에서는 퍼블릭 서브넷 2개, 프라이빗 서브넷 2개를 생성했었으며, 프라이빗 서브넷을 쿠버네티스 작업자 노드용 서브넷으로 사용할 것이기 때문에 프라이빗 서브넷 2개를 선택한다.
[보안 그룹] : 사전작업 시 생성했던 Security Group을 선택한다.
[클러스터 엔드포인트 엑세스] : 클러스터의 엔드포인트인 Kubernetes API 서버 엔드포인트에 대한 엑세스 권한을 설정한다. 이 글에서는 동일 VPC의 퍼블릭 서브넷에서 로드밸런서를 생성한 후, 프라이빗 서브넷에 있는 쿠버네티스 클러스터에 접근할 것이지만 로컬에서도 kubectl을 이용하여 쿠버네티스 클러스터를 다뤄야 하므로 [퍼블릭 및 프라이빗]을 선택한다. 만약 [프라이빗]을 선택하게 되면 로컬에서 kubectl을 통해 쿠버네티스 클러스터에 접근할 수 없고, 동일 VPC내에 있는 EC2에서만 접근 가능하다.
[로깅 구성]에서는 쿠버네티스의 API서버, 컨트롤러 관리자, 스케쥴 등의 로그를 CloudWatch Log를 통해서 모니터링 할 것인지 선택할 수 있다. 이 글에선 테스트용으로 만드는 것이기 때문에 모든 것을 비활성화 처리했다. 만약 활성화 처리한다면 추가 비용이 발생한다.
작성이 완료되면 몇 분의 시간동안 Amazon EKS 클러스터 구성을 하게 된다.
그러면 이제 로컬환경에서 쿠버네티스 설정파일을 생성할 것이다. 쿠버네티스 설정파일을 생성하는 이유는, 로컬환경에서도 kubectl 명령어를 사용하여 쿠버네티스 클러스터에 접근하기 위함이다.
우선 git-bash를 실행한 후 아래와 같이 명령어를 수행한다.
$ aws eks --region [리전명] update-kubeconfig --name [EKS 이름]
예 : aws eks --region ap-northeast-2 update-kubeconfig --name cloud-l3-eks
그러면 윈도우 기준으로 ~/.kube 디렉토리에 config파일이 생성된다. 해당 config파일이 있으면 kubectl을 통해 쿠버네티스 클러스터에 접근할 수 있다.
kubectl로 아래와 같이 pod를 검색해보자. 조회가 되면 config파일이 정상 동작하는 것이다. 하지만 pending 상태이다. 왜냐하면 AWS EKS만 구성했고 EKS 클러스터에 속하는 워커 노드 그룹은 구성하지 않았기 때문이다.
$ kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7dd7f84d9-h2lnt 0/1 Pending 0 11m
kube-system coredns-7dd7f84d9-tn88w 0/1 Pending 0 11m
3. 워커 노드 그룹 생성
이제 워커 노드 그룹을 구성해보자.
[Amazon EKS] -> [클러스터] -> [컴퓨팅] -> [노드 그룹 추가]를 선택한다.
[그룹 구성]에서 노드 그룹에 대한 정보를 입력한다.
[이름] : 노드 그룹의 이름을 임의로 입력
[노드 IAM 역할] : 사전작업에서 만든 워커 노드 그룹 용 IAM을 선택한다.
[서브넷] : EKS 클러스터 생성 시 프라이빗 서브넷을 선택했으므로, 워커 노드 그룹에서도 프라이빗 서브넷을 선택한다.
[SSH 키 페어] : 로컬에 미리 다운받아 놓은 EC2 SSH키 키페어를 선택한다.
[원격 엑세스 권한 허용 대상] : 외부에서 워커 노드 그룹에 접근할 수 없게(퍼블릭 서브넷에 있는 로드밸런서(잉그레스)를 통해서만 접근 가능하도록), [선택한 보 그룹]을 선택한 후 EKS 클러스터와 동일한 보안그룹을 선택한다.
그 다음 [컴퓨팅 구성 설정]에서는 아래와 같이 설정한다. 쿠버네티스 클러스터에 필요한 리소스들도 워커노드그룹에 설치되기 때문에 인스턴스 유형은 medium 이상으로 설정하는 것이 성능에 문제가 없는 것 같다.
그 다음 [조정 구성 설정]에서는 워커 노드 그룹 크기(인스턴스 갯수)를 설정한다. 최소값 및 시작값은 2개 , 최대 크기는 3개 로 지정했다.
모든 설정을 마치고 워커 노드 그룹 생성이 완료되었으면 kubectl 명령어를 통해 정상적으로 쿠버네티스 클러스터에 접근 가능한지 확인해보자.
$ kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system aws-node-r52fr 1/1 Running 0 113s
kube-system aws-node-slfpb 1/1 Running 0 116s
kube-system coredns-7dd7f84d9-h2lnt 1/1 Running 0 39m
kube-system coredns-7dd7f84d9-tn88w 1/1 Running 0 39m
kube-system kube-proxy-llk5r 1/1 Running 0 113s
kube-system kube-proxy-v448s 1/1 Running 0 116s
다음 글에서는 CodePipeline을 활용하여 AWS EKS 위에 스프링부트 서비스를 배포해보도록 하겠다.
참고
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/getting-started-console.html
https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html
https://alicek106.tistory.com/24