Domaines sur une App
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 :
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.
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 :
| Message | Ce qui manque | Que faire |
|---|---|---|
en attente de la zone DNS du domaine <nom> : aucune zone déclarée ne le couvre | le 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 attendue | le TXT de vérification | poser l'enregistrement chez votre registraire |
en attente de la zone DNS <zone> (état Verified) : création de la zone en cours | la zone est en cours de création | attendre |
en attente de la zone DNS <zone> (état Lost ou Rejected) : la zone doit être rétablie | la zone a été perdue ou refusée | ré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
| Situation | Moment | Message ou reason |
|---|---|---|
| domaine de la zone d'un autre client, ou domaine de la plateforme | sng apply | ingress.domain "…" : réservé à la plateforme ou à un autre client |
| apex de la zone par défaut | sng apply | ingress.domain "acme.dev.stackngo.app" : apex de la zone du tenant, choisir un nom dessous |
nom réservé (_acme-challenge, _stackngo-verify, extdns-*) | sng apply | ingress.domain "…" : label "…" réservé à la plateforme |
status.<tenant>.dev.stackngo.app | sng apply | ingress.domain "…" : réservé aux status pages de la plateforme |
domaine de la plateforme (stackngo.fr, stackngo.app) déclaré dans une App | statut du service | Failed, DomainNotAllowed (refus définitif) |
domaine apporté dont la zone n'est pas encore prête, ou zone Lost | statut du service | Waiting, WaitingForDNSZone (attente, voir plus haut) |
| nom servi par un autre tenant ou une autre App sur le même chemin | statut du service | Failed, HostConflict |
nom déjà publié par un enregistrement (DNSRecord) | statut du service | Failed, DNSConflict |
| certificat pas encore émis | statut du service | Progressing, CertificatePending |
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
Lostretire 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,pathdiffé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.