Guide · 9 min

Archestack sur Kubernetes, la manière courte

C'est le chemin le plus court vers un cluster que vous faites déjà tourner, AKS ou un autre : Archestack sous un chemin d'un nom d'hôte que son ingress sert déjà, comme https://apps.example.com/archestack/. Cinq fichiers manifestes et un pipeline, sur Azure DevOps, GitHub Actions ou GitLab CI, pas de Helm, et rien à créer en dehors du cluster : PostgreSQL y tourne aussi. Une vraie installation AKS fait tourner exactement ces manifestes, depuis le pipeline Azure DevOps.

Vous voulez des noms d'hôte qui lui sont propres, une base de données managée, plusieurs réplicas de l'API et des mises à jour chaque nuit ? Héberger sur AKS en est la version complète.

Votre système de CI

Ce qui tourne

https://apps.example.com
  /archestack/api, /archestack/hubs  ->  archestack-api       1 pod, with disks for files and backups
  /archestack/...                    ->  archestack-web       2 pods: the builder and the published app
  /archestack-grafana/               ->  archestack-grafana   optional, with Prometheus, Tempo and Loki

archestack-api  ->  archestack-postgres   PostgreSQL 16 on a disk of its own

Le navigateur charge le builder depuis /archestack/ et appelle l'API sur /archestack/api à la même adresse, il n'y a donc ni second nom d'hôte ni configuration cross-origin. Les mises à jour en direct passent par un WebSocket vers /archestack/hubs. L'application publiée se trouve sur /archestack/app/.

Ce qu'il vous faut

  • Un cluster avec ingress-nginx et un nom d'hôte qu'il sert déjà en HTTPS.
  • Un namespace archestack, et une storage class qui fournit des disques, comme le fait celle d'AKS par défaut.
  • Azure DevOps, GitHub ou GitLab, avec le dépôt depuis lequel le pipeline s'exécute. Les runners propres à GitHub et à GitLab atteignent l'API du cluster depuis internet, si bien qu'un cluster privé a besoin d'un runner à vous à l'intérieur de son réseau.

Trois étapes

  1. Décompressez le kit dans votre dépôt sous archestack/.
  2. Mettez en place le pipeline dans votre système de CI, comme l'indique sa section ci-dessous : où va son fichier, et un environnement par environnement Archestack, archestack-dev d'abord, contenant ces cinq valeurs, les trois dernières en secrets :
    HOST                apps.example.com
    ADMIN_EMAIL         you@example.com
    POSTGRES_PASSWORD   secret, set once and never changed
    ADMIN_PASSWORD      secret, the first admin's password
    GRAFANA_PASSWORD    secret, Grafana's user admin
  3. Lancez le pipeline et choisissez l'environnement. Le premier démarrage prend quelques minutes, car l'API crée et migre ses bases de données avant de répondre. Connectez-vous ensuite sur https://<HOST>/archestack/ avec l'e-mail et le mot de passe de l'admin.

Le pipeline

Le kit le contient pour trois systèmes de CI. Chacun suit les trois mêmes étapes : il remplit les manifestes, crée le secret, puis déploie et attend que chaque pod soit prêt.

Votre système de CI

Azure DevOps

  1. Ajoutez archestack/azure-pipelines.yml comme pipeline.
  2. Sous Pipelines, Environments, créez archestack-dev et ajoutez-y le namespace archestack du cluster comme ressource Kubernetes. Créez archestack-tst, -acc et -prd de la même façon quand vous en avez besoin.
  3. Sous Pipelines, Library, créez un groupe de variables du même nom, archestack-dev, contenant les cinq valeurs, les mots de passe en secrets.
