시작
인터넷 통신이 안 되는 환경에서 일하며 AWS EKS를 생성해야 했다. 처음엔 EKS에 대한 지식이 없어서 구글링과 AWS 공식 문서를 보며 생성해 보았지만 쉽지 않았다. 하지만 여러 시행착오를 겪으면서 생성에 성공하였고 eksctl을 활용하여 EKS를 생성하였다. (VPC, 서브넷 등은 AWS 콘솔에서 생성하였음)
이 글에서는 최대한 프라이빗(폐쇄망) 환경처럼 사용하기 위해 퍼블릭 통신이 되는 Bastion 서버를 앞에 두고 뒷단에는 프라이빗 공간에 EKS 설치를 위한 Management 서버를 두었다.
아키텍처는 아래 그림과 같다.
아키텍처
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 서버로 접속한다.
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 된다.
EKS 생성
eksctl 명령으로 EKS를 생성해 보자
eksctl create cluster -f [yaml 파일]
eksctl 명령으로 생성 시 CloudFormation Stack으로 클러스터와 노드그룹이 생성된다.
(그래서 VPC 엔드포인트 중 CloudFormation 엔드포인트가 필요)
yaml 파일처럼 1.22 버전의 EKS 클러스터가 생성된 것과 노드그룹이 생성된 것을 확인할 수 있다.
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
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/using-service-linked-roles.html
'AWS' 카테고리의 다른 글
AWS EC2에 terraform 설치하기 (0) | 2023.03.19 |
---|---|
[AWS] EKS 생성 환경 구축 (eksctl 활용) (0) | 2023.02.26 |
두 개의 EC2 인스턴스 간의 SSH 설정을 통해 Ansible로 통신 확인하기 (0) | 2021.04.04 |
[AWS 실습] VPN을 이용한 하이브리드 클라우드 구축하기 part 1 (0) | 2021.02.26 |
[AWS] 자격증 준비 및 합격 후기 (1) | 2021.02.07 |