|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
|
这是尚未发布的文档。 Admission Controller 1.34-dev. |
上下文感知策略
`policy-server`能够向策略暴露集群信息,以便它们可以根据其他现有资源做出决策,而不仅仅是基于准入请求提供的详细信息。
托管策略的策略服务器检索Kubernetes资源。应用于策略服务器服务账户的RBAC规则调节对Kubernetes的访问。
由SUSE Security Admission Controller Helm图表部署的`default`策略服务器可以访问以下Kubernetes资源:
-
名称空间
-
服务
-
Ingresses
|
策略服务器对从Kubernetes API服务器获取的结果进行缓存,以减少对Kubernetes这一核心部分的负载。这意味着信息可能会过时或缺失。 |
支持矩阵
| 策略类型 | 支持 | 注意 |
|---|---|---|
传统编程语言 |
✅ |
- |
Rego |
✅ |
自Admission Controller 1.9版本发布以来 |
WASI |
✅ |
自Admission Controller 1.10.0版本发布以来,仅适用于Go SDK |
约束
Admission Controller的优先事项是减少对Kubernetes API服务器的查询次数。Admission Controller考虑了两个限制:
-
内存使用:策略服务器进程在内存中缓存从Kubernetes获取的数据。获取的数据越多,策略服务器Pod消耗的内存就越多。
-
一致性:由策略服务器维护的缓存可能包含过时的数据。新的资源可能缺失,已删除的资源可能仍然可用,而已更改的资源可能包含旧数据。这可能会影响策略评估。
列出多个资源
Admission Controller 策略可以同时获取多个资源。例如,它们可以发出类似于 "获取在 default 名称空间中定义的所有 Pods,且标签 color 设置为 green 的查询。"
通过这样的查询,策略服务器获取所有符合用户标准的资源。资源获取是分批进行的,以减少对Kubernetes API服务器的负载。在将资源存储到内存之前,策略服务器会删除每个资源的 managedFields 属性,以减少内存消耗。该属性对策略没有用处,并占用大量内存。
然后,策略服务器创建一个 Kubernetes watch 来保持缓存对象列表的更新。策略服务器不控制 Kubernetes API 服务器发送资源更改通知的速度。这取决于不同的外部因素,例如针对Kubernetes API服务器创建的 watch 数量及其负载。
最后,当前代码有以下限制。考虑这两个查询:
-
kubectl get pods -n default -
kubectl get pods -n default -l color=green
策略服务器创建两个 watch,并复制第二个查询的所有 Pods。此限制将在未来的 Admission Controller 版本中移除。
ClusterAdmissionPolicies
ClusterAdmissionPolicies具有字段https://doc.crds.dev/github.com/kubewarden/kubewarden-controller/policies.kubewarden.io/ClusterAdmissionPolicy/v1#spec-contextAwareResources[spec.contextAwareResources]。 该字段提供了策略需要访问的`GroupVersionKind`资源列表。这允许策略编写者将策略所需的“权限”与策略一起交付。此外,这允许策略操作员在部署时审查策略所需的“权限”。
在本地测试上下文感知策略
除了在集群中运行策略进行端到端测试外,您还可以使用`kwctl` CLI工具在集群上运行策略和模拟请求。
为此,`kwctl run`可以首先将与集群的所有交互记录到文件中:
kwctl run \
--allow-context-aware \
-r request.json \
--record-host-capabilities-interactions replay-session.yml \
annotated-policy.wasm
这将创建以下`replay-session.yml`文件:
# replay-session.yml
---
- type: Exchange
request: |
!KubernetesGetResource
api_version: /v1
kind: Pod
name: p-testing
namespace: local
disable_cache: true
response:
type: Success
payload: '{"apiVersion":"","kind":"Pod", <snipped> }'
使用重放会话,您现在可以模拟集群交互,而无需集群,这对于CI和端到端测试是理想的:
kwctl run \
--allow-context-aware \
-r request.json \
--replay-host-capabilities-interactions replay-session.yml \
annotated-policy.wasm
语言SDK
支持集群上下文的语言SDK公开允许策略检索集群当前状态的函数。
|
如果您想了解有关SDK使用的waPC函数的更多信息,请查看Kubernetes能力参考文档。 |