ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dapr 0.11.0 版本发布说明:声明式订阅、服务调用访问控制与密钥作用域实战解析

Dapr 0.11.0 版本发布说明:声明式订阅、服务调用访问控制与密钥作用域实战解析 Dapr 0.11.0 版本发布说明声明式订阅、服务调用访问控制与密钥作用域实战解析【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/daprDapr v0.11.0 是 Dapr 在 2020 年发布的一个重要里程碑版本其发布重点从功能堆叠转向了安全、稳定性与可靠性等运维关切同时进一步完善了升级流程以支撑可持续运行的生产环境。本文以 docs/release_notes/v0.11.0.md 为主线系统梳理该版本引入的声明式 pub/sub 订阅、基于 SPIFFE 身份的服务调用访问控制、密钥作用域Secrets Scoping、跨命名空间服务调用等核心能力并给出从本地到 Kubernetes 的完整升级路径与破坏性变更说明。读完本文你将掌握 v0.11.0 的全部新特性、精确的升级操作步骤以及这些特性在 Dapr 源码中的底层实现脉络。版本概述与核心亮点Dapr 的版本迭代越来越聚焦于安全、稳定性和可靠性等运维问题同时随着 Dapr 部署数量的持续增长团队进一步打磨了升级流程以支撑可持续的生产环境。用户直接反馈是版本规划的主要输入官方也期待使用者持续反馈体验中的摩擦点。v0.11.0 的核心亮点集中在以下六个方面声明式 pub/sub 主题订阅Declarative pub/sub topic subscription应用无需编写订阅代码即可通过 YAML 文件声明式地订阅主题。服务调用的访问控制策略与 SPIFFE 身份基于 SPIFFESecure Production Identity Framework for Everyone颁发的工作负载证书配合访问控制列表ACL实现精细化的服务间访问安全。应用密钥作用域Scoping for secrets通过配置限定应用可访问的密钥范围支持 allow/deny 两种策略。环境变量密钥存储新增支持将环境变量作为 secret store 使用便于开发调试同时更新了本地密钥存储的 Quickstart 示例。服务调用的跨命名空间支持允许服务跨 Kubernetes 命名空间进行发现与调用。新组件新增 RethinkDB state store面向时序数据场景、Open Policy AgentOPAHTTP 中间件、PostgreSQL 双向输出绑定Bi-directional output binding。此外从本版本开始Dapr Helm chart 仓库迁移至dapr.github.io/helm-charts就地升级集群时需要先添加新仓库具体步骤见下文升级现有集群。注意本版本包含若干破坏性变更详见本文破坏性变更一节。新特性深度解析声明式 pub/sub 主题订阅v0.11.0 引入了声明式机制来创建主题订阅declarative mechanism to create topic subscription。此前应用需要实现订阅端点如GET /dapr/subscribe并返回订阅列表属于编程式订阅声明式订阅则允许通过 Dapr 组件配置文件直接声明订阅关系将订阅逻辑从应用代码中剥离出来。从当前仓库源码结构看这一能力在 runtime 层有完整的实现链路pkg/runtime/subscriptions.go 与 pkg/runtime/compstore/subscriptions.go 负责订阅信息的存储与查询pkg/runtime/processor/subscription.go 及pkg/runtime/processor/loops/pubsub/subscription.go负责订阅处理循环最终在 pkg/runtime/runtime.go 中完成装配。从代码组织可以推断运行时会将声明式订阅与编程式订阅统一纳入订阅管理流程供 pub/sub 构建块分发消息时查询使用。声明式订阅的典型形态是在应用所在命名空间内创建一个类型为Subscription的自定义资源CRD文件其中包含pubsubname、topic、route等字段。发布说明同时强调输入参数如 state key、pubsub topic是大小写敏感的配置时需保持一致。服务调用的访问控制策略与 SPIFFE 身份本版本为 Service Invocation 增加了访问控制列表Access Control Lists并给 sentry 颁发的工作负载证书加入了基于 SPIFFE 的强身份标识使服务间调用可以基于可信身份进行授权判定。访问控制的核心配置模型可以在 pkg/config/configuration.go 中看到。ConfigurationSpec中新增了AccessControlSpecpkg/config/configuration.go其结构如下type AccessControlSpec struct { DefaultAction string json:defaultAction,omitempty yaml:defaultAction,omitempty TrustDomain string json:trustDomain,omitempty yaml:trustDomain,omitempty AppPolicies []AppPolicySpec json:policies,omitempty yaml:policies,omitempty }其中DefaultAction定义未匹配任何策略时的默认动作TrustDomain指定信任域AppPolicies按应用逐一声明策略。运行时会将该配置编译为内存中的AccessControlListpkg/config/configuration.go结构它包含DefaultAction、TrustDomain和按应用组织的PolicySpec映射type AccessControlList struct { DefaultAction string TrustDomain string PolicySpec map[string]AccessControlListPolicySpec }每个应用的策略AccessControlListPolicySpec内操作匹配使用了Trie前缀树数据结构加速查找AppOperationActions *Trie其实现位于 pkg/config/acl_trie.go并有对应的 pkg/config/acl_trie_test.go 测试保障。从源码设计看采用 Trie 是为了在高频的服务调用鉴权路径上实现快速、确定性的操作名匹配。而 SPIFFE 身份则由 sentry 服务在颁发工作负载证书时嵌入配合 mTLS 建立调用双方的可信身份链路。密钥作用域Secrets Scopingv0.11.0 为应用中使用的密钥增加了作用域限制能力防止应用访问其不应接触的密钥。配置模型同样定义在 pkg/config/configuration.gotype SecretsSpec struct { Scopes []SecretsScope json:scopes,omitempty } type SecretsScope struct { DefaultAccess string json:defaultAccess,omitempty yaml:defaultAccess,omitempty StoreName string json:storeName,omitempty yaml:storeName,omitempty AllowedSecrets []string json:allowedSecrets,omitempty yaml:allowedSecrets,omitempty DeniedSecrets []string json:deniedSecrets,omitempty yaml:deniedSecrets,omitempty }通过配置allowedSecrets允许名单与deniedSecrets拒绝名单并结合defaultAccess默认访问策略与storeName限定到具体 secret store可以实现白名单模式defaultAccess: deny 枚举allowedSecrets黑名单模式defaultAccess: allow 枚举deniedSecrets按 store 粒度隔离不同 store 可以配置各自独立的作用域。仓库的 E2E 测试配置如 tests/config/kubernetes_allowlists_config.yaml、tests/config/kubernetes_secret_config.yaml展示了这类配置在真实集群场景中的应用形态。同时文档侧也补充了明文密钥plain text secrets免责声明提醒生产环境谨慎使用明文密钥。环境变量作为密钥存储为方便开发调试v0.11.0 新增了将环境变量作为 secret store 的实现。组件注册机制可以在 pkg/components/secretstores/registry.go 中看到NewRegistry()创建注册表RegisterComponent将组件工厂按名称注册运行时按组件类型名查表实例化。使用环境变量 secret store 时组件类型声明为secretstores.local.env环境变量名即密钥名、环境变量的值即密钥值。这是典型的开发环境辅助手段发布说明明确将其定位为 development 用途与此同时本地文件密钥存储secretstores.local.file也完成了重构成为自托管模式推荐的本地密钥方案官方 Quickstart 亦改用本地 secret store 运行示例。跨命名空间服务调用v0.11.0 为服务调用增加了跨 Kubernetes 命名空间的发现与调用支持。此前服务调用默认局限于同一命名空间本版本在名称解析与服务发现逻辑中加入了命名空间维度的支持并同步更新了文档与 E2E 测试。调用跨命名空间服务时需要在目标服务名称中携带目标命名空间信息例如以namespace/service形式指定同时受上述访问控制策略与 mTLS 信任域的约束。源码层面pkg/messaging/direct_messaging.go 承担服务调用的直接消息路由而跨命名空间支持涉及名称解析组件NameResolutionSpec见 pkg/config/configuration.go与命名空间感知的寻址逻辑。新组件RethinkDB、OPA 中间件与 PostgreSQL 双向绑定RethinkDB state store面向时序数据time-series data使用场景新增适用于日志、指标等按时间序列组织的状态数据。Open Policy AgentOPAHTTP 中间件将 OPA 策略引擎接入 Dapr 的 HTTP 中间件管道开发者可以在 Dapr 侧统一执行授权策略而无需在每个业务服务中重复实现。PostgreSQL 双向输出绑定与单向输出绑定不同双向绑定在输出后还能接收来自外部系统的消息如数据库变更通知为集成外部系统提供更灵活的交互模式。各模块更新明细Dapr Runtime运行时层面的工作重心是代码质量、API 完善与稳定性修复代码重构清理冗余代码解锁操作改用defer保证释放统一使用github.com/pkg/errors替代fmt.errorf重构组件初始化处理流程与运行时启动期间的组件处理逻辑。API 增强State API 增加可选 metadata 字段Bulk Get API 增加 error 字段并修复 JSON 响应中空字段的序列化问题移除 actors 的非事务状态 API修复 gRPC State Transaction 的序列化问题详见破坏性变更。日志与可观测性增加从 app 到 sidecar 的日志详细级别提升支持为运行时加载的组件输出日志修复host removed日志每秒重复多次打印的问题修复 sidecar injector 记录 admission response 时可能包含私有信息的隐患在 Kubernetes 特定条件下。服务调用新增跨命名空间服务发现支持为服务调用 REST API 补充 Swagger 文档修复 actor 不存在时返回 200 的问题改为返回 400、actor GET 时 key 不存在仍返回 200 的问题。消息与订阅新增声明式主题订阅机制修复 gRPC 下 pub/sub 消息投递的响应处理修复发布到无 topic 的组件仍返回 200 的问题修复多 pub/sub 场景下PubSubName抽象失效的问题NATS pub/sub 实现切换为 NATS Streaming详见破坏性变更。安全新增基于 SPIFFE 强 ID 的 sentry 工作负载证书新增服务调用访问控制列表新增密钥作用域。部署与平台为控制平面 Pod 添加标签修复 dapr-operator 在 Kubernetes 中拥有 cluster-admin 权限的问题修复 Dapr 无法安装到 ARM64 集群的问题修复 dapr-placement 偶发启动失败修复 dashboard 无 Windows 镜像问题Helm chart 强制使用 Linux。测试与工程为 actor state 场景补充 E2E 测试并修复 actor E2E 偶发失败E2E 测试组件改为从 secrets 获取值修复 pub/sub E2E 偶发失败增加 actor 负载测试新增 code coverage GitHub Action为 GetState/SaveState 一致性、state 内容类型等增加决策记录decision record。Dapr CLIGo 语言版本升级至 1.15。新增 ARM64 二进制支持。修复dapr status在 HA 模式下控制平面显示不正确的问题。修复 dashboard 运行时dapr publish命令的问题修复dapr dashboard -p端口参数不生效的问题。修复日志误导未完全就绪时却显示一切正常运行。CLI 在运行无端口的应用前会等待 dapr sidecar 就绪。Helm chart 仓库从 ACR 迁移到 GitHub 仓库。新增 code coverage GitHub Action。Dashboard新增 ARM 架构支持。修复从命令行传入端口配置的问题。Components组件贡献库本地 secret store 重构基于文件的本地 secret store 完成重构并新增环境变量 secret store。MQTT更新 publish 以支持多 pub/sub 场景。RabbitMQ binding新增 QoS 支持。Redisstate store 组件新增故障转移failover特性修复Multi()事务 API 使用 HSET/HDEL 的问题。Azure Blob Storage 输出绑定新增 base64 解码选项与 get 操作修复返回的文档 URL 非实际有效 URL 的问题。CosmosDB修复ExecuteStateTransactionRequest中的 metadata 支持修复一致性取值错误。NATS Streaming修复使用 NATS logger 而非 Dapr logger 的问题。新增PostgreSQL 双向输出绑定、RethinkDB state store、OPA HTTP 中间件、pub/sub 响应类型。新增 code coverage GitHub Action。SDK 系列Java SDK支持 W3C 分布式追踪支持向 API 调用注入DAPR_API_TOKENgRPC 服务调用支持 content type metadataState API 支持 metadata新增 Bulk Get State API 与 State Transaction API 支持更新 state store 与 secrets store 示例新增 code coverage GitHub Action。.NET SDKState API 支持 metadata新增 State Transaction API 支持AddDapr支持指定默认 DaprClient 选项支持将 headers 作为 metadata 发送给 sidecar修复 MarkerService 防止 DI 重复注册失效的问题。Go SDK新增 pub/sub 示例应用与事件处理、重试逻辑客户端请求支持一致的父 trace ID支持显式 Dapr API 认证 tokenState API 支持 metadata修复 README 文档新增 code coverage GitHub Action。Python SDK新增 Bulk Get State API、State Transaction API、metadata 支持支持一次性保存多个状态新增密钥作用域示例。Rust SDKState API 支持 metadata。JavaScript SDKState API 支持 metadata。Docs文档修复 kubectl 命令指向错误 yaml 文件的问题、文档死链、命令缺少续行符等问题。新增本地 secret store 变更、跨命名空间服务调用、声明式 pub/sub、Redis 故障转移指南、密钥作用域、decodeBase64配置选项等文档。更新 actors/pub-sub/state API 参考文档、Prometheus 与 Grafana 部署文档、Helm chart 链接、NATS Streaming 部署文档移除旧 NATS 文档、Azure Blob Storage 绑定文档、服务调用与状态管理概念文档。明确输入参数state key、pubsub topic大小写敏感补充 publish 时 CloudEvents 使用说明将 KEDA v2.0-beta 队列深度自动扩缩容文档更新。升级到 Dapr 0.11.0以下升级步骤请按顺序执行以避免终端出现红色报错。本地机器 / 自托管先使用当前已安装的 CLI 卸载 Dapr。该操作会删除默认的$HOME/.dapr目录、二进制文件以及dapr_redis、dapr_placement、dapr_zipkin容器。若二进制安装在默认路径/usr/local/bin/或 docker 命令需要 sudoLinux 用户需使用sudodapr uninstall --all随后安装最新版 CLI从 CLI 发布页下载dapr二进制放入 PATH或使用官方安装脚本然后执行dapr init等待更新完成确认已使用最新版本0.11.0$ dapr --version CLI version: 0.11.0 Runtime version: 0.11.0Kubernetes从 0.10.0 升级若此前使用 Helm 安装 Dapr从本版本开始可以直接升级到新版本若使用 CLI 安装请直接跳转到下文全新安装。1. 获取最新 CLI按上文方式安装最新版 Dapr CLI 并放入 PATH。2. 升级现有集群首先添加新的 Dapr Helm 仓库详见破坏性变更并更新 Helm 仓库索引helm repo add dapr https://dapr.github.io/helm-charts/ --force-update helm repo update按顺序执行以下命令升级控制平面与数据平面删除 ClusterRoleBinding升级到 v0.11.0 必需仅本版本需要kubectl delete clusterrolebinding dapr-operator导出证书dapr mtls export -o ./certs更新 Dapr 控制平面 Pod使用上面导出的证书helm upgrade dapr dapr/dapr --version 0.11.0 --namespace dapr-system --reset-values --set-file dapr_sentry.tls.root.certPEM./certs/ca.crt --set-file dapr_sentry.tls.issuer.certPEM./certs/issuer.crt --set-file dapr_sentry.tls.issuer.keyPEM./certs/issuer.key等待所有 Pod 进入 Running 状态kubectl get pods -w -n dapr-system验证控制平面已更新且健康$ dapr status -k NAME NAMESPACE HEALTHY STATUS REPLICAS VERSION AGE CREATED dapr-dashboard dapr-system True Running 1 0.3.0 15s 2020-09-28 13:07.39 dapr-sidecar-injector dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39 dapr-sentry dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39 dapr-operator dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39 dapr-placement dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39更新数据平面sidecar对启用 Dapr 的 Deployment 执行滚动更新Pod 重启后将自动拉起新版本 sidecarkubectl rollout restart deploy/DEPLOYMENT-NAME全部完成Kubernetes全新安装如果此前是使用 Dapr CLI 安装的先卸载注意必须使用你现有的 CLI 版本dapr uninstall --kubernetes出现任何报错都可以忽略。如果此前使用Helm 2.X安装helm del --purge dapr如果此前使用Helm 3.X安装helm uninstall dapr -n dapr-system更新 Dapr 仓库索引helm repo update若你使用 Helm 将 Dapr 安装到了dapr-system之外的命名空间请相应修改上面的卸载命令。随后可按照 Helm 3 的安装指南安装 Dapr或者使用新版 CLIdapr init --kubernetes安装后验证确认控制平面 Pod 全部运行且健康$ dapr status -k NAME NAMESPACE HEALTHY STATUS REPLICAS VERSION AGE CREATED dapr-dashboard dapr-system True Running 1 0.3.0 15s 2020-09-28 13:07.39 dapr-sidecar-injector dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39 dapr-sentry dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39 dapr-operator dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39 dapr-placement dapr-system True Running 1 0.11.0 15s 2020-09-28 13:07.39安装完成后对已启用 Dapr 的 Deployment 执行滚动重启以拉起新版本 sidecarkubectl rollout restart deploy/deployment-name破坏性变更Breaking ChangesHelm chart 仓库变更Dapr Helm chart 仓库从https://daprio.azurecr.io/helm/v1/repo迁移至https://dapr.github.io/helm-charts/。运行以下命令添加新仓库helm repo add dapr https://dapr.github.io/helm-charts/ --force-update helm repo update当前仓库的 charts/dapr/Chart.yaml 与 charts/dapr/README.md 即承载该 Helm chart 的元数据与使用说明charts/dapr/values.yaml 定义了控制平面各组件sentry、operator、placement、sidecar-injector、scheduler、dashboard 等的可配置项。gRPC State Transaction API 序列化变更此前 gRPC State Transaction API 存在双重序列化问题本版本已修复。因此历史上通过 gRPC State Transaction API 保存的状态将无法被 v0.11.0 代码正确反序列化。例如之前用 gRPC State Transaction API 保存字符串时实际存储的内容是\saved state\反序列化时读到的将是saved state含引号而非saved stateJSON 序列化值同样会被再次 marshal 后保存。v0.11.0 移除了双重序列化任何依赖旧错误序列化格式的代码都需要相应调整后才能与 v0.11.0 正常工作。该问题对应 dapr/dapr 仓库的 issue #2016。NATS pub/sub 组件实现变更NATS pub/sub 组件的实现从 NATS 服务切换为NATS Streaming。使用方需要按 NATS Streaming 的方式重新配置与使用该组件。这属于 components-contrib 组件库层面的破坏性变更。本地 secret store 重命名本地 secret store 组件类型由secretstores.local.localsecretstore重命名为secretstores.local.file。若你使用过该组件需要修改配置文件中的 type 名称。该变更与本地 secret store 重构以及新增的环境变量 secret storesecretstores.local.env共同构成了 v0.11.0 密钥存储体系的重整。Java SDKW3C 追踪支持Java SDK 现在支持在 API 调用中收发 trace context。所有 API 的复杂 Request 对象均提供 builder 方法withContext(io.grpc.Context context)用于将 trace context 传给 Dapr。相应地Dapr API 的响应被包装进Response对象其中包含实际响应及其关联的 context。旧方法签名MonoVoid publishEvent(PublishEventRequest request);新方法签名MonoResponseVoid publishEvent(PublishEventRequest request);源码视角安全与密钥能力的落地v0.11.0 引入的若干安全特性在当前仓库源码中有清晰的落点可以作为理解其底层设计的入口访问控制ACLAccessControlSpec与AccessControlList定义在 pkg/config/configuration.go运行时将其编译为内存数据结构并用 pkg/config/acl_trie.go 的 Trie 实现操作名匹配测试见 pkg/config/acl_trie_test.go。从数据结构设计可以推断Trie 的选择是为了在每次服务调用鉴权时获得确定性的匹配性能。密钥作用域SecretsSpec/SecretsScopepkg/config/configuration.go支持defaultAccess、storeName、allowedSecrets、deniedSecrets四个维度分别对应白名单、黑名单与按 store 隔离三种控制粒度。密钥存储组件注册pkg/components/secretstores/registry.go中的NewRegistry与RegisterComponentpkg/components/secretstores/registry.go展示了 secret store 的按名注册与按需实例化机制环境变量 store 与本地文件 store 正是通过该机制接入运行时。声明式订阅订阅信息的汇聚与分发链路分布在 pkg/runtime/subscriptions.go、pkg/runtime/compstore/subscriptions.go 与 pkg/runtime/processor/subscription.go 中与 pub/sub 构建块的消息处理循环协同工作。结语Dapr v0.11.0 是 Dapr 从功能增长期迈向生产就绪期的关键版本声明式订阅简化了应用接入 pub/sub 的成本SPIFFE 身份与访问控制列表为服务网格化的安全模型打下基础密钥作用域与新的本地密钥方案完善了密钥治理而 Helm 仓库迁移与平滑升级路径则回应了不断增长的生产部署诉求。如果你是 Dapr 的现有用户建议参照本文升级步骤规划版本迁移并重点关注破坏性变更一节中的序列化、NATS 与 secret store 重命名三项调整。【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表