์๋ ํ์ธ์, ์ด ๋ธ๋ก๊ทธ์ ์ฌ๋ฌ๋ถ! ์ด๋ Red Hat OpenShift์์ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์๋ฆฌ์ฆ์ ์ธ ๋ฒ์งธ ๊ฒ์๋ฌผ์ ๋๋ค.
์ด์ ๋ ๊ฒ์๋ฌผ์์ ์ฐ๋ฆฌ๋ ๋จ ๋ช ๋จ๊ณ๋ง์ผ๋ก ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ๊ณผ ํ๋ก๋์
๋ฐฐํฌ๋ฅผ ์กฐ์จํ๊ธฐ ์ํด ์ฒด์ธ ๋น๋๋ฅผ ์ฌ์ฉํ์ฌ NGINX์ ๊ฐ์ ๊ธฐ์ฑ HTTP ์๋ฒ ์ด๋ฏธ์ง์ ํจ๊ป ์ S2I ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. .
์ค๋์ OpenShift ํ๋ซํผ์์ ์ ํ๋ฆฌ์ผ์ด์
์ฉ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ๊ณ ์ด๋ฅผ ๋ก์ปฌ ํ์ผ ์์คํ
๊ณผ ๋๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ณ OpenShift ํ์ดํ๋ผ์ธ์ด ๋ฌด์์ธ์ง, ์ฐ๊ฒฐ๋ ์ด์
๋ธ๋ฆฌ์ ๋์์ผ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก์์ OpenShift
๊ฐ๋ฐ ์ํฌํ๋ก
์์ ์ธ๊ธํ๋ฏ์ด
๋๋ถ๋ถ์ ์ต์ ํ๋ ์์ํฌ์์๋ ์ด๋ฌํ "๊ฐ๋ฐ ์๋ฒ"๊ฐ ํด๋น ๋ช ๋ น์ค ๋๊ตฌ์ ๋ด์ฅ๋์ด ์์ต๋๋ค.
ํ์ง ์ฌ๋ก
๋จผ์ , ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก์ปฌ์์ ์คํํ ๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ผ์ React ์์ ์์ "dev ์๋ฒ"๋ฅผ ์์ํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์
๋ ฅํฉ๋๋ค.
$ npm run start
๊ทธ๋ฐ ๋ค์ ํฐ๋ฏธ๋ ์ฐฝ์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฆฝ๋๋ค.
์ด์ ํ์ผ์ ๋ณ๊ฒฝํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ฐ์ดํธ๋์ด์ผ ํฉ๋๋ค.
์ข์ต๋๋ค. ๋ก์ปฌ ๋ชจ๋์์ ๊ฐ๋ฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ช ํํด์ง๋๋ค. ๊ทธ๋ฐ๋ฐ OpenShift์์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
OpenShift์ ๊ฐ๋ฐ ์๋ฒ
๊ธฐ์ตํ์ ๋ค๋ฉด,
๊ทธ๋ฌ๋ ์์ธํ ์ดํด๋ณด๋ฉด
์๋ฅผ ๋ค์ด nodeshift ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
$ npx nodeshift --deploy.env NPM_RUN="yarn start" --dockerImage=nodeshift/ubi8-s2i-web-app
์ฐธ๊ณ : ์์ ์๋ ์ผ๋ฐ์ ์ธ ์์ด๋์ด๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ถ์ฝ๋์์ต๋๋ค.
์ฌ๊ธฐ์์๋ NPM_RUN ํ๊ฒฝ ๋ณ์๋ฅผ ๋ฐฐํฌ์ ์ถ๊ฐํ์ต๋๋ค. ์ด ๋ณ์๋ OpenShift ํฌ๋ ๋ด์์ React ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์์ํ๋ Yarn start ๋ช ๋ น์ ์คํํ๋๋ก ๋ฐํ์์ ์ง์ํฉ๋๋ค.
์คํ ์ค์ธ Pod์ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฌผ๋ก ์ด ๋ชจ๋ ๊ฒ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ํฐ๋งํ์ง๋ง ์๊ฒฉ ์๋ฒ์ ์๋ ์ฝ๋์ ๋ก์ปฌ ์ฝ๋๋ฅผ ๋๊ธฐํํ ์ ์์ ๋๊น์ง ์๋ฌด ๊ฒ๋ ์๋๋๋ค.
์๊ฒฉ ๋ฐ ๋ก์ปฌ ์ฝ๋ ๋๊ธฐํ
๋คํ์ค๋ฝ๊ฒ๋ nodeshift๋ ๋๊ธฐํ์ ์ฝ๊ฒ ๋์์ ์ค ์ ์์ผ๋ฉฐ watch ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๋ฐฐํฌํ๋ ๋ช ๋ น์ ์คํํ ํ ๋ค์ ๋ช ๋ น์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ npx nodeshift watch
๊ฒฐ๊ณผ์ ์ผ๋ก ์กฐ๊ธ ๋ ์ผ์ฐ ์์ฑํ ์คํ ์ค์ธ ํฌ๋์ ์ฐ๊ฒฐ๋๊ณ ๋ก์ปฌ ํ์ผ๊ณผ ์๊ฒฉ ํด๋ฌ์คํฐ์ ๋๊ธฐํ๊ฐ ํ์ฑํ๋๋ฉฐ ๋ก์ปฌ ์์คํ ์ ํ์ผ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ชจ๋ํฐ๋ง๋๊ธฐ ์์ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด์ src/App.js ํ์ผ์ ์ ๋ฐ์ดํธํ๋ฉด ์์คํ ์ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ์ฌ ์ด๋ฅผ ์๊ฒฉ ํด๋ฌ์คํฐ์ ๋ณต์ฌํ๊ณ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์์ํ ๋ค์ ๋ธ๋ผ์ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
๊ทธ๋ฆผ์ ์์ฑํ๊ธฐ ์ํด ์ ์ฒด ๋ช ๋ น์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
$ npx nodeshift --strictSSL=false --dockerImage=nodeshift/ubi8-s2i-web-app --build.env YARN_ENABLED=true --expose --deploy.env NPM_RUN="yarn start" --deploy.port 3000
$ npx nodeshift watch --strictSSL=false
watch ๋ช
๋ น์ oc rsync ๋ช
๋ น ์์ ์ถ์ํ๋์ด ์์ผ๋ฉฐ ์๋ ๋ฐฉ์์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
์ด๋ React์ ๋ํ ์์ด์ง๋ง ๋ค๋ฅธ ํ๋ ์์ํฌ์์๋ ๋๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์์ ๋ฐ๋ผ NPM_RUN ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
โ
์คํ์ํํธ ํ์ดํ๋ผ์ธ
๋ค์์ผ๋ก OpenShift Pipelines์ ๊ฐ์ ๋๊ตฌ์ ์ด๋ฅผ ์ฒด์ธ ๋น๋์ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
OpenShift ํ์ดํ๋ผ์ธ์ด๋ ๋ฌด์์ ๋๊น?
OpenShift Pipelines๋ Tekton์ ์ฌ์ฉํ์ฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋๋ก ์ค๊ณ๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ CI/CD ์ง์์ ์ธ ํตํฉ ๋ฐ ์ ๊ณต ์์คํ ์ ๋๋ค. Tekton์ ๊ธฐ๋ณธ ๊ณ์ธต์์ ์ถ์ํํ์ฌ ๋ค์ํ ํ๋ซํผ(Kubernetes, ์๋ฒ๋ฆฌ์ค, ๊ฐ์ ๋จธ์ ๋ฑ)์์ ๋ฐฐํฌ๋ฅผ ์๋ํํ ์ ์๋ ์ ์ฐํ ์คํ ์์ค Kubernetes ๊ธฐ๋ฐ CI/CD ํ๋ ์์ํฌ์ ๋๋ค.
์ด ๋ฌธ์๋ฅผ ์ดํดํ๋ ค๋ฉด ํ์ดํ๋ผ์ธ์ ๋ํ ์ง์์ด ํ์ํ๋ฏ๋ก ๋จผ์ ์ฝ์ด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ ํ๊ฒฝ ์ค์
์ด ๋ฌธ์์ ์์ ๋ฅผ ์คํํ๋ ค๋ฉด ๋จผ์ ์์ ํ๊ฒฝ์ ์ค๋นํด์ผ ํฉ๋๋ค.
- OpenShift 4 ํด๋ฌ์คํฐ๋ฅผ ์ค์นํ๊ณ ๊ตฌ์ฑํฉ๋๋ค. ์ด ์์ ์์๋ ์ด๋ฅผ ์ํด CodeReady Containers(CRD)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค์น ์ง์นจ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ . - ํด๋ฌ์คํฐ๊ฐ ์ค๋น๋๋ฉด ์ฌ๊ธฐ์ Pipeline Operator๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. ๋๋ ค์ํ์ง ๋ง์ญ์์ค. ์ฝ์ต๋๋ค. ์ค์น ์ง์นจ
์ฌ๊ธฐ์ . - ๋ค์ด๋ก๋
ํ ํค CLI (ใ )์ฌ๊ธฐ์ . - create-react-app ๋ช
๋ น์ค ๋๊ตฌ๋ฅผ ์คํํ์ฌ ๋ฐฐํฌํ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํฉ๋๋ค(์ด๊ฒ์ ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์
์
๋๋ค.
๋ฐ์ ). - (์ ํ ์ฌํญ) ์ ์ฅ์๋ฅผ ๋ณต์ ํ์ฌ npm install๊ณผ npm start๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ ์ฅ์์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ Kubernetes/OpenShift YAML์ ํฌํจํ๋ k8s ํด๋๋ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์์ฑํ ์์
, ClusterTasks, ๋ฆฌ์์ค ๋ฐ ํ์ดํ๋ผ์ธ์ด ์์ต๋๋ค.
์์ํ์
์์ ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ OpenShift ํด๋ฌ์คํฐ์ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ํ๋ก์ ํธ webapp-pipeline์ ํธ์ถํ๊ณ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
$ oc new-project webapp-pipeline
์ด ํ๋ก์ ํธ ์ด๋ฆ์ ๋์ค์ ์ฝ๋์ ํ์๋๋ฏ๋ก ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ง์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ๊ทธ์ ๋ฐ๋ผ ์์ ์ฝ๋๋ฅผ ํธ์งํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด ์์ ๋ถํฐ ์ฐ๋ฆฌ๋ ํํฅ์์ด ์๋ ์ํฅ์์ผ๋ก ์งํํฉ๋๋ค. ์ฆ, ๋จผ์ ์ปจ๋ฒ ์ด์ด์ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ ๋ค์ ์ปจ๋ฒ ์ด์ด ์์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
๊ทธ๋ผ ์ฐ์ ...
์์
ํ์ดํ๋ผ์ธ ๋ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ์์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์์ ์ธ apply_manifests_task๋ ์ ํ๋ฆฌ์ผ์ด์ ์ k8s ํด๋์ ์๋ Kubernetes ๋ฆฌ์์ค(์๋น์ค, ๋ฐฐํฌ ๋ฐ ๊ฒฝ๋ก)์ YAML์ ์ ์ฉํ๋ ์ผ์ ๋ด๋นํฉ๋๋ค. ๋ ๋ฒ์งธ ์์ ์ธ update_deployment_task๋ ์ด๋ฏธ ๋ฐฐํฌ๋ ์ด๋ฏธ์ง๋ฅผ ํ์ดํ๋ผ์ธ์์ ์์ฑ๋ ์ด๋ฏธ์ง๋ก ์ ๋ฐ์ดํธํ๋ ์ผ์ ๋ด๋นํฉ๋๋ค.
์์ง ๋ช ํํ์ง ์๋๋ผ๋ ๊ฑฑ์ ํ์ง ๋ง์ธ์. ์ค์ ๋ก ์ด๋ฌํ ์์ ์ ์ ํธ๋ฆฌํฐ์ ๋น์ทํ๋ฉฐ ๋์ค์ ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ง๊ธ์ ๊ทธ๋ฅ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/tasks/update_deployment_task.yaml
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/tasks/apply_manifests_task.yaml
๊ทธ๋ฐ ๋ค์ tkn CLI ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์์ ์ด ์์ฑ๋์๋์ง ํ์ธํฉ๋๋ค.
$ tkn task ls
NAME AGE
apply-manifests 1 minute ago
update-deployment 1 minute ago
์ฐธ๊ณ : ์ด๋ ํ์ฌ ํ๋ก์ ํธ์ ๋ํ ๋ก์ปฌ ์์ ์ ๋๋ค.
ํด๋ฌ์คํฐ ์์
ํด๋ฌ์คํฐ ์์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ ์์ ๊ณผ ๋์ผํฉ๋๋ค. ์ฆ, ํน์ ์์ ์ ์คํํ ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๊ฒฐํฉ๋๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ๊ณ ๋ชจ์์ ๋๋ค. ์ฐจ์ด์ ์ ํด๋ฌ์คํฐ ์์ ์ ํด๋ฌ์คํฐ ๋ด์ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. Pipeline Operator๋ฅผ ์ถ๊ฐํ ๋ ์๋์ผ๋ก ์์ฑ๋๋ ํด๋ฌ์คํฐ ์์ ๋ชฉ๋ก์ ๋ณด๋ ค๋ฉด tkn CLI ๋ช ๋ น์ ๋ค์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
$ tkn clustertask ls
NAME AGE
buildah 1 day ago
buildah-v0-10-0 1 day ago
jib-maven 1 day ago
kn 1 day ago
maven 1 day ago
openshift-client 1 day ago
openshift-client-v0-10-0 1 day ago
s2i 1 day ago
s2i-go 1 day ago
s2i-go-v0-10-0 1 day ago
s2i-java-11 1 day ago
s2i-java-11-v0-10-0 1 day ago
s2i-java-8 1 day ago
s2i-java-8-v0-10-0 1 day ago
s2i-nodejs 1 day ago
s2i-nodejs-v0-10-0 1 day ago
s2i-perl 1 day ago
s2i-perl-v0-10-0 1 day ago
s2i-php 1 day ago
s2i-php-v0-10-0 1 day ago
s2i-python-3 1 day ago
s2i-python-3-v0-10-0 1 day ago
s2i-ruby 1 day ago
s2i-ruby-v0-10-0 1 day ago
s2i-v0-10-0 1 day ago
์ด์ ๋ ๊ฐ์ ํด๋ฌ์คํฐ ์์ ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ S2I ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ ๋ด๋ถ OpenShift ๋ ์ง์คํธ๋ฆฌ๋ก ๋ณด๋ ๋๋ค. ๋ ๋ฒ์งธ๋ ์ด๋ฏธ ์ฝํ ์ธ ๋ก ๊ตฌ์ถํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ฌ NGINX๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฏธ์ง ์์ฑ ๋ฐ ๋ณด๋ด๊ธฐ
์ฒซ ๋ฒ์งธ ์์ ์ ์์ฑํ ๋ ์ฐ๊ฒฐ๋ ์ด์ ๋ธ๋ฆฌ์ ๋ํด ์ด์ ๊ธฐ์ฌ์์ ์ด๋ฏธ ์ํํ ์์ ์ ๋ฐ๋ณตํฉ๋๋ค. S2I ์ด๋ฏธ์ง(ubi8-s2i-web-app)๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ "๊ตฌ์ถ"ํ๊ณ ๊ฒฐ๊ตญ OpenShift ๋ด๋ถ ๋ ์ง์คํธ๋ฆฌ์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋์๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. ์ด์ ์ด S2I ์น ์ฑ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ฉ DockerFile์ ์์ฑํ ๋ค์ Buildah๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋น๋๋ฅผ ์ํํ๊ณ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ OpenShift ๋ด๋ถ ๋ ์ง์คํธ๋ฆฌ์ ํธ์ํฉ๋๋ค. NodeShift๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋ OpenShift๊ฐ ์ํํ๋ ์์ ์ด ๋ฐ๋ก ์ด๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. .
์ฐ๋ฆฌ๋ ์ด ๋ชจ๋ ๊ฒ์ ์ด๋ป๊ฒ ์์๋์? ์์
์ด์ s2i-web-app ํด๋ฌ์คํฐ ์์ ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/s2i-web-app-task.yaml
์ด์ ๋ํด์๋ ์์ธํ ๋ถ์ํ์ง ์๊ณ OUTPUT_DIR ๋งค๊ฐ๋ณ์์๋ง ์ค์ ์ ๋ ๊ฒ์ ๋๋ค.
params:
- name: OUTPUT_DIR
description: The location of the build output directory
default: build
๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋งค๊ฐ๋ณ์๋ React๊ฐ ์กฐ๋ฆฝ๋ ์ฝํ ์ธ ๋ฅผ ๋ฃ๋ ์์น์ธ build์ ๋์ผํฉ๋๋ค. ๋ค๋ฅธ ํ๋ ์์ํฌ๋ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด Ember์์๋ dist์ ๋๋ค. ์ฒซ ๋ฒ์งธ ํด๋ฌ์คํฐ ์์ ์ ์ถ๋ ฅ์ ์ฐ๋ฆฌ๊ฐ ์์งํ HTML, JavaScript ๋ฐ CSS๊ฐ ํฌํจ๋ ์ด๋ฏธ์ง์ ๋๋ค.
NGINX๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง ๋น๋
๋ ๋ฒ์งธ ํด๋ฌ์คํฐ ์์ ์์๋ ์ด๋ฏธ ๊ตฌ์ถํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝํ ์ธ ๋ฅผ ์ฌ์ฉํ์ฌ NGINX ๊ธฐ๋ฐ ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ถํด์ผ ํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์ด๋ ์ฒด์ธ ๋น๋๋ฅผ ์ดํด๋ณธ ์ด์ ์น์ ์ ์ผ๋ถ์ ๋๋ค.
์ด๋ฅผ ์ํด ์์ ์ ํํ ๋์ผํ๊ฒ ํด๋ฌ์คํฐ ์์ webapp-build-runtime์ ์์ฑํฉ๋๋ค.
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/webapp-build-runtime-task.yaml
์ด๋ฌํ ํด๋ฌ์คํฐ ์์ ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ์์ ์ค์ธ Git ์ ์ฅ์๋ ์์ฑ ์ค์ธ ์ด๋ฏธ์ง์ ์ด๋ฆ์ ์ง์ ํ์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. Git์ผ๋ก ์ ์กํ ๋ด์ฉ์ด๋ ์ต์ข ์ด๋ฏธ์ง๊ฐ ์ถ๋ ฅ๋์ด์ผ ํ๋ ํน์ ์ด๋ฏธ์ง๋ง ์ง์ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์์ ํ ๋ ์ด๋ฌํ ํด๋ฌ์คํฐ ์์ ์ ์ฌ์ฌ์ฉํ ์ ์๋ ์ด์ ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฐ์ํ๊ฒ ๋ค์ ์ง์ ์ผ๋ก ๋์ด๊ฐ๋๋ค.
๋ฆฌ์์ค
๋ฐ๋ผ์ ๋ฐฉ๊ธ ๋งํ๋ฏ์ด ํด๋ฌ์คํฐ ์์ ์ ๊ฐ๋ฅํ ํ ์ผ๋ฐ์ ์ด์ด์ผ ํ๋ฏ๋ก ์ ๋ ฅ(Git ์ ์ฅ์) ๋ฐ ์ถ๋ ฅ(์ต์ข ์ด๋ฏธ์ง)์ผ๋ก ์ฌ์ฉ๋ ๋ฆฌ์์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์๊ฒ ํ์ํ ์ฒซ ๋ฒ์งธ ๋ฆฌ์์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ Git์ ๋๋ค.
# This resource is the location of the git repo with the web application source
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: web-application-repo
spec:
type: git
params:
- name: url
value: https://github.com/nodeshift-starters/react-pipeline-example
- name: revision
value: master
์ฌ๊ธฐ์ PipelineResource๋ git ์ ํ์ ๋๋ค. params ์น์ ์ url ํค๋ ํน์ ์ ์ฅ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋ง์คํฐ ๋ธ๋์น๋ฅผ ์ง์ ํฉ๋๋ค(์ ํ ์ฌํญ์ด์ง๋ง ์์ ์ฑ์ ์ํด ์์ฑํฉ๋๋ค).
์ด์ s2i-web-app ์์ ์ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋ ์ด๋ฏธ์ง์ ๋ํ ๋ฆฌ์์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ฉ๋๋ค.
# This resource is the result of running "npm run build", the resulting built files will be located in /opt/app-root/output
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: built-web-application-image
spec:
type: image
params:
- name: url
value: image-registry.openshift-image-registry.svc:5000/webapp-pipeline/built-web-application:latest
์ฌ๊ธฐ์ PipelineResource๋ ์ด๋ฏธ์ง ์ ํ์ด๊ณ url ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ด๋ถ OpenShift ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ, ํนํ webapp-pipeline ๋ค์์คํ์ด์ค์ ์๋ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๋ค๋ฅธ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ์ค์ ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
๋ง์ง๋ง์ผ๋ก ํ์ํ ๋ง์ง๋ง ๋ฆฌ์์ค๋ ์ด๋ฏธ์ง ์ ํ์ด ๋ ๊ฒ์ด๋ฉฐ ์ด๊ฒ์ด ๋ฐฐํฌ ์ค์ ์ฌ์ฉ๋ ์ต์ข NGINX ์ด๋ฏธ์ง๊ฐ ๋ ๊ฒ์ ๋๋ค.
# This resource is the image that will be just the static html, css, js files being run with nginx
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: runtime-web-application-image
spec:
type: image
params:
- name: url
value: image-registry.openshift-image-registry.svc:5000/webapp-pipeline/runtime-web-application:latest
๋ค์ ํ๋ฒ ๋ง์๋๋ฆฌ์ง๋ง, ์ด ๋ฆฌ์์ค๋ webapp-pipeline ๋ค์์คํ์ด์ค์ ๋ด๋ถ OpenShift ๋ ์ง์คํธ๋ฆฌ์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด๋ฌํ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํ ๋ฒ์ ์์ฑํ๋ ค๋ฉด create ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค.
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/resources/resource.yaml
๋ค์๊ณผ ๊ฐ์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
$ tkn resource ls
์ปจ๋ฒ ์ด์ด ํ์ดํ๋ผ์ธ
์ด์ ํ์ํ ๊ตฌ์ฑ ์์๊ฐ ๋ชจ๋ ์ค๋น๋์์ผ๋ฏ๋ก ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ์ดํ๋ผ์ธ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/pipelines/build-and-deploy-react.yaml
ํ์ง๋ง ์ด ๋ช ๋ น์ ์คํํ๊ธฐ ์ ์ ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ด๋ฆ์ ๋๋ค.
apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
name: build-and-deploy-react
๊ทธ๋ฐ ๋ค์ ์ฌ์ ์น์ ์์ ์ด์ ์ ์์ฑํ ๋ฆฌ์์ค์ ๋ํ ํ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
spec:
resources:
- name: web-application-repo
type: git
- name: built-web-application-image
type: image
- name: runtime-web-application-image
type: image
๊ทธ๋ฐ ๋ค์ ํ์ดํ๋ผ์ธ์ด ์๋ฃํด์ผ ํ๋ ์์ ์ ์์ฑํฉ๋๋ค. ์ฐ์ , ์ด๋ฏธ ์์ฑํ s2i-web-app ์์ ์ ์คํํด์ผ ํฉ๋๋ค.
tasks:
- name: build-web-application
taskRef:
name: s2i-web-app
kind: ClusterTask
์ด ์์ ์ ์ ๋ ฅ(gir ๋ฆฌ์์ค) ๋ฐ ์ถ๋ ฅ(build-web-application-image ๋ฆฌ์์ค) ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ํ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ฏ๋ก TLS๋ฅผ ํ์ธํ์ง ์๋๋ก ํน์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํฉ๋๋ค.
resources:
inputs:
- name: source
resource: web-application-repo
outputs:
- name: image
resource: built-web-application-image
params:
- name: TLSVERIFY
value: "false"
๋ค์ ์์ ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ด๋ฏธ ์์ฑํ webapp-build-runtime ํด๋ฌ์คํฐ ์์ ๋ง ํธ์ถ๋ฉ๋๋ค.
name: build-runtime-image
taskRef:
name: webapp-build-runtime
kind: ClusterTask
์ด์ ์์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฆฌ์์ค๋ฅผ ์ ๋ฌํ์ง๋ง ์ด์ ๋ build-web-application-image(์ด์ ์์ ์ ์ถ๋ ฅ)์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ๋ ฅ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ค์ ์ค์ ํฉ๋๋ค. ์ด ์์ ์ ์ด์ ์์ ์ดํ์ ์คํ๋์ด์ผ ํ๋ฏ๋ก runAfter ํ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
resources:
inputs:
- name: image
resource: built-web-application-image
outputs:
- name: image
resource: runtime-web-application-image
params:
- name: TLSVERIFY
value: "false"
runAfter:
- build-web-application
๋ค์ ๋ ์์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ k8s ๋๋ ํฐ๋ฆฌ์ ์๋ ์๋น์ค, ๊ฒฝ๋ก ๋ฐ ๋ฐฐํฌ YAML ํ์ผ์ ์ฌ์ฉํ๊ณ ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ ์ด ๋ฐฐํฌ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์์ ์ ๋ด๋นํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ์ฌ์ ์์ ๋ถ๋ถ์์ ์ด ๋ ๊ฐ์ง ํด๋ฌ์คํฐ ์์ ์ ์ ์ํ์ต๋๋ค.
์ปจ๋ฒ ์ด์ด ์์
๋ฐ๋ผ์ ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ๋ถ๋ถ์ด ์์ฑ๋์์ผ๋ฉฐ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์คํํฉ๋๋ค.
$ tkn pipeline start build-and-deploy-react
์ด ๋จ๊ณ์์๋ ๋ช ๋ น์ค์ด ๋ํํ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ๊ฐ ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก ์ ์ ํ ๋ฆฌ์์ค๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. git ๋ฆฌ์์ค์ ๋ํด web-application-repo๋ฅผ ์ ํํ ๋ค์ ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง ๋ฆฌ์์ค์ ๋ํด build-web-application์ ์ ํํฉ๋๋ค. -image, ๋ง์ง๋ง์ผ๋ก ๋ ๋ฒ์งธ ์ด๋ฏธ์ง ๋ฆฌ์์ค โruntime-web-application-image:
? Choose the git resource to use for web-application-repo: web-application-repo (https://github.com/nodeshift-starters/react-pipeline-example)
? Choose the image resource to use for built-web-application-image: built-web-application-image (image-registry.openshift-image-registry.svc:5000/webapp-pipeline/built-web-
application:latest)
? Choose the image resource to use for runtime-web-application-image: runtime-web-application-image (image-registry.openshift-image-registry.svc:5000/webapp-pipeline/runtim
e-web-application:latest)
Pipelinerun started: build-and-deploy-react-run-4xwsr
์ด์ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ์ดํ๋ผ์ธ์ ์ํ๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
$ tkn pipeline logs -f
ํ์ดํ๋ผ์ธ์ด ์์๋๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ฒ์๋ ๊ฒฝ๋ก๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค.
$ oc get route react-pipeline-example --template='http://{{.spec.host}}'
๋ ๋์ ์๊ฐํ๋ฅผ ์ํด ์น ์ฝ์์ ๊ฐ๋ฐ์ ๋ชจ๋ ์น์ ์์ ํ์ดํ๋ผ์ธ์ ๋ณผ ์ ์์ต๋๋ค. ํ์ดํ ๋ผ์ธ, ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด. 1.
๊ทธ๋ฆผ 1. ์คํ ์ค์ธ ํ์ดํ๋ผ์ธ์ ๊ฒํ ํฉ๋๋ค.
์คํ ์ค์ธ ํ์ดํ๋ผ์ธ์ ํด๋ฆญํ๋ฉด ๊ทธ๋ฆผ 2์ ๊ฐ์ด ์ถ๊ฐ ์ธ๋ถ ์ ๋ณด๊ฐ ํ์๋ฉ๋๋ค.
์. 2. ํ์ดํ๋ผ์ธ์ ๋ํ ์ถ๊ฐ ์ ๋ณด.
์์ธํ ๋ด์ฉ์ ํ์ธํ ํ ๋ณด๊ธฐ์์ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณผ ์ ์์ต๋๋ค. ํ ํด๋ก์ง, ๊ทธ๋ฆผ 3๊ณผ ๊ฐ์ด.
๊ทธ๋ฆผ 3. ์ถ์๋ ํฌ๋.
์์ด์ฝ์ ์ค๋ฅธ์ชฝ ์๋จ์ ์๋ ์์ ํด๋ฆญํ๋ฉด ๊ทธ๋ฆผ 4์ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ฆฝ๋๋ค.
์. 4. React ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค.
๊ฒฐ๋ก
๋ฐ๋ผ์ OpenShift์์ ์ ํ๋ฆฌ์ผ์ด์
์ฉ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ๊ณ ์ด๋ฅผ ๋ก์ปฌ ํ์ผ ์์คํ
๊ณผ ๋๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๋ํ OpenShift Pipelines๋ฅผ ์ฌ์ฉํ์ฌ ์ฒด์ธ ๋น๋ ํ
ํ๋ฆฟ์ ์๋ฎฌ๋ ์ด์
ํ๋ ๋ฐฉ๋ฒ๋ ์ดํด๋ณด์์ต๋๋ค. ์ด ๊ธฐ์ฌ์ ๋ชจ๋ ์์ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์ถ๊ฐ ์๋ฃ(EN)
- ๋ฌด๋ฃ ์ ์์ฑ
"OpenShift ๊ฐ๋ฐ: ์ฐธ์์ฑ์ด ์๋ ์ฌ๋๋ค์ ์ํ ๊ฐ์ด๋" Red Hat OpenShift Application Runtimes ๋ฐ Istio๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋ ์ค์ฌ Node.js ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ Chrome DevTools๋ฅผ ์ฌ์ฉํ์ฌ OpenShift์์ Node.js ์ ํ๋ฆฌ์ผ์ด์ ๋๋ฒ๊น OpenShift์์ Express๋ฅผ ์ฒ์๋ถํฐ ๋ง์คํฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ๋ช ๋ น Red Hat OpenShift Application Runtimes์ ์ผ๋ถ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ Node.js ๋ฒ์ ๋ฐํ Prometheus๋ฅผ ์ฌ์ฉํ์ฌ OpenShift์์ Node.js ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ํฐ๋ง - ์ ๋ํ ๋ค๋ฅธ ๊ธฐ์ฌ
์คํ์ํํธ์ ์ฟ ๋ฒ๋คํฐ์ค ๋ ๋ํ ์น์ฌ์ดํธ์์
๋ค๊ฐ์ค๋ ์น ์ธ๋ฏธ๋ ๊ณต์ง
Red Hat OpenShift Container Platform ๋ฐ Kubernetes๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ณธ ๊ฒฝํ์ ๊ดํ ์ผ๋ จ์ ๊ธ์์ผ ์น ์ธ๋ฏธ๋๋ฅผ ์์ํฉ๋๋ค.
28์ XNUMX์ผ, ์น ์ธ๋ฏธ๋ ํฉ์ "์ด์์": OpenShift ๋ฐ Kubernetes์ ์ด์์ 11์ XNUMX์ผ, ๋ฐฐํฌ ๊ตฌ์ฑ๊ณผ ๋ฐฐํฌ โ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํ OpenShift๋ง์ ๋ง๋ฒ 25์ XNUMX์ผ, Red Hat OpenShift ๋ฐ ๋จธ์ API 9์ XNUMX์ผ ์ ๋ฌด๋ ๊ธ์ฆ์ ๋์ฒํ๋ ๋ฐฉ๋ฒ 23์ XNUMX์ผ, ์๋ฒ ๋๋ Jenkins, ํ์ดํ๋ผ์ธ ๋น๋, Red Hat OpenShift Container Platform์ Tekton
์ถ์ฒ : habr.com