AWS EKS 구축하기

하나의 클러스터 생성으로 Public 환경의 EKS 구축
jongcloud's avatar
Apr 23, 2024
AWS EKS 구축하기
  • 테스트/작업 환경의 기반
 

1. Public Cloud 환경 구성하기

AWS-Public-Cloud 환경 구성 가이드_240123.docx 문서를 참고하여 VPC 생성 및 Gateway를 설정한다.
 
구성하고자 하는 환경의 아키텍처는 아래와 같다
notion image

1-1. VPC 생성

notion image
notion image

1-2. 서브넷 생성

  • Public-EKS-a ( 192.168.1.0/24)
    • notion image
  • Public-EKS-c (192.168.2.0/24)
    • notion image

1-3. 인터넷 게이트웨이 생성

notion image
 

1-3-1. 생성된 인터넷 게이트웨이를 VPC에 연결

notion image

1-4. 라우팅 테이블 생성하기

notion image

1-4-1. 라우팅 테이블 편집

notion image
notion image

1-4-2. 생성된 라우팅 테이블을 서브넷에 연결

notion image
notion image
notion image

2. 클러스터 생성하기

기존에는 리눅스 시스템에 접속할 수 있는 bastion을 만들고 그 bastion에서 클러스터를 생성하였다. 하지만 조금 알아본결과.. eks를 구성하는데 있어서 bastion은 필요없다. 콘솔에서 바로 클러스터를 만드는 방법으로 진행해본다.
 

2-1. 클러스터의 권한 만들기

IAM > 역할 > 역할 생성 > AWS 서비스 > EKS
notion image
notion image
 

2-2. 클러스터 생성하기

EKS > 클러스터 > EKS 클러스터 생성
 
  • 클러스터 구성
    • notion image
      IAM 권한을 생성한 후 서비스역할에 방금만들었던 역할이 확인된다.
       
  • 네트워킹 지정
    • notion image
      보안그룹의 개념은 조금 모호하지만 필수로 선택해줘야한다.
      기본 보안그룹을 사용했다.
      💡
      보안그룹? 보안 그룹은 AWS에서 가장 기본이 되는 네트워크 보안 기술이다. 보안 그룹을 사용하여 EC2 Instance로 들어오거나(Inbound) 나가는(Outbound) 트래픽들을 직접 설정하여 제어할 수 있다. 이렇듯 보안 그룹은 서비스의 보안과 관련된 아주 중요한 기능이므로 EC2를 활용하여 인프라를 구축하는 경우 올바르게 사용할 줄 알아야 한다.
       
  • 관찰성 구성
    • notion image
      제어 플레인 로깅.. 일단 활성화 해봄
       
  • 추가 기능 선택
    • notion image
       
      notion image
 
  • 최종 검토
    • notion image
      notion image

3. 노드 생성하기

EKS를 생성하고 난 뒤에는 해당 클러스터의 Node Group을 생성해야한다. 생성한 Node 그룹 안에서 내가 서비스하고 싶은 pod들이 배치되고 관리되게 된다.
 
노드 생성도 클러스터와 마찬가지로 IAM 역할이 사전에 준비되어야 한다.

3-1. IAM 콘솔에서 Amazon EKS 노드 역할을 생성

  1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.
  1. 왼쪽 탐색 창에서 역할(Roles)을 선택합니다.
  1. 역할(Roles) 페이지에서 역할 생성(Create role)을 선택합니다.
  1. 신뢰할 수 있는 엔터티 선택(Select trusted entity) 페이지에서 다음을 수행합니다.
    1. 신뢰할 수 있는 엔터티 유형(Trusted entity type) 섹션에서 AWS 서비스를 선택합니다.
    2. 사용 사례(Use case)에서 EC2를 선택합니다.
    3. 다음을 선택합니다.
      1. notion image
  1. 권한 추가 페이지에서 사용자 지정 정책을 연결하거나 다음과 같이 합니다.
    1. 필터 정책(Filter policies) 상자에 AmazonEKSWorkerNodePolicy를 입력합니다.
    2. 검색 결과의 AmazonEKSWorkerNodePolicy 왼쪽에 있는 확인란을 선택합니다.
    3. 필터 지우기(Clear filters)를 선택합니다.
    4. 필터 정책(Filter policies) 상자에 AmazonEC2ContainerRegistryReadOnly를 입력합니다.
    5. 검색 결과의 AmazonEC2ContainerRegistryReadOnly 왼쪽에 있는 확인란을 선택합니다.
      1. 생성하는 AmazonEKS_CNI_Policy 관리형 정책이나 IPv6 정책은 또한 이 역할 또는 aws-node Kubernetes 서비스 계정에 매핑된 다른 역할에 연결되어야 합니다. 이 역할에 정책을 할당하는 대신 Kubernetes 서비스 계정에 연결된 역할에 정책을 할당하는 것이 좋습니다. 자세한 내용은 서비스 계정용 IAM 역할(IRSA)을 사용하도록 Amazon VPC CNI plugin for Kubernetes 구성 섹션을 참조하세요.
    6. 다음을 선택합니다.
      1. notion image

         
  1. 이름, 검토 및 생성(Name, review, and create) 페이지에서 다음을 수행합니다.
    1. 역할 이름(Role name)에 역할의 고유한 이름(예: AmazonEKSNodeRole)을 입력합니다.
    2. 설명(Description)에서 현재 텍스트를 설명이 포함된 텍스트(예: Amazon EKS - Node role)로 바꿉니다.
    3. 태그 추가(선택 사항)에서 태그를 키-값 페어로 연결하여 메타데이터를 역할에 추가합니다. IAM에서 태그 사용에 대한 자세한 내용을 알아보려면 IAM 사용 설명서의 IAM 리소스에 태그 지정을 참조하세요.
    4. 역할 생성을 선택합니다.
      1. notion image

