Initiate documentation for gitops patterns
parent
22f9a8280a
commit
efcff670d5
1 changed files with 257 additions and 0 deletions
257
Guides/Repository-Handling-Multiple-Environments.md
Normal file
257
Guides/Repository-Handling-Multiple-Environments.md
Normal file
|
|
@ -0,0 +1,257 @@
|
|||
# GitOps-Ready Namespaces with Flux
|
||||
## Overview
|
||||
|
||||
In our OpenShift clusters, namespaces are provisioned GitOps-ready by default.
|
||||
Each namespace is linked to a Git repository where configurations are stored and managed declaratively.
|
||||
|
||||
This setup enables:
|
||||
|
||||
* Consistent GitOps workflow across tenants
|
||||
|
||||
* Multi-environment support from a single repo
|
||||
|
||||
* Overlay approach with minimal duplication
|
||||
|
||||
Each namespace is link to a git repository this combination is what we call a
|
||||
*Tenant* for this example we are going to take the example of 3 environments
|
||||
dev, qa, prod:
|
||||
|
||||
We forward the `TENANT_NAMESPACE` variable holding the value of you tenant
|
||||
name. This allows Kustomizations to dynamically target the right folder for
|
||||
each environment.
|
||||
|
||||
Flux Kustomization e.g
|
||||
|
||||
```yaml
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||
kind: Kustomization
|
||||
metadata:
|
||||
name: my-app
|
||||
namespace: ${TENANT_NAMESPACE}
|
||||
spec:
|
||||
interval: 5m
|
||||
path: ./overlays/${TENANT_NAMESPACE}
|
||||
prune: true
|
||||
sourceRef:
|
||||
kind: GitRepository
|
||||
name: my-app-repo
|
||||
```
|
||||
If the tenant is my-app-dev then it will target the folder `./overlays/my-app-dev`
|
||||
|
||||
## Overlays Structure and Patterns
|
||||
|
||||
### Simple Patterns
|
||||
We use the Kustomize overlays pattern to separate environment-specific
|
||||
differences from shared configuration. Given our vanilla tenant folder.
|
||||
|
||||
```shell
|
||||
(venv) euler@HAL:~/.../tenants/tenant-tpl(main)$ tree
|
||||
.
|
||||
├── config
|
||||
│ ├── app
|
||||
│ │ └── limits-ranges.yaml
|
||||
│ └── ks.yaml
|
||||
├── echo-server
|
||||
│ ├── app
|
||||
│ │ └── helmrelease.yaml
|
||||
│ └── ks.yaml
|
||||
├── kustomization.yaml
|
||||
├── README.md
|
||||
├── renovate.json5
|
||||
├── repos
|
||||
│ ├── helm
|
||||
│ │ └── bjw-s.yaml
|
||||
│ └── ks.yaml
|
||||
├── scripts
|
||||
│ └── rewrap-secrets.sh
|
||||
└── vars
|
||||
├── ks.yaml
|
||||
└── tenant-tpl
|
||||
├── example.yaml
|
||||
└── README.md
|
||||
```
|
||||
I will in this example spawn two namespaces link to that git repository
|
||||
*test-tpl* & *test-tpl-dev*
|
||||
|
||||
Query to check resources from flux perspective.
|
||||
|
||||
```bash
|
||||
$ flux get all -n tenant-tpl
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
gitrepository/tenant-repos main@sha1:0fcffb6b False True stored artifact for revision 'main@sha1:0fcffb6b'
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmrepository/bjw-s False True Helm repository is Ready
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmchart/tenant-tpl-echo-server 3.2.1 False True pulled 'app-template' chart with version '3.2.1'
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmrelease/echo-server 3.2.1 False True Helm install succeeded for release tenant-tpl/echo-server.v1 with chart app-template@3.2.1
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
kustomization/echo-server main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/repos-sync main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/tenant-apps main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/tenant-config main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/vars main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
|
||||
$ flux get all -n tenant-tpl-dev
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
gitrepository/tenant-repos main@sha1:0fcffb6b False True stored artifact for revision 'main@sha1:0fcffb6b'
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmrepository/bjw-s False True Helm repository is Ready
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmchart/tenant-tpl-dev-echo-server 3.2.1 False True pulled 'app-template' chart with version '3.2.1'
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmrelease/echo-server 3.2.1 False True Helm install succeeded for release tenant-tpl-dev/echo-server.v1 with chart app-template@3.2.1
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
kustomization/echo-server main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/repos-sync main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/tenant-apps main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/tenant-config main@sha1:0fcffb6b False True Applied revision: main@sha1:0fcffb6b
|
||||
kustomization/vars False False kustomization path not found: stat /tmp/kustomization-1496015889/vars/tenant-tpl-dev: no such file or directory
|
||||
```
|
||||
|
||||
As you can see they are similar and have both deployed the echo server. However
|
||||
as you can see there is a slight difference with the `kustomzation/vars`. The
|
||||
`dev` environements is complaining about some missing directory. Let's inspect
|
||||
the vars kustomization
|
||||
|
||||
```yaml
|
||||
$ cat vars/ks.yaml
|
||||
---
|
||||
# yaml-language-server: $schema=https://kubernetes-schemas.pages.dev/kustomize.toolkit.fluxcd.io/kustomization_v1.json
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||
kind: Kustomization
|
||||
metadata:
|
||||
name: &app vars
|
||||
namespace: ${TENANT_NAMESPACE}
|
||||
spec:
|
||||
targetNamespace: ${TENANT_NAMESPACE}
|
||||
commonMetadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: *app
|
||||
path: ./vars/${TENANT_NAMESPACE}
|
||||
prune: true
|
||||
sourceRef:
|
||||
kind: GitRepository
|
||||
name: tenant-repos
|
||||
wait: false
|
||||
interval: 10m
|
||||
retryInterval: 1m
|
||||
timeout: 5m
|
||||
|
||||
```
|
||||
As you can see this kustomization is defining a lot of field with the value
|
||||
`${TENANT_NAMESPACE}`. That's because the `/vars` folder is already
|
||||
preconfigured to handle overlays patterns. It will target the right directory
|
||||
according to the namespace name he's running on. If we check our git repository
|
||||
structure:
|
||||
|
||||
```shell
|
||||
(venv) euler@HAL:~/.../tenants/tenant-tpl(main)$ tree vars/
|
||||
vars/
|
||||
├── ks.yaml
|
||||
└── tenant-tpl
|
||||
├── example.yaml
|
||||
└── README.md
|
||||
|
||||
2 directories, 3 files
|
||||
```
|
||||
|
||||
According to the kustomization definition the path:
|
||||
`./vars/${TENANT_NAMESPACE}` will not be found for the tenant `tenant-tpl-dev`
|
||||
We are going to create the appropriate folder.
|
||||
|
||||
```shell
|
||||
$ mkdir vars/tenant-tpl-dev
|
||||
$ cp -r vars/tenant-tpl/example.yaml vars/tenant-tpl
|
||||
tenant-tpl/ tenant-tpl-dev/
|
||||
$ cp -r vars/tenant-tpl/example.yaml vars/tenant-tpl-dev/dev-example.yaml
|
||||
$ vim vars/tenant-tpl-dev/dev-example.yaml
|
||||
$ cat vars/tenant-tpl-dev/dev-example.yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: example-vars-dev
|
||||
data:
|
||||
EXAMPLE: foo-dev
|
||||
$ git commit -am 'Adding dev vars folder'
|
||||
[main 07a29a5] Adding dev vars folder
|
||||
1 file changed, 7 insertions(+)
|
||||
create mode 100644 vars/tenant-tpl-dev/dev-example.yaml
|
||||
$ git push
|
||||
Enumerating objects: 7, done.
|
||||
Counting objects: 100% (7/7), done.
|
||||
Delta compression using up to 22 threads
|
||||
Compressing objects: 100% (4/4), done.
|
||||
Writing objects: 100% (5/5), 1.16 KiB | 1.16 MiB/s, done.
|
||||
Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
|
||||
To ssh://git-ssh.kvant.cloud:2222/phoenix-oss/tenant-tpl.git
|
||||
0fcffb6..07a29a5 main -> main
|
||||
```
|
||||
Verification
|
||||
|
||||
```shell
|
||||
$ flux reconcile ks vars -n tenant-tpl-dev --with-source #One liner to force source update and reconciliation
|
||||
► annotating GitRepository tenant-repos in tenant-tpl-dev namespace
|
||||
✔ GitRepository annotated
|
||||
◎ waiting for GitRepository reconciliation
|
||||
✔ fetched revision main@sha1:07a29a5d22eae9be68fd9d9da141b3fa83f9f5d2
|
||||
► annotating Kustomization vars in tenant-tpl-dev namespace
|
||||
✔ Kustomization annotated
|
||||
◎ waiting for Kustomization reconciliation
|
||||
✔ applied revision main@sha1:07a29a5d22eae9be68fd9d9da141b3fa83f9f5d2
|
||||
|
||||
$ flux get all -n tenant-tpl-dev
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
gitrepository/tenant-repos main@sha1:07a29a5d False True stored artifact for revision 'main@sha1:07a29a5d'
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmrepository/bjw-s False True Helm repository is Ready
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmchart/tenant-tpl-dev-echo-server 3.2.1 False True pulled 'app-template' chart with version '3.2.1'
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
helmrelease/echo-server 3.2.1 False True Helm install succeeded for release tenant-tpl-dev/echo-server.v1 with chart app-template@3.2.1
|
||||
|
||||
NAME REVISION SUSPENDED READY MESSAGE
|
||||
kustomization/echo-server main@sha1:07a29a5d False True Applied revision: main@sha1:07a29a5d
|
||||
kustomization/repos-sync main@sha1:07a29a5d False True Applied revision: main@sha1:07a29a5d
|
||||
kustomization/tenant-apps main@sha1:07a29a5d False True Applied revision: main@sha1:07a29a5d
|
||||
kustomization/tenant-config main@sha1:07a29a5d False True Applied revision: main@sha1:07a29a5d
|
||||
kustomization/vars main@sha1:07a29a5d False True Applied revision: main@sha1:07a29a5d
|
||||
|
||||
$ oc get configmap -n tenant-tpl-dev
|
||||
NAME DATA AGE
|
||||
example-vars-dev 1 3m32s
|
||||
kube-root-ca.crt 1 36m
|
||||
openshift-service-ca.crt 1 36m
|
||||
tenant-settings 10 36m
|
||||
```
|
||||
|
||||
Congratulations you now manage to handle simple overlays patterns and have the
|
||||
possibility to handle multiple environments using one git repository.
|
||||
|
||||
|
||||
### Advanced Patterns
|
||||
|
||||
#### Base
|
||||
|
||||
In the previous example we showed to you how to handle configmaps or secrets
|
||||
to be loaded for a given environments. In this example we are going to create a
|
||||
directory structure that allow us to *Have shared resources definition and
|
||||
environments specific one.
|
||||
|
||||
Taking back our echo-server example.
|
||||
|
||||
XXX
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue