🔧
DevOps
Flux
Flux CD
Kubernetes용 GitOps 도구. CNCF 프로젝트.
Flux CD
Kubernetes용 GitOps 도구. CNCF 프로젝트.
Flux는 Kubernetes를 위한 GitOps 지속적 배포(CD) 도구입니다. Weaveworks에서 개발했으며 현재 CNCF 졸업 프로젝트입니다. Git 저장소의 선언적 설정을 클러스터에 자동으로 동기화하여 "원하는 상태"를 지속적으로 유지합니다.
# 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.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
# 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
`prune: true` 설정 시 Git에서 삭제된 리소스가 클러스터에서도 삭제됩니다. 실수로 파일을 삭제하면 프로덕션 리소스가 사라질 수 있으니 주의하세요.
Git에 평문 Secret을 저장하면 안 됩니다. Mozilla SOPS, Sealed Secrets, 또는 외부 시크릿 관리자(Vault)를 사용하세요.
interval이 너무 짧으면 Git 서버에 부하가 갈 수 있고, 너무 길면 배포 지연이 발생합니다. 일반적으로 1-5분이 적절합니다.
Flux 자체도 GitOps로 관리되므로 초기 부트스트랩 시 의존성 순서를 신중히 계획하세요.