Aller au contenu principal

Kubernetes (Helm)

Le chart Helm rikoo déploie l'api, le worker, le sidecar d'analyse de documents et le bac à sable des outils sur un cluster, avec PostgreSQL, Redis et le stockage objet soit intégrés au chart, soit remplacés par des services managés. Les migrations de schéma s'exécutent dans un Job à l'installation et avant chaque mise à jour.

Le chart se trouve dans un dépôt public, Rikoo-app/rikoo-k8s, sous licence MIT. Les images de conteneur qu'il déploie sont dans un registre privé : il vous faut l'adresse du registre et des identifiants fournis par l'équipe Rikoo (voir la Vue d'ensemble).

Prérequis​

  • Kubernetes 1.27 ou ultérieur, et Helm 3.14 ou ultérieur.
  • Un plugin réseau qui applique les NetworkPolicies, comme Cilium ou Calico. Le bac à sable s'appuie sur elles pour couper son accès au réseau, voir Isolation du bac à sable.
  • Une StorageClass par défaut, si vous gardez les stockages intégrés : ils demandent 20 Gio pour PostgreSQL, 8 Gio pour Redis et 50 Gio pour MinIO.
  • Pour une adresse publique : un contrôleur d'ingress et cert-manager, ou leurs équivalents.
  • Capacité : avec les valeurs par défaut, les pods demandent environ 2,2 vCPU et 4 Gio de mémoire, et leurs limites de mémoire totalisent environ 11 Gio.

Installation​

Les étapes suivent le dossier examples/minimal-installation du dépôt du chart : tous les stockages intégrés, et tous les identifiants dans un seul Secret créé au préalable.

1. Récupérer le chart​

git clone https://github.com/Rikoo-app/rikoo-k8s.git
cd rikoo-k8s/examples/minimal-installation
helm dependency update ../../charts/rikoo

2. Créer le namespace et le secret du registre​

kubectl create namespace rikoo
kubectl -n rikoo create secret docker-registry rikoo-registry \
--docker-server=<registry> --docker-username=<user> --docker-password=<token>

3. Créer le secret de l'application​

Générez la paire de clés de scellement du coffre. Le chart ne la génère jamais, et perdre la clé privée rend illisibles tous les secrets stockés.

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out sealing.private
openssl pkey -in sealing.private -pubout -out sealing.public

Modifiez ensuite secret.yaml et remplacez chaque valeur à compléter :

CléValeur
widget-signing-key, totp-key, sandbox-token-secretDes chaînes aléatoires d'au moins 32 caractères, produites par exemple par openssl rand -hex 24
sealing.pub, sealing.keyLe contenu de sealing.public et de sealing.private
POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DBLes identifiants du PostgreSQL intégré
rootUser, rootPasswordLes identifiants du MinIO intégré
kubectl -n rikoo apply -f secret.yaml

Dans un pipeline GitOps, produisez ce Secret avec un opérateur de secrets externes au lieu de le versionner.

4. Installer le chart​

helm install rikoo ../../charts/rikoo -n rikoo -f values.yaml \
--set rikoo.image.registry=<registry>/<namespace> \
--set rikoo.image.tag=v0.2.0

rikoo.image.registry et rikoo.image.tag sont tous deux obligatoires : sans eux, le chart refuse de produire ses manifestes.

5. Vérifier​

kubectl -n rikoo get pods
kubectl -n rikoo port-forward svc/rikoo-api 3000:http
curl -fsS http://localhost:3000/api/v1/health

Ouvrez http://localhost:3000 et créez le premier compte : tant qu'aucune organisation n'existe, il peut s'inscrire et devient Propriétaire de la première organisation.

Exposer l'instance​

La surcouche with-ingress.yaml du même dossier ajoute un ingress avec TLS, en supposant ingress-nginx, cert-manager et un ClusterIssuer nommé letsencrypt. Remplacez ses hôtes d'exemple, rikoo.example.com et s3.rikoo.example.com, par les vôtres. Cette surcouche, en outre :

  • fixe rikoo.publicUrl à l'adresse publique et rikoo.trustProxyHops à 1, puisque le contrôleur d'ingress est un proxy placé devant l'api ;
  • donne au MinIO intégré une route publique, car les navigateurs envoient les pièces jointes directement au stockage objet, à l'adresse indiquée dans s3.browserEndpoint ;
  • désactive la mise en mémoire tampon du proxy et porte les délais d'expiration à une heure, car les réponses arrivent en flux, sous forme de server-sent events. Avec un autre contrôleur d'ingress, appliquez les mêmes réglages.
