•7 min read

FluxによるGitOps:Kubernetesのための宣言的インフラストラクチャとCD

FluxによるGitOps:Kubernetesのための宣言的インフラストラクチャとCD

GitOpsは、インフラストラクチャとアプリケーションの望ましい状態についてGitを唯一の信頼できる情報源とし、Kubernetesクラスター内の自動化されたコントローラーが実際の状態をGitに一致させるように継続的に調整する運用モデルです。

ArgoCDが普及している集中型Web UIを提供する一方で、Flux (v2) はGitOps Toolkit (GOTK) を基盤として構築されています。これは、Kubernetesカスタムリソース定義(CRD)と、クラスター内でネイティブに実行される特殊なコントローラーからなるモジュール式のセットです。Fluxは、マルチテナント環境、自動化されたイメージ更新、および最小限のリソースフットプリントにおいて優れています。

このガイドでは、Kustomizeの調整、Helmリリース、SOPSシークレット暗号化、自動化されたコンテナイメージPRなど、Flux v2を使用した本番環境レベルのGitOpsのセットアップについて説明します。


Audio Briefing
0:00 / 0:00

1. Fluxアーキテクチャ: GitOps Toolkit

Fluxは、GitOpsを専用の単一責任コントローラーに分解します。

                  Git Repository (GitHub / GitLab)
                                │
                                ▼ (Pulls Git commit / tag / branch)
                     [ source-controller ]
                                │
         ┌──────────────────────┴──────────────────────┐
         ▼ (Raw manifests & Kustomize)                 ▼ (Helm Charts)
[ kustomize-controller ]                      [ helm-controller ]
         │                                             │
         ▼ (Applies with Prune & Health Checks)        ▼ (Executes Helm engine)
   Kubernetes API                                Kubernetes API
         ▲                                             ▲
         └──────────────────────┬──────────────────────┘
                                │ (Watches OCI Registry & commits new tags to Git)
                 [ image-automation-controller ]
  • source-controller: Gitリポジトリ、Helmチャート、OCIアーティファクト、S3バケットをクラスターストレージにフェッチします。
  • kustomize-controller: Kustomizeオーバーレイを実行し、SOPSシークレットを復号化し、マニフェストをAPIサーバーに適用し、削除されたリソースを自動的にプルーニングします。
  • helm-controller: Helmチャートリリースのライフサイクルを宣言的に管理します。
  • notification-controller: Slack、Discord、またはWebhookにイベントを送信し、Git/OCIレジストリから受信Webhookを受け取って即時調整をトリガーします。
  • image-automation-controller: Dockerレジストリ内の新しいコンテナタグを検出し、更新されたイメージタグを自動的にGitリポジトリにコミットします。

Advertisement

2. 本番環境向けモノレポリポジトリ構造

堅牢なマルチ環境リポジトリレイアウトは、基盤となるインフラストラクチャとテナントアプリケーションを明確に分離します。

fleet-infra/
├── clusters/
│   ├── staging/
│   │   ├── flux-system/        # Bootstrap manifests
│   │   ├── infrastructure.yaml # Reconciles /infrastructure/staging
│   │   └── apps.yaml           # Reconciles /apps/staging
│   └── production/
│       ├── flux-system/
│       ├── infrastructure.yaml
│       └── apps.yaml
├── infrastructure/
│   ├── base/
│   │   ├── ingress-nginx/
│   │   └── cert-manager/
│   └── staging/
│       └── kustomization.yaml
└── apps/
    ├── base/
    │   └── payments-api/
    └── staging/
        ├── kustomization.yaml
        └── patch-replicas.yaml

3. コアマニフェスト: GitRepository & Kustomization

ソースの定義: GitRepository

