본문 바로가기
개발/AWS EKS

[EKS] Gatekeeper

by 무아몽중 2024. 4. 15.
728x90

안녕하세요?

 

K8S에서 Cluster를 관리 혹은 사용하다 보면, 코드 변경 없이 third party 소프트웨어의 K8S 리소스 값을 변경해야 하거나 일괄로 설정을 적용해야 할 때가 있습니다. Gatekeeper 를 사용하면 이와 같은 상황을 쉽게 해결 할 수 있습니다. 

 

Gatekeeper?

Gatekeeper는 K8S는 OPA(OpenPolicyAgent)에서 만든 프로젝트로서 K8S의 자원에 대해서 Policy 설정을 할 수가 있습니다.

 

Helm 설치

설치 방법은 변경될 수 있기 때문에, 공식 Github을 참조하시는 것이 좋습니다. 

https://github.com/open-policy-agent/gatekeeper/blob/master/charts/gatekeeper/README.md

 

gatekeeper/charts/gatekeeper/README.md at master · open-policy-agent/gatekeeper

🐊 Gatekeeper - Policy Controller for Kubernetes. Contribute to open-policy-agent/gatekeeper development by creating an account on GitHub.

github.com

 

Namespace 별 NodeSelector 강제 설정

Gatekeeper에서 제공해주는 Assign CRD를 사용하면, 아래 처럼 Namespace 별 NodeSelector를 강제로 지정할 수 있습니다. 아래는 NodeSelector 값을 강제로 지정하지만 이외에도 AntiAffinity 등의 값도 모두 설정이 가능합니다. 

apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: Assign
metadata:
  name: mutator-add-node-selector-calico
  namespace: gatekeeper-system
spec:
  applyTo:
  - groups: ["apps"]
    kinds: ["Deployment"]
    versions: ["v1"]
  match:
    namespaces:
    - "tigera-operator"
    - "calico-system"
    - "calico-apiserver"
  location: "spec.template.spec.nodeSelector"
  parameters:
    assign:
      value:
        test/node-group: group1

 

참고로, K8S에서는 아래처럼 Namespace에 annotation을 설정해서 강제로 NodeSelector를 지정할 수 있지만 EKS에서는 아래 annotation이 지원되지 않기 때문에, Gatekeeper를 사용하면 이부분을 해결 할 수 있습니다.

 

apiVersion: v1
kind: Namespace
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/node-selector: test/node-group=group1
  name: calico-system

 

이외에도 Gatekeeper metadata를 강제로 할당하거나, 특정 label 등이 포함되어 있지 않으면 POD 생성을 막는 등의 다양한 기능을 제공합니다.