이 문서는 AWS Console 또는 CLI 활용하여 EKS 클러스터를 생성하는 방법을 단계별로 설명합니다.
먼저 EKS 구축을 위한 환경 구성을 참고하여 EKS 클러스터 관리를 위한 EC2 인스턴스를 생성 및 환경 구성 합니다.
환경을 구성한 후 AWS Console, AWS CloudFormation, eksctl 중 한가지 방법을 선택하여 EKS 클러스터를 생성합니다.
EKS 서비스 역할은 클러스터 생성에 필요한 최소 권한으로 생성합니다.
- AmazonEKSClusterPolicy
보안 그룹은 EKS 클러스터를 관리하기 위해 생성한 EC2 인스턴스를 Inbound 규칙에 추가하여 생성합니다.
- 유형 - HTTPS
- 프로토콜 - TCP
- 포트 - 443
- 소스 - <EC2 인스턴스 보안 그룹>
- 클러스터 생성 방법
- AWS Console, AWS CloudFormation, eksctl
- 클러스터 액세스
- 클러스터 인증 모드 - EKS API 및 ConfigMap
- 서브넷
- Private subnet
- 클러스터 엔드포인트 액세스
- Private
- 추가 기능 설치 (최신 버전)
- CoreDNS
- kube-proxy
- Amazon VPC CNI
- Amazon EKS Pod Identity 에이전트
클러스터에 적용할 IAM 역할을 생성합니다.
AWS Management Console > IAM 서비스 > 역할에서 역할 생성 버튼을 클릭합니다.
1단계 - 신뢰할수 있는 엔터티 선택
엔터티 유형은 AWS 서비스를, 서비스는 EKS Cluster를 선택합니다.
2단계 - 권한 추가
선택한 유형에 맞는 권한 정책을 확인할 수 있습니다.
3단계 - 이름 지정, 검토 및 생성
이름을 입력한 후 역할을 생성합니다.
EKS 클러스터에 적용할 보안 그룹을 생성합니다.
인바운드 규칙에는 EKS 클러스터 관리를 위해 생성한 EC2 인스턴스의 보안 그룹을 추가해줍니다.
AWS Management Console > EKS 서비스에서 클러스터 생성 버튼을 클릭합니다.
1단계 - 클러스터 구성
이름을 입력하고 Kubernetes 버전 중 지원 가능한 최신 버전을 선택합니다.
클러스터 서비스 역할은 1-1에서 생성한 역할을 선택합니다.
IAM 보안 주체의 클러스터 액세스 권한 설정을 하고 인증 모드를 선택합니다.
2단계 - 네트워킹 지정
VPC와 서브넷을 설정하고 컨트롤 플레인 서브넷에서 생성된 EKS ENI에 적용할 보안 그룹을 선택합니다.
클러스터의 엔드포인트에 대한 액세스 권한은 프라이빗으로 선택합니다.
3단계 - 관찰 기능 구성
Amazon EKS 데이터 관찰 기능을 구성합니다.
4단계 - 추가 기능 선택
추가 기능을 선택하여 클러스터를 개선합니다.
1. CoreDNS - DNS 서비스 제공하여 검색 활성화
2. kube-proxy - 서비스를 지원하는 파드와의 통신 허용
3. Amazon VPC CNI - 파드가 VPC 네트워크에서와 동일한 IP 주소를 가질 수 있음
4. Amazon EKS Pod Identity 에이전트 - Kubernetes 서비스 계정을 통해 파드에 AWS IAM 권한 부여
5단계 - 선택한 추가 기능 설정 구성
클러스터에 대한 추가 기능을 구성합니다.
선택한 추가 기능의 버전은 지원 가능한 최신 버전을 선택합니다.
6단계 - 검토 및 생성
1~5단계에서 설정한 항목들을 확인한 후 클러스터를 생성합니다.
AWS CloudFormation을 사용하여 EKS 클러스터를 생성하기 위해 EKS 관리용 EC2 인스턴스에 ssh 접속합니다.
- EKS 서비스 역할
- EKS 클러스터
- Addon
CloudFormation을 사용하여 스택을 생성하기 위해 파일을 생성합니다.
AWSTemplateFormatVersion: '2010-09-09'
Description: AWS CloudFormation template to create an Amazon EKS cluster with specified addons and configurations
Parameters:
ClusterName:
Type: String
Description: Name for the EKS cluster
Resources:
EKSServiceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- eks.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
Tags:
- Key: Name
Value: <ROLE_NAME>
EKSCluster:
Type: AWS::EKS::Cluster
Properties:
AccessConfig:
AuthenticationMode: API_AND_CONFIG_MAP # Cluster auth mode
Name: !Ref ClusterName
Version: "1.30" # Specify your desired Kubernetes version
RoleArn: !GetAtt EKSServiceRole.Arn # Cluster role arn
ResourcesVpcConfig:
SecurityGroupIds: # Add security group IDs if needed
- <SECURITY_GROUP_ID>
SubnetIds:
- <SUBNET_ID> # private subnet ID
- <SUBNET_ID> # private subnet ID
EndpointPublicAccess: false # Set public access to false
EndpointPrivateAccess: true # Set private access to true
CoreDNSAddon:
Type: AWS::EKS::Addon
DependsOn: EKSCluster
Properties:
ClusterName: !Ref ClusterName
AddonName: coredns
AddonVersion: "v1.11.1-eksbuild.9"
KubeProxyAddon:
Type: AWS::EKS::Addon
DependsOn: EKSCluster
Properties:
ClusterName: !Ref ClusterName
AddonName: kube-proxy
AddonVersion: "v1.30.0-eksbuild.3"
VPCCNIAddon:
Type: AWS::EKS::Addon
DependsOn: EKSCluster
Properties:
ClusterName: !Ref ClusterName
AddonName: vpc-cni
AddonVersion: "v1.18.2-eksbuild.1"
PodIdentityAddon:
Type: AWS::EKS::Addon
DependsOn: EKSCluster
Properties:
ClusterName: !Ref ClusterName
AddonName: eks-pod-identity-agent
AddonVersion: "v1.3.0-eksbuild.1"
Outputs:
ClusterName:
Description: Name of the created Amazon EKS cluster
Value: !Ref ClusterName
Export:
Name: !Sub ${AWS::StackName}-ClusterName
파일을 생성 및 구성한 후 아래 명령줄을 사용하여 cloudformation의 스택을 생성합니다.
aws cloudformation create-stack \ --stack-name <STACK_NAME> \ --template-body file://<FILE_NAME> \ --parameters ParameterKey=ClusterName,ParameterValue=<PARAMETER_VALUE> \ --capabilities CAPABILITY_IAM
EKS에서 클러스터를 생성하기 위한 CLI 도구인 eksctl을 사용하기 위해 EKS 관리용 EC2 인스턴스에 ssh 접속합니다.
1-1과 동일하게 클러스터에 적용할 IAM 역할을 생성합니다.
eksctl cli로 EKS 클러스터 생성하기 위한 파일을 구성합니다.
cat > eks-cluster.yaml <<EOF
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: <eks-cluster-name> # eks cluster name
region: ap-northeast-2 # region code
iam:
withOIDC: true
serviceRoleARN: <service-role-arn> # cluster iam role arn
vpc:
subnets:
private:
ap-northeast-2a:
id: <subnet-id> # private subnet id
ap-northeast-2c:
id: <subnet-id> # private subnet id
clusterEndpoints:
publicAccess: false # Set public access to false
privateAccess: true # Set private access to true
accessConfig:
authenticationMode: API_AND_CONFIG_MAP # Cluster auth mode
addons:
- name: coredns
version: "v1.11.1-eksbuild.9"
- name: kube-proxy
version: "v1.30.0-eksbuild.3"
- name: vpc-cni
version: "v1.18.2-eksbuild.1"
- name: eks-pod-identity-agent
version: "v1.3.0-eksbuild.1"
EOF
eksctl create 명령어와 위에서 구성한 파일을 사용하여 cluster를 생성합니다.
eksctl create cluster -f <file-name>
kubectl 명령줄 도구는 kubeconfig 파일의 구성 정보를 사용하여 클러스터의 API 서버와 통신하기 때문에 생성한 클러스터에 대한 kubeconfig 파일을 생성하거나 기존 파일을 업데이트 해야 합니다.
EKS 관리용 인스턴스에 접속하여 kubeconfig 파일을 업데이트 합니다.
aws eks update-kubeconfig --region <region-code> --name <cluster-name>
클러스터에는 OpenID Connect(OIDC) 발급자 URL이 연결되어 있습니다.
서비스 계정에 AWS Identity and Access Management(IAM) 역할을 사용하려면 클러스터의 OIDC 발급자 URL에 IAM OIDC 제공업체가 있어야 합니다.
1단계 - 클러스터 OIDC URL 복사
클러스터 상세 정보에 있는 OIDC 공급자 URL을 복사합니다.
2단계 - 자격 증명 공급자 추가
IAM 콘솔 > 액세스 관리 > 자격 증명 공급자를 선택하여 클러스터의 OIDC URL과 일치하는 공급자가 있는지 확인하고 없는 경우 공급자를 추가합니다.
Kubernetes 파드가 VPC 네트워크와 동일한 IP 대역을 할당하여 직접 통신이 가능하게 하기 위해 VPC-CNI를 설정합니다.
1단계 - CNI 역할 생성
IAM > 역할 생성 화면에서 엔터티를 선택합니다.
엔터티 유형 - 웹 자격 증명
자격 증명 공급자 - OIDC 자격 증명 공급자 생성에서 추가한 자격 증명 공급자 선택
Audience - sts.amazonaws.com
권한 추가 단계에서 AmazonEKS_CNI_Policy를 선택합니다.
이름 지정 및 설정한 정보를 검토한 후 역할을 생성합니다.
2단계 - 신뢰 정책 편집
생성한 역할의 신뢰 정책을 편집하여 아래 항목을 추가합니다."oidc.eks.region-code.amazonaws.com/id/<OIDC_ID>:sub": "system:serviceaccount:kube-system:aws-node",
3단계 - VPC CNI 구성
EKS > 클러스터 > 추가 기능 > vpc-cni의 IAM 역할에 위에서 생성한 IAM CNI 역할을 선택합니다.
kubectl 명령어를 사용하여 클러스터 구성을 확인합니다.
kubectl cluster-info
aws-auth ConfigMap은 관리형 노드 그룹을 생성하거나 eksctl을 사용하여 노드 그룹을 생성할 때 자동으로 생성되어 클러스터에 적용됩니다.
이 ConfigMap은 처음에는 노드를 클러스터에 조인하기 만들어졌으나 ConfigMap을 사용하여 IAM 보안 주체에 역할 기반 액세스 제어(RBAC) 액세스를 추가할 수도 있습니다.
kubectl describe configmap -n kube-system aws-auth
aws-auth 확인 시 not found 에러가 발생하는 경우 aws-auth ConfigMap을 수동으로 생성하여 IAM 역할을 Kubernetes RBAC에 연결해야 합니다.
Error from server (NotFound): configmaps "aws-auth" not found
1단계 - IAM 역할 확인
EKS 클러스터를 생성할 때 사용한 IAM 역할의 ARN을 확인합니다.
해당 역할에는 EKS 클러스터에 대한 접근 권한이 있어야 합니다.
2단계 - aws-auth ConfigMap 생성
aws-auth ConfigMap을 생성하려면 kubectl을 사용하여 YAML 파일을 작성해야 합니다.
아래 예시를 참고하여 필요한 값을 수정한 후 YAML 파일을 구성합니다.apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: arn:aws:iam::<YOUR_ACCOUNT_ID>:role/<YOUR_EKS_ROLE> username: <USERNAME> groups: - system:masters # 이 역할에 cluster-admin 권한을 부여합니다. 필요에 따라 조정하세요. mapUsers: | - userarn: arn:aws:iam::<YOUR_ACCOUNT_ID>:user/<YOUR_IAM_USER> username: <USERNAME> groups: - system:masters # 이 사용자가 cluster-admin 권한을 가지게 됩니다.3단계 - aws-auth ConfigMap 적용
kubectl apply -f aws-auth.yaml