Fichye lokal yo lè w ap imigre yon aplikasyon nan Kubernetes

Fichye lokal yo lè w ap imigre yon aplikasyon nan Kubernetes

Lè w ap bati yon pwosesis CI/CD lè l sèvi avèk Kubernetes, pafwa pwoblèm nan rive nan enkonpatibilite ant kondisyon ki nan enfrastrikti nan nouvo ak aplikasyon an ke yo te transfere nan li. An patikilye, nan etap nan konstriksyon aplikasyon li enpòtan jwenn yon sèl imaj ki pral itilize nan nan tout anviwònman pwojè ak grap. Prensip sa a kache kòrèk la dapre Google jesyon veso (plis pase yon fwa sou sa pale ak depatman teknik nou an).

Sepandan, ou pa pral wè nenpòt moun ki nan sitiyasyon kote kòd sit la sèvi ak yon fondasyon pare-fè, itilizasyon ki enpoze restriksyon sou plis itilizasyon li yo. Epi pandan ke nan yon "anviwònman nòmal" sa a se fasil fè fas ak, nan Kubernetes konpòtman sa a ka vin yon pwoblèm, espesyalman lè ou rankontre li pou premye fwa. Pandan ke yon lide envante ka vini ak solisyon enfrastrikti ki sanble evidan oswa menm bon nan premye gade ... li enpòtan sonje ke pifò sitiyasyon yo ka epi yo ta dwe dwe rezoud achitekti.

Ann gade nan solisyon solisyon popilè pou estoke dosye ki ka mennen nan konsekans dezagreyab lè w ap opere yon gwoup, epi tou li montre yon chemen ki pi kòrèk.

Depo estatik

Pou ilistre, konsidere yon aplikasyon entènèt ki itilize yon kalite jeneratè estatik pou jwenn yon seri imaj, estil, ak lòt bagay. Pou egzanp, fondasyon Yii PHP a gen yon manadjè byen entegre ki jenere non anyè inik. An konsekans, pwodiksyon an se yon seri chemen pou sit la estatik ki evidamman pa kwaze youn ak lòt (sa a te fè pou plizyè rezon - pou egzanp, elimine kopi lè plizyè konpozan itilize menm resous la). Se konsa, soti nan bwat la, premye fwa ou jwenn aksè nan yon modil resous entènèt, fichye estatik (an reyalite, souvan lyen senbolik, men plis sou sa pita) yo fòme ak mete deyò ak yon anyè rasin komen inik pou deplwaman sa a:

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

Ki sa sa vle di an tèm de yon gwoup?

Egzanp ki pi senp la

Ann pran yon ka jistis komen, lè PHP anvan pa nginx distribye done estatik ak trete demann senp. Fason ki pi fasil - deplwaman ak de veso:

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

Nan yon fòm senplifye, nginx konfigirasyon an diminye nan bagay sa yo:

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;
        }
    }

Lè ou premye aksè sit la, byen parèt nan veso PHP a. Men, nan ka de resipyan ki nan yon sèl gous, nginx pa konnen anyen sou fichye estatik sa yo, ki (dapre konfigirasyon an) ta dwe ba yo. Kòm yon rezilta, kliyan an pral wè yon erè 404 pou tout demann nan dosye CSS ak JS. Solisyon ki pi senp isit la ta dwe òganize yon anyè komen pou resipyan yo. Opsyon primitif - jeneral 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

Koulye a, fichye estatik ki te pwodwi nan veso a yo sèvi pa nginx kòrèkteman. Men, kite m 'fè ou sonje ke sa a se yon solisyon primitif, ki vle di li se byen lwen soti nan ideyal e li gen nuans pwòp li yo ak enpèfeksyon, ki yo diskite anba a.

Depo pi avanse

Koulye a, imajine yon sitiyasyon kote yon itilizatè te vizite sit la, chaje yon paj ak estil ki disponib nan veso a, epi pandan li t ap li paj sa a, nou re-deplwaye veso a. Katalòg byen yo te vin vid epi yon demann PHP oblije kòmanse jenere nouvo. Sepandan, menm apre sa, lyen ki mennen nan estatik fin vye granmoun yo pral petinan, ki pral mennen nan erè nan montre estatik.

Anplis de sa, nou gen plis chans gen yon pwojè plis oswa mwens chaje, ki vle di ke yon kopi aplikasyon an pa pral ase:

  • An nou echèl li deplwaman jiska de kopi.
  • Lè yo te premye aksè sit la, byen yo te kreye nan yon sèl kopi.
  • Nan kèk pwen, ingress te deside (pou rezon balanse chaj) voye yon demann nan dezyèm kopi a, ak byen sa yo pa t 'la ankò. Oswa petèt yo pa la ankò paske nou itilize RollingUpdate ak nan moman an nou ap fè deplwaman.

An jeneral, rezilta a se ankò erè.

Pou evite pèdi ansyen byen, ou ka chanje emptyDir sou hostPath, ajoute estatik fizikman nan yon ne grap. Apwòch sa a se move paske nou aktyèlman oblije mare nan yon ne grap espesifik aplikasyon w lan, paske - nan ka deplase nan lòt nœuds - anyè a pa pral gen dosye ki nesesè yo. Oswa gen kèk kalite senkronizasyon anyè background ant nœuds obligatwa.

Ki solisyon yo?

  1. Si pyès ki nan konpitè ak resous pèmèt, ou ka itilize cephs pou òganize yon anyè egalman aksesib pou bezwen estatik. Dokiman ofisyèl rekòmande kondui SSD, omwen twa fwa replikasyon ak yon koneksyon ki estab "epè" ant nœuds gwoup yo.
  2. Yon opsyon mwens mande ta dwe òganize yon sèvè NFS. Sepandan, Lè sa a, ou bezwen pran an kont ogmantasyon posib nan tan repons pou demann pwosesis pa sèvè entènèt la, ak tolerans fay pral kite anpil yo dwe vle. Konsekans echèk yo katastwofik: pèt mòn lan kondane gwoup la nan lanmò anba presyon chaj LA ki kouri nan syèl la.

