{"id":18354733,"url":"https://github.com/siddhantprateek/lyftops","last_synced_at":"2026-05-07T11:32:07.831Z","repository":{"id":226701057,"uuid":"769203954","full_name":"siddhantprateek/lyftops","owner":"siddhantprateek","description":" Aim of this project is to understand the GitOps best practices, utilizing Argo CD for continuous deployment","archived":false,"fork":false,"pushed_at":"2024-03-12T09:40:29.000Z","size":1759,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-10T01:46:46.402Z","etag":null,"topics":["argocd","canary","gitops","golang","kubernetes","rollouts","terraform"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/siddhantprateek.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"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},"funding":{"github":"siddhantprateek"}},"created_at":"2024-03-08T14:57:38.000Z","updated_at":"2025-01-20T03:45:42.000Z","dependencies_parsed_at":"2024-03-12T11:05:39.234Z","dependency_job_id":null,"html_url":"https://github.com/siddhantprateek/lyftops","commit_stats":null,"previous_names":["siddhantprateek/lyftops"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/siddhantprateek/lyftops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddhantprateek%2Flyftops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddhantprateek%2Flyftops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddhantprateek%2Flyftops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddhantprateek%2Flyftops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/siddhantprateek","download_url":"https://codeload.github.com/siddhantprateek/lyftops/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddhantprateek%2Flyftops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32735099,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["argocd","canary","gitops","golang","kubernetes","rollouts","terraform"],"created_at":"2024-11-05T22:04:58.936Z","updated_at":"2026-05-07T11:32:07.813Z","avatar_url":"https://github.com/siddhantprateek.png","language":"Go","funding_links":["https://github.com/sponsors/siddhantprateek"],"categories":[],"sub_categories":[],"readme":"# LYFTOPS\n\nThe aim of this project is to understand the GitOps best practices, utilizing Argo CD for continuous deployment and Argo Rollouts for advanced deployment strategies within a Kubernetes environment. I'm responsible for setting up a GitOps pipeline that automates the deployment and management of a simple web application.\n\n## Tech Stack\n\n- `Kubernetes` - Container Orchestration Tool\n- `ArgoCD`\n- `Argo Rollout`\n- `Go`\n- `Labstack - Echo` - Go web framework used for building the API server.\n- `Github Actions` for CI/CD pipeline\n- `Docker` - Container\n- `Terraform` - Infrastructure provisioning tool\n\n## Application Workflow\n\n![](./assets/lyftops-workflow.png)\n\n\nFew things to note: \n\n\u003e - `/kubernetes` contains the kubernetes manifest files for the Go application. It contains (Deployment, Service \u0026 ConfigMap)\n\u003e - `/kubernetes/argo-rollout` contains the Rollout for Go application. Plus Instruction to step Argo Rollout in Kubernetes cluster.\n\u003e There are 4 versions of docker image on docker hub. `go-app:latest`, `go-app:v2`, `go-app:v3`, `go-app:v4`.\n\u003e In ArgoCD, there are 2 application created, `go-application`(Yellow) and `go-app-argo-rollouts`(Green)\n\n- `Docker Image` is located at - https://hub.docker.com/r/siddhantprateek/go-app\n---\n\n- Currently, the application is written in Go which is in `/app` directory. \n- The Go application is containerized and pushed to Docker Hub to `siddhantprateek/go-app`.\n- So everytime, I push any changes to Github,  a CI pipeline by Github Actions will be triggered which builds the docker image of the app and pushes it to Docker Hub.\n- Within the Kubernetes cluster, there are 3 namespaces:\n  - `go-app-ns`: contains all the resources related to Go app.\n  - `argocd` : contains all the resources related to Argo CD.\n  - `argo-rollout`: contains Argo Rollout CRDs.\n- So in kubernetes cluster, ArgoCD creates a pipleline with Git repository, where any changes that occurred to manifest files in `/kubernetes` directory triggers the workflow.\n- Argo CD continuously monitors the `/kubernetes` directory for changes.\n- When changes are detected, Argo CD suggests that the application's current state is out of sync.\n- Review the suggested changes in the Argo CD dashboard.\n- Decide whether to proceed with syncing the changes, initiating a rollout of the updated application version, or rollback to a previous version.\n- Argo CD facilitates the management of rollouts, ensuring seamless deployment of the updated application version.\n- It provides visibility into the deployment process and allows for monitoring of the application's health and performance.\n\n### Setting up the environment\n\n- Make sure that Kubernetes environment in running. You can use Minikube or Kind or any kubernetes offering by any cloud provider.\n- Spin your kubernetes  cluster (local or cloud).\n\n\n## Infrastructure Configuration \n\n- If you want to Run Kubernetes on  Linode you need an API Token.\n\n```bash\n$ tofu plan\nvar.linode_token\n  linode config token\n\n  Enter a value: \n\nOpenTofu used the selected providers to generate the following execution plan. Resource actions are\nindicated with the following symbols:\n  + create\n\nOpenTofu will perform the following actions:\n\n  # linode_lke_cluster.linode_kube will be created\n  + resource \"linode_lke_cluster\" \"linode_kube\" {\n      + api_endpoints = (known after apply)\n      + dashboard_url = (known after apply)\n      + id            = (known after apply)\n      + k8s_version   = \"1.28\"\n      + kubeconfig    = (sensitive value)\n      + label         = \"linode_kube\"\n      + region        = \"ap-south\"\n      + status        = (known after apply)\n      + tags          = [\n          + \"prod\",\n        ]\n\n      + pool {\n          + count = 3\n          + id    = (known after apply)\n          + nodes = (known after apply)\n          + type  = \"g6-nanode-1\"\n\n          + autoscaler {\n              + max = 5\n              + min = 3\n            }\n        }\n    }\n\nPlan: 1 to add, 0 to change, 0 to destroy.\n```\n\n- To Spin up the Kubernetes  Cluster on Linode LKE, run\n\n```bash\ntofu apply # Create or update infrastructure\n```\n\n![](./assets/linode-lks.png)\n\n- To Access  your cluster via `kubectl`, go through /scripts, need to provide kubeconfig.yaml configuration.\n\n- After forming the infrastructure\n\n```bash\n$ linode-cli lke clusters-list\n┌────────┬─────────────┬────────┬─────────────┬─────────────────────────────────┐\n│ id     │ label       │ region │ k8s_version │ control_plane.high_availability │\n├────────┼─────────────┼────────┼─────────────┼─────────────────────────────────┤\n│ 161755 │ linode-kube │ in-maa │ 1.28        │ False                           │\n└────────┴─────────────┴────────┴─────────────┴─────────────────────────────────┘\n```\n\n- Setup Argo CD Resources\n```bash\nkubectl create namespace argocd \nkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml\n```\n- Setup Argo Rollout\n\n```bash\nkubectl create namespace argo-rollouts\nkubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml\n```\n- Setup Application Resources\n\n```bash\nkubectl apply -f ./kubernetes/\nkubectl apply -f ./kubernetes/argo-rollout/\n```\n\n- After all the things are setup you can play around with manifest file in `/kubernetes` directory by changing the image labels, through CLI.\n\n```bash\n kubectl argo rollouts set image go-app-rollouts go-app-rollouts=siddhantprateek/go-app:\u003cCHANGE_THE_LABEL\u003e -n go-app-ns \n```\n\n- After everything is done\n```bash\ntofu destroy # Destroy previously created infrastructure\n```\n\n## Results\n\n- Through Argo Rollout performing canary deployment strategy. Argo Rollouts monitoring the deployment of the new version, ensuring the canary release successfully completes.\n![](./assets/argo-rollouts.png)\n\n- Canary Deployment view.\n\n![](./assets/revision1-2.png)\n\n![](./assets/revision2.png)\n\n\n- Simple Deployment on ArgoCD\n![](./assets/argo-monitor-simple-resource.png)\n\n\n## Challenges \n\nThere have been relatively few issues encountered. If the task had been to use 'kubectl rollout', it could have been difficult, however ArgoCD made it easier as it allows rollout/rollback control. Plus features like Automate Synchronisation allow you to set alternative deployment strategies that are appropriate for the application.\n\n### Author\n\n[Siddhant Prateek Mahanayak](https://github.com/siddhantprateek)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiddhantprateek%2Flyftops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsiddhantprateek%2Flyftops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiddhantprateek%2Flyftops/lists"}