配置最佳实践
本文档重点介绍并整合了用户指南、入门文档和示例中介绍的配置最佳实践。
这是一个动态文档。如果你想到此列表中没有但可能对其他人有用的内容,请随时提交问题或提交 PR。
通用配置技巧
定义配置时,请指定最新的稳定 API 版本。
配置文件应在推送到集群之前存储在版本控制中。 如果需要,这允许您快速回滚配置更改。 它还有助于集群的重新创建和恢复。
使用 YAML 而不是 JSON 编写配置文件。 虽然这些格式在几乎所有场景中都可以互换使用,但 YAML 往往对用户更友好。
在合理的情况下,将相关对象分组到一个文件中。 一个文件通常比多个文件更容易管理。 请参阅 guestbook-all-in-one.yaml 文件作为此语法的示例。
另请注意,许多
kubectl
命令可以在目录上调用。 例如,您可以在配置文件目录上调用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 的策略(例如 RollingUpdate),几乎总是比直接创建 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 Service。避免使用
hostNetwork
,原因与hostPort
相同。当您不需要
kube-proxy
负载平衡时,请使用 无头服务(其ClusterIP
为None
)进行服务发现。
使用标签
定义和使用 标签,这些标签标识应用程序或 Deployment 的语义属性,例如
{ app.kubernetes.io/name: MyApp, tier: frontend, phase: test, deployment: v3 }
。 您可以使用这些标签来选择其他资源的相应 Pod; 例如,选择所有tier: frontend
Pod 的 Service,或app.kubernetes.io/name: MyApp
的所有phase: test
组件。 有关此方法的示例,请参见 guestbook 应用。通过从其选择器中省略特定于版本的标签,可以使 Service 跨越多个 Deployment。 当您需要更新正在运行的服务而无需停机时,请使用 Deployment。
对象的期望状态由 Deployment 描述,如果将对该规范的更改应用,则 Deployment 控制器会以受控的速率将实际状态更改为期望状态。
对于常见用例,请使用 Kubernetes 通用标签。 这些标准化的标签以一种允许工具(包括
kubectl
和 仪表板)以可互操作的方式工作的方式丰富了元数据。您可以操作标签进行调试。 由于 Kubernetes 控制器(例如 ReplicaSet)和 Service 使用选择器标签与 Pod 匹配,因此从 Pod 中删除相关标签将阻止控制器考虑它或阻止 Service 提供流量。 如果您删除了现有 Pod 的标签,则其控制器将创建一个新 Pod 来代替它。 这是一种在“隔离”环境中调试先前“活动”的 Pod 的有用方法。 要以交互方式删除或添加标签,请使用
kubectl label
。
使用 kubectl
使用
kubectl apply -f <目录>
。这会在<目录>
中的所有.yaml
、.yml
和.json
文件中查找 Kubernetes 配置,并将其传递给apply
。使用
kubectl create deployment
和kubectl expose
来快速创建单容器 Deployment 和 Service。有关示例,请参阅使用 Service 在集群中访问应用程序。