
GitOpsは、インフラストラクチャとアプリケーションの望ましい状態についてGitを唯一の信頼できる情報源とし、Kubernetesクラスター内の自動化されたコントローラーが実際の状態をGitに一致させるように継続的に調整する運用モデルです。
ArgoCDが普及している集中型Web UIを提供する一方で、Flux (v2) はGitOps Toolkit (GOTK) を基盤として構築されています。これは、Kubernetesカスタムリソース定義(CRD)と、クラスター内でネイティブに実行される特殊なコントローラーからなるモジュール式のセットです。Fluxは、マルチテナント環境、自動化されたイメージ更新、および最小限のリソースフットプリントにおいて優れています。
このガイドでは、Kustomizeの調整、Helmリリース、SOPSシークレット暗号化、自動化されたコンテナイメージPRなど、Flux v2を使用した本番環境レベルのGitOpsのセットアップについて説明します。
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リポジトリにコミットします。堅牢なマルチ環境リポジトリレイアウトは、基盤となるインフラストラクチャとテナントアプリケーションを明確に分離します。
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
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"
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
プレーンテキストのシークレットをGitに保存してはいけません。Fluxは、クラスターに適用する前に、SOPSで暗号化されたYAMLをネイティブに復号化します。
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
# 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
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 | ArgoCD |
|---|---|---|
| アーキテクチャ | ネイティブKubernetesコントローラー (GOTK) | アプリケーションCRD + 集中型Webサーバー |
| Web UI | 最小限 / Weave GitOps (オプション) | 豊富なインタラクティブダッシュボードを内蔵 |
| シークレット復号化 | コントローラー内でネイティブSOPS & Age / KMS | ArgoCDプラグイン / 外部オペレーターが必要 |
| マルチクラスター | クラスターごとに軽量エージェントプル | 中央プルまたはリモートクラスターへのプッシュ |
| ドリフト修正 | 継続的なバックグラウンド自己修復 | 継続的な同期または手動同期ボタン |
| イメージ自動化 | リポジトリ内自動コミットコントローラーをネイティブで提供 | ArgoCD Image Updater (別個) が必要 |
プラットフォームチームはFlux v2を使用してマルチテナントKubernetesクラスターを管理しています。APIキーのような機密性の高い設定データがGitに安全に保存され、クラスター内でのみ復号されるようにする必要があります。これらのシークレットの復号を処理する主要な責任を持つFluxコンポーネントは何ですか?また、この目的に適した標準技術は何ですか?
AI CLIログの整形、Cron式の作成、JWTの解析、chmod権限の計算をオフラインで実行。

Kubernetesにおけるフラットネットワークの境界セキュリティを排除するための実用的なガイドで、default-deny NetworkPolicies、SPIFFE/SPIREワークロードアイデンティティ、厳格なmTLSについて解説します。
続きを読む
標準的なRollingUpdatesを超えて、ArgoRollouts、Istioトラフィックルーティング、Prometheus自動分析、即時ロールバックを活用し、Blue-GreenおよびCanaryデプロイメントパターンを習得しましょう。
続きを読む
KubernetesにおけるeBPFとCiliumについて、高スループットルーティング、ネットワークポリシー、Hubble可観測性を本番環境レベルのアーキテクチャとコード例で網羅的に解説するガイド。
続きを読む