{"id":28682175,"url":"https://github.com/olga-mir/playground","last_synced_at":"2026-03-17T01:06:17.787Z","repository":{"id":296504267,"uuid":"496182197","full_name":"olga-mir/playground","owner":"olga-mir","description":"Platform API abstractions powered by Crossplane, GitOps and AI experiments","archived":false,"fork":false,"pushed_at":"2025-06-09T01:21:12.000Z","size":3922,"stargazers_count":1,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-09T01:24:00.565Z","etag":null,"topics":["ai","crossplane","gitops","kagent","kgateway"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/olga-mir.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-05-25T10:22:51.000Z","updated_at":"2025-06-03T21:46:59.000Z","dependencies_parsed_at":"2025-05-31T17:55:01.081Z","dependency_job_id":null,"html_url":"https://github.com/olga-mir/playground","commit_stats":null,"previous_names":["olga-mir/playground"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/olga-mir/playground","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olga-mir%2Fplayground","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olga-mir%2Fplayground/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olga-mir%2Fplayground/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olga-mir%2Fplayground/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/olga-mir","download_url":"https://codeload.github.com/olga-mir/playground/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olga-mir%2Fplayground/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259747230,"owners_count":22905313,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","crossplane","gitops","kagent","kgateway"],"created_at":"2025-06-14T02:07:28.179Z","updated_at":"2026-03-14T00:39:02.616Z","avatar_url":"https://github.com/olga-mir.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Playground\n\nA monorepo showcasing modern cloud-native and AI-powered workflows. Built on **Crossplane v2** for platform API abstractions and **FluxCD** for GitOps automation. This repository serves as a playground for exploring the intersection of infrastructure-as-code, AI agents, and Kubernetes-native tooling.\n\nWrite-ups and Demos are available in [Repo's Wiki](https://github.com/olga-mir/playground/wiki) and [demo](./demo) folder.\n\n# Tech Stack\n\n| Logo | Name | Description | Project Version |\n|------|------|-------------|-----------------|\n| \u003cimg src=\"https://www.gstatic.com/marketing-cms/assets/images/29/8c/e1f2c0994e87b8d7edf2886f9c02/google-cloud.webp=s96-fcrop64=1,00000000ffffffff-rw\" width=\"30\"\u003e | GKE | Google Kubernetes Engine is Google Cloud's managed Kubernetes service | 1.34.1 |\n| \u003cimg src=\"https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/dbd2ff92a93e7c8a29bce07cc331e40e6d470efe/site-src/images/logo/logo.svg\" width=\"30\"\u003e | Gateway API | Kubernetes Gateway API is a collection of resources that model service networking in Kubernetes, providing expressive, extensible, and role-oriented interfaces. | [v1.5.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.5.0) |\n| \u003cimg src=\"https://kgateway.dev/feature-api-gateway.svg\" width=\"30\"\u003e | kgateway | Kubernetes gateway for AI services, providing a standardized way to connect applications with AI capabilities within the cluster. | [v2.2.1](https://github.com/kgateway-dev/kgateway/releases/tag/v2.2.1) |\n| \u003cimg src=\"https://raw.githubusercontent.com/agentgateway/agentgateway/refs/heads/main/ui/public/favicon.svg\" width=\"30\"\u003e | Agent Gateway| Gateway Dataplane for AI workloads (MCP, A2A) | [v0.12.0](https://github.com/agentgateway/agentgateway/releases/tag/v0.12.0) |\n| \u003cimg src=\"https://raw.githubusercontent.com/cncf/artwork/refs/heads/main/projects/crossplane/icon/color/crossplane-icon-color.svg\" width=\"30\"\u003e | Crossplane | Open-source Kubernetes add-on that lets you provision and manage cloud infrastructure and external services using Kubernetes-style APIs and declarative configuration. | [v2.0.0-rc.1](https://github.com/crossplane/crossplane/releases/tag/v2.0.0-rc.1) |\n| \u003cimg src=\"https://raw.githubusercontent.com/kagent-dev/kagent/33a48ede61be68c84f6adcfddde09db41aeb1ea7/img/icon-dark.svg\" width=\"30\"\u003e | kagent | Kubernetes-native AI agent framework that enables the deployment and management of AI agents within Kubernetes clusters. | [v0.7.21](https://github.com/kagent-dev/kagent/releases/tag/v0.7.21) |\n| \u003cimg src=\"https://raw.githubusercontent.com/cncf/artwork/88fa3f88ea2e4bf3e4941be8dc797b6d860c9ade/projects/flux/icon/color/flux-icon-color.svg\" width=\"30\"\u003e | FluxCD | GitOps toolkit for Kubernetes that keeps clusters in sync with configuration sources and automates deployments. | [v2.8.1](https://github.com/fluxcd/flux2/releases/tag/v2.8.1) |\n| \u003cimg src=\"https://raw.githubusercontent.com/cncf/artwork/refs/heads/main/projects/litmus/icon/color/litmus-icon-color.svg\" width=\"30\"\u003e | LitmusChaos | Cloud-native chaos engineering framework for Kubernetes that helps teams find weaknesses in their deployments through controlled chaos experiments. | [v3.26.0](https://github.com/litmuschaos/litmus-helm/releases/tag/litmus-3.26.0) |\n\n\n# Infrastructure\n\nThis project implements a **hierarchical architecture** with fully automated cluster provisioning and GitOps deployment:\n\n## 🏗️ Cluster Architecture\n\n1. **Temporary Bootstrap cluster (kind)**: Local cluster running Crossplane v2 + FluxCD. Provisions permanent `control-plane` cluster in the cloud.\n2. **Control-plane cluster (GKE)**: Management cluster with Crossplane, platform services, and AI stack. Provisions workload clusters.\n3. **Workload clusters (GKE)**: Isolated clusters for tenant applications (apps-dev, staging, prod).\n\nIn this project the temporary bootstrap cluster currently stays for the lifetime of the setup.\nIn Cluster API (not used in this project) there is bootstrap-and-pivot concept allowing moving configuration from oneplace to another\nwithout breaking the connection. In this way the config for permanent control-plane cluster lives in the cluster itself.\nIt is not entirely clear right how Day-2 for control-plane cluster should look like in Crossplane.\n\n# Deployment\n\n## Prerequisites\n\n* Access to GCP account with sufficient permissions\n* tools: gcloud, flux, kubectl, task\n* Access to GitHub organisation or personal account\n\n### Environment Variables\n\nAll required env variables are validated in preconditions of `deploy` task, defined [here](./tasks/setup.yaml).\n\n### GitHub Integration\n\nGitHub Actions workflows in this repo use GCP OIDC auth to authenticate to GCP. Instructions on how to setup GH and GCP can be found in [./docs/github-integration.md](./docs/github-integration.md)\n\nA Claude Workflow is setup in this repository, at least for now for learning purposes. Instructions on how to set it up: [./docs/github-app-setup.md](./docs/github-app-setup.md). Learnings from this currently in-progress experiment documented in [./demo/github-actions-claude-workflow/](./demo/github-actions-claude-workflow/)\n\n## Project Structure and Bootstrap\n\n### Architectural Flow\n\n1. **Infrastructure Provisioning** (Kind cluster → GCP):\n   - Crossplane compositions create GKE clusters (infrastructure only)\n   - Connection secrets with kubeconfig are generated\n\n2. **Cluster Bootstrapping** (GitHub Actions → Target cluster):\n   - Flux notification detects cluster readiness → triggers GitHub webhook\n   - GitHub Actions authenticates via Workload Identity Federation\n   - Flux bootstrapped on target cluster pointing to `/clusters/{cluster-type}/`\n\n3. **\"Batteries Included\" Deployment** (Target cluster GitOps):\n   - Flux on target cluster deploys Crossplane installation\n   - Platform services (kagent, kgateway, networking) deployed\n   - Applications and tenant workloads deployed\n\nThis repository hosts both platform teams and consumer teams configurations with clear separation of concerns.\n\nRefer to [./bootstrap/README.md](./bootstrap/README.md) for detailed explanation of repository structure and deployment flow.\n\n## Platform vs Tenants\n\n- **Platform Products**: Core services like kagent, kgateway, networking components\n- **Platform Tenants**: End-user applications and team-specific workloads\n- **Flux GitOps**: Automatically syncs both platform services and tenant applications to appropriate clusters\n\n## Key Operations\n\n```bash\n# Deploy complete infrastructure:\ntask setup:deploy\n\n# Validate deployment:\ntask validate:all\n\n# Clean up everything - this task removes all resources deployed in `setup:deploy`\n# i.e. clusters, but not project, WIF, IAM.\ntask setup:cleanup\n```\n\n**Available commands**:\n```bash\ntask --list\n```\n\n## Additional Diagnostics and Experimentation\n\n```\n# Test whereami (team-alpha)\nkubectl exec -n team-platform deploy/fortio-diagnostic -- \\\n  fortio load -c 10 -qps 100 -t 30s http://whereami.team-alpha/\n\n# Test fortio-echo (team-bravo)\nkubectl exec -n team-platform deploy/fortio-diagnostic -- \\\n  fortio load -c 10 -qps 100 -t 30s http://fortio-echo.team-bravo/\n\n# High load test\nkubectl exec -n team-platform deploy/fortio-diagnostic -- \\\n  fortio load -c 50 -qps 1000 -t 60s http://whereami.team-alpha/\n```\n\n### Performance Experimentation\n\nThis project integrates \"tenant\" application which is developed in another repository: https://github.com/olga-mir/playground-sre.\nThis repo has source code, GitHub Actions workflows to build and push image and k8s manifests that are deployed from this repo.\n\n```\n# Baseline — sleep 50ms, 10 concurrent connections, 30s\nkubectl exec -n team-bravo deploy/fortio-echo -- \\\n  fortio load -c 10 -qps 100 -t 30s \\\n  'http://perf-lab.sre.svc.cluster.local/v1/scenarios/sleep?duration=50ms'\n\n# CPU — 2 goroutines, 1s per request, 4 concurrent\nkubectl exec -n team-bravo deploy/fortio-echo -- \\\n  fortio load -c 4 -qps 0 -t 30s \\\n  'http://perf-lab.sre.svc.cluster.local/v1/scenarios/cpu?duration=1s\u0026goroutines=2'\n\n# Fanout — 50 workers, watch goroutine scheduling overhead\nkubectl exec -n team-bravo deploy/fortio-echo -- \\\n  fortio load -c 5 -qps 2 -t 30s \\\n  'http://perf-lab.sre.svc.cluster.local/v1/scenarios/fanout?workers=50\u0026task_duration=200ms'\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folga-mir%2Fplayground","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Folga-mir%2Fplayground","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folga-mir%2Fplayground/lists"}