kubernetes 中每个部署的命名空间

Namespace per deployment in kubernetes

我需要有关管理 K8S 部署的建议。我需要使用 gitops 进行 blue/green 部署,这基本上让我有两个选择:

1。使用单一命名空间。

这将需要使用 helm 来管理删除资源等,并通过 helm 代理管理 blue/green,而这又需要创建重复的部署模板(绿色和蓝色)。

优点:由 helm 管理,将删除已删除的资源;好像是一般的做法。

缺点:由 helm 管理,可能会搞砸,especially in multiple failed deployments;如果有人快速 fix/add 一些资源并且不会提交回购协议,则可以创建雪花命名空间;

2。每个部署使用一个命名空间

只需将每个修订部署到它的命名空间,如 web-front-2142,检查,提升到入口,然后删除所有其他 web-front-[\ d] 我仍然可以使用 helm 模板引擎,但没有 tiller。无需依赖 tiller 管理资源 - 命名空间将在生产命名空间提升后删除。

我需要为入口创建单独的命名空间,因为它是单一资源,但这将是一个非常简单的命名空间,类似于 web-front-ingress.

优点:没有雪花,每个部署都是完全从 repo 创建的;如果有效-有效;不以任何方式依赖以前的部署,如果以前的部署完全是 foobar-ed,那没关系。

缺点:单独的命名空间用于单一资源,如入口;似乎不是 k8s 的设计方式,可能会导致无法预料的后果;包括 spinnaker 在内的所有部署工具都围绕单个命名空间部署展开。


需要一些建议和最佳实践! :)

官方documentation提到了以下内容:

Namespaces are intended for use in environments with many users spread across multiple teams, or projects. For clusters with a few to tens of users, you should not need to create or think about namespaces at all. Start using namespaces when you need the features they provide.

It is not necessary to use multiple namespaces just to separate slightly different resources, such as different versions of the same software: use labels to distinguish resources within the same namespace.

Kubernetes Namespaces: use cases and insights" 文章详细介绍了使用名称空间的最佳方法。 不建议对版本控制软件使用不同的命名空间:

An easy to grasp anti-pattern for Kubernetes namespaces is versioning. You should not use Namespaces as a way to disambiguate versions of your Kubernetes resources. Support for versioning is present in the containers and container registries as well as in Kubernetes Deployment resource. Multiple versions should coexist by utilizing the Kubernetes container model which also provides for auto migration between versions with deployments. Furthermore versions scope namespaces will cause massive proliferation of namespaces within a cluster making it hard to manage.

其他资源(例如 GCPB)描述了命名空间的用法,主要用于为不同阶段、团队、项目、客户分离 Kubernetes 对象。
因此,您可以假设为蓝绿部署或金丝雀部署使用单独的命名空间并不是一种非常常见的方法。

所以,基本上我已经确定了一个答案 - 单一名称空间是一种可行的方法。主要是因为单一资源,如 PVC,不能在命名空间之间共享。

但主要的顿悟是您不必使用舵柄!您仍然可以使用 helm 模板,而 K8S 标签就是您所需要的!例如,我使用 jenkins 作为构建器和版本器。它设置了 managed_by: jenkinsversion: <build_number> 之类的标签,所以我在部署时要做的就是找到所有具有相同 name 且版本低于当前版本的资源并修补它们,然后添加新的资源,并删除所有不再存在的资源 managed_by: jenkins(按其 name)。我已经构建了这个简单的案例,它似乎工作得很好。