Файлҳои маҳаллӣ ҳангоми интиқоли барнома ба Kubernetes

Файлҳои маҳаллӣ ҳангоми интиқоли барнома ба Kubernetes

Ҳангоми сохтани раванди CI/CD бо истифода аз Kubernetes, баъзан мушкилот дар байни талаботҳои инфрасохтори нав ва барномае, ки ба он интиқол дода мешавад, ба миён меояд. Махсусан, дар марҳилаи сохтани барнома ба даст овардан муҳим аст один тасвире, ки дар он истифода мешавад всех муҳити лоиҳа ва кластерҳо. Ин принсип дар асоси дурустӣ қарор дорад мувофиқи Google идоракунии контейнер (на як маротиба дар ин бора гуфт ва шуъбаи техникии мо).

Бо вуҷуди ин, шумо ҳеҷ касро дар ҳолатҳое намебинед, ки рамзи сайт чаҳорчӯбаи тайёрро истифода мебарад, ки истифодаи он барои истифодаи минбаъдаи он маҳдудият мегузорад. Ва дар ҳоле ки дар "муҳити муқаррарӣ" бо ин кор осон аст, дар Кубернетес ин рафтор метавонад мушкилот гардад, хусусан вақте ки шумо бори аввал бо он дучор мешавед. Дар ҳоле ки ақли ихтироъкор метавонад ҳалли инфрасохторро таҳия кунад, ки дар назари аввал аён ё ҳатто хуб ба назар мерасанд... бояд дар хотир дошт, ки аксари ҳолатҳо метавонанд ва бояд аз чихати меъморй хал карда шавад.

Биёед ба роҳҳои ҳалли маъмул барои нигоҳдории файлҳо назар кунем, ки ҳангоми кор кардани кластер ба оқибатҳои ногувор оварда мерасонанд ва инчунин роҳи дурусттарро нишон медиҳем.

Нигоҳдории статикӣ

Барои мисол, як барномаи вебро дида бароед, ки як навъ генератори статикиро барои ба даст овардани маҷмӯи тасвирҳо, услубҳо ва чизҳои дигар истифода мебарад. Масалан, чаҳорчӯбаи Yii PHP дорои менеҷери дороиҳои дохилӣ мебошад, ки номҳои беназири директорияро тавлид мекунад. Мутаносибан, натиҷа маҷмӯи роҳҳо барои сайти статикӣ мебошад, ки баръало бо ҳам намепайвандад (ин бо якчанд сабаб анҷом дода шуд - масалан, барои бартараф кардани такрорӣ ҳангоми истифодаи як захираи ҷузъҳо). Ҳамин тавр, аз қуттӣ, вақте ки шумо бори аввал ба модули захираҳои веб дастрасӣ пайдо мекунед, файлҳои статикӣ (воқеъан, аксар вақт истинодҳои рамзӣ, вале бештар дар бораи он баъдтар) бо феҳристи решаи умумӣ, ки барои ин густариш беназир аст, ташкил ва ҷойгир карда мешаванд:

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

Ин аз нуқтаи назари кластер чӣ маъно дорад?

Оддатарин мисол

Биёед як ҳолати хеле маъмулро гирем, вақте ки PHP пеш аз nginx барои паҳн кардани маълумоти статикӣ ва коркарди дархостҳои оддӣ ҷойгир аст. Роҳи осонтарин - љойгиркунии бо ду контейнер:

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

Дар шакли соддакардашуда, конфигуратсияи nginx то ба зер оварда мешавад:

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

Вақте ки шумо бори аввал ба сайт ворид мешавед, дороиҳо дар контейнери PHP пайдо мешаванд. Аммо дар сурати мавҷуд будани ду контейнер дар як пад, nginx дар бораи ин файлҳои статикӣ чизе намедонад, ки (мувофиқи конфигуратсия) бояд ба онҳо дода шавад. Дар натиҷа, муштарӣ хатои 404-ро барои ҳама дархостҳо ба файлҳои CSS ва JS мебинад.Оддатарин роҳи ҳалли ин ҷо ташкили директорияи умумӣ барои контейнерҳо хоҳад буд. Варианти ибтидоӣ - умумӣ 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

Акнун файлҳои статикии дар контейнер тавлидшуда аз ҷониби nginx дуруст хидмат мекунанд. Аммо ёдовар мешавам, ки ин як ҳалли ибтидоист, яъне он аз идеал дур аст ва нозукиҳо ва камбудиҳои худро дорад, ки дар поён баррасӣ мешаванд.

Нигоҳдории пешрафта

