Fajls lokali meta timigra applikazzjoni għal Kubernetes

Fajls lokali meta timigra applikazzjoni għal Kubernetes

Meta tinbena proċess CI/CD bl-użu ta 'Kubernetes, xi drabi tqum il-problema ta' inkompatibilità bejn ir-rekwiżiti tal-infrastruttura l-ġdida u l-applikazzjoni li tiġi trasferita lejha. B'mod partikolari, fl-istadju tal-bini tal-applikazzjoni huwa importanti li tikseb 1 immaġni li se tintuża fi Kollha ambjenti tal-proġetti u raggruppamenti. Dan il-prinċipju huwa l-bażi tal-korretta skond Google ġestjoni tal-kontejners (aktar minn darba dwar dan tkellem u d-dipartiment tekniku tagħna).

Madankollu, ma tara lil ħadd f'sitwazzjonijiet fejn il-kodiċi tas-sit juża qafas lest, li l-użu tiegħu jimponi restrizzjonijiet fuq l-użu ulterjuri tiegħu. U filwaqt li f'"ambjent normali" dan huwa faċli biex jiġi ttrattat, f'Kubernetes din l-imġieba tista' ssir problema, speċjalment meta tiltaqa' magħha għall-ewwel darba. Filwaqt li moħħ inventiv jista’ joħroġ b’soluzzjonijiet infrastrutturali li jidhru ovvji jew saħansitra tajbin mal-ewwel daqqa t’għajn... huwa importanti li wieħed jiftakar li ħafna mis-sitwazzjonijiet jistgħu u għandhom tiġi solvuta arkitettonikament.

Ejja nħarsu lejn soluzzjonijiet ta 'soluzzjoni popolari għall-ħażna ta' fajls li jistgħu jwasslu għal konsegwenzi spjaċevoli meta tħaddem cluster, u nindika wkoll triq aktar korretta.

Ħażna statika

Biex nispjega, ikkunsidra applikazzjoni tal-web li tuża xi tip ta 'ġeneratur statiku biex tikseb sett ta' stampi, stili, u affarijiet oħra. Pereżempju, il-qafas Yii PHP għandu maniġer tal-assi integrat li jiġġenera ismijiet tad-direttorju uniċi. Għaldaqstant, l-output huwa sett ta 'mogħdijiet għas-sit statiku li ovvjament ma jaqsmux ma' xulxin (dan sar għal diversi raġunijiet - pereżempju, biex jiġu eliminati duplikati meta komponenti multipli jużaw l-istess riżorsa). Allura, barra mill-kaxxa, l-ewwel darba li taċċessa modulu tar-riżorsi tal-web, fajls statiċi (fil-fatt, ħafna drabi symlinks, iżda aktar dwar dan aktar tard) huma ffurmati u mqassma b'direttorju tal-għeruq komuni uniku għal dan l-iskjerament:

  • webroot/assets/2072c2df/css/…
  • webroot/assets/2072c2df/images/…
  • webroot/assets/2072c2df/js/…

Xi jfisser dan f'termini ta' cluster?

L-aktar eżempju sempliċi

Ejja nieħdu każ pjuttost komuni, meta PHP jiġi preċedut minn nginx biex iqassam data statika u jipproċessa talbiet sempliċi. L-eħfef mod - iskjerament b'żewġ kontenituri:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: site
spec:
  selector:
    matchLabels:
      component: backend
  template:
    metadata:
      labels:
        component: backend
    spec:
      volumes:
        - name: nginx-config
          configMap:
            name: nginx-configmap
      containers:
      - name: php
        image: own-image-with-php-backend:v1.0
        command: ["/usr/local/sbin/php-fpm","-F"]
        workingDir: /var/www
      - name: nginx
        image: nginx:1.16.0
        command: ["/usr/sbin/nginx", "-g", "daemon off;"]
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: nginx.conf

F'forma simplifikata, il-konfigurazzjoni nginx tirriżulta f'dan li ġej:

