Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Plusieurs instances

Les instances d’un deploiement se trouvent et se parlent sur un port a elles, en TLS 1.3 dans les deux sens, admises par le certificat qu’elles partagent. Le chart Kubernetes pose tout cela des que replicaCount depasse 1.

[cluster]
listen = "0.0.0.0:8083"
peers = "dns:craft-file-gate-cluster:8083"
cert_file = "/var/lib/craft-file-gate/cluster/tls.crt"
key_file = "/var/lib/craft-file-gate/cluster/tls.key"

Toutes les cles : Reference [cluster].

Le certificat partage

Son empreinte SHA-256 est l’identite du cluster : ni nom ni date ne sont verifies, l’expiration est dite par craftfilegate_cluster_cert_not_after_seconds. Pour le changer, retirez la paire et redemarrez toutes les instances ; pendant le roulement, un pair a l’ancien certificat est certificate_mismatch.

kubectl patch secret sftp-cluster --type=json \
  -p '[{"op":"remove","path":"/data/tls.crt"},{"op":"remove","path":"/data/tls.key"}]'
kubectl rollout restart deployment/sftp

Detecteurs et retrait du service

Apres chaque tour, chaque instance juge trois detecteurs : storage_alone (un backend down ici qu’un pair joignable voit up : une panne que tous voient ne compte pas), isolated (moins de min_peers pairs joignables depuis isolated_after_secs) et isolated_and_storage_down (isolee, et chaque backend non local down ici ; un backend local, le disque du pod, ne compte pas : sans backend non local, il ne se declenche jamais). Par defaut ils alertent seulement : WARN cluster detector active, craftfilegate_unready_detector{detector}, craftfilegate_cluster_isolated, checks.cluster de /admin/health.

Nommes dans unready_when, ils retirent l’instance du service : /readyz non pret apres unready_after_secs d’un detecteur actif, pret de nouveau apres ready_after_secs sans aucun ; /livez ne bouge pas. storage_alone ne retire un pod que si un autre pod, en service et sans aucun backend en panne, voit chacun de ses backends en panne disponible, et un seul pod a la fois : si chaque pod a une panne quelque part, aucun ne part.

[cluster]
min_peers = 1                    # le chart : floor(replicaCount / 2)
unready_when = ["storage_alone", "isolated_and_storage_down"]  # le chart : auto

isolated seul peut retirer chaque pod : coupure du port du cluster, perte d’une majorite de noeuds, partage en deux moities egales, reduction manuelle du nombre de replicas. Ne le nommez qu’en connaissance de cause, et ne descendez jamais sous 2 × min_peers + 1 replicas sans helm upgrade.

Avec les defauts, une panne de stockage est vue en 35 s au pire, le retrait suit 60 s plus tard, et Kubernetes sort le pod du Service apres 3 sondes de readiness a 10 s : environ 2 min.

Ce que vous verrez

Au demarrage, INFO cluster channel listening (TLS 1.3, pinned on the shared certificate) ; a chaque pair qui repond, INFO cluster peer reachable ; par statut : craftfilegate_cluster_peers{status}. Les onglets Instances, Sessions et Bans de la console lisent chaque pair avec votre credential, qu’il juge lui-meme (scope=cluster) ; un kick va au seul pair qui tient la session, une levee a chaque pair, sauf sur une liste ConfigMap ; par appel : craftfilegate_cluster_relay_total{route,result}.

Un ban y est un garde contre les essais, pas un retrait d’acces : une adresse bannie sur un pair le lit encore a travers une autre instance avec une credential valide (une session revoquee reste refusee).