ProxyAuthK8S

Chart Helm

Référence des values du chart ProxyAuthK8S

Deux charts sont publiés en OCI : oci://ghcr.io/batleforc/proxyauthk8s/chart-crd (les CRD) et oci://ghcr.io/batleforc/proxyauthk8s/chart (l'application). Le Quick Started montre une installation complète ; cette page décrit les values. Le fichier de référence est deploy/chart/values.yaml, et le chart embarque un values.schema.json : Helm refuse une clé inconnue (faute de frappe) ou une valeur mal typée avant de rendre quoi que ce soit.

Les charts publiés sont signés avec cosign (keyless) :

cosign verify ghcr.io/batleforc/proxyauthk8s/chart:<version> \
  --certificate-identity-regexp 'https://github.com/batleforc/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Images

ValueDéfautDescription
registry.back.image.repositoryghcr.io/batleforc/proxyauthk8s/serverImage du serveur
registry.front.image.repositoryghcr.io/batleforc/proxyauthk8s/frontImage du dashboard
registry.{back,front}.image.tag(vide)Vide = appVersion de la chart
registry.{back,front}.image.pullPolicyIfNotPresent

Les images publiées sont multi-architectures (linux/amd64 et linux/arm64), signées avec cosign (keyless, GitHub OIDC) et portent des attestations de provenance et de SBOM :

cosign verify ghcr.io/batleforc/proxyauthk8s/server:<version> \
  --certificate-identity-regexp 'https://github.com/batleforc/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Les attestations de provenance et de SBOM se vérifient par digest :

gh attestation verify oci://ghcr.io/batleforc/proxyauthk8s/server@<digest> \
  --repo batleforc/ProxyAuthK8S

Exposition

