본문 바로가기

EKS/EKS Cluster

EKS Cluster 구축 - 2. VPC, Subnet, IAM, EKS Cluster 생성

먼저 AWS 기본 구성 구축 - 2 까지의 구축을 끝내주신 후,

vpc에서 dns 확인 및 호스트 이름을 활성화 해주겠습니다.

 

 

DNS를 활성화하는 이유는 AWS에서 EKS Master와 ETCD 노드를 관리하기 위해 EKS 플랫폼에 구축을 하게 되는데,

이 플랫폼안에 만들어진 마스터와 제 VPC Worker Node는 Private Link로 통신을 하게 되기 때문에

VPC Endpoints 구성을 위해서는 DNS에 관한 부분이 모두 활성화 되어야 제대로 클러스터가 구성될 수 있습니다.

 


 

이제 그러면, Cluster Role과 Worker Node Role을 각각 만들어 주겠습니다.

 

먼저 EKS Cluster Role입니다.

IAM Role을 콘솔에서 만드실 경우 EKS를 선택하시고 아래 Policy를 추가 시켜주시면 됩니다.

 

 

만약 CLI를 통해 만들고자 하신다면 아래와 같이 수행해주시면 됩니다. (롤 이름은 알아서 바꿔주세요)

 

cat > eks-cluster-role.json << EOF
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "eks.amazonaws.com"
			},
			"Action": "sts:AssumeRole"
		}
	]
}
EOF
aws iam create-role --role-name eks-cluster-role --assume-role-policy-document file://eks-cluster-role.json
aws iam attach-role-policy --role-name eks-cluster-role --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
aws iam attach-role-policy --role-name eks-cluster-role --policy-arn arn:aws:iam::aws:policy/AmazonEKSServicePolicy

 

다음은 Worker Node Role을 만들어 주겠습니다.

콘솔에서 만드실 경우 서비스를 EC2로 골라주신 후 아래 Policy를 연결해주시면 됩니다.

 

 

먼저 WorkerNode Policy, 그리고 컨테이너 이미지에 접근이 가능해야하니 ECR

저는 로그 중앙화만 FluentD - Cloudwatch 연동을 할 예정이기 때문에 CloudwatchLogsFullAccess를 주었습니다.

그리고 앞서 인트로에서 말씀드렸듯이 VPC의 CIDR를 가지고 매핑해서 구성하기 때문에 CNI와 관련된 Policy

ELB를 구성하게 되었을 때, 자동적으로 DNS 매핑을 구성하기 위해 Route53 Policy,

HPA, AutoScailer와 같은 정책을 수행하기 위해서는 EKS-AutoScailer

ALB 연동을 위한 ALBIngreddControllerIAMPolicy까지 만들어주시면 됩니다.

 

CLI를 통해 구성하시면 다음과 같습니다.

마지막 Custom policy에 대해서는 꼭 자신의 계정 번호를 입력해주시기 바랍니다.

cat > eks-worker-role.json << EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
EOF
aws iam create-role --role-name eks-worker-role --assume-role-policy-document file://eks-worker-role.json
aws iam attach-role-policy --role-name eks-worker-role --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
aws iam attach-role-policy --role-name eks-worker-role --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
aws iam attach-role-policy --role-name eks-worker-role --policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
aws iam attach-role-policy --role-name eks-worker-role --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
aws iam attach-role-policy --role-name eks-worker-role --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess
cat > EKSAutoscailerPolicy.json << EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeLaunchConfigurations",
                "autoscaling:DescribeTags",
                "autoscaling:SetDesiredCapacity",
                "autoscaling:TerminateInstanceInAutoScalingGroup",
                "ec2:DescribeLaunchTemplateVersions"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
EOF
aws iam create-policy --policy-name EKSAutoscailerPolicy --policy-document file://EKSAutoscailerPolicy.json
aws iam attach-role-policy --role-name eks-worker-role --policy-arn arn:aws:iam::{account-number}:policy/EKSAutoscailerPolicy

 

