Kubernetes on AWS
AWS에서 Kubernetes 클러스터를 구축 및 운영하는 방법은 다양하다. EC2 인스턴스로부터 k8s를 직접 설정하거나 Kops를 통해 구축을 자동화하되 사용자가 직접 운영하는 방식, 그리고 EKS를 사용하여 모든 관리 영역을 AWS에 위임하는 방식이다.
AWS EKS
EKS는 Elastic Kubernetes Service의 약자로 AWS가 2018년 6월부터 고가용성, 확장성, 보안을 강조하며 출시한 Kubernetes 서비스다. Control Plane(ex: master node, etcd) 영역을 AWS에서 전부 관리해주므로 사용자는 온전히 Application에만 집중할 수 있으며, k8s에 대한 이해도가 낮더라도 쉽게 사용가능한 장점이 있다. 물론 master node에 대한 접근이 불가능하기 때문에, 어떠한 설정 변경도 허용하지 않는 단점이 존재한다.
EKS Architecture
고가용성(High Availability) 및 확장성을 위해 일반적으로 3개의 Multi-AZ로 구성하며, 각 AZ마다 AWS가 관리하는 Master Node와 etcd가 존재한다. 그리고 Worker Node는 일반적으로 Auto Scaling Group을 통해 생성되며, 이 경우 Kubernetes의 Cluster Autoscaler 기능을 사용할 수 있다. ASG에 속하지 않은 EC2 Instance도 Worker Node로 사용 가능하다.
위에서 언급한대로 Master Node는 사용자의 접근이 불가능하며, Kubernetes Node 리스트(ex: kubectl get nodes)에도 조회되지 않는다.
Master Node에 직접 접근할 수는 없지만, Kubernetes Control Plane 영역, 특히 API 서버는 당연히 통신이 가능해야한다. AWS에서 제공하는 EKS 클러스터 URL을 통해 각 Worker Node(kubelet)와 Remote Client(ex: 사용자의 kubectl)의 접근이 허용된다.
요금 책정
EKS 클러스터마다 시간당 0.10 USD이 청구(한달 73.00 USD)되며 Free Tier는 제공하지 않는다. 이외에 Worker Node로 배정된 EC2 인스턴스, EBS 볼륨, 로드 밸런서는 별도의 요금이 추가된다.
EKS 시작하기
IAM User, Role 설정
EKS로 클러스터를 구축하기에 앞서, 가장 먼저 전용 사용자를 추가한다. root 계정을 사용할 수도 있지만, AWS는 보안을 위해 일반 작업은 반드시 non-root 계정으로 접근하도록 가이드하고 있다. 다음과 같이 EKS 전용 계정을 추가한다.
Permission 설정은 생략하고 IAM User를 생성한다. 그리고 다음과 같이 EKS 리소스에 모든 Action이 가능한 Custom Policy를 추가한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:*"
],
"Resource": "*"
}
]
}
<EKS-Admin-Policy>
이번엔 'eks-admin'에 EKS 사용을 위한 Permission 설정을 할 차례다. 해당 IAM User에 아래와 같이 5개의 Policy를 적용한다.
AWS 외부에서 Programmatic access가 가능하도록 Security Credential 탭에서 Access Key를 추가한다. Secret access key는 생성시에만 조회 가능하므로 .csv 파일을 반드시 다운로드하자. 보안을 위해 Access key는 그 누구와도 공유해선 안된다.
다음은 IAM Role을 아래와 같이 추가하여, EKS가 사용자 대신 AWS 서비스를 호출할 수 있도록 한다.
마지막으로 SSH Key Pair를 등록하여 사용자의 Local 환경에서 EC2 인스턴스에 접근이 가능하도록 설정한다. EC2 Dashboard 메뉴에서 진행할 수 있다.
Key 생성이 완료되었으면, 현재 브라우저를 통해 Private Key가 자동으로 다운로드된다.
EKS 관련 Tool 설치
여기까지 진행했다면 기본적인 AWS 사용자 및 권한 설정은 완료한 상태다. 다음은 Local PC의 Shell에서 AWS 서비스와 K8s를 사용할 수 있도록 다음 3개의 CLI 툴을 설치할 차례다.
- awscli: AWS 서비스를 관리하는 통합도구로 다양한 AWS 서비스를 Command Line에서 제어하고, 스크립트를 통해 자동화할 수 있다. 설치에 앞서 python, pip가 필요하다.
- eksctl: EKS 클러스터를 생성하고 관리할 수 있는 CLI, 오픈소스 프로젝트로 시작하였으나 현재는 EKS 공식 CLI로 선정되었다. 사용법이 비교적 간단하고 AWS에 특화되었기 때문에 PoC 또는 테스트 단계에서 활용하기 용이하다. 하지만 Idempotency(멱등성) 문제와 일부 기능(User Data, node label 등)을 지원하지 않아 GitOps로 사용하기 부적합하므로 Production 수준에선 Terraform을 선호하는 목소리가 많다. 이와 관련해선 링크를 참고하기 바란다.
- kubectl: 사용자로부터 K8s 명령어를 받아, API 서버에 연결
가장 먼저 아래 명령어로 awscli를 설치한다.
$ pip3 install --user awscli
설치가 완료되었다면 awscli가 정상적으로 설치되었는지 확인하기 위해 버전 정보를 출력해보자.
$ aws --version
다음은 awscli가 AWS에 접근할 수 있도록 '$HOME/.aws/credentials' 파일을 추가하고 아래와 같이 AWS 프로필을 작성한다.
[default]
aws_access_key_id=<IAM-USER-ACCESS-KEY>
aws_secret_access_key=<IAM-USER-SECRET-ACCESS-KEY>
region=<YOUR-SERVICE-REGION>
output=json
- aws_access_key_id: Access Key 생성시 다운로드한 .csv 파일에서 Access Key ID 값을 붙여넣기한다.
- aws_secret_access_key: Access Key 생성시 다운로드한 .csv 파일에서 Secret access key 값을 붙여넣기한다.
- region: EKS를 사용할 AWS Region의 ID(ex: ap-northeast-2, us-east-1). EKS를 통해 생성되는 모든 리소스는 해당 region에 속한다.
- output: json(고정값)
또는 아래 명령어를 사용하여, Interactive 방식으로 입력할 수 있다. 참고로 --profile 옵션을 지정하지 않으면 'default' 프로필로 생성된다.
$ aws configure
현재 AWS 프로필을 사용하여 인증이 가능한지 확인해보자.
$ aws sts get-caller-identity
eksctl은 아래 명령어를 순서대로 실행하여 설치한다.
$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$ sudo mv /tmp/eksctl /usr/local/bin
$ eksctl version
마지막으로 kubectl을 설치할 시간이다. 이번엔 Linux 패키지 관리도구(ex: apt)를 사용해보자.
$ sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubectl
이제 Local 환경에서 EKS 클러스터를 생성하고, 접근할 모든 준비를 마쳤다. 다음 시간은 EKS 클러스터를 실제로 만들어보는 과정에 대해 다룰 예정이다.
'Cloud' 카테고리의 다른 글
Amazon EKS Tutorial - Part.5 (0) | 2021.03.20 |
---|---|
Amazon EKS Tutorial - Part.4 (0) | 2021.03.17 |
Amazon EKS Tutorial - Part.3 (0) | 2021.03.16 |
Amazon EKS Tutorial - Part.2 (1) | 2021.03.15 |
하이퍼바이저(Hypervisor) (0) | 2021.02.06 |