쿠버네티스 일반

카펜터 v0.27 to v0.32 업그레이드 작업 내역 공유

Jerry_이정훈 2024. 10. 10. 10:24
728x90

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 생성

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 노드 최적화도 효과가 있으면 좋겠구.

반응형