Cassandra – Kubernetes如何在重启时保持pod ip

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

我使用daemonset通过kubernetes节点来创build一个cassandra节点。 一切正常,直到一个cassandra节点重新启动。 POD的IP地址发生变化,nodetools状态返回节点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节点? 用cassandraconfiguration有更好的方法吗?

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

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

Pods的序号,主机名,SRVlogging和Alogging名称没有更改,但与Pod相关联的IP地址可能已更改。 在本教程使用的集群中,他们有。 这就是为什么不configuration其他应用程序通过IP地址连接到StatefulSet中的Pod的重要性。

如果你不和kubernetes绑定,并有select其他解决scheme的灵活性, 请检查一下 。

他们提供了一个集计算,networking,存储于一体的基于容器的解决scheme,因此您可以完全控制cassandra所需的所有资源,并执行快照/恢复,扩展,扩展/缩减,故障转移等。相同的IP地址和容量在整个生命周期中都被保留。