使用字段管理功能自定义 Amazon EKS 插件设置 - Amazon EKS

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

使用字段管理功能自定义 Amazon EKS 插件设置

Amazon EKS 使用标准的最佳实践配置,为您的集群安装附加组件。有关向集群中添加 Amazon EKS 附加组件的更多信息,请参阅 使用 AWSAPIs 安装/更新带有 EKS 插件的集群组件

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

重要

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

查看字段管理状态

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

查看字段的管理状态
  1. 确定要检查的附加组件。要查看部署到集群的所有 deploymentsDaemonSets,请参阅 查看 Kubernetes 资源

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

    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 版本决定预设情况下是否返回托管字段。

了解 Kubernetes API 中的字段管理语法

当您查看某个 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 管理。argsimageimagePullPolicy 子字段也由 eks 管理。修改此字段中的任何值都会导致冲突。

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

    在以下输出中,您可以看到 eks 管理着包含 name 键的 config-volumetmp 卷集。

    [...]
    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
    [...]