This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

配置存储组件规格

与 Dapr 对接的受支持的配置存储

Table headers to note:

HeaderDescriptionExample
StatusComponent certification statusAlpha
Beta
Stable
Component versionThe version of the componentv1
Since runtime versionThe version of the Dapr runtime when the component status was set or updated1.11

Generic

ComponentStatusComponent versionSince runtime version
Kubernetes ConfigMapAlphav11.18
PostgreSQLStablev11.11
RedisStablev11.11

Microsoft Azure

ComponentStatusComponent versionSince runtime version
Azure App ConfigurationAlphav11.9

1 - Azure App Configuration

Azure App Configuration 配置存储组件的详细信息

组件格式

要设置 Azure App Configuration 配置存储,需创建一个类型为 configuration.azure.appconfig 的组件。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: configuration.azure.appconfig
  version: v1
  metadata:
  - name: host # 当使用 Azure 身份验证机制时应使用 host。
    value: <HOST>
  - name: connectionString # 当使用 Azure 身份验证机制时不应使用 connectionString。
    value: <CONNECTIONSTRING>
  - name: maxRetries
    value: # 可选
  - name: retryDelay
    value: # 可选
  - name: maxRetryDelay
    value: # 可选
  - name: azureEnvironment # 可选,默认为 AZUREPUBLICCLOUD
    value: "AZUREPUBLICCLOUD"
  # 请参阅下方的身份验证部分以了解所有选项
  - name: azureTenantId # 可选
    value: "[your_service_principal_tenant_id]"
  - name: azureClientId # 可选
    value: "[your_service_principal_app_id]"
  - name: azureCertificateFile # 可选
    value : "[pfx_certificate_file_fully_qualified_local_path]"
  - name: subscribePollInterval # 可选
    value: #可选 [期望格式示例 - 24h]

规范元数据字段

FieldRequiredDetailsExample
connectionStringY*Azure App Configuration 实例的连接字符串。无默认值。可以是 secretKeyRef 以使用密钥引用。*与 host 字段互斥。*使用 Azure 身份验证时不使用Endpoint=https://foo.azconfig.io;Id=osOX-l9-s0:sig;Secret=00000000000000000000000000000000000000000000
hostN*Azure App Configuration 实例的终端节点。无默认值。*与 connectionString 字段互斥。*使用 Azure 身份验证时使用https://dapr.azconfig.io
maxRetriesN放弃前的最大重试次数。默认为 35, 10
retryDelayN重试延迟指定在重试操作前的初始延迟量。延迟随每次重试呈指数级增长,直到最大重试延迟指定的最大值。默认为 4 秒;"-1" 禁用重试间的延迟。4s
maxRetryDelayN最大重试延迟指定重试操作前允许的最大延迟。该值通常应大于或等于重试延迟中指定的值。默认为 120 秒;"-1" 禁用该限制120s
subscribePollIntervalN订阅轮询间隔指定以纳秒为单位轮询订阅键是否有任何更改的轮询间隔。未来将更新为 Go Time 格式。默认轮询间隔为 24 小时。24h

注意:必须指定 hostconnectionString 其中之一。

使用连接字符串进行身份验证

使用连接字符串访问 App Configuration 实例,该字符串可在 Azure 门户中获取。由于连接字符串包含凭据信息,应将其视为密钥并使用密钥存储

使用 Microsoft Entra ID 进行身份验证

Azure App Configuration 配置存储组件还支持通过 Microsoft Entra ID 进行身份验证。在启用此组件之前:

  • 阅读向 Azure 进行身份验证文档。
  • 创建 Microsoft Entra ID 应用程序(也称为服务主体)。
  • 或者,为你的应用程序平台创建托管标识。

设置 Azure App Configuration

你需要一个 Azure 订阅来设置 Azure App Configuration。

  1. 启动 Azure App Configuration 创建流程。必要时登录。

  2. 点击创建开始部署你的 Azure App Configuration 实例。

  3. 实例创建完成后,获取主机(终端节点)连接字符串

    • 对于主机:导航至资源的概览并复制终端节点
    • 对于连接字符串:导航至设置 > 访问密钥并复制你的连接字符串。
  4. 将你的主机或连接字符串添加到 Dapr 可应用的 azappconfig.yaml 文件中。

    host 键设置为 [终端节点]或将 connectionString 键设置为你之前保存的值。

