Lokal nga mga file kung mobalhin sa usa ka aplikasyon sa Kubernetes

Lokal nga mga file kung mobalhin sa usa ka aplikasyon sa Kubernetes

Kung nagtukod usa ka proseso sa CI / CD gamit ang Kubernetes, usahay ang problema motungha sa dili pagkauyon tali sa mga kinahanglanon sa bag-ong imprastraktura ug ang aplikasyon nga gibalhin niini. Sa partikular, sa yugto sa pagtukod sa aplikasyon hinungdanon nga makuha ΠΎΠ΄ΠΈΠ½ imahe nga gamiton sa sa tanan mga palibot ug mga cluster sa proyekto. Kini nga prinsipyo nagpailalom sa husto sumala sa Google pagdumala sa sudlanan (kapin sa kausa bahin niini namulong ug ang among teknikal nga departamento).

Bisan pa, dili nimo makita ang bisan kinsa sa mga sitwasyon diin ang code sa site naggamit sa usa ka andam nga balangkas, ang paggamit niini nagpahamtang sa mga pagdili sa dugang nga paggamit niini. Ug samtang sa usa ka "normal nga palibot" kini dali nga atubangon, sa Kubernetes kini nga pamatasan mahimong usa ka problema, labi na kung masugatan nimo kini sa unang higayon. Samtang ang usa ka mamugnaon nga hunahuna makahimo og mga solusyon sa imprastraktura nga ingon og klaro o maayo pa sa unang pagtan-aw... importante nga hinumdoman nga kadaghanan sa mga sitwasyon mahimo ug kinahanglan. masulbad sa arkitektura.

Atong tan-awon ang mga sikat nga solusyon sa workaround alang sa pagtipig sa mga file nga mahimong mosangpot sa dili maayo nga mga sangputanan kung mag-operate sa usa ka cluster, ug itudlo usab ang usa ka mas husto nga dalan.

Static nga pagtipig

Sa pag-ilustrar, tagda ang usa ka web application nga naggamit ug usa ka matang sa static generator aron makakuha ug set sa mga hulagway, estilo, ug uban pang mga butang. Pananglitan, ang Yii PHP framework adunay usa ka built-in asset manager nga nagmugna og talagsaon nga mga ngalan sa direktoryo. Tungod niini, ang output usa ka set sa mga agianan alang sa static nga site nga klaro nga wala mag-intersect sa usag usa (gibuhat kini sa daghang mga hinungdan - pananglitan, aron mawagtang ang mga duplicate kung daghang mga sangkap ang naggamit sa parehas nga kapanguhaan). Busa, sa gawas sa kahon, sa unang higayon nga maka-access ka sa usa ka web resource module, ang mga static nga mga file (sa pagkatinuod, kasagaran mga symlink, apan labaw pa niana sa ulahi) naporma ug gibutang sa usa ka komon nga root directory nga talagsaon alang niini nga pag-deploy:

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

Unsa ang gipasabut niini sa termino sa usa ka cluster?

Ang pinakasimple nga pananglitan

Atong kuhaon ang usa ka medyo komon nga kaso, kung ang PHP giunhan sa nginx sa pag-apod-apod sa static nga datos ug pagproseso sa yano nga mga hangyo. Ang pinakasayon ​​nga paagi- deployment nga adunay duha ka sudlanan:

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

Sa usa ka gipasimple nga porma, ang nginx config nagbukal sa mosunod:

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

Sa una nimong pag-access sa site, ang mga kabtangan makita sa sulud sa PHP. Apan sa kaso sa duha ka mga sudlanan sulod sa usa ka pod, ang nginx walay nahibal-an mahitungod niining mga static nga mga file, nga (sumala sa configuration) kinahanglan nga ihatag ngadto kanila. Isip resulta, ang kliyente makakita og 404 error para sa tanang hangyo sa CSS ug JS files. Ang pinakasimple nga solusyon dinhi mao ang pag-organisar og komon nga direktoryo para sa mga sudlanan. Primitive nga kapilian - kinatibuk-an 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

Karon ang mga static nga file nga nahimo sa sulud gisilbi sa nginx sa husto. Apan pahinumdoman ko ikaw nga kini usa ka primitive nga solusyon, nga nagpasabut nga kini layo sa sulundon ug adunay kaugalingon nga mga nuances ug mga kakulangan, nga gihisgutan sa ubos.

Mas abante nga pagtipig

