Moderné aplikácie na OpenShift, časť 2: súvisiace zostavy chained builds

Ahojte! Toto je druhý príspevok v našej sérii, v ktorej ukazujeme, ako nasadiť moderné webové aplikácie na Red Hat OpenShift.

Moderné aplikácie na OpenShift, časť 2: súvisiace zostavy chained builds

V predchádzajúcom príspevku sme sa trocha dotkli možností nového builder obrazu S2I (source-to-image), ktorý je určený na zostavovanie a nasadzovanie moderných webových aplikácií na platforme OpenShift. Vtedy nás zaujímala téma rýchleho nasadenia aplikácie, a dnes sa pozrieme, ako používať S2I obraz ako "čistý" builder obraz a kombinovať ho so súvisiacimi zostavami OpenShift.

Čistý builder obraz

Ako sme spomenuli v prvej časti, väčšina moderných webových aplikácií má takzvanú fázu zostavenia, v ktorej sa zvyčajne vykonávajú operácie ako transpirácia kódu, spojenie niekoľkých súborov a minifikácia. Výsledné súbory z týchto operácií – a to sú statické HTML, JavaScript a CSS – sa ukladajú do priečinka output. Miesto tohto priečinka zvyčajne závisí od toho, aké nástroje zostavenia sa používajú, a pre React to bude priečinok ./build (o tejto otázke sa podrobnejšie vrátime nižšie).

Source-to-Image (S2I)

V tomto príspevku sa vôbec nebavíme o téme "čo je S2I a ako ho používať" (viac o tom si môžete prečítať tu), ale je dôležité jasne mať predstavu o dvoch fázach tohto procesu, aby ste pochopili, čo robí obraz Web App Builder.

Fáza zostavovania (assemble phase)

Fáza zostavovania je v podstate veľmi podobná tomu, čo sa deje, keď spustíte docker build a výsledkom je nový Docker obraz. Tým pádom táto fáza nastáva, keď začnete zostavenie na platforme OpenShift.

V prípade obrazu Web App Builder za inštaláciu závislostí vašej aplikácie a spustenie zostavenia zodpovedá assemble script. Ako predvolené používa builder obraz konštrukciu npm run build, ale túto môžete predefinovať prostredníctvom premennej prostredia NPM_BUILD.

Ako sme už spomenuli, umiestnenie hotovej, už vytvorenej aplikácie závisí od toho, aké nástroje sa používajú. Napríklad v prípade React to bude priečinok /build, a pre aplikácie Angular – priečinok project_name/dist. A ako už bolo ukázané v predchádzajúcom príspevku, umiestnenie výstupného adresára, ktorý je predvolene nastavený ako build, možno predefinovať cez premennú prostredia OUTPUT_DIR. A keďže umiestnenie výstupného priečinka sa líši od rámca k rámcu, jednoducho skopírujete vygenerovaný výstup do štandardného priečinka v obraze, t.j. do /opt/apt-root/output. To je dôležité pre pochopenie ďalšej časti tohto článku, a zatiaľ rýchlo prejdime na ďalšiu fázu – spustenie (run phase).

Etapa spustenia (run phase)

Táto etapa nastáva, keď sa pre nový obraz, vytvorený v etape zostovania, zavolá docker run. Stáva sa to aj pri vykonávaní nasadenia na platforme OpenShift. Predvolene run script používa serve module na obsluhu statického obsahu, ktorý sa nachádza v uvedenom štandardnom výstupnom adresári.

Táto metóda je dobrá pre rýchle nasadenie aplikácií, ale v skutočnosti sa neodporúča obsluhovať statický obsah takto. Keďže reálne obsluhujeme iba statický obsah, tak nainštalovaný Node.js v našom obraze nie je potrebný – stačí nám aj webový server.

Inými slovami, pri zostavení potrebujeme jedno, pri vykonávaní – iné. V takej situácii sa uplatnia reťazené zostavy (chained builds).

Reťazené zostavy (chained builds)

Toto je to, čo hovoria o chained builds v dokumentácii OpenShift:

