

 **帮助改进此页面** 

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

# 确定可以为 Amazon EKS 附加组件自定义的字段
<a name="kubernetes-field-management"></a>

Amazon EKS 使用标准的最佳实践配置，为您的集群安装附加组件。有关向集群中添加 Amazon EKS 附加组件的更多信息，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)。

您若想要启用高级功能，则建议自定义 Amazon EKS 附加组件的配置。Amazon EKS 使用 Kubernetes 服务器端应用功能来启用 Amazon EKS 对附加组件的管理，而不会覆盖您对并非由 Amazon EKS 管理的设置的配置。有关更多信息，请参阅 Kubernetes 文档中的[服务器端应用](https://kubernetes.io/docs/reference/using-api/server-side-apply/)。为此，Amazon EKS 为其安装的每个附加组件管理最小的字段组。您可以修改并非由 Amazon EKS 或其他 Kubernetes 控制面板进程（例如 `kube-controller-manager`）管理的所有字段，这样做不会导致任何问题。

**重要**  
修改由 Amazon EKS 管理的字段会阻止 Amazon EKS 管理附加组件，并可能导致在更新附加组件时覆盖您所做的更改。

## 字段管理语法
<a name="add-on-config-management-understanding-field-management"></a>

当您查看某个 Kubernetes 对象的详细信息时，输出中会同时返回托管和非托管字段。托管字段可以是以下任一类型：
+  **完全托管**：该字段的所有密钥都由 Amazon EKS 管理。修改任何值都会导致冲突。
+  **部分托管**：该字段的部分密钥将由 Amazon EKS 管理。只有对 Amazon EKS 明确管理的密钥进行修改才会导致冲突。

这两种类型的字段都标有 `manager: eks`。

每个键要么是表示字段本身的 `.`（始终映射到空集），要么是表示子字段或项目的字符串。字段管理的输出由以下类型的声明组成：
+  `f:name `，其中 *name* 是列表中字段的名称。
+  `k:keys `，其中 *keys* 是列表项字段的映射。
+  `v:value `，其中 *value* 是列表项的确切 JSON 格式化值。
+  `i:index `，其中 *index* 是列表中某个项的位置。

CoreDNS 附加组件的以下输出部分说明了上面的声明：
+  **完全托管字段**：如果托管字段指定了 `f:`（字段），但没有 `k:`（键），则整个字段都是托管的。修改此字段中的任何值都会导致冲突。

  在以下输出中，您可以看到名为 `coredns` 的容器由 `eks` 管理。`args`、`image` 和 `imagePullPolicy` 子字段也由 `eks` 管理。修改此字段中的任何值都会导致冲突。

  ```
  [...]
  f:containers:
    k:{"name":"coredns"}:
    .: {}
    f:args: {}
    f:image: {}
    f:imagePullPolicy: {}
  [...]
  manager: eks
  [...]
  ```
+  **部分托管字段**：如果托管键具有指定的值，则为该字段管理所声明的键。修改指定的键会导致冲突。

  在以下输出中，您可以看到 `eks` 管理着包含 `name` 键的 `config-volume` 和 `tmp` 卷集。

  ```
  [...]
  f:volumes:
    k:{"name":"config-volume"}:
      .: {}
      f:configMap:
        f:items: {}
        f:name: {}
      f:name: {}
    k:{"name":"tmp"}:
      .: {}
      f:name: {}
  [...]
  manager: eks
  [...]
  ```
+  **向部分托管的字段添加键**：如果只管理一个特定的键值，则可以安全地向字段添加其他键（如实际参数），而不会导致冲突。如果您添加了其它键，请先确保该字段不是托管字段。添加或修改任何托管值都会导致冲突。

  在以下输出中，您可以看到 `name` 键和 `name` 字段都是托管的。添加或修改任何容器名称都会导致与此托管键发生冲突。

  ```
  [...]
  f:containers:
    k:{"name":"coredns"}:
  [...]
      f:name: {}
  [...]
  manager: eks
  [...]
  ```

## 过程
<a name="view-field-management"></a>

您可以使用 `kubectl` 查看对于任何 Amazon EKS 附加组件，有哪些字段由 Amazon EKS 管理。

您可以修改并非由 Amazon EKS 或其他 Kubernetes 控制面板进程（例如 `kube-controller-manager`）管理的所有字段，这样做不会导致任何问题。

1. 确定要检查的附加组件。要查看部署到集群的所有 `deployments` 和 DaemonSets，请参阅[在 AWS 管理控制台中查看 Kubernetes 资源](view-kubernetes-resources.md)。

1. 通过运行以下命令查看附加组件的托管字段：

   ```
   kubectl get type/add-on-name -n add-on-namespace -o yaml
   ```

   例如，您可以通过以下命令查看 CoreDNS 附加组件的托管字段。

   ```
   kubectl get deployment/coredns -n kube-system -o yaml
   ```

   字段管理列在所返回的输出中的以下部分中。

   ```
   [...]
   managedFields:
     - apiVersion: apps/v1
       fieldsType: FieldsV1
       fieldsV1:
   [...]
   ```
**注意**  
如果在输出中没有看到 `managedFields`，将 `--show-managed-fields` 添加到命令中，然后再次运行。您使用的 `kubectl` 版本决定默认情况下是否返回托管字段。

## 后续步骤
<a name="view-field-management-next-steps"></a>

为附加组件自定义非 AWS 拥有的字段。