Ҳоло тасаввур кунед, ки вазъияте, ки корбар ба сайт ворид шуда, саҳифаеро бо услубҳои дар контейнер мавҷудбуда бор кард ва ҳангоми хондани ин саҳифа, мо контейнерро дубора ҷойгир кардем. Каталоги дороиҳо холӣ шуд ва барои оғози тавлиди дороиҳои нав дархост ба PHP лозим аст. Аммо, ҳатто пас аз ин, истинодҳо ба статикҳои кӯҳна номувофиқ хоҳанд буд, ки ин боиси хатогиҳо дар намоиши статика мегардад.

Илова бар ин, мо эҳтимолан як лоиҳаи кам ё камтар боршуда дорем, ки ин маънои онро дорад, ки як нусхаи барнома кофӣ нахоҳад буд:

  • Биёед онро васеъ кунем љойгиркунии то ду нусха.
  • Вақте ки ба сайт бори аввал дастрасӣ пайдо шуд, дороиҳо дар як реплика сохта шуданд.
  • Дар баъзе лаҳзаҳо, воридшавӣ тасмим гирифт (барои тавозуни сарборӣ) дархостро ба нусхаи дуюм фиристад ва ин дороиҳо ҳанӯз дар он ҷо набуданд. Ё шояд онҳо дигар вуҷуд надоранд, зеро мо истифода мебарем RollingUpdate ва дар айни замон мо ҷойгиркунӣ анҷом дода истодаем.

Умуман, натиҷа боз хатогиҳост.

Барои пешгирӣ кардани аз даст додани дороиҳои кӯҳна, шумо метавонед тағир диҳед emptyDir ба hostPath, илова кардани статикӣ ба гиреҳи кластер. Ин равиш бад аст, зеро мо воқеан бояд ба гиреҳи кластери мушаххас пайваст кунед аризаи шумо, зеро - дар сурати ба гиреҳҳои дигар гузаштан - директория файлҳои заруриро дар бар намегирад. Ё як навъ ҳамоҳангсозии феҳристи замина байни гиреҳҳо лозим аст.

Роҳҳои ҳалли онҳо кадомҳоянд?

  1. Агар сахтафзор ва захираҳо иҷозат диҳанд, шумо метавонед истифода баред cephfs барои ташкили феҳристи баробар дастрас барои эҳтиёҷоти статикӣ. Ҳуҷҷатҳои расмӣ тавсия медиҳад, ки дискҳои SSD, ҳадди аққал се маротиба такрорӣ ва пайвасти устувори "ғафси" байни гиреҳҳои кластер.
  2. Варианти камтар серталаб ин ташкили сервери NFS хоҳад буд. Аммо, пас шумо бояд афзоиши эҳтимолии вақти посухро барои коркарди дархостҳо аз ҷониби веб-сервер ба назар гиред ва таҳаммулпазирии хатогиҳо чизи дилхоҳро боқӣ мегузорад. Оқибатҳои нокомӣ фалокатоваранд: аз даст додани кӯҳ кластерро зери фишори бори LA ба осмон мешитобад, ба марг мерасонад.

Дар байни чизҳои дигар, ҳама имконоти эҷоди нигаҳдории доимиро талаб мекунанд тоза кардани замина маҷмӯи файлҳои кӯҳна, ки дар муддати муайян ҷамъ шудаанд. Дар назди контейнерҳо бо PHP шумо метавонед ҷойгир кунед DaemonSet аз кэшкунии nginx, ки нусхаҳои дороиҳоро барои муддати маҳдуд нигоҳ медорад. Ин рафтор бо истифода аз он ба осонӣ танзим карда мешавад proxy_cache бо умқи нигоҳдорӣ дар рӯз ё гигабайт фазои диск.

Якҷоя кардани ин усул бо системаҳои файлии тақсимшудаи дар боло зикршуда майдони бузурги тасаввуротро фароҳам меорад, ки танҳо бо буҷет ва потенсиали техникии онҳое, ки онро амалӣ ва дастгирӣ мекунанд, маҳдуд аст. Аз рун тачриба гуфтан мумкин аст, ки система хар кадар оддй бошад, вай хамон кадар устувортар кор мекунад. Вақте ки чунин қабатҳо илова карда мешаванд, нигоҳдории инфрасохтор хеле мушкилтар мешавад ва дар айни замон вақти сарфшуда барои ташхис ва барқарор кардани ҳама гуна нокомиҳо зиёд мешавад.

Тавсия

Агар татбиқи имконоти нигоҳдории пешниҳодшуда низ ба назари шумо беасос ба назар расад (мураккаб, гаронбаҳо...), пас ба вазъият аз тарафи дигар нигоҳ кардан лозим аст. Махз, барои кофтани меъмории лоиха ва мушкилотро дар код ислоҳ кунед, ки ба баъзе сохтори додаҳои статикӣ дар тасвир алоқаманд аст, таърифи якхелаи мундариҷа ё тартиби “гарм кардан” ва/ё пеш аз тартиб додани дороиҳо дар марҳилаи васлкунии тасвир. Бо ин роҳ мо рафтори комилан пешгӯинашаванда ва як маҷмӯи файлҳоро барои ҳама муҳитҳо ва нусхаҳои барномаи иҷрошаванда ба даст меорем.

