Skip to content

SecretsManagement ​

Geltungsbereich: namespaced · Erforderlich für jeden Workload

Wählt das Anmeldedaten-Backend für einen Namespace aus. Workloads im selben Namespace können es über secretsRef binden und die Namen der materialisierten Secrets referenzieren; ein Workload ohne secretsRef verwendet stattdessen Secrets, die Sie selbst anlegen. Ein Backend pro Ressource. Zum vollständigen Secrets-Modell, den Providern und der Key-Vault-Matrix siehe Secrets Management.

Spec ​

FeldTypBeschreibung
backendenum eso | sealedSecrets (erforderlich)Das Anmeldedaten-Backend
esoobjectESO-Konfiguration (bei backend: eso)
sealedSecretsobjectSealed-Secrets-Konfiguration (bei backend: sealedSecrets)

eso ​

FeldTypBeschreibung
providerenum azureKeyVault (Standard) | hashicorpVault | rawDer ESO-SecretStore-Provider
vaultURLstringAzure-Key-Vault-URL (azureKeyVault-Provider)
authTypeenum WorkloadIdentity (Standard) | ServicePrincipalAzure-Authentifizierungsmethode
serviceAccountNamestringSA, als die sich ESO authentifiziert (Workload Identity). Der Operator erstellt diese ServiceAccount, falls sie fehlt (im Besitz der CR, aus clientID/tenantID annotiert); eine bereits vorhandene SA wird unverändert übernommen
clientIDstringClient-ID der benutzerseitig zugewiesenen Azure Managed Identity. Wird als azure.workload.identity/client-id auf die erstellte SA gesetzt und von ESO gelesen, um das SA-Token zu tauschen. Für Workload Identity erforderlich, sofern Sie die SA nicht selbst mit dieser Annotation anlegen
tenantID / authSecretRefstring / refsService-Principal-Anmeldedaten. tenantID wird zusätzlich als azure.workload.identity/tenant-id auf die Workload-Identity-SA gesetzt
hashicorpVaultobjectHashiCorp-Vault-Verbindung — siehe hashicorpVault
providerConfigobjectRoher ESO-spec.provider-Block (Provider raw)
refreshIntervaldurationStandard 1h
externalSecretslistDie zu materialisierenden Secrets

hashicorpVault ​

FeldTypBeschreibung
serverstring (erforderlich)Vault-Adresse, z. B. https://vault.example.internal:8200
pathstringKV-Mount, Standard secret
versionenum v2 (Standard) | v1Version der KV-Engine
namespacestringVault-Enterprise-Namespace (z. B. team-a); leer für Open-Source-Vault
caSecretRef{ name, key }Secret mit dem PEM-Zertifikat der CA, die Vaults TLS-Zertifikat signiert hat (Schlüssel standardmäßig ca.crt) — nötig, wenn Vault eine private CA verwendet, wie on-prem üblich
authobject (erforderlich)Genau eine der drei folgenden Methoden
auth.kubernetes{ role, mountPath, serviceAccountName }Vault-Kubernetes-Authentifizierung (im Cluster empfohlen). Die Vault-Rolle ist an serviceAccountName gebunden; der Operator erstellt diese ServiceAccount, falls sie fehlt (eine vorhandene wird unverändert verwendet). Leer ⇒ die eigene ServiceAccount von ESO. mountPath standardmäßig kubernetes
auth.appRole{ path, roleId, secretIdSecretRef }Vault-AppRole-Authentifizierung (on-prem verbreitet): die Rollen-ID plus ein Secret mit der Secret-ID (Schlüssel standardmäßig secret-id). path standardmäßig approle
auth.tokenSecretRef{ name, key }Ein Secret mit einem Vault-Token (Schlüssel standardmäßig token). Tokens laufen ab — bevorzugen Sie die obigen Methoden

Bei Vault ordnet jeder keys-Eintrag einen Schlüssel des Kubernetes-Secrets einem Secret-Pfad unterhalb des Mounts zu; der Kubernetes-Schlüssel ist zugleich das Feld, das aus diesem Vault-Secret gelesen wird (OPENAI_API_KEY: navique/models liest das Feld OPENAI_API_KEY aus secret/navique/models).

Die Vault-Seite — eine Nur-Lese-Policy auf den Mount und die Rolle für Ihre Authentifizierungsmethode — richtet Ihr Vault-Administrator einmalig ein; die Management-Konsole erzeugt die genauen Befehle für Ihre Einstellungen.

externalSecrets[] ​

FeldBeschreibung
nameName des Ziel-Kubernetes-Secrets
keys{ k8sKey: remoteSecretName }-Kurzschreibweise für die Zuordnung
dataVollständige ESO-remoteRef-Form (secretKey, remoteKey, property, version) für Provider, bei denen property/version relevant sind
findRegexpMassenabruf dataFrom.find per Regexp

sealedSecrets ​

FeldBeschreibung
controllerNamespaceWo der Sealed-Secrets-Controller liegt; standardmäßig dieser Namespace

Beispiele ​

ESO — Azure Key Vault über Workload Identity (Produktionsstandard) ​

