본문으로 바로가기

[AWS] 프라이빗 환경에서 eksctl로 AWS EKS 생성하기

category AWS 2023. 2. 19. 21:20
반응형

시작


인터넷 통신이 안 되는 환경에서 일하며 AWS EKS를 생성해야 했다. 처음엔 EKS에 대한 지식이 없어서 구글링과 AWS 공식 문서를 보며 생성해 보았지만 쉽지 않았다. 하지만 여러 시행착오를 겪으면서 생성에 성공하였고 eksctl을 활용하여 EKS를 생성하였다. (VPC, 서브넷 등은 AWS 콘솔에서 생성하였음)

 

이 글에서는 최대한 프라이빗(폐쇄망) 환경처럼 사용하기 위해 퍼블릭 통신이 되는 Bastion 서버를 앞에 두고 뒷단에는 프라이빗 공간에 EKS 설치를 위한 Management 서버를 두었다.

 

아키텍처는 아래 그림과 같다.

 

아키텍처


 

그림에선 워커 노드가 2대 떠 있지만 실습에선 1대만 띄워서 함

Bastion 서버를 퍼블릭에 두어 MGMT 서버에 ssh 접속하여 작업을 진행하였으며 EKS 의 Master Node 즉, Control Plane은 AWS에서 제어하는 영역이기 때문에 볼 순 없지만, 나의 VPC와 통신을 하기 위해 EKS에서 나의 영역에 eks eni를 생성하여 통신한다. 이때 보안그룹이 새로 생성되는데 보안그룹에 대한 내용은 다음에 다뤄보도록 하겠다.

 

 

사전 구성 작업 (IAM / Security Group / VPC Endpoint)


IAM 구성 (Cluster Role / NodeGroup Role / Management Role)

Cluster에서 사용할 Role 생성 및 Policy 적용

  • Role Name : EKSCluster_Role
  • 신뢰관계 :eks.amazonaws.com
  • Policy : AmazonEKSClusterPolicy

 

NodeGroup에서 사용할 Role 생성 및 Policy 적용

  • Role Name : EKSNodeGroup_Role
  • 신뢰관계 :ec2.amazonaws.com
  • Policy : 
    • AmazonEKS_CNI_Policy
    • AmazonEC2ContainerRegistryReadOnly
    • AmazonEKSWorkerNodePolicy

 

Management에서 사용할 Role 생성 및 Policy 적용

  • Role Name : MGMT_Role
  • 신뢰관계 : ec2.amazonaws.com
  • Policy : Administrator (편의를 위해 Admin 권한을 주었음)

※ Cluster와 NodeGroup의 권한은 필요에 따라 추가해줘야 함

 

 

Security Group 생성

EKS Cluster, Node, Management 서버, VPC Endpoint에서 사용한 Security Group을 생성하고 Rule 반영한다.

* EKS 생성을 위한 최소한의 SG 규칙으로 반영하였음

 

EKS Cluster SG

유형 Protocol Port Source Destination
Inbound TCP 443 EKS Cluster SG  
Inbound TCP 443 EKS Node SG  
Outbound TCP 443   EKS Cluster SG
Outbound TCP 10250   EKS Cluster SG
Outbound TCP/UDP 53   EKS Cluster SG

 

EKS Node SG

유형 Protocol Port Source Destination
Inbound TCP 443 EKS Cluster SG  
Inbound TCP 22 EKS Management SG  
Outbound TCP 443   EKS Cluster SG
Outbound TCP 443   VPC Endpoint SG

 

EKS Management SG

유형 Protocol Port Source Destination
Inbound TCP 22 Bastion SG  
Outbound TCP 443   EKS Cluster SG
Outbound TCP 443   VPC Endpoint SG

 

VPC 엔드포인트 생성

인터넷 통신이 안 되는 프라이빗 환경에서 EKS를 생성하려면 아래와 같이 EKS 생성에 필요한 VPC 엔드포인트를 생성해야 한다.

  • ecr.dkr
  • ecr.api
  • ec2
  • autoscaling
  • cloudformation
  • sts
  • s3 (Gateway)

 

EKS 생성 작업

 

인터넷 통신이 안 되는 환경 구현을 위해 Bastion 서버에서 MGMT 서버로 접속한다.

MGMT 서버로 접속한 모습

 

aws cli / eksctl / kubectl 설치하기

aws cli

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

 

eksctl

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eksctl.html

 

kubectl (이 글에선 1.22 버전으로 진행하였음)

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html

위의 링크 그대로 참조하여 설치해 준다.

 

(위의 링크는 불친절하다.) bashrc에 추가해 주는 작업을 해준다.

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

sudo mv /tmp/eksctl /usr/local/bin export PATH=$PATH:/usr/local/bin

echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc

eksctl version

 

eksctl yaml 작성

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: EKS-Cluster-01
  region: ap-northeast-2
  version: "1.22"

iam:
  serviceRoleARN: arn:aws:iam::34##########:role/EKS-Cluster-Role

