Karpenter 节点自动扩缩容
Karpenter 根据 Pod 的调度需求直接创建和删除节点,绕过 Cluster Autoscaler 的节点组模型。它根据实例类型、容量、价格和拓扑选择最合适的节点,并支持 consolidation 合并碎片、Spot 和按需混合。
Karpenter 由控制器、NodePool 和 NodeClass(云厂商相关)组成。NodePool 定义允许的实例族、容量类型和中断预算,NodeClass 定义 AMI、子网、安全组和 IAM。
安装(AWS):
helm install karpenter oci://public.ecr.aws/karpenter/karpenter \
--version 1.15.0 \
--namespace kube-system \
--set settings.clusterName=prod \
--set settings.interruptionQueue=prod-karpenter
创建 EC2NodeClass:
kubectl apply -f - <<'EOF'
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: default
spec:
amiSelectorTerms:
- alias: al2023@latest
role: KarpenterNodeRole-prod
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: prod
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: prod
EOF
创建 NodePool:
kubectl apply -f - <<'EOF'
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: general
spec:
template:
spec:
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: default
requirements:
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["c", "m", "r"]
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand"]
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
limits:
cpu: "200"
memory: 400Gi
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 5m
EOF
查看节点和中断事件:
kubectl get nodepool
kubectl get nodeclaim
kubectl get nodes -l karpenter.sh/nodepool=general
kubectl logs -n kube-system deploy/karpenter -f
consolidationPolicy 过于激进会导致频繁迁移,影响有状态服务。kubectl get nodeclaim — 查看节点申请kubectl get nodepool — 查看节点池kubectl describe nodeclaim — 查看调度失败原因kubectl logs -n kube-system deploy/karpenter — 控制器日志aws ec2 describe-instances — 核对实际实例