

 **帮助改进此页面** 

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

# EKS Auto Mode 中的静态容量节点池
<a name="auto-static-capacity"></a>

Amazon EKS Auto Mode 支持静态容量节点池，无论容器组（pod）需求如何，这些节点池都保持固定数量的节点。如果工作负载需要可预测容量、预留实例，或需要保持稳定的基础设施占用空间以满足特定合规性要求，静态容量节点池非常有用。

与基于容器组（pod）调度要求进行扩展的动态节点池不同，静态容量节点池会保留您配置的节点数量。

## 配置静态容量节点池
<a name="_configure_a_static_capacity_node_pool"></a>

要创建静态容量节点池，请在 NodePool 规范中设置 `replicas` 字段。`replicas` 字段定义节点池将维持的确切节点数。有关如何配置 `replicas` 的信息，请参阅 [示例](#static-capacity-examples)。

## 静态容量节点池限制
<a name="_static_capacity_node_pool_considerations"></a>

静态容量节点池有几个重要的限制和行为：

 **配置限制：**
+  **无法切换模式**：一旦在节点池上设置了 `replicas`，就无法将其移除。节点池无法在静态和动态模式之间切换。
+  **有限的资源限制**：限制部分中仅支持 `limits.nodes` 字段。CPU 和内存限制不适用。
+  **无权重字段**：由于节点选择不是基于优先级，因此无法在静态容量节点池上设置 `weight` 字段。

 **操作行为：**
+  **无整合**：静态容量池中的节点不考虑整合。
+  **扩展操作**：扩展操作会绕过节点中断预算，但仍然遵守 PodDisruptionBudgets。
+  **节点更换**：节点仍会因偏差（例如 AMI 更新）或因过期而被替换，具体方式取决于您的配置。

## 最佳实践
<a name="_best_practices"></a>

 **容量规划：**
+ 将 `limits.nodes` 设置为高于 `replicas`，以允许在节点替换操作期间进行临时扩展。
+ 设置限制时，请考虑节点偏差或 AMI 更新期间所需的最大容量。

 **实例选择：**
+ 如果您有预留实例或特定的硬件要求，请使用特定的实例类型。
+ 避免要求过于严格，因为这可能会限制扩展期间的实例可用性。

 **中断管理：**
+ 配置适当的中断预算，以平衡可用性与维护操作。
+ 在设置预算百分比时，请考虑应用程序对节点替换的容忍度。

 **监控：**
+ 定期监控 `status.nodes` 字段，确保保持所需容量。
+ 设置警报，以了解实际节点数何时偏离所需的副本。

 **可用区分布：**
+ 为了实现高可用性，请在多个可用区之间分布静态容量。
+ 当您创建跨多个可用区的静态容量节点池时，EKS Auto Mode 会将节点分布到指定可用区，但不能保证分布均匀。
+ 为了在可用区之间实现可预测且均匀的分布，请创建单独的静态容量节点池，每个节点池都根据 `topology.kubernetes.io/zone` 要求固定到特定的可用区。
+ 如果您需要在 3 个可用区中均匀分布 12 个节点，请创建 3 个节点池，每个节点池包含 4 个副本，而不是在 3 个可用区中仅创建 1 个节点池，其中共 12 个副本。

## 扩展静态容量节点池
<a name="_scale_a_static_capacity_node_pool"></a>

您可以使用 `kubectl scale` 命令更改静态容量节点池中的副本数量：

```
# Scale down to 5 nodes
kubectl scale nodepool static-nodepool --replicas=5
```

进行缩减时，EKS 自动模式将正常终止节点，同时遵守 PodDisruptionBudgets，并允许将正在运行的容器组（pod）重新调度至剩余节点。

## 监控静态容量节点池
<a name="_monitor_static_capacity_node_pools"></a>

使用以下命令监控静态容量节点池：

```
# View node pool status
kubectl get nodepool static-nodepool

# Get detailed information including current node count
kubectl describe nodepool static-nodepool

# Check the current number of nodes
kubectl get nodepool static-nodepool -o jsonpath='{.status.nodes}'
```

`status.nodes` 字段显示节点池当前管理的节点数量，在正常条件下，该数量应与所需的 `replicas` 数量相匹配。

## 问题排查
<a name="_troubleshooting"></a>

 **节点未到达所需的副本数：**
+ 检查 `limits.nodes` 值是否足够
+ 确认您的要求不会过度限制实例选择
+ 查看您正在使用的实例类型和区域的 Amazon 服务配额

 **节点替换花费的时间太长：**
+ 调整中断预算，允许更多并发替换
+ 检查 PodDisruptionBudgets 是否阻止了节点终止

 **节点意外终止：**
+ 检查 `expireAfter` 和 `terminationGracePeriod` 设置
+ 检查是否存在手动节点终止或 Amazon 维护事件

## 示例
<a name="static-capacity-examples"></a>

### 基本静态容量节点池
<a name="_basic_static_capacity_node_pool"></a>

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: basic-static
spec:
  replicas: 5

  template:
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["m"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a"]

  limits:
    nodes: 8  # Allow scaling up to 8 during operations
```

### 特定实例类型的静态容量
<a name="_static_capacity_with_specific_instance_types"></a>

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: reserved-instances
spec:
  replicas: 20

  template:
    metadata:
      labels:
        instance-type: reserved
        cost-center: production
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "node.kubernetes.io/instance-type"
          operator: In
          values: ["m5.2xlarge"]  # Specific instance type
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["on-demand"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a", "us-west-2b", "us-west-2c"]

  limits:
    nodes: 25

  disruption:
    # Conservative disruption for production workloads
    budgets:
      - nodes: 10%
```

### 多可用区静态容量节点池
<a name="_multi_zone_static_capacity_node_pool"></a>

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: multi-zone-static
spec:
  replicas: 12  # Will be distributed across specified zones

  template:
    metadata:
      labels:
        availability: high
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["c", "m"]
        - key: "eks.amazonaws.com/instance-cpu"
          operator: In
          values: ["8", "16"]
        - key: "topology.kubernetes.io/zone"
          operator: In
          values: ["us-west-2a", "us-west-2b", "us-west-2c"]
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["on-demand"]

  limits:
    nodes: 15

  disruption:
    budgets:
      - nodes: 25%
```

### 带容量预留的静态容量
<a name="_static_capacity_with_capacity_reservation"></a>

以下示例展示了如何将静态容量节点池与 EC2 容量预留配合使用。有关在 EKS Auto Mode 中使用 EC2 容量预留的更多信息，请参阅 [使用 EKS 自动模式控制将工作负载部署到容量预留中](auto-odcr.md)。

 定义 `capacityReservationSelectorTerms` 的 `NodeClass` 

```
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
  name: capacity-reservation-nodeclass
spec:
  role: AmazonEKSNodeRole
  securityGroupSelectorTerms:
  - id: sg-0123456789abcdef0
  subnetSelectorTerms:
  - id: subnet-0123456789abcdef0
  capacityReservationSelectorTerms:
  - id: cr-0123456789abcdef0
```

 引用上述 `NodeClass` 并使用 `karpenter.sh/capacity-type: reserved` 的 `NodePool`

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: static-capacity-reservation-nodepool
spec:
  replicas: 5
  limits:
    nodes: 8  # Allow scaling up to 8 during operations
  template:
    metadata: {}
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: capacity-reservation-nodeclass
      requirements:
      - key: karpenter.sh/capacity-type
        operator: In
        values: ['reserved']
```