

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在亚马逊中配置自定义 Kubernetes 标签和污点 SageMaker HyperPod
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints"></a>

带有亚马逊 Elastic Kubernetes Service（Amazon EKS）编排器的亚马逊 SageMaker HyperPod 集群支持实例组内节点的自定义 Kubernetes 标签和污点。标签和污点是 Kubernetes 中的基本调度和组织机制，可让您精细地控制 pod 的放置和资源利用率。

标签是可以附加到 Kubernetes 对象的键值对，允许您根据属性组织和选择资源。污点与容忍度相结合，是特定于节点的属性，它们通过排斥容差不匹配的 pod 来影响 Pod 的调度。这些机制共同使您能够隔离工作负载，根据硬件规格分配工作负载，并确保最佳的资源利用率。

## 常见使用案例
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-use-cases"></a>

以下是自定义标签和污点有益的常见场景：
+ **防止在昂贵的实例上使用系统 Pod**-对 GPU 实例应用污点，以防止系统 Pod 和其他非关键工作负载消耗昂贵的计算资源
+ **与现有工具集成**-应用与组织已建立的基础架构模式和节点关联性配置相匹配的标签

## 配置标签和污点
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-configure"></a>

您可以使用集群配置中的`KubernetesConfig`参数在实例组级别配置自定义 Kubernetes 标签和污点。标签和污点应用于实例组中的所有节点，并在集群的整个生命周期中持续存在。

该`KubernetesConfig`参数是声明性的，这意味着您可以为实例组指定标签和污点的完整所需状态。 SageMaker HyperPod 然后协调节点的实际状态以匹配所需的状态。
+ **添加标签或污点**-将新的标签或污点`KubernetesConfig`以及您想要保留的任何现有标签或污点包括在中
+ **更新标签或污点**-修改中要更改`KubernetesConfig`的标签或污点的值，并包括所有其他要保留的标签或污点
+ **移除标签或污点**-省略要从中移除的标签或污点`KubernetesConfig`，只保留要保留的标签或污点

### 创建带有标签和污点的集群
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-create"></a>

创建新 SageMaker HyperPod 集群时，请在您的实例组配置中包含`KubernetesConfig`参数。以下示例说明如何使用自定义标签和污点创建集群：

```
{
    "ClusterName": "my-cluster",
    "InstanceGroups": [{
        "InstanceGroupName": "worker-group-1",
        "InstanceType": "ml.p4d.24xlarge",
        "InstanceCount": 4,
        "LifeCycleConfig": {
            "SourceS3Uri": "s3://my-bucket/lifecycle-config.sh",
            "OnCreate": "on-create.sh"
        },
        "ExecutionRole": "arn:aws:iam::123456789012:role/HyperPodExecutionRole",
        "ThreadsPerCore": 1,
        "KubernetesConfig": { 
            "Labels": {
                "env": "prod",
                "team": "ml-training",
                "gpu-type": "a100"
            },
            "Taints": [{
                "key": "gpu",
                "value": "true",
                "effect": "NoSchedule"
            },
            {
                "key": "dedicated",
                "value": "ml-workloads",
                "effect": "NoExecute"
            }]
        }
    }],
    "VpcConfig": {
        "SecurityGroupIds": ["sg-0123456789abcdef0"],
        "Subnets": ["subnet-0123456789abcdef0", "subnet-0123456789abcdef1"]
    },
    "Orchestrator": {
        "Eks": {
            "ClusterArn": "arn:aws:eks:us-west-2:123456789012:cluster/my-eks-cluster"
        }
    }
}
```

在本示例中：
+ **标签**-应用了三个自定义标签：`env=prod``team=ml-training`、和 `gpu-type=a100`
+ **污点**-配置了两个污点以防止不必要的 pod 调度

### 更新现有集群上的标签和污点
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-update"></a>

您可以使用 `UpdateCluster` API 修改现有集群上的标签和污点。以下示例说明如何更新实例组`KubernetesConfig`的：

