본문 바로가기
IT & Tech 정보

OPA 기반 GitOps 정책 제어 파이프라인: GitHub Actions + Argo CD + Gatekeeper 완전 통합

by 지식과 지혜의 나무 2025. 5. 28.
반응형

이번엔 DevOps 고급 자동화 주제로, 실제 MSA(Microservice Architecture) 기반 SaaS에서 사용되는 **“GitHub Actions + Argo CD + Open Policy Agent (OPA)로 구현하는 정책 기반 GitOps 배포 파이프라인”**에 대한 심화 가이드입니다. 단순한 YAML 선언을 넘어서, 실무 엔지니어가 규정 준수와 보안까지 코드화하여 배포를 통제하는 방법을 중심으로 구성하였습니다.





📌 왜 정책 기반 GitOps인가?

GitOps를 적용하면 배포는 Git에서 선언적으로 관리됩니다. 하지만 다음과 같은 문제는 여전히 존재합니다:

문제 설명
무분별한 자원 선언 신규 서비스나 Helm 차트에서 hostNetwork: true, privileged: true 등 보안 리스크 야기
비용 폭증 무심코 설정된 replicas: 100 같은 오타가 리소스 낭비로 이어짐
거버넌스 부재 실무 환경에서 팀별 배포 기준이 통제되지 않음

→ Open Policy Agent(OPA) + Gatekeeper를 도입하여, GitOps 배포 전후에 정책 검증을 삽입하고, 위반 시 배포를 자동 차단할 수 있습니다.



🧱 아키텍처 구성

┌──────────────┐     PR 생성     ┌─────────────┐     배포 요청     ┌────────────┐
│ Developer    ├───────────────▶│ GitHub Repo │ ────────────────▶ │ Argo CD    │
└──────────────┘                └─────────────┘                    │            │
                                                                    ▼            ▼
                                                              ┌────────────┐ ┌────────────┐
                                                              │ Gatekeeper │ │ Kubernetes │
                                                              └────────────┘ └────────────┘
                                                                    ▲
                                                             정책 평가 (OPA)




⚙️ 구현 단계별 가이드

1. Gatekeeper 설치

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.12/deploy/gatekeeper.yaml

2. ConstraintTemplate 작성 (예: 컨테이너 이미지 tag 제한)

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8srequiredimagetag
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredImageTag
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredimagetag
        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          not endswith(container.image, ":latest")
          msg := sprintf("이미지는 ':latest'를 사용하면 안 됩니다: %v", [container.image])
        }

3. Constraint 선언

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredImageTag
metadata:
  name: disallow-latest-tag
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

4. GitHub Actions에서 conftest 기반 사전 정책 검증

.github/workflows/policy-check.yml:

name: Policy Check
on: [pull_request]

jobs:
  opa:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install conftest
        run: |
          wget https://github.com/open-policy-agent/conftest/releases/download/v0.39.0/conftest_0.39.0_Linux_x86_64.tar.gz
          tar -xzf conftest_0.39.0_Linux_x86_64.tar.gz
          sudo mv conftest /usr/local/bin/
      - name: Run policy check
        run: conftest test k8s/deployments/

🔐 이렇게 하면 Pull Request가 Argo CD 배포 이전에 정책을 위반했는지 자동으로 검증할 수 있습니다.



📊 고급 활용 팁

상황 적용 방법
Helm 차트에 적용 conftest test <(helm template ./chart) 으로 사전 렌더링된 리소스를 검사
팀별 정책 차등 적용 Constraint의 match.labels로 네임스페이스마다 다른 정책 적용
감사 로그 수집 Gatekeeper Audit 기능으로 위반 리소스 정기 스캔
Slack 연동 정책 위반 알림을 Slack으로 전송하도록 Argo CD Notifications 연계
자동 롤백 OPA 정책 위반 시 배포 중단 → Argo CD가 자동으로 이전 Revision 복원




🧪 실제 적용 예시
• Netflix: 배포 이전 사전 시뮬레이션 및 정책 시각화에 OPA 활용
• Alibaba Cloud: 5,000개 이상 클러스터에 Gatekeeper 정책 적용
• Nubank: 모든 GitOps 워크플로에 conftest 기반 정책 테스트 병렬화



✅ 결론

이제 GitOps는 단순 배포 도구를 넘어서, **“조직의 정책·보안·규정 준수까지 코드로 통제”**하는 플랫폼으로 진화하고 있습니다.
GitHub Actions, Argo CD, Gatekeeper, OPA를 통합하면 다음과 같은 효과를 얻을 수 있습니다:
• 실시간 PR 레벨 정책 검증
• 클러스터 진입 전 정책 차단
• 정책 변경 내역도 Git으로 추적 가능
• 배포 실패 시 자동 롤백 및 알림

반응형