Overview
AWS EKS 서비스를 활용하여 kubernetes 클러스터를 구축하는 방법을 스터디한다.
스터디에 앞서 준비사항은 아래와 같다.
- 로컬 PC에 aws cli 설치
- 로컬 PC에 kubectl 설치
- 로컬 PC에 eksctl 설치
- EKS에 대한 권한을 가진 AWS IAM 계정
AWS EKS에서는 아래와 같은 방법으로 kubernetes 서비스를 제공한다.
- 마스터 노드는 AWS가 직접 관리해주고 워커 노드를 프로비저닝하여 사용자가 직접 관리할 수 있도록 워커 노드 EC2를 생성 해주는 방법
- 마스터 노드와 워커 노드 자체를 AWS에서 모두 관리해주고 사용자는 Pod만 띄워 사용할 수 있도록 해주는 방법 (Fargate)
첫번째 방법의 경우, 워커 노드에 Pod를 띄워 서비스를 배포 및 관리할 때 EC2 인스턴스의 한정된 리소스 안에서만 가능하다는 제약 사항이 있지만 기타 다른 서버와 동일하게 SSH 접속을 통해 내 마음대로 워커 노드를 설정하거나 내부 로그 및 다양한 정보를 쉽게 조회할 수 있다.
두번째 방법의 경우, EC2 인스턴스의 한정된 리소스에서 해방되어 Pod를 자유롭게 배포 및 관리할 수 있는 장점이 있지만, 로깅의 자유도나(Cloudwatch를 통해서만 가능) 실제 Pod가 돌아가고 있는 서버의 다양한 정보를 확인할 수 없다는 단점이 있다.
이 문서에서는 첫번째 방법에 대해서 설명한다.
AWS EKS는 워커 노드와 노드 그룹이라는 것으로 이루어져 있다.
워커 노드는 실질적인 Pod가 띄워질 인스턴스이고 이 인스턴스들을 그룹으로 묶는 개념이 노드 그룹이다.
AWS EKS 클러스터 생성
AWS EKS 클러스터를 생성하기 위해 아래와 같은 yaml 파일을 작성한다.
create-cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster # 클러스터명
region: ap-northeast-2 # 클러스터를 생성할 리젼
vpc:
cidr: "192.168.0.0/16" # 클러스터의 CIDR
nodeGroups:
- name: eks-cluster-ng # 클러스터의 노드 그룹명
instanceType: t3a.large # 클러스터 워커 노드의 인스턴스 타입
desiredCapacity: 1 # 클러스터 워커 노드의 갯수
volumeSize: 10 # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
iam:
withAddonPolicies:
ImageBuilder: true # AWS ECR에 대한 권한 추가
albIngress: true # alb ingress에 대한 권한 추가
ssh:
allow: true # 워커 노드에 SSH 접속 허용
publicKeyName: cluster-ssh-key.pem # 워커 노드에 SSH 접속을 위해 사용할 pem키 명(aws key pairs에 등록되어 있어야함)
클러스터 생성을 위한 yaml 파일 작성법에 대해서 좀 더 자세한 내용은 아래 링크를 참조한다.
https://eksctl.io/usage/creating-and-managing-clusters/
위의 create-cluster.yaml 파일과 같이 AWS EKS 클러스터 생성을 위한 yaml 파일을 작성했다면 eksctl을 사용하여 아래 명령어를 통해 프로비저닝한다.
eksctl apply -f create-cluster.yaml
`eksctl apply -f` 명령어를 통해 클러스터를 생성 하면 AWS CloudFormation에 해당 EKS 프로비저닝에 대한 스택이 생성되고, 순차적으로 AWS EKS에 대한 인프라가 구축된다.
모두 다 구축이 완료되면 eksctl 명령을 실행시킨 로컬 PC의 kubectl에 자동적으로 AWS EKS 클러스터와 연결된다.(내부적으로 .kube/config 에 context 내용이 업데이트 되고 이 context 와 kubectl이 연결되는 것이다.)
ALB Ingress Controller 생성
ALB Ingress Controller는 EKS 클러스터 내부에 생성되는 Ingress 리소스를 참조하여 외부 통신에 대한 인프라를 프로비저닝 하는 역할을 맡고 있다.
ALB Ingress Controller라는 이름 처럼 Application Load Balancer를 생성하여 외부 통신을 가능하도록 해준다.
ALB Ingress Controller는 클러스터 내부에 Pod 형태로 생성되며 ALB Ingress Controller를 생성하는 방법은 아래와 같다.
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html
문서를 따라 하나씩 처리해도 되지만 쉽게 스크립트를 구성하여 한큐에 생성되도록 하자.
#/bin/bash
echo '>>> CREATE ALBIngressControllerIAMPolicy '
aws iam create-policy \
--policy-name ALBIngressControllerIAMPolicy \
--policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/iam-policy.json
echo ''
echo '>>> Connecting ALBIngressControllerIAMPolicy To WorkerNode Role'
NG_ROLE=`kubectl -n kube-system describe configmap aws-auth | grep rolearn`
ACCOUNT=${NG_ROLE:24:12}
WN_ROLE=${NG_ROLE:42}
echo "ACCOUNT : $ACCOUNT"
echo "WORKER NODE ROLE : $WN_ROLE"
echo "NODE GROUP ROLE : $NG_ROLE"
aws iam attach-role-policy \
--policy-arn arn:aws:iam::${ACCOUNT}:policy/ALBIngressControllerIAMPolicy \
--role-name ${WN_ROLE}
echo ''
echo '>>> Create ClusterRole for ALB Ingress Controller'
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/rbac-role.yaml
echo ''
echo '>>> Create ALB Ingress Controller'
CLUSTER_NAME='eks-cluster' # 클러스터명
AWS_REGION='ap-northeast-2' # 클러스터 리젼
VPC_ID=`eksctl get cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} --output json | jq -r '.[0].ResourcesVpcConfig.VpcId'`
echo "CLUSTER NAME : $CLUSTER_NAME"
echo "VPC ID : $VPC_ID"
echo "AWS REGION : $AWS_REGION"
echo ''
echo '>>> Remove Old alb-ingress-controller.yaml file && New alb-ingress-controller.yaml file Download'
rm -rf alb-ingress-controller.yaml* &&
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/alb-ingress-controller.yaml &&
# alb-ingress-controller.yaml
sed -i -e "s/# - --cluster-name=devCluster/- --cluster-name=$CLUSTER_NAME/g" alb-ingress-controller.yaml &&
sed -i -e "s/# - --aws-vpc-id=vpc-xxxxxx/- --aws-vpc-id=$VPC_ID/g" alb-ingress-controller.yaml &&
sed -i -e "s/# - --aws-region=us-west-1/- --aws-region=$AWS_REGION/g" alb-ingress-controller.yaml &&
kubectl apply -f ./alb-ingress-controller.yaml
echo '>>> FINISH'
sleep 5
echo '>>> Checking Create ALB Ingress Controller'
kubectl get pods -n kube-system | grep alb
쉘 스크립트를 실행하고 나면 `alb-ingress-controller-7c8795cc48-q56wv` 와 비슷한 이름의 Pod가 생성된 것을 확인할 수 있을 것이다.
이렇게 간단하게 EKS 클러스터 구축이 완료되었다.
'개발관련 > AWS' 카테고리의 다른 글
AWS에서 사용하고 있는 IP CIDR 확인하는 법 (0) | 2020.07.15 |
---|---|
CloudWatch 이상 동작 탐지 기능 사용하기 (0) | 2020.01.22 |
S3에서 pdf파일을 바로 다운로드 되도록 설정하는 방법 (0) | 2018.08.24 |
AWS Lightsail (VPS 서비스) (0) | 2018.06.20 |
CloudFront + S3 핸즈온 및 정리 (0) | 2018.06.16 |