多云支持

从 Stein 版本(12.0.0 版本)开始,Heat 支持多云编排。本文档旨在提供如何使用多云功能的指南,以及环境要求。

注意

如果您想在多区域环境中创建堆栈,则根本不需要此功能。您需要做的就是为 OS::Heat::Stackcontext 属性提供 region_name。如果您想了解如何在多区域环境中使用 SSL 支持,可以跳转到 使用 CA 证书(可选)

需求

  • Barbican 服务 - 为了更好的安全性,多云编排功能依赖于 Barbican 服务。因此,在使用此功能之前,您必须确保 Barbican 服务已在您的环境中准备就绪。

  • 访问远程编排服务 - 在运行您的多云模板之前。请确保您能够使用正确的端点信息、合法的访问权限以及从本地站点访问远程站点 KeyStone 和编排服务 API 端点的能力来访问远程编排服务。您需要确保本地编排服务能够从本地站点触发并完成必要的 API 调用到远程站点。这样我们才能在不遇到任何访问错误的情况下完成堆栈操作。

  • 模板兼容资源/函数 - 在您的编排模板中,您可能希望根据您的模板版本和编排服务允许使用各种模板函数或资源类型。但是,请注意,一旦您计划跨多个 OpenStack 云使用编排服务,您还必须考虑兼容性。在要求远程站点运行之前,请确保模板版本和资源类型已准备就绪。如果您意外提供了错误的模板版本(远程站点未提供),您将收到来自远程站点的错误消息,从而阻止您实际创建远程资源。但如果我们能更早地发现这样的错误,那就更好了。

准备

首先,您需要将远程云的凭据放入 Barbican 密钥中。为了构建您自己的多云堆栈,您首先需要构建一个 Barbican 密钥,其中包含大部分远程端点信息。

收集凭据信息

在开始生成密钥之前,让我们讨论一下我们需要什么格式的凭据。凭据是包含两个键 auth_typeauth 的 JSON 格式字符串。 auth_typeauth 遵循 Keystone 的身份验证插件加载规则。您可以在 插件选项身份验证插件 中找到 keystoneauth 文档。

  • auth_type - auth_type 是插件名称的字符串。允许的值包括 v3applicationcredentialpasswordv3oidcclientcredentials 等。您需要提供 可用插件 <plugin-options.html#available-plugins>

  • auth - auth 是一个字典,包含插件执行身份验证的所有参数。您可以在 可用插件 或从 插件名称 获取所有类路径,以了解更多允许的值或跟踪插件类以获取更多详细信息。

如您所知,所有允许的凭据身份验证插件都遵循 keystoneauth 规则。因此,keystoneauth 的任何新更改也会直接反映在凭据中。实际上,我们只是调用 keystoneauth 来获取远程身份验证插件的插件加载器。因此,如果您使用此功能,请密切关注 keystoneauth。

验证您的凭据

现在您已经准备好所有凭据信息,请先尝试验证是否可以。您可以直接通过 配置文件CLIkeystoneauth 会话 进行测试。

构建凭据密钥

一旦您确定它是有效的,我们就可以开始构建密钥了。要构建密钥,您只需遵循标准的 Barbican CLI 或 API 来存储您的密钥即可。

本地站点将读取此密钥以在远程站点执行堆栈操作。让我们举一个快速示例:假设您有两个 OpenStack 云站点 A 和站点 B。如果您需要从站点 A 控制站点 B,请确保在站点 A 中有一个包含站点 B 访问信息的密钥。如果您也想从站点 B 控制站点 A,请确保在站点 B 中有一个包含站点 A 访问信息的密钥。

openstack secret store -n appcred --payload '{"auth_type": "v3applicationcredential", "auth": {"auth_url": "{Keystone_URL}", "application_credential_id": "{ID}", "application_credential_secret": "{SECRET}"}}'

注意

JSON 格式的一个常见错误是在您的 JSON 模式中使用单引号() 代替双引号 ()。

创建远程堆栈

现在,您已经为 Barbican 密钥生成了一个密钥 ID。将该 ID 作为模板的输入使用。

要创建远程堆栈,您只需在模板中使用 OS::Heat::Stack 资源即可。

在资源属性中,在 context 属性下提供 credential_secret_id(我们刚刚为凭据构建的密钥的 Barbican 密钥 ID)。

这里有一个模板示例供您参考

heat_template_version: rocky

resources:
  stack_in_remote_cloud:
    type: OS::Heat::Stack
    properties:
      context:
        credential_secret_id: {$Your_Secret_ID}
      template: { get_file: "remote-app.yaml" }

这就是您需要做的全部。其余的与平常一样。

本地 Heat 将读取该密钥,解析凭据信息,替换上下文中当前的身份验证插件,并进行远程调用。

Heat 不会在任何地方存储您的凭据信息。因此,您的密钥安全性将保留在 Barbican 中。这意味着如果您想更改您的凭据或确保其他人无法访问它,您需要做的就是更新您的 Barbican 密钥或加强其安全性。但请注意这一点。如果您计划更改凭据内容,请确保这不会影响远程站点的资源/堆栈。因此,请谨慎执行此类操作。

使用 CA 证书(可选)

对于生产云,拥有 SSL 支持非常重要。在这里,我们为您提供 CA 证书方法来支持您的 SSL 访问。如果您想使用它,请在 context 属性下使用 ca_cert。其中 ca_cert 是可用于验证远程云或区域的服务器证书的 CA 证书文件的内容。或者,如果您想使用不安全模式(出于安全考虑,请不要这样做!)并且不想使用 CA 证书,可以在 context 属性下使用 insecure(一个布尔选项)。

这里有一个示例供您参考

heat_template_version: rocky

resources:
  stack_in_remote_cloud:
    type: OS::Heat::Stack
    properties:
      context:
        credential_secret_id: {$Your_Secret_ID}
        ca_cert: {$Contents of a CA cert}
      template: { get_file: "remote-app.yaml" }

注意

如果启用了不安全标志,将忽略 ca_cert。