Azure App Configuration 请求元数据

在 Azure App Configuration 中,你可以使用标签为同一键定义不同的值。例如,你可以为开发环境和生产环境定义一个具有不同值的单个键。你可以指定在连接到 App Configuration 时加载哪个标签

Azure App Configuration 存储组件支持以下可选的 label 元数据属性:

label:要检索的配置的标签。如果不存在,配置存储将返回指定键和空标签的配置。

标签可以通过请求 URL 中的查询参数来填充:

GET curl http://localhost:<daprPort>/v1.0/configuration/<store-name>?key=<key name>&metadata.label=<label value>

相关链接

2 - PostgreSQL

PostgreSQL 配置存储组件的详细信息

组件格式

要设置 PostgreSQL 配置存储,请创建类型为 configuration.postgresql 的组件

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: configuration.postgresql
  version: v1
  metadata:
    # Connection string
    - name: connectionString
      value: "host=localhost user=postgres password=example port=5432 connect_timeout=10 database=config"
    # Name of the table which holds configuration information
    - name: table
      value: "[your_configuration_table_name]" 
    # Individual connection parameters - can be used instead to override connectionString parameters
    #- name: host
    #  value: "localhost"
    #- name: hostaddr
    #  value: "127.0.0.1"
    #- name: port
    #  value: "5432"
    #- name: database
    #  value: "my_db"
    #- name: user
    #  value: "postgres"
    #- name: password
    #  value: "example"
    #- name: sslRootCert
    #  value: "/path/to/ca.crt"
    # Timeout for database operations, in seconds (optional)
    #- name: timeoutInSeconds
    #  value: 20
    # Name of the table where to store the state (optional)
    #- name: tableName
    #  value: "state"
    # Name of the table where to store metadata used by Dapr (optional)
    #- name: metadataTableName
    #  value: "dapr_metadata"
    # Cleanup interval in seconds, to remove expired rows (optional)
    #- name: cleanupIntervalInSeconds
    #  value: 3600
    # Maximum number of connections pooled by this component (optional)
    #- name: maxConns
    #  value: 0
    # Max idle time for connections before they're closed (optional)
    #- name: connectionMaxIdleTime
    #  value: 0
    # Controls the default mode for executing queries. (optional)
    #- name: queryExecMode
    #  value: ""
    # Uncomment this if you wish to use PostgreSQL as a state store for actors (optional)
    #- name: actorStateStore
    #  value: "true"

规范元数据字段

使用连接字符串进行身份验证

使用 PostgreSQL 连接字符串进行身份验证时,以下元数据选项是必需的

字段必需详情示例
connectionStringYPostgreSQL 数据库的连接字符串。有关如何定义连接字符串的信息,请参阅 PostgreSQL 数据库连接文档"host=localhost user=postgres password=example port=5432 connect_timeout=10 database=my_db"

使用单独的连接参数进行身份验证

除了使用连接字符串外,您还可以选择指定单独的连接参数。这些参数等同于标准 PostgreSQL 连接参数。

字段必需详情示例
hostYPostgreSQL 服务器的主机名或 IP 地址"localhost"
hostaddrNPostgreSQL 服务器的 IP 地址(host 的替代选项)"127.0.0.1"
portYPostgreSQL 服务器的端口号"5432"
databaseY要连接的数据库名称"my_db"
userY用于连接的 PostgreSQL 用户"postgres"
passwordYPostgreSQL 用户的密码"example"
sslRootCertNSSL 根证书文件的路径"/path/to/ca.crt"

使用 Microsoft Entra ID 进行身份验证

支持使用 Microsoft Entra ID 对 Azure Database for PostgreSQL 进行身份验证。可以使用 Dapr 支持的所有身份验证方法,包括客户端凭据(“服务主体”)和托管标识。

