Karpenter Docs
2024-05-27: v0.32.10
2024-01-30: v0.31.4
2023-09-22: v0.30.0
2023-08-29: v0.29.2
Karpenter는 적시에 적절한 노드로 Kubernetes 인프라를 단순화합니다.
Karpenter는 클러스터의 애플리케이션을 처리하는 데 적합한 컴퓨팅 리소스만 자동으로 시작합니다. Kubernetes 클러스터를 위한 빠르고 간단한 컴퓨팅 프로비저닝으로 클라우드를 최대한 활용할 수 있도록 설계되었습니다.
Karpenter는 애플리케이션 로드, 일정 및 리소스 요구 사항의 변화에 신속하고 자동으로 대응하여 사용 가능한 다양한 컴퓨팅 리소스 용량에 새로운 워크로드를 배치합니다.
Karpenter는 활용도가 낮은 노드를 제거하고 값비싼 노드를 저렴한 대안으로 교체하고 워크로드를 보다 효율적인 컴퓨팅 리소스로 통합할 수 있는 기회를 찾아 클러스터 컴퓨팅 비용을 낮춥니다.
Karpenter는 쉽게 사용자 정의할 수 있는 단일 선언적 리소스에 독자적인 기본값 세트와 함께 제공됩니다 NodePool
.
Karpenter는 예약되지 않은 포드의 총 리소스 요청을 관찰하고 예약 대기 시간과 인프라 비용을 최소화하기 위해 노드를 시작하고 종료하는 결정을 내립니다.
alpha 매니페스트를 beta 매니페스트로 변환하는데 도움이 되는 도구 설치
$ go install github.com/aws/karpenter/tools/karpenter-convert/cmd/karpenter-convert@release-v0.32.x
Convert to EC2NodeClass
$ karpenter-convert -f awsnodetemplate.yaml | envsubst > ec2nodeclass.yaml
Convert to NodePool
$ karpenter-convert -f provisioner.yaml > nodepool.yaml
Roll over nodes: Add the following taint to the old Provisioner: karpenter.sh/legacy=true:NoSchedule
# provisioners
$ kubectl get machines
> No resources found
# nodepools
$ kubectl get nodeclaims
- base
- manifest
- crd
- ec2nodeclasses
- nodepools
- duplicated-spot
- nodepools
- init-provisioning
- (CAS에서 Karpenter로 migration시 안정적인 Pod 전환을 위한 항목)
- over-provisioning
- (서비스의 고가용성 확보 및 업타임 속도 개선을 위한 항목)
- ex. pod uptime 60
70s -> 1015s
- ex. pod uptime 60
- (서비스의 고가용성 확보 및 업타임 속도 개선을 위한 항목)
- overlays
- envs(dev, staging)
- patches
- common ...
- nodepools/
- specific
- add custom
- patches
- envs(dev, staging)
- cicd
- cron
- default
- monitoring
- service
- system-critical
Karpenter를 사용하기 위한 Cluster, Node Role을 설정해야 합니다.
- ex.
- KarpenterControllerRole-lyon-cluster-platform
- KarpenterNodeRole-lyon-cluster-platform
- Migrating from Cluster Autoscaler 참조
- 설정을 위한 scripts는 DevOps에서 관리
- 관련 스크립트 코드는 git secret을 적용하여 관리합니다.
- karpenter-role.sh.secret
- 관련 스크립트 코드는 git secret을 적용하여 관리합니다.
- 설정을 위한 scripts는 DevOps에서 관리
추가로 Karpenter가 권한을 획득하기 위해 aws-auth.yaml에 role을 추가해주어야 합니다.
- ex.
- groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::XXXXXXXX:role/KarpenterNodeRole-lyon-cluster-platform username: system:node:{{EC2PrivateDNSName}}
클러스터별 노드의 활용에 따른 NodePool spec을 정의해주어야 합니다. 관련 내용은 karpenter/overlays/platform/patches/nodepools에서 확인 할 수 있습니다.
- ex.
apiVersion: karpenter.sh/v1beta1 kind: NodePool metadata: name: default spec: disruption: consolidationPolicy: WhenUnderutilized expireAfter: Never template: metadata: {} spec: nodeClassRef: name: lyon-cluster requirements: - key: karpenter.k8s.aws/instance-family operator: In values: - t3 - t3a - key: karpenter.k8s.aws/instance-size operator: In values: - medium - large - key: topology.kubernetes.io/zone operator: In values: - ap-northeast-2a - ap-northeast-2c - key: eks.amazonaws.com/nodegroup operator: In values: - default taints: - effect: NoSchedule key: system-type value: default weight: 10
kubectl apply -k platform
kubectl apply -k staging