

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 kubectl 从 Karpenter 迁移到 EKS 自动模式
<a name="auto-migrate-karpenter"></a>

本主题将演示使用 kubectl 将工作负载从 Karpenter 迁移到 Amazon EKS 自动模式的过程。迁移可以逐步执行，从而让您按照自己的节奏移动工作负载，同时在整个迁移期间保持集群稳定性和应用程序可用性。

借助下面概述的分步方法，您可以在迁移期间并行运行 Karpenter 和 EKS 自动模式。借助这种双重运行策略，您可以在完全停用 Karpenter 之前验证 EKS 自动模式下的工作负载行为，从而帮助保证平稳过渡。您可以逐一或分组迁移应用程序，从而灵活地适应自己的具体运行要求和风险承受能力。

## 先决条件
<a name="_prerequisites"></a>

开始迁移之前，请确保您满足以下条件：
+ 您的集群已安装 Karpenter 版本 1.1 或更高版本。有关更多信息，请参阅 Karpenter 文档中的 [Upgrading to 1.1.0\$1](https://karpenter.sh/docs/upgrading/upgrade-guide/#upgrading-to-110)。
+  已安装 `kubectl` 并连接到集群。有关更多信息，请参阅 [进行设置以使用 Amazon EKS](setting-up.md)。

本主题假设您熟悉 Karpenter 和节点池。有关更多信息，请参阅 [Karpenter 文档](https://karpenter.sh/)。

## 第 1 步：在集群上启用 EKS 自动模式
<a name="_step_1_enable_eks_auto_mode_on_the_cluster"></a>

使用 Amazon CLI 或管理控制台在现有集群上启用 EKS 自动模式。有关更多信息，请参阅 [在现有集群上启用 EKS 自动模式](auto-enable-existing.md)。

**注意**  
启用 EKS 自动模式时，不要在迁移过程的这一阶段启用 `general purpose` 节点池。此节点池不是选择性的。  
有关更多信息，请参阅 [启用或禁用内置节点池](set-builtin-node-pools.md)。

## 第 2 步：创建一个受污染的 EKS 自动模式节点池
<a name="_step_2_create_a_tainted_eks_auto_mode_nodepool"></a>

为 EKS 自动模式创建一个带有污点的新节点池。这样可以确保不会在新的 EKS 自动模式节点上自动调度现有的容器组。此节点池使用 EKS 自动模式中内置的 `default` `NodeClass`。有关更多信息，请参阅 [为 Amazon EKS 创建节点类](create-node-class.md)。

带有污点的节点池示例：

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: eks-auto-mode
spec:
  template:
    spec:
      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["c", "m", "r"]
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default
      taints:
        - key: "eks-auto-mode"
          effect: "NoSchedule"
```

更新节点池要求以使其与您要迁移的 Karpenter 配置一致。您至少需要一项要求。

## 第 3 步：更新要迁移的工作负载
<a name="_step_3_update_workloads_for_migration"></a>

识别并更新要迁移到 EKS 自动模式的工作负载。为这些工作负载添加容忍度和节点选择器：

```
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      tolerations:
      - key: "eks-auto-mode"
        effect: "NoSchedule"
      nodeSelector:
        eks.amazonaws.com/compute-type: auto
```

实施此更改后，将可以在新的 EKS 自动模式节点上调度工作负载。

EKS 自动模式使用的标签与 Karpenter 不同。与 EC2 托管式实例相关的标签以 `eks.amazonaws.com` 开头。有关更多信息，请参阅 [为 EKS 自动模式创建节点池](create-node-pool.md)。

## 第 4 步：逐步迁移工作负载
<a name="_step_4_gradually_migrate_workloads"></a>

对要迁移的每个工作负载重复第 3 步。这样就可以根据自己的要求和风险承受能力逐一或分组移动工作负载。

## 第 5 步：移除原始 Karpenter 节点池
<a name="_step_5_remove_the_original_karpenter_nodepool"></a>

迁移完所有工作负载后，您可以移除原始 Karpenter 节点池：

```
kubectl delete nodepool <original-nodepool-name>
```

## 第 6 步：从 EKS 自动模式节点池中移除污点（可选）
<a name="_step_6_remove_taint_from_eks_auto_mode_nodepool_optional"></a>

要让 EKS 自动模式成为新工作负载的默认模式，您可以从 EKS 自动模式节点池中移除污点：

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: eks-auto-mode
spec:
  template:
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default
      # Remove the taints section
```

## 第 7 步：从工作负载中移除节点选择器（可选）
<a name="_step_7_remove_node_selectors_from_workloads_optional"></a>

如果您已从 EKS 自动模式节点池中移除污点，则可以选择从工作负载中移除节点选择器，因为 EKS 自动模式现已是默认模式：

```
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      # Remove the nodeSelector section
      tolerations:
      - key: "eks-auto-mode"
        effect: "NoSchedule"
```

## 第 8 步：从集群中卸载 Karpenter
<a name="_step_8_uninstall_karpenter_from_your_cluster"></a>

移除 Karpenter 的步骤取决于最初的安装方式。有关更多信息，请参阅 [Karpenter install instructions](https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/#create-a-cluster-and-add-karpenter)。