„Dve zostavy môžu byť prepojené navzájom, pričom jedna z nich generuje skompilovanú entitu a druhá umiestňuje túto entitu do samostatného obrazu, ktorý sa používa na spustenie tejto entity.“

Inými slovami, môžeme využiť obraz Web App Builder na spustenie našej zostavy a potom použiť obraz webového servera, toho istého NGINX, na obsluhu nášho obsahu.

Týmto spôsobom môžeme použiť obraz Web App Builder ako „čistý“ builder a mať taký menší runtime obraz.

Teraz si to rozoberieme na konkrétnom príklade.

Na tréning budeme používať jednoduchú aplikáciu React, vytvorenú pomocou nástroja príkazového riadku create-react-app.

Zostaviť všetko dokopy nám pomôže šablóna súboru OpenShift.

Pozrime sa na tento súbor podrobnejšie a začnime sekciou parametrov.

parameters:
  - name: SOURCE_REPOSITORY_URL
    description: URL zdroja pre aplikáciu
    displayName: URL zdroja
    required: true
  - name: SOURCE_REPOSITORY_REF
    description: Názov vetvy pre aplikáciu
    displayName: Názov vetvy zdroja
    value: master
    required: true
  - name: SOURCE_REPOSITORY_DIR
    description: Miesto v zdrojovom repozitári aplikácie
    displayName: Katalóg zdroja
    value: .
    required: true
  - name: OUTPUT_DIR
    description: Miesto skompilovaných statických súborov z vášho webového nástroja
    displayName: Výstupný katalóg
    value: build
    required: false

Tu je to celkom jasné, ale treba si dať pozor na parameter OUTPUT_DIR. Pre React aplikáciu z nášho príklad sa netreba obávať, pretože React používa ako výstupnú zložku predvolenú hodnotu, no pri Angular alebo niečom inom bude potrebné tento parameter zmeniť podľa potreby.

Teraz sa pozrime na sekciu ImageStream.

- apiVersion: v1
  kind: ImageStream
  metadata:
    name: react-web-app-builder  \/\/ 1 
  spec: {}
- apiVersion: v1
  kind: ImageStream
  metadata:
    name: react-web-app-runtime  \/\/ 2 
  spec: {}
- apiVersion: v1
  kind: ImageStream
  metadata:
    name: web-app-builder-runtime \/\/ 3
  spec:
    tags:
    - name: latest
      from:
        kind: DockerImage
        name: nodeshift\/ubi8-s2i-web-app:10.x
- apiVersion: v1
  kind: ImageStream
  metadata:
    name: nginx-image-runtime \/\/ 4
  spec:
    tags:
    - name: latest
      from:
        kind: DockerImage
        name: 'centos\/nginx-112-centos7:latest'

Pozrite sa na tretí a štvrtý obraz. Oba sú definované ako Docker obrazy, a tu je jasne zrejmé, odkiaľ pochádzajú.

Tretí obraz je web-app-builder a pochádza z nodeshift\/ubi8-s2i-web-app s tagom 10.x na Docker hub.

Štvrtý je obraz NGINX (verzia 1.12) s tagom latest na Docker hub.

Teraz sa pozrime na dva prvé obrazy. Oba sú na začiatku prázdne a vytvárajú sa len počas fázy zostavenia (build phase). Prvý obraz – react-web-app-builder – bude výsledkom fázy skladania, ktorá spája obraz web-app-builder-runtime a náš zdrojový kód. Preto sme do názvu tohto obrazu pripojili „-builder“.

Druhý obraz – react-web-app-runtime – bude výsledkom zlúčenia nginx-image-runtime a niektorých súborov z obrazu react-web-app-builder. Tento obraz sa tiež použije pri nasadení a bude obsahovať len webový server a statický HTML, JavaScript, CSS našej aplikácie.

Zložitá? Teraz sa pozrime na konfigurácie zostavenia a bude to o niečo jasnejšie.