字段必需详情示例
useAzureADY必须设置为 true 以使组件能够从 Microsoft Entra ID 获取访问令牌。"true"
connectionStringYPostgreSQL 数据库的连接字符串。
必须包含用户,该用户对应于在 PostgreSQL 内部创建的、映射到 Microsoft Entra ID 标识的用户名称;这通常是相应主体的名称(例如 Microsoft Entra ID 应用程序的名称)。此连接字符串不应包含任何密码。
"host=mydb.postgres.database.azure.com user=myapplication port=5432 database=my_db sslmode=require"
azureTenantIdNMicrosoft Entra ID 租户的 ID"cd4b2887-304c-…"
azureClientIdN客户端 ID(应用程序 ID)"c7dd251f-811f-…"
azureClientSecretN客户端密钥(应用程序密码)"Ecy3X…"

使用 AWS IAM 进行身份验证

支持使用 AWS IAM 对所有版本的 PostgreSQL 类型组件进行身份验证。 连接字符串中指定的用户必须是数据库中已存在的用户,并且是被授予 rds_iam 数据库角色的 AWS IAM 启用用户。 身份验证基于 AWS 身份验证配置文件,或提供的 AccessKey/SecretKey。 AWS 身份验证令牌将在其过期时间之前通过 AWS 动态轮换。

字段必需详情示例
useAWSIAMY必须设置为 true 以使组件能够从 AWS IAM 获取访问令牌。此身份验证方法仅适用于 AWS Relational Database Service 的 PostgreSQL 数据库。"true"
connectionStringYPostgreSQL 数据库的连接字符串。
必须包含已存在的用户,该用户对应于在 PostgreSQL 内部创建的、映射到 AWS IAM 策略的用户名称。此连接字符串不应包含任何密码。请注意,使用 AWS 时数据库名称字段由 dbname 表示。
"host=mydb.postgres.database.aws.com user=myapplication port=5432 dbname=my_db sslmode=require"
awsRegionN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 版本中弃用。请改用 ‘region’。AWS Relational Database Service 部署所在的 AWS 区域。"us-east-1"
awsAccessKeyN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 版本中弃用。请改用 ‘accessKey’。与 IAM 账户关联的 AWS 访问密钥"AKIAIOSFODNN7EXAMPLE"
awsSecretKeyN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 版本中弃用。请改用 ‘secretKey’。与访问密钥关联的密钥"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
awsSessionTokenN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 版本中弃用。请改用 ‘sessionToken’。要使用的 AWS 会话令牌。仅在使用临时安全凭证时才需要会话令牌。"TOKEN"

其他元数据选项

字段必需详情示例
tableY配置信息的表名,必须为小写。configtable
timeoutN数据库操作的超时时间,格式为 Go duration。整数被解释为秒数。默认为 20s"30s", 30
maxConnsN此组件池化的最大连接数。设置为 0 或更低以使用默认值,即 4 或 CPU 数量中的较大值。"4"
connectionMaxIdleTimeN在连接池中自动关闭未使用连接之前的最大空闲时间。默认情况下,没有值,这由数据库驱动程序选择。"5m"
queryExecModeN控制执行查询的默认模式。默认情况下,Dapr 使用扩展协议并自动准备和缓存预备语句。但是,这可能与 PGBouncer 等代理不兼容。在这种情况下,最好使用 execsimple_protocol"simple_protocol"

设置 PostgreSQL 作为配置存储

  1. 启动 PostgreSQL 数据库

  2. 连接到 PostgreSQL 数据库并按照以下架构设置配置表:

    字段数据类型可为空详情
    KEYVARCHARN保存配置属性的 "Key"
    VALUEVARCHARN保存配置属性的 Value
    VERSIONVARCHARN保存配置属性的版本
    METADATAJSONY将 Metadata 保存为 JSON
    CREATE TABLE IF NOT EXISTS table_name (
      KEY VARCHAR NOT NULL,
      VALUE VARCHAR NOT NULL,
      VERSION VARCHAR NOT NULL,
      METADATA JSON
    );
    
  3. 在配置表上创建 TRIGGER。创建 TRIGGER 的示例函数如下:

    CREATE OR REPLACE FUNCTION notify_event() RETURNS TRIGGER AS $$
        DECLARE 
            data json;
            notification json;
    
        BEGIN
    
            IF (TG_OP = 'DELETE') THEN
                data = row_to_json(OLD);
            ELSE
                data = row_to_json(NEW);
            END IF;
    
            notification = json_build_object(
                              'table',TG_TABLE_NAME,
                              'action', TG_OP,
                              'data', data);
            PERFORM pg_notify('config',notification::text);
            RETURN NULL; 
        END;
    $$ LANGUAGE plpgsql;
    
  4. 创建触发器,数据封装在标记为 data 的字段中:

    notification = json_build_object(
      'table',TG_TABLE_NAME,
      'action', TG_OP,
      'data', data
    );
    
  5. 订阅配置通知时,应使用作为 pg_notify 属性提及的通道

  6. 由于这是一个通用创建的触发器,请将此触发器映射到 配置表

    CREATE TRIGGER config
    AFTER INSERT OR UPDATE OR DELETE ON configtable
        FOR EACH ROW EXECUTE PROCEDURE notify_event();
    
  7. 在订阅请求中添加一个额外的元数据字段,键为 pgNotifyChannel,值应设置为 pg_notify 中提及的相同 通道名称。根据上面的示例,应将其设置为 config

