Karpenter의 docs에는 잘못된 부분들이 있습니다.
일부 유저에게는 크리티컬할 수도 있는 부분인데, 어떤 일이 있었는지 공유합니다.
[주의] 이 글은 Karpenter의 설치 방법과 작동 방식 등을 설명하는 내용은 전혀 아닙니다.
우선 EKS에 Karpenter를 설치하고 있었습니다.
이미 여러 방식으로 말려져 있는 karpenter 모듈/스택 등을 사용한다면 karpenter controller가 필요로 하는 여러 권한을 직접 입력할 필요는 없습니다.
하지만 저는 따끈따끈하게 나온 EKS Pod Identity를 쓰고 싶었고 karpenter가 필요로 하는 권한들을 직접 입력하였습니다.
karpenter controller가 필요로 하는 권한은 여러 문서에 적혀있습니다.
작업하기 귀찮음과 설명이 포함되어 있다는것 등의 여러 이유가 있기 때문에 하필 1번을 선택했습니다.
공식문서의 권한을 그대로 부여할 경우 두가지 문제가 발생합니다.
아직 정확한 karpenter에 대한 이해도가 부족할때였지만 문제는 원인은 직관적으로 찾을 수 있었습니다.
아래 권한은 해당 문제가 수정되기 전 권한입니다

이 권한은 karpenter.sh/cluster/클러스터명 태그의 값이 owned인 EC2 인스턴스에 한해서 karpenter controller가 karpenter.sh/nodeclaim과 Name 태그를 추가할 수 있도록 하는 권한입니다.
EKS를 많이 써보신 분은 눈에 익숙하지 않은 부분을 바로 찾을 수 있습니다
바로 karpenter.sh/cluster/클러스터명 입니다. EKS는 원래 kubernetes.io/cluster/클러스터명 태그를 사용합니다.
이제 바로 karpenter의 cloudformation.yaml 코드를 확인해봤습니다.
{
"Sid": "AllowScopedResourceTagging",
"Effect": "Allow",
"Resource": "arn:${AWS::Partition}:ec2:${AWS::Region}:*:instance/*",
"Action": "ec2:CreateTags",
"Condition": {
"StringEquals": {
"aws:ResourceTag/kubernetes.io/cluster/${ClusterName}": "owned"
},
"StringLike": {
"aws:ResourceTag/karpenter.sh/nodepool": "*"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"karpenter.sh/nodeclaim",
"Name"
]
}
}
역시나 kubernetres.io/cluster를 사용하고 있었습니다. 다행히 소스코드를 뜯어보기 전에 발견할 수 있었습니다.
바로 태그를 수정했고 노드는 정상적으로 join 됬으며 이 문제는 PR을 거쳐서 현재 karpenter docs에 정상적으로 반영되어 있습니다. (관련 PR)
이것저것 만지다 보니 또다른 문제를 찾았습니다. 바로 Spot Instance가 실행되지 않는것이였는데,
로그를 확인해보니 Spot을 실행할 권한이 없다고 나옵니다. 그래서 또 권한을 확인했습니다.
아래는 현재 작성되어 있는 karpenter의 공식 문서입니다.

진짜 spot-instance가 없습니다. (첨부하진 않았지만 tag를 추가하는 권한도 없습니다)
또다시 cloudformation.yaml 문서를 확인했습니다.
{
"Sid": "AllowScopedEC2InstanceActionsWithTags",
"Effect": "Allow",
"Resource": [
"arn:${AWS::Partition}:ec2:${AWS::Region}:*:fleet/*",
"arn:${AWS::Partition}:ec2:${AWS::Region}:*:instance/*",
"arn:${AWS::Partition}:ec2:${AWS::Region}:*:volume/*",
"arn:${AWS::Partition}:ec2:${AWS::Region}:*:network-interface/*",
"arn:${AWS::Partition}:ec2:${AWS::Region}:*:launch-template/*",
"arn:${AWS::Partition}:ec2:${AWS::Region}:*:spot-instances-request/*"
],
"Action": [
"ec2:RunInstances",
"ec2:CreateFleet",
"ec2:CreateLaunchTemplate"
],
"Condition": {
"StringEquals": {
"aws:RequestTag/kubernetes.io/cluster/${ClusterName}": "owned"
},
"StringLike": {
"aws:RequestTag/karpenter.sh/nodepool": "*"
}
}
},
역시나 이번에도 누락된것이 맞습니다 (CreateTag도 누락되어 있습니다).
이번에도 권한을 추가하니 정상적으로 Spot을 실행합니다. (관련 PR)
(이번 수정은 아직 PR이 merge되지 않았습니다. 하지만 간단한 문서 수정이니 문제없이 하루 이틀 사이에 merge 될겁니다)
이 과정을 통해 Karpenter 문서의 문제점들을 찾았습니다. 따로 작성하진 않았지만 슬프게도 문서상에 또다른 문제들이 존재하는것처럼 보이기도 합니다.
이러한 문제를 해결하는 과정은 나름 저를 설레게 합니다.
아마 다음에는 문서의 오류가 아닌 다른 종류로 karpenter 프로젝트에 기여할 수 있지 않을까 하는 기대를 가지고 있습니다.
아마도요??
karpenter 쓰다보니 이런 크리티컬한 문제가 있어서 프로비저닝 실패하는 이슈가 종종 있더라구요..
저만 겪는게 아니었군요... 2025년 8월 현재에도,, 문서만 보고 따라 했다가 삽질 몇번 끝에 해결되었습니다.