Pami lòt bagay, tout opsyon pou kreye depo ki pèsistan pral mande netwayaj background seri demode nan dosye akimile sou yon sèten peryòd tan. Devan kontenè ak PHP ou ka mete DaemonSet soti nan kachèt nginx, ki pral estoke kopi byen yo pou yon tan limite. Konpòtman sa a se fasil configurable lè l sèvi avèk proxy_cache ak pwofondè depo nan jou oswa jigokte espas ki gen kapasite.

Konbine metòd sa a ak sistèm dosye distribye mansyone pi wo a bay yon gwo jaden pou imajinasyon, limite sèlman pa bidjè a ak potansyèl teknik moun ki pral aplike ak sipòte li. Soti nan eksperyans, nou ka di ke sistèm nan pi senp, se plis ki estab li travay. Lè yo ajoute kouch sa yo, li vin pi difisil pou kenbe enfrastrikti a, epi an menm tan tan an pase sou dyagnostik ak rekipere de nenpòt echèk ogmante.

Rekòmandasyon

Si aplikasyon an nan opsyon depo yo pwopoze yo sanble tou enjistis ba ou (konplike, chè ...), Lè sa a, li vo gade nan sitiyasyon an soti nan lòt bò a. Savwa, fouye nan achitekti nan pwojè ak ranje pwoblèm nan nan kòd la, mare nan kèk estrikti done estatik nan imaj la, yon definisyon klè nan kontni an oswa pwosedi pou "chofe" ak / oswa precompiling byen nan etap asanble imaj la. Nan fason sa a nou jwenn yon konpòtman absoliman previzib ak menm seri dosye pou tout anviwònman ak kopi aplikasyon an kouri.

Si nou retounen nan egzanp espesifik ak kad Yii a epi nou pa fouye nan estrikti li yo (ki se pa objektif la nan atik la), li ase yo montre de apwòch popilè:

  1. Chanje pwosesis konstriksyon imaj la pou mete byen yo nan yon kote ki previzib. Sa a se sijere / aplike nan ekstansyon tankou yii2-static-assets.
  2. Defini hashes espesifik pou anyè byen, jan yo diskite nan egzanp. prezantasyon sa a (kòmanse nan glise No 35). By wout la, otè a nan rapò a finalman (epi pa san rezon!) Avize ke apre rasanble byen sou sèvè a bati, Upload yo nan yon depo santral (tankou S3), nan devan ki mete yon CDN.

Telechajman

Yon lòt ka ki pral definitivman antre nan jwèt lè imigre yon aplikasyon nan yon gwoup Kubernetes se estoke fichye itilizatè yo nan sistèm nan dosye. Pou egzanp, nou gen ankò yon aplikasyon PHP ki aksepte dosye atravè yon fòm Upload, fè yon bagay ak yo pandan operasyon, epi voye yo tounen.

Nan Kubernetes, kote yo ta dwe mete dosye sa yo ta dwe komen nan tout kopi aplikasyon an. Tou depan de konpleksite aplikasyon an ak nesesite pou òganize pèsistans yap ogmante jiska fichye sa yo, opsyon sa yo aparèy pataje pi wo a ka tankou yon kote, men, jan nou wè, yo gen dezavantaj yo.

Rekòmandasyon

Yon solisyon se lè l sèvi avèk depo S3-konpatib (menm si se yon kalite kategori pwòp tèt ou akomode tankou minio). Chanje nan S3 pral mande pou chanjman nan nivo kòd, ak ki jan kontni yo pral delivre sou fen devan an, nou gen deja писали.

Sesyon itilizatè yo

Separeman, li vo anyen òganizasyon an nan depo nan sesyon itilizatè. Souvan sa yo se tou dosye sou disk, ki nan yon kontèks Kubernetes ap mennen nan demann otorizasyon konstan nan men itilizatè a si demann li fini nan yon lòt veso.

Pwoblèm nan an pati rezoud pa vire sou stickySessions sou antre (se karakteristik la sipòte nan tout contrôleur antre popilè - pou plis detay, gade revizyon nou an)mare itilizatè a nan yon gous espesifik ak aplikasyon an:

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: /

Men, sa a pa pral elimine pwoblèm ak deplwaman repete.

Rekòmandasyon

Yon fason ki pi kòrèk ta dwe transfere aplikasyon an nan estoke sesyon yo nan memcached, Redis ak solisyon menm jan an - an jeneral, konplètman abandone opsyon dosye.

Konklizyon

Solisyon enfrastrikti yo diskite nan tèks la merite pou yo itilize sèlman nan fòma "beki" tanporè (ki son pi bèl nan lang angle kòm solisyon). Yo ka enpòtan nan premye etap yo nan migrasyon yon aplikasyon nan Kubernetes, men yo pa ta dwe pran rasin.

Chemen jeneral rekòmande a se debarase m de yo an favè modifikasyon achitekti aplikasyon an an akò ak sa ki deja byen li te ye nan anpil moun. 12-Faktè App. Sepandan, sa a - pote aplikasyon an nan yon fòm apatrid - inevitableman vle di ke chanjman nan kòd la pral obligatwa, epi isit la li enpòtan pou jwenn yon balans ant kapasite/kondisyon biznis la ak kandida yo pou mete ann aplikasyon epi kenbe chemen yo chwazi a. .

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè