SiamCafe · Blog
Flux CD GitOps Hexagonal Architecture — จัดการ
บทความ

Flux CD GitOps Hexagonal Architecture — จัดการ

เผยแพร่ 28 พฤษภาคม 2569

Flux CD Hexagonal GitOps

Flux CD GitOps Hexagonal Architecture — จัดการ

Flux CD GitOps Hexagonal Architecture Kubernetes Git Source of Truth Kustomize Helm Multi-cluster Multi-tenancy Production

ComponentHexagonal RoleFlux ImplementationPurpose
Git RepositoryInbound PortGitRepository CRDSource of Truth
KustomizeCore LogicKustomization CRDApply Overlays Patches
HelmCore LogicHelmRelease CRDDeploy Charts
Container RegistryOutbound PortImageRepository CRDImage Source
Kubernetes APIOutbound AdapterFlux ControllersApply Resources
NotificationOutbound AdapterAlert Provider CRDSlack Teams Webhook

Flux Setup & Hexagonal Structure

# === Flux CD Bootstrap ===

# Install Flux CLI
# curl -s https://fluxcd.io/install.sh | sudo bash

# Bootstrap Flux with GitHub
# flux bootstrap github \
#   --owner=myorg \
#   --repository=fleet-infra \
#   --branch=main \
#   --path=clusters/production \
#   --personal

# Repository Structure (Hexagonal)
# fleet-infra/
# ├── clusters/           # Inbound Adapters (per cluster)
# │   ├── production/
# │   │   ├── flux-system/ (Flux components)
# │   │   └── apps.yaml   (Kustomization pointing to apps/)
# │   └── staging/
# ├── apps/               # Core Domain (Application configs)
# │   ├── base/           (shared base configs)
# │   ├── production/     (production overlays)
# │   └── staging/        (staging overlays)
# └── infrastructure/     # Outbound Adapters (infra components)
#     ├── base/           (shared: ingress, cert-manager, monitoring)
#     ├── production/
#     └── staging/

from dataclasses import dataclass

@dataclass
class HexLayer:
    layer: str
    directory: str
    contents: str
    hex_role: str

structure = [
    HexLayer("Cluster Entry",
        "clusters/{env}/",
        "Flux System + Kustomization pointers",
        "Inbound Adapter (รับ Git Changes)"),
    HexLayer("Application Core",
        "apps/base/ + apps/{env}/",
        "Deployments Services ConfigMaps Kustomize Overlays",
        "Core Domain (Business Logic)"),
    HexLayer("Infrastructure",
        "infrastructure/base/ + infrastructure/{env}/",
        "Ingress Cert-manager Monitoring Logging",
        "Outbound Adapter (Platform Services)"),
    HexLayer("Helm Releases",
        "apps/{env}/helm-releases/",
        "HelmRelease CRDs pointing to Helm Charts",
        "Port (Interface to Helm Ecosystem)"),
    HexLayer("Image Automation",
        "clusters/{env}/image-automation/",
        "ImageRepository ImagePolicy ImageUpdateAutomation",
        "Inbound Adapter (Container Registry)"),
]

print("=== Hexagonal Repository Structure ===")
for h in structure:
    print(f"  [{h.layer}] Dir: {h.directory}")
    print(f"    Contents: {h.contents}")
    print(f"    Hex Role: {h.hex_role}")

Multi-cluster Management

Flux CD GitOps Hexagonal Architecture — จัดการ
# === Multi-cluster with Flux ===

# Management Cluster controls Workload Clusters
# flux create secret git workload-cluster-01 \
#   --url=ssh://git@github.com/myorg/fleet-infra \
#   --namespace=flux-system

# Remote Cluster Kustomization
# apiVersion: kustomize.toolkit.fluxcd.io/v1
# kind: Kustomization
# metadata:
#   name: workload-cluster-01
#   namespace: flux-system
# spec:
#   kubeConfig:
#     secretRef:
#       name: workload-cluster-01-kubeconfig
#   sourceRef:
#     kind: GitRepository
#     name: fleet-infra
#   path: ./clusters/workload-01
#   interval: 5m

@dataclass
class ClusterConfig:
    cluster: str
    role: str
    flux_config: str
    apps: str

clusters = [
    ClusterConfig("Management Cluster",
        "Flux Controllers + Multi-cluster Management",
        "Bootstrap Flux + Remote Cluster Secrets",
        "Flux System Only (ไม่รัน App)"),
    ClusterConfig("Production Cluster",
        "Production Workloads",
        "Managed by Management Cluster Flux",
        "All Production Apps + Monitoring"),
    ClusterConfig("Staging Cluster",
        "Staging/QA Workloads",
        "Managed by Management Cluster Flux",
        "All Apps (Staging Config) + Test"),
    ClusterConfig("Dev Cluster",
        "Development Workloads",
        "Self-managed Flux (Developer Bootstrap)",
        "Feature Branch Apps + Experiments"),
]

print("=== Multi-cluster Setup ===")
for c in clusters:
    print(f"  [{c.cluster}] Role: {c.role}")
    print(f"    Flux: {c.flux_config}")
    print(f"    Apps: {c.apps}")

Monitoring & Promotion

# === GitOps Metrics & Promotion ===

@dataclass
class GitOpsMetric:
    metric: str
    source: str
    target: str
    alert: str

metrics = [
    GitOpsMetric("Reconciliation Success Rate",
        "flux_reconcile_condition{type='Ready', status='True'}",
        "> 99%",
        "< 95% → P1 Alert Check Flux Logs"),
    GitOpsMetric("Sync Duration",
        "flux_reconcile_duration_seconds",
        "P99 < 60 seconds",
        "> 120s → P2 Warning Check Git/Cluster"),
    GitOpsMetric("Git Commit to Deploy",
        "Custom metric: commit_time → deploy_time",
        "< 5 minutes (Staging) < 15 min (Prod)",
        "> 30 min → P2 Check Pipeline"),
    GitOpsMetric("Image Update Lag",
        "flux_image_automation_update_duration",
        "< 2 minutes after push",
        "> 5 min → P3 Check Image Automation"),
    GitOpsMetric("Drift Detection",
        "flux_reconcile_condition{type='Ready', status='False'}",
        "0 (No drift)",
        "Any drift → P1 Alert Investigate"),
]

print("=== GitOps Metrics ===")
for m in metrics:
    print(f"  [{m.metric}]")
    print(f"    Source: {m.source}")
    print(f"    Target: {m.target}")
    print(f"    Alert: {m.alert}")

เคล็ดลับ

  • Multi-repo: แยก App Repo กับ Infra Repo สำหรับทีมใหญ่
  • Kustomize: ใช้ Kustomize Overlays แยก Environment Config
  • Image Automation: เปิด Image Automation ลด Manual Update
  • SOPS: ใช้ SOPS Encrypt Secrets ใน Git Repository
  • Weave UI: ติดตั้ง Weave GitOps UI ดู Flux Status ง่าย

Flux CD คืออะไร

GitOps Toolkit Kubernetes Git Source of Truth Source Kustomize Helm Notification Image Controllers CNCF Graduated Weaveworks CLI