# archestack/azure-pipelines.yml: Archestack on a Kubernetes cluster, under /archestack of a hostname the cluster's
# ingress already serves. Run it by hand, pick the environment and the Archestack version.
trigger:
  branches:
    include: [main]
  paths:
    include:
      - archestack/**

parameters:
  - name: environment
    displayName: Environment
    type: string
    default: dev
    values: [dev, tst, acc, prd]
  - name: imageTag
    displayName: Archestack version (image tag)
    type: string
    default: latest
  - name: monitoring
    displayName: Deploy Grafana with Prometheus, Tempo and Loki
    type: boolean
    default: true

variables:
  # One variable group per environment, named archestack-<environment>, holding:
  #   HOST                the hostname the cluster's ingress serves, such as apps.example.com
  #   ADMIN_EMAIL         the first Archestack admin, created on the first start
  #   POSTGRES_PASSWORD   secret; set once, see the note at "Secrets" below
  #   ADMIN_PASSWORD      secret; the first admin's password
  #   GRAFANA_PASSWORD    secret; Grafana's user admin
  - group: archestack-${{ parameters.environment }}
  - name: namespace
    value: archestack
  # The public Docker Hub images of Archestack.
  - name: registry
    value: docker.io/nickpeelman

stages:
  - stage: deploy
    displayName: Deploy ${{ parameters.environment }}
    jobs:
      - deployment: deploy
        displayName: Deploy Archestack
        pool:
          vmImage: ubuntu-latest
        # An Azure DevOps environment with the cluster's namespace added as a Kubernetes resource.
        environment:
          name: archestack-${{ parameters.environment }}
          resourceName: archestack
          resourceType: Kubernetes
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self

                # Only these six names are replaced, so the $(POSTGRES_PASSWORD) the API reads and
                # Grafana's $${...} stay as they are.
                - bash: |
                    set -e
                    if [ -z "$HOST" ] || [ -z "$ADMIN_EMAIL" ]; then
                      echo "##vso[task.logissue type=error]Set HOST and ADMIN_EMAIL in the variable group archestack-${{ parameters.environment }}."
                      exit 1
                    fi
                    mkdir -p "$(Agent.TempDirectory)/manifests"
                    for f in archestack/manifests/*.yml; do
                      envsubst '${NAMESPACE} ${REGISTRY} ${IMAGE_TAG} ${ADMIN_EMAIL} ${HOST} ${MONITORING}' < "$f" > "$(Agent.TempDirectory)/manifests/$(basename "$f")"
                    done
                    if [ "$MONITORING" != "true" ]; then rm "$(Agent.TempDirectory)/manifests/observability.yml"; fi
                  displayName: Fill in the manifests
                  env:
                    NAMESPACE: $(namespace)
                    REGISTRY: $(registry)
                    IMAGE_TAG: ${{ parameters.imageTag }}
                    ADMIN_EMAIL: $(ADMIN_EMAIL)
                    HOST: $(HOST)
                    MONITORING: ${{ lower(parameters.monitoring) }}

                # Secrets. The database password is fixed when PostgreSQL first starts on an empty disk:
                # changing it afterwards does not change it in the database, and the API can no longer
                # connect. The admin password is used only to create the first admin.
                - bash: |
                    set -e
                    for value in "$PG_PASSWORD" "$ADMIN_PASSWORD_VALUE" "$GRAFANA_PASSWORD_VALUE"; do
                      case "$value" in
                        "" | '$('*)
                          echo "##vso[task.logissue type=error]Set the secrets POSTGRES_PASSWORD, ADMIN_PASSWORD and GRAFANA_PASSWORD in the variable group archestack-${{ parameters.environment }}."
                          exit 1
                          ;;
                      esac
                    done
                    kubectl create secret generic archestack-secrets \
                      --from-literal=postgres-password="$PG_PASSWORD" \
                      --from-literal=admin-password="$ADMIN_PASSWORD_VALUE" \
                      --from-literal=grafana-admin-password="$GRAFANA_PASSWORD_VALUE" \
                      -n $(namespace) --dry-run=client -o yaml > "$(Agent.TempDirectory)/manifests/secrets.yml"
                  displayName: Make the secret
                  env:
                    PG_PASSWORD: $(POSTGRES_PASSWORD)
                    ADMIN_PASSWORD_VALUE: $(ADMIN_PASSWORD)
                    GRAFANA_PASSWORD_VALUE: $(GRAFANA_PASSWORD)

                # Waits for every rollout. The API's first start creates and migrates its databases.
                - task: KubernetesManifest@1
                  displayName: Deploy Archestack
                  inputs:
                    action: deploy
                    namespace: $(namespace)
                    rolloutStatusTimeout: 1800
                    manifests: $(Agent.TempDirectory)/manifests/*.yml

                - bash: |
                    echo "Builder:       https://$(HOST)/archestack/"
                    echo "Published app: https://$(HOST)/archestack/app/"
                    echo "Grafana:       https://$(HOST)/archestack-grafana/"
                  displayName: Archestack addresses
  • Fill in the manifests y remplace six noms et rien d'autre, si bien que le mot de passe de la base de données que l'API lit à l'exécution reste une référence au secret.
  • Make the secret fait des trois mots de passe un seul secret Kubernetes. Il arrête l'exécution quand l'un d'eux manque, plutôt que de déployer avec un mot de passe vide.
  • Deploy Archestack applique le dossier et attend que chaque pod soit prêt. Avec monitoring désactivé, Grafana et sa stack sont laissés de côté.

GitHub Actions

  1. Déplacez archestack/github-actions.yml vers .github/workflows/archestack.yml : GitHub n'exécute les workflows que depuis ce dossier.
  2. Sous Settings, Environments, créez archestack-dev, avec HOST et ADMIN_EMAIL comme variables et les trois mots de passe comme secrets, plus le secret KUBECONFIG : ce qu'affiche kubeconfig.sh. Sur un dépôt privé, les environnements nécessitent GitHub Pro, Team ou Enterprise.
  3. Lancez-le sous Actions, Archestack, Run workflow.
# archestack/github-actions.yml: Archestack on a Kubernetes cluster, from GitHub Actions. GitHub runs
# workflows from one folder only: move this file to .github/workflows/archestack.yml. A push to main
# that changes archestack/ deploys to dev; under Actions, Archestack, Run workflow, you pick the
# environment and the Archestack version.
name: Archestack

on:
  push:
    branches: [main]
    paths: ["archestack/**"]
  workflow_dispatch:
    inputs:
      environment:
        description: Environment
        type: choice
        options: [dev, tst, acc, prd]
        default: dev
      imageTag:
        description: Archestack version (image tag)
        default: latest
      monitoring:
        description: Deploy Grafana with Prometheus, Tempo and Loki
        type: boolean
        default: true

permissions:
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    # One GitHub environment per environment, named archestack-<environment>, holding the variables
    #   HOST                the hostname the cluster's ingress serves, such as apps.example.com
    #   ADMIN_EMAIL         the first Archestack admin, created on the first start
    # and the secrets
    #   POSTGRES_PASSWORD   set once: PostgreSQL keeps the password it first started with
    #   ADMIN_PASSWORD      the first admin's password
    #   GRAFANA_PASSWORD    Grafana's user admin
    #   KUBECONFIG          the cluster sign-in archestack/kubeconfig.sh prints
    environment: archestack-${{ inputs.environment || 'dev' }}
    concurrency: archestack-${{ inputs.environment || 'dev' }}    # one rollout per environment at a time
    steps:
      - uses: actions/checkout@v4
      - uses: azure/setup-kubectl@v4
        with:
          version: v1.35.9                                       # within one minor version of the cluster's
      - name: Sign in to the cluster
        run: |
          if [ -z "$KUBECONFIG_FILE" ]; then
            echo "::error::Set the secret KUBECONFIG in the environment archestack-${{ inputs.environment || 'dev' }}."
            exit 1
          fi
          install -m 600 /dev/null "$RUNNER_TEMP/kubeconfig"
          printf '%s\n' "$KUBECONFIG_FILE" > "$RUNNER_TEMP/kubeconfig"
          echo "KUBECONFIG=$RUNNER_TEMP/kubeconfig" >> "$GITHUB_ENV"
        env:
          KUBECONFIG_FILE: ${{ secrets.KUBECONFIG }}
      - name: Deploy Archestack
        run: bash archestack/deploy.sh
        env:
          IMAGE_TAG: ${{ inputs.imageTag || 'latest' }}
          # A push has no inputs, so it deploys with monitoring on.
          MONITORING: ${{ (github.event_name == 'workflow_dispatch' && !inputs.monitoring) && 'false' || 'true' }}
          HOST: ${{ vars.HOST }}
          ADMIN_EMAIL: ${{ vars.ADMIN_EMAIL }}
          POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
          ADMIN_PASSWORD: ${{ secrets.ADMIN_PASSWORD }}
          GRAFANA_PASSWORD: ${{ secrets.GRAFANA_PASSWORD }}
  • Un push sur main qui modifie archestack/ déploie en développement avec les images latest, comme le fait le pipeline Azure DevOps.
  • concurrency empêche deux exécutions de déployer dans un même environnement au même moment.
  • La version de kubectl est fixée. Gardez-la à une version mineure au plus de celle de votre cluster.

GitLab CI

  1. Incluez le fichier du kit depuis le .gitlab-ci.yml propre au dépôt, ou créez-en un qui ne contient que ceci :
    include:
      - local: archestack/gitlab-ci.yml
  2. Sous Settings, CI/CD, Variables, ajoutez les cinq valeurs avec la portée d'environnement archestack-dev, les mots de passe masqués, plus KUBECONFIG de type File : ce qu'affiche kubeconfig.sh. Protégez-les toutes, pour que seules les branches protégées les reçoivent.
  3. Lancez-le sous Build, Pipelines, New pipeline, et choisissez-y l'environnement.
# archestack/gitlab-ci.yml: Archestack on a Kubernetes cluster, from GitLab CI. Include it from the
# repository's own .gitlab-ci.yml (a file holding just these two lines when there is none):
#   include:
#     - local: archestack/gitlab-ci.yml
# A push to the default branch that changes archestack/ deploys to dev; under Build, Pipelines,
# New pipeline, you pick the environment and the Archestack version.
variables:
  ARCHESTACK_ENVIRONMENT:
    value: dev
    options: [dev, tst, acc, prd]
    description: Environment
  ARCHESTACK_IMAGE_TAG:
    value: latest
    description: Archestack version (image tag)
  ARCHESTACK_MONITORING:
    value: "true"
    options: ["true", "false"]
    description: Deploy Grafana with Prometheus, Tempo and Loki

archestack:
  stage: deploy
  image: alpine:3.22
  rules:
    - if: $CI_PIPELINE_SOURCE == "web"
    - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      changes: [archestack/**/*]
  # Variables scoped to this environment (Settings, CI/CD, Variables), all protected:
  #   HOST                the hostname the cluster's ingress serves, such as apps.example.com
  #   ADMIN_EMAIL         the first Archestack admin, created on the first start
  #   POSTGRES_PASSWORD   masked; set once: PostgreSQL keeps the password it first started with
  #   ADMIN_PASSWORD      masked; the first admin's password
  #   GRAFANA_PASSWORD    masked; Grafana's user admin
  #   KUBECONFIG          type File: the cluster sign-in archestack/kubeconfig.sh prints. With the
  #                       GitLab agent for Kubernetes, set KUBE_CONTEXT to the agent's context instead.
  environment:
    name: archestack-$ARCHESTACK_ENVIRONMENT
  resource_group: archestack-$ARCHESTACK_ENVIRONMENT      # one rollout per environment at a time
  variables:
    KUBECTL_VERSION: v1.35.9                             # within one minor version of the cluster's
  before_script:
    - apk add --no-cache bash curl gettext-envsubst
    - curl -fsSLo /usr/local/bin/kubectl "https://dl.k8s.io/release/$KUBECTL_VERSION/bin/linux/amd64/kubectl"
    - chmod +x /usr/local/bin/kubectl
    - 'if [ -n "${KUBE_CONTEXT:-}" ]; then kubectl config use-context "$KUBE_CONTEXT"; fi'
  script:
    - IMAGE_TAG=$ARCHESTACK_IMAGE_TAG MONITORING=$ARCHESTACK_MONITORING bash archestack/deploy.sh
  • Un push sur la branche par défaut qui modifie archestack/ déploie en développement avec les images latest.
  • Le job s'exécute dans le stage deploy, que GitLab fournit, sauf si votre .gitlab-ci.yml liste ses propres stages sans celui-ci.
  • L'agent GitLab pour Kubernetes fonctionne aussi : définissez KUBE_CONTEXT sur le contexte de l'agent au lieu de KUBECONFIG.
  • resource_group empêche deux pipelines de déployer dans un même environnement au même moment.
  • Les versions de l'image et de kubectl sont fixées. Gardez kubectl à une version mineure au plus de celle de votre cluster.

