728x90
Karpenter
- AWS에서 개발한 오픈소스 K8s의 worker node 오토스케일러
- Cluster Autoscaler (CA)와 비슷한 역할을 수행하지만, AWS 리소스에 의존성이 없어 JIT(Just In-Time) 배포가 가능
- Cluster Autoscaler은 asg 의존도가 높고, 노드 재배포 시 rolling 되고, 진행 중 작업자 개입이 어렵고, OS Userdata 설정이 필요할 경우 Launch template을 별도 설정해야함.
- 오픈소스이기 때문에 주요 CSP 및 on-prem 환경을 포함함
- Karpenter 동작 방식
- 운영 부담 절감
- 신속한 Node 추가와 제거
- 자동 Node 롤링 (TTL)
- 다양한 인스턴스 타임을 쉽게 적용
- 빠른 버전 업데이트
- AWS 의존성을 제거함
- Auto scaling group 연계하지 않기 때문에 과정이 빠름
- 추가 Node가 Ready 상태가 되면 Karpenter가 kube scheduler를 대신해 pod에 node 바인딩 요청도 수행함
- Karpenter 컴포넌트
- Karpenter Pod
- Controller: pod 상태를 감시하고 Node를 확장 및 축소하는 역할
- Webhook: provisioner CRD에 대한 유효성 검사 및 기본값을 지정
- Provisioner CRD
- Karpenter 에 의해 생성되는 Node와 Pod에 대한 제약조건을 지정하는 template
- Karpenter Pod
- Karpenter 구성
# Terraform karpenter 모듈로 배포
module "karpenter" {
source = "terraform-aws-modules/eks/aws//modules/karpenter"
version = "18.31.0"
cluster_name = module.eks.cluster_name
irsa_oidc_provider_arn = module.eks.oidc_provider_arn
irsa_namespace_service_accounts = ["karpenter:karpenter"]
create_iam_role = false
iam_role_arn = module.eks.eks_managed_node_groups["initial"].iam_role_arn
}
resource "helm_release" "karpenter" {
namespace = "karpenter" # 별도 ns 생성
create_namespace = true
name = "karpenter"
repository = "oci://public.ecr.aws/karpenter"
repository_username = data.aws_ecrpublic_authorization_token.token.user_name
repository_password = data.aws_ecrpublic_authorization_token.token.password
chart = "karpenter"
version = "v0.20.0"
# node 생성 시 필요한 세팅 정보 값
set {
name = "settings.aws.clusterName"
value = module.eks.cluster_name
}
set {
name = "settings.aws.clusterEndpoint"
value = module.eks.cluster_endpoint
}
set {
name = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
value = module.karpenter.irsa_arn
}
set {
name = "settings.aws.defaultInstanceProfile"
value = module.karpenter.instance_profile_name
}
set {
name = "settings.aws.interruptionQueueName"
value = module.karpenter.queue_name
}
}
# management.yaml
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: management
spec:
taints:
- key: management
value: "true"
effect: NoSchedule
labels:
nodeType: management-2023
requirements:
- key: "node.kubernetes.io/instance-type"
operator: In
values: ["t3.large","t3.xlarge"]
- key: "topology.kubernetes.io/zone"
operator: In
values: [ "ap-northeast-2a", "ap-northeast-2c" ]
- key: "karpenter.sh/capacity-type"
operator: In
values: ["on-demand"]
providerRef:
name: management-lt
ttlSecondsAfterEmpty: 30
ttlSecondsUntilExpired: 1209600
---
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: management-lt
spec:
subnetSelector:
karpenter.sh/discovery/hoon-cluster: '*'
securityGroupSelector:
aws:eks:cluster-name: hoon-cluster
tags:
karpenter.sh/discovery: hoon-cluster
# service.yaml
apiVersion: karpenter.sh/v1alpha5 # karpenter api 사용
kind: Provisioner
metadata:
name: service
spec:
taints:
- key: service
value: "true"
effect: NoSchedule
labels:
nodeType: service-2023
# node 신규 배포에 사용되는 션
requirements:
- key: "node.kubernetes.io/instance-type"
operator: In
values: ["t3.large","t3.xlarge"]
- key: "topology.kubernetes.io/zone"
operator: In
values: [ "ap-northeast-2a", "ap-northeast-2c" ]
- key: "karpenter.sh/capacity-type"
operator: In
values: ["on-demand"]
providerRef:
name: service-lt
ttlSecondsAfterEmpty: 30
ttlSecondsUntilExpired: 1209600
---
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: service-lt
spec:
subnetSelector:
karpenter.sh/discovery/hoon-cluster: '*'
securityGroupSelector:
aws:eks:cluster-name: hoon-cluster
tags:
karpenter.sh/discovery: hoon-cluster
- Provisioner 동작 확인
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-karpenter
spec:
replicas: 2
selector:
matchLabels:
type: karpenter-test
template:
metadata:
name: nginx-karpenter
labels:
type: karpenter-test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
nodeType: service-2023
tolerations:
- effect: "NoSchedule"
key: "service"
operator: "Equal"
value: "true"
생성된 node는 karpenter에서 지속적으로 관찰하고 있다가, 해당되는 자원이 없을 경우 deprovisioning 되어 삭제된다.
728x90
'Cloud > AWS' 카테고리의 다른 글
[AWS] EKS 생성 (by terraform) (0) | 2024.07.17 |
---|---|
[AWS] Oracle RDS 엔진 업그레이드 하기 (0) | 2024.07.17 |