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

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

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

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

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

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

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

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

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


当前回答

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

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

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

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

其他回答

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

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

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

多集群注意事项

看看Vadim Eisenberg (IBM / Istio)的这篇博客文章:清单:使用多个Kubernetes集群的优缺点,以及如何在它们之间分配工作负载。

我想强调一些优点和缺点:

使用多个集群的原因 生产/开发/测试分离:特别适用于测试Kubernetes的新版本、服务网格或其他集群软件 遵从性:根据一些规定,一些应用程序必须运行在单独的集群/单独的vpn中 更好的安全性隔离 Cloud/on-prem:在内部服务之间分配负载 使用单个集群的原因 减少设置、维护和管理开销 提高利用率 降低成本

考虑到一个不太昂贵的环境,普通的维护,但仍然确保生产应用程序的安全隔离,我建议:

1个用于DEV和登台的集群(通过名称空间分隔,甚至可能使用网络策略隔离,就像在Calico中一样) 1个集群用于PROD

环境平价

保持开发、分期和生产尽可能相似是一个很好的实践:

支持服务之间的差异意味着微小的不兼容性 突然出现,导致代码在开发中工作并通过测试或 在生产中登台失败。这些类型的错误会产生摩擦 这削弱了持续部署的动力。

将强大的CI/CD工具与头盔相结合。您可以使用helm值的灵活性来设置默认配置,只需要覆盖不同环境的配置即可。

带有AutoDevops的GitLab CI/CD与Kubernetes进行了强大的集成,允许您管理多个已经具有helm支持的Kubernetes集群。

管理多个集群(kubectl交互)

当您使用多个Kubernetes集群时,很容易 搞砸上下文,在错误的集群中运行kubectl。除了 也就是说,Kubernetes有版本不匹配的限制 客户端(kubectl)和服务器(kubernetes master),因此运行命令 在正确的上下文中并不意味着运行正确的客户端版本。

要克服这个问题:

使用asdf管理多个kubectl版本 将KUBECONFIG env var设置为在多个KUBECONFIG文件之间进行更改 使用kube-ps1跟踪当前上下文/名称空间 使用kubectx和kubens在集群/命名空间之间快速切换 使用别名将它们组合在一起

我有一篇文章举例说明了如何实现这一点:在多个Kubernetes集群中使用不同的kubectl版本

我还推荐以下内容:

掌握KUBECONFIG文件由Ahmet Alp Balkan(谷歌工程师) Zalando如何管理140多个Kubernetes集群

除非遵从性或其他需求另有规定,否则我倾向于对所有环境使用单个集群。采用这种方法,注意事项如下:

Make sure you also group nodes per environment using labels. You can then use the nodeSelector on resources to ensure that they are running on specific nodes. This will reduce the chances of (excess) resource consumption spilling over between environments. Treat your namespaces as subnets and forbid all egress/ingress traffic by default. See https://kubernetes.io/docs/concepts/services-networking/network-policies/. Have a strategy for managing service accounts. ClusterRoleBindings imply something different if a clusters hosts more than one environment. Use scrutiny when using tools like Helm. Some charts blatantly install service accounts with cluster-wide permissions, but permissions to service accounts should be limited to the environment they are in.

使用多个集群是一种规范,至少可以强制执行生产和“非生产”之间的强烈分离。

本着这种精神,请注意GitLab 13.2(2020年7月)现在包括:

Core中部署多个Kubernetes集群

使用GitLab部署多个Kubernetes集群之前需要高级许可证。 我们的社区发表了意见,我们也听取了意见:部署到多个集群甚至对个人贡献者也是有用的。 根据您的反馈,从GitLab 13.2开始,您可以在Core中部署到多个组和项目集群。

请参阅文档和版本。

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

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

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

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