AWS CLI 설치
https://aws.amazon.com/ko/cli에 접속하여 AWSCLI64.msi를 다운로드 한다.
모두 기본 설정으로 다운하고 CMD를 열어 aws --version을 입력해 정상 설치되었는지 확인한다.
Git for Windows 설치
https://gitforwindows.org에 접속하여 다운로드 한다.
Configuring the line ending conversions 설정은 기본 값인 checkout as-is, commit as-is로 변경한다. 기본 설정으로 할 시 리포지토리에서 파일을 가져올 때 개행 코드가 변환되어 로컬 환경에서 오류가 발생할 수 있기 때문이다.
CMD에서 git --version을 입력해 정상 설치되었는지 확인한다.
eksctl, kubectl 설치
eksctl 설치 링크: https://github.com/eksctl-io/eksctl/releases
kubectl 설치 링크: https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html
명령줄 도구 저장 폴더의 PATH 환경변수 설정
이름 PATH, 값 %USERPROFILE%\k8sbook\bin으로 환경변수를 새로 생성한다.
Git Bash에서 eksctl version, kubectl version --client 명령어를 통해 동작을 확인한다.
Amazon Corretto 설치
https://aws.amazon.com/ko/coretto에서 다운받는다. 이 책에서는 coretto 11을 사용한다.
javac -version, java --version 명령어를 통해 동작을 확인한다.
JAVA_HOME 환경 변수 설정
Docker Desktop 설치
https://docs.docker.com/desktop/install/windows-install/ 링크를 통해 다운로드한다.
CMD를 열어 docker --version 명령어를 통해 확인한다.
도커 허브 계정에 가입 및 로그인을 한다.
Node.js 설치
https://nodejs.org/en 링크를 통해 다운로드한다. 책에서는 LTS 버전을 사용한다.
Git Bash에서 node --version 명령어를 통해 정상 동작을 확인한다.
인프라를 코드(IaC, Infrastructure as Code)로 관리할 수 있게 해주는 AWS의 도구이다. 이를 통해 사용자는 EC2 인스턴스, S3 버킷, RDS 데이터베이스 등의 AWS 리소스를 코드로 정의하고, 자동으로 프로비저닝, 관리 및 업데이트할 수 있다. 다음과 같은 주요 기능이 존재한다.
인프라 자동화
CloudFormation을 사용하면 복잡한 인프라 설정을 코드로 작성하여 자동으로 배포할 수 있다. 이를 통해 인프라 설정의 일관성을 유지하고, 수동 설정에서 발생할 수 있는 오류를 줄일 수 있다.
템플릿 기반 설정
JSON 또는 YAML 형식의 템플릿 파일을 사용해 인프라를 정의합니다. 이 템플릿에는 필요한 모든 AWS 리소스 및 해당 리소스 간의 관계가 포함된다.
버전 관리 및 변경 관리
템플릿은 코드로 관리되므로 Git 등의 버전 관리 시스템을 사용해 버전 관리가 가능하며, 변경 사항을 추적할 수 있다. 이를 통해 인프라 변경을 더 쉽게 관리하고 롤백할 수 있다.
스택(Stack) 관리
CloudFormation에서는 템플릿을 사용해 '스택'이라는 단위로 리소스를 배포한다. 스택은 리소스의 집합을 나타내며, 스택 단위로 리소스를 생성, 업데이트 또는 삭제할 수 있다.
반복 가능성과 확장성
동일한 템플릿을 사용해 여러 환경(예: 개발, 테스트, 프로덕션)에 일관된 인프라를 구축할 수 있다. 이는 확장 가능한 인프라를 쉽게 배포하는 데 유용하다.
드리프트 감지
CloudFormation은 드리프트 감지 기능을 제공하여 실제 배포된 리소스가 템플릿과 일치하는지 확인할 수 있다. 이 기능을 통해 예상치 못한 인프라 변경을 감지하고 관리할 수 있다.
- CloudFormation 주요 사용 사례
- 멀티 계정 환경에서의 인프라 배포
- CI/CD 파이프라인과의 통합을 통한 자동화된 인프라 관리
- 재해 복구를 위한 인프라 복제 및 관리
- 다양한 AWS 서비스 간의 복잡한 의존성 관리
AWSTemplateFormatVersion: '2024-08-09'
Parameters:
ClusterBaseName:
Type: String
Default: eks-work
TargetRegion:
Type: String
Default: ap-northeast-2
AvailabilityZone1:
Type: String
Default: ap-northeast-2a
AvailabilityZone2:
Type: String
Default: ap-northeast-2b
AvailabilityZone3:
Type: String
Default: ap-northeast-2c
VpcBlock:
Type: String
Default: 192.168.0.0/16
WorkerSubnet1Block:
Type: String
Default: 192.168.0.0/24
WorkerSubnet2Block:
Type: String
Default: 192.168.1.0/24
WorkerSubnet3Block:
Type: String
Default: 192.168.2.0/24
Resources:
EksWorkVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcBlock
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub ${ClusterBaseName}-VPC
WorkerSubnet1:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: !Ref AvailabilityZone1
CidrBlock: !Ref WorkerSubnet1Block
VpcId: !Ref EksWorkVPC
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub ${ClusterBaseName}-WorkerSubnet1
WorkerSubnet2:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: !Ref AvailabilityZone2
CidrBlock: !Ref WorkerSubnet2Block
VpcId: !Ref EksWorkVPC
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub ${ClusterBaseName}-WorkerSubnet2
WorkerSubnet3:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: !Ref AvailabilityZone3
CidrBlock: !Ref WorkerSubnet3Block
VpcId: !Ref EksWorkVPC
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub ${ClusterBaseName}-WorkerSubnet3
InternetGateway:
Type: AWS::EC2::InternetGateway
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref EksWorkVPC
WorkerSubnetRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref EksWorkVPC
Tags:
- Key: Name
Value: !Sub ${ClusterBaseName}-WorkerSubnetRouteTable
WorkerSubnetRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref WorkerSubnetRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
WorkerSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref WorkerSubnet1
RouteTableId: !Ref WorkerSubnetRouteTable
WorkerSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref WorkerSubnet2
RouteTableId: !Ref WorkerSubnetRouteTable
WorkerSubnet3RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref WorkerSubnet3
RouteTableId: !Ref WorkerSubnetRouteTable
Outputs:
VPC:
Value: !Ref EksWorkVPC
WorkerSubnets:
Value: !Join
- ","
- [!Ref WorkerSubnet1, !Ref WorkerSubnet2, !Ref WorkerSubnet3]
RouteTable:
Value: !Ref WorkerSubnetRouteTable
기본 구조
AWSTemplateFormatVersion
템플릿 버전을 명시한다. 선택 사항이며, 현재 사용되는 버전은 '2024-08-09'이다.
Description
템플릿에 대한 설명을 작성할 수 있다. (선택)
Parameters
템플릿에서 동적으로 값을 입력받을 수 있는 파라미터를 정의한다. 예를 들어, VPC의 CIDR 블록이나 EC2 인스턴스의 타입을 사용자가 템플릿 실행 시 지정할 수 있다.
Mappings
지역(Region)별 값이나 다른 하드코딩된 값을 정의한다. 예를 들어, 각 리전에서 사용할 AMI ID 등을 설정할 수 있습다.
Conditions
리소스의 생성 여부를 조건에 따라 제어할 수 있다. 예를 들어, 특정 환경에서만 리소스를 생성하도록 조건을 설정할 수 있다.
Resources
실제로 생성할 AWS 리소스들을 정의한다. 이 섹션은 CloudFormation 템플릿의 핵심 부분으로, VPC, 서브넷, EC2 인스턴스, S3 버킷 등 다양한 AWS 서비스 리소스를 정의한다.
Outputs
템플릿이 생성한 리소스의 정보를 출력한다. 예를 들어, 생성된 VPC의 ID나 EC2 인스턴스의 퍼블릭 IP를 출력할 수 있다.
Metadata
템플릿에 대한 추가 정보를 제공하는 섹션이다. AWS CLI와 같은 도구에서 유용하게 사용될 수 있다.
스택 생성
템플릿 URL은 동적으로 생성되어 파일 이름 외에 URL 끝부분이 매번 변경된다.
나머지 설정은 기본 설정으로 진행하여 스택을 생성한다.
CloudFormation 페이지에서 'eks-work-base' 스택을 클릭하고 출력 탭을 선택한다.
WorkerSubnets(워커 노드용 서브넷) 값을 복사한다.
Git Bash를 열고, 다음 명령어를 사용하여 AWS CLI를 설정한다.
aws configure
# 위 명령어 후 다음과 같이 설정
AWS Access Key ID [None]: YOUR_ACCESS_KEY_ID
AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY
Default region name [None]: YOUR_DEFAULT_REGION
Default output format [None]: json
eksctl 명령어는 옵션으로 파라미터를 설정할 경우 다양한 구성의 EKS 클러스터를 구축할 수 있다.
다음 명령어들을 통해 EKS 클러스터를 구축한다.
$ eksctl create cluster \ # 아래의 인수를 설정하여 eksctl 실행
> --vpc-public-subnets <WorkerSubnets 값> \ # 워커 노드용 서브넷
> --name eks-work-cluster \ # 클러스터 이름
> --region ap-northeast-2 \ # 리전 (서울 리전을 설정)
> --version 1.24 \ # EKS 클러스터 버전
> --nodegroup-name eks-work-nodegroup \ # 노드 그룹 이름
> --node-type t2.small \ # 워커 노드 인스턴스 타입
> --nodes 2 \ # 워커 노드 수
> --nodes-min 2 \ # 워커 노드의 최소 노드 수
> --nodes-max 5 \ # 워커 노드의 최대 노드 수
eksctl에서는 CloudFormation 스택 2개(EKS 클러스터 구축, 워커 노드 구축)를 생성하여 EKS 환경을 구축한다.
eksctl은 EKS 클러스터 구축 중에 kubeconfig 파일을 자동으로 업데이트한다.
kubeconfig 파일은 Kubernetes 클라이언트 도구(kubectl 등)가 Kubernetes 클러스터와 상호작용할 수 있도록 필요한 설정을 제공하는 구성 파일이다.
쿠버네티스 클러스터의 접속 정보(컨트롤 플레인 URL, 인증 정보, 이용할 쿠버네티스 네임스페이스 등)를 저장하고 있다.
EKS 클러스터에 접근하려면 인증정보가 필요하다.
IAM 자격 증명: AWS 계정의 사용자 또는 역할로, EKS 클러스터 접근을 위한 기본적인 인증 수단.
Kubeconfig 파일: 클러스터 연결 설정과 인증 정보를 포함하는 파일. kubectl이 이 파일을 통해 클러스터와 상호작용.
API 서버 엔드포인트와 인증 토큰: 클러스터 API와의 통신을 위한 엔드포인트 및 인증 토큰. 클러스터에 접근할 때마다 필요.