相关链接

3 - Redis

Redis 配置存储组件的详细信息

组件格式

要设置 Redis 配置存储,需创建一个类型为 configuration.redis 的组件。有关如何创建和应用配置存储配置,请参阅此指南

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: configuration.redis
  version: v1
  metadata:
  - name: redisHost
    value: <address>:6379
  - name: redisPassword
    value: **************
  - name: useEntraID
    value: "true"
  - name: enableTLS
    value: <bool>

规格元数据字段

字段必填详情示例
redisHostYOutputRedis 主机的连接字符串。如果 "redisType""cluster",则可以是多个用逗号分隔的主机,也可以是单个主机。当使用 Redis Sentinel("failover""true")时,也可以提供多个 sentinel 地址,用逗号分隔。
redisPasswordNOutputRedis 密码
redisUsernameNOutputRedis 主机的用户名。默认为空。请确保你的 Redis 服务器版本为 6 或更高版本,并且已正确创建 acl 规则。
enableTLSNOutput如果 Redis 实例支持带有公共证书的 TLS,可以配置为启用或禁用 TLS。默认为 "false"
clientCertNOutput客户端证书的内容,用于需要客户端证书的 Redis 实例。必须与 clientKey 一起使用,且 enableTLS 必须设置为 true。建议使用密钥存储,具体操作请参阅此处
clientKeyNOutput客户端私钥的内容,与 clientCert 配合用于身份验证。建议使用密钥存储,具体操作请参阅此处
failoverNOutput启用故障转移配置的属性。需要设置 sentinelMasterName。启用后,redisHost 应包含 sentinel 地址。默认为 "false"
sentinelMasterNameNOutputSentinel 主节点名称。请参阅 Redis Sentinel 文档
sentinelUsernameNOutputRedis Sentinel 的用户名。仅当 “failover” 为 true 且 Redis Sentinel 启用了身份验证时适用
sentinelPasswordNOutputRedis Sentinel 的密码。仅当 “failover” 为 true 且 Redis Sentinel 启用了身份验证时适用
redisTypeNOutputRedis 的类型。有两个有效值,一个是 "node",表示单节点模式;另一个是 "cluster",表示 Redis 集群模式。默认为 "node"
redisDBNOutput连接到 Redis 后选择的数据库。如果 "redisType""cluster",则此选项将被忽略。默认为 "0"
redisMaxRetriesNOutput放弃前重试命令的最大次数。默认为不重试失败的命令。
redisMinRetryIntervalNOutput每次重试之间 Redis 命令的最小退避时间。默认为 "8ms""-1" 禁用退避。
redisMaxRetryIntervalNOutput每次重试之间 Redis 命令的最大退避时间。默认为 "512ms""-1" 禁用退避。
dialTimeoutNOutput建立新连接的拨号超时时间。默认为 "5s"
readTimeoutNOutput套接字读取的超时时间。如果达到超时,Redis 命令将因超时而失败而不是阻塞。默认为 "3s""-1" 表示无超时。
writeTimeoutNOutput套接字写入的超时时间。如果达到超时,Redis 命令将因超时而失败而不是阻塞。默认为 readTimeout。
poolSizeNOutput套接字连接的最大数量。默认为 runtime.NumCPU 报告的每个 CPU 10 个连接。
poolTimeoutNOutput当所有连接都忙时,客户端等待连接的时间,超时后返回错误。默认为 readTimeout + 1 秒。
maxConnAgeNOutput连接的年龄,达到此年龄后客户端将关闭(退役)该连接。默认为不关闭旧连接。
minIdleConnsNOutput保持打开的最小空闲连接数,以避免创建新连接导致的性能下降。默认为 "0"
idleCheckFrequencyNOutput空闲连接清理器执行空闲检查的频率。默认为 "1m""-1" 禁用空闲连接清理器。
idleTimeoutNOutput客户端关闭空闲连接的时间长度。应小于服务器的超时时间。默认为 "5m""-1" 禁用空闲超时检查。

