Dubbed as the agility sweet pot, containers are revolutionizing modern application development. They allow development teams to roll out multiple deployments, which helps meet their organizational demands.
Despite this high level of agility, deploying projects into containerized architectures has its share of operational challenges. Sometimes, the standard container architecture can’t keep pace with the ever-growing business demands.
In this case, you need to find a more efficient way to deploy and scale a container cluster. Embracing the GitOps workflow could be a great way to improve your development cycle. WhiteSource put together an amazing article on how developers are gitting into deployment to streamline their workflows.
What is GitOps?
At its heart, GitOps is a method of implementing CI/CD deployments for cloud-native applications such as Kubernetes. The GitOps model focuses on centralizing every aspect of the production process so that you can manage both development and operations in a single path. Alex Richardson, the founder and CEO of Weaveworks, who is highly credited for coining GitOps, said that the most important function of GitOps lies in the ability to enable correct application and verification of system changes
The core concept behind GitOps is using continuous observation and verification for app and cluster management. When any of the system drifts from the correct state, users are notified so that they can converge it back to the desired state in Git.
This developer-centric approach helps deploy code faster and more safely in any Git source control repository, including GitLab, GitHub, and Bitbucket.
As illustrated above, a typical GitOps workflow has two separate repositories. One repo for the application, which is integrated into the CI/DC pipeline, and the second repo for the infrastructure or cluster code.
Developers commit changes to the repositories, which are then deployed automatically by a GitOps operator.
GitOps for the entire cloud-native stack
If you use Kubernetes, GitOps can take your development game a notch higher by allowing you to perform automated Kubernetes deployments with zero effort, and as many times as you wish. However, GitOps is not only for Kubernetes but for the whole cloud-native stack.
We’ve seen numerous solutions such as Istio, OpenFaas, Kubeflow, Ksonnet, Helm and Pulumi implement the GitOps model to reinvent app development. It’s an exciting concept that can be applied to any cloud-native environment to manage infrastructure provisioning as well as software deployment. With GitOps, you continue using your favourite Git repo, CI server, and image repo.
How does this fit into DevOps?
As an extension or subset of DevOps, GitOps focuses on automating the development process and speeding up release cadences. It leverages the power of automation and infrastructure as code to reduce the need for manual, ad hoc, human input during application lifecycle management.
While DevOps and GitOps share a common goal, the difference lies in that DevOps is more of a cultural shift or philosophy, whereas GitOps is a development technique or paradigm. Additionally, GitOps is tied to Git and cloud-native, whereas DevOps is not tied to a single tool or platform.
At its core, GitOps provides:
An operating model for Git, Kubernetes and the entire cloud-native stack- It defines a set of practices to effectively combine the deployment, monitoring and management for containerized clusters.
A developer-centric path for managing applications – It’s not just about Git push but how to set up the entire CI/CD pipeline. We apply the Git workflow to both operations and development.
As a result, there is better separation of processes. The two pipelines can only communicate when Git or the image repo is updated. This creates an immutability firewall between CI/CD and runtime operations.
It’s a straightforward way to operate where events serve as an integration tool. This is because pull requests are used to manage the entire infrastructure. Whenever Git is updated, Flux (Weave cloud operator) notifies the runtime. When Kubernetes or cloud-native accepts a change, a Git update follows.
GitOps Integration made simple with Flux
Flux is a GitOps operator developed by Weaveworks for Kubernetes. This open-source tool runs directly in the cluster and makes GitOps deployment easier.
It connects to your repo, where it watches for changes on the branches and folders. If a commit occurs, Flux triggers a Kubernetes deployment. This means you do not require an additional tool or script to keep the cluster up to date.
Setting Up Flux in your cluster
Setting up Flux is a simple and straightforward process that takes a few minutes to get it running in your cluster. However, you need to have the Kubernetes set up working before set up. In this example, we will use flux-get-started. You can create its fork on GitHub to get started
To start with, install fluxctl.
Then use this command to create the flux namespace
After creating the namespace, use this command to install Flux in your cluster. In this case, replace “USER_ID” with your GitHub username,
Now, wait for flux to start.
Once your set up is ready, deployments will eventually be easier and faster. You can also learn how to use the Flux helm operator or check this hands-on tutorial on how to control Flux.
GitOps Workflow - A Roadmap to Enhanced Security
Although the GitOps model was not conceived with security as the primary goal, it brings some significant security benefits.
This is because GitOps allows development teams to use a single tool and interface for infrastructure management. Reducing the number of variables and providing deep, continuous visibility into the entire infrastructure guarantees more security.
Fewer variables reduce the attack surface as well as potential risks, should something go wrong. On the other hand, more visibility means security problems can be easily detected as soon as they arise.
Separation of functions between application packaging and releasing it to production also embodies an important security principle.
That at any stage of development, you should always minimize the attack surface and reduce the impact of vulnerabilities whenever possible.
GitOps security assurance is further backed by the strong cryptographic techniques used for tracking and managing changes. Additionally, if there is a compromise, the single source of truth is used to recreate a new, independent system, thus reducing downtime and enabling better incident response.
It is easier to track and log changes securely when using GitOps, which in turn facilitates compliance and efficient auditing.
So, in the end, you will realize that implementing GitOps has significant benefits to your development processes. Other than improving security, GitOps enhances developer experience as well as productivity. It also makes the development workflow more stable, consistent and reliable.
Summing Up
Here are some main points that sum up everything the article walked you through about GitOps:
All application and configuration code is defined in Git, the single and stable source of truth
Commits to Git trigger builds, deployments, and other lifecycle events that could otherwise be initiated through API calls or mouse clicks in a non-GitOps workflow.
A single version control for all changes eliminates the need to use different tools for controlling different infrastructure.
There’s a version control for all changes made to the configuration, which is essential for auditing purposes as well as performing rollbacks.
Creates a higher level of abstraction between functions for tighter security
The good thing about GitOps is that most developers are familiar with Git pull requests, so you’re not introducing a new tool for infrastructure management. This makes it easier to onboard new developers to GitOps.
With all the significant value this practice offers, alongside the ease of deployment with open source tools like Flux, it’s time you start taking your development processes to the next level by adopting GitOps.
Another GitOps tool that might worth a look is werf: https://github.com/flant/werf
The GitOps engine is worth a look, ArgoCD + Flux. https://github.com/argoproj/gitops-engine