```
{
    "ClusterName": "my-cluster",
    "InstanceGroups": [{
        "InstanceGroupName": "worker-group-1",
        "KubernetesConfig": { 
            "Labels": {
                "env": "prod",
                "team": "ml-training",
                "gpu-type": "a100",
                "cost-center": "ml-ops"
            },
            "Taints": [{
                "key": "gpu",
                "value": "true",
                "effect": "NoSchedule"
            }]
        }
    }]
}
```

更新标签和污点时，会将更改 SageMaker HyperPod 应用于实例组中的所有节点。该服务管理从当前状态到所需状态的过渡，您可以使用 `DescribeCluster` API 对其进行监控。

## 监控标签和污点应用
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-monitor"></a>

SageMaker HyperPod APIs 用于监控标签和污点应用于集群节点时的状态。

### 检查集群级别的状态
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-describe-cluster"></a>

使用 `DescribeCluster` API 在实例组级别查看标签和污点的当前和所需状态。以下示例显示了响应结构：

```
{
    "ClusterName": "my-cluster",
    "ClusterStatus": "InService",
    "InstanceGroups": [{
        "InstanceGroupName": "worker-group-1",
        "InstanceType": "ml.p4d.24xlarge",
        "CurrentInstanceCount": 4,
        "TargetInstanceCount": 4,
        "KubernetesConfig": {
            "CurrentLabels": {
                "env": "prod",
                "team": "ml-training",
                "gpu-type": "a100"
            },
            "DesiredLabels": {
                "env": "prod",
                "team": "ml-training",
                "gpu-type": "a100"
            },
            "CurrentTaints": [{
                "key": "gpu",
                "value": "true",
                "effect": "NoSchedule"
            }],
            "DesiredTaints": [{
                "key": "gpu",
                "value": "true",
                "effect": "NoSchedule"
            }]
        }
    }]
}
```

当`CurrentLabels`匹配`DesiredLabels`并`CurrentTaints`匹配时`DesiredTaints`，实例组中的所有节点都将应用指定的配置。如果它们不同，则集群仍处于应用更改的过程中。

### 检查单个节点的状态
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-describe-node"></a>

有关节点级别的详细信息，请使用 `DescribeClusterNode` API 检查各个节点的标签和污点配置。以下示例显示了响应结构：

```
{
    "NodeDetails": { 
        "InstanceId": "i-0123456789abcdef0",
        "InstanceGroupName": "worker-group-1",
        "InstanceType": "ml.p4d.24xlarge",
        "InstanceStatus": {
            "Status": "Running",
            "Message": "Node is healthy"
        },
        "LifeCycleConfig": {
            "SourceS3Uri": "s3://my-bucket/lifecycle-config.sh",
            "OnCreate": "on-create.sh"
        },
        "LaunchTime": 1699564800.0,
        "KubernetesConfig": {
            "CurrentLabels": {
                "env": "prod",
                "team": "ml-training",
                "gpu-type": "a100"
            },
            "DesiredLabels": {
                "env": "prod",
                "team": "ml-training",
                "gpu-type": "a100"
            },
            "CurrentTaints": [{
                "key": "gpu",
                "value": "true",
                "effect": "NoSchedule"
            }],
            "DesiredTaints": [{
                "key": "gpu",
                "value": "true",
                "effect": "NoSchedule"
            }]
        }
    }
}
```

当标签或污点未正确应用于特定节点时，或者需要验证特定实例的配置时，节点级监控对于排除故障非常有用。

## 保留前缀
<a name="sagemaker-hyperpod-eks-custom-labels-and-taints-reserved-prefixes"></a>

某些前缀保留给系统使用，不应用于自定义标签或污点。保留以下前缀：
+ `kubernetes.io/`-保留给 Kubernetes 核心组件
+ `k8s.io/`-保留给 Kubernetes 核心组件
+ `sagemaker.amazonaws.com/`-保留给 SageMaker HyperPod
+ `eks.amazonaws.com/`-专为 Amazon EKS 保留
+ `k8s.aws/`-专为 Amazon EKS 保留
+ `karpenter.sh/`-保留给 Karpenter 自动缩放

带有这些前缀的标签和污点由系统组件管理，不应被自定义值覆盖。