LabHub

KCA — Kyverno 인증 어소시에이트 · validate 규칙 · 실습

validate 규칙과 내장 정책 비교하기

LabHub 에서 이어서 보기

목표

Kyverno ClusterPolicy 로 라벨 필수와 태그 금지 규칙을 작성하고, 같은 검사를 쿠버네티스 내장 ValidatingAdmissionPolicy 로도 실제 클러스터에 올려 두 접근의 차이를 확인합니다.

왜 중요한가

정책 엔진을 도입할지 판단하려면 내장 기능의 사정거리를 알아야 합니다. 필드 하나를 CEL 로 검사하는 것이 전부라면 ValidatingAdmissionPolicy 로 충분하고, 그러면 운영할 컴포넌트가 하나 줄고 웹훅 인증서 갱신을 신경 쓸 일도 하나 줍니다. Kyverno 를 정당화하는 것은 generate 와 mutate, 이미지 검증처럼 내장 정책이 못 하는 일들입니다. 이 실습에서 두 매니페스트를 나란히 만들어 보면 그 경계가 어디인지 손에 남습니다. 또 하나, 규칙마다 강제 수준을 다르게 주는 연습은 실제 도입 절차의 핵심입니다.

단계

1. /root/kca-validate/ 디렉터리를 만들고 policy.yaml 에 apiVersion kyverno.io/v1, kind ClusterPolicy, metadata.name kca-require-app-label 을 쓰고 spec.rules[0].namecheck-app-label 로 하세요.
2. spec.rules[0].match.any[0].resources.kindsPodDeployment 를 넣고, 같은 곳의 namespaceskca-app 을 넣으세요.
3. spec.rules[0].validate.message 를 채우고, validate.pattern 으로 metadata.labelsapp.kubernetes.io/name 이 비어 있지 않은 값이어야 한다고 요구하세요.
4. spec.rules[0].validate.failureActionEnforce 로 두세요. 정책 수준 spec.validationFailureAction 은 쓰지 마세요.
5. 두 번째 규칙 deny-latest-tag 를 추가하세요. validate.message 를 채우고 validate.deny.conditions.all[0] 에 컨테이너 이미지를 가리키는 key, operator, value 를 넣은 뒤, 이 규칙의 validate.failureActionAudit 으로 두세요.
6. spec.rules[0].exclude.any[0].resources.namespaceskube-systemkyverno 를 넣으세요.
7. 클러스터에 ValidatingAdmissionPolicy kca-require-app-label 을 실제로 만드세요. spec.failurePolicyFail, spec.matchConstraintsapps 그룹의 deployments 를 CREATE·UPDATE 로 잡고, spec.validations[0].expressionapp.kubernetes.io/name 라벨의 존재를 검사하는 CEL 이어야 합니다.
8. 클러스터에 네임스페이스 kca-app 을 라벨 kca=enforced 와 함께 만들고, ValidatingAdmissionPolicyBinding kca-require-app-label-binding 을 실제로 만드세요. spec.policyNamekca-require-app-label, spec.validationActions 에는 Deny 를, spec.matchResources.namespaceSelector.matchLabels 에는 kca: enforced 를 넣으세요.

참고

단계 8개

  1. ClusterPolicy 골격
  2. 무엇을 고를 것인가
  3. 패턴 매칭으로 필수 라벨 요구
  4. 규칙 단위로 강제 수준 정하기
  5. deny.conditions 로 두 번째 규칙 추가
  6. 시스템 네임스페이스 제외
  7. 같은 규칙을 내장 정책으로
  8. 바인딩과 대상 네임스페이스