---
title: GitOps with Flux CD
description: Implementing GitOps workflows on Kubernetes using Flux CD
pubDate: 2025-04-19
heroImage: /images/posts/prometheusk8.png
category: devops
tags:
  - kubernetes
  - gitops
  - flux
  - ci-cd
  - automation
readTime: 10 min read
---

# GitOps with Flux CD

GitOps is revolutionizing the way teams deploy and manage applications on Kubernetes. This guide will walk you through implementing a GitOps workflow using Flux CD, an open-source continuous delivery tool.

## What is GitOps?

GitOps is an operational framework that takes DevOps best practices used for application development such as version control, collaboration, compliance, and CI/CD, and applies them to infrastructure automation.

With GitOps:
- Git is the single source of truth for the desired state of your infrastructure
- Changes to the desired state are declarative and version controlled
- Approved changes are automatically applied to your infrastructure

## Why Flux CD?

Flux CD is a GitOps tool that ensures that your Kubernetes cluster matches the desired state specified in a Git repository. Key features include:

- Automated sync between your Git repository and cluster state
- Support for Kustomize, Helm, and plain Kubernetes manifests
- Multi-tenancy via RBAC
- Strong security practices, including image verification

## Installation

### Prerequisites

- A Kubernetes cluster (K3s, Kind, or any other distribution)
- kubectl configured to access your cluster
- A GitHub (or GitLab/Bitbucket) account and repository

### Installing Flux

1. Install the Flux CLI:

```bash
curl -s https://fluxcd.io/install.sh | sudo bash
```

2. Export your GitHub personal access token:

```bash
export GITHUB_TOKEN=<your-token>
```

3. Bootstrap Flux:

```bash
flux bootstrap github \
  --owner=<your-github-username> \
  --repository=<repository-name> \
  --path=clusters/my-cluster \
  --personal
```

## Setting Up Your First Application

1. Create a basic directory structure in your Git repository:

```
└── clusters/
    └── my-cluster/
        ├── flux-system/  # Created by bootstrap
        └── apps/
            └── podinfo/
                ├── namespace.yaml
                ├── deployment.yaml
                └── service.yaml
```

2. Create a Flux Kustomization to deploy your app:

```yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 5m0s
  path: ./clusters/my-cluster/apps/podinfo
  prune: true
  sourceRef:
    kind: GitRepository
    name: flux-system
```

3. Commit and push your changes, and Flux will automatically deploy your application!

## Advanced Features

### Automated Image Updates

Flux can automatically update your deployments when new images are available:

```yaml
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  image: ghcr.io/stefanprodan/podinfo
  interval: 1m0s
---
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImagePolicy
metadata:
  name: podinfo
  namespace: flux-system
spec:
  imageRepositoryRef:
    name: podinfo
  policy:
    semver:
      range: 6.x.x
```

### Working with Helm Charts

Flux makes it easy to manage Helm releases:

```yaml
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
metadata:
  name: bitnami
  namespace: flux-system
spec:
  interval: 30m
  url: https://charts.bitnami.com/bitnami
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: redis
  namespace: flux-system
spec:
  interval: 5m
  chart:
    spec:
      chart: redis
      version: "16.x"
      sourceRef:
        kind: HelmRepository
        name: bitnami
  values:
    architecture: standalone
```

## Conclusion

Flux CD provides a powerful, secure, and flexible platform for implementing GitOps workflows. By following this guide, you'll be well on your way to managing your Kubernetes infrastructure using GitOps principles.

Stay tuned for more advanced GitOps patterns and best practices! 