Kubernetes 字段管理 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Kubernetes 字段管理

Amazon EKS 使用标准的最佳实践配置,为您的集群安装附加组件。有关向集群中添加 Amazon EKS 附加组件的更多信息,请参阅 Amazon 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
    [...]