# clusters/staging/fleet-source.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: fleet-infra
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/my-org/fleet-infra.git
  ref:
    branch: main
  secretRef:
    name: github-deploy-token
  ignore: |
    # Exclude non-manifest directories from checksums
    /*
    !/apps
    !/infrastructure

ヘルスチェックとプルーニングによる調整: Kustomization

# clusters/staging/apps.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: staging-apps
  namespace: flux-system
spec:
  interval: 5m
  path: ./apps/staging
  prune: true               # Automatically deletes removed k8s resources
  wait: true                # Blocks until all Pods pass readiness probes
  timeout: 3m
  sourceRef:
    kind: GitRepository
    name: fleet-infra
  dependsOn:
    - name: staging-infrastructure  # Ensures ingress/CRDs exist before apps deploy
  postBuild:
    substitute:
      ENVIRONMENT: "staging"
      CLUSTER_DOMAIN: "stage.internal.net"

4. ドリフト検出によるHelmリリースの管理

Fluxは、ローカルにHelm CLIをインストールすることなく、Helmチャートをネイティブに管理します。

# infrastructure/base/ingress-nginx/helm-release.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: ingress-nginx
  namespace: flux-system
spec:
  interval: 2h
  url: https://kubernetes.github.io/ingress-nginx
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  interval: 15m
  chart:
    spec:
      chart: ingress-nginx
      version: "4.11.x"
      sourceRef:
        kind: HelmRepository
        name: ingress-nginx
        namespace: flux-system
  install:
    remediation:
      retries: 3
  upgrade:
    remediation:
      retries: 3
  driftDetection:
    mode: enabled          # Automatically reverts manual edits back to chart values
  values:
    controller:
      replicaCount: 3
      resources:
        requests:
          cpu: 100m
          memory: 128Mi

Advertisement

5. シークレット管理: SOPSとAgeによるGit内暗号化

プレーンテキストのシークレットをGitに保存してはいけません。Fluxは、クラスターに適用する前に、SOPSで暗号化されたYAMLをネイティブに復号化します。

ステップ1: ageでシークレットを暗号化する

# Generate age private key for the cluster
age-keygen -o age.agekey

# Create in-cluster secret with the private key
kubectl create secret generic sops-age \
  --namespace=flux-system \
  --from-file=age.agekey

# Encrypt local Kubernetes secret
sops --encrypt --age $(cat age.agekey | grep public | cut -d: -f2 | xargs) \
  --encrypted-regex '^(data|stringData)$' \
  secret.yaml > apps/staging/secret.enc.yaml

ステップ2: 実行時に復号化するようにFluxを設定する

# In apps/staging/kustomization.yaml or root Kustomization CRD
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: staging-secrets
  namespace: flux-system
spec:
  interval: 10m
  path: ./apps/staging
  prune: true
  sourceRef:
    kind: GitRepository
    name: fleet-infra
  decryption:
    provider: sops
    secretRef:
      name: sops-age        # Matches private key stored in flux-system

6. 自動イメージ更新 (継続的デプロイ)

Fluxはコンテナレジストリを監視し、新しいイメージタグを直接Gitに自動コミットできます。

# apps/base/payments-api/image-policy.yaml
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
  name: payments-api
  namespace: flux-system
spec:
  image: ghcr.io/my-org/payments-api
  interval: 1m
---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
  name: payments-api
  namespace: flux-system
spec:
  imageRepositoryRef:
    name: payments-api
  policy:
    semver:
      range: '^1.x'        # Auto-promotes minor and patch versions
---
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 1m
  sourceRef:
    kind: GitRepository
    name: fleet-infra
  git:
    checkout:
      ref:
        branch: main
    commit:
      author:
        email: fluxcdbot@users.noreply.github.com
        name: fluxcdbot
      messageTemplate: 'chore(cd): update payments-api to {{range .Updated.Images}}{{println .}}{{end}}'
    push:
      branch: main
  update:
    path: ./apps/staging
    strategy: Setters

デプロイYAMLにコメントセッターを追加します。

spec:
  template:
    spec:
      containers:
        - name: api
          image: ghcr.io/my-org/payments-api:1.4.2 # {"$imagepolicy": "flux-system:payments-api"}

CIがghcr.io/my-org/payments-api:1.4.3をプッシュすると、Fluxはタグを検出し、Git内のこの行を正確に更新し、chore(cd)...でコミットし、mainにプッシュし、ステージング環境で新しいPodを調整します。


Flux v2 vs ArgoCD: 本番環境でのトレードオフ

機能Flux v2ArgoCD
アーキテクチャネイティブKubernetesコントローラー (GOTK)アプリケーションCRD + 集中型Webサーバー
Web UI最小限 / Weave GitOps (オプション)豊富なインタラクティブダッシュボードを内蔵
シークレット復号化コントローラー内でネイティブSOPS & Age / KMSArgoCDプラグイン / 外部オペレーターが必要
マルチクラスタークラスターごとに軽量エージェントプル中央プルまたはリモートクラスターへのプッシュ
ドリフト修正継続的なバックグラウンド自己修復継続的な同期または手動同期ボタン
イメージ自動化リポジトリ内自動コミットコントローラーをネイティブで提供ArgoCD Image Updater (別個) が必要

こちらもおすすめ

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement
Kubernetes OperatorsとCustom Resources: あらゆるものを自動化する
kubernetes

Kubernetes OperatorsとCustom Resources: あらゆるものを自動化する

KubernetesのコントロールプレーンをOperatorとCustom Resource Definition (CRD) で拡張し、複雑なステートフルアプリケーションのライフサイクル管理を自動化する方法を学び、reconciliationループ、RBAC、テスト、本番環境パターンについて解説します。

Read more