有没有办法让两个具有相同应用程序的容器连接到 Kubernetes 上的同一个数据库?
Is there a way to two containers with same app connect to same DB on Kubernetes?
我需要 运行 一个应用程序的两个 "instances",但它们应该访问同一个数据库,我需要它在我的 Kubernetes 集群上 运行,这样我就可以为用户提供多可用区访问。
是否可以在Kubernetes上实现?我需要 StatefulSets 吗?而且,更重要的是,是否可以使用 Kubernetes 管理 DB pod?
I need to run two "instances" of an application, but they should access the same DB, and I need it to be run on my Kubernetes cluster, so I can provide multi-AZ access to users.
这实际上取决于您所说的 实例 是什么意思。推荐的方法是使用 replicas: 2
创建部署,如下所示:
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
这将确保您拥有 2 "instances" 个应用程序。
如果您需要 运行 2 "instances" 不同的配置,您可以选择进行两个不同的部署,并更改它们的名称和标签:
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
将这两个实例连接到数据库相当容易,您只需将数据库连接字符串作为配置选项传递给数据库。它可以存在于集群内部或外部。
Do I need StatefulSets?
只有当您的应用需要具有可预测的名称并以某种方式存储状态时,您才需要有状态集。
And, more important, is it possible to manage the DB pod with Kubernetes?
完全可以运行集群内部的数据库。这样做是否是个好主意取决于您。
数据库传统上不太擅长处理意外中断。使用 Kubernetes,数据库 pod 可能会随时移动,这可能会导致您的应用程序或数据库出现问题。
您需要使用 persistent volume 配置某种可重新连接的存储,但即便如此,也不能保证您的数据库能够抵抗 Kubernetes 重新启动它和重新启动数据库。
有一些数据库旨在 运行 在 Kubernetes 中更成功,例如 Vitess 可能会解决您的问题。
我需要 运行 一个应用程序的两个 "instances",但它们应该访问同一个数据库,我需要它在我的 Kubernetes 集群上 运行,这样我就可以为用户提供多可用区访问。
是否可以在Kubernetes上实现?我需要 StatefulSets 吗?而且,更重要的是,是否可以使用 Kubernetes 管理 DB pod?
I need to run two "instances" of an application, but they should access the same DB, and I need it to be run on my Kubernetes cluster, so I can provide multi-AZ access to users.
这实际上取决于您所说的 实例 是什么意思。推荐的方法是使用 replicas: 2
创建部署,如下所示:
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
这将确保您拥有 2 "instances" 个应用程序。
如果您需要 运行 2 "instances" 不同的配置,您可以选择进行两个不同的部署,并更改它们的名称和标签:
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
将这两个实例连接到数据库相当容易,您只需将数据库连接字符串作为配置选项传递给数据库。它可以存在于集群内部或外部。
Do I need StatefulSets?
只有当您的应用需要具有可预测的名称并以某种方式存储状态时,您才需要有状态集。
And, more important, is it possible to manage the DB pod with Kubernetes?
完全可以运行集群内部的数据库。这样做是否是个好主意取决于您。
数据库传统上不太擅长处理意外中断。使用 Kubernetes,数据库 pod 可能会随时移动,这可能会导致您的应用程序或数据库出现问题。
您需要使用 persistent volume 配置某种可重新连接的存储,但即便如此,也不能保证您的数据库能够抵抗 Kubernetes 重新启动它和重新启动数据库。
有一些数据库旨在 运行 在 Kubernetes 中更成功,例如 Vitess 可能会解决您的问题。