Hyppää sisältöön

Docs CSC now features an automatic Finnish translation. Click here for more information.

Warning!

Puhti and Mahti computing services have been decommissioned and no new jobs are accepted or executed on its compute nodes. Puhti and Mahti login nodes and storage services are planned to remain available until 15 October 2026. Clean up unnecessary files and move any data you need to keep by 31 August 2026. See the Roihu data migration guide for instructions on transferring your data to Roihu.

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, OCIRepository tai HelmRepository. Lähdeohjain hakee sisällön ja tallentaa sen klusteriin artefaktina.
  • sovellusobjekti kuvaa, mitä sisällölle tehdään: Kustomization soveltaa tavallista YAML:ia tai Kustomize -overlay-kokonaisuuksia, ja HelmRelease asentaa 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ä:

oc annotate --overwrite gitrepository/podinfo reconcile.fluxcd.io/requestedAt="$(date +%s)"

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- ja HelmRelease-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 Kustomization ei voi käyttää toisen projektin GitRepository-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:

oc create serviceaccount flux
oc adm policy add-role-to-user admin -z flux

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
oc apply -f podinfo-git.yaml

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>
# For GitRepository resource
spec:
...
  secretRef:
    name: my-repo-auth

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
oc apply -f podinfo-helm.yaml

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
oc apply -f podinfo-oci.yaml

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.

  1. Luo GPG-avainpari

    export KEY_NAME="my-project.rahti.csc.fi"
    export KEY_COMMENT="flux secrets"
    
    gpg --batch --full-generate-key <<EOF
    %no-protection
    Key-Type: 1
    Key-Length: 4096
    Subkey-Type: 1
    Subkey-Length: 4096
    Expire-Date: 0
    Name-Comment: ${KEY_COMMENT}
    Name-Real: ${KEY_NAME}
    EOF
    
  2. Kirjaa ylös avaimen sormenjälki, joka yksilöi avaimen seuraavissa komennoissa:

    gpg --list-secret-keys "${KEY_NAME}"
    
    sec   rsa4096 2026-08-04 [SC]
          1F3D1CED2F865F5E59CA564553241F147E7C5FA4
    
    export KEY_FP=1F3D1CED2F865F5E59CA564553241F147E7C5FA4
    
  3. Tallenna yksityinen avain Rahti-projektiisi, jotta Flux voi purkaa salauksen sillä. Secret-objektin merkinnän on päätyttävä .asc-päätteeseen:

    gpg --export-secret-keys --armor "${KEY_FP}" |
      oc create secret generic sops-gpg --from-file=sops.asc=/dev/stdin
    
  4. Varmuuskopioi yksityinen avain turvalliseen paikkaan ja poista se sitten omalta koneeltasi, jotta ainoa salauksen purkamiseen kykenevä kopio on klusterissa oleva:

    gpg --delete-secret-keys "${KEY_FP}"
    
  5. 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.

    gpg --export --armor "${KEY_FP}" > .sops.pub.asc
    

    Jokainen, jonka täytyy lisätä salattu tiedosto, tuo sen kerran komennolla gpg --import .sops.pub.asc.

  6. Kerro seuraavaksi SOPSille, mitä avainta käytetään ja mitkä kentät salataan, lisäämällä .sops.yaml-tiedosto repositorion juureen. Vain data- ja stringData-kenttien salaaminen pitää muun manifestin luettavana, joten siihen tehtyjä muutoksia voidaan edelleen tarkastella diffissä:

    creation_rules:
      - path_regex: .*.yaml
        encrypted_regex: ^(data|stringData)$
        pgp: 1F3D1CED2F865F5E59CA564553241F147E7C5FA4
    
  7. Kun tämä tiedosto on paikallaan, manifestin salaaminen ei vaadi lisäargumentteja. Voit salata tiedostot seuraavalla komennolla. Huomaa, että se salaa tiedoston data- tai stringData-kentän.

    sops --encrypt --in-place my-secret.yaml
    
  8. Commitoi salattu tiedosto ja määritä Kustomization purkamaan salaus:

    apiVersion: kustomize.toolkit.fluxcd.io/v1
    kind: Kustomization
    metadata:
      name: my-app
    spec:
      interval: 1h
      serviceAccountName: flux
      sourceRef:
        kind: GitRepository
        name: my-app
      path: ./deploy
      prune: true
      decryption:
        provider: sops
        secretRef:
          name: sops-gpg  # -> Secret name for GPG private key
    

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:

oc get gitrepositories,ocirepositories,helmrepositories
oc get kustomizations,helmreleases
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:

oc describe kustomization podinfo
oc describe helmrelease podinfo

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 Kustomization soveltaa.
  • CI/CD Rahtissa: miten automaattinen käyttöönotto sopii laajempaan putkeen.

Suomenkielinen tekoälykäännös

Sisällössä voi esiintyä virheellistä tietoa tekoälykäännöksestä johtuen.

Klikkaa tästä antaaksesi palautetta