Karon hunahunaa ang usa ka sitwasyon diin ang usa ka user mibisita sa site, nagkarga sa usa ka panid sa mga estilo nga anaa sa sudlanan, ug samtang nagbasa siya niini nga panid, among gi-deploy ang sudlanan. Ang katalogo sa mga kabtangan nahimong walay sulod ug ang usa ka hangyo sa PHP gikinahanglan aron magsugod sa pagmugna og mga bag-o. Bisan pa, bisan pagkahuman niini, ang mga link sa mga daan nga estadistika wala’y kalabotan, nga mosangpot sa mga sayup sa pagpakita sa mga estadistika.

Dugang pa, lagmit kita adunay mas daghan o dili kaayo puno nga proyekto, nga nagpasabot nga ang usa ka kopya sa aplikasyon dili igo:

  • Ato kining sukdon deployment hangtod sa duha ka replika.
  • Sa una nga pag-access sa site, ang mga kabtangan gihimo sa usa ka kopya.
  • Sa pila ka punto, ang ingress nakahukom (alang sa mga katuyoan sa pagbalanse sa load) nga magpadala usa ka hangyo sa ikaduha nga kopya, ug kini nga mga kabtangan wala pa didto. O ba kaha wala na sila kay atong gigamit RollingUpdate ug sa pagkakaron nag deploy na mi.

Sa kinatibuk-an, ang resulta mao ang pag-usab sa mga sayop.

Aron malikayan ang pagkawala sa daan nga mga kabtangan, mahimo nimong usbon emptyDir sa hostPath, pagdugang ug static nga pisikal sa usa ka cluster node. Kini nga pamaagi dili maayo tungod kay kinahanglan gyud naton pagbugkos sa usa ka piho nga cluster node imong aplikasyon, tungod kay - sa kaso sa pagbalhin sa ubang mga node - ang direktoryo dili maglangkob sa gikinahanglan nga mga file. O usa ka matang sa pag-synchronize sa direktoryo sa background tali sa mga node gikinahanglan.

Unsa ang mga solusyon?

  1. Kung gitugotan ang hardware ug mga kapanguhaan, mahimo nimong gamiton mga cephfs sa pag-organisar sa usa ka parehas nga accessible nga direktoryo alang sa static nga mga panginahanglan. Opisyal nga dokumentasyon nagrekomendar sa mga drive sa SSD, labing menos tulo ka pilo nga replikasyon ug usa ka lig-on nga "baga" nga koneksyon tali sa mga cluster node.
  2. Ang dili kaayo lisud nga kapilian mao ang pag-organisar sa usa ka NFS server. Bisan pa, kinahanglan nimo nga tagdon ang posible nga pagtaas sa oras sa pagtubag alang sa pagproseso sa mga hangyo sa web server, ug ang pagtugot sa sayup magbilin daghang gusto. Ang mga sangputanan sa kapakyasan mao ang katalagman: ang pagkawala sa bukid naglaglag sa pungpong hangtod sa kamatayon ubos sa pag-atake sa LA load nga nagdali sa kalangitan.

Lakip sa ubang mga butang, ang tanan nga mga kapilian alang sa paghimo sa padayon nga pagtipig kinahanglan paglimpyo sa background karaan nga mga set sa mga file nga natipon sa usa ka piho nga yugto sa panahon. Sa atubangan sa mga sudlanan nga adunay PHP mahimo nimong ibutang DaemonSet gikan sa caching nginx, nga magtipig mga kopya sa mga kabtangan sa limitado nga oras. Kini nga pamatasan dali nga ma-configure gamit proxy_cache nga adunay giladmon sa pagtipig sa mga adlaw o gigabytes sa disk space.

Ang paghiusa niini nga pamaagi sa gipang-apod-apod nga mga sistema sa file nga gihisgutan sa ibabaw naghatag usa ka dako nga natad alang sa imahinasyon, limitado lamang sa badyet ug teknikal nga potensyal sa mga mopatuman ug mosuporta niini. Gikan sa kasinatian, makaingon kita nga ang mas simple nga sistema, mas lig-on kini. Kung idugang ang ingon nga mga layer, mahimong labi ka lisud ang pagpadayon sa imprastraktura, ug sa samang higayon ang oras nga gigugol sa pagdayagnos ug pag-ayo gikan sa bisan unsang mga kapakyasan nagdugang.

Pagrekomenda

Kung ang pagpatuman sa gisugyot nga mga kapilian sa pagtipig ingon usab dili makatarunganon kanimo (komplikado, mahal ...), nan takus nga tan-awon ang sitwasyon gikan sa pikas nga bahin. Nga mao, sa pagkalot sa proyekto arkitektura ug ayuhon ang problema sa code, gihigot sa pipila ka static nga istruktura sa datos sa imahe, usa ka dili klaro nga kahulugan sa mga sulud o pamaagi alang sa "pagpainit" ug / o pag-precompile nga mga kabtangan sa yugto sa asembliya sa imahe. Niining paagiha makuha namon ang hingpit nga matag-an nga pamatasan ug parehas nga set sa mga file alang sa tanan nga mga palibot ug mga kopya sa nagdagan nga aplikasyon.

