https://karpenter.sh/docs
- Karpenter 란?
- k8s cluster 에 설치하여, 워크로드의 효율과 비용의 크게 향상시키는 "node lifecycle management project"
- Watching : k8s scheduler 가 스케줄링 못하는 pod 감시.
- Evaluating : 각 pod 에 필요한 스케줄링 스팩사항 평가.
- Provisioning : 해당 pod 에 충족되는 node 프로비저닝.
- Disrupting : 필요없는 node 중단.
- node-pool 설정 : node 프로비저닝 관련 조건, 통합 및 만료, Kubelet 구성 등등 셋팅.
- taints : node 에 taint 를 추가하여, pod 의 toleration 와 매칭을 기반으로 판단함.
- labels : 키벨류 쌍을 node 에 지정하여, pod 와 매칭함.
- requirements : 클라우드별 잘알려진 라벨을 (인스턴스 타입 등등등) 기반으로, 허용 / 불허용 을 설정함
- limits : 클러스터의 CPU and Memory 한도를 제약하여, 프로비저닝 최대치 설정함.
- workloads 배포 설정 : karpenter 가 해당 workloads 프로비저닝 할 node 의 스팩 제약 요청 가능.
- resources : 각 pod 의 CPU and Memory 관련 셋팅.
- nodeSelector : 선택할 node 의 라벨을 지정.
- nodeAffinity : 선호하는 node ...
- podAffinity : 특정 pod 가 노드에서 실행중인지? 아닌지? 를 기반으로 선택.
- tolerations : 특정 pod 가 실행되기 전, node 의 taint 와 (tolerate) 매칭되는지? 판단.
- toleration 없으면, taint 의 효과(NoSchedule, PreferNoSchedule, NoExecute 등) 발생
- topologySpreadConstraints : 포드 토폴로지 분산 제약 조건
- Persistent volume topology : ...
- Getting Started with Karpenter
- awscli,kc,ec,helm 설치 -> 환경변수 -> AWS 리소스 배포 -> EKS 생성 -> Karpenter 설치
- NodePool : 하나의 node-pool 만으로도, 여러게의 pod 를 관리 할 수 있음.
- Scale up/down Deployment : ...
- Monitoring with Prometheus & Grafana : ...
- ...
Karpenter 운영
- EC2 인스턴스
- managedNodeGroup -> 초기 Nodes -> LB Controller, Karpenter, argocd 등 관련 POD 배치.
- Karpenter 는 이미 실행 중인 POD 를 해당 노드에 계속 유지. 자동으로 재배치(evict/relocate)하지는 않음.
- 새로운 배포된 POD 만 새롭게 띄운 노드에 할당하지만, 특별한 설정에 의해 리벨런싱 될 수 도 있긴함.
- kube-proxy, eks-pod-identity-agent, aws-node 는 필수 시스템 DaemonSet POD 임.
- TODO : 기존 POD 는 기존 Nodes 에만 배치 되도록 한다?
- TODO : Karpenter 의 SelectorTerms 으로 기존 Nodes 에는 할당 안되도록 한다?
- ...
--- [%] 참조 -------
- AWS Karpenter를 통해 EKS 클러스터 효율적으로 관리하기
- (https://danykde0til.tistory.com/160 , https://danykde0til.tistory.com/161)
--- [%] 참고 -------
- https://aws.amazon.com/ko/blogs/aws/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler
- https://aws.amazon.com/ko/blogs/korea/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler
- https://www.eksworkshop.com/docs/autoscaling/compute/karpenter
- 컴퓨팅 리소스 공간을 자동으로 최적화 및 비용 절감
- 기존 : "Amazon EC2 Auto Scaling Group", "Kubernetes Cluster Autoscaler" 을 사용하여 구성하기가 어려웠음
- karpenter : POD 의 리소스 요청 및 K8S 이벤트 모니터링 -> 클라우드 공급자(EC2) 에게 컴퓨팅 명령을 내림.
- https://devblog.kakaostyle.com/ko/2022-10-13-1-karpenter-on-eks
- AWS 가 개발한 Kubernetes 의 Cluster Autoscaler 오픈소스 프로젝트
- 기본 CA + ASG 방식 : POD 확장 -> pending -> CA 가 ASG 의 desired-capacity 값 수정 -> Node 증가
- (생각보다 오래걸리고, 원하는 인스턴스 타입 비용 최적화X)
- (원하는 운영 요구사항 반영을 위해, Launch Template 같은 AWS 자원들을 추가로 관리해야 하는 비용이 늘어남)
- karpenter : AWS 리소스에 의존성이 없어 Just In-Time 배포 가능

- (모든 Worker Node 는 Karpenter 가 집접 lifecycle 을 결정 하는등, 더 단순한 구조로 빠르게 처리함)
- (Custom Resource Definition -> 인스턴스 타입, 스토리지 크기, IAM 역할 등을 손쉽게 정의)
- (용도별 Provisioner 구성 -> 별도의 NodeGroup 생성이 필요 없어 -> 운영 부담 절감)
- (기존 특정 Node 사용 장기화 이슈 -> ttlSecondsUntilExpired 통해, 주기적 eks-node 버전업 rolling-update)
- (podAffinity, userdata 등 다양한 좋은 기능들을 제공)
- % bin packing 알고리즘 최적화 문제 : Provisioner 에 다양한 인스턴스 정의 -> k8s Cluster 효율을 Karpenter 가 개선
- https://boostbrothers.github.io/2023-11-01-infra-karpenter-migration
- POD 변화 감지 -> 새로운 Worker Node 를 자동 확장/병합/제거 가능한 Autoscaler
- 구성항목 : "Provisioner" 및 "AWSNodeTemplate"

- (Provisioner 통해, 목적이 따라 consolidation 나 ttlSecondsAfterEmpty 를 선언 하거나)
- (다양한 인스턴스 타입과 사용량/비용 최적화 전략를 손쉽게 사용 해 볼 수 있음)
- https://jennifersoft.com/ko/blog/kubernetes/2023-10-18-kubernetes-8
- https://jennifersoft.com/ko/blog/kubernetes/2023-10-25-kubernetes-9
- 기존의 CAS = 프로바이더(AWS,Azure,GCP) 의 API 이용 -> EKS 와 관련없는 별도의 ASG -> EKS 노드 데이터 동기화
- ASG 의 NodeGroup = 단일 인스턴스 타입만 사용 가능하여 자원의 낭비가 발생

- Karpent = (ASG 안씀) -> EKS노드 직접증감 -> POD리소스스펙 -> 최적의 노드할당 -> POD종료 -> 기 노드 삭재 및 재할당 -> 자동 비용 최적화
- CRD (Custom Resource Definition)
- Provisioner : Provisioning 이란? 컴퓨팅 리소스를 할당, 구성, 관리하는 과정을 의미하는 용어.
- AWSNodeTemplate : (하드웨어 타입을 제외한) 볼륨, 보안그룹, 서브넷 등 AWS 노드에 필요한 고유한 설정.
- K8S POD 서비스 운영 안정화 기본 사항
- Graceful Shutdown
- PodDistributionBudget
- 특정 파드가 중단되는 동안 애플리케이션의 가용성과 안정성을 유지할 수 있습니다.
- MinAvailable, MaxUnavailable, drain, cordon, uncordon,
- POD 이중화
- Graceful Shutdown
- https://blog.soomgo.com/posts/6673bb8d52107866fb86a793

- ...
-끝-
