如何使用 Apache Marathon 根据实例的正常运行时间缩减实例?



我发现自己处于一种情况,即我必须根据容器实例的实际生存期来缩减容器实例。看起来在通过 marathon 的 API 缩减时首先删除了新实例。在Apache 马拉松上缩减实例时,是否有任何我不知道的配置来实施这种策略或策略?

截至目前,我正在使用 marathon-lb-autoscale 来自动调整正在运行的实例数量。然而,在后台实际发生的是,当 req/s 增加或减少时,marathon-lb-autoscale确实执行PUT请求更新当前应用程序的instances属性。

scale_list.each do |app,instances|
req = Net::HTTP::Put.new('/v2/apps/' + app)
if !@options.marathonCredentials.empty?
req.basic_auth(@options.marathonCredentials[0], @options.marathonCredentials[1])
end
req.content_type = 'application/json'
req.body = JSON.generate({'instances'=>instances})
Net::HTTP.new(@options.marathon.host, @options.marathon.port).start do |http|
http.request(req)
end
end
end

我不知道在缩减实例时是否考虑了upgradeStrategy配置。使用默认设置,我无法使预期的行为正常工作。

{
"upgradeStrategy": {
"minimumHealthCapacity": 1,
"maximumOverCapacity": 1
}
}

实际

  • 实例 1
  • 实例 2
  • PUT /v2/apps/my-app {instances: 3}
  • 实例 1
  • 实例 2
  • 实例 3
  • PUT /v2/apps/my-app {instances: 2}
  • 实例 1
  • 实例 2

预期

  • 实例 1
  • 实例 2
  • PUT /v2/apps/my-app {instances: 3}
  • 实例 1
  • 实例 2
  • 实例 3
  • PUT /v2/apps/my-app {instances: 2}
  • 实例 2
  • 实例 3

可以直接在应用程序的配置中指定一个killSelection,并指定YoungestFirst哪个先杀死最年轻的任务,OldestFirst哪个先杀死最年长的任务。

参考: https://mesosphere.github.io/marathon/docs/configure-task-handling.html

最新更新