Aller au contenu principal

RegistryAccessKey

Disponible

Fonctionnalité déployée et prise en charge. Les champs et commandes décrits ici sont stables au sein de la version v1alpha1.

apiVersionregistry.stackngo.io/v1alpha1
kindRegistryAccessKey
Appliqué parsng apply
Commandes liéessng apply, sng kind list RegistryAccessKey, sng kind delete RegistryAccessKey NAME, sng template gen RegistryAccessKey, sng registry access-key credentials NAME

À quoi ça sert​

Une RegistryAccessKey est une clé d'accès au registre de votre tenant : un identifiant machine avec un nom d'utilisateur fixe, accesskey/<tenant>/<nom>, et un secret généré par la plateforme, écrit dans un Secret de type docker-registry (clé .dockerconfigjson) de votre tenant. Ce Secret s'utilise tel quel en imagePullSecrets d'une App. Avec ci: true, ses clés username / password peuvent aussi être lues dans les variables d'environnement d'une application du tenant (un job de CI qui pousse des images, par exemple). Une clé ne peut que pull et/ou push, uniquement sur les dépôts listés, et jamais supprimer.

Exemple minimal​

puller.yml
apiVersion: registry.stackngo.io/v1alpha1
kind: RegistryAccessKey
metadata:
name: puller
spec:
repositories: ["*"]
actions: [pull]
sng apply puller.yml

Résultat : un Secret puller-registry, à référencer dans spec.imagePullSecrets d'une App.

Exemple complet commenté​

ci.yml
apiVersion: registry.stackngo.io/v1alpha1
kind: RegistryAccessKey
metadata:
name: ci # identifiant : accesskey/<tenant>/ci
spec:
repositories: [web, api] # noms de RegistryRepository du tenant (1 à 64), ou "*" pour tous
actions: [pull, push] # pull et/ou push ; delete n'existe pas pour une clé
ci: true # lisible dans env/envFrom d'une App ; défaut false : tirage seul
rotateEveryDays: 90 # nouveau secret tous les 90 jours (0 à 365 ; 0 = jamais, défaut)
graceHours: 48 # l'ancien secret reste accepté 48 h après un renouvellement (0 à 720 ; 0 ou absent = 24 h)
secretName: ci-registry-creds # nom du Secret produit ; défaut : <nom>-registry

Champs​

Règles de validation croisées​

Le schéma refuse, dès sng apply :

  • repositories vide ou de plus de 64 entrées ; chaque entrée est * ou un nom de dépôt valide (^[a-z0-9]+([._-][a-z0-9]+)*$) ;
  • actions vide, de plus de 2 entrées, ou contenant autre chose que pull et push ;
  • rotateEveryDays hors de 0 à 365 ; graceHours hors de 0 à 720 ; secretName de plus de 253 caractères ;
  • une autre clé que name dans metadata (label, annotation).

Une App qui cite le Secret d'une clé dans env ou envFrom est refusée à l'application tant que la clé n'a pas ci: true. En imagePullSecrets, le Secret s'utilise dans tous les cas.

Une rotation immédiate ne passe pas par le manifeste : utilisez sng registry access-key rotate NAME ou la console.

Un nom de dépôt listé mais non déclaré n'est pas une erreur : la clé n'y a simplement aucun accès tant que le RegistryRepository n'existe pas.

RegistryAccessKey​

RegistryAccessKey est une clé d'accès au registre, limitée aux dépôts de votre espace. La plateforme crée dans votre espace un secret d'authentification au registre (format docker config, utilisateur accesskey/<espace>/<nom>), utilisable par vos services pour tirer leurs images. Le statut n'affiche que l'empreinte SHA-256 du secret, jamais sa valeur.

ChampDescriptionDéfautValidation
apiVersion stringregistry.stackngo.io/v1alpha1
kind stringRegistryAccessKey
metadata ObjectMetaSeul metadata.name est à renseigner (nom de la ressource dans votre tenant).
spec RegistryAccessKeySpec
status RegistryAccessKeyStatus

RegistryAccessKeySpec​

RegistryAccessKeySpec décrit les droits et le renouvellement de la clé d'accès.

ChampDescriptionDéfautValidation
repositories string arrayRepositories : noms des RegistryRepository de votre espace accessibles avec cette clé, ou "*"
pour tous.
MaxItems: 64
MinItems: 1
items:Pattern: ^(\*|[a-z0-9]+([._-][a-z0-9]+)*)$
actions AccessKeyAction arrayActions accordées sur ces dépôts : pull, push, ou les deux.Enum: [pull push]
MaxItems: 2
MinItems: 1
rotateEveryDays integerRotateEveryDays renouvelle le secret tous les N jours (0 à 365) ; 0 désactive le
renouvellement automatique.
Maximum: 365
Minimum: 0
Optional: {}
graceHours integerGraceHours est la durée, en heures, pendant laquelle l'identifiant précédent reste
valide après un renouvellement, pour ne pas couper les jobs qui l'utilisent encore.
0 : valeur par défaut de la plateforme (24 heures).
Maximum: 720
Minimum: 0
Optional: {}
secretName stringSecretName est le nom du secret créé dans votre espace (défaut : <nom>-registry).MaxLength: 253
Optional: {}
ci booleanCI autorise une application de votre espace à lire les identifiants de cette clé dans
ses variables d'environnement (typiquement un job de CI qui pousse des images). Sans ce
champ, les identifiants ne servent qu'aux tirages d'images (imagePullSecrets).
falseOptional: {}

