How-To: 限定组件作用范围在一或多个应用

限制特定 Dapr 实例的组件访问

Dapr 组件的名称空间(注意与 Kubernetes 名称空间概念区分),这意味着 Dapr runtime 实例只能访问已部署到同一名称空间的组件。

当 Dapr 运行时,它将自己的配置名称空间与其加载的组件的命名空间进行匹配,并且仅初始化与其名称空间匹配的组件。 并且不会加载不同命名空间中的所有其他组件。

命名空间

名称空间可用于限制组件访问特定的 Dapr 实例。

在自托管模式下,开发人员可以通过设置 NAMESPACE 环境变量来指定 Dapr 实例的名称空间。 如果设置了 NAMESPACE 环境变量,Dapr 只会加载其元数据中指定相同名称空间的组件。

例如,将此组件 production 命名空间中

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: statestore
  5. namespace: production
  6. spec:
  7. type: state.redis
  8. version: v1
  9. metadata:
  10. - name: redisHost
  11. value: redis-master:6379

若要告诉 Dapr 它部署到哪个名称空间,请设置环境变量:

MacOS/Linux:

  1. export NAMESPACE=production
  2. # run Dapr as usual

Windows:

  1. setx NAMESPACE "production"
  2. # run Dapr as usual

让我们考虑在 Kubernetes 中的以下组件:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: statestore
  5. namespace: production
  6. spec:
  7. type: state.redis
  8. version: v1
  9. metadata:
  10. - name: redisHost
  11. value: redis-master:6379

在此示例中,只有运行在 production 名称空间内的 Dapr 实例才能访问 Redis 组件。

在服务调用时使用名称空间

在名称空间中使用服务调用应用程序时,您必须将其与名称空间进行限定。 例如,在 myapp 上调用 ping 方法,该方法限定范围为 production 名称空间。

  1. https://localhost:3500/v1.0/invoke/myapp.production/method/ping

或者使用外部DNS地址的curl 命令,在这种情况下 api.demo.dapr.team 就类似下面这样

MacOS/Linux:

  1. curl -i -d '{ "message": "hello" }' \
  2. -H "Content-type: application/json" \
  3. -H "dapr-api-token: ${API_TOKEN}" \
  4. https://api.demo.dapr.team/v1.0/invoke/myapp.production/method/ping

使用 pub/sub 的命名空间

Read Pub/Sub and namespaces for more information on scoping components.

对具有作用域的组件的应用程序访问

开发人员和操作员可能希望将一个数据库的访问权限限制为某个应用程序或一组特定应用程序。 为此,Dapr 允许您在组件 YAML 上指定scopes`作用域。 添加到组件的这些应用程序作用域仅限制具有特定 ID 的应用程序才能使用该组件。

下面的示例演示如何给予两个启用的Dapr应用访问权限, 使用 app1` 和 `app2` 两个应用程序可以访问名为 `statestore` 的 Redis 组件,这个组件部署在 `production` 命名空间

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: statestore
  5. namespace: production
  6. spec:
  7. type: state.redis
  8. version: v1
  9. metadata:
  10. - name: redisHost
  11. value: redis-master:6379
  12. scopes:
  13. - app1
  14. - app2

Example<iframe width="560" height="315" src="https://www.youtube.com/embed/8W-iBDNvCUM?start=1763" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" mark="crwd-mark"></iframe>

`

相关链接

`