yaml
apiVersion: core.navique.com/v1alpha1
kind: SecretsManagement
metadata:
  name: forge-secrets
  namespace: forge-gateway
spec:
  backend: eso
  eso:
    vaultURL: https://kvforgepltprod.vault.azure.net/
    serviceAccountName: forge-sa   # vom Operator erstellt, falls fehlend (sonst übernommen)
    clientID: 11111111-2222-3333-4444-555555555555  # Client-ID der Managed Identity (SA-Annotation)
    refreshInterval: 1h
    externalSecrets:
      - name: model-credentials
        keys:
          OPENAI_API_KEY: gateway-foundry-api-key
          ANTHROPIC_API_KEY: gateway-foundry-api-key

ESO — Service Principal (Nicht-AKS / Kind) ​

yaml
spec:
  backend: eso
  eso:
    vaultURL: https://kv.vault.azure.net/
    authType: ServicePrincipal
    tenantID: <tenant-guid>
    authSecretRef:
      clientID:     { name: azure-sp, key: client-id }
      clientSecret: { name: azure-sp, key: client-secret }

ESO — HashiCorp Vault on-prem (Kubernetes-Authentifizierung, private CA) ​

yaml
spec:
  backend: eso
  eso:
    provider: hashicorpVault
    hashicorpVault:
      server: https://vault.example.internal:8200
      namespace: team-a            # nur Vault Enterprise
      caSecretRef: { name: vault-ca }
      auth:
        kubernetes: { role: navique, serviceAccountName: navique-vault }
    externalSecrets:
      - name: model-credentials
        keys: { OPENAI_API_KEY: navique/models }

ESO — HashiCorp Vault mit AppRole ​

yaml
spec:
  backend: eso
  eso:
    provider: hashicorpVault
    hashicorpVault:
      server: https://vault.example.internal:8200
      caSecretRef: { name: vault-ca }
      auth:
        appRole:
          roleId: 0f3c…                                 # kein Geheimnis
          secretIdSecretRef: { name: vault-approle }    # Schlüssel secret-id
    externalSecrets:
      - name: model-credentials
        keys: { OPENAI_API_KEY: navique/models }

ESO — HashiCorp Vault mit einem Token (Entwicklung / hermetisch) ​

yaml
spec:
  backend: eso
  eso:
    provider: hashicorpVault
    hashicorpVault:
      server: http://vault.vault.svc:8200
      auth:
        tokenSecretRef: { name: vault-token, key: token }
    externalSecrets:
      - name: model-credentials
        keys: { OPENAI_API_KEY: model-credentials }

ESO — beliebiger Provider (Raw-Durchreichung) ​

provider: raw injiziert den ESO-spec.provider-Block wortgetreu, sodass jeder ESO-Provider funktioniert (AWS, GCP, IBM, Akeyless, 1Password, …) ohne Änderungen am Operator:

yaml
spec:
  backend: eso
  eso:
    provider: raw
    providerConfig:
      aws:
        service: SecretsManager
        region: eu-central-1
        auth: { jwt: { serviceAccountRef: { name: forge-sa } } }
    externalSecrets:
      - name: model-credentials
        data:
          - { secretKey: OPENAI_API_KEY, remoteKey: prod/model, property: openai, version: AWSCURRENT }

Sealed Secrets ​

yaml
spec:
  backend: sealedSecrets
  sealedSecrets:
    controllerNamespace: sealed-secrets

Verhalten ​

  • ESO ⇒ der Operator stellt den External Secrets Operator sicher (Provenance-bewusst), wartet darauf, dass dessen CRDs Established sind, und wendet anschließend einen namespaced SecretStore sowie die konfigurierten ExternalSecrets an. Ein namespaced Store (kein ClusterSecretStore) hält die Anmeldedaten jedes Namespace isoliert.
  • Sealed Secrets ⇒ der Operator stellt den Sealed-Secrets-Controller sicher und reconciled die referenzierten SealedSecrets.

Workloads, die secretsRef setzen, reconcilen erst, sobald diese SecretsManagement bereit ist.

Status ​

{ phase, backend, storeReady, materializedSecrets[], conditions, observedGeneration }.

Bei jedem ESO-Backend enthält conditions SecretStoreReady: ob ESO den Secret-Store erreichen und sich dort anmelden kann. Meldet ESO, dass das nicht möglich ist, sind die Condition — und Ready, da nichts synchronisiert werden kann — False mit der von ESO gemeldeten Ursache, z. B. x509: certificate signed by unknown authority (caSecretRef setzen), permission denied (Vault-Rolle und -Policy prüfen) oder ein falscher Vault-Namespace.

Bei einem Azure-Key-Vault-Backend mit WorkloadIdentity enthält conditions zusätzlich FederatedCredentialReady — das passive Signal dafür, ob die Azure Federated Identity Credential für das ESO-ServiceAccount-Subject existiert. Siehe Secrets-Betrieb → die Federated Credential.

Open Core unter AGPL-3.0. Enterprise-Komponenten sind proprietär und lizenzgebunden.