Aller au contenu principal

Domaines sur une App

Bêta

Fonctionnalité en cours de déploiement. L'interface décrite ici est celle de la prochaine livraison : elle peut encore évoluer, et n'est pas forcément activée sur votre tenant.

Les noms à plusieurs niveaux et les domaines apportés sont activés progressivement sur les tenants.

Le champ ingress.domain d'un service choisit le nom d'hôte sous lequel il répond en HTTPS. La plateforme publie ce nom dans le DNS et obtient son certificat : vous n'écrivez ni enregistrement, ni configuration TLS.

Prérequis​

  • Une App avec un service exposé (ingress). Voir Exposition et domaines.
  • Pour un domaine à vous : rien à faire avant le déploiement. Vous pouvez déclarer le domaine alors que sa vérification n'est pas terminée : le service attend, puis il est publié seul (Apporter un domaine). Le certificat n'est obtenu qu'une fois la zone Active, c'est-à-dire les serveurs de noms déclarés chez votre registraire.

1. Un nom de votre zone par défaut​

Tout nom sous <tenant>.dev.stackngo.app, à n'importe quelle profondeur :

shop.yml
apiVersion: deploy.stackngo.io/v1alpha1
kind: App
metadata:
name: shop
spec:
services:
web:
image: registry.gitlab.com/acme/shop-web:2.1.0
ports: ["8080"]
ingress:
port: 8080
domain: www.shop.acme.dev.stackngo.app # deux niveaux sous la zone : accepté
sng apply shop.yml

L'apex acme.dev.stackngo.app lui-même est refusé, comme les noms réservés.

2. Un domaine apporté​

L'apex et tout nom dessous sont utilisables. Vous pouvez déclarer exemple.fr avant que sa zone soit prête : le service attend, puis il est servi sans nouvelle commande. L'ordre de vos sng apply n'a pas d'importance.

shop.yml
apiVersion: deploy.stackngo.io/v1alpha1
kind: App
metadata:
name: shop
spec:
services:
web:
image: registry.gitlab.com/acme/shop-web:2.1.0
ports: ["8080"]
ingress: { port: 8080, domain: exemple.fr } # apex du domaine apporté
api:
image: registry.gitlab.com/acme/shop-api:2.1.0
ports: ["8080"]
ingress: { port: 8080, domain: api.exemple.fr }
sng apply shop.yml

Pour servir l'apex et www, déclarez deux services, ou exposez l'App sous l'apex et ajoutez un CNAME www vers ce nom :

sng dns record set www --zone exemple.fr --type CNAME --target exemple.fr

En ligne de commande, sng app create ne prend pas de domaine : sng app create shop --image … --port 8080 --ingress expose sous le nom par défaut ; ajoutez ensuite domain au manifeste (sng kind edit App shop, ou votre fichier puis sng apply).

3. Attendre la publication et le certificat​

sng app describe shop
App : shop
Statut : prête
SERVICE KIND IMAGE PHASE URL DETAIL
api deployment registry.gitlab.com/acme/shop-api:2.1.0 Ready https://api.exemple.fr/ Reconciled 1/1 prêts
web deployment registry.gitlab.com/acme/shop-web:2.1.0 Ready https://exemple.fr/ Reconciled 1/1 prêts

Tant que la zone du domaine n'est pas prête, le service est en phase Waiting avec la raison WaitingForDNSZone. Le message indique ce qui manque, et le nom n'est pas servi pendant l'attente :

MessageCe qui manqueQue faire
en attente de la zone DNS du domaine <nom> : aucune zone déclarée ne le couvrele domaine n'est pas encore déclaréApporter un domaine
en attente de la zone DNS <zone> (état Pending) : preuve de propriété du domaine attenduele TXT de vérificationposer l'enregistrement chez votre registraire
en attente de la zone DNS <zone> (état Verified) : création de la zone en coursla zone est en cours de créationattendre
en attente de la zone DNS <zone> (état Lost ou Rejected) : la zone doit être rétabliela zone a été perdue ou refuséeréactiver la zone

Dès que la zone est prête, le nom est publié et le service passe Ready, sans nouvelle commande. Une zone Provisioned publie le nom ; le certificat est validé par le DNS, il n'est émis qu'une fois la délégation effective (zone Active). Entre les deux, le service reste en Progressing avec la raison CertificatePending (message : certificat en attente : la délégation des serveurs de noms de <zone> n'est pas encore constatée) ; il passe Ready quand le certificat est émis.

Vérification​

dig +short api.exemple.fr
curl -sI https://api.exemple.fr/

Une adresse en réponse, puis HTTP/2 200 avec un certificat Let's Encrypt valide.

Refus et erreurs​

SituationMomentMessage ou reason
domaine de la zone d'un autre client, ou domaine de la plateformesng applyingress.domain "…" : réservé à la plateforme ou à un autre client
apex de la zone par défautsng applyingress.domain "acme.dev.stackngo.app" : apex de la zone du tenant, choisir un nom dessous
nom réservé (_acme-challenge, _stackngo-verify, extdns-*)sng applyingress.domain "…" : label "…" réservé à la plateforme
status.<tenant>.dev.stackngo.appsng applyingress.domain "…" : réservé aux status pages de la plateforme
domaine de la plateforme (stackngo.fr, stackngo.app) déclaré dans une Appstatut du serviceFailed, DomainNotAllowed (refus définitif)
domaine apporté dont la zone n'est pas encore prête, ou zone Loststatut du serviceWaiting, WaitingForDNSZone (attente, voir plus haut)
nom servi par un autre tenant ou une autre App sur le même cheminstatut du serviceFailed, HostConflict
nom déjà publié par un enregistrement (DNSRecord)statut du serviceFailed, DNSConflict
certificat pas encore émisstatut du serviceProgressing, CertificatePending
Nom déjà pris par un enregistrement

Si un enregistrement (DNSRecord) publie déjà le même nom (type A, AAAA ou CNAME), le premier arrivé garde le nom : l'App est déployée mais son nom n'est pas publié, et le service passe Failed avec la raison DNSConflict (Le nom de domaine … est déjà utilisé : l'App n'est pas joignable à cette adresse tant qu'il n'est pas libéré). Supprimez l'enregistrement : le nom de l'App est publié dans la minute et le service se rétablit.

Pour aller plus loin​

  • Une zone qui passe Lost retire la publication de tous ses noms. Les services qui s'y trouvent ne sont plus servis : ils passent en attente (Waiting, WaitingForDNSZone) jusqu'à la réactivation, puis reprennent seuls.
  • Un domaine apporté se partage par chemin entre plusieurs Apps du tenant, comme un nom de la zone par défaut : même domain, path différents.
  • La publication suit l'exposition : retirer ingress (ou supprimer l'App) retire le nom du DNS.
  • Les sites statiques (CDNSite) n'acceptent pas encore de domaine apporté, seulement la zone par défaut : voir Publier un site.

Voir aussi​