Skip to content

Käytä Frostmoln Salaisuuksia External Secrets Operatorin (ESO) kanssa

External Secrets Operator (ESO) synkronoi salaisuudet ulkoisesta varastosta natiiveihin Kubernetes-Secret-objekteihin. Sen geneerinen webhook-tarjoaja voi lukea mistä tahansa HTTP-API:sta — mukaan lukien Frostmoln Salaisuudet — joten voit pitää salaisuutesi Frostmolnin hallinnassa ja antaa ESO:n peilata ne klustereihisi ilman ESO-puolen koodia ja ilman omaa tarjoajaa.

Tämä toimii millä tahansa Kubernetes-klusterilla, jolla on internet-lähtöliikenne — omalla, on-prem- tai hallitulla Frostmoln-klusterilla — koska ESO tavoittaa julkisen API-reunan (api.frostmoln.cloud) HTTPS:n yli.

Mitä tämä tekee

Tallennat salaisuuden Frostmolniin kerran. Jokaisella päivitysvälillä ESO kutsuu Frostmolnin hakupäätepistettä, lukee arvon ja kirjoittaa sen Kubernetes-Secret-objektiin, jota työkuormasi käyttävät tavalliseen tapaan (ympäristömuuttuja tai liitetty tiedosto). Kun kierrätät arvon Frostmolnissa, ESO poimii uuden arvon seuraavalla päivityksellä.

Edellytykset

  • ESO asennettuna klusteriin.
    • Frostmolnin hallittu Kubernetes: ESO toimitetaan klusterilisäosana external-secrets — ota se käyttöön sen sijaan, että asentaisit oman (rajoitettu klusterin kubeconfig ei voi itse asentaa klusterinlaajuisia CRD:itä ja webhookeja).
    • Kaikki muut klusterit: asenna vakiokaavio —
      bash
      helm repo add external-secrets https://charts.external-secrets.io
      helm install external-secrets external-secrets/external-secrets \
        -n external-secrets --create-namespace --set installCRDs=true
  • Frostmoln-API-avain. Luo avain portaalissa kohdassa Tili → API-avaimet (tai komennolla fm account api-key create).
  • Tenant-tunnuksesi — komennosta fm auth whoami tai portaalista.

Rajaa API-avain salaisuuksiin

Kun luot avaimen, myönnä sille vain secrets:read-oikeus. Frostmoln valvoo API-avaimen oikeuksia palvelinpuolella, joten avain ilman secrets:read-oikeutta hylätään (403) Secrets- palvelussa pyynnön yhteydessä — avaimen rajaaminen todella rajoittaa sitä, mitä sillä voi tehdä, eikä ole vain suositus. Käsittele avainta arkaluonteisena; ESO tallentaa sen Kubernetes-Secret-objektiin.

Vaihe 1 — Tallenna API-avain merkittynä Secret-objektina

ESO:n webhook-tarjoaja lukee API-avaimen Kubernetes-Secret-objektista. Secretin on kannettava merkintää external-secrets.io/type: webhook — webhook-tarjoaja kieltäytyy lukemasta merkitsemätöntä Secretiä.

yaml
apiVersion: v1
kind: Secret
metadata:
  name: frostmoln-api-key
  namespace: default
  labels:
    external-secrets.io/type: webhook # PAKOLLINEN — webhook-tarjoaja ohittaa merkitsemättömän Secretin
stringData:
  apikey: fmk_... # Frostmoln-API-avaimesi (oikeus secrets:read)

Luo tämä Secret paikallisesta tiedostosta komennolla kubectl applyälä vie sitä gitiin. Vain alla olevat SecretStore- ja ExternalSecret-manifestit ovat turvallisia pitää versionhallinnassa.

Vaihe 2 — Luo SecretStore

SecretStore osoittaa ESO:n Frostmolnin hakupäätepisteeseen. Käytä CRD-ryhmää external-secrets.io/v1 (ei vanhempaa v1beta1). Korvaa <TENANT_ID> tenant-tunnuksellasi.

yaml
apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
  name: frostmoln
  namespace: default
