This is the multi-page printable view of this section. Click here to print.
管理 Dapr 配置
1 - Dapr 配置
Dapr 配置是设置和策略,使您能够更改单个 Dapr 应用程序的行为或 Dapr 控制平面系统服务的全局行为。
应用程序配置
设置应用程序配置
您可以在自托管或 Kubernetes 模式下设置应用程序配置。
在自托管模式下,Dapr 配置是一个配置文件 - 例如,config.yaml。默认情况下,Dapr 边车会在默认的 Dapr 文件夹中查找运行时配置:
- Linux/MacOs:
$HOME/.dapr/config.yaml - Windows:
%USERPROFILE%\.dapr\config.yaml
应用程序还可以通过使用 dapr run CLI 命令的 --config 标志来应用配置文件路径。
在 Kubernetes 模式下,Dapr 配置是一个 Configuration 资源,应用于集群。例如:
kubectl apply -f myappconfig.yaml
您可以使用 Dapr CLI 列出应用程序的 Configuration 资源。
dapr configurations -k
Dapr 边车可以通过使用 dapr.io/config 注解来应用特定配置。例如:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
dapr.io/config: "myappconfig"
注意:查看所有 Kubernetes 注解可用于在边车注入器系统服务激活时配置 Dapr 边车。
应用程序配置设置
以下菜单包含您可以设置的所有配置设置:
追踪
追踪配置可为应用程序启用追踪。
Configuration 规范下的 tracing 部分包含以下属性:
tracing:
samplingRate: "1"
otel:
endpointAddress: "otelcollector.observability.svc.cluster.local:4317"
headers:
- name: "x-api-key"
secretKeyRef:
name: "my-secret"
key: "otel-api-key"
timeout: "30s"
zipkin:
endpointAddress: "http://zipkin.default.svc.cluster.local:9411/api/v2/spans"
下表列出了追踪的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
samplingRate | string | 设置追踪的采样率以启用或禁用。 |
stdout | bool | True 向追踪写入更详细的信息 |
otel.endpointAddress | string | 设置要向其发送追踪的 Open Telemetry (OTEL) 服务器地址。根据您的 OTEL 提供商,可能需要或不需要 https:// 或 http://。 |
otel.isSecure | bool | 到端点地址的连接是否加密 |
otel.protocol | string | 设置为 http 或 grpc 协议 |
otel.headers | array | 要包含在 OTLP 导出器请求中的标头。每个条目都有一个 name 和纯文本 value 或 secretKeyRef 以引用 Kubernetes 密钥(仅支持 Kubernetes 密钥,不支持其他密钥类型) |
otel.timeout | string | OTLP 导出器请求的超时时间(例如 30s、5m)。 |
zipkin.endpointAddress | string | 设置要向其发送追踪的 Zipkin 服务器地址。这应包含端点上的协议(http:// 或 https://)。 |
samplingRate
samplingRate 用于启用或禁用追踪。samplingRate 的有效范围介于 0 和 1 之间(含)。采样率根据值确定是否应对追踪跨度进行采样。
samplingRate : "1" 采样所有追踪。默认情况下,采样率为 (0.0001),即 10,000 条追踪中有 1 条。
要禁用采样率,请在配置中设置 samplingRate : "0"。
otel
也可以通过环境变量配置 OpenTelemetry (otel) 端点。OTEL_EXPORTER_OTLP_ENDPOINT 环境变量的存在会为边车启用追踪。
| 环境变量 | 描述 |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT | 设置 Open Telemetry (OTEL) 服务器地址,启用追踪 |
OTEL_EXPORTER_OTLP_INSECURE | 将到端点的连接设置为未加密(true/false) |
OTEL_EXPORTER_OTLP_PROTOCOL | 传输协议(grpc、http/protobuf、http/json) |
OTEL_EXPORTER_OTLP_TRACES_HEADERS | OTLP 追踪导出器的逗号分隔的 key=value 标头列表 |
OTEL_EXPORTER_OTLP_TRACES_TIMEOUT | OTLP 追踪导出器的超时时间(以毫秒为单位)(例如 30000) |
更多信息,请参阅可观测性分布式追踪。
指标
Configuration 规范下的 metrics 部分可用于启用或禁用应用程序的指标。
metrics 部分包含以下属性:
metrics:
enabled: true
rules: []
latencyDistributionBuckets: []
http:
increasedCardinality: true
pathMatching:
- /items
- /orders/{orderID}
- /orders/{orderID}/items/{itemID}
- /payments/{paymentID}
- /payments/{paymentID}/status
- /payments/{paymentID}/refund
- /payments/{paymentID}/details
excludeVerbs: false
recordErrorCodes: true
在上述示例中,路径过滤器 /orders/{orderID}/items/{itemID} 将返回与所有 orderID 和所有 itemID 匹配的_单个指标计数_,而不是为每个 itemID 返回多个指标。更多信息,请参阅 HTTP 指标路径匹配。
上述示例还启用了记录错误代码指标,默认情况下该功能是禁用的。
下表列出了指标的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
enabled | boolean | 设置为 true 时(默认值),启用指标收集和指标端点。 |
rules | array | 用于过滤指标的命名规则。每个规则包含一组要过滤的 labels 和要应用于指标路径的 regex 表达式。 |
latencyDistributionBuckets | array | 延迟指标直方图的延迟分布桶数组(以毫秒为单位)。 |
http.increasedCardinality | boolean | 设置为 true(默认值)时,在 Dapr HTTP 服务器中,每个请求路径都会创建一个新的指标"桶"。当有许多不同的请求端点(例如与 RESTful API 交互时)时,这可能会导致问题,包括过多的内存消耗。为了缓解与 HTTP 服务器相关的高基数指标的高内存使用量和出口成本,您应该将 metrics.http.increasedCardinality 属性设置为 false。 |
http.pathMatching | array | 用于路径匹配的路径数组,允许用户定义匹配路径以管理基数。 |
http.excludeVerbs | boolean | 设置为 true 时(默认为 false),Dapr HTTP 服务器在构建方法指标标签时会忽略每个请求的 HTTP 动词。 |
为了进一步帮助管理基数,路径匹配允许您根据定义的模式匹配指定路径,从而减少唯一指标路径的数量,从而控制指标基数。此功能对于具有动态 URL 的应用程序特别有用,确保指标保持有意义和可管理,而不会消耗过多的内存。
使用规则,您可以为 Dapr 边车公开的每个指标设置正则表达式。例如:
metrics:
enabled: true
rules:
- name: dapr_runtime_service_invocation_req_sent_total
labels:
- name: method
regex:
"orders/": "orders/.+"
更多信息,请参阅指标文档。
日志记录
Configuration 规范下的 logging 部分用于配置 Dapr Runtime 中的日志记录工作方式。
logging 部分包含以下属性:
logging:
apiLogging:
enabled: false
obfuscateURLs: false
omitHealthChecks: false
下表列出了日志记录的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
apiLogging.enabled | boolean | daprd 的 --enable-api-logging 标志(以及相应的 dapr.io/enable-api-logging 注解)的默认值:在 Configuration 规范中设置的值将用作默认值,除非将 true 或 false 值传递给每个 Dapr Runtime。默认值:false。 |
apiLogging.obfuscateURLs | boolean | 启用后,混淆 HTTP API 日志中的 URL 值(如果启用),记录抽象路由名称而不是被调用的完整路径,后者可能包含个人身份信息 (PII)。默认值:false。 |
apiLogging.omitHealthChecks | boolean | 如果为 true,则在启用 API 日志记录时,不会记录对健康检查端点(例如 /v1.0/healthz)的调用。如果这些调用在日志中产生大量噪音,这很有用。默认值:false |
更多信息,请参阅日志记录文档。
中间件
中间件配置设置命名 HTTP 管道中间件处理程序。Configuration 规范下的 httpPipeline 和 appHttpPipeline 部分包含以下属性:
httpPipeline: # for incoming http calls
handlers:
- name: oauth2
type: middleware.http.oauth2
- name: uppercase
type: middleware.http.uppercase
appHttpPipeline: # for outgoing http calls
handlers:
- name: oauth2
type: middleware.http.oauth2
- name: uppercase
type: middleware.http.uppercase
下表列出了 HTTP 处理程序的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
name | string | 中间件组件的名称 |
type | string | 中间件组件的类型 |
更多信息,请参阅中间件管道。
名称解析组件
您可以在配置文件中设置要使用的名称解析组件。例如,要将 spec.nameResolution.component 属性设置为 "sqlite",请在 spec.nameResolution.configuration 字典中传递配置选项,如下所示。
这是一个配置资源的基本示例:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
nameResolution:
component: "sqlite"
version: "v1"
configuration:
connectionString: "/home/user/.dapr/nr.db"
更多信息,请参阅:
工作流
workflow 部分包含用于配置工作流的属性。
| 属性 | 类型 | 描述 |
|---|---|---|
maxConcurrentWorkflowInvocations | int32 | 每个 Dapr 边车的最大并发工作流执行数。默认为无限。 |
maxConcurrentActivityInvocations | int32 | 每个 Dapr 边车的最大并发活动执行数。默认为无限。 |
限定密钥存储访问范围
有关如何将密钥范围限定到应用程序的信息和示例,请参阅限定密钥范围指南。
构建块 API 的访问控制允许列表
有关如何在构建块 API 列表上设置访问控制允许列表 (ACL) 的信息和示例,请参阅在 Dapr 边车上有选择性地启用 Dapr API指南。
服务调用 API 的访问控制允许列表
有关如何使用服务调用 API 通过 ACL 设置允许列表的信息和示例,请参阅服务调用的允许列表指南。
禁止使用某些组件类型
使用 Configuration 规范中的 components.deny 属性,您可以指定无法初始化的组件类型的拒绝列表。
例如,以下配置禁止初始化类型为 bindings.smtp 和 secretstores.local.file 的组件:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: myappconfig
spec:
components:
deny:
- bindings.smtp
- secretstores.local.file
或者,您可以通过在组件名称末尾添加版本来指定要禁止的版本。例如,state.in-memory/v1 禁止初始化类型为 state.in-memory 和版本为 v1 的组件,但不会禁用(假设的)组件的 v2 版本。
注意
当您将组件类型 secretstores.kubernetes 添加到拒绝列表时,Dapr 禁止创建类型为 secretstores.kubernetes 的_其他_组件。
但是,它不会禁用内置的 Kubernetes 密钥存储,该密钥存储是:
- 由 Dapr 自动创建
- 用于存储组件规范中指定的密钥
如果要禁用内置的 Kubernetes 密钥存储,则需要使用 dapr.io/disable-builtin-k8s-secret-store 注解。
启用预览功能
有关如何选择加入发布的预览功能的信息和示例,请参阅预览功能指南。
启用预览功能会为开发/测试添加新功能,因为它们在运行时中普遍可用 (GA) 之前仍需要更多时间。
边车配置示例
以下 YAML 显示了一个可以应用于应用程序的 Dapr 边车的配置文件示例。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: myappconfig
namespace: default
spec:
tracing:
samplingRate: "1"
stdout: true
otel:
endpointAddress: "localhost:4317"
isSecure: false
protocol: "grpc"
headers:
- name: "x-api-key"
secretKeyRef:
name: "my-secret"
key: "otel-api-key"
timeout: "30s"
httpPipeline:
handlers:
- name: oauth2
type: middleware.http.oauth2
secrets:
scopes:
- storeName: localstore
defaultAccess: allow
deniedSecrets: ["redis-password"]
components:
deny:
- bindings.smtp
- secretstores.local.file
workflow:
maxConcurrentWorkflowInvocations: 100
maxConcurrentActivityInvocations: 1000
accessControl:
defaultAction: deny
trustDomain: "public"
policies:
- appId: app1
defaultAction: deny
trustDomain: 'public'
namespace: "default"
operations:
- name: /op1
httpVerb: ['POST', 'GET']
action: deny
- name: /op2/*
httpVerb: ["*"]
action: allow
控制平面配置
安装了一个名为 daprsystem 的配置文件,用于应用全局设置的 Dapr 控制平面系统服务。
这仅在将 Dapr 部署到 Kubernetes 时设置。
控制平面配置设置
Dapr 控制平面配置包含以下部分:
mtls用于 mTLS(双向 TLS)
mTLS(双向 TLS)
mtls 部分包含 mTLS 的属性。
| 属性 | 类型 | 描述 |
|---|---|---|
enabled | bool | 如果为 true,则为集群中的服务和应用程序之间的通信启用 mTLS。 |
allowedClockSkew | string | 检查 TLS 证书过期时允许的容差,以允许时钟偏差。遵循 Go 的 time.ParseDuration 使用的格式。默认为 15m(15 分钟)。 |
workloadCertTTL | string | 由 Dapr 颁发的 TLS 证书的有效期。遵循 Go 的 time.ParseDuration 使用的格式。默认为 24h(24 小时)。 |
sentryAddress | string | 用于连接到 Sentry 服务器的主名端口地址。 |
controlPlaneTrustDomain | string | 控制平面的信任域。这用于验证到控制平面服务的连接。 |
tokenValidators | array | 用于验证证书请求的其他 Sentry 令牌验证器。 |
控制平面配置示例
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprsystem
namespace: default
spec:
mtls:
enabled: true
allowedClockSkew: 15m
workloadCertTTL: 24h
后续步骤
了解并发和速率限制2 - 操作指南:控制应用程序的并发和速率限制
在分布式计算中,通常您可能只希望允许给定数量的请求并发执行。使用 Dapr 的 app-max-concurrency,您可以控制同时调用您的应用程序的请求数和事件数。
默认的 app-max-concurrency 设置为 -1,表示不强制执行并发限制。
不同的方法
本指南重点介绍 app-max-concurrency,您也可以使用 middleware.http.ratelimit 中间件来限制每秒的请求速率。但是,了解这两种方法之间的区别很重要:
middleware.http.ratelimit:时间受限,限制每秒的请求数app-max-concurrency:指定在任何时间点的最大并发请求(和事件)数
有关该方法的更多信息,请参阅速率限制中间件。
演示
观看此视频,了解如何控制并发和速率限制。
配置 app-max-concurrency
如果不使用 Dapr,您需要在应用程序中创建某种信号量,并负责获取和释放它。
使用 Dapr,您无需对应用程序进行任何代码更改。
选择您想要配置 app-max-concurrency 的方式。
要在本地开发计算机上使用 Dapr CLI 设置并发限制,请添加 app-max-concurrency 标志:
dapr run --app-max-concurrency 1 --app-port 5000 python ./app.py
上述示例有效地将您的应用程序转换为顺序处理服务。
要在 Kubernetes 中配置并发限制,请将以下注解添加到您的 pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodesubscriber
namespace: default
labels:
app: nodesubscriber
spec:
replicas: 1
selector:
matchLabels:
app: nodesubscriber
template:
metadata:
labels:
app: nodesubscriber
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodesubscriber"
dapr.io/app-port: "3000"
dapr.io/app-max-concurrency: "1"
#...
限制
控制外部请求的并发性
对于来自 Dapr 的每个事件,包括发布订阅事件、来自其他服务的直接调用、绑定事件等,都可以保证速率限制。但是,Dapr 无法对从外部到您的应用程序的请求强制执行并发策略。
相关链接
后续步骤
限制 secret store 访问3 - 操作指南:限制可从 secret 存储读取的密钥
除了限定哪些应用可以访问给定组件外,你还可以为应用将命名的 secret 存储组件限定到一个或多个密钥。通过定义 allowedSecrets 和/或 deniedSecrets 列表,你可以限制应用仅访问特定的密钥。
有关配置 Configuration 资源的更多信息:
配置密钥访问
Configuration 规范下的 secrets 部分包含以下属性:
secrets:
scopes:
- storeName: kubernetes
defaultAccess: allow
allowedSecrets: ["redis-password"]
- storeName: localstore
defaultAccess: allow
deniedSecrets: ["redis-password"]
下表列出了 secret 范围的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
| storeName | string | secret 存储组件的名称。storeName 在列表中必须唯一 |
| defaultAccess | string | 访问修饰符。接受的值为 “allow”(默认)或 “deny” |
| allowedSecrets | list | 可访问的密钥列表 |
| deniedSecrets | list | 不可访问的密钥列表 |
当存在包含至少一个元素的 allowedSecrets 列表时,应用只能访问该列表中定义的密钥。
权限优先级
allowedSecrets 和 deniedSecrets 列表值优先于 defaultAccess。请参阅以下示例场景中的工作方式:
| 场景 | defaultAccess | allowedSecrets | deniedSecrets | permission | |
|---|---|---|---|---|---|
| 1 | 仅默认访问 | deny/allow | 空 | 空 | deny/allow |
| 2 | 默认拒绝且包含允许列表 | deny | ["s1"] | 空 | 仅 "s1" 可被访问 |
| 3 | 默认允许且包含拒绝列表 | allow | 空 | ["s1"] | 仅 "s1" 不可被访问 |
| 4 | 默认允许且包含允许列表 | allow | ["s1"] | 空 | 仅 "s1" 可被访问 |
| 5 | 默认拒绝且包含拒绝列表 | deny | 空 | ["s1"] | deny |
| 6 | 默认拒绝/允许且同时包含两个列表 | deny/allow | ["s1"] | ["s2"] | 仅 "s1" 可被访问 |
示例
场景 1:拒绝访问 secret 存储的所有密钥
在 Kubernetes 集群中,默认会为你的 Dapr 应用添加原生的 Kubernetes secret 存储。在某些场景中,可能需要拒绝给定应用对 Dapr 密钥的访问。要添加此配置:
定义以下
appconfig.yaml。apiVersion: dapr.io/v1alpha1 kind: Configuration metadata: name: appconfig spec: secrets: scopes: - storeName: kubernetes defaultAccess: deny使用以下命令将其应用到 Kubernetes 集群:
kubectl apply -f appconfig.yaml`.
对于需要拒绝访问 Kubernetes secret 存储的应用,遵循 Kubernetes 指南,将以下注解添加到应用 pod。
dapr.io/config: appconfig
定义后,应用将无法访问 Kubernetes secret 存储。
场景 2:仅允许访问 secret 存储中的某些密钥
要允许 Dapr 应用仅访问某些密钥,定义以下 config.yaml:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
secrets:
scopes:
- storeName: vault
defaultAccess: deny
allowedSecrets: ["secret1", "secret2"]
此示例为名为 vault 的 secret 存储定义了配置。对 secret 存储的默认访问为 deny。同时,根据 allowedSecrets 列表,应用可以访问某些密钥。遵循 边车配置指南 将配置应用到边车。
场景 3:拒绝访问 secret 存储中的某些敏感密钥
定义以下 config.yaml:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
secrets:
scopes:
- storeName: vault
defaultAccess: allow # 这是默认值,可以省略此行
deniedSecrets: ["secret1", "secret2"]
此配置明确拒绝访问名为 vault 的 secret 存储中的 secret1 和 secret2,同时允许访问所有其他密钥。遵循 边车配置指南 将配置应用到边车。
后续步骤
服务调用访问控制4 - 如何:为服务调用应用访问控制列表配置
使用访问控制,您可以配置策略,通过服务调用限制_调用_应用程序可以对_被调用_应用程序执行的操作。您可以在 Configuration 架构中定义访问控制策略规范来限制访问:
- 从特定操作到被调用应用程序,以及
- 从调用应用程序到 HTTP 动词。
访问控制策略在 Configuration 中指定,并应用于_被调用_应用程序的 Dapr 边车。对被调用应用程序的访问基于匹配的策略操作。
您可以为所有调用应用程序提供默认的全局操作。如果未指定访问控制策略,则默认行为是允许所有调用应用程序访问被调用应用程序。
术语
trustDomain
“信任域”(trust domain)是管理信任关系的逻辑组。每个应用程序都分配有一个信任域,可以在访问控制列表策略规范中指定。如果未定义策略规范或指定了空的信任域,则使用默认值 “public”。此信任域用于在 TLS 证书中生成应用程序的身份。
应用程序身份
Dapr 请求 sentry 服务为所有应用程序生成 SPIFFE ID。此 ID 附加在 TLS 证书中。
SPIFFE ID 的格式为:**spiffe://\<trustdomain>/ns/\<namespace\>/\<appid\>**。
为了匹配策略,调用应用程序的信任域、命名空间和应用程序 ID 值从调用应用程序的 TLS 证书中的 SPIFFE ID 中提取。这些值与策略规范中指定的信任域、命名空间和应用程序 ID 值进行匹配。如果这三个值都匹配,则会进一步匹配更具体的策略。
配置属性
下表列出了访问控制、策略和操作的不同属性:
访问控制
| 属性 | 类型 | 描述 |
|---|---|---|
defaultAction | string | 当没有其他策略匹配时的全局默认操作 |
trustDomain | string | 分配给应用程序的信任域。默认为 “public”。 |
policies | string | 用于确定调用应用程序可以对被调用应用程序执行的操作的策略 |
策略
| 属性 | 类型 | 描述 |
|---|---|---|
app | string | 要允许/拒绝服务调用的调用应用程序的 AppId |
namespace | string | 需要与调用应用程序的命名空间匹配的命名空间值 |
trustDomain | string | 需要与调用应用程序的信任域匹配的信任域。默认为 “public” |
defaultAction | string | 应用程序级别的默认操作,当找到应用程序但没有匹配特定操作时使用 |
operations | string | 从调用应用程序允许的操作 |
操作
| 属性 | 类型 | 描述 |
|---|---|---|
name | string | 被调用应用程序上允许的操作的路径名称。可以在路径中使用通配符 “*” 进行匹配。可以使用通配符 “**” 在多个路径下进行匹配。 |
httpVerb | list | 列出调用应用程序可以使用的特定 http 动词。可以使用通配符 “*” 匹配任何 http 动词。对于 grpc 调用未使用。 |
action | string | 访问修饰符。接受的值为 “allow”(默认)或 “deny” |
策略规则
- 如果未指定访问策略,则默认行为是允许所有应用程序访问被调用应用程序上的所有方法。
- 如果未指定全局默认操作且未定义应用程序特定策略,则空访问策略被视为未指定访问策略。默认行为是允许所有应用程序访问被调用应用程序上的所有方法。
- 如果未指定全局默认操作但已定义某些应用程序特定策略,则我们采用更安全的选项,即假设全局默认操作拒绝访问被调用应用程序上的所有方法。
- 如果定义了访问策略并且无法验证传入应用程序的身份凭证,则全局默认操作生效。
- 如果传入应用程序的信任域或命名空间与应用程序策略中指定的值不匹配,则应用程序策略将被忽略,全局默认操作生效。
策略优先级
与匹配的最具体策略对应的操作按以下顺序生效:
- HTTP 情况下的特定 HTTP 动词,或 GRPC 情况下的操作级别操作。
- 应用程序级别的默认操作
- 全局级别的默认操作
示例场景
以下是一些使用服务调用访问控制列表的示例场景。请参阅配置指南以了解应用程序边车的可用配置设置。
场景 1:
拒绝所有应用程序的访问,除了 trustDomain = public、namespace = default、appId = app1
使用此配置,允许 appId = app1 的所有调用方法。来自其他应用程序的所有其他调用请求都被拒绝。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
accessControl:
defaultAction: deny
trustDomain: "public"
policies:
- appId: app1
defaultAction: allow
trustDomain: 'public'
namespace: "default"
场景 2:
拒绝所有应用程序的访问,除了 trustDomain = public、namespace = default、appId = app1、operation = op1
使用此配置,只允许 appId = app1 的方法 op1。来自所有其他应用程序的所有其他方法请求(包括 app1 上的其他方法)都被拒绝。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
accessControl:
defaultAction: deny
trustDomain: "public"
policies:
- appId: app1
defaultAction: deny
trustDomain: 'public'
namespace: "default"
operations:
- name: /op1
httpVerb: ['*']
action: allow
场景 3:
拒绝所有应用程序的访问,除非匹配 HTTP 的特定动词和 GRPC 的特定操作
使用此配置,仅允许以下场景访问。来自所有其他应用程序的所有其他方法请求(包括 app1 或 app2 上的其他方法)都被拒绝。
trustDomain=public、namespace=default、appID=app1、operation=op1、httpVerb=POST/PUTtrustDomain="myDomain"、namespace="ns1"、appID=app2、operation=op2且应用程序协议为 GRPC
只允许 appId = app1 的方法 op1 上的 httpVerb POST/PUT。来自所有其他应用程序的所有其他方法请求(包括 app1 上的其他方法)都被拒绝。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
accessControl:
defaultAction: deny
trustDomain: "public"
policies:
- appId: app1
defaultAction: deny
trustDomain: 'public'
namespace: "default"
operations:
- name: /op1
httpVerb: ['POST', 'PUT']
action: allow
- appId: app2
defaultAction: deny
trustDomain: 'myDomain'
namespace: "ns1"
operations:
- name: /op2
action: allow
场景 4:
允许所有方法的访问,除了 trustDomain = public、namespace = default、appId = app1、operation = /op1/*、所有 httpVerb
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
accessControl:
defaultAction: allow
trustDomain: "public"
policies:
- appId: app1
defaultAction: allow
trustDomain: 'public'
namespace: "default"
operations:
- name: /op1/*
httpVerb: ['*']
action: deny
场景 5:
允许 trustDomain = public、namespace = ns1、appId = app1 的所有方法的访问,并拒绝 trustDomain = public、namespace = ns2、appId = app1 的所有方法的访问
此场景展示了如何指定具有相同应用程序 ID 但属于不同命名空间的应用程序。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
accessControl:
defaultAction: allow
trustDomain: "public"
policies:
- appId: app1
defaultAction: allow
trustDomain: 'public'
namespace: "ns1"
- appId: app1
defaultAction: deny
trustDomain: 'public'
namespace: "ns2"
场景 6:
允许所有方法的访问,除了 trustDomain = public、namespace = default、appId = app1、operation = /op1/**/a、所有 httpVerb
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
accessControl:
defaultAction: allow
trustDomain: "public"
policies:
- appId: app1
defaultAction: allow
trustDomain: 'public'
namespace: "default"
operations:
- name: /op1/**/a
httpVerb: ['*']
action: deny
“hello world” 示例
在这些示例中,您将学习如何对 hello world 教程应用访问控制。
访问控制列表依赖 Dapr Sentry 服务 来生成带有用于身份验证的 SPIFFE ID 的 TLS 证书。这意味着 Sentry 服务必须在本地运行或部署到您的托管环境(例如 Kubernetes 集群)。
下面的 nodeappconfig 示例展示了如何拒绝 pythonapp 对 neworder 方法的访问,其中 Python 应用程序位于 myDomain 信任域和 default 命名空间中。Node.js 应用程序位于 public 信任域中。
nodeappconfig.yaml
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: nodeappconfig
spec:
tracing:
samplingRate: "1"
accessControl:
defaultAction: allow
trustDomain: "public"
policies:
- appId: pythonapp
defaultAction: allow
trustDomain: 'myDomain'
namespace: "default"
operations:
- name: /neworder
httpVerb: ['POST']
action: deny
pythonappconfig.yaml
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: pythonappconfig
spec:
tracing:
samplingRate: "1"
accessControl:
defaultAction: allow
trustDomain: "myDomain"
自托管模式
在完成本教程时,您将:
- 在本地运行启用了 mTLS 的 Sentry 服务
- 设置必要的环境变量以访问证书
- 启动 Node 应用和 Python 应用,每个应用都引用 Sentry 服务以应用 ACL
先决条件
- 熟悉在启用 mTLS 的情况下以自托管模式运行 Sentry 服务
- 克隆 hello world 教程
运行 Node.js 应用
在命令提示符中,设置这些环境变量:
```bash export DAPR_TRUST_ANCHORS=`cat $HOME/.dapr/certs/ca.crt` export DAPR_CERT_CHAIN=`cat $HOME/.dapr/certs/issuer.crt` export DAPR_CERT_KEY=`cat $HOME/.dapr/certs/issuer.key` export NAMESPACE=default ``````powershell $env:DAPR_TRUST_ANCHORS=$(Get-Content -raw $env:USERPROFILE\.dapr\certs\ca.crt) $env:DAPR_CERT_CHAIN=$(Get-Content -raw $env:USERPROFILE\.dapr\certs\issuer.crt) $env:DAPR_CERT_KEY=$(Get-Content -raw $env:USERPROFILE\.dapr\certs\issuer.key) $env:NAMESPACE="default" ```运行 daprd 以启动 Node.js 应用的 Dapr 边车,启用 mTLS,并引用本地 Sentry 服务:
daprd --app-id nodeapp --dapr-grpc-port 50002 -dapr-http-port 3501 --log-level debug --app-port 3000 --enable-mtls --sentry-address localhost:50001 --config nodeappconfig.yaml在单独的命令提示符中运行 Node.js 应用:
node app.js
运行 Python 应用
在另一个命令提示符中,设置这些环境变量:
```bash export DAPR_TRUST_ANCHORS=`cat $HOME/.dapr/certs/ca.crt` export DAPR_CERT_CHAIN=`cat $HOME/.dapr/certs/issuer.crt` export DAPR_CERT_KEY=`cat $HOME/.dapr/certs/issuer.key` export NAMESPACE=default$env:DAPR_TRUST_ANCHORS=$(Get-Content -raw $env:USERPROFILE\.dapr\certs\ca.crt) $env:DAPR_CERT_CHAIN=$(Get-Content -raw $env:USERPROFILE\.dapr\certs\issuer.crt) $env:DAPR_CERT_KEY=$(Get-Content -raw $env:USERPROFILE\.dapr\certs\issuer.key) $env:NAMESPACE="default"运行 daprd 以启动 Python 应用的 Dapr 边车,启用 mTLS,并引用本地 Sentry 服务:
daprd --app-id pythonapp --dapr-grpc-port 50003 --metrics-port 9092 --log-level debug --enable-mtls --sentry-address localhost:50001 --config pythonappconfig.yaml在单独的命令提示符中运行 Python 应用:
python app.py
您应该看到在 Python 应用命令提示符中调用 Node.js 应用失败,这是由于 nodeappconfig 文件中的 deny 操作操作。将此操作更改为 allow 并重新运行应用程序以查看此调用成功。
Kubernetes 模式
先决条件
- 熟悉在启用 mTLS 的情况下以自托管模式运行 Sentry 服务
- 克隆 hello world 教程
配置 Node.js 和 Python 应用
您可以创建并应用上述 nodeappconfig.yaml 和 pythonappconfig.yaml 配置文件,如配置中所述。
例如,下面的 Kubernetes Deployment 展示了如何将 Python 应用部署到 Kubernetes 集群的 default 命名空间中,并使用此 pythonappconfig 配置文件。
对 Node.js 部署执行相同的操作,并查看 Python 应用的日志,以查看由于 nodeappconfig 文件中设置的 deny 操作操作而导致的调用失败。
将此操作更改为 allow 并重新部署应用程序以查看此调用成功。
Deployment YAML 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: pythonapp
namespace: default
labels:
app: python
spec:
replicas: 1
selector:
matchLabels:
app: python
template:
metadata:
labels:
app: python
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "pythonapp"
dapr.io/config: "pythonappconfig"
spec:
containers:
- name: python
image: dapriosamples/hello-k8s-python:edge
演示
观看此视频,了解如何为服务调用应用访问控制列表。
后续步骤
Dapr API 允许列表5 - 操作指南:在 Dapr 边车上选择性地启用 Dapr API
在零信任网络等场景中,或通过前端将 Dapr 边车暴露给外部流量时,建议只启用应用使用的 Dapr 边车 API。这样做可以减少攻击面,并有助于将 Dapr API 限制在应用程序的实际需求范围内。
Dapr 允许您通过使用 Dapr Configuration 设置 API 允许列表或拒绝列表来控制哪些 API 可供应用程序访问。
默认行为
如果未指定 API 允许列表或拒绝列表,默认行为是允许访问所有 Dapr API。
- 如果您仅定义了拒绝列表,则除拒绝列表中定义的 API 外,所有 Dapr API 均被允许
- 如果您仅定义了允许列表,则仅允许允许列表中列出的 Dapr API
- 如果您同时定义了允许列表和拒绝列表,则对于两者中都定义的 API,拒绝列表会覆盖允许列表
- 如果两者都未定义,则允许所有 API
例如,以下配置为 HTTP 和 gRPC 启用了所有 API:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: myappconfig
namespace: default
spec:
tracing:
samplingRate: "1"
使用允许列表
启用特定 HTTP API
以下示例启用了状态 v1.0 HTTP API 并阻止所有其他 HTTP API:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: myappconfig
namespace: default
spec:
api:
allowed:
- name: state
version: v1.0
protocol: http
启用特定 gRPC API
以下示例启用了状态 v1 gRPC API 并阻止所有其他 gRPC API:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: myappconfig
namespace: default
spec:
api:
allowed:
- name: state
version: v1
protocol: grpc
使用拒绝列表
禁用特定 HTTP API
以下示例禁用了状态 v1.0 HTTP API,允许所有其他 HTTP API:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: myappconfig
namespace: default
spec:
api:
denied:
- name: state
version: v1.0
protocol: http
禁用特定 gRPC API
以下示例禁用了状态 v1 gRPC API,允许所有其他 gRPC API:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: myappconfig
namespace: default
spec:
api:
denied:
- name: state
version: v1
protocol: grpc
Dapr API 列表
name 字段接受您要启用的 Dapr API 的名称。
请参阅对应不同 Dapr API 的值列表:
| API 组 | HTTP API | gRPC API |
|---|---|---|
| 服务调用 | invoke (v1.0) | invoke (v1) |
| 状态 | state (v1.0 和 v1.0-alpha1) | state (v1 和 v1alpha1) |
| 发布订阅 | publish (v1.0 和 v1.0-alpha1) | publish (v1 和 v1alpha1) |
| 输出绑定 | bindings (v1.0) | bindings (v1) |
| 订阅 | n/a | subscribe (v1alpha1) |
| 密钥 | secrets (v1.0) | secrets (v1) |
| Actor | actors (v1.0) | actors (v1) |
| 元数据 | metadata (v1.0) | metadata (v1) |
| 配置 | configuration (v1.0 和 v1.0-alpha1) | configuration (v1 和 v1alpha1) |
| 分布式锁 | lock (v1.0-alpha1)unlock (v1.0-alpha1) | lock (v1alpha1)unlock (v1alpha1) |
| 加密 | crypto (v1.0-alpha1) | crypto (v1alpha1) |
| 工作流 | workflows (v1.0) | workflows (v1) |
| 对话 | conversation (v1.0-alpha1) | conversation (v1alpha1) |
| 健康检查 | healthz (v1.0) | n/a |
| 关闭 | shutdown (v1.0) | shutdown (v1) |
后续步骤
配置 Dapr 使用 gRPC6 - 操作指南:配置 Dapr 使用 gRPC
Dapr 为本地调用同时实现了 HTTP 和 gRPC API。gRPC 适用于低延迟、高性能场景,并通过 proto 客户端提供语言集成支持。你可以查看自动生成客户端(Dapr SDK)的完整列表。
Dapr 运行时实现了一个 proto 服务,应用程序可以通过 gRPC 与之通信。
不仅可以使用 gRPC 调用 Dapr,Dapr 也可以通过 gRPC 与应用程序通信。为此,应用程序需要托管一个 gRPC 服务器并实现 Dapr appcallback 服务。
配置 Dapr 通过 gRPC 与应用程序通信
在自托管模式下运行时,使用 --app-protocol 标志告知 Dapr 使用 gRPC 与应用程序通信:
dapr run --app-protocol grpc --app-port 5005 node app.js
这会指示 Dapr 通过 gRPC 在端口 5005 上与你的应用程序通信。
在 Kubernetes 上,在部署 YAML 中设置以下注解:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "myapp"
dapr.io/app-protocol: "grpc"
dapr.io/app-port: "5005"
#...
后续步骤
处理大型 HTTP 头部大小7 - 操作指南:处理大型 HTTP 头大小
Dapr 对 HTTP 头读取缓冲区大小有 4KB 的默认限制。如果您发送的 HTTP 头超过默认的 4KB,可能会遇到 Too big request header 服务调用错误。
您可以通过以下方式增加 HTTP 头大小:
dapr.io/http-read-buffer-size注解,或- 使用 CLI 时的
--dapr-http-read-buffer-size标志。
在自托管模式下运行时,使用 --dapr-http-read-buffer-size 标志配置 Dapr 使用非默认的 http 头大小:
dapr run --dapr-http-read-buffer-size 16 node app.js
这告诉 Dapr 将最大读取缓冲区大小设置为 16 KB。
在 Kubernetes 上,在部署 YAML 中设置以下注解:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "myapp"
dapr.io/app-port: "8000"
dapr.io/http-read-buffer-size: "16"
#...
相关链接
后续步骤
处理大型 HTTP body 请求8 - 操作指南:处理更大的请求体
注意
现有的标志/注解dapr-http-max-request-size 已被弃用,并更新为 max-body-size。默认情况下,Dapr 对请求体大小有限制,设置为 4MB。你可以通过定义以下内容来更改 HTTP 和 gRPC 请求的限制:
dapr.io/max-body-size注解,或--max-body-size标志。
在自托管模式下运行时,使用 --max-body-size 标志配置 Dapr 以使用非默认的请求体大小:
dapr run --max-body-size 16Mi node app.js
在 Kubernetes 上,在部署 YAML 中设置以下注解:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "myapp"
dapr.io/app-port: "8000"
dapr.io/max-body-size: "16Mi"
#...
这将告诉 Dapr 为 HTTP 和 gRPC 请求将最大请求体大小设置为 16 MB。
相关链接
下一步
安装边车证书9 - 操作指南:在 Dapr 边车中安装证书
Dapr 边车可以配置为信任用于与外部服务通信的证书。这在需要信任自签名证书的场景中很有用,例如:
- 使用 HTTP binding
- 为边车配置出站代理
同时支持证书颁发机构(CA)证书和叶证书。
当边车作为容器运行时,你可以进行以下配置。
- 使用卷挂载将证书配置为对边车容器可用。
- 将边车容器中的环境变量
SSL_CERT_DIR指向包含证书的目录。
注意: 对于 Windows 容器,请确保容器以管理员权限运行,以便它可以安装证书。
以下示例使用 Docker Compose 在边车容器中安装证书(在本地 ./certificates 目录中存在):
version: '3'
services:
dapr-sidecar:
image: "daprio/daprd:edge" # dapr 版本必须至少为 v1.8
command: [
"./daprd",
"-app-id", "myapp",
"-app-port", "3000",
]
volumes:
- "./components/:/components"
- "./certificates:/certificates" # (步骤 1)将证书文件夹挂载到边车容器
environment:
- "SSL_CERT_DIR=/certificates" # (步骤 2)将环境变量设置为证书文件夹的路径
# 对于 Windows 容器,取消下面的注释
# user: ContainerAdministrator
注意: 当边车未在容器内运行时,证书必须直接安装在主机操作系统上。
在 Kubernetes 上:
- 使用卷挂载将证书配置为对边车容器可用。
- 将边车容器中的环境变量
SSL_CERT_DIR指向包含证书的目录。
以下示例 YAML 显示了一个部署,该部署:
- 将 Pod 卷附加到边车
- 设置
SSL_CERT_DIR以安装证书
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "myapp"
dapr.io/app-port: "8000"
dapr.io/volume-mounts: "certificates-vol:/tmp/certificates" # (步骤 1)将证书文件夹挂载到边车容器
dapr.io/env: "SSL_CERT_DIR=/tmp/certificates" # (步骤 2)将环境变量设置为证书文件夹的路径
spec:
volumes:
- name: certificates-vol
hostPath:
path: /certificates
#...
注意:使用 Windows 容器时,边车容器以管理员权限启动,这是安装证书所必需的。这不适用于 Linux 容器。
按照这些步骤后,将安装 SSL_CERT_DIR 指向的目录中的所有证书。
- 在 Linux 容器上: 支持 OpenSSL 支持的所有证书扩展。了解更多。
- 在 Windows 容器上: 支持
certoc.exe支持的所有证书扩展。参见 Windows Server Core 中的 certoc.exe。
演示
观看关于安装 SSL 证书并在社区通话 64 中安全使用 HTTP binding 的演示:
相关链接
下一步
启用预览功能10 - 操作指南:启用预览功能
Dapr 中的预览功能在初次发布时被视为实验性功能。这些预览功能需要你明确选择加入才能使用。你需要在 Dapr 的 Configuration 文件中指定此选择加入。
预览功能是基于每个应用程序启用的,方法是在运行应用程序实例时进行设置。
配置属性
Configuration 规范下的 features 部分包含以下属性:
| 属性 | 类型 | 描述 |
|---|---|---|
name | string | 启用/禁用的预览功能的名称 |
enabled | bool | 指定是启用还是禁用该功能的布尔值 |
启用预览功能
预览功能在配置中指定。以下是包含多个功能的完整配置示例:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: featureconfig
spec:
tracing:
samplingRate: "1"
zipkin:
endpointAddress: "http://zipkin.default.svc.cluster.local:9411/api/v2/spans"
features:
- name: Feature1
enabled: true
- name: Feature2
enabled: true
要在本地运行 Dapr 时启用预览功能,可以更新默认配置或使用 dapr run 指定单独的配置文件。
当你运行 dapr init 时会创建默认的 Dapr 配置,位于:
- Windows:
%USERPROFILE%\.dapr\config.yaml - Linux/macOS:
~/.dapr/config.yaml
或者,你可以通过在 dapr run 中指定 --config 标志并指向单独的 Dapr 配置文件,来更新在本地运行的所有应用程序的预览功能:
dapr run --app-id myApp --config ./previewConfig.yaml ./app
在 Kubernetes 模式下,必须通过配置组件提供配置。使用与上面相同的配置,通过 kubectl 应用它:
kubectl apply -f previewConfig.yaml
然后可以通过修改应用程序的配置,通过 dapr.io/config 元素引用该特定的配置组件,从而在任何应用程序中引用此配置组件。例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp
labels:
app: node
spec:
replicas: 1
selector:
matchLabels:
app: node
template:
metadata:
labels:
app: node
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
dapr.io/config: "featureconfig"
spec:
containers:
- name: node
image: dapriosamples/hello-k8s-node:latest
ports:
- containerPort: 3000
imagePullPolicy: Always
后续步骤
配置架构11 - 操作指南:为 Dapr 边车配置来自密钥的环境变量
在特殊情况下,Dapr 边车需要向其注入环境变量。此用例可能是组件、第三方库或使用环境变量来配置所述组件或自定义其行为的模块所必需的。这对于生产环境和非生产环境都很有用。
概述
在 Dapr 1.15 中,引入了新的 dapr.io/env-from-secret 注解,类似于 dapr.io/env。
使用此注解,您可以将环境变量注入到 Dapr 边车中,其值来自密钥。
注解格式
此注解的值格式如下:
- 单键密钥:
<ENV_VAR_NAME>=<SECRET_NAME> - 多键/值密钥:
<ENV_VAR_NAME>=<SECRET_NAME>:<SECRET_KEY>
<ENV_VAR_NAME> 需要遵循 C_IDENTIFIER 格式并由 [A-Za-z_][A-Za-z0-9_]* 正则表达式捕获:
- 必须以字母或下划线开头
- 标识符的其余部分包含字母、数字或下划线
由于 secretKeyRef 的限制,需要设置 name 字段,因此必须同时设置 name 和 key。在此 Kubernetes 文档的 “env.valueFrom.secretKeyRef.name” 部分了解更多信息。
在这种情况下,Dapr 将两者设置为相同的值。
配置单键密钥环境变量
在以下示例中,dapr.io/env-from-secret 注解被添加到 Deployment 中。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp
spec:
template:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
dapr.io/env-from-secret: "AUTH_TOKEN=auth-headers-secret"
spec:
containers:
- name: node
image: dapriosamples/hello-k8s-node:latest
ports:
- containerPort: 3000
imagePullPolicy: Always
值为 "AUTH_TOKEN=auth-headers-secret" 的 dapr.io/env-from-secret 注解被注入为:
env:
- name: AUTH_TOKEN
valueFrom:
secretKeyRef:
name: auth-headers-secret
key: auth-headers-secret
这要求密钥同时具有相同值的 name 和 key 字段,即 “auth-headers-secret”。
示例密钥
**注意:**以下示例仅用于演示目的。不建议以明文形式存储密钥。
apiVersion: v1
kind: Secret
metadata:
name: auth-headers-secret
type: Opaque
stringData:
auth-headers-secret: "AUTH=mykey"
配置多键密钥环境变量
在以下示例中,dapr.io/env-from-secret 注解被添加到 Deployment 中。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp
spec:
template:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
dapr.io/env-from-secret: "AUTH_TOKEN=auth-headers-secret:auth-header-value"
spec:
containers:
- name: node
image: dapriosamples/hello-k8s-node:latest
ports:
- containerPort: 3000
imagePullPolicy: Always
值为 "AUTH_TOKEN=auth-headers-secret:auth-header-value" 的 dapr.io/env-from-secret 注解被注入为:
env:
- name: AUTH_TOKEN
valueFrom:
secretKeyRef:
name: auth-headers-secret
key: auth-header-value
示例密钥
**注意:**以下示例仅用于演示目的。不建议以明文形式存储密钥。
apiVersion: v1
kind: Secret
metadata:
name: auth-headers-secret
type: Opaque
stringData:
auth-header-value: "AUTH=mykey"
12 - 操作指南:为 Dapr 边车服务添加自定义注解
Dapr Operator 在 Kubernetes 中运行时,会自动为 Dapr 边车创建一个 Service(名称带有 -dapr 后缀)。在某些情况下,您可能需要向此服务添加自定义注解,例如以支持特定的网络策略(如 Illumio)或指标抓取配置。
概述
dapr.io/sidecar-svc-annotations 注解让您能够指定以逗号分隔的 key=value 对列表,这些键值对将被作为注解添加到 Dapr 边车服务。
使用方式
将注解添加到您的 Deployment 或 StatefulSet Pod 模板中。
格式
值应采用逗号分隔的键值对列表:
key1=value1,key2=value2
示例
以下是一个向 Dapr 边车服务添加自定义注解的 Deployment 示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-app
namespace: default
labels:
app: test-app
spec:
replicas: 1
selector:
matchLabels:
app: test-app
template:
metadata:
labels:
app: test-app
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "test-app"
dapr.io/sidecar-svc-annotations: "com.example.policy.app=test-app,com.example.policy.env=test,com.example.policy.team=platform"
spec:
containers:
- name: test-app
image: nginx:1.19.2
Dapr Operator 生成的 Service 将包含这些注解:
apiVersion: v1
kind: Service
metadata:
annotations:
com.example.policy.app: test-app
com.example.policy.env: test
com.example.policy.team: platform
dapr.io/app-id: test-app
prometheus.io/path: /
prometheus.io/port: "9090"
prometheus.io/probe: "true"
prometheus.io/scrape: "true"
labels:
dapr.io/enabled: "true"
name: test-app-dapr
namespace: default
...