Kung mobalik kita sa espesipikong pananglitan sa Yii nga gambalay ug dili magsusi sa istruktura niini (nga dili ang katuyoan sa artikulo), igo na nga itudlo ang duha ka popular nga mga pamaagi:

  1. Usba ang proseso sa paghimo sa imahe aron ibutang ang mga kabtangan sa usa ka matag-an nga lokasyon. Kini gisugyot/gipatuman sa mga extension sama sa yii2-static-assets.
  2. Ipasabut ang piho nga mga hash alang sa mga direktoryo sa asset, sama sa gihisgutan sa e.g. kini nga presentasyon (sugod sa slide No. 35). Pinaagi sa dalan, ang tagsulat sa taho sa katapusan (ug dili walay rason!) Nagtambag nga human sa pag-assemble sa mga kabtangan sa build server, i-upload kini sa usa ka sentral nga storage (sama sa S3), sa atubangan diin ibutang ang usa ka CDN.

Ma-download nga mga file

Laing kaso nga siguradong mahitabo kung ang pagbalhin sa usa ka aplikasyon sa usa ka cluster sa Kubernetes mao ang pagtipig sa mga file sa gumagamit sa file system. Pananglitan, aduna na usab kami usa ka PHP nga aplikasyon nga modawat sa mga file pinaagi sa usa ka upload nga porma, adunay usa ka butang uban kanila sa panahon sa operasyon, ug ipadala kini balik.

Sa Kubernetes, ang lokasyon kung asa ibutang kini nga mga file kinahanglan nga kasagaran sa tanan nga mga kopya sa aplikasyon. Depende sa pagkakomplikado sa aplikasyon ug sa panginahanglan sa pag-organisar sa pagpadayon sa kini nga mga file, ang gihisgutan sa ibabaw nga gipaambit nga mga kapilian sa aparato mahimo nga usa ka lugar, apan, ingon sa atong nakita, sila adunay ilang mga kakulangan.

Pagrekomenda

Usa ka solusyon mao ang gamit ang S3-compatible nga storage (bisan kung kini usa ka matang sa self-host nga kategorya sama sa minio). Ang pagbalhin sa S3 nanginahanglan mga pagbag-o sa lebel sa code, ug kung giunsa ang paghatud sa sulud sa atubangan nga tumoy, naa na kami nagsulat.

Mga sesyon sa tiggamit

Sa tinuud, angay nga matikdan ang organisasyon sa pagtipig sa mga sesyon sa tiggamit. Kasagaran kini mga file usab sa disk, nga sa konteksto sa Kubernetes modala sa kanunay nga mga hangyo sa pagtugot gikan sa tiggamit kung ang iyang hangyo matapos sa lain nga sudlanan.

Ang problema bahin nga nasulbad pinaagi sa pag-on stickySessions sa pagsulod (ang bahin gisuportahan sa tanan nga bantog nga ingress controllers - alang sa dugang nga mga detalye, tan-awa atong review)aron mabugkos ang user sa usa ka piho nga pod sa aplikasyon:

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

Apan dili kini makawagtang sa mga problema sa balik-balik nga pag-deploy.

Pagrekomenda

Ang mas husto nga paagi mao ang pagbalhin sa aplikasyon sa pagtipig sa mga sesyon sa memcached, Redis ug parehas nga mga solusyon - sa kinatibuk-an, hingpit nga biyaan ang mga kapilian sa file.

konklusyon

Ang mga solusyon sa imprastraktura nga gihisgutan sa teksto takus nga gamiton lamang sa porma sa temporaryo nga "crutches" (nga mas nindot tan-awon sa English isip workaround). Mahimong may kalabotan kini sa unang mga yugto sa pagbalhin sa aplikasyon ngadto sa Kubernetes, apan dili kinahanglan nga mogamot.

Ang kinatibuk-ang girekomenda nga agianan mao ang pagtangtang kanila pabor sa pagbag-o sa arkitektura sa aplikasyon uyon sa nahibal-an na sa kadaghanan. 12-Factor App. Bisan pa, kini - ang pagdala sa aplikasyon sa usa ka stateless nga porma - dili malikayan nga nagpasabut nga kinahanglan ang mga pagbag-o sa code, ug dinhi hinungdanon nga makit-an ang balanse tali sa mga kapabilidad / kinahanglanon sa negosyo ug ang mga palaaboton alang sa pagpatuman ug pagpadayon sa gipili nga dalan. .

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment