分离的 Haproxy 服务配置

日期:

2023-01-19 22:00

标签:

分离的 haproxy 服务配置,内部 TLS

目前,所有 haproxy 服务都在 haproxy-install.yml playbook 执行期间配置。这可能会导致变量作用域问题,甚至在服务角色执行之前完全破坏一个服务。

如果将当前行为更改为在每个服务 playbook 的开头单独配置 haproxy 服务,则可以避免这些问题。

问题描述

预配置所有 haproxy 服务可能会导致一些问题。这里有两个例子

  1. 变量作用域

    目前,存储在 inventory/group_vars/haproxy/haproxy.yml 中的 haproxy 服务定义引用了像 neutron_plugin_type 这样的变量。这会产生问题,因为这是 neutron 的变量。如果有人想更改其值,他们可能会在 neutron 组变量中设置覆盖。这很棘手,因为 haproxy 不在 neutron 组中,所以所有 neutron 的变量都不会对 haproxy 角色产生影响。为了使 haproxy 尊重此更改,需要在所有主机上定义变量,以便 haproxy 和 neutron 都可以访问它。

    此外,我们目前正在致力于加密 haproxy 和服务后端之间的流量。 提出的 PoC [1] 执行与上述相同的操作。它引用了属于 glance 角色的 glance_backend_https 变量。

  2. haproxy 角色和服务角色之间的强依赖性

    haproxy 服务的一些更改需要服务角色立即响应。例如:用户启用了 haproxy 和 glance 后端之间的 TLS 通信。为了解决这个问题,需要执行 haproxy 角色。它将配置 glance 服务以通过 TLS 与其后端通信,但此时后端尚未准备好处理 TLS 连接。为了解决这个问题,需要执行 glance 角色,但这需要时间并会增加停机时间。消除角色之间的这种依赖关系将使配置过程更加可靠。

    请注意,仍然会发生停机时间。它将在 haproxy 服务配置步骤之后开始,并在第一个后端主机配置完成后结束。为了提供零停机时间的 TLS 过渡,需要进一步的工作,与“内部 TLS”项目相关。

提议的变更

在每个服务角色的开头添加一个额外的步骤来配置为其 haproxy 服务。在这种情况下,haproxy 服务将单独配置,因此 nova playbook 将配置 nova haproxy 服务,glance playbook 将配置其自己的 haproxy 服务等。Haproxy playbook 仅负责配置不与任何 openstack 角色相关的服务(letsencrypt、ceph-rgw、自定义用户定义的服务等)。

备选方案

没有替代方案。

Playbook/Role 影响

每个 playbook 将包含一个额外的步骤,负责为其配置 haproxy 服务角色。

升级影响

一些变量将被删除或替换。这已经在发布说明中说明了。

安全影响

没有影响。

性能影响

没有影响。

最终用户影响

没有影响。

部署者影响

从现在开始,haproxy 服务将在运行服务 playbook(如 os-nova-install.yml)时单独配置

开发人员影响

没有影响。

依赖项

没有依赖项。

实现

负责人

主要负责人

Damian Dabrowski <damian@dabrowski.cloud>

工作项

  • 配置 haproxy_server 角色以支持分离的服务配置

  • 配置服务 playbook 以包含一个额外的步骤来配置 haproxy 服务

  • 解决所有边缘情况(例如 letsencrypt 和 horizon 之间的依赖关系)

变更层级

所有更改都可在 gerrit 上使用 ‘separated-haproxy-service-config’ 标签 [2] 下。理解它们之间的关系可能很困难,因此这里有一个描述。顶部的更改应首先合并。水平线分割依赖组(同一组中的更改可以独立合并)




测试

需要特别注意 gating。为所有角色合并此更改可能会很复杂。

文档影响

需要在几个地方更新文档。上传的更改已经包含这些更新。

参考资料

[1] https://review.opendev.org/c/openstack/openstack-ansible/+/821090

[2] https://review.opendev.org/q/topic:separated-haproxy-service-config