Cassandra - Kubernetes重启时如何保持pod ip

时间:2016-04-20 13:50:10

标签: docker cassandra kubernetes cassandra-2.1

我使用kubernetes 1.2示例运行2个cassandra节点进行测试。 https://github.com/kubernetes/kubernetes/blob/release-1.2/examples/cassandra/README.md

我使用daemonset通过kubernetes节点拥有一个cassandra节点。在一个cassandra节点重启之前,一切正常。 POD更改的IP地址和nodetools状态返回Node DOWN

> kubectl exec -it cassandra-lnzhj -- nodetool status fruition
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens  Owns (effective)  Host ID                                  Rack    
UN  10.216.1.4  25.22 MB   256     39.6%             786aede9-ec4f-4942-b52a-135bc3cd68ce  rack1
UN  10.216.0.3  2.11 MB    256     40.1%             457f7322-131a-4499-b677-4d50691207ba  rack1
DN  10.216.0.2  377.41 KB  256     38.8%             aa2ca115-e8ea-4c62-8d57-bfc5b3fabade  rack1

然后当我尝试发送一个简单的" select * from table;"在复制因子为2的键空间上,我发现了这个错误:

Traceback (most recent call last):
File "/usr/bin/cqlsh", line 1093, in perform_simple_statement rows = self.session.execute(statement, trace=self.tracing_enabled)
File "/usr/share/cassandra/lib/cassandra-driver-internal-only-2.7.2.zip/cassandra-driver-2.7.2/cassandra/cluster.py", line 1602, in execute result = future.result()
File "/usr/share/cassandra/lib/cassandra-driver-internal-only-2.7.2.zip/cassandra-driver-2.7.2/cassandra/cluster.py", line 3347, in result raise self._final_exception
Unavailable: code=1000 [Unavailable exception] message="Cannot achieve consistency level ONE" info={'required_replicas': 1, 'alive_replicas': 0, 'consistency': 'ONE'}

如何保持POD IP地址,以便在Kubernetes重新启动时不使用Down节点? 使用cassandra配置有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

目前的Kubernetes无法实现这一目标。您需要在v1.3中实现PetSets到期。

答案 1 :(得分:0)

不幸的是,即使是现在在Kubernetes 1.5中调用的PetSet或Stateful Sets也无法解决这个问题。新功能允许您保留相同的主机名,但不保证IP地址将保持不变。引用他们的文件:

  

Pods的序号,主机名,SRV记录和A记录名称都有   没有改变,但与Pod相关的IP地址可能有   改变。在本教程使用的集群中,他们有。这就是为什么   重要的是不要将其他应用程序配置为连接到Pod   在IP地址的StatefulSet中。

如果您不依赖于kubernetes并且可以灵活选择其他解决方案,check this out

它们提供了一个基于容器的解决方案,它结合了计算,网络和存储,因此您可以完全控制cassandra所需的所有资源,并执行快照/恢复,向外扩展,向上/向下扩展,故障转移等。保证在整个生命周期内为容器保留相同的IP地址和卷。