AEWS STUDY 1주차 - Amazon EKS 설치 및 기본 사용

Hanryang·2023년 4월 29일
0

AEWS 스터디

목록 보기
1/7
post-thumbnail

가시다님께서 진행하신 AEWS라는 스터디를 진행하면서 작성하는 글입니다.

AEWS= AWS EKS Workshop Study

AEWS 스터디는 4월 23일 ~ 6월 4일동안7번 진행될 예정입니다.

PKOS 스터디에서 정말 좋은 경험을 했어서 다시 이렇게 참가하게 되었습니다.

가시다님께서 진행하시는 스터디에 관심있으신 분들은 Cloudnet@Blog에 들어가시면 자세한 정보를 확인하실 수 있습니다.

AEWS 스터디를 시작한 계기


최근 LG CNS와 AWS가 행사를 주최한 AM 핸즈온이라는 행사에 참가했었습니다.

한 번도 이런 행사에 참가한 적이 없었는데, 같은 팀원 분의 소개로 참가하게되었습니다.

해당 행사에서는 EKS에 대한 전반적인 설명과 EKS를 이용한 핸즈온을 진행했습니다.

EKS 핸즈온에서는 9개의 과제를 내어주고 그 과제를 팀끼리 해결하는 것이었는데 앞에 전광판에 과제를 풀때마다 점수가 올라가는 시스템이였습니다.

1등은 무려 100만원, 2등은 50만원 이렇게 상금이 있던 핸즈온입니다.

(100만원 받고 싶어서 참가했습니다.)

총 60개 이상의 팀이 참가했고 저희는 이 곳에서 11등으로 마무리 했습니다.

(NDNE가 저희 팀입니다.)

해당 핸즈온을 진행할 때는 상금을 위해서 workshop과 docs에 나와있는 커맨드만 보고 따라치며 과제를 해결하는 것에만 집중을 했었습니다.

그런데 집에 가면서 생각해보니까 어떻게 돌아가는지 자세히 모르고 무작정 따라쳤던게 스스로 부끄러워서 제대로 공부를 해봐야겠다 라고 생각이 들면서 EKS Workshop을 복습하던 날이 얼마 지나지 않아 AEWS 스터디 모집글이 딱 올라왔고 그렇게 바로 신청하게 되었습니다.

Amazon EKS란?


Kubernetes 컨트롤 플레인 또는 노드를 설치, 운영 및 유지 관리할 필요 없이 AWS의 Kubernetes 실행에 사용할 수 있는 관리형 서비스입니다.

  • 여러 AWS 가용 영역에 걸쳐 Kubernetes 컨트롤 플레인을 실행하고 크기를 조정하여 높은 가용성을 보장
  • 컨트롤 플레인은 하중에 따라 제어 영역 인스턴스의 크기를 자동으로 조정하고, 비정상 제어 영역 인스턴스를 감지하고 교체하며, 자동화된 버전 업데이트 및 패치를 제공
  • 여러 AWS 서비스와 통합되어 다음 기능을 포함한 애플리케이션에 대한 확장성과 보안을 제공
    • 컨테이너 이미지에 대한 Amazon ECR
    • 로드 분산을 위한 Elastic 로드 밸런싱
    • 인증용 IAM
    • 격리를 위한 Amazon VPC
  • 오픈 소스 Kubernetes 소프트웨어의 최신 버전을 실행하므로 Kubernetes 커뮤니티에서 모든 기존 플러그 인과 도구를 사용
  • Amazon EKS에서 실행되는 애플리케이션은 온프레미스 데이터 센터에서 실행 중이든 퍼블릭 클라우드에서 실행 중이든 상관없이 모든 표준 Kubernetes 환경에서 실행되는 애플리케이션과 완벽하게 호환
    • 필요한 코드를 수정하지 않고 표준 Kubernetes 애플리케이션을 Amazon EKS로 쉽게 마이그레이션 가능

EKS 아키텍처

EKS 컨트롤 플레인


