Payil lokal nalika migrasi aplikasi ka Kubernetes

Payil lokal nalika migrasi aplikasi ka Kubernetes

Nalika ngawangun prosés CI / CD nganggo Kubernetes, kadang masalah timbul tina sauyunan antara sarat infrastruktur anyar sareng aplikasi anu ditransferkeun ka dinya. Khususna, dina tahap ngawangun aplikasi penting pikeun meunang один gambar nu bakal dipaké dina всех lingkungan proyék jeung klaster. Prinsip ieu underlies bener nurutkeun Google manajemén wadahna (leuwih ti sakali ngeunaan ieu nyarios sareng departemén téknis kami).

Nanging, anjeun moal ningali saha waé dina kaayaan dimana kodeu situs nganggo kerangka anu siap-siap, anu ngagunakeunana maksakeun larangan pikeun panggunaan salajengna. Sarta bari dina "lingkungan normal" ieu gampang nungkulan, dina Kubernetes kabiasaan ieu bisa jadi masalah, utamana lamun sapatemon eta pikeun kahiji kalina. Bari pikiran inventive bisa datang nepi ka solusi infrastruktur nu sigana atra atawa malah alus di glance kahiji ... hal anu penting pikeun inget yen paling kaayaan bisa jeung kudu. direngsekeun sacara arsitéktur.

Hayu urang tingali solusi workaround populér pikeun nyimpen file anu tiasa ngakibatkeun akibat anu teu pikaresepeun nalika ngajalankeun klaster, sareng ogé nunjukkeun jalan anu langkung leres.

Panyimpen statik

Pikeun ngagambarkeun, pertimbangkeun aplikasi wéb anu nganggo sababaraha jinis generator statik pikeun kéngingkeun sakumpulan gambar, gaya, sareng hal-hal sanés. Salaku conto, kerangka Yii PHP gaduh manajer aset anu diwangun anu ngahasilkeun nami diréktori unik. Sasuai, kaluaran nyaéta sakumpulan jalur pikeun situs statik anu écés henteu silih potong (ieu dilakukeun pikeun sababaraha alesan - contona, pikeun ngaleungitkeun duplikat nalika sababaraha komponén nganggo sumberdaya anu sami). Janten, out of the box, pertama kali anjeun ngaksés modul sumber wéb, file statik (saleresna, sering symlinks, tapi langkung seueur ngeunaan éta engké) kabentuk sareng ditata kalayan diréktori akar umum anu unik pikeun panyebaran ieu:

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

Naon ieu hartosna dina watesan klaster?

Conto pangbasajanna

Hayu urang nyandak kasus anu cukup umum, nalika PHP diawalan ku nginx pikeun ngadistribusikaeun data statik sareng ngolah pamundut saderhana. Cara panggampangna - deployment kalawan dua wadah:

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

Dina bentuk anu saderhana, konfigurasi nginx diturunkeun ka handap:

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

Nalika anjeun mimiti ngaksés situs éta, aset muncul dina wadah PHP. Tapi dina kasus dua peti dina hiji pod, nginx terang nanaon ngeunaan ieu file statik, nu (nurutkeun konfigurasi) kudu dibikeun ka aranjeunna. Hasilna, klien bakal ningali kasalahan 404 pikeun sakabéh requests kana file CSS jeung JS. Solusi pangbasajanna didieu bakal ngatur hiji diréktori umum pikeun peti. Pilihan primitif - umum 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

Ayeuna file statik anu dihasilkeun dina wadahna dilayanan ku nginx leres. Tapi hayu atuh ngingetkeun yén ieu téh leyuran primitif, nu hartina éta tebih ti idéal tur mibanda nuances na shortcomings sorangan, nu dibahas dihandap.

Panyimpenan langkung maju

