如何在升级期间修复 Karpenter 迁移问题 (v0.25.0 v1.5.0)

发布: (2025年12月4日 GMT+8 21:51)
4 min read
原文: Dev.to

Source: Dev.to

介绍

本指南涵盖了在生产环境中将 Karpenter 从 v0.25.0 升级到 v1.5.0 时遇到的真实问题、产生原因以及精准的解决方案。如果你计划进行此升级,下面的步骤可以为你节省大量调试时间。

升级概览

当前 (v0.25.0)目标 (v1.5.0)
Karpenterv0.25.0v1.5.0
EKS1.311.32 兼容性
CRDv1alpha5(Provisioner、AWSNodeTemplate)v1(NodePool、EC2NodeClass)

跳过 CRD 迁移步骤会导致控制器崩溃、资源卡住以及卸载失败。

常见错误与解决方案

1. 未找到 Helm Chart

helm upgrade karpenter karpenter/karpenter --version 1.5.0
# Error: chart "karpenter" matching 1.5.0 not found

原因: 旧的 Helm 仓库仅包含到 0.16.3 的版本。Karpenter v1.x 已迁移至 OCI 注册表。

解决办法:

helm upgrade karpenter oci://public.ecr.aws/karpenter/karpenter \
  --version 1.5.0 \
  --namespace karpenter \
  --wait

2. OCI 标签带 v 前缀

helm upgrade karpenter oci://public.ecr.aws/karpenter/karpenter --version v1.5.0
# Error: ... v1.5.0: not found

原因:v0.35.0 开始,OCI 标签不再使用 v 前缀。

解决办法: 使用不带 v 前缀的版本号。

--version 1.5.0   # NOT v1.5.0

3. 缺少 v1 CRD

# ERROR: no matches for kind "NodeClaim" in version "karpenter.sh/v1"
# panic: unable to retrieve the complete list of server APIs

原因: v1.5.0 控制器需要新的 v1 CRD(NodePoolNodeClaimEC2NodeClass),而集群中仍只有旧的 v1alpha5 CRD。

解决办法: 在升级控制器之前先安装新 CRD。

helm upgrade --install karpenter-crd \
  oci://public.ecr.aws/karpenter/karpenter-crd \
  --version 1.5.0 \
  --namespace karpenter \
  --create-namespace

随后升级控制器:

helm upgrade karpenter oci://public.ecr.aws/karpenter/karpenter \
  --version 1.5.0 \
  --namespace karpenter \
  --wait

4. IAM 权限错误

"error": "not authorized to perform: ec2:DescribeImages"

原因: Karpenter v1 引入了新的实例配置文件和 AMI 发现工作流。

解决办法: 为 Karpenter 控制器的 IAM 角色添加以下权限:

{
  "Effect": "Allow",
  "Action": [
    "ec2:DescribeImages",
    "iam:GetInstanceProfile",
    "iam:CreateInstanceProfile",
    "iam:DeleteInstanceProfile",
    "iam:AddRoleToInstanceProfile",
    "iam:RemoveRoleFromInstanceProfile"
  ],
  "Resource": "*"
}

重启部署:

kubectl rollout restart deployment karpenter -n karpenter

迁移步骤

备份现有资源

kubectl get provisioners -A -o yaml > provisioners-backup.yaml
kubectl get awsnodetemplates -A -o yaml > awsnodetemplates-backup.yaml

安装新 CRD(如果尚未完成)

helm upgrade --install karpenter-crd \
  oci://public.ecr.aws/karpenter/karpenter-crd \
  --version 1.5.0 \
  --namespace karpenter

升级控制器(在 CRD 之后)

helm upgrade karpenter oci://public.ecr.aws/karpenter/karpenter \
  --version 1.5.0 \
  --namespace karpenter \
  --wait

Provisioner 转换为 NodePool

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand"]
      nodeClassRef:
        group: karpenter.k8s.aws
        kind: EC2NodeClass
        name: default
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized

AWSNodeTemplate 转换为 EC2NodeClass

apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiSelectorTerms:
    - alias: al2@latest
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: my-cluster
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: my-cluster
  role: "karpenter-node-role-name"

应用新资源:

kubectl apply -f ec2nodeclass.yaml
kubectl apply -f nodepool.yaml

验证:

kubectl get ec2nodeclass
kubectl get nodepools

测试节点供应

kubectl run test --image=nginx --requests=cpu=1,memory=1Gi

排空并清理旧资源

kubectl delete provisioner default
kubectl delete awsnodetemplate default

结果

  • Karpenter v1.5.0 稳定运行
  • 所有节点已迁移至 NodePools
  • 集群已准备好 EKS 1.32
  • 升级期间零停机

参考资料

升级期间监控日志

kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter -f
Back to Blog

相关文章

阅读更多 »