multi-cloud no mcp
This commit is contained in:
@@ -12,11 +12,11 @@
|
||||
|
||||
## Overview
|
||||
|
||||
This Kubernetes cluster uses a **GitOps approach** powered by **ArgoCD**, where Git repositories serve as the single source of truth for both infrastructure and application deployments. The cluster is running on **UpCloud Managed Kubernetes** but is designed to be cloud-agnostic.
|
||||
This Kubernetes cluster uses a **GitOps approach** powered by **ArgoCD**, where Git repositories serve as the single source of truth for both infrastructure and application deployments. The cluster setup is **cloud-agnostic**, with ready-to-use configurations for **UpCloud**, **AWS EKS**, **Azure AKS**, and **GCP GKE**.
|
||||
|
||||
### Key Characteristics
|
||||
- **Environment**: Production (internal use only)
|
||||
- **Cluster Type**: Multi-cluster (upc-dev, upc-prod) via Kustomize overlays
|
||||
- **Cluster Type**: Multi-cloud, multi-cluster via Kustomize overlays (UpCloud, AWS, Azure, GCP)
|
||||
- **GitOps Tool**: ArgoCD
|
||||
- **Deployment Pattern**: App-of-Apps
|
||||
- **Secret Management**: Sealed Secrets (kubeseal)
|
||||
@@ -63,7 +63,7 @@ This Kubernetes cluster uses a **GitOps approach** powered by **ArgoCD**, where
|
||||
▼
|
||||
┌────────────────────────────────┐
|
||||
│ Kubernetes Clusters │
|
||||
│ (UpCloud: upc-dev, upc-prod) │
|
||||
│ (UpCloud, AWS, Azure, GCP) │
|
||||
│ │
|
||||
│ ┌──────────────────────────┐ │
|
||||
│ │ ArgoCD │ │
|
||||
@@ -131,26 +131,22 @@ launchpad/
|
||||
│ │ ├── renovate.yaml
|
||||
│ │ ├── ... # All other Application manifests
|
||||
│ │ └── secrets.yaml
|
||||
│ ├── overlays/ # Per-cluster overrides
|
||||
│ ├── overlays/ # Per-cluster Kustomize overrides
|
||||
│ │ ├── upc-dev/ # UpCloud Dev (uses base as-is)
|
||||
│ │ └── upc-prod/ # UpCloud Prod (patches value paths)
|
||||
│ │ ├── upc-prod/ # UpCloud Prod (patches value paths)
|
||||
│ │ ├── aws-dev/ # AWS EKS Dev
|
||||
│ │ ├── aws-prod/ # AWS EKS Prod
|
||||
│ │ ├── azure-dev/ # Azure AKS Dev
|
||||
│ │ ├── azure-prod/ # Azure AKS Prod
|
||||
│ │ ├── gcp-dev/ # GCP GKE Dev
|
||||
│ │ └── gcp-prod/ # GCP GKE Prod
|
||||
│ ├── dashboards/ # Grafana dashboard ConfigMaps
|
||||
│ └── values/ # Helm value overrides for infra
|
||||
│ ├── base/ # Shared values (all clusters)
|
||||
│ │ ├── traefik-values.yaml
|
||||
│ │ ├── keycloak-values.yaml
|
||||
│ │ ├── grafana-values.yaml
|
||||
│ │ ├── prometheus-values.yaml
|
||||
│ │ ├── gitea-values.yaml
|
||||
│ │ └── ...
|
||||
│ ├── upc-dev/ # upc-dev cluster-specific values
|
||||
│ │ ├── traefik-values.yaml
|
||||
│ │ ├── keycloak-values.yaml
|
||||
│ │ └── grafana-values.yaml
|
||||
│ └── upc-prod/ # upc-prod cluster-specific values
|
||||
│ ├── traefik-values.yaml
|
||||
│ ├── keycloak-values.yaml
|
||||
│ └── grafana-values.yaml
|
||||
│ ├── base/ # Cloud-agnostic shared values
|
||||
│ ├── upc-{dev,prod}/ # UpCloud: storage class, LB, pricing
|
||||
│ ├── aws-{dev,prod}/ # AWS: gp3, NLB, CUR pricing
|
||||
│ ├── azure-{dev,prod}/ # Azure: managed-csi-premium, Standard LB
|
||||
│ └── gcp-{dev,prod}/ # GCP: premium-rwo, L4 LB
|
||||
│
|
||||
├── apps/ # Business Application ArgoCD manifests (Kustomize)
|
||||
│ ├── base/ # Base app manifests
|
||||
@@ -287,7 +283,7 @@ app-repository/
|
||||
### The App-of-Apps Pattern
|
||||
|
||||
```
|
||||
_app-of-apps-{upc-dev,upc-prod}.yaml (Root, per cluster)
|
||||
_app-of-apps-{cluster}.yaml (Root, per cluster — e.g. upc-dev, aws-prod, gcp-dev)
|
||||
│
|
||||
├── infrastructure-apps (manages infra/)
|
||||
│ ├── cluster-resources-application
|
||||
@@ -377,6 +373,15 @@ patches:
|
||||
value: $values/infra/values/upc-prod/traefik-values.yaml
|
||||
```
|
||||
|
||||
Cloud-specific values (storage classes, load balancer annotations, cost model) are isolated in per-cluster value files. Base values are fully cloud-agnostic:
|
||||
|
||||
| Cloud | Storage Class | Load Balancer | OpenCost Provider |
|
||||
|-------|--------------|---------------|-------------------|
|
||||
| **UpCloud** | `upcloud-block-storage-maxiops` | UpCloud LB (ProxyProtocol v2) | Custom pricing |
|
||||
| **AWS EKS** | `gp3` (EBS CSI) | NLB (ProxyProtocol v2) | AWS CUR |
|
||||
| **Azure AKS** | `managed-csi-premium` | Standard LB (`externalTrafficPolicy: Local`) | Azure Billing API |
|
||||
| **GCP GKE** | `premium-rwo` (PD CSI) | L4 passthrough NLB | GCP Cloud Billing |
|
||||
|
||||
**Benefits**:
|
||||
- Single source of truth for Application definitions
|
||||
- Cluster-specific values isolated per overlay
|
||||
@@ -658,6 +663,6 @@ Notifications include:
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2026-03-16
|
||||
**Last Updated**: 2026-04-22
|
||||
**Maintained By**: Platform Team
|
||||
**Questions?**: Contact #platform-support on Slack
|
||||
|
||||
@@ -37,7 +37,7 @@ Bootstrap a new cluster from scratch:
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
1. **Kubernetes cluster running** (UpCloud or any K8s cluster)
|
||||
1. **Kubernetes cluster running** (UpCloud, AWS EKS, Azure AKS, GCP GKE, or any K8s cluster)
|
||||
2. **kubectl configured** with admin access
|
||||
3. **Repositories cloned** locally
|
||||
|
||||
@@ -54,11 +54,13 @@ kubectl get nodes
|
||||
git clone https://git.forteapps.net/Forte/launchpad
|
||||
cd launchpad
|
||||
|
||||
# 2. Set cluster name (optional)
|
||||
export CLUSTER_NAME="prod-cluster-01"
|
||||
# 2. Run bootstrap script with cluster target
|
||||
# Available clusters: upc-dev, upc-prod, aws-dev, aws-prod,
|
||||
# azure-dev, azure-prod, gcp-dev, gcp-prod
|
||||
./bootstrap.sh upc-dev
|
||||
|
||||
# 3. Run bootstrap script
|
||||
./bootstrap.sh
|
||||
# Cluster config is loaded from clusters/<cluster>.yaml
|
||||
# (cloudProvider, trustedIPs, domain, etc.)
|
||||
```
|
||||
|
||||
**What Happens:**
|
||||
@@ -1262,13 +1264,21 @@ spec:
|
||||
|
||||
### Backup Strategy
|
||||
|
||||
**Current State**: No automated backups
|
||||
**Current State**: Gitea daily backups to S3-compatible storage
|
||||
|
||||
**What Needs Backup**:
|
||||
- ❌ Cluster state (not backed up - recreate via GitOps)
|
||||
- ❌ Persistent volumes (currently not critical)
|
||||
- ✅ Git repositories (Gitea provides backup)
|
||||
- ⚠️ Secrets (sealed secrets in Git, unseal keys need safekeeping)
|
||||
**What Is Backed Up**:
|
||||
- ✅ Gitea repositories + database: Daily CronJob (`cluster-resources/gitea-backup-cronjob.yaml`) uploads to S3-compatible storage with 7-day retention
|
||||
- ✅ Git repositories: Full cluster config recoverable from Git
|
||||
- ⚠️ Secrets: Sealed secrets in Git; unseal keys need safekeeping
|
||||
|
||||
**What Is NOT Backed Up**:
|
||||
- ❌ Cluster state (recreate via GitOps)
|
||||
- ❌ Other persistent volumes (Prometheus, Loki, Tempo data)
|
||||
|
||||
**Per-cloud backup scripts** (manual restore helpers):
|
||||
- UpCloud/AWS: `scripts/gitea-backup.sh` / `scripts/gitea-backup-aws.sh` (MinIO CLI, S3-compatible)
|
||||
- Azure: `scripts/gitea-backup-azure.sh` (Azure CLI + Blob Storage)
|
||||
- GCP: `scripts/gitea-backup-gcp.sh` (gsutil + GCS)
|
||||
|
||||
### Cluster Rebuild
|
||||
|
||||
@@ -1370,6 +1380,9 @@ kubectl get pods -n argocd
|
||||
|
||||
```bash
|
||||
# UpCloud: Upgrade via control panel or CLI
|
||||
# AWS EKS: eksctl upgrade cluster / AWS Console
|
||||
# Azure AKS: az aks upgrade / Azure Portal
|
||||
# GCP GKE: gcloud container clusters upgrade / Cloud Console
|
||||
|
||||
# After upgrade, verify cluster
|
||||
kubectl version
|
||||
@@ -1507,18 +1520,35 @@ git push
|
||||
|
||||
### Multi-Cluster Setup
|
||||
|
||||
The repository supports multiple clusters via Kustomize overlays:
|
||||
The repository supports multiple clusters across multiple clouds via Kustomize overlays:
|
||||
|
||||
**Active clusters:**
|
||||
- **upc-dev** (default): `infra/overlays/upc-dev/` — uses base Applications as-is
|
||||
- **upc-prod**: `infra/overlays/upc-prod/` — patches value file paths from `upc-dev` to `upc-prod`
|
||||
|
||||
Each cluster has its own:
|
||||
- Root app-of-apps file: `_app-of-apps-upc-dev.yaml` / `_app-of-apps-upc-prod.yaml`
|
||||
- Cluster-specific Helm values: `infra/values/upc-dev/` / `infra/values/upc-prod/`
|
||||
- Sealed secrets: `secrets/upc-dev/` (others as needed)
|
||||
- Apps overlay: `apps/overlays/upc-dev/` / `apps/overlays/upc-prod/`
|
||||
**Cloud-ready templates (fill in `clusters/*.yaml` before use):**
|
||||
- **aws-dev** / **aws-prod**: AWS EKS with NLB, gp3 storage, AWS CUR pricing
|
||||
- **azure-dev** / **azure-prod**: Azure AKS with Standard LB, managed-csi-premium storage
|
||||
- **gcp-dev** / **gcp-prod**: GCP GKE with L4 LB, premium-rwo storage
|
||||
|
||||
To add a new cluster, create a new overlay directory (e.g., `infra/overlays/upc-staging/`) with patches that swap the value file paths.
|
||||
Each cluster has its own:
|
||||
- Root app-of-apps: `_app-of-apps-{cluster}.yaml`
|
||||
- Cluster config: `clusters/{cluster}.yaml` (domain, trustedIPs, cloudProvider)
|
||||
- Kustomize overlay: `infra/overlays/{cluster}/kustomization.yaml`
|
||||
- Helm value overrides: `infra/values/{cluster}/` (traefik, gitea, opencost)
|
||||
- Sealed secrets: `secrets/{cluster}/` (as needed)
|
||||
- Apps overlay: `apps/overlays/{cluster}/`
|
||||
|
||||
Cloud-specific values handled per-cluster:
|
||||
|
||||
| Concern | UpCloud | AWS EKS | Azure AKS | GCP GKE |
|
||||
|---------|---------|---------|-----------|---------|
|
||||
| **Storage class** | `upcloud-block-storage-maxiops` | `gp3` | `managed-csi-premium` | `premium-rwo` |
|
||||
| **Load balancer** | UpCloud LB + ProxyProtocol v2 | NLB + ProxyProtocol v2 | Standard LB + `externalTrafficPolicy: Local` | L4 passthrough NLB |
|
||||
| **Cost monitoring** | Custom pricing | AWS CUR | Azure Billing API | GCP Cloud Billing |
|
||||
| **Backup storage** | UpCloud S3-compat | AWS S3 (native) | Azure Blob Storage | GCS |
|
||||
|
||||
To add a new cluster, create a new overlay directory (e.g., `infra/overlays/aws-staging/`) with patches that swap the value file paths, and a matching `clusters/aws-staging.yaml`.
|
||||
|
||||
### Blue-Green Deployments
|
||||
|
||||
@@ -1661,6 +1691,6 @@ echo "Remember to delete: $SECRET_FILE"
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2026-03-16
|
||||
**Last Updated**: 2026-04-22
|
||||
**Maintained By**: Platform Team
|
||||
**Emergency Contact**: #platform-support on Slack
|
||||
|
||||
@@ -180,7 +180,7 @@ Reference for:
|
||||
│
|
||||
▼
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ Kubernetes Clusters (UpCloud: upc-dev, upc-prod) │
|
||||
│ Kubernetes Clusters (UpCloud, AWS, Azure, GCP) │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ Infrastructure: Traefik, Cert-Manager, Kyverno │ │
|
||||
│ ├──────────────────────────────────────────────────────┤ │
|
||||
@@ -194,7 +194,7 @@ Reference for:
|
||||
### Key Technologies
|
||||
|
||||
- **GitOps**: ArgoCD
|
||||
- **Kubernetes**: UpCloud Managed Kubernetes (multi-cluster: upc-dev, upc-prod)
|
||||
- **Kubernetes**: Multi-cloud (UpCloud, AWS EKS, Azure AKS, GCP GKE)
|
||||
- **Ingress**: Traefik v2
|
||||
- **Certificates**: Cert-Manager + Let's Encrypt
|
||||
- **Policies**: Kyverno
|
||||
@@ -299,11 +299,16 @@ docs/
|
||||
## 🔄 Documentation Versions
|
||||
|
||||
**Current Version**: 1.0.0
|
||||
**Last Updated**: 2026-03-16
|
||||
**Last Updated**: 2026-04-22
|
||||
**Maintained By**: Platform Team
|
||||
|
||||
### Changelog
|
||||
|
||||
- **v1.1.0 (2026-04-22)**: Multi-cloud support
|
||||
- Cloud-agnostic base values (storage, LB, pricing moved to per-cluster overlays)
|
||||
- Added AWS EKS, Azure AKS, GCP GKE configurations
|
||||
- Per-cloud backup scripts
|
||||
- Updated all documentation
|
||||
- **v1.0.0 (2026-03-16)**: Initial comprehensive documentation release
|
||||
- GitOps Architecture guide
|
||||
- Developer Onboarding guide
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
|
||||
| Component | Value |
|
||||
|-----------|-------|
|
||||
| **Provider** | UpCloud Managed Kubernetes |
|
||||
| **Environment** | Production (internal use) |
|
||||
| **Cluster Count** | Multi-cluster (upc-dev, upc-prod) |
|
||||
| **Provider** | Multi-cloud (UpCloud, AWS EKS, Azure AKS, GCP GKE) |
|
||||
| **Active clusters** | UpCloud (upc-dev, upc-prod) |
|
||||
| **Cloud-ready templates** | AWS, Azure, GCP (dev + prod each) |
|
||||
| **GitOps Tool** | ArgoCD |
|
||||
| **Ingress Controller** | Traefik v2 |
|
||||
| **Certificate Management** | Cert-Manager + Let's Encrypt |
|
||||
@@ -42,7 +42,7 @@ Internet
|
||||
[DNS: *.forteapps.net]
|
||||
│
|
||||
▼
|
||||
[UpCloud LoadBalancer]
|
||||
[Cloud Load Balancer]
|
||||
│
|
||||
▼
|
||||
[Traefik Ingress Controller]
|
||||
@@ -1470,14 +1470,22 @@ Recommended resource allocation:
|
||||
|
||||
### Storage Classes
|
||||
|
||||
Default storage class used: **UpCloud default** (varies by provider)
|
||||
Storage classes are cloud-specific and configured in per-cluster value overrides (`infra/values/{cluster}/gitea-values.yaml`):
|
||||
|
||||
| Cloud | Storage Class | Driver |
|
||||
|-------|--------------|--------|
|
||||
| **UpCloud** | `upcloud-block-storage-maxiops` | UpCloud CSI |
|
||||
| **AWS EKS** | `gp3` | EBS CSI |
|
||||
| **Azure AKS** | `managed-csi-premium` | Azure Disk CSI |
|
||||
| **GCP GKE** | `premium-rwo` | PD CSI |
|
||||
|
||||
```yaml
|
||||
# Example: base values omit storageClass (set in per-cluster overlay)
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: "" # Uses default
|
||||
accessMode: ReadWriteOnce
|
||||
size: 5Gi
|
||||
# storageClass set by infra/values/{cluster}/gitea-values.yaml
|
||||
```
|
||||
|
||||
---
|
||||
@@ -1673,6 +1681,6 @@ team: platform
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2026-04-16
|
||||
**Last Updated**: 2026-04-22
|
||||
**Maintained By**: Platform Team
|
||||
**Version**: 1.0.0
|
||||
|
||||
Reference in New Issue
Block a user