6.7. 投射绑定数据
本节提供有关如何使用绑定数据的信息。
6.7.1. 绑定数据的消耗
在后备服务公开绑定数据后,如果工作负载要访问和使用这个数据,您必须将其从后备服务中项目到工作负载中。Service Binding Operator 会自动以以下方法将这一数据集项目到工作负载中:
- 默认情况下,作为文件。
-
作为环境变量,在从
ServiceBinding
资源配置.spec.bindAsFiles
参数后。
6.7.2. 配置目录路径来项目工作负载容器内绑定数据
默认情况下,Service Binding Operator 将绑定数据作为文件挂载到工作负载资源的特定目录中。您可以使用运行工作负载的容器中的 SERVICE_BINDING_ROOT
环境变量设置来配置目录路径。
示例:绑定数据作为文件挂载
$SERVICE_BINDING_ROOT 1 ├── account-database 2 │ ├── type 3 │ ├── provider 4 │ ├── uri │ ├── username │ └── password └── transaction-event-stream 5 ├── type ├── connection-count ├── uri ├── certificates └── private-key
要将绑定数据用作环境变量,请使用您选择的编程语言的内置语言功能,可以读取环境变量。
示例:Python 客户端使用
import os username = os.getenv("USERNAME") password = os.getenv("PASSWORD")
使用绑定数据目录名称查找绑定数据
Service Binding Operator 使用 ServiceBinding
资源名称 (.metadata.name
) 作为绑定数据目录名称。spec 还提供了一种通过 .spec.name
字段覆盖该名称的方法。因此,如果命名空间中有多个 ServiceBinding
资源,则绑定数据名称可能会发生冲突。但是,由于 Kubernetes 中卷挂载的性质,绑定数据目录只会包含来自其中一个 Secret
资源的值。
6.7.2.1. 计算将绑定数据作为文件投射的最终路径
下表总结了在将文件挂载到特定目录中时如何计算绑定数据投射的最终路径的配置:
SERVICE_BINDING_ROOT | 最终路径 |
---|---|
不可用 |
|
|
|
在上表中,<ServiceBinding_ResourceName>
条目指定您在自定义资源 (CR) 的 .metadata.name
部分中配置的 ServiceBinding
资源的名称。
默认情况下,投射文件的权限设置为 0644。Service Binding Operator 无法因为 Kubernetes 中的一个错误而设置特定权限,这会导致在服务需要特定权限(如 0600
)时出现问题。作为临时解决方案,您可以修改程序代码或正在工作负载资源中运行的应用程序,将文件复制到 /tmp
目录中并设置适当的权限。
要在现有 SERVICE_BINDING_ROOT
环境变量中访问和使用绑定数据,请使用您选择的编程语言的内置语言功能来读取环境变量。
示例:Python 客户端使用
from pyservicebinding import binding try: sb = binding.ServiceBinding() except binding.ServiceBindingRootMissingError as msg: # log the error message and retry/exit print("SERVICE_BINDING_ROOT env var not set") sb = binding.ServiceBinding() bindings_list = sb.bindings("postgresql")
在上例中,bindings_list
变量包含 postgresql
数据库服务类型的绑定数据。
6.7.3. 投射绑定数据
根据工作负载要求和环境,您可以选择将绑定数据作为文件或环境变量进行项目。
先决条件
您了解以下概念:
- 环境和工作负载要求,以及其如何与所提供的服务配合使用。
- 在工作负载资源中消耗绑定数据。
- 配置如何为默认方法计算数据投射的最终路径。
- 绑定数据从后备服务公开。
流程
-
若要将绑定数据显示为文件,请确保工作负载运行的容器中存在现有的
SERVICE_BINDING_ROOT
环境变量,以确定目标文件夹。 -
要将绑定数据作为环境变量进行项目,请将自定义资源 (CR) 中
ServiceBinding
资源中的.spec.bindAsFiles
参数的值设置为false
。