KCA — Kyverno 인증 어소시에이트 · 정책 운영 · 실습
승격 절차와 정책 없이 되는 것
목표
정책을 관찰에서 강제로 승격하는 절차를 매니페스트와 스크립트로 구현하고, 같은 종류의 통제를 정책 엔진 없이 PSA 라벨만으로 세워 두 접근의 경계를 확인합니다.
왜 중요한가
정책 도구를 잘 쓰는 것과 정책을 잘 운영하는 것은 다른 기술입니다. 운영에서 중요한 것은 규칙의 정교함이 아니라 "지금 이 규칙을 강제로 올려도 되는가" 를 판단하는 절차입니다. 그 판단은 리포트에서 나오고, 절차는 스크립트로 굳혀야 사람이 바뀌어도 유지됩니다. 동시에 반대편 질문도 필요합니다. 파드 보안 수준처럼 표준화된 검사는 네임스페이스 라벨 두 줄로 끝나므로, 그런 것까지 정책 엔진에 넣으면 운영할 컴포넌트만 늘어납니다. 이 실습에서 두 방식을 나란히 세워 보면 그 경계가 분명해집니다.
단계
1. /root/kca-ops/ 디렉터리를 만들고 policy-baseline.yaml 에 kind ClusterPolicy, metadata.name kca-baseline 을 쓰세요. spec.validationFailureAction 은 Audit 으로 두고 spec.validationFailureActionOverrides 에 Enforce 로 kca-prod, Audit 으로 kca-dev 를 지정하는 두 항목을 넣으세요. 규칙도 최소 하나 이상 있어야 합니다.
2. 같은 파일에 spec.webhookConfiguration.timeoutSeconds 를 20, spec.webhookConfiguration.failurePolicy 를 Ignore 로 두세요. deprecated 인 spec.webhookTimeoutSeconds 와 spec.failurePolicy 는 쓰지 마세요.
3. 같은 파일에 spec.background 를 true, spec.admission 을 true, spec.applyRules 를 All 로 두고 규칙을 두 개 이상으로 만드세요.
4. /root/kca-ops/policyexception.yaml 에 apiVersion kyverno.io/v2beta1, kind PolicyException, metadata.name kca-allow-monitoring 을 쓰세요. spec.exceptions[0].policyName 은 kca-baseline, ruleNames 에는 1단계에서 만든 규칙 이름을 넣고, spec.match.any[0].resources.namespaces 에 kca-monitoring, names 에 prometheus-* 를 넣으세요.
5. /root/kca-ops/promote.sh 를 실행 권한이 있는 셸 스크립트로 만드세요. 안에는 kyverno apply 와 --resource 를 쓰는 로컬 검증, PolicyReport 확인, 웹훅 등록이나 UpdateRequest 확인, Enforce 로 올리는 단계, 그리고 실패 시 0 이 아닌 코드로 끝내는 처리가 모두 들어가야 합니다.
6. 클러스터에 네임스페이스 kca-prod 를 만들고 라벨 pod-security.kubernetes.io/enforce=restricted 와 pod-security.kubernetes.io/enforce-version 을 붙이세요. 네임스페이스 kca-dev 는 pod-security.kubernetes.io/warn=baseline 만 붙이고 enforce 라벨은 붙이지 마세요.
7. 네임스페이스 kca-prod 에 Deployment kca-hello 를 실제로 만드세요. 파드 수준 securityContext.runAsNonRoot 는 true, securityContext.seccompProfile.type 은 RuntimeDefault, 컨테이너 수준 securityContext.allowPrivilegeEscalation 은 false, capabilities.drop 에는 ALL 이 들어가야 합니다. 그리고 네임스페이스 kca-monitoring 을 라벨 pod-security.kubernetes.io/enforce=privileged 와 함께 만드세요.
참고
kubectl label ns kca-prod pod-security.kubernetes.io/enforce=restricted pod-security.kubernetes.io/enforce-version=latest로 두 라벨을 한 번에 붙일 수 있습니다.- 스크립트 검사는
bash -n /root/kca-ops/promote.sh로 미리 해 보세요. - 흔한 실수 1: PolicyException 을 네임스페이스 전체로 넓게 여는 것. 이름 패턴까지 좁혀야 예외가 예외로 남습니다.
- 흔한 실수 2: PSA 라벨에서 버전을 고정하지 않는 것. 클러스터 업그레이드가 정책 내용을 바꿔 버립니다.
단계 7개
- 네임스페이스별 차등 적용
- webhookConfiguration 으로 이관
- background·admission·applyRules
- PolicyException 으로 정당한 예외
- 승격 체크리스트 스크립트
- PSA 라벨로 두 등급 만들기
- restricted 를 통과하는 워크로드