AWS Karpenter 快速入门指南:自动化节点管理与弹性伸缩
什么是Karpenter?
Karpenter是Kubernetes集群中一个革命性的节点自动伸缩解决方案,它通过实时监控集群中不可调度的Pod事件,直接与底层云服务商API交互,自动创建最适合的节点资源。相比传统的集群自动伸缩器(Cluster Autoscaler),Karpenter具有更快的响应速度、更精细的资源选择能力和更智能的节点生命周期管理。
核心优势
- 即时响应:秒级检测并响应不可调度Pod
- 智能选择:根据Pod需求自动选择最优实例类型
- 成本优化:支持Spot实例和自动节点合并
- 简化管理:无需预先配置多种节点组
环境准备
工具安装
在开始前,请确保已安装以下工具:
- AWS CLI:AWS官方命令行工具
- kubectl:Kubernetes集群管理工具
- eksctl:AWS EKS集群管理工具(版本≥0.202.0)
- helm:Kubernetes包管理工具
环境变量配置
export KARPENTER_NAMESPACE="kube-system"
export KARPENTER_VERSION="1.5.0"
export K8S_VERSION="1.32"
export CLUSTER_NAME="your-cluster-name"
export AWS_DEFAULT_REGION="us-west-2"
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
集群创建与Karpenter安装
1. 创建EKS集群
使用eksctl创建基础集群,该命令将:
- 通过CloudFormation创建EKS所需基础设施
- 创建Karpenter所需的IAM角色和服务账户
- 配置aws-auth允许节点加入集群
- 为kube-system和karpenter命名空间创建托管节点组
eksctl create cluster -f - <<EOF
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: ${CLUSTER_NAME}
region: ${AWS_DEFAULT_REGION}
version: "${K8S_VERSION}"
tags:
karpenter.sh/discovery: ${CLUSTER_NAME}
managedNodeGroups:
- name: karpenter
instanceTypes: ["t3.medium"]
minSize: 1
maxSize: 1
iam:
withOIDC: true
serviceAccounts:
- metadata:
name: karpenter
namespace: ${KARPENTER_NAMESPACE}
roleName: ${CLUSTER_NAME}-karpenter
attachPolicyARNs:
- arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
- arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
- arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
- arn:aws:iam::aws:policy/AmazonEKSVPCResourceController
EOF
2. 安装Karpenter Helm Chart
helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter \
--version ${KARPENTER_VERSION} \
--namespace ${KARPENTER_NAMESPACE} \
--set serviceAccount.create=false \
--set serviceAccount.name=karpenter \
--set clusterName=${CLUSTER_NAME} \
--set clusterEndpoint=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.endpoint" --output text) \
--set aws.defaultInstanceProfile=KarpenterNodeInstanceProfile-${CLUSTER_NAME}
配置NodePool
NodePool是Karpenter的核心概念,它定义了节点的供应规则:
cat <<EOF | kubectl apply -f -
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
name: default
spec:
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand"]
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
nodeClassRef:
name: default
disruption:
consolidationPolicy: WhenUnderutilized
expireAfter: 720h
EOF
实践验证
测试自动扩展
部署一个测试应用并观察Karpenter的自动扩展行为:
kubectl create deployment inflate \
--image=public.ecr.aws/eks-distro/kubernetes/pause:3.7 \
--replicas=0
kubectl scale deployment inflate --replicas=5
观察节点回收
删除部署后,Karpenter会自动回收闲置节点:
kubectl delete deployment inflate
高级配置
私有集群部署
对于私有EKS集群,需要额外配置:
- 启用VPC私有端点
- 手动创建实例配置文件
- 配置Karpenter使用私有镜像仓库
helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter \
--set settings.isolatedVPC=true \
--set serviceAccount.annotations."eks\.amazonaws\.com/role-arn"=arn:aws:iam::${AWS_ACCOUNT_ID}:role/${CLUSTER_NAME}-karpenter
监控集成(可选)
部署Prometheus和Grafana监控栈:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install karpenter-prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
最佳实践
- 标签管理:确保关键标签(如
karpenter.sh/managed-by)受到IAM策略保护 - DNS策略:在DNS服务依赖Karpenter的场景下,设置
dnsPolicy=Default - API限流防护:将Karpenter部署在
kube-system命名空间以获得更高API优先级
清理资源
完成测试后,执行以下命令清理资源:
eksctl delete cluster --name ${CLUSTER_NAME}
通过本指南,您已成功部署了Karpenter并验证了其核心功能。Karpenter的智能调度和成本优化能力将显著提升您的Kubernetes集群管理效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



