生产环境
生产级 Kubernetes 集群需要规划和准备。如果您的 Kubernetes 集群要运行关键工作负载,则必须将其配置为具有弹性。本页面介绍了您可以采取的步骤来设置生产就绪集群,或将现有集群提升为生产用途。如果您已经熟悉生产设置并希望获取链接,请跳至下一步。
生产注意事项
通常,生产 Kubernetes 集群环境比个人学习、开发或测试环境 Kubernetes 有更多要求。生产环境可能需要许多用户的安全访问、一致的可用性以及适应不断变化的需求的资源。
在您决定将生产 Kubernetes 环境放在哪里(本地还是云端)以及您希望承担或交给其他人的管理量时,请考虑以下问题如何影响您对 Kubernetes 集群的要求
可用性:单机 Kubernetes 学习环境 存在单点故障。创建高可用性集群意味着要考虑
- 将控制平面与工作节点分离。
- 在多个节点上复制控制平面组件。
- 将流量负载均衡到集群的 API 服务器。
- 拥有足够多的可用工作节点,或者能够根据不断变化的工作负载快速变得可用。
规模:如果您预计您的生产 Kubernetes 环境将收到稳定的需求量,您也许可以根据您需要的容量进行设置并完成。但是,如果您预计需求会随着时间的推移而增长,或者会根据季节或特殊事件等因素发生巨大变化,则需要计划如何扩展以缓解对控制平面和工作节点的更多请求带来的压力,或者缩减以减少未使用的资源。
安全和访问管理:您对自己的 Kubernetes 学习集群拥有完全的管理员权限。但是,具有重要工作负载以及多个用户的共享集群需要对谁以及什么可以访问集群资源采取更精细的方法。您可以使用基于角色的访问控制(RBAC)和其他安全机制来确保用户和工作负载可以访问他们需要的资源,同时保持工作负载和集群本身的安全。您可以通过管理策略和容器资源来设置用户和工作负载可以访问的资源限制。
在自行构建 Kubernetes 生产环境之前,请考虑将部分或全部工作交给交钥匙云解决方案提供商或其他Kubernetes 合作伙伴。选项包括
- 无服务器:只需在第三方设备上运行工作负载,而无需管理集群。您将按 CPU 使用率、内存和磁盘请求等因素付费。
- 托管控制平面:让提供商管理集群控制平面的规模和可用性,以及处理补丁和升级。
- 托管工作节点:配置节点池以满足您的需求,然后提供商确保这些节点可用,并在需要时准备好实施升级。
- 集成:有些提供商将 Kubernetes 与您可能需要的其他服务集成,例如存储、容器注册表、身份验证方法和开发工具。
无论您是自己构建生产 Kubernetes 集群还是与合作伙伴合作,请查看以下部分,以评估与集群的控制平面、工作节点、用户访问和工作负载资源相关的需求。
生产集群设置
在生产级 Kubernetes 集群中,控制平面通过可以以不同方式分布在多台计算机上的服务来管理集群。但是,每个工作节点都代表一个配置为运行 Kubernetes Pod 的单个实体。
生产控制平面
最简单的 Kubernetes 集群在同一台机器上运行整个控制平面和工作节点服务。您可以通过添加工作节点来扩展该环境,如Kubernetes 组件图所示。如果集群只需要运行一小段时间,或者在出现严重错误时可以丢弃,那么这可能就足够了。
但是,如果您需要更持久、高可用的集群,则应考虑扩展控制平面的方法。根据设计,在单台机器上运行的单机控制平面服务不具备高可用性。如果保持集群正常运行并确保在出现问题时可以修复它很重要,请考虑以下步骤
- 选择部署工具:您可以使用 kubeadm、kops 和 kubespray 等工具部署控制平面。请参阅使用部署工具安装 Kubernetes,以了解使用每种部署方法进行生产级部署的技巧。可以使用不同的容器运行时进行部署。
- 管理证书:控制平面服务之间的安全通信是使用证书实现的。证书会在部署期间自动生成,您也可以使用自己的证书颁发机构生成证书。有关详细信息,请参阅PKI 证书和要求。
- 为 apiserver 配置负载均衡器:配置负载均衡器以将外部 API 请求分发到在不同节点上运行的 apiserver 服务实例。有关详细信息,请参阅创建外部负载均衡器。
- 分离和备份 etcd 服务:etcd 服务可以与其他控制平面服务在同一台机器上运行,也可以在不同的机器上运行,以提高安全性和可用性。由于 etcd 存储集群配置数据,因此应定期备份 etcd 数据库,以确保在需要时可以修复该数据库。有关配置和使用 etcd 的详细信息,请参阅etcd 常见问题解答。有关详细信息,请参阅为 Kubernetes 运行 etcd 集群和使用 kubeadm 设置高可用性 etcd 集群。
- 创建多个控制平面系统:为了实现高可用性,控制平面不应局限于单台机器。如果控制平面服务由 init 服务(例如 systemd)运行,则每个服务应至少在三台机器上运行。但是,在 Kubernetes 中以 Pod 形式运行控制平面服务可确保您请求的复制服务数量始终可用。调度器应该是容错的,但不是高可用的。一些部署工具设置了Raft一致性算法来对 Kubernetes 服务进行领导者选举。如果主节点消失,另一个服务会自行选举并接管。
- 跨越多个区域:如果保持集群始终可用至关重要,请考虑创建一个跨多个数据中心运行的集群,在云环境中称为区域。区域组称为地区。通过将集群分布在同一地区内的多个区域,即使一个区域不可用,也可以提高集群继续运行的可能性。有关详细信息,请参阅在多个区域中运行。
- 管理持续功能:如果您计划长期保留集群,则需要执行一些任务来维护其运行状况和安全性。例如,如果您使用 kubeadm 安装,则有一些说明可以帮助您进行证书管理和升级 kubeadm 集群。有关 Kubernetes 管理任务的更长列表,请参阅管理集群。
要了解运行控制平面服务时的可用选项,请参阅kube-apiserver、kube-controller-manager和kube-scheduler组件页面。有关高可用性控制平面示例,请参阅高可用性拓扑选项、使用 kubeadm 创建高可用性集群和为 Kubernetes 运行 etcd 集群。有关制定 etcd 备份计划的信息,请参阅备份 etcd 集群。
生产工作节点
生产级工作负载需要具有弹性,并且它们依赖的任何内容都需要具有弹性(例如 CoreDNS)。无论您是管理自己的控制平面还是让云提供商为您管理,您仍然需要考虑如何管理您的工作节点(也简称为节点)。
- 配置节点:节点可以是物理机或虚拟机。如果要创建和管理自己的节点,可以安装受支持的操作系统,然后添加并运行相应的节点服务。考虑
- 在设置节点时,通过提供适当的内存、CPU、磁盘速度和存储容量来满足工作负载的需求。
- 是使用通用计算机系统,还是您的工作负载需要 GPU 处理器、Windows 节点或虚拟机隔离。
- 验证节点:有关如何确保节点满足加入 Kubernetes 集群的要求的信息,请参阅有效的节点设置。
- 将节点添加到集群:如果您正在管理自己的集群,则可以通过设置自己的机器并将它们手动添加或让它们自己注册到集群的 apiserver 来添加节点。有关如何设置 Kubernetes 以通过这些方式添加节点的信息,请参阅节点部分。
- 扩展节点:制定一个计划,以扩展您的集群最终需要的容量。请参阅大型集群的注意事项,以根据您需要运行的 Pod 和容器的数量来帮助确定您需要的节点数量。如果您是自己管理节点,这可能意味着购买和安装您自己的物理设备。
- 自动扩展节点:阅读集群自动扩展,了解有关自动管理节点及其提供的容量的可用工具。
- 设置节点健康检查:对于重要的工作负载,您需要确保节点和在这些节点上运行的 Pod 是健康的。使用节点问题检测器守护进程,您可以确保您的节点是健康的。
生产用户管理
在生产环境中,您可能会从您或一小群人访问集群的模型转变为可能有数十或数百人访问集群的模型。在学习环境或平台原型中,您可能对您所做的一切都使用一个管理帐户。在生产环境中,您需要更多具有不同命名空间的不同访问级别的帐户。
采用生产级集群意味着要决定如何选择性地允许其他用户访问。特别是,您需要选择策略来验证尝试访问您的集群的人员的身份(身份验证),并决定他们是否有权限执行他们所要求的操作(授权)。
- 身份验证:apiserver 可以使用客户端证书、持有者令牌、身份验证代理或 HTTP 基本身份验证来对用户进行身份验证。您可以选择要使用的身份验证方法。通过使用插件,apiserver 可以利用您组织现有的身份验证方法,例如 LDAP 或 Kerberos。有关这些不同 Kubernetes 用户身份验证方法的说明,请参阅身份验证。
- 授权:当您着手授权您的常规用户时,您可能会在 RBAC 和 ABAC 授权之间进行选择。请参阅授权概述,以查看授权用户帐户(以及服务帐户访问您的集群)的不同模式。
- 基于角色的访问控制(RBAC):允许您通过允许对已通过身份验证的用户使用特定的权限集来分配对集群的访问权限。可以为特定命名空间(角色)或整个集群(集群角色)分配权限。然后,使用 RoleBindings 和 ClusterRoleBindings,可以将这些权限附加到特定用户。
- 基于属性的访问控制(ABAC):允许您根据集群中的资源属性创建策略,并将根据这些属性允许或拒绝访问。策略文件的每一行都标识了版本属性(apiVersion 和 kind)以及一个 spec 属性映射,以匹配主题(用户或组)、资源属性、非资源属性(/version 或 /apis)和 readonly。有关详细信息,请参阅示例。
作为在您的生产 Kubernetes 集群上设置身份验证和授权的人员,您需要考虑以下几点:
- 设置授权模式:当 Kubernetes API 服务器(kube-apiserver)启动时,必须使用--authorization-mode标志设置支持的身份验证模式。例如,kube-adminserver.yaml文件(位于/etc/kubernetes/manifests中)中的该标志可以设置为 Node,RBAC。这将允许对已通过身份验证的请求进行节点和 RBAC 授权。
- 创建用户证书和角色绑定 (RBAC):如果您使用的是 RBAC 授权,则用户可以创建可以由集群 CA 签名的证书签名请求 (CSR)。然后,您可以将角色和集群角色绑定到每个用户。有关详细信息,请参阅证书签名请求。
- 创建组合属性的策略 (ABAC):如果您使用的是 ABAC 授权,则可以分配属性组合以形成策略,以授权选定的用户或组访问特定资源(例如 Pod)、命名空间或 apiGroup。有关更多信息,请参阅示例。
- 考虑准入控制器:可以通过 API 服务器传入的请求的其他授权形式包括Webhook 令牌身份验证。需要通过向 API 服务器添加准入控制器来启用 Webhook 和其他特殊授权类型。
设置工作负载资源的限制
来自生产工作负载的需求可能会导致 Kubernetes 控制平面内部和外部的压力。在为集群工作负载的需求进行设置时,请考虑以下事项:
- 设置命名空间限制:设置每个命名空间的配额,例如内存和 CPU。有关详细信息,请参阅管理内存、CPU 和 API 资源。您还可以设置分层命名空间以继承限制。
- 为 DNS 需求做好准备:如果您预计工作负载会大量扩展,则您的 DNS 服务也必须准备好扩展。请参阅在集群中自动扩展 DNS 服务。
- 创建其他服务帐户:用户帐户确定用户可以在集群上执行的操作,而服务帐户定义特定命名空间内的 Pod 访问权限。默认情况下,Pod 从其命名空间获取默认服务帐户。有关创建新服务帐户的信息,请参阅管理服务帐户。例如,您可能希望:
- 添加 Pod 可以用来从特定容器注册表中提取镜像的密钥。有关示例,请参阅为 Pod 配置服务帐户。
- 将 RBAC 权限分配给服务帐户。有关详细信息,请参阅服务帐户权限。