

 **帮助改进此页面** 

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

# 将 EKS 自动模式节点部署到 Local Zones
<a name="auto-local-zone"></a>

EKS 自动模式通过自动节点预置简化了集群管理。AWSLocal Zones 将 AWS 基础设施扩展到离最终用户更近的地理位置，从而减少延迟敏感型应用程序的延迟。本指南将引导您完成将 EKS 自动模式节点部署到 AWS Local Zones 的过程，您随后便能以更低的延迟为特定地理区域的用户运行容器化应用程序。

本指南还演示了如何使用 Kubernetes 污点和容忍度来确保只有特定的工作负载在 Local Zone 节点上运行，从而帮助您控制成本和优化资源使用。

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

在开始将 EKS 自动模式节点部署 Local Zones 之前，请确保已满足以下先决条件：
+  [现有的 EKS 自动模式集群](create-auto.md) 
+  [在您的 AWS 账户中已选择加入 Local Zone](https://docs.aws.amazon.com/local-zones/latest/ug/getting-started.html#getting-started-find-local-zone) 

## 步骤 1：创建 Local Zone 子网
<a name="_step_1_create_local_zone_subnet"></a>

将 EKS 自动模式节点部署到 Local Zone 的第一步是在该 Local Zone 中创建子网。该子网为您的节点提供网络基础设施，并允许它们与 VPC 的其余部分进行通信。按照《AWS Local Zones 用户指南》中的[创建 Local Zone 子网](https://docs.aws.amazon.com/local-zones/latest/ug/getting-started.html#getting-started-create-local-zone-subnet)说明，在您选择的 Local Zone 中创建子网。

**提示**  
记下您的 Local Zone 子网的名称。

## 步骤 2：为 Local Zone 子网创建 NodeClass
<a name="_step_2_create_nodeclass_for_local_zone_subnet"></a>

创建 Local Zone 子网后，您需要定义一个引用该子网的 NodeClass。NodeClass 是一种 Kubernetes 自定义资源，用于指定节点的基础设施属性，包括要使用的子网、安全组和存储配置。在下面的示例中，我们创建了一个名为“local-zone”的 NodeClass，它根据 Local Zone 子网的名称对其进行定位。您也可以使用子网 ID。您需要调整此配置以定位 Local Zone 子网。

有关更多信息，请参阅 [为 Amazon EKS 创建节点类](create-node-class.md)。

```
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
  name: local-zone
spec:
  subnetSelectorTerms:
    - id: <local-subnet-id>
```

## 步骤 3：使用 NodeClass 和污点创建 NodePool
<a name="_step_3_create_nodepool_with_nodeclass_and_taint"></a>

配置好 NodeClass 后，您现在需要创建一个使用此 NodeClass 的 NodePool。NodePool 定义节点的计算特征，包括实例类型。NodePool 使用 NodeClass 作为参考，以确定在何处启动实例。

在下面的示例中，我们创建了一个引用“local-zone”NodeClass 的 NodePool。我们还将污点添加到节点，确保只有容忍度匹配的容器组（pod）才能在这些 Local Zone 节点上被调度。这对于 Local Zone 节点尤其重要，因为 Local Zone 节点的成本通常更高，只有特别受益于降低延迟的工作负载才应使用此类节点。

有关更多信息，请参阅 [为 EKS 自动模式创建节点池](create-node-pool.md)。

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: my-node-pool
spec:
  template:
    metadata:
      labels:
        node-type: local-zone
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: local-zone
      taints:
        - key: "aws.amazon.com/local-zone"
          value: "true"
          effect: NoSchedule

      requirements:
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values: ["c", "m", "r"]
        - key: "eks.amazonaws.com/instance-cpu"
          operator: In
          values: ["4", "8", "16", "32"]
```

带有 `aws.amazon.com/local-zone` 键和 `NoSchedule` 效果的污点可确保容忍度不匹配的容器组（pod）不会在这些节点上被调度。这样可以防止常规工作负载意外在 Local Zone 中运行，这可能会导致意外成本。

## 步骤 4：部署具有容忍度和节点亲和性的工作负载
<a name="_step_4_deploy_workloads_with_toleration_and_node_affinity"></a>

要对 Local Zone 节点上的工作负载放置进行最佳控制，请同时使用污点/容忍度和节点亲和性。此组合方法具有以下优势：

1.  **成本控制**：污点可确保只有具有明确容忍度的容器组（pod）才能使用可能较为昂贵的 Local Zone 资源。

1.  **保证放置**：节点亲和性可确保您的延迟敏感型应用程序仅在 Local Zone 中运行，而不是在常规集群节点上运行。

以下是配置为专门在 Local Zone 节点上运行的部署示例：

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: low-latency-app
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: low-latency-app
  template:
    metadata:
      labels:
        app: low-latency-app
    spec:
      tolerations:
      - key: "aws.amazon.com/local-zone"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "node-type"
                operator: "In"
                values: ["local-zone"]
      containers:
      - name: application
        image: my-low-latency-app:latest
        resources:
          limits:
            cpu: "1"
            memory: "1Gi"
          requests:
            cpu: "500m"
            memory: "512Mi"
```

此部署有两个关键的调度配置：

1. **容忍度**允许将容器组（pod）在带有 `aws.amazon.com/local-zone` 污点的节点上调度。

1. **节点亲和性**要求可确保这些容器组（pod）只能在带有 `node-type: local-zone` 标签的节点上运行。

它们共同确保您的延迟敏感型应用程序仅在 Local Zone 节点上运行，并且除非明确配置为使用 Local Zone 资源，否则常规应用程序不会消耗 Local Zone 资源。

## 步骤 5：使用 AWS 控制台验证
<a name="step_5_verify_with_shared_aws_console"></a>

设置 NodeClass、NodePool 和 Deployments 后，您应验证节点是否按预期在 Local Zone 中预置，并且您的工作负载是否正在这些节点上运行。您可以使用 AWS 管理控制台验证 EC2 实例是否在正确的 Local Zone 子网中启动。

此外，您可以使用 `kubectl get nodes -o wide` 查看 Kubernetes 节点列表，确认这些节点是否以正确的标签和污点加入集群：

```
kubectl get nodes -o wide
kubectl describe node <node-name> | grep -A 5 Taints
```

您还可以验证您的工作负载容器组（pod）是否已在 Local Zone 节点上调度：

```
kubectl get pods -o wide
```

这种方法可确保只有特别容忍 Local Zone 污点的工作负载才会在这些节点上被调度，从而帮助您控制成本并最有效地利用 Local Zone 资源。