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
- Frostmolnin hallittu Kubernetes: ESO toimitetaan klusterilisäosana
- Frostmoln-API-avain. Luo avain portaalissa kohdassa Tili → API-avaimet (tai komennolla
fm account api-key create). - Tenant-tunnuksesi — komennosta
fm auth whoamitai 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ä.
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.
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: apikeyURL: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.
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 nimiESO 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):
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-avaimenSecret-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äSecretStorekäyttää ryhmääexternal-secrets.io/v1, eiv1beta1.