使用K8S管理多个环境(QA、登台、生产、开发等)的良好实践是什么?
例如,假设一个团队正在开发一个产品,该产品需要部署一些api和前端应用程序。通常,这至少需要2个环境:
阶段:在发布到客户端之前进行迭代/测试和验证
生产环境:这是客户端可以访问的环境。应该包含稳定且经过良好测试的特性。
因此,假设团队正在使用Kubernetes,那么托管这些环境的良好实践是什么呢?到目前为止,我们已经考虑了两种选择:
为每个环境使用K8s集群
只使用一个K8s集群,并将它们保存在不同的名称空间中。
(1)似乎是最安全的选择,因为它最大限度地减少了潜在的人为错误和机器故障的风险,这可能会使生产环境处于危险之中。然而,这带来了更多主机的成本,以及更多基础设施管理的成本。
(2)看起来它简化了基础设施和部署管理,因为只有一个集群,但它提出了一些问题,比如:
如何确保人为错误会影响生产环境?
如何确保登台环境中的高负载不会导致生产环境中的性能损失?
可能还有一些其他的担忧,所以我正在StackOverflow上接触K8s社区,以更好地了解人们是如何应对这类挑战的。
很明显,通过将生产集群与阶段集群分开,可以降低潜在错误影响生产服务的风险。然而,这是以更多的基础设施/配置管理为代价的,因为它至少需要:
生产集群至少有3个主节点,登台集群至少有一个主节点
2需要添加到CI/CD系统的Kubectl配置文件
我们也不要忘记,环境可能不止一种。例如,我曾经工作过的公司至少有3种环境:
QA:这是我们进行日常部署的地方,也是我们在向客户发布之前进行内部QA的地方)
客户端QA:这是我们在部署到生产环境之前部署的地方,这样客户端可以在发布到生产环境之前验证环境)
生产:部署生产服务的地方。
我认为临时/按需集群是有意义的,但只适用于某些用例(负载/性能测试或非常«大»集成/端到端测试),但对于更持久/粘性的环境,我认为在单个集群中运行它们可能会减少开销。
我想我想接触k8s社区,看看对于我所描述的这种场景使用了什么模式。
我认为有一个中间点。我正在使用eks和节点组。主服务器由aws管理、扩展和维护。然后你可以创建3种类型的节点组(只是一个例子):
1 - General Purpose ->标签:environment= General - Purpose
2 -暂存->标签:环境=暂存(如有必要,会被污染)
3 - Prod ->标签:环境=生产(如有必要,有污染)
您可以在pod上使用公差和节点选择器,以便将它们放置在应该放置的位置。
这允许您为生产的节点组使用更健壮或更强大的节点,例如,用于登台、uat、qa等的SPOT实例……它有几个很大的优点:
环境在物理上是分离的(在名称空间中也是虚拟的)
您可以通过共享主节点和两个环境共享的一些带有pod的节点,以及在staging/uat/…中使用现货或更便宜的实例来降低成本。
没有集群管理开销
您必须注意角色和策略以确保其安全。您可以使用例如eks+calico来实现网络策略。
更新:
我找到了一个在使用EKS时可能有用的文档。它提供了一些关于如何安全运行多租户集群的详细信息,其中一些详细信息可能有助于将生产pod和名称空间与登台中的名称空间隔离开来。
https://aws.github.io/aws-eks-best-practices/security/docs/multitenancy/