ValueDéfautDescription
ingress.enabledtrueCrée l'Ingress (/ → front, /api/ et /clusters/ → back)
ingress.className""IngressClass
ingress.annotations{}Annotations (cert-manager, timeouts de l'ingress...)
ingress.hostproxyauthk8s.localHost public : base des redirect URIs et origine CORS par défaut
ingress.apiHost""Second host qui ne sert que les clusters (/clusters/…), pour oc login --web ; même secret TLS
ingress.tls.enabledtrueTLS sur l'Ingress
ingress.tls.secretNameproxyauthk8s-tlsSecret TLS

Les flux watch, exec et logs -f passent par l'Ingress : augmentez ses timeouts de lecture (ex. nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"), sinon l'ingress coupe les connexions longues.

OIDC

ValueDéfautDescription
oidc.sourcesecretsecret (recommandé) ou env
oidc.objectNameproxyauthk8s-back-oidcSecret lu en envFrom par le back (OIDC_ISSUER_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_SCOPES, OIDC_AUDIENCE) ; le front n'en lit que les clés publiques
oidc.value.*—Valeurs utilisées avec source: env (issuer_url, client_id, client_secret, scopes, audience, silent_refresh)

Avec oidc.source: env, le secret client est écrit en clair dans la spec du Deployment : toute personne pouvant lire les Deployments le voit. Préférez secret.

Backend

ValueDéfautDescription
back.replicas2Tous les réplicas servent le trafic ; seul le détenteur du lease réconcilie
back.port5437Port du serveur
back.redis.sourceenvenv (URL dans back.redis.value.url) ou secret (REDIS_URL dans back.redis.secretName)
back.redis.value.url""Obligatoire avec source: env (aucune valeur par défaut, pour ne pas livrer de mot de passe)
back.corsAllowedOrigins""Origines CORS séparées par des virgules ; vide = l'origine de l'Ingress uniquement
back.shutdownTimeoutSeconds30Attente des requêtes en cours à l'arrêt ; le grace period du pod vaut cette valeur + 15 s
back.logFormattextFormat des logs : text ou json
back.env[]Variables supplémentaires (name/value), voir Configuration
back.resourceslimits 1000m / 512Mi, requests 100m / 128MiRessources du serveur
back.podDisruptionBudget.*activé, minAvailable: 1PDB, voir Disponibilité
back.autoscaling.*désactivéHPA (minReplicas, maxReplicas, targetCPUUtilizationPercentage), voir Disponibilité

Sondes : liveness sur /management/health, readiness sur /management/ready (vérifie Redis et la découverte OIDC du démarrage).

Front

ValueDéfautDescription
front.replicas2
front.port4200
front.env[]Variables supplémentaires
front.resourceslimits 100m / 512MiRessources du dashboard (nginx statique)
front.podDisruptionBudget.*activé, minAvailable: 1Comme back.podDisruptionBudget
front.autoscaling.*désactivéComme back.autoscaling

Passerelle d'agents

Les values agentGateway.* (passerelle des clusters joints par un agent, RFC 0012) sont décrites avec leur contexte dans Agent.

Disponibilité : PDB, HPA et GitOps

Le back, le front et la passerelle d'agents (agentGateway, mode separate) suivent les mêmes règles :

  • PDB (podDisruptionBudget.*) : minAvailable: 1 par défaut. Un maxUnavailable défini le remplace (l'API refuse les deux), 0 compris ; une valeur vide est ignorée. Avec un seul pod au minimum (replicas/replicaCount, ou autoscaling.minReplicas avec l'HPA), le chart rend maxUnavailable: 1 : un minAvailable: 1 bloquerait tout kubectl drain, et le PDB protège encore les pods quand l'HPA monte.
  • HPA (autoscaling.enabled) : le chart reprend le nombre de pods en place (lookup) à chaque helm upgrade, sans écraser le choix de l'HPA ni retirer le champ (Helm retomberait alors à 1 pod). Sans Deployment à lire (première installation, helm template, --dry-run, Argo CD), il rend autoscaling.minReplicas.
  • Réduction lente des pods qui portent des tunnels d'agents : chaque pod retiré ferme ses tunnels, et ses agents se reconnectent. L'HPA de la passerelle, et celui du back en mode embedded, attendent agentGateway.autoscaling.scaleDownStabilizationSeconds (600 s) puis retirent scaleDownPods pod(s) par scaleDownPeriodSeconds (300 s).

Argo CD et l'HPA

Argo CD rend le chart sans accès au cluster : lookup n'y renvoie rien, et chaque synchronisation remettrait replicas à autoscaling.minReplicas, contre l'HPA. Laissez ce champ à l'HPA :

apiVersion: argoproj.io/v1alpha1
kind: Application
spec:
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/replicas
  syncPolicy:
    syncOptions:
      - RespectIgnoreDifferences=true   # sinon la synchro applique quand même le champ

Flux (helm-controller) exécute un vrai helm upgrade : lookup y fonctionne, rien à faire.

RBAC

ValueDéfautDescription
rbac.referencedNamespaces[]Namespaces dont les Secrets / ConfigMaps / Services peuvent être référencés par un ProxyKubeApi. Vide = get cluster-wide ; renseigné = un Role par namespace (moindre privilège)

Le compte de service reçoit toujours : lecture des CRD, lecture/mise à jour des ProxyKubeApi (statut, finalizers), create/patch sur les events.k8s.io (les Events publiés sur chaque ProxyKubeApi), et get/create/update/patch sur les leases de son propre namespace pour l'élection de leader.

Depuis la 0.4.0, le leader libère son lease à l'arrêt. Pour revenir à une version antérieure, supprimez d'abord le lease, que l'ancienne élection ne saurait plus reprendre : kubectl -n <namespace> delete lease proxy-auth-k8s-leader-election.

Sécurité des pods

securityContext.pod et securityContext.container s'appliquent au back, au front et au collecteur OTel : utilisateur non-root (1000), système de fichiers racine en lecture seule, toutes les capabilities retirées, profil seccomp RuntimeDefault.

NetworkPolicy

ValueDéfautDescription
networkPolicy.enabledfalseActive les NetworkPolicies du front, du back et de la passerelle d'agents
networkPolicy.ingressFrom[]Sélecteurs autorisés à joindre les services (ex. le namespace de l'ingress controller) ; vide = tout le cluster
networkPolicy.egress.allowExternaltrueAutorise la sortie vers l'extérieur du cluster (apiservers, IdP)
networkPolicy.egress.externalExceptplages privées, link-local, CGNATExclues de la sortie externe : bloque notamment l'endpoint de métadonnées cloud
networkPolicy.egress.extra[]Règles d'egress supplémentaires (Redis, apiservers internes...)

Désactivée par défaut car le chart ne peut pas deviner où sont Redis et les clusters cibles. En production, activez-la et décrivez ces destinations dans egress.extra.

Observabilité

ValueDéfautDescription
metrics.prometheus.enabledfalseSert /management/metrics (jamais routé par l'Ingress)
metrics.serviceMonitor.enabledfalseCrée un ServiceMonitor prometheus-operator ; sinon, avec les métriques activées, les pods portent les annotations prometheus.io/*
metrics.serviceMonitor.interval / scrapeTimeout30s / 10s
metrics.serviceMonitor.labels{}Labels pour la sélection par votre Prometheus (ex. release: kube-prometheus-stack)
metrics.scrapeFrom[]Avec la NetworkPolicy : sélecteurs autorisés à scraper le back et la passerelle (vide : networkPolicy.ingressFrom, sinon tous)

Collecteur OpenTelemetry optionnel :

ValueDéfautDescription
otel.enabledfalseDéploie un collecteur OpenTelemetry et y envoie traces et métriques
otel.image.repositoryotel/opentelemetry-collector-contrib
otel.image.tag0.162.0Version épinglée du collecteur
otel.configOTLP → jaeger:4317, métriques → Prometheus :9090Configuration du collecteur

On this page