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 }
);
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
- https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/cni-increase-ip-addresses.html
- https://aws.amazon.com/ko/blogs/containers/amazon-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
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이 느리게 켜지는 문제가 있으니 주의해야합니다.