配置最佳实践
本文档重点介绍了用户指南、入门文档和示例中介绍的配置最佳实践并对其进行了整合。
这是一份活文档。如果你想到任何不在此列表中但可能对其他人有用的内容,请随时提交问题或 PR。
通用配置技巧
定义配置时,请指定最新的稳定 API 版本。
配置文件应在推送到集群之前存储在版本控制中。这使您能够在必要时快速回滚配置更改。它还有助于集群重新创建和恢复。
使用 YAML 而不是 JSON 编写您的配置文件。虽然这些格式几乎可以在所有情况下互换使用,但 YAML 通常更易于使用。
在有意义的情况下,将相关对象分组到单个文件中。一个文件通常比几个文件更容易管理。请查看 guestbook-all-in-one.yaml 文件,了解此语法示例。
还要注意,许多
kubectl命令可以在目录上调用。例如,您可以对 config 文件目录调用kubectl apply。不要无端指定默认值:简单、最小的配置将减少错误的可能性。
将对象描述放在注释中,以允许更好地自省。
注意
在 YAML 1.2 布尔值规范中,相对于 YAML 1.1,引入了重大更改。这是一个已知的 问题,存在于 Kubernetes 中。YAML 1.2 仅将 true 和 false 识别为有效的布尔值,而 YAML 1.1 还接受 yes、no、on 和 off 作为布尔值。但是,Kubernetes 使用的 YAML 解析器 主要与 YAML 1.1 兼容,这意味着在 YAML 清单中使用 yes 或 no 代替 true 或 false 可能会导致意外错误或行为。为了避免此问题,建议在 YAML 清单中始终为布尔值使用 true 或 false,并为可能与布尔值混淆的任何字符串加引号,例如 "yes" 或 "no"。
除了布尔值之外,YAML 版本之间还存在其他规范更改。请参阅 YAML 规范变更 文档,了解完整的列表。
"裸" Pod 与 ReplicaSet、Deployment 和 Job
如果可以避免,请勿使用裸 Pod(即,不绑定到 ReplicaSet 或 Deployment 的 Pod)。裸 Pod 在节点故障时不会重新调度。
Deployment 既创建 ReplicaSet 来确保始终提供所需数量的 Pod,又指定替换 Pod 的策略(如 滚动更新),几乎总是比直接创建 Pod 更可取,除了某些显式的
restartPolicy: Never场景。 Job 也可能适用。
服务
在创建其相应的后端工作负载(Deployment 或 ReplicaSet)之前,以及在任何需要访问它的工作负载之前,创建 Service。当 Kubernetes 启动容器时,它会提供指向容器启动时正在运行的所有服务的环境变量。例如,如果存在名为
foo的服务,则所有容器在其初始环境中将获得以下变量FOO_SERVICE_HOST=<the host the Service is running on> FOO_SERVICE_PORT=<the port the Service is running on>这确实意味着存在排序要求 - 任何
Pod想要访问的Service必须在Pod本身之前创建,否则环境变量将不会填充。DNS 没有此限制。可选的(尽管强烈建议的) 集群附加组件 是 DNS 服务器。DNS 服务器监控 Kubernetes API 中的新
Services并为每个服务创建一组 DNS 记录。如果整个集群都启用了 DNS,那么所有Pods应该能够自动执行Services的名称解析。除非绝对必要,否则不要为 Pod 指定
hostPort。当您将 Pod 绑定到hostPort时,它会限制 Pod 可以调度到的位置数量,因为每个 <hostIP,hostPort,protocol> 组合必须是唯一的。如果您没有显式指定hostIP和protocol,Kubernetes 将使用0.0.0.0作为默认hostIP,并使用TCP作为默认protocol。如果您只需要访问该端口以进行调试,可以使用 apiserver 代理 或
kubectl port-forward。如果您确实需要在节点上公开 Pod 的端口,请在使用
hostPort之前考虑使用 NodePort 服务。出于与
hostPort相同的原因,避免使用hostNetwork。当您不需要
kube-proxy负载均衡时,使用 无头服务(其ClusterIP为None)进行服务发现。
使用标签
定义和使用 标签 来标识应用程序或 Deployment 的语义属性,例如
{ app.kubernetes.io/name: MyApp, tier: frontend, phase: test, deployment: v3 }。您可以使用这些标签来为其他资源选择合适的 Pod;例如,选择所有tier: frontendPod 的服务,或选择app.kubernetes.io/name: MyApp的所有phase: test组件。请查看 guestbook 应用程序,了解此方法的示例。通过从服务的选取器中省略特定于版本的标签,可以使服务跨越多个 Deployment。当您需要更新正在运行的服务而不会出现停机时间时,请使用 Deployment。
对象的期望状态由 Deployment 描述,如果对该规范的更改被应用,则 deployment 控制器将以受控速率将实际状态更改为期望状态。
对于通用用例,请使用 Kubernetes 通用标签。这些标准化标签以一种允许工具(包括
kubectl和 仪表盘)以互操作方式工作的方式丰富元数据。您可以操作标签以进行调试。由于 Kubernetes 控制器(如 ReplicaSet)和服务使用选择器标签与 Pod 匹配,因此从 Pod 中删除相关标签将停止控制器对其进行考虑,或停止服务对其提供流量。如果您删除了现有 Pod 的标签,其控制器将创建一个新的 Pod 来代替它。这是一种在“隔离”环境中调试先前“活动”Pod 的有用方法。要交互式删除或添加标签,请使用
kubectl label。
使用 kubectl
使用
kubectl apply -f <directory>。这将在<directory>中的所有.yaml、.yml和.json文件中查找 Kubernetes 配置,并将其传递给apply。对于
get和delete操作,使用标签选择器,而不是使用特定的对象名称。请查看有关 标签选择器 和 有效使用标签 的部分。使用
kubectl create deployment和kubectl expose快速创建单容器 Deployment 和服务。请查看 使用服务访问集群中的应用程序,了解示例。