2.2 EKS 클러스터 구축

SummerToday·2024년 8월 16일
0
post-thumbnail
post-custom-banner

기본 리소스 구축

실습 환경 설치

  • 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 설치


  • 명령줄 도구 저장 폴더의 PATH 환경변수 설정

    • 이름 PATH, 값 %USERPROFILE%\k8sbook\bin으로 환경변수를 새로 생성한다.

    • Git Bash에서 eksctl version, kubectl version --client 명령어를 통해 동작을 확인한다.


  • Amazon Corretto 설치


  • JAVA_HOME 환경 변수 설정

    • 변수 이름은 JAVA_HOME, 변수 값은 c:\program Files\Amazon Corretto\JDK 버전(JDK 버전 값은 파일 탐색기 등에서 확인한다.)

  • Docker Desktop 설치


  • Node.js 설치

    • https://nodejs.org/en 링크를 통해 다운로드한다. 책에서는 LTS 버전을 사용한다.

    • Git Bash에서 node --version 명령어를 통해 정상 동작을 확인한다.


기본 리소스 생성

CloudFormation

인프라를 코드(IaC, Infrastructure as Code)로 관리할 수 있게 해주는 AWS의 도구이다. 이를 통해 사용자는 EC2 인스턴스, S3 버킷, RDS 데이터베이스 등의 AWS 리소스를 코드로 정의하고, 자동으로 프로비저닝, 관리 및 업데이트할 수 있다. 다음과 같은 주요 기능이 존재한다.

  • 인프라 자동화
    CloudFormation을 사용하면 복잡한 인프라 설정을 코드로 작성하여 자동으로 배포할 수 있다. 이를 통해 인프라 설정의 일관성을 유지하고, 수동 설정에서 발생할 수 있는 오류를 줄일 수 있다.

  • 템플릿 기반 설정
    JSON 또는 YAML 형식의 템플릿 파일을 사용해 인프라를 정의합니다. 이 템플릿에는 필요한 모든 AWS 리소스 및 해당 리소스 간의 관계가 포함된다.

  • 버전 관리 및 변경 관리
    템플릿은 코드로 관리되므로 Git 등의 버전 관리 시스템을 사용해 버전 관리가 가능하며, 변경 사항을 추적할 수 있다. 이를 통해 인프라 변경을 더 쉽게 관리하고 롤백할 수 있다.

  • 스택(Stack) 관리
    CloudFormation에서는 템플릿을 사용해 '스택'이라는 단위로 리소스를 배포한다. 스택은 리소스의 집합을 나타내며, 스택 단위로 리소스를 생성, 업데이트 또는 삭제할 수 있다.

  • 반복 가능성과 확장성
    동일한 템플릿을 사용해 여러 환경(예: 개발, 테스트, 프로덕션)에 일관된 인프라를 구축할 수 있다. 이는 확장 가능한 인프라를 쉽게 배포하는 데 유용하다.

  • 드리프트 감지
    CloudFormation은 드리프트 감지 기능을 제공하여 실제 배포된 리소스가 템플릿과 일치하는지 확인할 수 있다. 이 기능을 통해 예상치 못한 인프라 변경을 감지하고 관리할 수 있다.

  • CloudFormation 주요 사용 사례
    • 멀티 계정 환경에서의 인프라 배포
    • CI/CD 파이프라인과의 통합을 통한 자동화된 인프라 관리
    • 재해 복구를 위한 인프라 복제 및 관리
    • 다양한 AWS 서비스 간의 복잡한 의존성 관리

CloudFormation 생성

  • 템플릿 파일
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 끝부분이 매번 변경된다.

  • 나머지 설정은 기본 설정으로 진행하여 스택을 생성한다.


생성 리소스 확인

  • VPC 서비스에 들어가 'eks-work-VPC'라는 VPC가 생성이 잘 되었는지 확인한다.


EKS 클러스터 구축

기본 리소스 정보

  • CloudFormation 페이지에서 'eks-work-base' 스택을 클릭하고 출력 탭을 선택한다.

    • WorkerSubnets(워커 노드용 서브넷) 값을 복사한다.


AWS CLI 설정

  • 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 실행

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 환경을 구축한다.


Kubeconfig 설정

  • eksctl은 EKS 클러스터 구축 중에 kubeconfig 파일을 자동으로 업데이트한다.

  • kubeconfig 파일은 Kubernetes 클라이언트 도구(kubectl 등)가 Kubernetes 클러스터와 상호작용할 수 있도록 필요한 설정을 제공하는 구성 파일이다.

  • 쿠버네티스 클러스터의 접속 정보(컨트롤 플레인 URL, 인증 정보, 이용할 쿠버네티스 네임스페이스 등)를 저장하고 있다.

  • EKS 클러스터에 접근하려면 인증정보가 필요하다.

    • IAM 자격 증명: AWS 계정의 사용자 또는 역할로, EKS 클러스터 접근을 위한 기본적인 인증 수단.

    • Kubeconfig 파일: 클러스터 연결 설정과 인증 정보를 포함하는 파일. kubectl이 이 파일을 통해 클러스터와 상호작용.

    • API 서버 엔드포인트와 인증 토큰: 클러스터 API와의 통신을 위한 엔드포인트 및 인증 토큰. 클러스터에 접근할 때마다 필요.




해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
아이자와 고지 외 1명, ⌜클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트⌟, 동양북스, 2021, 370쪽
profile
IT, 개발 관련 정보들을 기록하는 장소입니다.
post-custom-banner

0개의 댓글