如何在 pod 副本之间运行 etcd 集群?
Posted
技术标签:
【中文标题】如何在 pod 副本之间运行 etcd 集群?【英文标题】:How to run an etcd cluster among pod replicas? 【发布时间】:2015-12-18 15:11:23 【问题描述】:我有一个运行应用程序的 pod/服务,该应用程序使用 etcd 作为同步系统和数据存储。我想在 pod 中运行 etcd,以便所有副本形成一个连贯的集群。换句话说,副本#1 中的应用程序可以将“foo”写入localhost:4001/v2/keys/my_key
,然后副本#2 可以读取localhost:4001/v2/keys/my_key
并得到“foo”作为结果。
目前尚不清楚如何做到这一点,因为 pod 副本不可单独寻址。理论上我可以创建一个暴露集群端口的“etcd”服务,但是任何请求都会循环到所有副本,因此各个 etcd 节点将无法找到彼此。
我解决这个问题的方法正确吗?
【问题讨论】:
【参考方案1】:您可以使用 Operator(来自 extensions/v1beta1
)和 quay.io/coreos/etcd-operator
映像在 kubernetes 上部署 etcd。
集群大小为 3 的示例部署如下所示:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: etcd-operator
spec:
replicas: 1
template:
metadata:
name: etcd-operator
labels:
app: etcd
component: operator
spec:
containers:
- name: etcd-operator
image: quay.io/coreos/etcd-operator:v0.3.0
env:
- name: MY_POD_NAMESPACE
valueFrom: fieldRef: fieldPath: metadata.namespace
- name: MY_POD_NAME
valueFrom: fieldRef: fieldPath: metadata.name
---
apiVersion: etcd.coreos.com/v1beta1
kind: Cluster
metadata:
name: etcd-cluster
labels:
app: etcd
component: cluster
spec:
size: 3
version: "3.1.8"
请注意此项目的测试状态。然而,根据维护者的说法,运营商现在稳定。我已经成功部署了上面的配置,但我没有在生产中运行任何这些。
操作员代码可用on github。您可以在此处找到其他文档。
【讨论】:
您使用的是apiVersion: etcd.coreos.com/v1beta1
和kind: Cluster
,而etcd-operator 示例使用apiVersion: etcd.database.coreos.com/v1beta2
和kind: EtcdCluster
。有什么区别? github.com/coreos/etcd-operator/blob/master/example/…【参考方案2】:
这里有一个非常好的三节点 etcd 集群示例:https://github.com/coreos/etcd/tree/master/hack/kubernetes-deploy
他们为每个副本使用单独的 rc 和服务作为解决方法,直到添加名义服务。
【讨论】:
注意:这个 hack 完全不适合生产环境,因为你不能删除一个节点/副本然后再添加一个。此设置中没有服务发现!【参考方案3】:我已将您的问题添加到kubernetes/kubernetes#5017
如果有人知道答案,希望他们会在那里发布。
我认为它可能需要尚未实现的“名义服务”功能 (kubernetes/kubernetes#260),但我不确定。
【讨论】:
以上是关于如何在 pod 副本之间运行 etcd 集群?的主要内容,如果未能解决你的问题,请参考以下文章
基于集群中节点数量的水平 Pod Autoscaler 副本