RegistryAccessKeyStatus​

RegistryAccessKeyStatus est l'état de la clé d'accès constaté par la plateforme.

ChampDescriptionDéfautValidation
observedGeneration integerObservedGeneration est la dernière version du manifeste prise en compte.
conditions Condition arrayConditions : Ready (ressource prête), Synced (registre à jour), Deleting (suppression en cours).
username stringUsername est l'identifiant de connexion au registre : accesskey/<espace>/<nom>.
secretName stringSecretName est le nom du secret qui contient l'identifiant.
secretSHA256 stringSecretSHA256 est l'empreinte SHA-256 (hexadécimale) du secret courant, jamais sa valeur.
previousSecretSHA256 stringPreviousSecretSHA256 est l'empreinte de l'ancien secret, qui reste valide jusqu'à
PreviousValidUntil pour que les téléchargements en cours survivent à un renouvellement.
previousValidUntil TimePreviousValidUntil est la fin de validité de l'ancien secret.
lastRotationTime TimeLastRotationTime est la date d'émission du secret courant.
rotationToken stringRotationToken est réservé à la plateforme (renouvellement à la demande, pas encore
disponible).

AccessKeyAction​

Type sous-jacent : string

AccessKeyAction est une action accordée à une clé d'accès : pull ou push. La suppression est réservée aux utilisateurs.

Règles de validation :

  • Enum: [pull push]
ValeurDescription
pullTélécharger des images du dépôt.
pushPublier des images dans le dépôt.

Statut et conditions​

Le status ne contient jamais le secret, seulement son empreinte SHA-256.

ChampContenu
usernameaccesskey/<tenant>/<nom>, à présenter au registre
secretNamenom du Secret produit
secretSHA256empreinte du secret courant
previousSecretSHA256, previousValidUntilempreinte de l'ancien secret et fin de sa période de grâce (graceHours heures après la rotation, 24 h par défaut)
lastRotationTimedate de la dernière émission d'un secret
ConditionTrue quandFalse quand
Readyle secret est émis et le Secret à jour (raison Reconciled)un Secret du même nom existe et n'appartient pas à la clé (SecretOwnershipConflict)
Syncedposée à True avec Ready—
reasonExplicationAction
ReconciledSecret à jour—
SecretOwnershipConflictUn Secret nommé comme secretName (ou <nom>-registry) existe déjà et n'a pas été créé par cette clé ; il n'est pas écraséChanger spec.secretName, ou supprimer l'ancien Secret

Dans cette version, sng kind get RegistryAccessKey ci affiche le manifeste enregistré, sans le status : l'état d'une clé n'est pas encore lisible avec la CLI. Ses identifiants courants le sont, pour un administrateur du tenant : sng registry access-key credentials ci [--show-password] (référence).

Ce qui se passe à l'application​

Création. Un secret aléatoire de 256 bits est émis et écrit dans le Secret <nom>-registry de votre tenant, avec les clés .dockerconfigjson, username et password.

Rotation. Un nouveau secret est émis :

DéclencheurPériode de grâce de l'ancien secret
rotateEveryDays échu depuis lastRotationTimegraceHours (24 h par défaut)
Secret modifié ou altéré à la maingraceHours (24 h par défaut)
Secret supprimé à la mainaucune (plus personne ne détient l'ancien)

La période de grâce laisse aux jobs et aux tirages qui utilisent encore l'ancien secret le temps de se terminer ou d'être mis à jour : allongez graceHours si une copie du secret (une variable de CI, par exemple) n'est mise à jour qu'à la main.

Le Secret est mis à jour en place : les App qui le référencent utilisent le nouveau secret au prochain tirage d'image, sans redéploiement.

Mise à jour. Changer repositories, actions ou graceHours prend effet en quelques secondes, sans nouveau secret (une nouvelle graceHours vaut pour les renouvellements suivants). Abaisser rotateEveryDays sous l'âge du secret courant déclenche une rotation immédiate. Changer secretName crée un nouveau Secret avec un nouveau secret, sans période de grâce pour l'ancien.

Ce qui se passe quand vous supprimez​

sng kind delete RegistryAccessKey ci : la clé cesse d'être acceptée en quelques secondes et son Secret est supprimé avec lui. Les App qui le référencent ne peuvent plus tirer de nouvelle image (les conteneurs déjà démarrés continuent de tourner).

Erreurs fréquentes​

SymptômeCauseCorrection
sng apply refuse : metadata : seul name est permis (annotations refusé)Annotation (ou label) dans metadataLa retirer ; pour forcer une rotation, sng registry access-key rotate NAME
sng apply refuse une valeur delete dans actionsLes clés d'accès ne suppriment jamaisSupprimer avec une session (sng registry delete)
sng apply refuse une App qui cite le Secret de la clé dans env ou envFromLa clé n'a pas ci: trueAjouter ci: true, ou n'utiliser le Secret qu'en imagePullSecrets
Ready=False, SecretOwnershipConflictNom de Secret déjà prisAutre spec.secretName
docker pull refusé avec le bon secretDépôt hors de repositories, dépôt non déclaré, ou dépôt d'un autre tenantAjouter le dépôt ou "*" ; déclarer le RegistryRepository
Refus après une rotation, une fois la période de grâce passéeUne copie de l'ancien secret (variable CI) n'a pas été mise à jourRecopier le secret courant (sng registry access-key credentials NAME --show-password)

Voir aussi​