V našej šablóne sú dve konfigurácie zostavenia. Tu je prvá z nich, ktorá je celkom štandardná:

  apiVersion: v1
  kind: BuildConfig
  metadata:
    name: react-web-app-builder
  spec:
    output:
      to:
        kind: ImageStreamTag
        name: react-web-app-builder:latest 
    source:   
      git:
        uri: ${SOURCE_REPOSITORY_URL}
        ref: ${SOURCE_REPOSITORY_REF}
      contextDir: ${SOURCE_REPOSITORY_DIR}
      type: Git
    strategy:
      sourceStrategy:
        env:
          - name: OUTPUT_DIR 
            value: ${OUTPUT_DIR}
        from:
          kind: ImageStreamTag
          name: web-app-builder-runtime:latest 
        incremental: true 
      type: Source
    triggers: 
    - github:
        secret: ${GITHUB_WEBHOOK_SECRET}
      type: GitHub
    - type: ConfigChange
    - imageChange: {}
      type: ImageChange

Ako vidíme, riadok s označením 1 hovorí, že výsledok tejto kompilácie bude umiestnený do obrázku react-web-app-builder, ktorý sme si pred chvíľou pozreli v sekcii ImageStream.

Riadok s označením 2 hovorí, odkiaľ berieme kód. V našom prípade je to git repozitár a lokalita, ref a kontextová zložka sú definované parametrami, ktoré sme už videli vyššie.

Riadok s označením 3 – to sme už videli v sekcii parametrov. Pridáva premennú prostredia OUTPUT_DIR, ktorá je v našom príklade rovná build.
Riadok s označením 4 hovorí, že chceme používať obrázok web-app-builder-runtime, ktorý sme už videli v sekcii ImageStream.

Riadok s označením 5 hovorí, že chceme používať inkrementálne zostavenie, ak S2I obraz to podporuje, a obraz Web App Builder – to podporuje. Pri prvom spustení, po skončení fázy zostavenia, obraz uloží zložku node_modules do archívneho súboru. Potom pri ďalších spusteniach sa obraz jednoducho rozbalí túto zložku, aby sa skrátila doba zostavenia.

A nakoniec, riadok s označením 6 – to sú len niektoré spúšťače, aby sa kompilácia spúšťala automaticky, bez ručného zásahu, keď sa niečo zmení.

Celkovo ide o pomerne štandardnú konfiguračnú liesť.

Teraz sa pozrime na druhú konfiguračnú liesť. Je veľmi podobná prvej, ale má jedno dôležité rozdiel.

apiVersion: v1
  kind: BuildConfig
  metadata:
    name: react-web-app-runtime
  spec:
    output:
      to:
        kind: ImageStreamTag
        name: react-web-app-runtime:latest 
    source: 
      type: Image
      images:                              
        - from:
            kind: ImageStreamTag
            name: react-web-app-builder:latest 
          paths:
            - sourcePath: /opt/app-root/output/.  
              destinationDir: .  
    strategy: 
      sourceStrategy:
        from:
          kind: ImageStreamTag
          name: nginx-image-runtime:latest
        incremental: true
      type: Source
    triggers:
    - github:
        secret: ${GITHUB_WEBHOOK_SECRET}
      type: GitHub
    - type: ConfigChange
    - type: ImageChange
      imageChange: {}
    - type: ImageChange
      imageChange:
        from:
          kind: ImageStreamTag
          name: react-web-app-builder:latest

Takže druhá konfigurácia zostavovania – react-web-app-runtime, a začína úplne štandardne.

V riadku s označením 1 nie je nič nové – len hovorí, že výsledok zostavenia sa ukladá do obrazu react-web-app-runtime.

Riadok s označením 2, podobne ako v predchádzajúcej konfigurácii, určuje, odkiaľ brať zdrojový kód. Ale všimnite si, že tu hovoríme, že sa berie z obrazu. A to z obrazu, ktorý sme práve vytvorili – z react-web-app-builder (uvedený v riadku s označením 3). Súbory, ktoré chceme použiť, sa nachádzajú vo vnútri obrazu a ich umiestnenie tam je určené v riadku s označením 4, v našom prípade je to /opt/app-root/output/. Ak si pamätáte, práve tam sa ukladajú súbory, generované na základe výsledkov zostavenia našej aplikácie.

