--- title: 使用配置文件指令式管理 Kubernetes 对象 content_template: templates/concept weight: 30 --- {{% capture overview %}} 通过使用 `kubectl` 命令行工具和 yaml 或 json 格式编写的对象配置文件,用户可以创建、更新和删除 Kubernetes 对象。 本文档介绍如何使用配置文件定义和管理对象。 {{% /capture %}} {{% capture body %}} ## 取舍权衡 `kubectl` 工具支持三种对象管理: * 指令性命令 * 指令性对象配置 * 声明式对象配置 请参阅[Kubernetes 对象管理](/docs/concepts/overview/object-management-kubectl/overview/) 以了解每种对象管理的优缺点。 ## 怎样创建对象 可以使用 `kubectl create -f` 从配置文件创建对象。 有关详细信息,请参阅[Kubernetes API 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)。 - `kubectl create -f ` ## 怎样更新对象 {{< warning >}} 使用 `replace` 命令更新对象时,系统将会删除配置文件的 spec 中未指定的所有内容。 对于部分上由集群来管理的对象而言,不要使用这种对象管理方式。 例如,对于 `LoadBalancer` 类型的服务而言,其 `externalIPs` 字段值是独立于配置文件进行管理的。 独立管理的字段必须复制到配置文件中,以防止被 `replace` 操作删除。 {{< /warning >}} 您可以使用 `kubectl replace -f` 命令基于配置文件来更新活跃状态的对象。 - `kubectl replace -f ` ## 怎样删除对象 您可以使用 `kubectl delete -f` 命令来删除配置文件中描述的对象。 - `kubectl delete -f ` ## 怎样查看对象 您可以使用 `kubectl get -f` 命令来查看配置文件中描述的对象的信息。 - `kubectl get -f -o yaml` 指定了 `-o yaml` 参数将会打印完整的对象配置。 使用 `kubectl get -h` 命令查看选项列表。 ## 限制 当每个对象的配置都完整的定义和记录在它的配置文件中时,`create`、`replace` 和 `delete` 命令就能正常使用。 然而,当一个存活态的对象被更新、并且更新的内容没有被合入该对象的配置文件时,下次再执行 `replace` 命令将导致更新的内容丢失。 如果控制器(如 HorizontalPodAutoscaler)直接更新存活态的对象,就会发生上面的情况。 下面是个例子: 1. 从配置文件创建对象。 1. 另外一个资源更新这个对象的一些字段。 1. 从配置文件中替换(replace)该对象。第二步中另外的资源对该对象所做的更新将丢失。 如果您需要对同一对象支持多个写者,那么可以使用 `kubectl apply` 命令管理该对象。 ## 通过 URL 创建和编辑对象而不保存配置 假设您知道一个对象配置文件的 URL。 您可以在对象被创建之前使用 `kubectl create --edit` 命令来更改它的配置。 这对于指向那些读者可修改配置文件的教程和任务特别有用。 ```sh kubectl create -f --edit ``` ## 从指令性命令迁移到指令性对象配置 从指令性命令迁移到指令性对象配置包括几个手动步骤。 1. 将存活态的对象导出为本地对象配置文件: ```sh kubectl get / -o yaml --export > _.yaml ``` 1. 手动从对象配置文件中移除状态信息。 1. 对于后续的对象管理,只使用 `replace`。 ```sh kubectl replace -f _.yaml ``` ## 定义控制器选择器和 PodTemplate 标签 {{< warning >}} 强烈不建议更新控制器的选择器。 {{< /warning >}} 建议的方法是定义一个单一的、不变的 PodTemplate 标签,该标签仅由控制器选择器使用,没有其他语义意义。 标签示例: ```yaml selector: matchLabels: controller-selector: "extensions/v1beta1/deployment/nginx" template: metadata: labels: controller-selector: "extensions/v1beta1/deployment/nginx" ``` {{% /capture %}} {{% capture whatsnext %}} - [使用指令性命令管理 Kubernetes 对象](/docs/concepts/overview/object-management-kubectl/imperative-command/) - [使用对象配置文件(声明式)管理 Kubernetes 对象](/docs/concepts/overview/object-management-kubectl/declarative-config/) - [Kubectl 命令参考](/docs/reference/generated/kubectl/kubectl/) - [Kubernetes API 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/) {{% /capture %}}