单个 K8S 部署中的多个应用程序

Multiple apps in single K8S deployment

我正在探索 K8S 的可能性,我想知道是否有任何方法可以在单个部署中为两个或多个应用程序创建部署,因此它是事务性的——当部署后出现问题时,所有应用程序都会回滚。另外我想提一下,我不是在谈论带有多个容器的 pod,因为额外的 side car 容器是为了一些横切问题,如监控、身份验证(如 kerberos)等,但它不建议将不同的应用程序放在一个 pod 中。考虑到这一点,是否可以进行单一部署来产生 2 种以上的 pods?

头盔

正如评论中所指出的,解决此问题的一种方法是使用类似 Helm 的东西。

Helm 是某种客户端(从 v3 开始。之前还涉及“tiller”,一个在您的 kubernetes 集群中 运行 的控制器:让我们忘记它 one/deprecated)。

Helm 使用“图表”(或多或少:模板,您可以覆盖默认值)。

自定义

另一个类似于 Helm 的解决方案是 Kustomize。使用 plain-text 个文件(不是模板),同时在将对象应用到 Kubernetes 集群之前覆盖/自定义对象变得简单。

ArgoCD

虽然 Kustomize 和 Helm 都是独立的客户端,但我们还可以提及 ArgoCD 等解决方案。

ArgoCD 控制器将 运行 在您的 Kubernetes 集群中,允许您创建“应用程序”对象。

这些应用程序由 ArgoCD 处理,推动您的工作负载部署(这些应用程序的常见来源包括 Helm Charts、Git 存储库,...)。

ArgoCD 的优势在于他们的控制器可能(取决于您的配置)随着时间的推移负责升级您的应用程序(例如:如果您的源是 git 存储库,分支 XXX,并且有人推送更改进入该分支:argocd 会立即应用这些)

运算符

尽管这些解决方案中的大多数几乎都不知道您的应用程序是如何 运行ning 的。假设您升级了由 Helm、Kustomize 或 ArgoCD 驱动的部署,并最终导致某些数据库 pods 卡在 crashloopbackoff 中:尽管如此,您的应用程序 pods 仍会得到更新,不会自动回滚到以前的工作配置.

这将我们带到另一种将应用程序传送到 Kubernetes 的方式:操作员。

操作员知道您的工作负载状态,并且可能能够修复常见错误(取决于它的编码方式,...没有魔法)。

Operator 是一个应用程序(可以在 Go、Java、Python、Ansible 剧本中,...或者与 Kubernetes 集群通信的库中的任何一个 API )

一个操作员一直连接到您的 Kubernetes 集群 API。您通常会找到一些特定于您的操作员的 CustomResourceDefinitions,允许您描述集群中某些组件的部署。 (例如:elasticsearch 运算符引入了一个对象种类“ElasticSearch”和一些“Kibana”)

操作员监视它管理的对象的实例(例如:ElasticSearch),最终创建 Deployment/StatefulSets/Services ... 如果有人删除了由您的操作员创建的对象,它 would/should 将由该操作员及时 re-created (里程可能会有所不同,具体取决于我们正在谈论的操作员......)

操作员的完美示例类似于 OpenShift 4 (OKD4)。一个 Kubernetes 集群,带有 10 个操作员(SDN、DNS、机器配置、入口控制器、kubernetes API 服务器、etcd 数据库,...)。整个集群是操作员的集合:升级你的集群,每个人都会以一种协调的方式管理相应服务的升级,......一个接一个,......如果有任何失败,你仍然通常剩下足够的副本 运行 解决问题,...


根据您要查找的内容,每个选项都有优点和缺点。现在,如果您正在寻找“可以产生 2 种以上 pods 的单一部署”,那么 ArgoCD 或某些 home-grown 运算符将符合条件。

Is it possible to have single deployment that can produce 2+ kind of pods?

没有。 Deployment 只会创建一种 Pod。您可以更新 Deployment 的内容,它会逐步将现有 Pods 替换为与更新后的 Pod 规范匹配的新内容。

没有什么能阻止您创建多个 Deployment,为每种 Pod 创建一个 Deployment,这可能就是您在这里寻找的方法。

... when something is wrong after deployment all apps are rollbacked.

核心 Kubernetes 本身不具备此功能;事实上,除了容器未通过健康检查或正在退出之外,它判断出现问题的能力有些有限。

I at least have some experience with Helm. It's not quite "transactional" in the sense you might take from a DBMS, but it does have the ability to manage a collection of related resources (a "release" of a "chart") and it has the ability to roll back an entire version of a release across multiple Deployments if required. See the helm rollback command 中的各种工具中。