정책 컨트롤러 제약조건 객체를 사용하면 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
로그에서 감사 결과 보기
로그 탐색기를 사용하여 정책 컨트롤러의 로그 데이터를 검색, 확인, 분석할 수 있습니다.
모든 정책 컨트롤러 로그를 가져오려면 다음 명령어를 실행합니다.
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 대신 제약조건을 사용하는 방법 알아보기