Amazon EKS는 각 클러스터에 대해 단일 테넌트 Kubernetes 컨트롤 플레인을 실행합니다.

  • 컨트롤 플레인은 AWS에서 관리하는 계정으로 실행됩니다.
  • 컨트롤 플레인 인프라는 클러스터 또는 AWS 계정 간에 공유되지 않습니다.
  • 컨트롤 플레인은 2개 이상의 API 서버 인스턴스와 AWS 리전 내 3개의 가용 영역에서 실행되는 3개의 etcd 인스턴스로 구성됩니다.
    • API 서버는 클러스터와 연결된 EKS 엔드포인트를 통해 노출
      • 관리되는 엔드포인트는 NLB를 사용하여 Kubernetes API 서버를 로드 밸런싱
      • API 서버가 공용 인터넷(공용 끝점 사용) 또는 VPC(EKS 관리 ENI 사용) 또는 둘 다를 통해 연결할 수 있는지 여부를 구성 가능
    • etcd에 의해 저장된 모든 데이터 및 연결된 EBS볼륨은 AWS KMS를 사용하여 암호화
    • EKS 환경에서 etcd 스토리지는 8GB 제한

EKS 데이터 플레인


데이터 플레인은 두 개 이상의 작업자 노드로 구성되며, 워크로드에 따라 확장 및 축소가 가능하고 장애로 부터 자동으로 복구할 수 있습니다.

작업자 노드는 ****컨테이너화된 애플리케이션을 실행하는 시스템이고 구성요소가 있습니다.

  • 컨테이너 런타임 - 컨테이너 실행을 담당
  • kubelet - 컨테이너가 정상 상태이고 연결된 Pod 내에서 실행되고 있는지 확인
  • Kube-proxy - Pod에 대한 통신을 허용하는 네트워크 규칙을 유지 관리

EKS는 3가지 방법으로 pod를 예약할 수 있습니다.

  • 관리형 노드 그룹
    • EKS 클러스터의 노드(Amazon EC2 인스턴스) 프로비저닝 및 수명 주기 관리를 자동화
    • 애플리케이션을 실행하기 위해 컴퓨팅 용량을 제공하는 Amazon EC2 인스턴스를 별도로 프로비저닝하거나 등록할 필요 X
    • 한 번의 조작으로 클러스터에 대한 노드를 자동으로 생성, 업데이트 또는 종료
    • 관리형 노드 그룹을 사용하기 위한 추가 비용은 없으며 프로비저닝한 AWS 리소스에 대해서만 비용을 지불
  • 자체 관리형 노드
    • Custom AMI를 사용, ASG 직접 관리, OS 기본구성/패치를 고객이 직접 관리
  • AWS Fargate
    • 고객은 별도의 EC2관리할 필요 없이, AWS Fargate 환경에서 제공하는 Micro VM을 이용하여 PodVM 할당

각 기능에 대한 상세 비교내용은 이 링크에서 보실 수 있습니다.


# EKS Cluster Endpoint

Amazon EKS에서는 클러스터와 통신하는 데 사용하는 관리형 Kubernetes API 서버에 대한 엔드포인트를 생성합니다.

기본적으로 API 서버 엔드포인트는 인터넷에 공개되어 있으며, API 서버에 대한 엑세스는 IAM 및 기본 RBAC(역할 기반 엑세스 제어)의 조합을 통해 보호됩니다.

엔드포인트 엑세스 제어 방식은 3가지로 구성할 수 있습니다.

  • 퍼블릭 엑세스 활성화, 프라이빗 엑세스 비활성화

    • EKS 클러스터의 기본 동작
    • 클러스터의 VPC내에서 비롯된 API요청은 VPC에서 벗어나지만 Amazon의 네트워크에서는 벗어나지 않음
    • 인터넷에서 API서버에 엑세스 가능
      • 선택적으로 퍼블릭 엔드포인트에 엑세스할 수 있는 CIDR 블록 제한 가능
  • 퍼블릭 엑세스 활성화, 프라이빗 엑세스 활성화

    • 클러스터의 VPC 내 API요청은 프라이빗 VPC 엔드포인트를 사용
    • 인터넷에서 API서버에 엑세스 가능
      • 선택적으로 퍼블릭 엔드포인트에 엑세스할 수 있는 CIDR 블록 제한 가능
  • 퍼블릭 엑세스 비활성화, 프라이빗 엑세스 비활성화

    • API 서버에 대한 모든 트래픽은 클러스터의 VPC 내에서만 발생
    • 인터넷에서 API 서버로 퍼블릭 엑세스 불가능
      • 모든 kubectl 명령은 VPC 내에서
      • 프라이빗 전용 API 서버 엑세스 → 링크
        • 연결된 네트워크 - AWS Transit Gateway
        • EC2 Bastion 호스트
        • AWS Cloud9 IDE

EKS 직접 배포


EKS를 한번 직접 배포해보겠습니다.

가시다님의 스터디는 친절하 EKS를 쉽게 배포할 수 있게 환경을 구성해주십니다.

저희 스터디에서 조력자 분이신 악분님의 블로그에 EKS 설치 설명이 깔끔하게 되어있으니 설치하고 싶으신 분들은 아래 블로그에서 참고하셔도됩니다.

EKS 스터디 - 1주차 3편 - eksctl로 EKS생성

아래의 이미지와 같이 구성된 인프라를 구성할 것입니다.

  1. 먼저 EKS 생성을 위한 작업용 EC2를 설치합니다.

    • 해당 설치는 가시다님께서 Cloudformation 작업 파일을 제공해주셔서 쉽게 설치했습니다.
  2. 해당 작업용 EC2가 설치가 완료되면 putty로 접속 후 IAM User 자격 증명 설정 및 VPC 확인 및 변수 지정합니다.

    # IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력
    **aws configure**
    AWS Access Key ID [None]: ***AKIA5...***
    AWS Secret Access Key [None]: ***CVNa2...***
    Default region name [None]: ***ap-northeast-2***
    Default output format [None]: json
    
    # 자격 구성 적용 확인 : 노드 IP 확인
    **aws ec2 describe-instances**
    
    # EKS 배포할 VPC 정보 확인
    **aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq**
    aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq Vpcs[]
    aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq Vpcs[].VpcId
    aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId
    **export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
    echo "export VPCID=$VPCID" >> /etc/profile**
    echo VPCID
    
    ****# EKS 배포할 VPC에 속한 Subnet 정보 확인
    aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq
    aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output yaml | yh
    
    ****## 퍼블릭 서브넷 ID 확인
    **aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" | jq**
    aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text
    **export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
    export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
    echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
    echo "export PubSubnet2=$PubSubnet2" >> /etc/profile**
    echo $PubSubnet1
    echo $PubSubnet2
  3. eksctl create cluster 을 실행합니다.

    # 변수 확인
    echo $AWS_DEFAULT_REGION
    echo $CLUSTER_NAME
    echo $VPCID
    echo $PubSubnet1,$PubSubnet2
    
    # eks 클러스터 & 관리형노드그룹 배포 전 정보 확인
    **eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
    --node-volume-size=30 --vpc-public-subnets "$PubSubnet1,$PubSubnet2" --version 1.24 --ssh-access --external-dns-access --dry-run | yh**
    ...
    **vpc**:
      autoAllocateIPv6: false
      cidr: 192.168.0.0/16
      clusterEndpoints:
        privateAccess: false
        publicAccess: true
      **id**: vpc-0505d154771a3dfdf
      manageSharedNodeSecurityGroupRules: true
      nat:
        gateway: Disable
      **subnets**:
        **public**:
          ap-northeast-2a:
            az: ap-northeast-2a
            cidr: 192.168.1.0/24
            id: subnet-0d98bee5a7c0dfcc6
          ap-northeast-2c:
            az: ap-northeast-2c
            cidr: 192.168.2.0/24
            id: subnet-09dc49de8d899aeb7
    ****
    # eks 클러스터 & 관리형노드그룹 배포
    **eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
    --node-volume-size=30 --vpc-public-subnets "$PubSubnet1,$PubSubnet2" --version 1.24 --ssh-access --external-dns-access --verbose 4**
    • 해당 설치를 진행하게 되면 CloudFormation을 통해 배포가 진행되므로 해당 콘솔에서 진행 상황을 확인할 수 있습다.
  4. 설치 완료 확인

    • Cloudformation

    • Autoscaling 그룹

      ⇒ 워커노드 2대가 Autoscaling 그룹으로 관리가 되어집니다!

    • EKS 클러스터 정보 확인

profile
한량이 되고싶다..

0개의 댓글