vpc:
  subnets:
    private:
      ap-northeast-2a: { id: subnet-0fbc2865591c13eef }
      ap-northeast-2c: { id: subnet-0c61085279b3d16d0 }
  securityGroup: sg-04808874a29700303
  clusterEndpoints:
    privateAccess: true
    publicAccess: true

cloudWatch:
  clusterLogging:
    enableTypes: [ "api", "audit", "authenticator", "controllerManager", "scheduler" ] # 선택사항

managedNodeGroups:
  - name: EKS-NodeGroup-01
    instanceType: t3.small
    minSize: 1
    maxSize: 1
    desiredCapacity: 1
    volumeSize: 10
    volumeType: gp3
    volumeKmsKeyID: arn:aws:kms:ap-northeast-2:34##########:key/cmk-key-id
    volumeEncrypted: true
    privateNetworking: true
    securityGroups:
      attachIDs:
        - sg-015993dc24f3180eb
    tags:
      nodegroup-role: worker
    iam:
      instanceRoleARN: arn:aws:iam::34##########:role/EKS-NodeGroup-Role
    ssh:
      allow: true
      publicKeyName: test

 

cmk로 EBS-key를 생성하였다면 key 사용자 권한에 Autoscaling Role을 추가해줘야 한다. 만약 추가 안 해준다면 노드가 생성되자마자 terminate 된다.

AWSServiceRoleForAutoScaling Role 추가

 

EKS 생성

eksctl 명령으로 EKS를 생성해 보자

eksctl create cluster -f [yaml 파일]

EKS Cluster 와 NodeGroup 생성

eksctl 명령으로 생성 시 CloudFormation Stack으로 클러스터와 노드그룹이 생성된다.

(그래서 VPC 엔드포인트 중 CloudFormation 엔드포인트가 필요)

 

 

 

yaml 파일처럼 1.22 버전의 EKS 클러스터가 생성된 것과 노드그룹이 생성된 것을 확인할 수 있다.

 

k 는 kubectl 명령을 alias로 하였다.

MGMT 서버에서도 확인해 보면 클러스터와 노드가 정상적으로 생성된 것을 확인할 수 있다.

 

 

EKS 콘솔에서 노드 및 리소스 확인하는 방법

 

 

 

위처럼 생성된 Node와 Pod가 AWS 콘솔에서 확인이 안 되고 있는데

"현재 사용자 또는 역할이 이 EKS cluster에 있는 Kubernetes 객체에 액세스 할 수 없습니다." 라는 문구가 나온다.

이것은 aws-auth ConfigMap에 권한이 없어서 나오는 문구이며 다음과 같이 하면 콘솔에서도 확인이 가능하다.

 

k edit -n kube-system cm/aws-auth

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::349460955611:role/EKS-NodeGroup-Role
      username: system:node:{{EC2PrivateDNSName}}
    - groups: ## 여기서부터 추가
      - system:masters
      rolearn: arn:aws:iam::34xxxxxxxxx:role/AWSReservedSSO_AdministratorAccess_XXXXXXXXX
      username: SSO_user
kind: ConfigMap
metadata:
  creationTimestamp: "XXXXXXXXXXXXXXX"
  name: aws-auth
  namespace: kube-system
  resourceVersion: "1967"
  uid: XXXXXXXXXXXXXXXXXXXXXXXXXXXX

현재 사용 중인 Role에 master 권한을 부여하고 저장 후 AWS 콘솔을 다시 확인해 보자.

 

 

AWS 콘솔에서도 확인 가능한 것을 볼 수 있다.

 

 

정리


프라이빗 환경에서 AWS EKS를 생성하는 방법에 대하여 알아보았다.

다시 정리해 보면

 

1. IAM Role 및 권한

2. Security Group

3. VPC 엔드포인트

4. aws cli / eksctl / kubectl install

5. eksctl yaml 작성

6. eksctl create cluster -f [yaml 파일]

7. EKS 생성 확인

 

이 정도만으로도 AWS EKS를 생성해 볼 수 있다.

 

마치며


개인적으로 EKS 설치는 어려우면서도 어렵지 않았다.(?)

다만, EKS 설치 후에 어떻게 운영과 유지보수를 하냐에 따라 EKS 활용이 천차만별로 달라지는 것 같다. EKS 업그레이드할 때 기존 클러스터에서 업그레이드 할 건지, 아니면 새로운 클러스터(버전 업)를 만들어서 거기에 내용물을 부울건지 등 업그레이드 플랜도 짜야하고 여러 가지 기능도 많아서 참 어려운 것 같다..

 

여하튼 이 글이 누군가에게는 도움이 되었으면 좋겠다.

 

참고자료


https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/sec-group-reqs.html

 

Amazon EKS 보안 그룹 요구 사항 및 고려 사항 - Amazon EKS

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/using-service-linked-roles.html

 

Amazon EKS에 대해 서비스 연결 역할 사용 - Amazon EKS

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

 

 

 

 

 

 

 

반응형