Ce qu'exécutent GitHub Actions et GitLab CI

Les deux exécutent deploy.sh, les trois étapes du pipeline Azure DevOps réunies en un seul script :

#!/usr/bin/env bash
# archestack/deploy.sh: what github-actions.yml and gitlab-ci.yml run, the same three steps
# azure-pipelines.yml takes with Azure DevOps' own tasks. kubectl has to reach the cluster already.
# Reads HOST, ADMIN_EMAIL, POSTGRES_PASSWORD, ADMIN_PASSWORD and GRAFANA_PASSWORD, and optionally
# IMAGE_TAG (latest) and MONITORING (true):
#   IMAGE_TAG=1.4.23 bash archestack/deploy.sh
set -euo pipefail
cd "$(dirname "$0")"

for name in HOST ADMIN_EMAIL POSTGRES_PASSWORD ADMIN_PASSWORD GRAFANA_PASSWORD; do
  if [ -z "${!name:-}" ]; then echo "Set $name for this environment" >&2; exit 1; fi
done

export NAMESPACE=${NAMESPACE:-archestack}
export REGISTRY=${REGISTRY:-docker.io/nickpeelman}    # the public Docker Hub images of Archestack
export IMAGE_TAG=${IMAGE_TAG:-latest}
export MONITORING=${MONITORING:-true}
export HOST ADMIN_EMAIL