apiVersion: v1
kind: ConfigMap
metadata:
  name: "nginx-configmap"
data:
  nginx.conf: |
    server {
        listen 80;
        server_name _;
        charset utf-8;
        root  /var/www;

        access_log /dev/stdout;
        error_log /dev/stderr;

        location / {
            index index.php;
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    }

Meta taċċessa l-ewwel is-sit, l-assi jidhru fil-kontenitur PHP. Iżda fil-każ ta 'żewġ kontenituri fi ħdan pod wieħed, nginx ma jaf xejn dwar dawn il-fajls statiċi, li (skond il-konfigurazzjoni) għandhom jingħataw lilhom. Bħala riżultat, il-klijent se jara żball 404 għat-talbiet kollha lill-fajls CSS u JS. L-aktar soluzzjoni sempliċi hawnhekk tkun li torganizza direttorju komuni għall-kontenituri. Għażla primitiva - ġenerali emptyDir:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: site
spec:
  selector:
    matchLabels:
      component: backend
  template:
    metadata:
      labels:
        component: backend
    spec:
      volumes:
        - name: assets
          emptyDir: {}
        - name: nginx-config
          configMap:
            name: nginx-configmap
      containers:
      - name: php
        image: own-image-with-php-backend:v1.0
        command: ["/usr/local/sbin/php-fpm","-F"]
        workingDir: /var/www
        volumeMounts:
        - name: assets
          mountPath: /var/www/assets
      - name: nginx
        image: nginx:1.16.0
        command: ["/usr/sbin/nginx", "-g", "daemon off;"]
        volumeMounts:
        - name: assets
          mountPath: /var/www/assets
        - name: nginx-config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: nginx.conf

Issa fajls statiċi ġġenerati fil-kontenitur huma moqdija minn nginx b'mod korrett. Imma ħalluni nfakkarkom li din hija soluzzjoni primittiva, li jfisser li hija 'l bogħod mill-ideali u għandha sfumaturi u nuqqasijiet tagħha stess, li huma diskussi hawn taħt.

Ħażna aktar avvanzata

Issa immaġina sitwazzjoni fejn utent żar is-sit, tagħbija paġna bl-istili disponibbli fil-kontenitur, u waqt li kien qed jaqra din il-paġna, erġajna skjerati l-kontenitur. Il-katalgu tal-assi sar vojt u hija meħtieġa talba lill-PHP biex jibdew jiġġeneraw oħrajn ġodda. Madankollu, anke wara dan, links għal statiċi qodma se jkunu irrilevanti, li jwassal għal żbalji fil-wiri tal-istatika.

Barra minn hekk, x'aktarx għandna proġett ftit jew wisq mgħobbi, li jfisser li kopja waħda tal-applikazzjoni ma tkunx biżżejjed:

  • Ejja nżiduha iskjerament sa żewġ repliki.
  • Meta s-sit ġie aċċessat għall-ewwel darba, l-assi nħolqu f'replika waħda.
  • F'xi punt, id-dħul iddeċieda (għal skopijiet ta 'ibbilanċjar tat-tagħbija) li jibgħat talba lit-tieni replika, u dawn l-assi kienu għadhom ma kinux hemm. Jew forsi m'għadhomx hemm għax nużaw RollingUpdate u bħalissa qed nagħmlu deployment.

B'mod ġenerali, ir-riżultat huwa għal darb'oħra żbalji.

Biex tevita li titlef assi qodma, tista 'tbiddel emptyDir fuq hostPath, li żżid fiżikament statiku ma 'node ta' cluster. Dan l-approċċ huwa ħażin għaliex fil-fatt irridu jorbot ma 'node cluster speċifiku l-applikazzjoni tiegħek, minħabba li - f'każ li tiċċaqlaq għal nodi oħra - id-direttorju mhux se jkun fih il-fajls meħtieġa. Jew xi tip ta 'sfond direttorju sinkronizzazzjoni bejn in-nodi hija meħtieġa.

