Skip to main content

EKS


Create

VPC & Subnet

kubernetes.io/cluster/<cluster-name>: <shared|owned> 태그를 추가해주세요.

Role

const roleName = "eks-role";
const role = new aws.iam.Role(
roleName,
{
namePrefix: `${roleName}-`,
assumeRolePolicy: {
Version: "2012-10-17",
Statement: [
{
Effect: "Allow",
Principal: {
Service: "eks.amazonaws.com",
},
Action: "sts:AssumeRole",
},
],
},
tags: {
Name: roleName,
"loliot.net/stack": variable.stackName,
},
},
{ protect: true },
);

const clusterPolicyARNs = {
"0": "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy",
};

const rpas = Object.entries(clusterPolicyARNs).map(
([i, arn]) =>
new aws.iam.RolePolicyAttachment(
`eks-rpa-${i}`,
{
policyArn: arn,
role: role.name,
},
{ protect: true },
),
);

Cluster

const clusterName = "eks";
export const cluster = new aws.eks.Cluster(
clusterName,
{
name: clusterName,
version: "1.28",
roleArn: role.arn,
vpcConfig: {
endpointPublicAccess: true,
subnetIds: [
vpc.privateSubnet1.id,
vpc.privateSubnet2.id,
vpc.privateSubnet3.id,
vpc.privateSubnet4.id,
],
},
kubernetesNetworkConfig: { serviceIpv4Cidr: "10.96.0.0/16" },
tags: {
Name: clusterName,
"loliot.net/stack": variable.stackName,
},
},
{ dependsOn: [...rpas], protect: true },
);
info

Cluster를 생성할 때 설정하는 subnetIds는 EKS 마스터와 워커가 통신하기 위해 2~4 개의 ENI를 추가할 서브넷을 선택하기 위한 설정입니다. 해당 ENI의 설명은 Amazon EKS <clusterName>로 표시됩니다.

워커와 통신을 위해 설정하는 서브넷일 뿐, 워커가 배포될 서브넷 전체를 설정하는 것은 아닙니다.

aws eks list-clusters
aws eks update-kubeconfig \
--name <cluster-name> \
--region <region> \
--kubeconfig ~/.kube/<cluster-name>_config
export KUBECONFIG=<config-path>[:<config-path>]

OIDC


  • EKS - 클러스터 - 개요 - 세부 정보
    • OpenID Connect 공급자 URL 복사
  • IAM - 액세스 관리(Access management) - 자격 증명 공급자(Identity Providers) - 공급자 추가
    • OpenID Connect
    • 공급자 URL 붙여넣기
    • 지문 가져오기
const oidcProviderName = "eks-oidc-provider";
export const oidcProvider = new aws.iam.OpenIdConnectProvider(
oidcProviderName,
{
url: cluster.identities[0].oidcs[0].issuer,
clientIdLists: ["sts.amazonaws.com"],
thumbprintLists: ["**********"],
tags: {
Name: oidcProviderName,
"loliot.net/stack": variable.stackName,
},
},
{ protect: true },
);

VPC CNI increases pods per node limits

ENABLE_PREFIX_DELEGATION를 사용하면 ENI에 (/28) CIDR 블록이 할당됩니다. Pod이 하나만 있는 Node에 (/28) CIDR 블록이 2 개 할당되어 있는 경우, Node IP, Pod IP 2개를 제외한 30개의 IP는 다른 Node에서 사용할 수 없습니다.

kubectl set env daemonset aws-node -n kube-system \
ENABLE_PREFIX_DELEGATION=true
warning

pulumi를 사용할 때, NodeGroup 생성 전에 이 작업을 진행해야 UserData의 --kubelet-extra-args가 자동으로 설정됩니다.

WARM_PREFIX_TARGET=1로 설정한 경우 아무것도 할당되지 않은 (/28) CIDR 블록 1 개를 유지하도록 네트워크가 구성됩니다.

kubectl set env daemonset aws-node -n kube-system \
WARM_PREFIX_TARGET=1

남는 IP를 최소화 하기 위해서는 WARM_PREFIX_TARGET=1 대신 WARM_IP_TARGET=1, MINIMUM_IP_TARGET=1을 설정하면 됩니다. 대신 할당된 IP를 모두 소진한 상태에서 새로운 Pod이 추가되면 새로운 (/28) CIDR 블록을 ENI에 할당한 후 IP를 할당하기 때문에 Pod이 느리게 켜지는 문제가 있으니 주의해야합니다.