Kubernetes - Akka集群部署

时间:2017-03-01 10:10:40

标签: kubernetes akka-http akka-cluster

我们有一个docker镜像和一个相应的yaml文件,用于使用kubernetes进行部署。我们构建的应用程序是使用akka-http的scala。我们使用过akka-cluster。我们在配置文件中有一个特定的变量(在我们的例子中是种子节点 - 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",
        ],

我们怎么能这样做? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

我尝试过非常相似的东西。你可以做的是使用有状态集Kubernetes-Stateful sets。有状态集具有命名约定,并且将相应地命名pod - 您可以在链接中阅读更多相关信息。这样,您就可以对种子节点的值进行硬编码,因为您知道如何命名pod。但是,它们有一个缺点,有状态集还不支持滚动更新(主要是因为它们是这样设计的。)本文有一个很好的解释:stateful set - akka clustering 本文将所有内容一起解释 - 因此发布链接而不是复制此处的步骤。希望这有帮助

答案 1 :(得分:0)

从2018年开始,在Kubernetes中初始化Akka集群的理想方法是akka-management

它使用Kubernetes API来获取所有正在运行的Pod的列表并引导集群。 无需配置任何种子节点。

它还会提供准备检查,等待直到Pod已加入集群。还有一个活着的检查。