EC2 Keypair(.pem 파일)가 없다면 CLI를 통해 생성을 하고 있다면 기존 keypair를 사용하면 된다.
aws ec2 create-key-pair --region [Cluster Region] --key-name [Key 이름]
새로운 VPC 인프라 위에 EKS 생성
- 해당 명령을 통해 EKS를 생성하게 되면 VPC, Subnet, NAT Gateway, Security Group, Route Table 등 그에 맞는 새로운 네트워크 인프라들이 같이 자동으로 만들어지게 된다.
eksctl create cluster \
--name [EKS 클러스터 이름] \
--region [Cluster Region] \
--with-oidc \
--ssh-access \
--ssh-public-key [Key 이름] \
--instance-types=[EC2 타입] \
--managed
기존 VPC 인프라 위에 EKS 생성
- 설정해야할 요소들이 많이 있어 단순 CLI로는 힘들고 YAML 파일을 통해 생성을 한다.
create-cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: [EKS 클러스터 이름]
region: [Cluster Region]
version: "1.24"
vpc:
subnets:
private:
ap-northeast-2a: { id: subnet-xxx }
ap-northeast-2b: { id: subnet-xxx }
ap-northeast-2c: { id: subnet-xxx }
# IAM OIDC & Service Account
iam:
withOIDC: true
serviceAccounts:
- metadata:
name: aws-load-balancer-controller
namespace: kube-system
wellKnownPolicies:
awsLoadBalancerController: true
- metadata:
name: cert-manager
namespace: cert-manager
wellKnownPolicies:
certManager: true
- metadata:
name: efs-csi-controller-sa
namespace: kube-system
wellKnownPolicies:
efsCSIController: true
- metadata:
name: cluster-autoscaler
namespace: kube-system
wellKnownPolicies:
autoScaler: true
- metadata:
name: external-dns
namespace: kube-system
wellKnownPolicies:
externalDNS: true
managedNodeGroups:
- name: [node group name]
labels: { role: workers }
tags:
nodegroup-role: worker
instanceName: [Instance Name]
instanceType: [Instance Type]
minSize: 1
desiredCapacity: 2
maxSize: 3
privateNetworking: true
availabilityZones: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
eksctl create cluster -f [create-cluster.yaml 파일 경로]
Namespace 생성
- 리소스 격리를 위해 Spark Job 만을 위한 Namespace를 새로 생성한다.
kubectl create namespace [namespace 이름]
클러스터 사용자 인증
# EKS 클러스터에 IAM 사용자 인증 - 1
eksctl create iamidentitymapping \
--cluster [EKS Cluster 이름] \
--namespace [namespace 이름] \
--service-name "emr-containers"
# EKS 클러스터에 IAM 사용자 인증 - 2
eksctl create iamidentitymapping \
--cluster [EKS Cluster 이름] \
--arn "arn:aws:iam::[AWS 계정ID]:role/AWSServiceRoleForAmazonEMRContainers" \
--username emr-containers \
# OIDC와 IAM 연동
eksctl utils associate-iam-oidc-provider \
--cluster [EKS Cluster 이름] \
--approve
역할(Role) 생성
- json 파일을 통해 'EMRContainers-JobExecutionRole' 역할 생성
JobExecutionRole.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "elasticmapreduce.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name EMRContainers-JobExecutionRole \
--assume-role-policy-document file://[emr-trust-policy.json 파일 경로]
생성한 역할에 'emr-trust-policy' 정책 연결
- json 파일을 통해 'emr-trust-policy' 정책 생성
emr-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"logs:PutLogEvents",
"logs:CreateLogStream",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
]
}
aws iam put-role-policy \
--role-name EMRContainers-JobExecutionRole \
--policy-name EMR-Containers-Job-Execution \
--policy-document file://[EMR-Containers-Job-Execution.json 파일 경로]
EKS Cluster에 역할 연결(Role Update)
aws emr-containers update-role-trust-policy \
--cluster-name [EKS Cluster 이름] \
--namespace [namespace 이름] \
--role-name EMRContainers-JobExecutionRole
인증 정보를 kubeconfig 파일에 저장 (Kubeconfig Update)
aws eks \
--region [Region] update-kubeconfig \
--name [EKS Cluster 이름]