Ayeuna bayangkeun kaayaan dimana hiji pamaké dilongok loka, dimuat kaca jeung gaya sadia dina wadahna, sarta bari anjeunna maca kaca ieu, urang ulang deployed wadahna. Katalog aset parantos kosong sareng pamundut ka PHP diperyogikeun pikeun ngamimitian ngahasilkeun anu énggal. Sanajan kitu, sanajan sanggeus ieu, Tumbu ka statik heubeul bakal nyimpang, nu bakal ngakibatkeun kasalahan dina mintonkeun statik.

Sajaba ti éta, urang paling dipikaresep boga proyék leuwih atawa kirang dimuat, nu hartina hiji salinan aplikasi moal cukup:

  • Hayu urang skala eta nepi deployment nepi ka dua réplika.
  • Nalika situs munggaran diaksés, aset diciptakeun dina hiji réplika.
  • Di sawatara titik, ingress mutuskeun (pikeun kaperluan load balancing) pikeun ngirim pamundut ka replica kadua, sarta aset ieu teu acan aya. Atawa meureun aranjeunna geus euweuh sabab urang make RollingUpdate sarta di momen urang ngalakonan deployment.

Sacara umum, hasilna deui kasalahan.

Pikeun ngahindarkeun kaleungitan aset anu lami, anjeun tiasa ngarobih emptyDir dina hostPath, nambahkeun statik fisik ka titik klaster. pendekatan ieu goréng sabab urang sabenerna kudu ngabeungkeut titik klaster husus aplikasi anjeun, sabab - bisi pindah ka titik séjén - diréktori moal ngandung file perlu. Atawa sababaraha jenis sinkronisasi diréktori tukang antara titik diperlukeun.

Naon solusina?

  1. Upami hardware sareng sumber daya ngamungkinkeun, anjeun tiasa nganggo cephfs pikeun ngatur hiji diréktori sarua diaksés pikeun kaperluan statik. Dokuméntasi resmi nyarankeun drive SSD, sahenteuna réplikasi tilu-melu jeung sambungan stabil "kandel" antara titik klaster.
  2. Hiji pilihan kirang nuntut bakal ngatur hiji server NFS. Sanajan kitu, mangka anjeun kudu tumut kana akun kamungkinan kanaékan waktu respon pikeun ngolah requests ku web server, sarta kasabaran lepat bakal ninggalkeun loba kahayang. Konsékuansi tina kagagalan téh catastrophic: leungitna gunung dooms klaster maot dina onslaught tina beban LA rushing kana langit.

Diantara hal anu sanés, sadaya pilihan pikeun nyiptakeun panyimpen anu tetep bakal diperyogikeun beberesih tukang set luntur file akumulasi dina jangka waktu nu tangtu. Di hareup peti jeung PHP anjeun tiasa nempatkeun DaemonSet ti cache nginx, anu bakal nyimpen salinan aset pikeun waktos kawates. kabiasaan ieu gampang configurable maké proxy_cache kalawan jero gudang dina poé atawa gigabytes spasi disk.

Ngagabungkeun metodeu ieu sareng sistem file anu disebarkeun di luhur nyayogikeun lapangan anu ageung pikeun imajinasi, ngan ukur ku anggaran sareng poténsi téknis jalma anu bakal ngalaksanakeun sareng ngadukung éta. Tina pangalaman, urang tiasa nyebatkeun yén sistem anu langkung sederhana, langkung stabil tiasa dianggo. Nalika lapisan sapertos ieu ditambahkeun, éta jadi leuwih hese pikeun ngajaga infrastruktur, sarta dina waktos anu sareng waktos spent dina diagnosing na recovering tina sagala gagal naek.

Rekomendasi

Upami palaksanaan pilihan panyimpen anu diusulkeun ogé sigana teu leres pikeun anjeun (pajeulit, mahal ...), maka éta patut ningali kaayaan ti sisi anu sanés. Nyaéta, pikeun ngagali kana arsitéktur proyék sareng ngalereskeun masalah dina kode, dihijikeun ka sababaraha struktur data statik dina gambar, harti unambiguous tina eusi atawa prosedur pikeun "pemanasan" jeung / atawa precompiling aset dina tahap assembly gambar. Ku cara ieu urang nampi kabiasaan anu tiasa diprediksi sareng set file anu sami pikeun sadaya lingkungan sareng réplika tina aplikasi anu dijalankeun.

