สวัสดีทุกคน! นี่เป็นโพสต์ที่สองในชุดของเรา ซึ่งเราจะแสดงวิธีการปรับใช้เว็บแอปพลิเคชันสมัยใหม่บน Red Hat OpenShift
ในโพสต์ที่แล้ว เราได้กล่าวถึงความสามารถของอิมเมจตัวสร้าง S2I (จากต้นทางถึงรูปภาพ) ใหม่เล็กน้อย ซึ่งได้รับการออกแบบมาสำหรับการสร้างและปรับใช้แอปพลิเคชันเว็บสมัยใหม่บนแพลตฟอร์ม OpenShift จากนั้นเราสนใจหัวข้อการปรับใช้แอปพลิเคชันอย่างรวดเร็ว และวันนี้เราจะมาดูวิธีใช้อิมเมจ S2I เป็นอิมเมจตัวสร้างที่ "บริสุทธิ์" และรวมเข้ากับแอสเซมบลี OpenShift ที่เกี่ยวข้อง
อิมเมจตัวสร้างที่สะอาดตา
ดังที่เราได้กล่าวไว้ในตอนที่ XNUMX เว็บแอปพลิเคชันสมัยใหม่ส่วนใหญ่มีสิ่งที่เรียกว่าขั้นตอนการสร้าง ซึ่งโดยทั่วไปจะดำเนินการต่างๆ เช่น การแปลงรหัส การต่อไฟล์หลายไฟล์ และการย่อขนาด ไฟล์ที่ได้รับจากการดำเนินการเหล่านี้ - และนี่คือ HTML, JavaScript และ CSS แบบคงที่ - จะถูกเก็บไว้ในโฟลเดอร์เอาต์พุต ตำแหน่งของโฟลเดอร์นี้มักจะขึ้นอยู่กับเครื่องมือสร้างที่กำลังใช้งานอยู่ และสำหรับ React นี่จะเป็นโฟลเดอร์ ./build (เราจะกลับมาดูรายละเอียดเพิ่มเติมด้านล่าง)
แหล่งที่มาถึงรูปภาพ (S2I)
ในโพสต์นี้ เราไม่ได้พูดถึงหัวข้อ “S2I คืออะไรและใช้งานอย่างไร” (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้
ขั้นตอนการประกอบ
ขั้นตอนการประกอบจะคล้ายกันมากโดยธรรมชาติกับสิ่งที่เกิดขึ้นเมื่อคุณรัน docker build และจบลงด้วยอิมเมจ Docker ใหม่ ดังนั้น ขั้นตอนนี้จึงเกิดขึ้นเมื่อเริ่มต้นบิลด์บนแพลตฟอร์ม OpenShift
ในกรณีของอิมเมจ Web App Builder จะต้องรับผิดชอบในการติดตั้งการขึ้นต่อกันของแอปพลิเคชันของคุณและรันบิลด์
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ ตำแหน่งของแอปพลิเคชันที่สร้างเสร็จแล้วนั้นขึ้นอยู่กับเครื่องมือที่คุณใช้ ตัวอย่างเช่น ในกรณีของ React นี่จะเป็นโฟลเดอร์ ./build และสำหรับแอปพลิเคชัน Angular จะเป็นโฟลเดอร์ project_name/dist และดังที่แสดงไว้แล้วในโพสต์ที่แล้ว ตำแหน่งของไดเร็กทอรีเอาต์พุตซึ่งถูกกำหนดให้สร้างเป็นค่าเริ่มต้น สามารถแทนที่ได้ผ่านตัวแปรสภาพแวดล้อม OUTPUT_DIR เนื่องจากตำแหน่งของโฟลเดอร์เอาต์พุตนั้นแตกต่างกันไปในแต่ละเฟรมเวิร์ก คุณเพียงแค่คัดลอกเอาต์พุตที่สร้างขึ้นไปยังโฟลเดอร์มาตรฐานในรูปภาพ นั่นคือ /opt/apt-root/output นี่เป็นสิ่งสำคัญสำหรับการทำความเข้าใจส่วนที่เหลือของบทความนี้ แต่สำหรับตอนนี้ เรามาดูขั้นตอนต่อไปอย่างรวดเร็ว - ระยะดำเนินการ
ระยะการวิ่ง
ขั้นตอนนี้เกิดขึ้นเมื่อทำการเรียกใช้นักเทียบท่าบนอิมเมจใหม่ที่สร้างขึ้นในระหว่างขั้นตอนการประกอบ สิ่งเดียวกันนี้จะเกิดขึ้นเมื่อใช้งานบนแพลตฟอร์ม OpenShift ค่าเริ่มต้น
วิธีการนี้ดีสำหรับการปรับใช้แอปพลิเคชันอย่างรวดเร็ว แต่โดยทั่วไปแล้วไม่แนะนำให้แสดงเนื้อหาคงที่ด้วยวิธีนี้ เนื่องจากในความเป็นจริง เราให้บริการเฉพาะเนื้อหาคงที่ เราจึงไม่จำเป็นต้องติดตั้ง Node.js ภายในอิมเมจของเรา เว็บเซิร์ฟเวอร์ก็เพียงพอแล้ว
กล่าวอีกนัยหนึ่ง เมื่อประกอบเราจำเป็นต้องมีสิ่งหนึ่ง เมื่อดำเนินการ เราจำเป็นต้องมีอีกสิ่งหนึ่ง ในสถานการณ์เช่นนี้ chained builds จะมีประโยชน์
งานสร้างที่ถูกล่ามโซ่
นี่คือสิ่งที่พวกเขาเขียนเกี่ยวกับ
“แอสเซมบลีสองชุดสามารถเชื่อมโยงเข้าด้วยกัน โดยชุดหนึ่งสร้างเอนทิตีที่คอมไพล์แล้ว และอีกชุดหนึ่งโฮสต์เอนทิตีนั้นในอิมเมจแยกต่างหากที่ใช้ในการรันเอนทิตีนั้น”
กล่าวอีกนัยหนึ่ง เราสามารถใช้อิมเมจ Web App Builder เพื่อรันบิลด์ของเรา จากนั้นใช้อิมเมจของเว็บเซิร์ฟเวอร์ ซึ่งเป็น NGINX เดียวกันเพื่อแสดงเนื้อหาของเรา
ดังนั้นเราจึงสามารถใช้อิมเมจ Web App Builder เป็นตัวสร้างที่ "บริสุทธิ์" และในขณะเดียวกันก็มีอิมเมจรันไทม์ขนาดเล็ก
ตอนนี้เรามาดูสิ่งนี้ด้วยตัวอย่างที่เฉพาะเจาะจง
สำหรับการฝึกอบรมเราจะใช้
มันจะช่วยให้เรารวบรวมทุกอย่างเข้าด้วยกัน
ดูรายละเอียดเพิ่มเติมที่ไฟล์นี้และเริ่มต้นด้วยส่วนพารามิเตอร์
parameters:
- name: SOURCE_REPOSITORY_URL
description: The source URL for the application
displayName: Source URL
required: true
- name: SOURCE_REPOSITORY_REF
description: The branch name for the application
displayName: Source Branch
value: master
required: true
- name: SOURCE_REPOSITORY_DIR
description: The location within the source repo of the application
displayName: Source Directory
value: .
required: true
- name: OUTPUT_DIR
description: The location of the compiled static files from your web apps builder
displayName: Output Directory
value: build
required: false
ทุกอย่างที่นี่ค่อนข้างชัดเจน แต่ก็คุ้มค่าที่จะให้ความสนใจกับพารามิเตอร์ OUTPUT_DIR สำหรับแอปพลิเคชัน React ในตัวอย่างของเรา ไม่มีอะไรต้องกังวล เนื่องจาก React ใช้ค่าเริ่มต้นเป็นโฟลเดอร์เอาต์พุต แต่ในกรณีของ Angular หรืออย่างอื่น พารามิเตอร์นี้จะต้องมีการเปลี่ยนแปลงตามความจำเป็น
ตอนนี้เรามาดูส่วน ImageStreams กัน
- 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'
ดูภาพที่สามและสี่ ทั้งสองถูกกำหนดให้เป็นอิมเมจ Docker และคุณสามารถเห็นได้อย่างชัดเจนว่ามาจากไหน
รูปภาพที่สามคือ web-app-builder และมาจาก nodeshift/ubi8-s2i-web-app ที่แท็ก 10.x บน
รูปที่สี่คืออิมเมจ NGINX (เวอร์ชัน 1.12) พร้อมแท็กล่าสุด
ทีนี้มาดูสองภาพแรกกัน ทั้งคู่ว่างเปล่าตั้งแต่เริ่มต้นและถูกสร้างขึ้นในระหว่างขั้นตอนการสร้างเท่านั้น อิมเมจแรก react-web-app-builder จะเป็นผลมาจากขั้นตอนการประกอบที่จะรวมอิมเมจรันไทม์ของตัวสร้างเว็บแอปและซอร์สโค้ดของเรา นั่นคือเหตุผลที่เราเพิ่ม "-builder" ให้กับชื่อของรูปภาพนี้
รูปภาพที่สอง - react-web-app-runtime - จะเป็นผลมาจากการรวม nginx-image-runtime และไฟล์บางไฟล์จากอิมเมจ react-web-app-builder รูปภาพนี้จะถูกนำมาใช้ในระหว่างการปรับใช้และจะมีเฉพาะเว็บเซิร์ฟเวอร์และ HTML, JavaScript, CSS แบบคงที่ของแอปพลิเคชันของเรา
สับสน? ตอนนี้เรามาดูการกำหนดค่าบิวด์กันดีกว่า และมันจะชัดเจนขึ้นเล็กน้อย
เทมเพลตของเรามีการกำหนดค่าบิลด์สองแบบ นี่เป็นอันแรกและค่อนข้างมาตรฐาน:
apiVersion: v1
kind: BuildConfig
metadata:
name: react-web-app-builder
spec:
output:
to:
kind: ImageStreamTag
name: react-web-app-builder:latest // 1
source: // 2
git:
uri: ${SOURCE_REPOSITORY_URL}
ref: ${SOURCE_REPOSITORY_REF}
contextDir: ${SOURCE_REPOSITORY_DIR}
type: Git
strategy:
sourceStrategy:
env:
- name: OUTPUT_DIR // 3
value: ${OUTPUT_DIR}
from:
kind: ImageStreamTag
name: web-app-builder-runtime:latest // 4
incremental: true // 5
type: Source
triggers: // 6
- github:
secret: ${GITHUB_WEBHOOK_SECRET}
type: GitHub
- type: ConfigChange
- imageChange: {}
type: ImageChange
อย่างที่คุณเห็น บรรทัดที่มีป้ายกำกับ 1 บอกว่าผลลัพธ์ของบิลด์นี้จะถูกวางไว้ในอิมเมจ react-web-app-builder เดียวกันกับที่เราเห็นก่อนหน้านี้เล็กน้อยในส่วน ImageStreams
บรรทัดที่ระบุว่า 2 จะบอกคุณว่าจะรับโค้ดจากที่ไหน ในกรณีของเรา นี่คือที่เก็บ git และตำแหน่ง โฟลเดอร์อ้างอิง และบริบทจะถูกกำหนดโดยพารามิเตอร์ที่เราเห็นข้างต้น
บรรทัดที่มีป้ายกำกับ 3 คือสิ่งที่เราเห็นแล้วในส่วนพารามิเตอร์ โดยจะเพิ่มตัวแปรสภาพแวดล้อม OUTPUT_DIR ซึ่งในตัวอย่างของเราคือ build
บรรทัดที่ระบุว่า 4 บอกว่าให้ใช้อิมเมจ web-app-builder-runtime ซึ่งเราเห็นแล้วในส่วน ImageStream
บรรทัดที่ระบุว่า 5 บอกว่าเราต้องการใช้บิลด์ส่วนเพิ่มหากอิมเมจ S2I รองรับ และอิมเมจ Web App Builder รองรับ ในการเปิดตัวครั้งแรก หลังจากเสร็จสิ้นขั้นตอนการประกอบ อิมเมจจะบันทึกโฟลเดอร์ node_modules ลงในไฟล์เก็บถาวร จากนั้นในการรันครั้งต่อๆ ไป อิมเมจจะคลายซิปโฟลเดอร์นี้เพื่อลดเวลาในการสร้าง
และสุดท้าย บรรทัดที่ชื่อ 6 เป็นเพียงทริกเกอร์ไม่กี่ตัวที่ทำให้บิลด์ทำงานโดยอัตโนมัติโดยไม่ต้องมีการแทรกแซงด้วยตนเอง เมื่อมีการเปลี่ยนแปลงบางอย่าง
โดยรวมแล้วนี่เป็นการกำหนดค่าบิวด์มาตรฐานที่ค่อนข้างดี
ตอนนี้เรามาดูการกำหนดค่าบิลด์ที่สองกัน มันคล้ายกับอันแรกมาก แต่มีความแตกต่างที่สำคัญอย่างหนึ่ง
apiVersion: v1
kind: BuildConfig
metadata:
name: react-web-app-runtime
spec:
output:
to:
kind: ImageStreamTag
name: react-web-app-runtime:latest // 1
source: // 2
type: Image
images:
- from:
kind: ImageStreamTag
name: react-web-app-builder:latest // 3
paths:
- sourcePath: /opt/app-root/output/. // 4
destinationDir: . // 5
strategy: // 6
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 // 7
ดังนั้นการกำหนดค่าบิลด์ที่สองคือ react-web-app-runtime และเริ่มต้นได้ค่อนข้างมาตรฐาน
บรรทัดที่มีป้ายกำกับ 1 ไม่มีอะไรใหม่ - เพียงบอกว่าผลลัพธ์ของบิลด์ถูกใส่ลงในอิมเมจ react-web-app-runtime
บรรทัดที่มีป้ายกำกับ 2 เช่นเดียวกับในการกำหนดค่าก่อนหน้า ระบุตำแหน่งที่จะรับซอร์สโค้ด แต่สังเกตว่าที่นี่เรากำลังบอกว่ามันถูกนำมาจากภาพ ยิ่งไปกว่านั้น จากอิมเมจที่เราเพิ่งสร้างขึ้น - จาก react-web-app-builder (ระบุไว้ในบรรทัดที่ป้ายกำกับ 3) ไฟล์ที่เราต้องการใช้อยู่ภายในรูปภาพและตำแหน่งของไฟล์นั้นอยู่ในบรรทัดที่มีป้ายกำกับ 4 ในกรณีของเราคือ /opt/app-root/output/ หากคุณจำได้ นี่คือที่ที่ไฟล์ที่สร้างขึ้นตามผลลัพธ์ของการสร้างแอปพลิเคชันของเราจะถูกจัดเก็บไว้
โฟลเดอร์ปลายทางที่ระบุในคำที่มีป้ายกำกับ 5 เป็นเพียงไดเร็กทอรีปัจจุบัน (นี่คือทั้งหมด โปรดจำไว้ว่า ทำงานอยู่ภายในสิ่งมหัศจรรย์บางอย่างที่เรียกว่า OpenShift ไม่ใช่ในเครื่องคอมพิวเตอร์ของคุณ)
ส่วนกลยุทธ์ – บรรทัดที่ชื่อ 6 – ก็คล้ายกับการกำหนดค่าบิลด์แรกเช่นกัน เฉพาะครั้งนี้เราจะใช้ nginx-image-runtime ซึ่งเราเห็นแล้วในส่วน ImageStream
สุดท้ายนี้ บรรทัดที่มีป้ายกำกับ 7 คือส่วนของทริกเกอร์ที่จะเปิดใช้งานบิลด์นี้ทุกครั้งที่อิมเมจ react-web-app-builder เปลี่ยนแปลง
มิฉะนั้น เทมเพลตนี้จะมีการกำหนดค่าการปรับใช้ที่ค่อนข้างเป็นมาตรฐาน รวมถึงสิ่งที่เกี่ยวข้องกับบริการและเส้นทาง แต่เราจะไม่ลงรายละเอียดมากเกินไป โปรดทราบว่าอิมเมจที่จะปรับใช้คืออิมเมจ react-web-app-runtime
การปรับใช้แอปพลิเคชัน
ตอนนี้เราได้ดูเทมเพลตแล้ว มาดูวิธีใช้เพื่อปรับใช้แอปพลิเคชันกัน
เราสามารถใช้เครื่องมือไคลเอ็นต์ OpenShift ที่เรียกว่า oc เพื่อปรับใช้เทมเพลตของเรา:
$ 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
คำสั่งแรกในภาพหน้าจอด้านบนเป็นวิธีการทางวิศวกรรมอย่างจงใจในการค้นหา template./openshiftio/application.yaml
คำสั่งที่สองเพียงสร้างแอปพลิเคชันใหม่โดยใช้เทมเพลตนี้
หลังจากที่คำสั่งเหล่านี้ทำงาน เราจะเห็นว่าเรามีแอสเซมบลีสองชุด:
และกลับมาที่หน้าจอภาพรวม เราจะเห็นพ็อดที่เปิดตัว:
คลิกที่ลิงก์แล้วเราจะไปที่แอปของเรา ซึ่งเป็นหน้าแอป React เริ่มต้น:
อาหารเสริม 1
สำหรับคนรักแองกูลาร์เราก็มี
รูปแบบที่นี่เหมือนกัน ยกเว้นตัวแปร OUTPUT_DIR
อาหารเสริม 2
ในบทความนี้ เราใช้ NGINX เป็นเว็บเซิร์ฟเวอร์ แต่การแทนที่ด้วย Apache นั้นค่อนข้างง่าย เพียงเปลี่ยนเทมเพลตในไฟล์
ข้อสรุป
ในส่วนแรกของซีรีส์นี้ เราได้แสดงวิธีปรับใช้เว็บแอปพลิเคชันสมัยใหม่บนแพลตฟอร์ม OpenShift อย่างรวดเร็ว วันนี้เรามาดูกันว่าอิมเมจของ Web App ทำอะไรได้บ้าง และสามารถรวมเข้ากับเว็บเซิร์ฟเวอร์ล้วนๆ เช่น NGINX ได้อย่างไร โดยใช้บิลด์แบบลูกโซ่เพื่อสร้างบิลด์แอปพลิเคชันที่พร้อมสำหรับการผลิตมากขึ้น ในบทความถัดไปและบทความสุดท้ายของชุดนี้ เราจะแสดงวิธีเรียกใช้เซิร์ฟเวอร์การพัฒนาสำหรับแอปพลิเคชันของคุณบน OpenShift และรับประกันการซิงโครไนซ์ไฟล์ในเครื่องและระยะไกล
เนื้อหาของบทความชุดนี้
- ส่วนหนึ่งของ 1:
วิธีปรับใช้เว็บแอปพลิเคชันสมัยใหม่เพียงไม่กี่ขั้นตอน ; - ส่วนที่ 2: วิธีใช้อิมเมจ S2I ใหม่กับอิมเมจเซิร์ฟเวอร์ HTTP ที่มีอยู่ เช่น NGINX โดยใช้แอสเซมบลี OpenShift ที่เกี่ยวข้องสำหรับการปรับใช้จริง
- ส่วนที่ 3: วิธีรันเซิร์ฟเวอร์การพัฒนาสำหรับแอปพลิเคชันของคุณบนแพลตฟอร์ม OpenShift และซิงโครไนซ์กับระบบไฟล์ในเครื่อง
แหล่งข้อมูลเพิ่มเติม
- ฟรีอีบุ๊ค
กำลังปรับใช้กับ OpenShift . - ข้อมูลเกี่ยวกับ
OpenShift และ Kubernetes .
ที่มา: will.com