【问题标题】:Consul for Docker container discovery: how to get latest container in Consul-Template?Docker 容器发现的 Consul:如何在 Consul-Template 中获取最新的容器?
【发布时间】:2016-03-06 01:52:41
【问题描述】:

我正在构建一个 Docker 主机,我想在其中对正在运行的容器进行无停机升级。现在,假设我只运行一个容器。

我构建了一个新映像并使用docker run -P ... 从其中启动一个容器,以便为其分配随机主机端口。然后我可以使用 Registrator 之类的东西来自动更新 Consul 中的服务。现在,Consul 对镜像名称对应的服务有两个注册:旧容器和新容器。

我想更新我的 nginx 反向代理配置以使用 Consul-Template (as described here) 指向新容器的端口。 如何让 Consul-Template 只获取最新容器的详细信息?

我考虑过的两个解决方案是:

  • 使用CreateIndex 查找此服务的最新注册。但是,不确定如何使 Consul-Template 按 CreateIndex 排序。
  • 使用服务标签。 问题是我不确定如何从以前的容器/Consul 服务注册中删除标签。如果可能的话,那么我可以将特定标签分配给新容器和select them in Consul-Template。这将扩展到对多个容器进行无停机升级。

更新:我找到了一些关于如何更新/清除标签的文档:123。这可以在使用标签启动新容器之前运行的旧容器上完成。

这是解决这个问题的最好方法吗?

【问题讨论】:

  • 您可以考虑将服务发现集成到您的应用程序操作中。要么在你的容器中运行一个领事代理,要么让你的容器在启动时注册它的服务。这使您可以在服务上指定额外的健康检查,使 consul 能够检测服务何时关闭或变得不可用。请参阅:consul.io/docs/agent/checks.htmlconsul.io/docs/guides/external.html
  • @MarkO'Connor 感谢您的指点——我是 Consul 的新手,很高兴听到这些功能。

标签: docker load-balancing service-discovery consul consul-template


【解决方案1】:

我最近遇到了在 Consul 模板中获取最旧/最新实例的问题。我在网上找不到任何提示,所以我把答案留在这里。

我在 Consul 中发现的唯一可以区分实例年龄的属性是 CreateIndex。在 Consul 模板中使用它会很容易:

{{- $newest_backend := "" }}
{{- $create_index := "0" | parseUint }}
{{- range $c,$d:=service $name -}}
    {{- if gt $d.CreateIndex $create_index }}
        {{- $newest_backend = (print "oldest_instance " $c " " $d.Address ":" $d.Port) }}
        {{- $create_index = $d.CreateIndex}}
    {{- end}}
{{- end}}
{{ $newest_backend }}

但不幸的是,服务函数返回的 HealthService 结构体并没有从 Consul 获得这个属性。我必须extend it 才能使这个示例正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多