안녕하세요?
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
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 생성을 막는 등의 다양한 기능을 제공합니다.
'개발 > AWS EKS' 카테고리의 다른 글
[K8S] Ephemeral Container (0) | 2024.03.07 |
---|---|
[EKS] Knative volume support - PVC (0) | 2024.03.06 |
DockerHub 이미지를 Private Registry에 업로드 (0) | 2024.02.19 |
[Kubernetes] initContainer 와 containers의 volume 공유 (2) | 2024.02.07 |
Containerd와 AWS ECR login 방법 (1) | 2024.01.31 |