设置 Redis

Dapr 可以使用任何 Redis 实例:容器化的、在本地开发机器上运行的,或托管的云服务。

当你运行 dapr init 时,会自动创建一个 Redis 实例作为 Docker 容器

你可以使用 Helm 在我们的 Kubernetes 集群中快速创建 Redis 实例。此方法需要安装 Helm

  1. 将 Redis 安装到你的集群中。请注意,我们要显式设置一个镜像标签以获取大于 5 的版本,这是 Dapr 的发布订阅功能所要求的。如果你只打算将 Redis 用作状态存储(而不用于发布订阅),则不必设置镜像版本。

    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm install redis bitnami/redis --set image.tag=6.2
    
  2. 运行 kubectl get pods 查看集群中现在运行的 Redis 容器。

  3. redis-master:6379 作为 redisHost 添加到你的 redis.yaml 文件中。例如:

        metadata:
        - name: redisHost
          value: redis-master:6379
    
  4. 接下来,获取 Redis 密码,根据我们使用的操作系统,这略有不同:

    • Windows:运行 kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" > encoded.b64,这将创建一个包含编码密码的文件。接下来,运行 certutil -decode encoded.b64 password.txt,这将把你的 redis 密码放入名为 password.txt 的文本文件中。复制密码并删除这两个文件。

    • Linux/MacOS:运行 kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode 并复制输出的密码。

    将此密码作为 redisPassword 值添加到你的 redis.yaml 文件中。例如:

        metadata:
        - name: redisPassword
          value: lhDOkwTlp0
    
  1. 使用官方 Microsoft 文档创建 Azure Cache for Redis 实例。

  2. 实例创建完成后,从 Azure 门户获取主机名(FQDN)和访问密钥。

    • 对于主机名:
      • 导航到资源的概览页面。
      • 复制主机名值。
    • 对于访问密钥:
      • 导航到设置 > 访问密钥
      • 复制并保存你的密钥。
  3. 将你的密钥和主机名添加到 Dapr 可应用于集群的 redis.yaml 文件中。

    • 如果你在运行示例,请将主机和密钥添加到提供的 redis.yaml 中。
    • 如果你从零开始创建项目,请按照组件格式部分中的说明创建 redis.yaml 文件。
  4. redisHost 键设置为 [上一步的主机名]:6379,将 redisPassword 键设置为你之前保存的密钥。

    注意: 在生产级应用程序中,请遵循密钥管理说明来安全地管理你的密钥。

  5. 启用 EntraID 支持:

    • 在 Azure Redis 服务器上启用 Entra ID 身份验证。这可能需要几分钟时间。
    • useEntraID 设置为 "true" 以实现 Azure Cache for Redis 的 EntraID 支持。
  6. enableTLS 设置为 "true" 以支持 TLS。

注意: useEntraID 假定你的 UserPrincipal(通过 AzureCLICredential)或 SystemAssigned 托管标识具有 RedisDataOwner 角色权限。如果使用用户分配的标识,你需要指定 azureClientID 属性

Redis Sentinel 配置

当使用 Redis Sentinel 实现高可用时,将 redisType 设置为 "node",使用 failover: "true" 启用故障转移模式,并提供 sentinel 主节点名称。可以在 redisHost 字段中指定多个 sentinel 地址,用逗号分隔,以实现冗余。

```yaml
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: redis-pubsub
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: "sentinel1:26379,sentinel2:26379,sentinel3:26379"
  - name: redisType
    value: "node"
  - name: failover
    value: "true"
  - name: sentinelMasterName
    value: "mymaster"
```

相关链接