Cieľová zložka, určená v riadku s označením 5 – je jednoducho aktuálny adresár (to všetko, pripomeňme, beží vo vnútri akéhosi čarovného zariadenia s názvom OpenShift, a nie na vašom lokálnom počítači).

Sekcia strategy – riadok s označením 6 – tiež vyzerá podobne ako prvá konfigurácia zostavenia. Len tentoraz plánujeme použiť nginx-image-runtime, ktorý sme už videli v sekcii ImageStream.

Nakoniec, riadok s označením 7 – to je sekcia spúšťacích mechanizmov, ktorá aktivuje túto zostavu zakaždým, keď sa zmení obraz react-web-app-builder.

Inak tento šablón obsahuje celkom štandardnú konfiguráciu nasadenia, ako aj veci, ktoré sa týkajú služieb a trás, ale nebudeme sa do toho hlbšie zaoberať. Všimnite si, že obraz, ktorý sa bude nasadzovať – je obraz react-web-app-runtime.

Nasadenie aplikácie

Takže, po tom, čo sme sa pozreli na šablón, pozrime sa, ako ho použiť na nasadenie aplikácie.

Môžeme použiť klientský nástroj OpenShift s názvom oc na nasadenie našich šablón:

$ find . | grep openshiftio | grep application | xargs -n 1 oc apply -f

$ oc new-app --template react-web-app -p SOURCE_REPOSITORY_URL=https://github.com/lholmquist/react-web-app

Prvý príkaz na obrázku vyššie – je zámerne inžiniersky spôsob, ako nájsť šablónu ./openshiftio/application.yaml.

Druhý príkaz jednoducho vytvára novú aplikáciu na základe tejto šablóny.

Po tom, čo tieto príkazy vykonajú, uvidíme, že máme dve zostavy:

Moderné aplikácie na OpenShift, časť 2: súvisiace zostavy chained builds

A vrátením sa na obrazovku Overview uvidíme spustený pod:

Moderné aplikácie na OpenShift, časť 2: súvisiace zostavy chained builds

Kliknutím na odkaz prejdeme k našej aplikácii, ktorá predstavuje stránku predvolenej aplikácie React App:

Moderné aplikácie na OpenShift, časť 2: súvisiace zostavy chained builds

Dodatok 1

Pre milovníkov Angular máme tiež príklad aplikácie.

Šablóna je rovnaká, s výnimkou premennej OUTPUT_DIR.

Doplnok 2

V tomto článku sme použili NGINX ako webový server, ale je veľmi jednoduché ho nahradiť Apache, stačí zmeniť v šablónovom súbore. obrázok NGINX na obrázok Apache.

Záver

V prvej časti tejto série sme ukázali, ako rýchlo nasadiť moderné webové aplikácie na platforme OpenShift. Dnes sa pozrieme na to, čo robí obraz Web App a ako ho možno kombinovať s čistým webovým serverom, ako je NGINX, pomocou súvislých zostavení (chained builds) pri vytváraní vhodnejšej produkčnej zostavy aplikácií. V nasledujúcom, záverečnom článku tejto série ukážeme, ako spustiť na OpenShift vývojový server pre svoju aplikáciu a zabezpečiť synchronizáciu lokálnych a vzdialených súborov.

Obsah tejto série článkov

  • Časť 1: ako nasadiť moderné webové aplikácie len v niekoľkých krokoch;
  • Časť 2: ako použiť nový obraz S2I spolu s už existujúcim obrazom HTTP servera, napríklad NGINX, pomocou súvislých zostavení OpenShift na realizáciu produkčného nasadenia;
  • Časť 3: ako spustiť na platforme OpenShift vývojový server pre svoju aplikáciu a synchronizovať ho s lokálnym súborovým systémom.

Ďalšie zdroje

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster