【问题标题】:Kubernetes - Akka clustering DeploymentKubernetes - Akka 集群部署
【发布时间】:2017-03-01 10:10:40
【问题描述】:

我们有一个 docker 镜像和一个相应的 yaml 文件,用于使用 kubernetes 进行部署。我们构建的应用程序是在带有 akka-http 的 scala 中构建的。我们使用了akka-cluster。我们在配置文件中有一个特定的变量(在我们的例子中是种子节点 - akka 集群),它在我们使用 pod ip 的应用程序代码中使用。但是,除非部署完成,否则我们不会获得 pod ip。我们应该如何着手解决这个问题?环境变量会有帮助吗,如果是的话如何?

更具体地说,一旦 docker 镜像部署在容器中的容器中,并且容器启动时,容器 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",
        ],

我们怎样才能做到这一点? 提前致谢。

【问题讨论】:

标签: kubernetes akka-http akka-cluster


【解决方案1】:

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

【讨论】:

  • 似乎链接是我正在寻找的。将尝试链接中的方法。
  • 考虑到这是 2017 年,akka 集群以一种奇怪的方式实现......你基本上必须破解你的方法才能让它在 kubernetes 上运行,即使你这样做了,你也不会没有那种很酷的滚动更新功能。这只对我来说看起来不对吗?
  • @gerasalus - 是的,它看起来确实很奇怪,但我认为这是因为有状态集的设计方式。似乎有一些讨论正在进行:github.com/kubernetes/kubernetes/issues/37566
  • @Tarun 是的,我同意。但我更多地指的是 Akka 集群设计。我还在 github 上找到了一个项目,它似乎使用 zookeeper 进行种子节点逻辑,也许这会比这种带有 akka 的有状态设置方法更痛苦
  • @Tarun github.com/sclasen/akka-zk-cluster-seed。今天尝试了几个 akka 集群节点,似乎可以正常工作。现在只需要弄清楚如何删除按比例缩小或其他事件的节点。s
【解决方案2】:

截至 2018 年,在 kubernetes 中初始化 Akka 集群的理想方式是 akka-management

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

它还提供了等待 pod 加入集群的准备情况检查。还有一个活着的检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2019-05-08
    • 1970-01-01
    • 2019-03-19
    • 2023-02-21
    相关资源
    最近更新 更多