使用K8S管理多个环境(QA、登台、生产、开发等)的良好实践是什么?
例如,假设一个团队正在开发一个产品,该产品需要部署一些api和前端应用程序。通常,这至少需要2个环境:
阶段:在发布到客户端之前进行迭代/测试和验证
生产环境:这是客户端可以访问的环境。应该包含稳定且经过良好测试的特性。
因此,假设团队正在使用Kubernetes,那么托管这些环境的良好实践是什么呢?到目前为止,我们已经考虑了两种选择:
为每个环境使用K8s集群
只使用一个K8s集群,并将它们保存在不同的名称空间中。
(1)似乎是最安全的选择,因为它最大限度地减少了潜在的人为错误和机器故障的风险,这可能会使生产环境处于危险之中。然而,这带来了更多主机的成本,以及更多基础设施管理的成本。
(2)看起来它简化了基础设施和部署管理,因为只有一个集群,但它提出了一些问题,比如:
如何确保人为错误会影响生产环境?
如何确保登台环境中的高负载不会导致生产环境中的性能损失?
可能还有一些其他的担忧,所以我正在StackOverflow上接触K8s社区,以更好地了解人们是如何应对这类挑战的。
多集群注意事项
看看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集群