0

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

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

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

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

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

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

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

4

1 回答 1

0

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

我在 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 获得这个属性。我不得不扩展它以使这个例子正常工作。

于 2021-02-15T07:23:52.990 回答