有没有办法将具有相同应用程序的两个容器连接到Kubernetes上的同一数据库?

时间:2018-07-24 13:47:51

标签: kubernetes distributed-system

我需要运行一个应用程序的两个“实例”,但是它们应该访问同一个数据库,并且我需要在我的Kubernetes集群上运行它,以便为用户提供多可用区访问。

可以在Kubernetes上实现吗?我需要StatefulSet吗?而且,更重要的是,是否可以使用Kubernetes管理DB Pod?

1 个答案:

答案 0 :(得分:2)

  

我需要运行一个应用程序的两个“实例”,但是它们应该访问同一个数据库,并且我需要在我的Kubernetes集群上运行它,以便为用户提供多可用区访问。

这实际上取决于您 instances 的意思。推荐的方法是使用apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: run: my_app name: my_app spec: replicas: 2 selector: matchLabels: run: my_app template: metadata: labels: run: my_app spec: containers: - image: my_app:version name: my_app 创建部署,如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: my_app_1
  name: my_app_1
spec:
  replicas: 1
  selector:
    matchLabels:
      run: my_app_1
  template:
    metadata:
      labels:
        run: my_app_1
    spec:
      containers:
      - image: my_app:version
        name: my_app_1

这将确保您具有该应用程序的2个“实例”。

如果需要使用不同的配置运行2个“实例”,则可以选择进行两个不同的部署,并更改它们的名称和标签:

[ServiceFilter(typeof(TrackingAttribute), Order = 2)]

将这两个实例连接到数据库非常容易,您只需将数据库连接字符串作为配置选项传递给数据库。它可以存在于集群内部或外部。

  

我需要StatefulSet吗?

仅当您的应用需要具有可预测的名称并以某种方式存储状态时,才需要有状态集。

  

更重要的是,是否可以使用Kubernetes管理DB Pod?

完全有可能在集群中运行数据库。这样做是否好取决于您。

传统上,数据库在意外中断方面不是很好。使用Kubernetes,有可能随时移动数据库容器,这可能会导致您的应用程序或数据库出现问题。

您将需要使用persistent volume配置某种可重新连接的存储,但是即使那样,也不能保证您的数据库会抵抗Kubernetes重启它和重启数据库的行为。

有些数据库可以在Kubernetes中更成功地运行,例如Vitess可以解决您的问题。