
CI/CD protsessi loomisel Kubernetesega vĂ”ivad esineda probleemid, kui uue infrastruktuuri nĂ”uded ja sinna viidav rakendus on omavahel vastuolus. Erilist tĂ€helepanu tuleb pöörata rakenduse ehitamise etapis, et saada ĂŒhte pilt, mida kasutatakse projekti kĂ”igi keskkondades ja klastrites. See pĂ”himĂ”te on Ă”igete aluste allikas konteinerite haldamisel (on korduvalt mainitud Siiski ei nĂ€e te olukordi, kus veebisaidi koodis kasutatakse valmis raamistikke, mille kasutamine seab piiranguid selle edasisele kasutusele. Ja kui "tavapĂ€rases keskkonnas" on sellega lihtne toime tulla, vĂ”ib Kuberneteses selline kĂ€itumine muutuda probleemiks, eriti kui seisate selle ees esmakordselt. Kuigi leidlik meel vĂ”ib pakkuda infrastruktuurlahendusi, mis esmapilgul tunduvad ilmsete ja isegi heade lahendustena... on oluline meeles pidada, et enamik olukordi saab ja peab olema
lahendatud arhitektuurselt Vaatame ĂŒle populaarsed workaround-lahendused failide salvestamiseks, mis vĂ”ivad tuua ebameeldivaid tagajĂ€rgi klastri kasutamisel, ning juhime tĂ€helepanu Ă”igematele lahendustele..
Statika hoidmine
Kujutame ette veebirakendust, mis kasutab mingit statika generaatorit piltide, stiilide ja muu komplekti saamiseks. NĂ€iteks PHP-raamistikus Yii on sisseehitatud varade haldaja, mis genereerib unikaalsed kataloogide nimed. SeetĂ”ttu on tulemuseks komplekt, millel on ilmselgelt ĂŒksteisega mitteĂŒletavad teed veebisaidi statikaks (see on saavutatud mitmetel pĂ”hjustel - nĂ€iteks duplikaatide vĂ€ltimiseks, kui sama ressursi kasutavad mitmed komponendid). Nii korraldavad need sisseehitatud sĂŒsteemid esmakordsel veebiresursi mooduli juurdepÀÀsul staatika genereerimise ja paigutamise (pĂ€ris tihti on tegemist sĂŒmboolsete linkidega, kuid sellest rÀÀgime hiljem) unikaalse ĂŒldise juurkatalooge jaoks, mis on seotud selle vĂ€ljastusprotsessiga:
webroot/assets/2072c2df/css/âŠ
-
webroot/assets/2072c2df/images/⊠-
webroot/assets/2072c2df/js/⊠-
Mida see tÀhendab klastrist vaadatuna?
Lihtsaim nÀide
VĂ”tame ĂŒsna levinud juhtumi, kus PHP ees on nginx staatika edastamiseks ja lihtsate pĂ€ringute töötlemiseks. Lihtsaim lahendus on
kahe konteineriga: Deployment kahe konteineriga:
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.confLihtsustatud vormis nginx-i konfiguratsioon kokkuvÔttes on jÀrgmine:
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;
}
} Esimese kĂŒlastuse puhul veebisaidile PHP konteineris ilmuvad varad. Kuid kahe konteineriga sama pod'i raames â nginx ei tea neist staatilistest failidest, mis (vastavalt konfiguratsioonile) peaks neid edastama. Tulemusena nĂ€eb klient kĂ”igis CSS- ja JS-failide pĂ€ringutes viga 404. Lihtsaim lahendus oleks korraldada konteinerite vahel ĂŒhine kataloog. Primitiivne variant â ĂŒhine 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.confNĂŒĂŒd konteineris genereeritud staatilised failid edastatakse nginx'i kaudu Ă”igesti. Kuid tuletan meelde, et see on primitiivne lahendus, seega â see on kaugel ideest ja sellel on omad nĂŒansid ja puudused, millest allpool.
Kaugtöötlemiseks arenenum salvestus
Kujutage ette, et kasutaja siseneb veebisaitile, laadib lehe, kus on konteineris olemasolevad stiilid, ja samal ajal, kui ta seda lehte loeb, deployime konteineri uuesti. Varade kataloog on tĂŒhjaks jÀÀnud ja on vajalik pĂ€ring PHP-le, et kĂ€ivitada uute genereerimine. Kuid isegi pĂ€rast seda on linke vana staatika juurde endiselt aegunud, mis viib staatika kuvamise vigadeni.
Lisaks on meie projekt tĂ”enĂ€oliselt rohkem vĂ”i vĂ€hem koormatud, seega ei piisa ĂŒhest rakenduse koopiast:
- Suurendame Deployment kuni kahe koopiani.
- Esimese pĂ€ringu korral said ĂŒhes koopias loodud varad.
- MÔnes punktis otsustas ingress (koormuse tasakaalustamise eesmÀrgil) saata pÀringu teisele koopiale, ja seal ei ole neid varasid veel. VÔib-olla ei ole neid seal juba ka seetÔttu, et me kasutame
RollingUpdateja hetkel teeme deploy'i.
KokkuvĂ”ttes â taas vead.
Kuna vanade varade kaotamine on vĂ€ltimatu, saab muuta emptyDir . Tundub, et hostPath, ladustades staatika fĂŒĂŒsiliselt klastri sĂ”lmele. See lĂ€henemine on halb, kuna me tegelikult peame seotuks olema konkreetse klastri sĂ”lmega oma rakendusega, sest â kui liigume teistesse sĂ”lmedesse â ei sisalda kataloog vajalikke faile. Vastasel juhul on vajalik mingi taustasĂŒnkroonimine sĂ”lmede vahel.
Millised on lahenduseed?
- Kui riistvara ja ressursid lubavad, saab kasutada staatika vajaduste jaoks ligipÀÀsetava katalooge korraldamiseks. soovitatakse SSD-diske, vĂ€hemalt kolme kordset koopiat ja stabiilset "paksu" ĂŒhendust klastri sĂ”lmede vahel.
- VÀhem nÔudlik variant oleks NFS-serveri korraldamine. Siiski tuleb arvestada vÔimaliku hilinemise suurenemisega veebiserveri pÀringute töötlemisel, ning ka töökindlus ei ole parimal tasemel. Vea tagajÀrjed on katastroofilised: mount'i kadumine condeneerib klastrit surmale laadimise LA surve all, mis tÔuseb taevasse.
KĂ”igi pĂŒsiva salvestuse loomise variantide puhul on aga vajalik taustapuhastus aegunud failide komplektide osas, mis on kogunenud teatud ajavahemiku jooksul. PHP konteinerite ette saab paigaldada DaemonSet caching nginx-d, mis hoiavad varade koopiaid piiratud ajaks. See kĂ€itusmuster on lihtsalt seadistatav proxy_cache salvestusaja vĂ”i gigabaitide kettaruumiga.
Selle meetodi ĂŒhendamine ĂŒlalpool mainitud jaotatud failisĂŒsteemidega avab tohutu vĂ”imaluse, kus piiranguks on ainult eelarve ja tehnilised vĂ”imalused nende rakendamiseks ja hooldamiseks. Kogemuste kohaselt toimib lihtsam sĂŒsteem stabiilsemalt. Lisakihtide lisamine muudab infrastruktuuri toetamise palju keerulisemaks, mis omakorda suurendab diagnoosimiseks ja taastamiseks kuluvat aega.
Soovitus
Kui pakutud salvestuslahenduste rakendamine tundub teile Ă”igustamata (keeruline, kallis...), siis tasub olukorda vaadata teise nurga alt. TĂ€psemalt â uurida projekti arhitektuuri ja eemaldada probleem koodist, seostades teatud staatilise andmestruktuuriga pildis, sisu vĂ”i protseduuri âĂ€daldamineâ ja/vĂ”i varasem kompileerimine varade kogumise etapis. Nii saame tĂ€iesti ettenĂ€htava kĂ€itumise ja ĂŒhtse failide komplekti kĂ”igis keskkondades ja rakenduse replikates.
Kui naasta konkreetse nĂ€ite juurde raamistikust Yii, ilma et sĂŒveneksime selle struktuuri (mis ei ole artikli eesmĂ€rk), piisab, kui osutada kahele populaarsele lĂ€henemisele:
- Muuda pildikogumise protsessi, et asetada varad ettenÀhtud kohta. Nii pakuvad/realiseerivad selliseid laiendusi nagu .
- MÀÀra konkreetseid rĂ€sikoodide varade kataloogide jaoks, nagu on rÀÀgitud nĂ€iteks, (alates slaidist â35). Muide, esitaja soovitab lĂ”puks (ja mitte ilma pĂ”hjuseta!) pĂ€rast varade kogumist build-serveril need ĂŒles laadida keskseks salvestamiseks (nt S3), mille ette paigutada CDN.
Ăles laaditud failid
Teine juhtum, mis kindlasti töötab rakenduse viimise ajal Kubernetes klastrisse, on kasutajafailide hoidmine failisĂŒsteemis. NĂ€iteks on meil taas PHP rakendus, mis vĂ”tab faile ĂŒleslaadimisvormi kaudu, teeb nendega midagi töö kĂ€igus ja tagastab need tagasi.
Koht, kuhu need failid peavad minema, peab Kuberneteses olema rakenduse replikate jaoks ĂŒhine. SĂ”ltuvalt rakenduse keerukusest ja vajadusest organiseerida nende failide pĂŒsimine vĂ”ivad sellised kohad olla ĂŒlal mainitud jagatud seadmed, kuid nagu me nĂ€eme, on neil oma miinused.
Soovitus
Ăks lahendus on kasutada S3-ĂŒhilduvat salvestust (isegi kui tegemist on mingi sarnase variandiga iseseisvalt majutatavast nagu minio). Ăleminek S3 kasutamisele nĂ”uab muudatusi koodi tasandil, kuidas sisu edastamine frontendis toimub, oleme juba .
Kasutaja sessioonid
Eraldi tuleks mÀrkida kasutaja sessioonide salvestamise korraldus. Tihti on need samuti failid kettal, mis Kuberneteses toob kaasa pidevad autentimispÀringud, kui kasutaja pÀring satub teise konteinerisse.
Osaliselt lahendab probleemi stickySessions ingressis (seda funktsiooni toetatakse kĂ”igis populaarsetes ingressi kontrollers â lisainfot vt ), et siduda kasutaja konkreetse rakenduse podâiga:
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: /Kuid see ei vabasta probleemidest korduvate juurutamiste korral.
Soovitus
Ăigem viis oleks rakenduse ĂŒleviimine sessioonide salvestamiseks memcachedis, Redis ja sarnastes lahendustes â ĂŒldiselt tĂ€ielik loobumine failivariantidest.
KokkuvÔte
Artiklis kÀsitletud infrastruktuuri lahendused vÀÀrivad rakendamist ainult ajutiste "pakkide" vormis (mis kÔlab ingliskeelsena ilusamalt kui workaround). Need vÔivad olla asjakohased rakenduse migratsiooni varastes etappides Kubernetesesse, kuid ei tohiks "juurduda".
Ăldine soovituslik tee on kĂ”rvaldada need, et tĂ€iustada rakenduse arhitektuuri vastavalt juba laialdaselt tuntud . Kuid see â rakenduse viimine stateless kujule â tĂ€hendab paratamatult, et on vajalikud muudatused koodis, ja siin on oluline leida tasakaal Ă€ri vĂ”imaluste/nĂ”udmiste ja valitud tee elluviimise ning hooldamise perspektiivide vahel.
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «» (Red Hatilt);
- «».
Allikas: habr.com