3-2. 노드 생성하기

EKS > 클러스터 > solupia > 노드 그룹 > 노드 그룹 추가
  • 노드 그룹 구성
    • notion image
      3-1 절에서 생성한 노드 그룹을 매핑합니다.
       
  • 컴퓨팅 및 조정 구성 설정
    • notion image
      notion image
 
  • 네트워킹 설정
    • notion image
 
  • 최종 구성
    • notion image
       
error (서브
One or more Amazon EC2 Subnets of [subnet-***, subnet-***] for node group solupia_node_group does not automatically assign public IP addresses to instances launched into it. If you want your instances to be assigned a public IP address, then you need to enable auto-assign public IP address for the subnet. See IP addressing in VPC guide: https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip
notion image
 
서브넷 설정에서 퍼블릭 ip주소 설정이 활성화되어있지 않아서 발생한 이슈로 보인다.
 
notion image
 
  • 노드그룹 재생성 중 네트워킹 부분 추가
    • 키페어 부분을 지정해주고 보안그룹 지정해준다.
      보안그룹에 해당되는 ip로만 접속을 허용한다는 의미이다.
      notion image
       
  • error
    • 인스턴스 ssh 접속이 도저히 되지 않아 보안그룹에서 모든 트래픽을 허용 후 접속이 가능하다. 추후 원인파악이 필요해보임.
       

4. AWS CLI 설치(kubectl 사용)

기존 환경 구성 문서에는 eks 의 구성이 설명되어 있지만 AWS 공식홈페이지를 참고하여 eks의 공식적인 구성과정을 살펴본다.
 
  1. 디바이스에 kubectl이 설치되어 있는지 확인
    1. $ kubectl version --client
      notion image
 
  1. 출력이 되지 않는다면 kubectl이 설치되어 있지 않은것이므로, kubectl을 설치해야한다.
    1. curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.29.0/2024-01-04/bin/linux/amd64/kubectl
      명령어를 실행한 경로에 kubectl 이 생성되었다.
 
  1. 바이너리에 실행 권한을 적용
    1. $ chmod +x ./kubectl
 
  1. 바이너리를 PATH의 폴더에 복사합니다. kubectl 버전이 이미 설치된 경우 $HOME/bin/kubectl을 생성하고 $HOME/bin이 $PATH로 시작하도록 해야 합니다.
    1. $ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
 
  1. (선택사항) 셀 초기화 파일에 $HOME/bin 경로를 추가하면 셀을 열 때 구성됩니다.
    1. $ echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
 
  1. kubectl 설치 이후 어떤 서버와도 통신이 구성되지 않은 상태이다. 아래 명령어를 통해 리전 및 클러스터명을 입력하여
    1. aws eks update-kubeconfig --region ap-northeast-2 --name <<클러스터명>>
 
  1. 이후 kubectl create pod 라던가 명령 시
    1. Error from server (Forbidden): namespaces is forbidden: User "system:node:ip-192-168-2-75.ap-northeast-2.compute.internal" cannot create resource "namespaces" in API group "" at the cluster scope
      권한 에러가 발생한다. 적절한 IAM 권한을 가진 계정에 aws configure를 해줘야한다.
       
      [ec2-user@ip-192-168-2-75 ~]$ aws configure AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [None]: Default output format [None]:
error
해당 config 이후 kubect get pod 등과 같은 기본 명령에서
error: You must be logged in to the server (Unauthorized) 와 같은 에러가 발생한다.
 
AWS EKS 클러스터 접근을 위한 컨피그 파일을 재생성 해줘야한다.
aws eks --region ap-northeast-2 update-kubeconfig --name <<클러스터명>>
 
해당 명령에도 에러가 발생한다.
An error occurred (InvalidClientTokenId) when calling the GetSessionToken operation: The security token included in the request is invalid.
 
aws sts get-session-token --serial-number arn:aws:iam::***:mfa/*** --token-code 690215
 
MFA가 설정되어있는 계정에서 오류라고 판단하였으나 확인이 더 이상 되지 않아 Web에서 원인을 찾아본다.
 
  • 웹 콘솔에서 액세스 정책을 추가한뒤 증상해결되었으나.. 근본적인 cli 상에서 어떤 부분이 문제였는지는 미해결..
  • 클러스터 생성 시 인증모드를 EKS API 및 ConfigMap 으로 설정하였고 이 해결방식은 EKS API를 통해 액세스 정책을 추가함(Console에서.. 액세스 정책 추가)
notion image
 
그 이후 정상동작
Share article

jongcloud