政策控制器限制条件对象允许您为 Kubernetes 集群强制执行政策。为了帮助测试您的政策,您可以在限制条件中添加强制措施。然后,您可以在限制条件对象和日志中查看违规行为。
强制措施的类型
有三种强制执行操作:deny
、dryrun
和 warn
。
deny
是默认强制措施。它会自动启用,即使您未在限制条件中添加强制措施。使用 deny
可防止当存在违规行为时发生给定的集群操作。
dryrun
允许您在不主动屏蔽事务的情况下监控违反规则的情况。您可以使用它来测试限制条件是否按预期工作,然后再使用 deny
操作来实施这些限制条件。以这种方式测试限制条件可以防止由于限制条件配置不当而导致的破坏。
warn
与 dryrun
类似,但也提供关于准入时发生的违规行为的即时消息。
建议您在测试新限制条件或执行迁移操作(例如升级平台)时,将强制执行操作从 deny
切换为 warn
或 dryrun
,以便测试您的政策是否按预期运行。
添加强制措施
您可以将 enforcementAction: deny
或 enforcementAction: dryrun
添加到限制条件。
以下示例限制条件(名为 audit.yaml
)添加了 dryrun
操作。
#audit.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
name: user-must-be-3333
spec:
enforcementAction: dryrun
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
runAsUser:
rule: MustRunAs
ranges:
- min: 3333
max: 3333
创建限制条件。例如,使用 kubectl apply -f
进行应用:
kubectl apply -f audit.yaml
查看审核结果
已审核的违规行为会附加到限制条件对象,并写入到日志中。准入控制器拒绝的违规行为不会出现在日志中。
在限制条件对象中查看审核结果
如需查看给定限制条件的违规行为,请运行以下命令并查看 spec.status
字段。
kubectl get constraint-kind constraint-name -o yaml
示例
要从 audit.yaml
查看限制条件的输出,请运行以下命令:
kubectl get K8sPSPAllowedUsers user-must-be-3333 -o yaml
您看到的输出类似于以下内容:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
creationTimestamp: "2020-05-22T01:34:22Z"
generation: 1
name: user-must-be-3333
resourceVersion: "13351707"
selfLink: /apis/constraints.gatekeeper.sh/v1beta1/k8spspallowedusers/user-must-be-3333
uid: 5d0b39a8-9bcc-11ea-bb38-42010a80000c
spec:
enforcementAction: dryrun
match:
kinds:
- apiGroups:
- ""
kinds:
- Pod
parameters:
runAsUser:
ranges:
- max: 3333
min: 3333
rule: MustRunAs
status:
auditTimestamp: "2020-05-22T01:39:05Z"
byPod:
- enforced: true
id: gatekeeper-controller-manager-6b665d4c4d-lwnz5
observedGeneration: 1
totalViolations: 5
violations:
- enforcementAction: dryrun
kind: Pod
message: Container git-sync is attempting to run as disallowed user 65533
name: git-importer-86564db8cb-5r4gs
namespace: config-management-system
- enforcementAction: dryrun
kind: Pod
message: Container manager is attempting to run as disallowed user 1000
name: gatekeeper-controller-manager-6b665d4c4d-lwnz5
namespace: gatekeeper-system
- enforcementAction: dryrun
kind: Pod
message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
name: kube-proxy-gke-fishy131-default-pool-7369b17c-cckf
namespace: kube-system
- enforcementAction: dryrun
kind: Pod
message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
name: kube-proxy-gke-fishy131-default-pool-7369b17c-jnhb
namespace: kube-system
- enforcementAction: dryrun
kind: Pod
message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
name: kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8
namespace: kube-system
在日志中查看审核结果
您可以使用 Logs Explorer 来检索、查看和分析 Policy Controller 的日志数据。
如需获取所有政策控制器日志,请运行以下命令:
kubectl logs -n gatekeeper-system -l gatekeeper.sh/system=yes
审核结果在日志行中有 "process":"audit"
,因此您可以将输出传送到其他命令并按这些行进行过滤。例如,您可以使用 jq
,它能解析 JSON 文件并允许您为特定日志类型设置过滤条件。
日志记录的审核结果示例:
{
"level":"info",
"ts":1590111401.9769812,
"logger":"controller",
"msg":"Container kube-proxy is attempting to run without a required securityContext/runAsUser",
"process":"audit",
"audit_id":"2020-05-22T01:36:24Z",
"event_type":"violation_audited",
"constraint_kind":"K8sPSPAllowedUsers",
"constraint_name":"user-must-be-3333",
"constraint_namespace":"",
"constraint_action":"dryrun",
"resource_kind":"Pod",
"resource_namespace":"kube-system",
"resource_name":"kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8"
}
后续步骤
- 详细了解如何创建限制条件
- 使用限制条件模板库
- 了解如何使用限制条件代替 PodSecurityPolicies