cat > ALBIngressControllerPolicy.json <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "acm:DescribeCertificate",
                "acm:ListCertificates",
                "acm:GetCertificate"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CreateSecurityGroup",
                "ec2:CreateTags",
                "ec2:DeleteTags",
                "ec2:DeleteSecurityGroup",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAddresses",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeTags",
                "ec2:DescribeVpcs",
                "ec2:ModifyInstanceAttribute",
                "ec2:ModifyNetworkInterfaceAttribute",
                "ec2:RevokeSecurityGroupIngress"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:AddListenerCertificates",
                "elasticloadbalancing:AddTags",
                "elasticloadbalancing:CreateListener",
                "elasticloadbalancing:CreateLoadBalancer",
                "elasticloadbalancing:CreateRule",
                "elasticloadbalancing:CreateTargetGroup",
                "elasticloadbalancing:DeleteListener",
                "elasticloadbalancing:DeleteLoadBalancer",
                "elasticloadbalancing:DeleteRule",
                "elasticloadbalancing:DeleteTargetGroup",
                "elasticloadbalancing:DeregisterTargets",
                "elasticloadbalancing:DescribeListenerCertificates",
                "elasticloadbalancing:DescribeListeners",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:DescribeLoadBalancerAttributes",
                "elasticloadbalancing:DescribeRules",
                "elasticloadbalancing:DescribeSSLPolicies",
                "elasticloadbalancing:DescribeTags",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:DescribeTargetGroupAttributes",
                "elasticloadbalancing:DescribeTargetHealth",
                "elasticloadbalancing:ModifyListener",
                "elasticloadbalancing:ModifyLoadBalancerAttributes",
                "elasticloadbalancing:ModifyRule",
                "elasticloadbalancing:ModifyTargetGroup",
                "elasticloadbalancing:ModifyTargetGroupAttributes",
                "elasticloadbalancing:RegisterTargets",
                "elasticloadbalancing:RemoveListenerCertificates",
                "elasticloadbalancing:RemoveTags",
                "elasticloadbalancing:SetIpAddressType",
                "elasticloadbalancing:SetSecurityGroups",
                "elasticloadbalancing:SetSubnets",
                "elasticloadbalancing:SetWebACL"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "iam:GetServerCertificate",
                "iam:ListServerCertificates"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cognito-idp:DescribeUserPoolClient"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "waf-regional:GetWebACLForResource",
                "waf-regional:GetWebACL",
                "waf-regional:AssociateWebACL",
                "waf-regional:DisassociateWebACL"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "tag:GetResources",
                "tag:TagResources"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "waf:GetWebACL"
            ],
            "Resource": "*"
        }
    ]
}
EOF

aws iam create-policy --policy-name ALBIngressControllerPolicy --policy-document file://ALBIngressControllerPolicy.json
aws iam attach-role-policy --role-name eks-worker-role --policy-arn arn:aws:iam::{account-number}:policy/ALBIngressControllerPolicy

 


자, 이제 콘솔에서 EKS Cluster를 구성할 수 있습니다.

Security Group은 Cluster SG와 Worker Node SG가 서로 세팅되야 하는 부분이 많은데,

워커노드에 대한 SG만 고르게끔 되어있어서 아에 구성하지 않고 넘어간 뒤에 만들어지면 수정해주도록 하겠습니다.

 

또한 여기서 프라이빗하게 구성해서 사용할 건데 퍼블릭 서브넷은 선택을 왜 해야하나?? 라고 생각하실 수 있는데,

ELB 구성을 kubectl과 yaml을 통해 내부에서만 만들고 Pod들과 매핑할 수 있기 때문에

퍼블릭 서브넷을 클러스터안에서 포함시켜 구성하지 않을 경우에는 Private ELB 밖에 구성할 수 없습니다.

따라서 퍼블릭 ELB를 통해 내부망 통신으로 내부 워커노드들과 통신하는 형태를 구성하시려면

꼭 Public 서브넷까지 포함시켜서 클러스터를 구성해주셔야 합니다.

 

 

 

 

어차피, Bastion을 통해서 컨트롤할 예정이기 때문에 퍼블릭 API 엑세스는 차단하겠습니다.

 


다음 포스트에서는 Node Group을 만들어서 쿠버네티스 서비스를 올릴 수 있는 서버세팅과

이를 컨트롤할 서버를 세팅하도록 하겠습니다.