对于使用kubernetes的部署,我们有一个docker镜像和一个相应的yaml文件。我们构建的应用程序是在scala中使用akka-http构建的。我们已经使用了akka-cluster。我们在配置文件中有一个特定的变量(在本例中为seed-nodes- akka集群),该变量在使用pod ip的应用程序代码中使用。但是,除非部署完成,否则我们不会获得pod ip。我们应该如何着手解决这个问题?环境变量会有帮助吗?如果有,会有什么帮助?
更具体地说,将docker镜像部署到pod中的容器中,当容器启动时,已经分配了pod ip。那么,在容器中的进程开始之前,我们是否可以在代码或配置文件中以编程方式或以其他方式配置pod ips?
作为参考,下面是我们的配置文件:
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 0
}
}
cluster {
seed-nodes = [
"akka.tcp://our-system@127.0.0.1:3000",
"akka.tcp://our-system@127.0.0.1:3001",
],
metrics {
enabled = off
}
}
}
service {
validateTokenService {
ml.pubkey.path = "<filePath>"
}
ml_repository {
url = <url address>
}
replication.factor = 3
http.service.interface = "0.0.0.0"
http.service.port = 8080
}在上面的文件中,我们需要pod-ip而不是akka.remote.netty.tcp.hostname作为"127.0.0.1“。因此,我们可以在种子节点中使用它:
seed-nodes = [
"akka.tcp://our-system@hostname:3000",
"akka.tcp://our-system@hostname:3001",
],如何做到这一点呢?提前谢谢。
发布于 2017-03-14 14:26:08
我已经尝试过非常类似的东西。你能做的就是使用有状态集Kubernetes-Stateful sets。有状态集有一个命名约定,pods将相应地命名-您可以在链接中了解更多信息。这样,您就可以对种子节点的值进行硬编码,因为您知道pod将如何命名。但是,它们有一个缺点,有状态集还不支持滚动更新(主要是因为它们是这样设计的)。这篇文章有一个很好的逐步解释:stateful set - akka clustering这篇文章一起解释了所有的事情-所以在这里发布一个链接而不是复制步骤。希望这能有所帮助
发布于 2019-01-05 00:41:09
从2018年开始,在kubernetes中初始化Akka集群的理想方式是akka-management。
它使用Kubernetes API来获取所有正在运行的pod的列表,并引导集群。不需要配置任何种子节点。
它还会提供就绪检查,直到pod加入群集为止。还有一张有效的支票。
https://stackoverflow.com/questions/42528817
复制相似问题