helm upgrade --install rikoo ../../charts/rikoo -n rikoo \
-f values.yaml -f with-ingress.yaml \
--set rikoo.image.registry=<registry>/<namespace> --set rikoo.image.tag=v0.2.0

Utiliser des stockages managés​

Chaque stockage intégré peut être remplacé par un service managé. Le dossier examples/external-components contient une surcouche par stockage.

StockageValeursExigences
PostgreSQLpostgresql.deploy: false, puis postgresql.url, ou host, port et auth.*Les extensions vector (pgvector) et citext. Le rôle qui exécute les migrations doit avoir le droit de créer des extensions et des rôles.
Redisredis.deploy: false, puis redis.url, ou host, port et databasemaxmemory-policy noeviction : évincer une clé fait perdre des jobs en file d'attente.
Stockage objets3.deploy: false, puis endpoint, browserEndpoint, region, bucket, forcePathStyle et la paire de clésN'importe quel service compatible S3.

Pour que la sécurité au niveau des lignes (RLS) de PostgreSQL filtre les requêtes sur les données des organisations, donnez à l'application un second rôle, non propriétaire, via postgresql.appUrl. Sans lui, ces requêtes passent par la connexion du propriétaire.

Configurer​

Le chart définit ce qu'il peut à partir de ses propres valeurs. Tout autre réglage du produit va dans un dictionnaire contrôlé : rikoo.settings (lu par l'api et le worker), rikoo.api.settings ou rikoo.worker.settings. Le chart confronte chaque nom à la liste des variables que lit le produit, et refuse de produire ses manifestes pour un nom que le produit ne connaît pas, un secret écrit en clair ou une valeur au mauvais format.

La liste complète des variables, avec leur format et le service qui les lit, se trouve dans charts/rikoo/VARIABLES.md.

Édition Enterprise​

Déployez les images Enterprise (demandez le tag avec votre licence), puis stockez la licence dans un Secret et faites-y pointer rikoo.license.deploymentLicense :

kubectl -n rikoo create secret generic rikoo-license \
--from-literal=RIKOO_DEPLOYMENT_LICENSE='<license>'
rikoo:
license:
deploymentLicense:
secretKeyRef:
name: rikoo-license
key: RIKOO_DEPLOYMENT_LICENSE

Voir Licence Enterprise pour ce que débloque la licence.

Isolation du bac à sable​

Les outils embarqués s'exécutent dans les pods mcp-sandbox, confinés par trois NetworkPolicies : l'espace de travail ne joint que le navigateur, le navigateur ne sort que par le proxy mcp-egress, qui applique la même garde anti-SSRF que le worker, et l'api n'en joint aucun. Le conteneur de l'espace de travail abandonne toutes les capabilities sauf les quatre dont il a besoin pour prendre l'identité système de la conversation (SETUID, SETGID, CHOWN, DAC_OVERRIDE), avec un système de fichiers racine en lecture seule et le profil seccomp RuntimeDefault.

Les NetworkPolicies ne sont appliquées que par un plugin réseau qui les prend en charge. Sur un cluster qui n'en a pas, l'espace de travail du bac à sable peut joindre le réseau : installez un tel plugin, ou désactivez le bac à sable avec rikoo.sandbox.enabled: false. Les exécutions fonctionnent toujours sans lui, et les outils embarqués renvoient une erreur.

La pile Docker Compose ajoute un profil seccomp dédié et prend en charge gVisor. Le chart ne propose encore ni l'un ni l'autre.

Mise à jour​

Sauvegardez la base de données, puis relancez la même commande avec le nouveau tag :

helm upgrade --install rikoo ../../charts/rikoo -n rikoo -f values.yaml \
--set rikoo.image.registry=<registry>/<namespace> --set rikoo.image.tag=<new tag>

Le Job de migration s'exécute avant les nouveaux pods. S'il échoue, la nouvelle version n'est pas déployée : consultez kubectl -n rikoo logs job/rikoo-migrations. helm rollback revient aux images précédentes mais n'annule pas les migrations. Restaurez la sauvegarde de la base quand une version doit être annulée.

Désinstallation​

helm uninstall rikoo -n rikoo

Le chart conserve ce qui ne peut pas être recréé : ses Secrets portent l'annotation helm.sh/resource-policy: keep, et le volume du PostgreSQL intégré est conservé. Supprimez-les à la main, avec le namespace, seulement si vous acceptez de perdre les données.

Essayer sur un ordinateur portable​

Le dossier examples/local-kind fait tourner le chart sur un cluster kind local, avec des images construites depuis le dépôt source de Rikoo. Son README détaille les étapes et inclut une vérification que le réseau du bac à sable est réellement coupé.