10个 Kubernetes 最佳实践:设计和设置
引言
在这篇博客中将介绍在设置 Kubernetes 集群时必须考虑的高级 kubernetes 集群最佳实践。
一、Kubernetes 网络(云、混合或本地)
Kubernetes 网络的设计方式必须能够适应未来的集群和应用程序需求。
公司常犯的一个 Kubernetes 网络错误是使用不属于公司网络的 CIDR 范围。将来,当他们希望集群位于混合网络中时,最终会进行迁移。
在最终确定网络设计之前,最好与公司的网络团队讨论。这样,即使不是混合网络的一部分,也可以开辟和保留 IP 范围。
每个云提供商都为 Node 和 Pod 网络提供了多个选项。例如:
-
Google Kubernetes Engine 提供多集群服务、具有来自同一 VPC 的可路由 Pod IP 的 VPC 原生集群以及对等 VPC。
-
AWS EKS 为 VPC 原生和基于辅助范围的 Pod 联网提供了选项。
但是,如果不想公开 Pod IP,则可能需要在集群中使用类似 IP 伪装代理之类的东西,以便传出流量始终将节点 IP 作为源身份。
此外,入口和出口流量设计也是必不可少的。可能需要从群集应用连接 API 网关、本地系统、代理服务器和第三方 API。
Kubernetes网络的设计应包括所有访问要求,以便在实施过程中不会面临任何访问限制。
二、 Kubernetes 安全性、合规性和基准测试
- 根据公司的策略了解合规性要求和安全基准。如果使用的是托管服务,请确保它符合公司的合规性策略。
- 可以查看 Kubernetes 的 CIS 基准测试。此外,Aquasec 还有一个名为 Kube-bench 的实用程序,用于针对 kubernetes 集群检查 CIS 基准测试。
- 会不会有任何 PCI/PII 数据应用程序?如果是,则根据公司策略在访问和存储方面隔离这些应用。
- 实现 Pod 安全性(禁用容器根访问、特权访问、只读文件系统等)。
- 安全地访问容器注册表。
- 实施网络策略以控制容器到容器流量,并根据访问要求隔离应用程序。
- 精心设计的 CI/CD 管道可确保在群集中仅部署已批准的容器映像。应扫描容器中的漏洞,如果映像扫描不符合安全要求,则 CI 进程失败。
三、Kubernetes 集群访问
设计和记录 kubernetes 集群的访问方式非常重要。
注意事项:
- 限制手动群集管理员访问权限。相反,群集管理员访问应仅允许通过自动化进行。
- 实施 RBAC 的授权并将其与组织的 IAM 集成。
- 允许通过具有有限权限的服务帐户访问 kubernetes API。
- 使用 CNCF 工具(如 Open Policy Agent 或 Kyverno)实现基于策略的访问,以实现细粒度访问控制
- 考虑 openID connect 的选项
- 有良好的审计机制,用于检查角色并删除未使用的用户、角色、服务帐户等。
设计访问级别,以便可以将职责移交给使用群集的其他团队。这将为每个人节省时间,可以更多地关注工程标准,而不是重复任务。
四、Kubernetes 高可用性和扩展
高可用性是 Kubernetes 集群中的另一个关键因素。需要考虑不同可用区的工作器节点可用性。此外,请考虑 Pod 拓扑扩展约束,以在不同的可用区中传播 Pod。
当我们谈论扩展时,它不仅仅是实例或 Pod 的自动扩展。这是关于如何在没有任何服务中断的情况下优雅地缩减和纵向扩展应用程序。
根据需要托管在 kubernetes 上的应用类型,可以设计部署,以便在缩减和修补活动期间优雅地逐出 Pod。
五、Kubernetes 入口
Ingress 是 Kubernetes 集群的重要组成部分。有很多方法可以设置 kubernetes 入口。此外,还有不同类型的入口控制器。可以尝试适合公司合规性策略和缩放要求的最佳选项。
非必须因素:
- 为平台工具提供单独的入口控制器。
- 入口端点的 SSL 管理。
- 不要尝试通过同一个入口路由所有应用。
六、Kubernetes 备份和还原策略
无论是托管服务还是自定义 kubernetes 实现,备份集群都是必不可少的。当我们说备份时,它主要是备份etcd。
应该有一个非常好的设计来自动备份 kubernetes 集群及其相关组件。此外,还需要有还原集群的设计。还有一些选项可以以 JSON 格式转储现有对象。可以使用 dump 还原同一或不同集群中的对象。
七、Kubernetes 节点 & 容器镜像修补 & 生命周期管理
修补是一个重复的过程。当涉及到 kubernetes 时,有节点和容器补丁。
例如:
- 与容器扫描工具集成的自动化管道,可按月计划修补容器映像。
- 用于在不停机的情况下执行节点修补的自动化管道。
- 用于管理容器映像生命周期的自动化管道。
八、Kubernetes 集群升级
通常通过两种方式执行集群升级
- 升级现有集群(就地升级)
- 创建新集群并将应用迁移到新集群。
需要一个非常好的自动化管道设计来执行集群升级。在升级过程中,网络、DNS 和其他组件可能会发生更改。这完全取决于设计和公司策略。
九、Kubernetes 集群容量和存储
集群容量是一个非常重要的讨论话题。需要确定需要运行的集群数。
一些公司更喜欢运行多个集群,以减小爆炸半径并易于维护。而另一些人则更喜欢具有大量工作节点的大型集群或具有巨大实例容量的较少数量的节点。
可以根据自己的需求和管理集群的团队规模来决定集群容量。
接下来是存储部分。规划将卷附加到容器的方式。遵循 Kubernetes 上的所有标准存储安全实践。
在云方面,有开箱即用的支持来配置存储,
如果计划运行有状态集,则设计存储以获得高吞吐量和最大可用性非常重要。
十、Kubernetes 日志记录和监控
大多数公司都会有一个集中的日志记录和监控系统,他们更喜欢将 kubernetes 与这些系统集成。
一些日志记录和监视最佳做法:
- 找出将生成的日志数据量的估计值。
- 考虑到巨大的数据量,将 Kubernetes 日志摄取到日志记录系统的机制。
- 扩展群集中部署的日志记录和监视组件。
- 根据组织的策略保留数据。
- 定义并记录用于监视的 KPI。
总结
这些是一些 kubernetes 设计最佳实践,在设置 kubernetes 集群时经常被遗漏。
在实施 kubernetes 时缺少这些方面可能会导致整个集群出现问题,并可能对业务造成损害。
这不仅仅是使用自动化创建 Kubernetes 集群,还需要考虑 Kubernetes 集群生命周期管理,并相应地规划自动化工作。
理想情况下,解决方案/技术架构师在设计集群架构时应将所有提到的项目(可能有很多但值得考虑)作为清单,以确保在 IaaC 开发期间实现它们。