KCA — Kyverno Certified Associate
The Promotion Procedure, and What Works Without Policy
한국어 원문으로 표시합니다.
목표
정책을 관찰에서 강제로 승격하는 절차를 매니페스트와 스크립트로 구현하고, 같은 종류의 통제를 정책 엔진 없이 PSA 라벨만으로 세워 두 접근의 경계를 확인합니다.
왜 중요한가
정책 도구를 잘 쓰는 것과 정책을 잘 운영하는 것은 다른 기술입니다. 운영에서 중요한 것은 규칙의 정교함이 아니라 "지금 이 규칙을 강제로 올려도 되는가" 를 판단하는 절차입니다. 그 판단은 리포트에서 나오고, 절차는 스크립트로 굳혀야 사람이 바뀌어도 유지됩니다. 동시에 반대편 질문도 필요합니다. 파드 보안 수준처럼 표준화된 검사는 네임스페이스 라벨 두 줄로 끝나므로, 그런 것까지 정책 엔진에 넣으면 운영할 컴포넌트만 늘어납니다. 이 실습에서 두 방식을 나란히 세워 보면 그 경계가 분명해집니다.
단계
/root/kca-ops/디렉터리를 만들고policy-baseline.yaml에 kindClusterPolicy,metadata.namekca-baseline을 쓰세요.spec.validationFailureAction은Audit으로 두고spec.validationFailureActionOverrides에Enforce로kca-prod,Audit으로kca-dev를 지정하는 두 항목을 넣으세요. 규칙도 최소 하나 이상 있어야 합니다.- 같은 파일에
spec.webhookConfiguration.timeoutSeconds를20,spec.webhookConfiguration.failurePolicy를Ignore로 두세요. deprecated 인spec.webhookTimeoutSeconds와spec.failurePolicy는 쓰지 마세요. - 같은 파일에
spec.background를true,spec.admission을true,spec.applyRules를All로 두고 규칙을 두 개 이상으로 만드세요. /root/kca-ops/policyexception.yaml에 apiVersionkyverno.io/v2beta1, kindPolicyException,metadata.namekca-allow-monitoring을 쓰세요.spec.exceptions[0].policyName은kca-baseline,ruleNames에는 1단계에서 만든 규칙 이름을 넣고,spec.match.any[0].resources.namespaces에kca-monitoring,names에prometheus-*를 넣으세요./root/kca-ops/promote.sh를 실행 권한이 있는 셸 스크립트로 만드세요. 안에는kyverno apply와--resource를 쓰는 로컬 검증, PolicyReport 확인, 웹훅 등록이나 UpdateRequest 확인,Enforce로 올리는 단계, 그리고 실패 시 0 이 아닌 코드로 끝내는 처리가 모두 들어가야 합니다.- 클러스터에 네임스페이스
kca-prod를 만들고 라벨pod-security.kubernetes.io/enforce=restricted와pod-security.kubernetes.io/enforce-version을 붙이세요. 네임스페이스kca-dev는pod-security.kubernetes.io/warn=baseline만 붙이고 enforce 라벨은 붙이지 마세요. - 네임스페이스
kca-prod에 Deploymentkca-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 라벨에서 버전을 고정하지 않는 것. 클러스터 업그레이드가 정책 내용을 바꿔 버립니다.
네임스페이스별 차등 적용
/root/kca-ops/ 디렉터리를 만들고 policy-baseline.yaml 에 kind ClusterPolicy, metadata.name kca-baseline 을 쓰세요. spec.validationFailureAction 은 Audit 으로 두고 spec.validationFailureActionOverrides 에 Enforce 로 kca-prod, Audit 으로 kca-dev 를 지정하는 두 항목을 넣으세요. 규칙도 최소 하나 이상 있어야 합니다.
정책 전체의 기본은 관찰 모드로 두고, 오버라이드 배열에서 네임스페이스별로 다른 동작을 지정합니다. action 과 namespaces 두 필드가 한 항목을 이룹니다.
webhookConfiguration 으로 이관
같은 파일에 spec.webhookConfiguration.timeoutSeconds 를 20, spec.webhookConfiguration.failurePolicy 를 Ignore 로 두세요. deprecated 인 spec.webhookTimeoutSeconds 와 spec.failurePolicy 는 쓰지 마세요.
타임아웃과 실패 정책은 1.13부터 한 블록 아래로 옮겨갔습니다. 예전 위치의 필드는 남겨 두면 안 되고, 관찰 단계 정책이 클러스터를 멈추지 않게 하려면 실패 정책을 어느 쪽으로 둘지 생각해 보세요.
background·admission·applyRules
같은 파일에 spec.background 를 true, spec.admission 을 true, spec.applyRules 를 All 로 두고 규칙을 두 개 이상으로 만드세요.
세 플래그는 각각 기존 리소스 스캔, 어드미션 적용, 규칙 적용 개수를 정합니다. 규칙을 여러 개 나열했는데 뒤쪽이 안 도는 문제를 만드는 것이 마지막 필드입니다.
PolicyException 으로 정당한 예외
/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-* 를 넣으세요.
예외는 정책 이름과 규칙 이름을 함께 지목합니다. 네임스페이스만 적어 통째로 빼는 대신 이름 패턴까지 좁히세요.
승격 체크리스트 스크립트
/root/kca-ops/promote.sh 를 실행 권한이 있는 셸 스크립트로 만드세요. 안에는 kyverno apply 와 --resource 를 쓰는 로컬 검증, PolicyReport 확인, 웹훅 등록이나 UpdateRequest 확인, Enforce 로 올리는 단계, 그리고 실패 시 0 이 아닌 코드로 끝내는 처리가 모두 들어가야 합니다.
로컬 검증, 리포트 확인, 진단, 그리고 실패 시 0 이 아닌 종료가 모두 들어가야 CI 게이트로 쓸 수 있습니다. 실행 권한도 잊지 마세요.
PSA 라벨로 두 등급 만들기
클러스터에 네임스페이스 kca-prod 를 만들고 라벨 pod-security.kubernetes.io/enforce=restricted 와 pod-security.kubernetes.io/enforce-version 을 붙이세요. 네임스페이스 kca-dev 는 pod-security.kubernetes.io/warn=baseline 만 붙이고 enforce 라벨은 붙이지 마세요.
여기서부터 실제 클러스터입니다. Pod Security Admission 은 네임스페이스 라벨로 동작하고 모드가 enforce·audit·warn 세 가지입니다. 버전 라벨을 함께 고정하는 이유도 생각해 보세요.
restricted 를 통과하는 워크로드
네임스페이스 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 와 함께 만드세요.
restricted 등급은 네 가지를 요구합니다. 루트가 아닌 실행, 권한 상승 금지, 모든 케이퍼빌리티 제거, 그리고 seccomp 프로파일입니다. 예외 대상이 될 네임스페이스도 함께 만드세요.