FluxCD
FluxCD on jatkuvan käyttöönoton ratkaisu, joka pitää Rahtissa olevat sovelluksesi synkronoituna ylläpitämääsi totuuden lähteeseen klusterin ulkopuolella, tyypillisesti Git-repositorioon. Rahtissa FluxCD tarjotaan hallittuna komponenttina, joten sinun ei tarvitse asentaa tai ylläpitää ohjaimia itse: sinä määrittelet, mitä Rahti-projektissasi pitäisi olla käynnissä, ja Flux toteuttaa sen puolestasi.
Mitä GitOps on
GitOps on tapa operoida sovelluksia siten, että järjestelmän haluttu tila tallennetaan versionhallintaan ja klusterissa ajettava ohjain huolehtii jatkuvasti siitä, että klusteri vastaa sitä. Sen sijaan, että suorittaisit oc apply -komennon omalta koneeltasi, teet commitin muutoksesta ja klusteri ottaa sen käyttöön.
Tällä on muutamia käytännön seurauksia:
- Repositorio on totuuden lähde. Se, mikä on commitoitu, on se, mikä on käynnissä. Jos haluat tietää, mitä on otettu käyttöön, luet repositoriota sen sijaan, että kyselisit tietoa klusterilta.
- Jokaisella muutoksella on historia. Käyttöönotot ovat committeja, joten niitä voidaan tarkastella, hyväksyä ja perua samoilla työkaluilla, joita käytät jo koodille.
- Kenenkään ei tarvitse tehdä käyttöönottoa käsin. Klusterin käyttöoikeustietoja ei tarvita jatkuvan integraation järjestelmässäsi, koska mitään ei työnnetä Rahtiin ulkopuolelta. Flux hakee muutokset repositoriosta sen sijaan.
- Manuaaliset muutokset eivät pysy. Jos joku muokkaa Deploymentia suoraan klusterissa, Flux muuttaa sen takaisin seuraavassa täsmäytyksessä. Tämä on ominaisuus: klusteri ei voi ajautua erilleen siitä, mitä on kirjattu ylös.
Miten automaattinen käyttöönotto toimii
Flux jakaa työn kahdenlaisiin objekteihin, ja tavallisesti luot yhden kumpaakin:
- lähdeobjekti kuvaa, mistä manifestisi tulevat ja kuinka usein muutoksia tarkistetaan:
GitRepository,OCIRepositorytaiHelmRepository. Lähdeohjain hakee sisällön ja tallentaa sen klusteriin artefaktina. - sovellusobjekti kuvaa, mitä sisällölle tehdään:
Kustomizationsoveltaa tavallista YAML:ia tai Kustomize -overlay-kokonaisuuksia, jaHelmReleaseasentaa tai päivittää Helm-kaavion.
Molemmissa objektityypeissä on interval-kenttä, joka määrittää, kuinka usein Flux tarkistaa ja soveltaa uudelleen. Tämä on täsmäytyssilmukka: jokaisella aikavälillä Flux vertaa haluttua tilaa siihen, mitä projektissasi on, ja korjaa kaikki erot. Voit myös käynnistää täsmäytyksen heti odottamatta seuraavaa aikaväliä:
Tämän sivun esimerkeissä käytetään yhden tai kahden tunnin aikaväliä, mikä on järkevä oletus tuotantosovellukselle: muutokset otetaan käyttöön automaattisesti ilman, että lähdettä kysellään minuutin välein.
Rahti käyttää Fluxia monivuokraus käytössä. Käytännössä tämä tarkoittaa sinulle kahta asiaa:
- Flux ei sovella mitään omilla klusterinlaajuisilla oikeuksillaan. Jokaisen
Kustomization- jaHelmRelease-objektin on nimettävä palvelutili projektissasi, ja Flux toimii kyseisenä palvelutilinä. Tämä estää yhtä projektia ottamasta käyttöön resursseja toiseen projektiin. - Lähteiden ja sovellusobjektien on sijaittava samassa Rahti-projektissa. Viittaukset namespacejen yli on poistettu käytöstä; esimerkiksi
Kustomizationei voi käyttää toisen projektinGitRepository-objektia.
Vaatimukset
oc komentorivikäyttöliittymä on asennettava, ja sinun on oltava kirjautuneena oikeaan Rahti-projektiin (oc project <project_name>).
Ennen minkään Flux-objektin luomista luo palvelutili, jota Flux käyttää, ja myönnä sille admin-rooli projektissasi:
Sama voidaan tehdä myös deklaratiivisesti, mikä on hyödyllistä, jos haluat itse sidonnan versionhallintaan. RoleBinding, joka viittaa admin-ClusterRoleen, myöntää nämä oikeudet vain siinä projektissa, johon se luodaan:
apiVersion: v1
kind: ServiceAccount
metadata:
name: flux
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: flux-admin
subjects:
- kind: ServiceAccount
name: flux
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
Jokainen alla olevien esimerkkien sovellusobjekti viittaa tähän palvelutiliin kentällä spec.serviceAccountName. Jos jätät sen pois tai jos palvelutililtä puuttuvat oikeudet johonkin manifesteissasi olevaan asiaan, objekti jää tilaan not ready ja raportoi käyttöoikeusvirheen ehdoissaan.
Käyttöönotto Git-repositoriosta
Tämä on yleisin asetus. Alla oleva GitRepository-objekti seuraa julkisen podinfo-repositorioin master-haaraa, jota Flux käyttää omassa dokumentaatiossaan ja joka on kätevä testaukseen, ja Kustomization soveltaa hakemistosta ./kustomize löytyvät manifestit:
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: podinfo
spec:
interval: 1h
url: https://github.com/stefanprodan/podinfo
ref:
branch: master
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: podinfo
spec:
interval: 1h
targetNamespace: <NAMESPACE>
serviceAccountName: flux
sourceRef:
kind: GitRepository
name: podinfo
path: ./kustomize
prune: true
timeout: 3m
patches:
- patch: |
- path: /spec/template/spec/containers/0/resources
op: remove
target:
kind: Deployment
prune: true tarkoittaa, että kun poistat manifestin repositoriosta, Flux poistaa myös vastaavan objektin projektistasi. Ilman sitä poistetut manifestit jäisivät käyntiin.
Yksityistä repositoriota varten luo tunnistetietosi sisältävä Secret ja viittaa siihen lähteestä:
oc create secret generic my-repo-auth \
--from-literal=username=<GIT_USERNAME> \
--from-literal=password=<GIT_TOKEN_OR_APP_PASSWORD>
Käytä vain luku -oikeuksilla varustettua tokenia tai deploy keytä. Myös SSH-avain toimii; tällöin Secret sisältää merkinnät identity, identity.pub ja known_hosts.
Helm-kaavion käyttöönotto
Kaavion asentamiseksi yhdistä HelmRepository-lähde ja HelmRelease. Esimerkissä käytetään julkista podinfo-kaaviorepositoriota:
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: podinfo
spec:
interval: 2h
url: https://stefanprodan.github.io/podinfo
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: podinfo
spec:
interval: 1h
serviceAccountName: flux
chart:
spec:
chart: podinfo
version: '6.*'
sourceRef:
kind: HelmRepository
name: podinfo
interval: 2h
values:
replicaCount: 1
ingress:
enabled: false
resources:
requests:
cpu: 400m
memory: 128Mi
limits:
cpu: "1"
memory: 512Mi
version-kenttä hyväksyy semanttisen version alueen, joten 6.* poimii automaattisesti 6-sarjan korjaus- ja aliversiot, mutta ei koskaan siirry versioon 7. chart.spec-osion sisäinen interval määrittää, kuinka usein Flux tarkistaa kaaviorepositoriosta uuden version, joka vastaa tätä aluetta, ja HelmRelease-objektin interval määrittää, kuinka usein itse julkaisu täsmäytetään. Kaikki, minkä normaalisti laittaisit values.yaml-tiedostoon, sijoitetaan values-osion alle.
Kaaviot OCI-rekisterissä
Monet projektit julkaisevat nykyään kaavioita OCI-rekisteriin kaaviorepositorion sijaan. Niitä varten aseta HelmRepository-objektiin type: oci ja käytä oci://-URL-osoitetta, esimerkiksi oci://ghcr.io/stefanprodan/charts. HelmRelease pysyy samana.
Pidä mielessä Rahti-katalogi -sivulla kuvatut tukitasot kaaviota valitessasi ja suosi kaavioita, joiden käyttämien imagejen päivityksiin voit luottaa.
Käyttöönotto OCI-rekisteristä
Manifestit voidaan myös paketoida OCI-artefaktiksi ja tallentaa konttirekisteriin imagejesi rinnalle. Tämä poistaa riippuvuuden siitä, että Gitin täytyy olla saavutettavissa käyttöönoton aikana, ja tarjoaa muuttumattomia, digestillä osoitettavia julkaisuja. OCIRepository korvaa GitRepository-objektin, ja Kustomization pysyy muuten ennallaan paitsi lähdeviittauksen osalta:
apiVersion: source.toolkit.fluxcd.io/v1
kind: OCIRepository
metadata:
name: podinfo
spec:
interval: 2h
url: oci://ghcr.io/stefanprodan/manifests/podinfo
ref:
semver: '6.*'
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: podinfo
spec:
interval: 1h
targetNamespace: <NAMESPACE>
serviceAccountName: flux
sourceRef:
kind: OCIRepository
name: podinfo
path: ./
prune: true
timeout: 3m
patches:
- patch: |
- path: /spec/template/spec/containers/0/resources
op: remove
target:
kind: Deployment
semver-arvon sijaan ref voi nimetä tagin tai kiinnittää digestin täysin muuttumattomaan käyttöönottoon. Yksityistä rekisteriä varten lisää secretRef, joka osoittaa pull secretiin; se voi olla sama, jota käytät projektisi imageille.
Secretien salaaminen SOPSilla
GitOps-repositorio sisältää koko käyttöönoton, mikä tarkoittaa, että se sisältäisi myös Secret-objektisi. Niiden commitoiminen selväkielisinä ei ole hyväksyttävää edes yksityisessä repositoriossa. Flux ratkaisee tämän SOPSilla, joka salaa vain YAML-tiedoston arvot ja jättää rakenteen luettavaksi. Salattu tiedosto on turvallista commitoida, ja kustomize-controller purkaa sen salauksen klusterissa manifestia soveltaessaan, joten selväkielinen sisältö on olemassa vain projektissasi.
Oletustapa tehdä tämä on käyttää GPG-avainparia. Luo sellainen ilman salasanaa, koska Fluxin on voitava käyttää sitä ilman valvontaa.
-
Luo GPG-avainpari
-
Kirjaa ylös avaimen sormenjälki, joka yksilöi avaimen seuraavissa komennoissa:
-
Tallenna yksityinen avain Rahti-projektiisi, jotta Flux voi purkaa salauksen sillä.
Secret-objektin merkinnän on päätyttävä.asc-päätteeseen: -
Varmuuskopioi yksityinen avain turvalliseen paikkaan ja poista se sitten omalta koneeltasi, jotta ainoa salauksen purkamiseen kykenevä kopio on klusterissa oleva:
-
Julkinen avain on se, jota sinä ja kollegasi käytätte salaamiseen, joten sen voi commitoida repositorioon. Seuraava komento luo julkisen avaimen tiedostoon nimeltä
.sops.pub.asc.Jokainen, jonka täytyy lisätä salattu tiedosto, tuo sen kerran komennolla
gpg --import .sops.pub.asc. -
Kerro seuraavaksi SOPSille, mitä avainta käytetään ja mitkä kentät salataan, lisäämällä
.sops.yaml-tiedosto repositorion juureen. Vaindata- jastringData-kenttien salaaminen pitää muun manifestin luettavana, joten siihen tehtyjä muutoksia voidaan edelleen tarkastella diffissä: -
Kun tämä tiedosto on paikallaan, manifestin salaaminen ei vaadi lisäargumentteja. Voit salata tiedostot seuraavalla komennolla. Huomaa, että se salaa tiedoston
data- taistringData-kentän. -
Commitoi salattu tiedosto ja määritä
Kustomizationpurkamaan salaus:
Warning
sops-gpg-Secretissä oleva yksityinen avain voi purkaa jokaisen repositoriossasi olevan secretin salauksen. Pidä se poissa itse repositoriosta, rajoita pääsyä sitä sisältävään Rahti-projektiin ja vaihda se, jos se koskaan paljastuu. Jokainen, joka voi lukea projektisi secretit, voi myös lukea puretut arvot, joten käsittele projektin jäsenyyttä vastaavana kuin pääsyä näihin tunnistetietoihin.
Voit lisätä GPG-julkisen avaimen repositorioosi, mutta älä koskaan commitoi yksityistä avainta.
SOPS tukee myös muunlaisia avaimia. age on GPG:tä yksinkertaisempi vaihtoehto, ja avaintenhallintapalvelu välttää yksityisen avaimen tallentamisen klusteriin kokonaan, mutta vaatii tunnistetiedot kyseiseen ulkoiseen palveluun. Molemmat on dokumentoitu upstreamin Flux-oppaassa Mozilla SOPSista.
Fluxin toiminnan tarkistaminen
Jokaisen Flux-objektin tila näkyy oc:lla:
NAME URL READY STATUS
gitrepository/podinfo https://github.com/stefanprodan/podinfo True stored artifact for revision 'master@sha1:...'
NAME READY STATUS
kustomization/podinfo True Applied revision: master@sha1:...
Jos READY on False, syy näkyy objektin ehdoissa:
Jos haluat pysäyttää Fluxin täsmäytyksen väliaikaisesti, esimerkiksi kun selvität jotain käsin, keskeytä objekti ja jatka sitä myöhemmin:
oc patch kustomization podinfo --type=merge -p '{"spec":{"suspend":true}}'
oc patch kustomization podinfo --type=merge -p '{"spec":{"suspend":false}}'
Flux-komentorivityökalu
Fluxilla on oma CLI-työkalunsa, joka tarjoaa oikoteitä kuten flux get all ja flux reconcile. Se on kätevä, mutta sen flux bootstrap- ja flux install -komennot vaativat cluster-admin-oikeudet eivätkä ole käytettävissä Rahtissa, koska ohjaimet on jo asennettu ja hallinnoitu puolestasi. Yllä olevat oc-komennot toimivat tavallisilla projektioikeuksilla.
Lisätietoja
- Flux-dokumentaatio: kaikkien lähde- ja sovellusobjektityyppien täydet tiedot.
- Flux Kustomization -viite: kaikki yllä käytetyn sovellusobjektin kentät, mukaan lukien SOPS-salauksen purku.
- Flux-opas SOPSista: secretien salaaminen GPG:llä, age:lla tai avaintenhallintapalvelulla.
- Kustomize: miten jäsentää manifestit, joita
Kustomizationsoveltaa. - CI/CD Rahtissa: miten automaattinen käyttöönotto sopii laajempaan putkeen.