Files
wiki.tipsy.codes/Simple Flux.md
T
2026-04-27 23:27:04 -07:00

4.4 KiB
Raw Blame History

The Flux tutorial makes things very complicated. In essence, all Flux is is a tool that pulls a git repo, and does kubectl apply -k; there should be a much easier way to set it up.

Install Flux

Export your GITEA_TOKEN:

export GITEA_TOKEN=THERE_IS_SOME_TOKEN_HERE

Bootstrap the repo:

 flux bootstrap gitea \  
--token-auth=true \  
--owner=charles \  
--repository=flux-5pi5 \  
--branch=main \  
--path=./ \  
--personal \  
--hostname=git.tipsy.codes

This will create the repo in Gitea for you, and define a basic structure:

 tree  
.  
└── cluster  
   └── flux-system  
       ├── gotk-components.yaml  
       ├── gotk-sync.yaml  
       └── kustomization.yaml

From here, in the simplest way, you can just start deploying applications.

First deployment

In the most simple form, any kustomization in the path pointed to by '--path' will be picked up. Since we set it to '.', adding something should be as simple as dropping it into that folder.

 git clone ssh://git@git.tipsy.codes:2222/charles/flux-5pi5.git
 cd flux-5pi5
 cat <<EOF > nginx.yaml  
apiVersion: apps/v1  
kind: Deployment  
metadata:  
 name: nginx-deployment  
 namespace: default  
spec:  
 selector:  
   matchLabels:  
     app: nginx  
 replicas: 2 # tells deployment to run 2 pods matching the template  
 template:  
   metadata:  
     labels:  
       app: nginx  
   spec:  
     containers:  
       - name: nginx  
         image: nginx:1.14.2  
         ports:  
           - containerPort: 80  
EOF

Then commit, push, and reconcile:

 git add .  
 git commit -am 'add: nginx deployment'  
[main e1e40fb] add: nginx deployment  
1 file changed, 19 insertions(+)  
create mode 100644 nginx.yaml  
 git push  
** WARNING: connection is not using a post-quantum key exchange algorithm.  
** This session may be vulnerable to "store now, decrypt later" attacks.  
** The server may need to be upgraded. See https://openssh.com/pq.html  
Enumerating objects: 4, done.  
Counting objects: 100% (4/4), done.  
Delta compression using up to 20 threads  
Compressing objects: 100% (3/3), done.  
Writing objects: 100% (3/3), 478 bytes | 478.00 KiB/s, done.  
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)  
remote: . Processing 1 references  
remote: Processed 1 references in total  
To ssh://git.tipsy.codes:2222/charles/flux-5pi5.git  
  43161d8..e1e40fb  main -> main

If you are impatient, you can trigger a reconciliation with:

flux reconcile source git flux-system

Watch it rollout with:

watch flux get all -A

Then you should be good to go!

 kubectl get pods  
NAME                                READY   STATUS    RESTARTS   AGE  
nginx-deployment-647677fc66-cltgn   1/1     Running   0          6m31s  
nginx-deployment-647677fc66-r6lxj   1/1     Running   0          6m31s

Some simple things to make it better

Use kustomizations

If we use kustomizations, we can track the reconciliation of sets of things.

Here is a simple example:

 head -n 99999 nginx.yaml nginx/*  
==> nginx.yaml <==  
apiVersion: kustomize.toolkit.fluxcd.io/v1  
kind: Kustomization  
metadata:  
 name: nginx-kustomization  
 namespace: flux-system  
spec:  
 interval: 10m  
 path: "./nginx"  
 prune: true  
 sourceRef:  
   kind: GitRepository  
   name: flux-system  
 targetNamespace: default  
 wait: true  
  
==> nginx/deployment.yaml <==  
apiVersion: apps/v1  
kind: Deployment  
metadata:  
 name: nginx-deployment  
 namespace: default  
spec:  
 selector:  
   matchLabels:  
     app: nginx  
 replicas: 2 # tells deployment to run 2 pods matching the template  
 template:  
   metadata:  
     labels:  
       app: nginx  
   spec:  
     containers:  
       - name: nginx  
         image: nginx:1.14.2  
         ports:  
           - containerPort: 80  
  
==> nginx/kustomization.yaml <==  
apiVersion: kustomize.config.k8s.io/v1beta1  
kind: Kustomization  
namespace: default  
resources:  
 - deployment.yaml

The first file (nginx.yaml) tells Flux to look into a specific folder, with an update interval and some other settings. The other files are the kustomization; check the Kubernetes docs for that.