다양한 디지털 전환에 따라 수많은 서비스들이 만들어지고 MSA를 기반으로 작성되면서 수많은 모듈들이 만들어지고 이들에 대한 정책을 정의하고 적용하는 일은 지속적으로 복잡해지고 있다. 이에따라 분산되고 복잡하며 이기종(heterogeneous) 시스템에 적용되는 정책들을 관리해야 하는 어려운 문제가 생겼고, 이를 해결하면서 일관된 정책관리를 가능하게 하는 PaC(Policy as Code)라는 기술이 주목받고 있으며 그에 대한 가장 유력한 오픈소스로 OPA(Open Policy Agent)가 있다. (OPA소개를 참고하자.)
Kubernetes환경에서는 조작을 위한 접점으로 api서버를 제공하고 있으며 이에 대한 접근제어 매커니즘을 제공하고 있다.( kubernetes 접근제어방법을 참조하자) . 여러 단계 중 admission controller를 활용하면 다양한 제어가 가능하다. 링크에서 설명했던 것처럼 이를 위해서 로직을 수행할 웹서버를 만들고 이를 클러스터에 웹훅으로 등록하는 과정을 거쳐야한다. 여기서 로직을 수행할 웹서버 부분에 OPA 서버로 대치하면 OPA에서 제공하는 PaC 기능을 사용할 수 있게 된다.
OPA 서버를 통해 admission controller 기능을 사용하는 경우, 각 정책들은 rego로 작성되어 OPA 서버 내부에서 관리되고 정책의 관리는 kubernetes와 별도로 이뤄진다. 다양한 시스템에 대한 접근제어를 사용하는 경우에 바람직한 접근법이지만 단순하게 kubernetes만을 대상으로 한다면 관리포인트가 분리되는 불편함이 있다. kubernetes기반 배포본인 TACO를 개발하는 팀의 입장에서도 이러한 문제를 인지하게 되었고 kubernetes 진영에서도 당연히 그러했다. 이런 불편함을 해소하고자 나온 프로젝트가 gatekeeper이다. gatekeeper는 정책을 kubernetes의 사용자 정의 자원으로 정의하고 활용함으로 정책의 관리를 kubernetes 내부로 가져왔다. 이전에는 opa 진영에서 kubernetes를 지원하기 위한 kube-mgmt를 비롯한 독자적 모듈을 만들었으나 현재는 공식 문서에서도 kubernetes에서는 gatekeeper를 사용하는 방법을 안내하고 있다. 본 페이지에서는 gatekeeper에 대해 알아보고 간단하게 사용하는 방법까지 정리하도록 하겠다
앞에서 언급한 것처럼 gatekeeper는 opa와 kubernetes가 통합되도록 하는 프로젝트로 공식 문서는 https://open-policy-agent.github.io/gatekeeper/website/docs/ 에서 확인할 수 있다. 현재는 감사기능(validating)을 중심으로 완성되어 있으며 변경기능(Mutating)도 추가되었다.(https://medium.com/@LachlanEvenson/mutating-kubernetes-resources-with-gatekeeper-3e5585d49ead)
단순하게 정적으로 정의된 규칙뿐 아니라 위 그림에서 표현된 것처럼 클러스터 내부 자원들의 상황을 조합하여 결정하도록 규칙을 정의할 수 있으며 적용내역도 주기적으로 감사(audit)한다.
Gatekeeper에서 정책은 제약조건(constraint)들로 만들어진다. 이 제약조건을 만들기 위해 우선 동작방식을 규정하는 템플릿을 만들고 여기에 상세 조건을 추가하여 제약조건을 만드는 과정을 통해 정책을 정의할 수 있다. 이와 관련된 Constratin Template 사용자 정의자원(CRD)과 여기에서 정의되는 Constraint가 있고 이를 기반으로kubernetes는 요청에 대해 admission 처리한다.
제약조건을 만들 수 있는 기본 틀로 다음을 포함한다.
Constraint Template을 통해 CRD가 정의되어 추가되는데 이들을 통칭하여 제약조건(constraint)라 한다. 이는 템플릿에 구체적인 값을 지정하여 만드는 사용자개체(Custom Resource)로 템플릿 당 다수의 제약조건을 만들수 있다. 상세한 내역은 아래 네임스페이스 지정 예젱에서 살펴보자.
kubernetes의 배포를 위해 가장 많이 사용하는 helm을 사용하여 설치해보자.
https://open-policy-agent.github.io/gatekeeper/charts