karpenter

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

注意

相关命令

参考链接