spec:
  provider:
    webhook:
      url: 'https://api.frostmoln.cloud/api/v1/tenants/<TENANT_ID>/secrets/lookup?name={{ .remoteRef.key }}'
      headers:
        # per-salaisuus-KARTTA: <secrets-merkinnan-nimi>.<data-avain>.
        # {{ .apikey }} renderoi koko kartan ja API palauttaa 401 — käytä .apikey-avainta.
        X-API-Key: '{{ .apikey.apikey }}'
      result:
        jsonPath: '$.secretValue'
      secrets:
        - name: apikey
          secretRef:
            name: frostmoln-api-key
            key: apikey

URL:n {{ .remoteRef.key }} täytetään ExternalSecret-kohtaisesti Frostmolnin salaisuuden nimellä (Vaihe 3), joten yksi SecretStore palvelee kaikkia salaisuuksiasi.

Vaihe 3 — Luo ExternalSecret

Jokainen ExternalSecret yhdistää yhden Frostmoln-salaisuuden yhteen Kubernetes-Secret-objektiin. remoteRef.key on Frostmolnin salaisuuden nimi; target.name on Kubernetes-Secret, jonka ESO luo ja pitää synkronoituna.

yaml
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: my-secret
  namespace: default
spec:
  refreshInterval: 1m
  secretStoreRef: { name: frostmoln, kind: SecretStore }
  target: { name: my-secret-synced }
  data:
    - secretKey: value # avain synkronoidun Kubernetes-Secretin sisällä
      remoteRef: { key: my-secret-name } # Frostmolnin salaisuuden nimi

ESO luo my-secret-synced-Secretin, jossa on value-avain, joka pitää haetun salaisuusarvon. Liitä se tai viittaa siihen Podissasi kuten mihin tahansa muuhun Secretiin.

Päivitysväli

refreshInterval säätää, kuinka usein ESO hakee uudelleen. Lyhyt väli levittää kierrätykset nopeammin mutta tekee enemmän API-kutsuja; pidempi on kevyempi. Valitse salaisuuskohtaisesti sen mukaan, kuinka nopeasti kierrätyksen on tavoitettava työkuormasi — minuutti tai muutama minuutti on tyypillinen.

Kiinnitä tietty versio

Frostmoln-salaisuudet ovat versioituja. Kiinnitä versio lisäämällä &version=NSecretStore-URL:iin (luo toinen SecretStore kiinnitetylle salaisuudelle):

yaml
url: 'https://api.frostmoln.cloud/api/v1/tenants/<TENANT_ID>/secrets/lookup?name={{ .remoteRef.key }}&version=2'

Ilman &version-parametria ESO lukee aina uusimman version.

Salaisuuden poistaminen on vikaturvallista

Jos ajat fm secrets delete salaisuudelle, jota ESO synkronoi, haku alkaa palauttaa virheen (salaisuus siirtyy odottavaan poistoon). ESO:n päivitys epäonnistuu (SecretSyncedError) ja pitää viimeksi synkronoidun Kubernetes-Secret-objektin muuttumattomana — se ei tyhjennä sitä. Työkuormasi jatkavat toimintaansa viimeisimmällä tunnetulla toimivalla arvolla.

Palauta jatkaaksesi synkronointia

Kun salaisuus on poistettu, ESO ei voi päivittää sitä ja klusterisi arvo vanhenee. Aja fm secrets recover <name> palautusikkunan sisällä palauttaaksesi sen; ESO jatkaa tällöin synkronointia seuraavalla välillä. Jos palautusikkuna umpeutuu ja salaisuus poistetaan pysyvästi, haku jatkaa epäonnistumista — luo salaisuus uudelleen jatkaaksesi.

Vianmääritys

Tarkista ExternalSecret-tila komennolla kubectl describe externalsecret <name>.

  • secret does not contain needed label — API-avaimen Secret-objektista puuttuu merkintä external-secrets.io/type: webhook (Vaihe 1).
  • 401 / luvaton — header-malli on väärä. Sen on oltava {{ .apikey.apikey }} (<secrets-merkinnan-nimi>.<data-avain>); {{ .apikey }} renderoi koko kartan ja API hylkää sen. Tarkista myös avaimen arvo ja että avain ei ole vanhentunut.
  • could not get secret data from provider — salaisuuden nimi tai tenant-tunnus on väärä, tai salaisuus on poistettu / odottaa poistoa. Varmista, että nimi löytyy: fm secrets get <name>.
  • Mitään ei synkronoidu lainkaan — vahvista, että ESO on käynnissä (kubectl -n external-secrets get pods) ja että SecretStore käyttää ryhmää external-secrets.io/v1, ei v1beta1.

Liittyvät