Skip to main content

Bootstrap

El nivell 0 instal·la Flux i el que necessiten tots els altres nivells. És l'únic punt amb passos manuals.

Requisits​

brew install helm kubectl fluxcd/tap/flux sops age

Accés d'administrador al clúster (el kubeconfig que lliura l'stack de Kubernetes) i una CNI funcionant. L'stack ja deixa Calico instal·lat.

Flux Operator​

Flux s'instal·la amb el Flux Operator: l'operador és un Helm release, i Flux es descriu amb un recurs FluxInstance que l'operador converteix en els controladors de Flux i manté actualitzat.

helm install flux-operator oci://ghcr.io/controlplaneio-fluxcd/charts/flux-operator \
--version 0.61.0 \
--namespace flux-system --create-namespace \
--wait
helm list -n flux-system # flux-operator, deployed
kubectl -n flux-system get pods # flux-operator-... 1/1 Running

Un cop connectat, FluxCD adopta aquest mateix Helm release (mateix nom i namespace) i l'actualitza des del repositori com qualsevol altre component.

Secrets amb SOPS​

Els secrets es guarden al repositori xifrats amb SOPS i una clau age per entorn. Flux els desxifra dins del clúster.

compte

El repositori és públic. Pujar un fitxer sense xifrar no té fàcil solució: Git el recordarà per sempre.

Generar la clau de l'entorn i desar-la al clúster (la clau del secret ha d'acabar en .agekey):

age-keygen -o testing.agekey
# Public key: age1...

kubectl -n flux-system create secret generic sops-age \
--from-file=age.agekey=testing.agekey

La clau privada només ha d'existir al clúster i en un magatzem segur. Per editar secrets des de l'equip, també s'afegeix on la busca SOPS:

mkdir -p "$HOME/Library/Application Support/sops/age"
cat testing.agekey >> "$HOME/Library/Application Support/sops/age/keys.txt"
rm testing.agekey

La clau pública va a .sops.yaml, a la regla del seu entorn. Amb ella, sops tria la clau segons la ruta del fitxer i xifra únicament data i stringData:

creation_rules:
- path_regex: ^(clusters|infrastructure|apps)/testing/.*\.yaml$
encrypted_regex: ^(data|stringData)$
age: age1...

Treballar amb secrets:

sops <fitxer> # crear o editar; el text pla no toca mai el disc
sops -e -i <fitxer> # xifrar un fitxer existent
sops -d <fitxer> # llegir-lo

Un fitxer està llest per pujar quan els seus valors comencen per ENC[AES256_GCM, i acaba amb un bloc sops:.

Notificacions a Slack​

Flux informa a Slack del que canvia i del que falla: recursos creats o modificats, instal·lacions i actualitzacions de Helm, actualitzacions del mateix Flux i qualsevol error. Els esdeveniments rutinaris es descarten.

A l'app de Slack, a Incoming Webhooks, crear un webhook per al canal de l'entorn i desar-lo xifrat:

sops infrastructure/testing/00-bootstrap/configs/slack-token.yaml
apiVersion: v1
kind: Secret
metadata:
name: slack-token
namespace: flux-system
stringData:
address: https://hooks.slack.com/services/...
perill

La URL del webhook és una credencial: qualsevol que la tingui pot escriure al canal.

Connectar el clúster​

Tota la connexió és un fitxer, clusters/<entorn>/flux-instance.yaml. Defineix la versió de Flux, els seus controladors i, al bloc sync, quin repositori, branca i carpeta segueix el clúster:

apiVersion: fluxcd.controlplane.io/v1
kind: FluxInstance
metadata:
name: flux
namespace: flux-system
spec:
distribution:
version: "2.9.x"
registry: ghcr.io/fluxcd
components:
- source-controller
- kustomize-controller
- helm-controller
- notification-controller
cluster:
type: kubernetes
networkPolicy: true
sync:
kind: GitRepository
url: https://gitlab.com/reiizumi/fluxcd-thor-network.git
ref: refs/heads/main
path: clusters/testing
interval: 168h

S'aplica una única vegada a mà. És el moment en què el clúster queda lligat al repositori:

kubectl apply -f clusters/testing/flux-instance.yaml
kubectl -n flux-system wait fluxinstance/flux --for=condition=Ready --timeout=5m

L'operador desplega els controladors de Flux i crea un GitRepository i una Kustomization que apliquen tot el que hi ha a la ruta. Com que el mateix flux-instance.yaml és en aquesta ruta, a partir d'aquí Flux llegeix la seva pròpia definició de Git: canviar Flux és un commit, no una ordre.

info

Flux només necessita accés de lectura. El repositori és públic, així que es clona de forma anònima per HTTPS: no hi ha cap token per crear, desar ni rotar, ni res a configurar a GitLab. Si el repositori passés a ser privat, n'hi hauria prou amb un deploy token amb l'scope read_repository referenciat com a pullSecret al bloc sync.

Validar:

kubectl -n flux-system get fluxinstance # flux True Reconciliation finished
flux check # all checks passed
flux get sources git -n flux-system # main@sha1:<últim commit>
flux get kustomizations -n flux-system # Applied revision: main@sha1:<últim commit>

Flux revisa el repositori cada 7 dies. Per aplicar un canvi al moment:

flux reconcile kustomization flux-system --with-source

Actualitzacions​

  • Flux: els pegats de 2.9.x els aplica l'operador automàticament. Una versió menor és un canvi a spec.distribution.version del flux-instance.yaml.
  • Flux Operator: els pegats de 0.61.x són automàtics. Una versió menor és un canvi al seu repository.yaml.

Rotació​

  • Webhook: crear-ne un de nou a Slack, substituir address amb sops, pujar-ho i esborrar l'antic.
  • Clau age: generar-ne una de nova, canviar la pública a .sops.yaml, executar sops updatekeys a cada secret de l'entorn, pujar-ho i substituir el secret sops-age. El que s'ha xifrat abans continua llegible amb la clau antiga a l'historial, així que, si una clau es compromet, cal rotar també les credencials.