[Kubernetes] AWS EKS Cluster 생성

강준혁·2021년 3월 9일
0

Create cluster 클릭

클러스터명, 버전, Role 설정

Role : 디폴트로 생성되어 있는 AWSServiceRoleForAmazonEKS 를 사용한다.

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/service_IAM_role.html 참조.

VPC, Subnets, Security group, Cluster endpoint access 설정

Subnets : 2개 이상의 가용영역과 각 가용영역의 public/private 서브넷을 생성하여 등록.

  • Private 서브넷만 등록 하는 경우 모든 포드에 대해 외부에서 접근이 불가능.
  • Public 서브넷만 등록 하는 경우 노드 포함 모든 리소스가 퍼블릭에 생성됨.
  • 보통의 경우에는 필요에 따라 퍼블릭/프라이빗 서브넷에 적절히 배치해야 하므로 둘 다 등록하여준다.
  • https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/network_reqs.html 참조.

Security Group : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/sec-group-reqs.html 참조. 여기서 설정하는 보안그룹은 워커 노드에 대한 보안그룹이므로 해당 참조 페이지의 노드 보안그룹 권장 인바운드/아운바운드 대로 설정한다.

Cluster endpoint access : 운영 환경은 private 으로 하여야 하나, 일단 개발용이므로 public 으로 설정.

Node group 생성

pod 들이 생성될 Node group 을 생성한다.
EKS cluster > configuration > Add Node Group

Service Role 의 경우, 기존에 디폴트로 제공되는 NodeInstanceRole 을 사용
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-node-role.html 참조.

** 상기 내용으로만 했을 때 Node가 정상적으로 생성되지 않는 현상이 확인되었다.
아래와 같이 NodeGroupRole 설정을 하면 잘 되나... 불필요한 role 식별 및 제거가 필요할 듯 하다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SharedSecurityGroupRelatedPermissions",
            "Effect": "Allow",
            "Action": [
                "ec2:RevokeSecurityGroupIngress",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:DescribeInstances",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:DeleteSecurityGroup"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "ec2:ResourceTag/eks": "*"
                }
            }
        },
        {
            "Sid": "EKSCreatedSecurityGroupRelatedPermissions",
            "Effect": "Allow",
            "Action": [
                "ec2:RevokeSecurityGroupIngress",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:DescribeInstances",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:DeleteSecurityGroup"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "ec2:ResourceTag/eks:nodegroup-name": "*"
                }
            }
        },
        {
            "Sid": "LaunchTemplateRelatedPermissions",
            "Effect": "Allow",
            "Action": [
                "ec2:DeleteLaunchTemplate",
                "ec2:CreateLaunchTemplateVersion"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "ec2:ResourceTag/eks:nodegroup-name": "*"
                }
            }
        },
        {
            "Sid": "AutoscalingRelatedPermissions",
            "Effect": "Allow",
            "Action": [
                "autoscaling:UpdateAutoScalingGroup",
                "autoscaling:DeleteAutoScalingGroup",
                "autoscaling:TerminateInstanceInAutoScalingGroup",
                "autoscaling:CompleteLifecycleAction",
                "autoscaling:PutLifecycleHook",
                "autoscaling:PutNotificationConfiguration"
            ],
            "Resource": "arn:aws:autoscaling:*:*:*:autoScalingGroupName/eks-*"
        },
        {
            "Sid": "AllowAutoscalingToCreateSLR",
            "Effect": "Allow",
            "Condition": {
                "StringEquals": {
                    "iam:AWSServiceName": "autoscaling.amazonaws.com"
                }
            },
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "*"
        },
        {
            "Sid": "AllowASGCreationByEKS",
            "Effect": "Allow",
            "Action": [
                "autoscaling:CreateOrUpdateTags",
                "autoscaling:CreateAutoScalingGroup"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:TagKeys": [
                        "eks",
                        "eks:cluster-name",
                        "eks:nodegroup-name"
                    ]
                }
            }
        },
        {
            "Sid": "AllowPassRoleToAutoscaling",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "autoscaling.amazonaws.com"
                }
            }
        },
        {
            "Sid": "AllowPassRoleToEC2",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEqualsIfExists": {
                    "iam:PassedToService": [
                        "ec2.amazonaws.com",
                        "ec2.amazonaws.com.cn"
                    ]
                }
            }
        },
        {
            "Sid": "PermissionsToManageResourcesForNodegroups",
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "ec2:CreateLaunchTemplate",
                "ec2:DescribeInstances",
                "iam:GetInstanceProfile",
                "ec2:DescribeLaunchTemplates",
                "autoscaling:DescribeAutoScalingGroups",
                "ec2:CreateSecurityGroup",
                "ec2:DescribeLaunchTemplateVersions",
                "ec2:RunInstances",
                "ec2:DescribeSecurityGroups",
                "ec2:GetConsoleOutput",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSubnets"
            ],
            "Resource": "*"
        },
        {
            "Sid": "PermissionsToCreateAndManageInstanceProfiles",
            "Effect": "Allow",
            "Action": [
                "iam:CreateInstanceProfile",
                "iam:DeleteInstanceProfile",
                "iam:RemoveRoleFromInstanceProfile",
                "iam:AddRoleToInstanceProfile"
            ],
            "Resource": "arn:aws:iam::*:instance-profile/eks-*"
        },
        {
            "Sid": "PermissionsToManageEKSAndKubernetesTags",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "aws:TagKeys": [
                        "eks",
                        "eks:cluster-name",
                        "eks:nodegroup-name",
                        "kubernetes.io/cluster/*"
                    ]
                }
            }
        }
    ]
}

eksctl 설치

eksctl : AWS EKS API 와 통신하기 위한 Cli 프로그램.

brew tap weaveworks/tap
brew install weaveworks/tap/eksctl

kubectl 설치

$ curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.18.9/2020-11-02/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
$ kubectl version --short --client

kubectl 에 생성한 EKS 를 연결.

시스템에 AWS CLI 버전 1.16.308 이상이 설치되어있는지 확인

$ aws --version

생성한 클러스터 정보 입력

$ aws eks --region region update-kubeconfig --name cluster_name

잘 연결되었는지 확인

$ kubectl get svc
profile
백엔드 개발자

0개의 댓글