# 1. Fill in the manifests. Only these six names are replaced, so the $(POSTGRES_PASSWORD) the API
#    reads and Grafana's $${...} stay as they are.
out=$(mktemp -d)
trap 'rm -rf "$out"' EXIT
for f in manifests/*.yml; do
  envsubst '${NAMESPACE} ${REGISTRY} ${IMAGE_TAG} ${ADMIN_EMAIL} ${HOST} ${MONITORING}' < "$f" > "$out/$(basename "$f")"
done
if [ "$MONITORING" != true ]; then rm "$out/observability.yml"; fi

# 2. The secret, handed from one kubectl to the next and never written to a file. The database
#    password is fixed when PostgreSQL first starts on an empty disk; the admin password only makes
#    the first admin.
kubectl create secret generic archestack-secrets -n "$NAMESPACE" \
  --from-literal=postgres-password="$POSTGRES_PASSWORD" \
  --from-literal=admin-password="$ADMIN_PASSWORD" \
  --from-literal=grafana-admin-password="$GRAFANA_PASSWORD" \
  --dry-run=client -o yaml | kubectl apply -f -

# 3. Deploy, then wait for every rollout. The API's first start creates and migrates its databases.
applied=$(kubectl apply -n "$NAMESPACE" -f "$out" -o name)
for workload in $(grep -E '^(deployment|statefulset)\.apps/' <<< "$applied"); do
  kubectl rollout status -n "$NAMESPACE" "$workload" --timeout=30m
done

echo "Builder:       https://$HOST/archestack/"
echo "Published app: https://$HOST/archestack/app/"
if [ "$MONITORING" = true ]; then echo "Grafana:       https://$HOST/archestack-grafana/"; fi

Se connecter au cluster

GitHub Actions et GitLab CI se connectent avec le kubeconfig qu'affiche kubeconfig.sh : un compte de service autorisé dans le namespace archestack et nulle part ailleurs, avec un jeton qui n'expire pas. Exécutez-le une fois par cluster, en tant que personne autorisée à y créer des rôles :

#!/usr/bin/env bash
# archestack/kubeconfig.sh: the cluster sign-in for the GitHub Actions or GitLab CI pipeline, allowed
# into the archestack namespace and nothing else. Run it once per cluster, as someone who may create
# roles there, with kubectl pointing at that cluster:
#   bash archestack/kubeconfig.sh > kubeconfig-dev
# Paste the file into the environment's KUBECONFIG, then delete it. To take the access away:
#   kubectl -n archestack delete secret archestack-deploy-token
set -euo pipefail
NAMESPACE=${NAMESPACE:-archestack}

kubectl create namespace "$NAMESPACE" --dry-run=client -o yaml | kubectl apply -f - >&2
kubectl apply -n "$NAMESPACE" -f - >&2 <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: archestack-deploy
---
# Everything inside the namespace (the built-in admin role), nothing outside it.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: archestack-deploy
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
  - kind: ServiceAccount
    name: archestack-deploy
    namespace: $NAMESPACE
---
# A token that does not expire. Deleting this secret revokes it.
apiVersion: v1
kind: Secret
metadata:
  name: archestack-deploy-token
  annotations:
    kubernetes.io/service-account.name: archestack-deploy
type: kubernetes.io/service-account-token
EOF

# Kubernetes fills the token in a moment later.
token=""
for _ in $(seq 30); do
  token=$(kubectl get secret archestack-deploy-token -n "$NAMESPACE" -o jsonpath='{.data.token}' | base64 --decode)
  if [ -n "$token" ]; then break; fi
  sleep 1
done
if [ -z "$token" ]; then echo "The token did not appear in archestack-deploy-token" >&2; exit 1; fi
ca=$(kubectl get secret archestack-deploy-token -n "$NAMESPACE" -o jsonpath='{.data.ca\.crt}')
server=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

cat <<EOF
apiVersion: v1
kind: Config
clusters:
  - name: cluster
    cluster:
      server: $server
      certificate-authority-data: $ca
users:
  - name: archestack-deploy
    user:
      token: $token
contexts:
  - name: archestack
    context:
      cluster: cluster
      user: archestack-deploy
      namespace: $NAMESPACE
current-context: archestack
EOF
  • Pas votre propre kubeconfig. Il porte vos droits sur tout le cluster, et sur AKS avec la connexion Entra ID il demande à une personne de se connecter, ce qu'un pipeline ne peut pas faire.
  • Retirer l'accès, c'est supprimer le secret archestack-deploy-token dans le namespace. Relancez le script pour en obtenir un nouveau.

Les fichiers

archestack/
  azure-pipelines.yml     Azure DevOps: fills in the manifests, makes the secret, deploys
  github-actions.yml      GitHub Actions: move it to .github/workflows/archestack.yml
  gitlab-ci.yml           GitLab CI: include it from the repository's .gitlab-ci.yml
  deploy.sh               what GitHub Actions and GitLab CI run: the same three steps
  kubeconfig.sh           their sign-in, allowed into the archestack namespace only
  manifests/
    postgres.yml          PostgreSQL 16 with a 32 GB disk
    api.yml               the API, with disks for files (20 GB) and backups (50 GB)
    web.yml               the builder and the published app
    ingress.yml           /archestack on the hostname the cluster already serves
    observability.yml     optional: Grafana with Prometheus, Tempo and Loki

L'ingress est le seul fichier qui doit s'adapter à votre cluster :

# Archestack on the cluster's ingress-nginx, under a path of the shared host:
#   https://${HOST}/archestack/            the builder
#   https://${HOST}/archestack/app/<page>  the published app
#   https://${HOST}/archestack/api, /hubs  the API and live updates
# No rewrite-target: the API (Http__PathBase) and the frontend (BASE_PATH) both expect the prefix.
# No oauth2 annotations on this one: they would replace the bearer token every API call carries.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: archestack
  annotations:
    # The default 1m refuses package imports and file uploads.
    nginx.ingress.kubernetes.io/proxy-body-size: "1024m"
    # /hubs keeps a WebSocket open; backups and imports read for a long time.
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
  ingressClassName: nginx
  rules:
    - host: ${HOST}
      http:
        paths:
          - path: /archestack/api
            pathType: Prefix
            backend:
              service:
                name: archestack-api
                port:
                  number: 8080
          - path: /archestack/hubs
            pathType: Prefix
            backend:
              service:
                name: archestack-api
                port:
                  number: 8080
          - path: /archestack
            pathType: Prefix
            backend:
              service:
                name: archestack-web
                port:
                  number: 80
  • Pas de réécriture. L'API et le builder attendent tous deux le préfixe /archestack (Http__PathBase dans api.yml, BASE_PATH dans web.yml), l'ingress transmet donc les chemins tels quels.
  • Gros envois et connexions longues. La taille de corps autorise les imports de paquets et les envois de fichiers, et les délais d'attente gardent ouverts le WebSocket des mises à jour en direct et les longues sauvegardes.
  • Pas de proxy de connexion devant. Une annotation oauth2 remplacerait le jeton que porte chaque appel à l'API. Archestack connecte lui-même les utilisateurs. L'ingress de Grafana peut en recevoir une.

Mettre à jour

Relancez le pipeline avec un autre tag d'image. latest prend la release la plus récente ; une version comme 1.0.42 dit exactement ce qui tourne, et c'est la manière d'amener la même version du test à la production. Le pod de l'API est remplacé plutôt que lancé à côté de l'ancien, car ses disques ne s'attachent qu'à un pod à la fois, l'API est donc indisponible pendant la minute qu'il lui faut pour démarrer. Tout ce que vous avez créé se trouve sur les disques et reste en place.

Pièges

  • Le mot de passe de la base de données est fixé une fois. PostgreSQL le prend quand il démarre pour la première fois sur un disque vide. Le changer ensuite dans le système de CI ne le change pas dans la base de données, et l'API ne peut alors plus s'y connecter.
  • Le mot de passe de l'admin ne sert qu'une fois, pour créer le premier admin. Changez-le ensuite dans Archestack, pas dans le système de CI.
  • Les sauvegardes restent dans le cluster. Elles sont écrites sur le disque archestack-backups. Copiez-les aussi ailleurs.
  • Revenir à une version plus ancienne peut échouer une fois qu'une version plus récente a migré la base de données. Testez d'abord une mise à jour sur archestack-tst.

Pour aller plus loin

Déployer depuis le dépôt amène vos applications de git jusqu'à ces environnements. Héberger sur AKS ajoute des noms d'hôte qui lui sont propres, une base de données managée, plusieurs réplicas de l'API et des mises à jour chaque nuit.