Upami urang uih deui kana conto khusus sareng kerangka Yii sareng henteu ngalenyepan strukturna (anu sanés tujuan tulisan), éta cekap nunjukkeun dua pendekatan anu populér:

  1. Robah prosés ngawangun gambar pikeun nempatkeun aset dina lokasi anu tiasa diprediksi. Ieu disarankeun / dilaksanakeun dina ekstensi kawas yii2-statik-aset.
  2. Nangtukeun hashes husus pikeun directories asset, sakumaha dibahas dina misalna. presentasi ieu (dimimitian ti slide No. 35). Ku jalan kitu, panulis laporan pamustunganana (jeung teu tanpa alesan!) advises yén sanggeus assembling aset dina ngawangun server, unggah ka gudang sentral (kawas S3), di hareup nu nempatkeun CDN.

Undeuran

Kasus séjén anu pasti bakal dimaénkeun nalika migrasi aplikasi ka kluster Kubernetes nyaéta nyimpen file pangguna dina sistem file. Contona, urang deui boga aplikasi PHP anu narima file ngaliwatan formulir unggah, ngalakukeun hal kalawan aranjeunna salila operasi, sarta ngirimkeunana deui.

Dina Kubernetes, lokasi dimana file ieu kedah disimpen kedah umum pikeun sadaya réplika aplikasi. Gumantung kana pajeulitna aplikasi sareng kabutuhan pikeun ngatur kegigihan file ieu, pilihan alat anu dibagikeun di luhur tiasa janten tempat sapertos kitu, tapi, sakumaha anu urang tingali, aranjeunna gaduh kalemahanana.

Rekomendasi

Hiji solusi nyaéta ngagunakeun gudang S3-cocog (sanajan éta sababaraha jenis kategori timer hosted kawas minio). Pindah ka S3 ngabutuhkeun parobahan dina tingkat kode, jeung kumaha eusi bakal dikirimkeun dina tungtung hareup, urang geus geus wrote.

sesi pamaké

Kapisah, éta sia noting organisasi neundeun sesi pamaké. Mindeng ieu ogé file dina disk, nu dina konteks Kubernetes bakal ngakibatkeun requests otorisasi konstan ti pamaké lamun pamundut na ends up dina wadah sejen.

Masalah sabagian direngsekeun ku ngahurungkeun stickySessions dina asupna (fitur ieu dirojong dina sadaya pangendali ingress populér - pikeun langkung rinci, tingali ulasan urang)pikeun ngabeungkeut pamaké ka pod husus kalawan aplikasi:

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

Tapi ieu moal ngaleungitkeun masalah sareng panyebaran anu terus-terusan.

Rekomendasi

Cara anu langkung leres nyaéta nransfer aplikasi ka nyimpen sesi di memcached, Redis na leyuran sarupa - sacara umum, lengkep abandon pilihan file.

kacindekan

Solusi infrastruktur anu dibahas dina téks anu pantes dianggo ngan ukur dina format "crutches" samentawis (anu disada langkung saé dina basa Inggris salaku workaround). Éta tiasa relevan dina tahap mimiti migrasi aplikasi ka Kubernetes, tapi henteu kedah akar.

Jalan anu disarankeun umum nyaéta ngaleungitkeun aranjeunna pikeun milih modifikasi arsitéktur aplikasi saluyu sareng anu parantos dipikanyaho ku seueur. 12-Faktor App. Nanging, ieu - nyangking aplikasi kana formulir stateless - inevitably ngandung harti yén parobahan kode bakal diperlukeun, sarta di dieu hal anu penting pikeun manggihan kasaimbangan antara kamampuhan / sarat tina bisnis jeung prospek pikeun nerapkeun jeung ngajaga jalur dipilih. .

PS

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar