使用K8S管理多个环境(QA、登台、生产、开发等)的良好实践是什么?

例如,假设一个团队正在开发一个产品,该产品需要部署一些api和前端应用程序。通常,这至少需要2个环境:

阶段:在发布到客户端之前进行迭代/测试和验证 生产环境:这是客户端可以访问的环境。应该包含稳定且经过良好测试的特性。

因此,假设团队正在使用Kubernetes,那么托管这些环境的良好实践是什么呢?到目前为止,我们已经考虑了两种选择:

为每个环境使用K8s集群 只使用一个K8s集群,并将它们保存在不同的名称空间中。

(1)似乎是最安全的选择,因为它最大限度地减少了潜在的人为错误和机器故障的风险,这可能会使生产环境处于危险之中。然而,这带来了更多主机的成本,以及更多基础设施管理的成本。

(2)看起来它简化了基础设施和部署管理,因为只有一个集群,但它提出了一些问题,比如:

如何确保人为错误会影响生产环境? 如何确保登台环境中的高负载不会导致生产环境中的性能损失?

可能还有一些其他的担忧,所以我正在StackOverflow上接触K8s社区,以更好地了解人们是如何应对这类挑战的。


当前回答

我认为运行单个集群是有意义的,因为它减少了开销和监控。但是,你必须确保网络策略和访问控制到位。

网络策略——禁止开发/qa环境工作负载与prod/staging存储交互。

访问控制——谁可以使用clusterrole、role等访问不同的环境资源。

其他回答

很明显,通过将生产集群与阶段集群分开,可以降低潜在错误影响生产服务的风险。然而,这是以更多的基础设施/配置管理为代价的,因为它至少需要:

生产集群至少有3个主节点,登台集群至少有一个主节点 2需要添加到CI/CD系统的Kubectl配置文件

我们也不要忘记,环境可能不止一种。例如,我曾经工作过的公司至少有3种环境:

QA:这是我们进行日常部署的地方,也是我们在向客户发布之前进行内部QA的地方) 客户端QA:这是我们在部署到生产环境之前部署的地方,这样客户端可以在发布到生产环境之前验证环境) 生产:部署生产服务的地方。

我认为临时/按需集群是有意义的,但只适用于某些用例(负载/性能测试或非常«大»集成/端到端测试),但对于更持久/粘性的环境,我认为在单个集群中运行它们可能会减少开销。

我想我想接触k8s社区,看看对于我所描述的这种场景使用了什么模式。

这取决于您想在每个场景中测试什么。一般来说,我会尽量避免在生产集群上运行测试场景,以避免不必要的副作用(性能影响等)。

如果您打算使用一个完全模仿生产系统的登台系统进行测试,我建议启动一个完整集群的精确副本,并在完成测试后将其关闭,并将部署转移到生产系统。

如果您的目的是测试一个允许测试应用程序部署的登台系统,我会永久地运行一个较小的登台集群,并根据需要更新部署(也包括部署的缩小版本)以进行持续测试。

为了控制不同的集群,我更喜欢使用独立的ci/cd机器,它不是集群的一部分,但用于启动和关闭集群,以及执行部署工作,启动测试等。这允许设置和关闭集群作为自动化测试场景的一部分。

我认为运行单个集群是有意义的,因为它减少了开销和监控。但是,你必须确保网络策略和访问控制到位。

网络策略——禁止开发/qa环境工作负载与prod/staging存储交互。

访问控制——谁可以使用clusterrole、role等访问不同的环境资源。

这里有一些想法:

Do not trust namespaces to protect the cluster from catastrophe. Having separate production and non-prod (dev,stage,test,etc) clusters is the minimum necessary requirement. Noisy neighbors have been known to bring down entire clusters. Separate repositories for code and k8s deployments (Helm, Kustomize, etc.) will make best practices like trunk-based development and feature-flagging easier as the teams scale. Using Environments as a Service (EaaS) will allow each PR to be tested in its own short-lived (ephemeral) environment. Each environment is a high-fidelity copy of production (including custom infrasture like database, buckets, dns, etc.), so devs can remotely code against a trustworthy environment (NOT minikube). This can help reduce configuration drift, improve release cycles, and improve the overall dev experience. (disclaimer: I work for an EaaS company).

一定要使用单独的集群进行开发和创建docker映像,这样您的登台/生产集群就可以锁定安全性。是否使用单独的集群进行分期和生产取决于您的风险/成本-当然,保持它们分开将有助于避免分期影响生产。

我还强烈推荐使用GitOps在不同的环境中推广不同版本的应用程序。

为了尽量减少人为错误,我还建议你尽可能地将CI/CD和晋升自动化。

下面是一个演示如何在Kubernetes上的多个环境中使用GitOps在环境和Pull Requests上的预览环境之间进行自动化CI/CD的演示,尽管Jenkins X支持大多数Kubernetes集群