Gatekeeper로 첫 번째 Kubernetes OPA 정책 작성

찾을 수 있는 이전 블로그 게시물에서 OPA가 중요한 이유와 오늘날 세계에서 정책 관리의 판도를 어떻게 바꾸는지에 대해 설명했습니다.

이제 해당 블로그 게시물의 이론을 알았으니 실습 방법에 대해 이야기해 보겠습니다.

이 블로그 게시물에서는 Gatekeeper 설치 및 Kubernetes 클러스터에 대한 정책 구성 방법에 대해 알아봅니다.

게이트키퍼 설치



먼저 Kubernetes 클러스터에 Gatekeeper를 설치해야 합니다. 이를 위해 Helm을 사용할 수 있습니다.

Gatekeeper 저장소를 추가하십시오.

helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts


다음으로 설치를 실행합니다.

helm install gatekeeper/gatekeeper --name-template=gatekeeper --namespace gatekeeper-system --create-namespace


아래와 비슷한 출력이 표시되어야 합니다.

NAME: gatekeeper
LAST DEPLOYED: Thu Sep  8 12:36:20 2022
NAMESPACE: gatekeeper-system
STATUS: deployed
REVISION: 1
TEST SUITE: None


구성 구현



Gatekeeper가 설치되면 구성해야 합니다. 세 가지 유형의 구성이 있습니다.
  • Gatekeeper 자체에 대한 구성
  • 템플릿
  • 제약 조건 구현

  • 구성



    구성은 Gatekeeper가 정책을 만들 수 있는 대상에 대한 정의입니다. 예를 들어 아래의 config.yaml에서 Gatekeeper는 Pod에 대한 정책만 지정할 수 있고 다른 Kubernetes 리소스는 지정할 수 없다는 것을 알고 있습니다.

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Pod"
    


    구성은 또한 정책이 Gatekeeper가 설치된 노드뿐만 아니라 클러스터 전반에 걸쳐 설정되도록 합니다.

    예를 들어 여러 작업자 노드에서 실행 중인 Pod가 있는 경우 Gatekeeper가 여러 작업자 노드에서 Pod에 액세스할 수 있도록 Config가 필요합니다.

    제약 조건 템플릿



    제약 조건 템플릿은 환경에 대해 구성하려는 규칙/정책입니다. 템플릿이므로 여러 제약 조건에서 사용할 수 있습니다.

    예를 들어, 아무도 컨테이너 이미지의 latest 태그를 사용할 수 없도록 보장하는 Rego 정책이 이 디렉터리의 제약 조건 템플릿에 있습니다.

    아래 제약 조건 템플릿을 복사하여 YAML 파일에 추가합니다. 완료되면 YAML 파일에서 실행kubectl apply -f합니다.

    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: blocklatesttag
      annotations:
        description: Blocks container images from using the latest tag
    spec:
      crd:
        spec:
          names:
            kind: blocklatesttag # this must be the same name as the name on metadata.name (line 4)
      targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package blocklatesttag
            violation[{"msg": msg, "details": {}}]{
            input.review.object.kind == "Pod"
            imagename := input.review.object.spec.containers[_].image
            endswith(imagename,"latest")
            msg := "Images with tag the tag \"latest\" is not allowed"
            }
    


    제약 조건 구성



    제약 조건 자체는 위에서 만든 템플릿을 가져와 생명을 불어넣는 것입니다. 이를 통해 템플릿을 활용하여 Kubernetes 클러스터 내부에 자체 정책을 생성할 수 있습니다.

    아래 제약 조건 템플릿을 복사하여 YAML 파일에 추가합니다. 완료되면 YAML 파일에서 실행kubectl apply -f합니다.

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: blocklatesttag
    metadata:
      name: nolatestcontainerimage
    spec:
      match:
        kinds:
          - apiGroups: [""]
            kinds: ["Pod"]
      parameters:
        annotation: "no-latest-tag-used"
    


    구성 테스트



    구현한 OPA 정책이 작동하는지 확인하려면 아래의 두 Kubernetes 매니페스트를 사용하여 테스트할 수 있습니다.
    latest 태그가 있는 매니페스트는 이전 단계에서 latest 태그를 사용할 수 없도록 정책을 만들었기 때문에 작동하지 않습니다. 배포 자체는 배포되지만 포드는 온라인 상태가 되지 않습니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginxdeployment
      replicas: 2
      template:
        metadata:
          labels:
            app: nginxdeployment
        spec:
          containers:
          - name: nginxdeployment
            image: nginx:latest
            ports:
            - containerPort: 80
    


    아래 매니페스트가 작동하고 컨테이너 이미지 버전 번호가 지정되어 있기 때문에 포드가 온라인 상태가 됩니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginxdeployment
      replicas: 2
      template:
        metadata:
          labels:
            app: nginxdeployment
        spec:
          containers:
          - name: nginxdeployment
            image: nginx:1.23.1
            ports:
            - containerPort: 80
    


    축하해요! 전체 OPA 통합을 성공적으로 설정했습니다.

    좋은 웹페이지 즐겨찾기