Агар мо ба мисоли мушаххас бо чаҳорчӯбаи Yii баргардем ва ба сохтори он набарем (ки ҳадафи мақола нест), нишон додани ду равиши маъмул кифоя аст:

  1. Раванди сохтани тасвирро тағир диҳед, то дороиҳоро дар ҷои пешбинишаванда ҷойгир кунед. Ин дар васеъшавӣ ба монанди пешниҳод/амалӣ карда мешавад yii2-дороиҳои статикӣ.
  2. Хешҳои мушаххасро барои директорияҳои дороиҳо муайян кунед, тавре ки дар мисоли. ин презентатсия (Аз слайди № 35 сар карда). Дар омади гап, муаллифи гузориш дар ниҳоят (ва бесабаб нест!) маслиҳат медиҳад, ки пас аз ҷамъ кардани дороиҳо дар сервери сохтмон, онҳоро ба анбори марказӣ (ба монанди S3), ки дар пеши он CDN ҷойгир аст, бор кунед.

Боргириҳо

Ҳолати дигаре, ки бешубҳа ҳангоми интиқоли барнома ба кластери Kubernetes ба амал меояд, нигоҳ доштани файлҳои корбар дар системаи файлӣ мебошад. Масалан, мо боз як барномаи PHP дорем, ки файлҳоро тавассути варақаи боргузорӣ қабул мекунад, ҳангоми кор бо онҳо коре мекунад ва онҳоро бармегардонад.

Дар Kubernetes, маконе, ки ин файлҳо бояд ҷойгир карда шаванд, бояд барои ҳама нусхаҳои барнома умумӣ бошанд. Вобаста аз мураккабии барнома ва зарурати ташкили доимии ин файлҳо, имконоти дастгоҳи муштараки дар боло зикршуда метавонанд чунин ҷой бошанд, аммо, тавре ки мебинем, онҳо камбудиҳои худро доранд.

Тавсия

Як ҳалли он аст бо истифода аз нигаҳдории S3 мувофиқ (ҳатто агар он як навъ категорияи мустақилона ба монанди minio бошад). Гузариш ба S3 тағиротро талаб мекунад дар сатҳи код, ва чӣ гуна мундариҷа дар охири пеш интиқол дода мешавад, мо аллакай дорем навиштааст.

Сеансҳои корбар

Алоҳида, ташкили нигоҳдории сессияҳои корбаронро қайд кардан лозим аст. Аксар вақт инҳо инчунин файлҳои диск мебошанд, ки дар заминаи Kubernetes ба дархостҳои доимии иҷозати корбар оварда мерасонанд, агар дархости ӯ дар контейнери дигар анҷом ёбад.

Мушкилот қисман тавассути фурӯзон ҳал карда мешавад stickySessions дар бораи ворид шудан (хусусият дар ҳама контроллерҳои маъмули воридшавӣ дастгирӣ карда мешавад - барои тафсилоти бештар нигаред баррасии мо)барои пайваст кардани корбар ба як поди мушаххас бо барнома:

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

Аммо ин мушкилотро бо ҷойгиркунии такрорӣ бартараф намекунад.

Тавсия

Роҳи дурусттар интиқол додани барнома ба он хоҳад буд нигоҳ доштани сессияҳо дар memcached, Redis ва ҳалли шабеҳ - умуман, аз имконоти файл комилан даст кашед.

хулоса

Қарорҳои инфрасохторӣ, ки дар матн баррасӣ мешаванд, танҳо дар формати "асғола"-и муваққатӣ (ки дар забони англисӣ ҳамчун роҳи ҳал зеботар садо медиҳад) қобили истифода мебошанд. Онҳо метавонанд дар марҳилаҳои аввали интиқоли барнома ба Kubernetes мувофиқ бошанд, аммо набояд реша гиранд.

Роҳи умумии тавсияшаванда ин нест кардани онҳо ба манфиати тағир додани меъмории барнома мувофиқи он чизест, ки ба бисёриҳо маълум аст. Барномаи 12-омил. Аммо, ин - овардани ариза ба шакли бешаҳрвандӣ - ногузир маънои онро дорад, ки тағирот дар код талаб карда мешавад ва дар ин ҷо муҳим аст, ки тавозуни байни қобилиятҳо/талаботи тиҷорат ва дурнамои татбиқ ва нигоҳдории роҳи интихобшуда пайдо шавад. .

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