X'inhuma s-soluzzjonijiet?

  1. Jekk il-ħardwer u r-riżorsi jippermettu, tista 'tuża cephs biex torganizza direttorju ugwalment aċċessibbli għall-bżonnijiet statiċi. Dokumentazzjoni uffiċjali jirrakkomanda drives SSD, mill-inqas replikazzjoni tliet darbiet u konnessjoni stabbli "ħoxna" bejn in-nodi tal-cluster.
  2. Għażla inqas impenjattiva tkun li jiġi organizzat server NFS. Madankollu, imbagħad trid tieħu kont taż-żieda possibbli fil-ħin tar-rispons għall-ipproċessar tat-talbiet mis-server tal-web, u t-tolleranza tal-ħsarat tħalli ħafna x'jixtieq. Il-konsegwenzi ta 'falliment huma katastrofiċi: it-telf tal-muntatura dooms-cluster għall-mewt taħt il-pressjoni tat-tagħbija LA li tgħaġġel fis-sema.

Fost affarijiet oħra, l-għażliet kollha għall-ħolqien ta 'ħażna persistenti se jeħtieġu tindif fl-isfond settijiet skaduti ta' fajls akkumulati fuq ċertu perjodu ta' żmien. Quddiem il-kontenituri bil-PHP tista 'tpoġġi DaemonSet minn caching nginx, li se jaħżen kopji tal-assi għal żmien limitat. Din l-imġieba hija faċilment konfigurabbli bl-użu proxy_cache b'fond ta 'ħażna fi ġranet jew gigabytes ta' spazju fuq disk.

Il-kombinazzjoni ta 'dan il-metodu mas-sistemi ta' fajls distribwiti msemmija hawn fuq jipprovdi qasam enormi għall-immaġinazzjoni, limitat biss mill-baġit u l-potenzjal tekniku ta 'dawk li se jimplimentawh u jappoġġjawh. Mill-esperjenza, nistgħu ngħidu li aktar ma tkun sempliċi s-sistema, iktar tkun stabbli taħdem. Meta saffi bħal dawn jiġu miżjuda, isir ħafna aktar diffiċli li tinżamm l-infrastruttura, u fl-istess ħin iż-żmien mgħoddi għad-dijanjosi u l-irkupru minn kwalunkwe fallimenti jiżdied.

Rakkomandazzjoni

Jekk l-implimentazzjoni tal-għażliet ta 'ħażna proposti wkoll tidher mhux ġustifikata għalik (ikkumplikata, għalja ...), allura ta' min tħares lejn is-sitwazzjoni min-naħa l-oħra. Jiġifieri, biex tħaffer fl-arkitettura tal-proġett u issolvi l-problema fil-kodiċi, marbuta ma' xi struttura statika tad-dejta fl-immaġini, definizzjoni mhux ambigwa tal-kontenut jew proċedura għat-“tisħin” u/jew il-precompiling tal-assi fl-istadju tal-assemblaġġ tal-immaġni. Dan il-mod nikseb imġieba assolutament prevedibbli u l-istess sett ta 'fajls għall-ambjenti kollha u repliki tal-applikazzjoni li qed taħdem.

Jekk nerġgħu lura għall-eżempju speċifiku bil-qafas Yii u ma nidħlux fl-istruttura tiegħu (li mhuwiex l-iskop tal-artikolu), huwa biżżejjed li nindikaw żewġ approċċi popolari:

  1. Ibdel il-proċess tal-bini tal-immaġni biex tpoġġi l-assi f'post prevedibbli. Dan huwa ssuġġerit/implimentat f'estensjonijiet bħal yii2-assi-statiċi.
  2. Iddefinixxi hashes speċifiċi għad-direttorji tal-assi, kif diskuss f’eż. din il-preżentazzjoni (li tibda minn slide Nru 35). Mill-mod, l-awtur tar-rapport fl-aħħar mill-aħħar (u mhux mingħajr raġuni!) Jagħti parir li wara li tgħaqqad l-assi fuq is-server tal-bini, ittellahom f'ħażna ċentrali (bħal S3), quddiemha poġġi CDN.

Fajls li jistgħu jitniżżlu

Każ ieħor li definittivament se jidħol fis-seħħ meta tiġi migrata applikazzjoni għal cluster Kubernetes huwa l-ħażna tal-fajls tal-utent fis-sistema tal-fajls. Pereżempju, aħna għal darb'oħra għandna applikazzjoni PHP li taċċetta fajls permezz ta 'formola ta' upload, tagħmel xi ħaġa magħhom waqt it-tħaddim, u tibgħathom lura.

F'Kubernetes, il-post fejn għandhom jitqiegħdu dawn il-fajls għandu jkun komuni għar-repliki kollha tal-applikazzjoni. Skont il-kumplessità tal-applikazzjoni u l-ħtieġa li tiġi organizzata l-persistenza ta 'dawn il-fajls, l-għażliet tal-apparat kondiviż imsemmija hawn fuq jistgħu jkunu tali post, iżda, kif naraw, għandhom l-iżvantaġġi tagħhom.

Rakkomandazzjoni

Soluzzjoni waħda hija bl-użu ta 'ħażna kompatibbli S3 (anki jekk hija xi tip ta 'kategorija self-hosted bħal minio). Il-bidla għal S3 se teħtieġ bidliet fil-livell tal-kodiċi, u kif il-kontenut se jitwassal fuq in-naħa ta 'quddiem, diġà għandna писали.

Sessjonijiet tal-utenti

Separatament, ta 'min jinnota l-organizzazzjoni tal-ħażna tas-sessjonijiet tal-utent. Ħafna drabi dawn huma wkoll fajls fuq disk, li fil-kuntest ta 'Kubernetes se jwasslu għal talbiet ta' awtorizzazzjoni kostanti mill-utent jekk it-talba tiegħu tispiċċa f'kontenitur ieħor.

Il-problema tissolva parzjalment billi tixgħel stickySessions mad-dħul (il-karatteristika hija appoġġjata fil-kontrolluri tad-dħul popolari kollha - għal aktar dettalji, ara ir-reviżjoni tagħna)biex torbot lill-utent ma' pod speċifiku bl-applikazzjoni:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-test
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

spec:
  rules:
  - host: stickyingress.example.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /

Iżda dan mhux se jelimina problemi bi skjeramenti ripetuti.

Rakkomandazzjoni

Mod aktar korrett ikun li tittrasferixxi l-applikazzjoni lil ħażna sessjonijiet fil memcached, Redis u soluzzjonijiet simili - b'mod ġenerali, kompletament jabbandunaw l-għażliet tal-fajl.

Konklużjoni

Is-soluzzjonijiet infrastrutturali diskussi fit-test huma denji li jintużaw biss fil-format ta '"krozzi" temporanji (li tinstema' aktar sbieħ bl-Ingliż bħala soluzzjoni). Jistgħu jkunu rilevanti fl-ewwel stadji tal-migrazzjoni ta' applikazzjoni għal Kubernetes, iżda m'għandhomx jieħdu l-għeruq.

Il-mogħdija ġenerali rakkomandata hija li teħles minnhom favur modifika arkitettonika tal-applikazzjoni skont dak li diġà huwa magħruf sew għal ħafna App 12-Fattur. Madankollu, dan - li l-applikazzjoni tinġieb f'forma mingħajr stat - inevitabilment ifisser li se jkunu meħtieġa bidliet fil-kodiċi, u hawnhekk huwa importanti li jinstab bilanċ bejn il-kapaċitajiet/rekwiżiti tan-negozju u l-prospetti għall-implimentazzjoni u ż-żamma tat-triq magħżula. .

PS

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment