March 6, 2026

[Home-K8S] #22 FluxCD 계층과 분리 / 다중 클러스터 리소스 공유와 설정 분리

FluxCD - yaml

앞서 fluxcd 를 이용해서 helm chart 를 구성했습니다.
그 외에 일반적인 yaml 파일을 사용한 리소스도 fluxcd 를 이용해서 적용하기 위한 방법이 필요합니다.

yaml 도 그냥 kustomization 에 엮인 폴더에 생성하면 적용이 됩니다. 이렇게 되면 fluxcd 와 git repository 만 가지고 다른 클러스터를 만들거나 재생성을 할 때 편하게 할 수 있을거라 기대합니다.

개인적으로 무언가 남아있는 값들을 별로 안좋아해서 PC 도 정기적으로 포멧을 진행합니다. k8s 는 그런 경우가 적지만 만약 talos 대신 일반 OS 를 이용했다면 여러번 갈아 엎었을 겁니다.

FluxCD - gotk

fluxcd - v2.6.4

flux 부트스트랩을 실행하면 기본적인 폴더들이 생겨납니다.
"gotk-" 파일들은 권한과 컨트롤러 역할을 합니다.
"kustomization" 의 역할은 해당 폴더의 리소스를 적용하는 것입니다.

git-repo
└── clusters/
    └── my-cluster/
        └── flux-system/                # FluxCD 자체 설정
            ├── gotk-components.yaml    # k8s controller
            ├── gotk-sync.yaml          # k8s 의 동기화 설정
            └── kustomization.yaml      # flux-system 디렉토리용 Kustomize

my-cluster 폴더에 있는 모든 yaml 파일을 적용하므로 원하는 대로 폴더를 만들어서 사용해도 됩니다.
클러스터가 1개일 경우에는 어떻게 관리하든 아무 상관이 없지만, 클러스터가 2개 이상일 경우에는 다르게 관리해야 합니다.

공용 리소스 폴더

git-repo
├── clusters/
│   └── my-cluster/
│       ├── flux-system/
│       │   └── ...
│       └── infrastructure.yaml         # cluster infra 적용 리소스
└── infra/                              # infra 공용 폴더
    ├── longhorn/
    │   ├── kustomization.yaml          # 리소스 묶음
    │   ├── namespace.yaml              # 설정 파일
    │   ├── helmrepository.yaml
    │   └── helmrelease.yaml
    └── cert-manager/
        └── ...

longhorn 폴더 밑에는 longhorn 을 구성하는 namespace, helmrepository, helmrelease 를 작성해서 넣어 놓습니다. 기존에 사용하던 내용으로 작성하시면 됩니다.

kustomization.yaml 은 사용할 yaml 파일들을 묶어서 작성해놓으면 됩니다.

# ./infra/longhorn/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - namespace.yaml
  - helmrepository.yaml
  - helmrelease.yaml

클러스터에 적용할 kustomization 파일에서 해당 경로를 입력해주면 됩니다.

# clusters/my-cluster/infrastructure.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# kustomization 파일의 경로를 기준으로 리소스 가져오기
resources:
  - ../../infra/cilium
  - ../../infra/longhorn
  - ../../infra/cert-manager

다중 클러스터 리소스 공유

다른 클러스터를 연결하고 동일하게 사용하기 위해서는 똑같이 진행하면 됩니다.
클러스터 폴더를 연결하고 진행하면 되죠.

git-repo
├── clusters/
│   ├── my-cluster/                     # 클러스터 1
│   │   ├── flux-system/ ...
│   │   └── infrastructure.yaml
│   └── my-cluster2/                    # 클러스터 2
│       ├── flux-system/ ...
│       └── infrastructure.yaml
└── infra/                              # 공용 폴더
    └── ...

이러면 같은 구성요소 하나를 가지고 여러 클러스터에서 일관되게 사용할 수 있습니다.
각 서비스를 완벽하게 동일하게 설정하기 위해서는 위와 같이 진행하면 되지만,
보통 개발/운영 환경이 나눠져 있거나 서로 다른 설정이 필요한 경우가 많죠.

클러스터 리소스 개별 설정

공용 리소스 폴더에 설정된 값들을 변경하여서 각 클러스터에 적용할 수 있습니다.
위에서 설정한 infrastructure.yaml kustomization 파일을 수정해 줍니다.

# clusters/my-cluster/infrastructure.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# kustomization 파일의 경로를 기준으로 리소스 가져오기
resources:
  - ../../infra/cilium
  - ../../infra/longhorn
  - ../../infra/cert-manager
  
# Production 환경 값으로 패치
patches:
  - path: patches/cilium.yaml
    target:
      kind: HelmRelease
      name: cilium
  
  - path: patches/longhorn.yaml
    target:
      kind: HelmRelease
      name: longhorn
  
  - path: patches/cert-manager.yaml
    target:
      kind: HelmRelease
      name: cert-manager

여기에 설정된 path 도 해당 파일에서의 상대경로입니다.
path 를 만들고 patch 파일을 작성해 줍니다.

git-repo
├── clusters/
│   └── my-cluster/
│       ├── flux-system/ ...
│       ├── infrastructure.yaml
│       └── patches/                     # 패치 파일
│           ├── cilium.yaml
│           ├── longhorn.yaml
│           └── cert-manager.yaml
└── infra/
    └── ...

patch 파일의 경우에는 원하는 helmrelease 파일의 내용을 작성해주면 됩니다.

# clusters/my-cluster/patches/cert-manager.yaml
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: cert-manager
  namespace: cert-manager
spec:
  chart:
    spec:
      version: ">=1.14.0 <2.0.0"  # Dev는 마이너 버전 자동 업데이트
  
  values:
    # Dev 환경 설정
    replicaCount: 1  # Dev는 단일 replica
    
    installCRDs: true
    
    resources:
      requests:
        cpu: 50m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi  # Dev는 리소스 적게

다중 클러스터 관리와 자동화

여러 클러스터에서도 파일 하나로 다른 클러스터와 동일한 리소스를 쉽게 적용할 수 있습니다. 개발과 운영환경을 동일하게 맞추기도 쉽고 patch 파일만 확인해서 각 클러스터에 적용된 설정들을 비교하기 쉽습니다.

전에 작성한 헬름 업그레이드 자동화를 사용하면 Slack 에서 개발에 적용을 진행하고 테스트를 진행한 후 운영에도 자동으로 적용할 수 있게 되겠죠.

[Home-K8S] #17 n8n - FluxCD로 Helm upgrade 자동화 (w.Slack) (2) event workflow
Slack Button Event slack 에서 버튼을 조작하는 등의 이벤트를 받기 위해 n8n webhook trigger node를 생성해 줍니다. webhook url 을 복사해서 api.slack.com 의 bot -> Interactivity & Shortcuts (Features) 의 Request URL 에 붙여넣습니다. 처음에는 test url 을 사용하는 것이 편하겠죠. 이제 모든 이벤트가 이 url 로 보내지게 됩니다.

Comments