실습 전 준비 과정
[AWS] IAM 사용자 생성 및 액세스 키 발급 방법
[AWS] EKS 구축을 위한 도구 설치: AWS CLI, eksctl, kubectl
EKS 클러스터 구축하기
Amazon EKS(Elastic Kubernetes Service)를 활용해 쿠버네티스 클러스터를 구축하는 실습을 진행하였습니다.
전체 과정은 아래 단계로 구성됩니다:
1. CloudFormation 스택 생성
• VPC와 같은 기본 리소스를 CloudFormation 템플릿을 사용해 생성
2. EKS 클러스터 생성
• 생성된 VPC 환경에 eksctl 명령어를 사용해 클러스터를 구축
3. kubeconfig 설정
• eksctl이 자동 생성한 kubeconfig 파일로 클러스터 연결 관리
4. Pod 배포
• Nginx Pod를 정의하고 배포 후 상태를 확인
5. Load Balancer 활용
• 외부 접근을 위한 LoadBalancer Service 생성 및 연결 확인
이제 각 단계를 자세히 살펴보자.
1. CloudFormation 스택 생성: VPC
CloudFormation으로 VPC를 생성한다.
- [사전 조건]에서는 [기존 템플릿 선택]을 선택
- [템플릿 지정]에서 [템플릿 파일 업로드]를 선택한 후 [base_resource_cfn.yaml] 파일을 선택
- [base_resource_cfn.yaml] 파일은 eks-work-VPC라는 이름의 VPC를 생성하도록 작성되어 있다.
스택 이름만 설정하고 나머지 옵션은 기본으로 해서 다음 > 전송버튼을 클릭한다.
- 스택 이름: eks-work-base
VPC 확인
VPC 항목에서 VPC가 생성되었는지 확인한다.
2. EKS 클러스터 생성
생성된 VPC 안에 EKS 클러스터를 구축할 것이다.
CloudFormation에서 만들어진 스택을 선택하고 [출력] 항목에서 WorkerSubnets 값을 복사한다.
eksctl 명령어로 클러스터 생성
eksctl create cluster
명령어는 Amazon EKS (Elastic Kubernetes Service) 클러스터를 쉽게 생성하는 데 사용되는 명령어다.
이 명령어를 사용하면 EKS 클러스터와 관련된 리소스를 자동으로 설정하고 배포할 수 있다.
각 인수는 클러스터를 어떻게 구성할지 정의한다.
eksctl create cluster \
--vpc-public-subnets <복사한값> \
--name 클러스터이름 \
--region 리전이름 \
--version EKS클러스터버전 \
--nodegroup-name 노드 그룹 이름 \
--node-type 워커 노드 인스턴스 타입 \
--nodes 워커 노드의 개수 \
--nodes-min 워커 노드의 최소 개수 \
--nodes-max 워커노드의 최대 개수
다음 명령어로 클러스터를 생성한다.
eksctl create cluster --vpc-public-subnets <WorkerSubnets값> \
--name eks-work-cluster \
--region ap-northeast-2 \
--version 1.30 \
--nodegroup-name eks-work-nodegroup \
--node-type t2.micro \
--nodes 2 \
--nodes-min 2 \
--nodes-max 5
Cluster 구축 확인
1) 로컬에서 노드 생성 확인
로컬에서 다음 명령어로 설정한 만큼의 노드가 보이는지 확인한다.
kubectl get nodes
2) EC2 인스턴스 생성 확인
AWS 관리 콘솔에서 EC2 페이지에서 노드의 개수만큼 인스턴스가 추가되었는지 확인한다.
3) CloudFormation 스택 생성 확인
CloudFormation에서 2개의 스택이 추가되었는지 확인한다.
3. kubeconfig 설정
1) eksctl과 kubeconfig
eksctl
을 사용하면 EKS 클러스터를 구축할 때 kubeconfig 파일을 자동으로 설정해준다.
kubeconfig 파일은 쿠버네티스 클러스터에 대한 접속 정보를 저장하는 중요한 설정 파일로, kubectl을 사용하여 클러스터에 접근할 수 있도록 한다.
eksctl은 이 파일을 자동으로 업데이트하여 EKS 클러스터와의 연결을 관리한다.
2) kubeconfig 파일의 구성
- clusters: 클러스터의 정보(예: API 서버 주소, 인증 정보 등)
- users: 클러스터에 접근할 수 있는 유저 정보(예: AWS IAM 역할이나 사용자 인증 정보)
- contexts: cluster와 user의 조합으로, 이 값이 실제로 사용되는 접속 환경을 정의한다.
- current-context: 현재 선택된 클러스터와 사용자가 포함된 컨텍스트로, 기본적으로 kubectl 명령을 실행할 때 사용된다.
3) kubeconfig 파일 관리
context 조회
현재 설정된 모든 컨텍스트를 조회할 수 있다. 현재 사용 중인 컨텍스트는 *
로 표시된다.
kubectl config get-contexts
context 변경
다음 명령을 사용하여 다른 클러스터로의 전환이 가능하다.
kubectl config use-context <컨텍스트이름>
4. Pod 배포
쿠버네티스에서는 애플리케이션을 Pod라는 단위로 배포한다.
예를 들어, 아래와 같이 nginx 컨테이너를 포함하는 Pod를 정의할 수 있다.
1) pod를 위한 야믈 파일 작성
다음과 같이 pod.yaml
파일을 작성한다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx-app
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
2) 파드 배포
앞에서 만든 야믈 파일을 이용하여 파드를 배포한다.
kubectl apply -f pod.yaml
3) pod 상태 확인
현재 클러스터에 배포된 Pod의 상태를 확인할 수 있다.
kubectl get pods
4) 모든 리소스 확인
클러스터 내 모든 리소스를 확인할 수 있다. Pod뿐만 아니라 Service, ReplicaSet, Deployment 등의 리소스를 함께 확인할 수 있다.
kubectl get all
5) 접속 여부 확인
Port Forwarding을 수행해서 접속 여부 확인
쿠버네티스에서 kubectl port-forward
명령을 사용하면 로컬 머신에서 Kubernetes Pod에 직접 접근할 수 있도록 포트를 포워딩할 수 있다. 예를 들어, nginx-pod의 80번 포트를 로컬 9001번 포트로 포워딩하려면 아래와 같이 명령을 실행한다.
kubectl port-forward 파드이름 외부포트:내부포트
kubectl port-forward nginx-pod 9001:80
이후 브라우저에서 localhost:9001
로 접속하여 Pod의 80번 포트가 정상적으로 열렸는지 확인할 수 있다.
5. Load Balancer를 이용한 외부 접근
1) 로드 밸런서와 Service 연결
EKS에서는 Service 객체를 생성하면 AWS에서 자동으로 ELB(Elastic Load Balancer)를 생성해준다.
이는 외부에서 클러스터 내의 애플리케이션에 접근할 수 있도록 해준다.
Service를 위한 YAML 파일을 작성하고 이를 다음 명령어로 실행한다.
kubectl apply -f service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx-app
ports:
- protocol: TCP
port: 80
targetPort: 80
위 YAML 파일을 통해 nginx-service라는 이름의 Service를 생성하면, AWS에서 자동으로 ELB가 생성되고, 이를 통해 외부에서 접근할 수 있는 IP가 부여된다.
kubectl get svc
나kubectl get all
을 이용해서 나온 External IP를 이용해서 외부에서 접속이 가능한지 확인할 수 있다.
2) 로드밸런서 확인
AWS > EC2 > 로드밸런서
ELB가 생성된 것을 확인할 수 있다.
로드밸런서를 클릭하면 DNS를 확인할 수 있는데, 배포한 페이지에 이 DNS로 접속할 수 있게 된다.