Consul for Docker 容器发现:如何在 Consul-Template 中获取最新的容器



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

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

我想更新我的 nginx 反向代理配置,以使用 Consul-Template 指向新容器的端口(如此处所述)。如何使领事模板仅获取最新容器的详细信息?

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

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

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

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

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

我在Consul中找到的唯一允许区分实例年龄的属性是CreateIndex。在领事模板中使用它很容易:

{{- $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 }}

但不幸的是,服务函数返回的运行状况服务结构不会从 Consul 获取此属性。我必须扩展它以使此示例正常工作。

相关内容

  • 没有找到相关文章

最新更新