🔧 DevOps

Flux

Flux CD

Kubernetes용 GitOps 도구. CNCF 프로젝트.

상세 설명

Flux는 Kubernetes를 위한 GitOps 지속적 배포(CD) 도구입니다. Weaveworks에서 개발했으며 현재 CNCF 졸업 프로젝트입니다. Git 저장소의 선언적 설정을 클러스터에 자동으로 동기화하여 "원하는 상태"를 지속적으로 유지합니다.

핵심 특징

  • GitOps 원칙: Git을 단일 진실 공급원(Single Source of Truth)으로 사용
  • Pull 기반: 클러스터가 Git에서 변경사항을 가져와 적용 (Push 방식보다 안전)
  • 선언적 설정: YAML로 모든 배포 설정 정의
  • 자동 조정: 실제 상태가 원하는 상태와 다르면 자동 복구
  • Helm/Kustomize 통합: 기존 K8s 패키징 도구와 완벽 호환

Flux 컴포넌트

  • Source Controller: Git, Helm 저장소 모니터링
  • Kustomize Controller: Kustomization 리소스 적용
  • Helm Controller: HelmRelease 관리
  • Notification Controller: 알림 및 이벤트 처리
  • Image Automation Controller: 컨테이너 이미지 자동 업데이트

코드 예제

GitRepository - 소스 정의

# git-repository.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/myorg/my-app-config
  ref:
    branch: main
  secretRef:
    name: github-token  # 프라이빗 저장소용
---
# Secret for private repository
apiVersion: v1
kind: Secret
metadata:
  name: github-token
  namespace: flux-system
stringData:
  username: git
  password: ${GITHUB_TOKEN}

Kustomization - 배포 설정

# kustomization.yaml - Flux Kustomization 리소스
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 10m
  targetNamespace: production
  sourceRef:
    kind: GitRepository
    name: my-app
  path: ./deploy/production
  prune: true  # Git에서 삭제된 리소스 자동 정리
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: my-app
      namespace: production
  timeout: 5m
  # 변수 치환
  postBuild:
    substitute:
      CLUSTER_NAME: prod-cluster
      ENVIRONMENT: production
    substituteFrom:
      - kind: ConfigMap
        name: cluster-config
---
# 의존성 있는 배포
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: my-app-db
  namespace: flux-system
spec:
  interval: 10m
  sourceRef:
    kind: GitRepository
    name: my-app
  path: ./deploy/database
  prune: true
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: my-app-api
  namespace: flux-system
spec:
  dependsOn:
    - name: my-app-db  # DB가 먼저 배포된 후 API 배포
  interval: 10m
  sourceRef:
    kind: GitRepository
    name: my-app
  path: ./deploy/api
  prune: true

HelmRelease - Helm 차트 배포

# helm-release.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
metadata:
  name: bitnami
  namespace: flux-system
spec:
  interval: 1h
  url: https://charts.bitnami.com/bitnami
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: redis
  namespace: production
spec:
  interval: 10m
  chart:
    spec:
      chart: redis
      version: "17.x"
      sourceRef:
        kind: HelmRepository
        name: bitnami
        namespace: flux-system
  values:
    architecture: replication
    replica:
      replicaCount: 3
    auth:
      existingSecret: redis-password
  # 업그레이드/롤백 설정
  upgrade:
    remediation:
      retries: 3
  rollback:
    cleanupOnFail: true

이미지 자동 업데이트

# image-automation.yaml
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageRepository
metadata:
  name: my-app
  namespace: flux-system
spec:
  image: docker.io/myorg/my-app
  interval: 1m
---
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImagePolicy
metadata:
  name: my-app
  namespace: flux-system
spec:
  imageRepositoryRef:
    name: my-app
  policy:
    semver:
      range: ">=1.0.0"
---
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 1m
  sourceRef:
    kind: GitRepository
    name: my-app
  git:
    checkout:
      ref:
        branch: main
    commit:
      author:
        email: fluxbot@myorg.com
        name: Flux Bot
      messageTemplate: |
        Automated image update
        - {{range .Updated.Images}}{{println .}}{{end}}
    push:
      branch: main

실무 대화 예제

DevOps 엔지니어
"ArgoCD와 Flux 중에 뭘 선택해야 할지 고민이에요. 둘 다 GitOps 도구라서..."
시니어 엔지니어
"ArgoCD는 UI가 강력해서 배포 상태를 시각적으로 보기 좋고, Flux는 더 가볍고 CLI 중심이에요. 멀티 클러스터 환경에서 Hub-Spoke 패턴을 쓸 거면 Flux의 Kustomization 의존성 관리가 편해요."
DevOps 엔지니어
"저희 팀은 Helm 차트를 많이 쓰는데, Flux에서도 Helm 지원이 잘 되나요?"
시니어 엔지니어
"네, HelmRelease CRD로 Helm 배포를 선언적으로 관리할 수 있어요. values.yaml을 Git에 저장하고 변경하면 자동으로 업그레이드되죠. 롤백도 spec에서 설정하면 자동이고요."

주의사항

Prune 옵션 주의

`prune: true` 설정 시 Git에서 삭제된 리소스가 클러스터에서도 삭제됩니다. 실수로 파일을 삭제하면 프로덕션 리소스가 사라질 수 있으니 주의하세요.

Secret 관리

Git에 평문 Secret을 저장하면 안 됩니다. Mozilla SOPS, Sealed Secrets, 또는 외부 시크릿 관리자(Vault)를 사용하세요.

동기화 간격

interval이 너무 짧으면 Git 서버에 부하가 갈 수 있고, 너무 길면 배포 지연이 발생합니다. 일반적으로 1-5분이 적절합니다.

Bootstrap 순서

Flux 자체도 GitOps로 관리되므로 초기 부트스트랩 시 의존성 순서를 신중히 계획하세요.

더 배우기