AWS 카펜터 v0.27 to v0.32 업그레이드 작업 내용을 공유합니다. 작업하면서 장애도 있었고 실수도 있어 아마도 다른 분들에게 도움이 될 것 같습니다.
업그레이 작업을 하게된 이유는 카펜터 Spot 노드 최적화가 v0.34부터 지원하기 때문입니다. 24년 10월 기준 카펜터 최신 버전은 v1.1.0 인데, 바로 최신 버전으로 업그레이드 하고 싶었는데, provisioner, awsnodetemplte 등 기존 자원에 대한 dual support가 필요하여 v0.32 으로 먼저 업그레이드 했습니다.
기존 현황입니다.
(eks_dive-dev:karpenter)dev$ helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
karpenter karpenter 20 2024-05-30 14:35:08.947242 +0900 KST deployed karpenter-v0.27.3 0.27.3
작업 전에 기존 awsnodetemplate, provisioner 참조하여 새로운 nodepool, ec2nodeclass 자원을 준비하였습니다. 참조
그럼, 상세 작업 내역을 공유합니다.
AWS SQS, Karpenter Noderole Role 생성
- Cloudformation 이용
curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/"${KARPENTER_VERSION}"/website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml > $TEMPOUT \
&& aws cloudformation deploy \
--stack-name "Karpenter-${CLUSTER_NAME}" \
--template-file "${TEMPOUT}" \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides "ClusterName=${CLUSTER_NAME}"
Karpenter Controller Role 생성
- aws cli 이용
- karpenter noderole은 앞에서 만들었고 controller role 부문만 추가
- 주의 사항이 Controller policy가 앞에서 생성한 policy와 달라 2가지 policy 모두 controller role에 추가
참조 : migrating from cluster autoscaler
- passrole policy 추가
- 기존 {cluster-name}-karpenter Role의 passrole 추가
- 헬름 업그레이드 후 기존 awsnodetemplate 리소스도 같이 사용해서 Role 필요한 듯
- 이부분도 가이드는 없었는데, 아마도 내가 잘못 설정한 부분이 있는지 에러가 발생하여 에러 메시지를 보고 수정하였다.
aws-auth 권한 수정
- kapenter node role 권한 추가
- groups:
- system:bootstrappers
- system:nodes
## If you intend to run Windows workloads, the kube-proxy group should be specified.
# For more information, see https://github.com/aws/karpenter/issues/5099.
# - eks:kube-proxy-windows
rolearn: arn:${AWS_PARTITION}:iam::${AWS_ACCOUNT_ID}:role/KarpenterNodeRole-${CLUSTER_NAME}
username: system:node:{{EC2PrivateDNSName}}
기존 워커노드 ec2의 karpenter.sh/nodepool 태그 추가
- 노드 drain 작업 이 후 카펜터가 이전 노드를 제거하기 위하여 필요
카펜터 헬름 업그레이드
- helm diff 명령어로 먼저 변경되는 리소스를 확인하고 작업 실행
신규 nodepool, ec2nodeclass 자원 생성
기존 provisioner 자원 taint 설정
- provisioner가 아닌 nodepool 통하여 새로운 노드가 생성될 수 있도록
- karpenter.sh/legacy=true:NoSchedule
- provisioner YAML 파일에 taint 설정 추가하여 적용
기존 provisioner로 생성한 노드 drain 실행
- nodepool를 이용한 노드로 전체 파드를 이전하는 작업이다.
기존 자원 전체 삭제 확인
- k get machines 에 자원 없음 확인 후 provisioner, awsnodetemplate 자원 삭제
kubectl delete provisioners --all
kubectl delete awsnodetemplates --all
2,3개 클러스터 작업까지 에러가 발생하였으나 이 후 작업 내역을 정리한 이후는 별 문제없이 작업을 완료할 수 있었다.
아직 v1.1.0으로 업그레이드 작업은 하지 않았는데, 해당 작업은 좀 더 수월하기를 기대해본다. 그리고 Spot 노드 최적화도 효과가 있으면 좋겠구.
'쿠버네티스 일반' 카테고리의 다른 글
topologySpreadConstraints - matchLabelKeys 옵션 (2) | 2024.09.05 |
---|---|
EKS Burstable 설정과 KRR을 활용한 비용 절감 내역 공유 (2) | 2024.06.24 |
쿠버네티스 베스트 프랙티스 레이블 및 헬름 레이블 적용 (0) | 2024.06.17 |
쿠버스택 창업? (4) | 2023.03.20 |
GitOps 기반 시스템 운영 (0) | 2023.03.11 |