Deploy K8S บน Cent OS 7 ตั้งเเต่ Zero ถึง Hero !! (ตอนที่ 2)

Pao Payungsak Klinchampa
Next-Hop Co., Ltd.
Published in
4 min readAug 6, 2019

ใครยังไม่ได้อ่านตอนเเรก ตามไปอ่านกันก่อนนะครับ ที่นี่ เดี๋ยวจะงงเอาได้ ฮ้าๆ :D

ในตอนที่ 1 เราได้ทำการ Deploy Kubernest Cluster เสร็จสิ้นกันเป็นที่เรียบร้อยเเล้ว ในตอนนี้จะกล่าวถึงการจัดเตรียม App ของเราเพื่อนำไป Deploy ครับ

Ref:https://mapr.com/products/kubernetes/

สำหรับในบทความนี้ ผมจะยกตัวอย่างการเตรียม App ที่สร้างขึ้นมาจาก React ด้วยคำสั่ง create-react-app

Requirement :

  1. Docker ติดตั้ง พร้อมใช้
  2. Create-react-app
  3. Node.js
  4. yarn

วิธีการด้านบนผมไม่ขอพูดเรื่องการติดตั้งนะครับ จะเริ่มที่การสร้าง Web App เเละการเตรียม Docker Image เพื่อนำไป Deploy

มาเริ่มกันเลย

  1. สร้าง React App ด้วยคำสั่ง create-react-app demo-project
create-react-app demo-project
  1. cd demo-project && yarn start
  2. ทดลองเข้าหน้าเว็บดู ถ้าได้ เราก็จะเห็น React Logo สีฟ้า หมุนๆ
React Logo สีฟ้า หมุนๆ

ได้เเอพเเล้ว ฮ้าๆๆๆ มาเตรียม Dockerfile กันต่อเลย

Docker ลูกรัก ผู้ช่วยในการ Build Image Ref:https://blog.docker.com/2013/06/announcing-new-docker-style/

สร้าง file ชื่อ Dockerfile ใน demo-project folder ของเรากันเลยครับ ค่า Config ก็ตามด้านล่าง

# Build React App

FROM node:10.15.1 AS builder

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

COPY package.json .

COPY yarn.lock .

RUN yarn install — ignore-platform

COPY . .

RUN yarn build

# Copy Build App to Nginx Container

FROM nginx:1.14.2-alpine

COPY — from=0 /usr/src/app/build /usr/share/nginx/html

WORKDIR /usr/share/nginx/html

EXPOSE 80

CMD [“nginx”, “-g”, “daemon off;”]

และสร้าง file ชื่อ .dockerignore เพื่อไม่ให้เอา node_modules/ ใส่ลงไปใน Docker ด้วยคำสั่ง

# echo “node_modules” > .dockerignore

และทำการ Build ด้วยคำสั่ง

# docker build -t docker-repo.demo.com:5000/demo-project:v1 .

จะเห็นว่า Docker จะทำการ Build 2 Stage ครับ โดยขั้นตอนเเรกจะเป็นการ build React App ของเรา ซึ่งผลลัพธ์ที่ได้ เราจะได้ build folder ข้างในก็คือ Static file พวก index.html , css , js ต่างๆนาๆ

และเมื่อ Stage เเรกเสร็จ ก็จัดการสร้าง Nginx Docker Image เพื่อให้ Nginx Render React App ที่ Build เสร็จเรียบร้อยเเล้ว ซึ่งข้อดีของการทำเเบบนี้คือ Image ที่เรา Build เสร็จสิ้นจะมีขนาดค่อนข้างเล็กนั่นเอง

เมื่อ Build เสร็จก็ลองมาตรวจสอบกันว่ามี Images ในระบบของมันเเล้วหรือยังโดยใช้คำสั่ง

# docker images | grep “demo.com”

Image ที่เรา Build สำเร็จแล้ว

ถ้ามี docker-repo.demo.com:5000/demo-project:v1 โผล่ขึ้นมา เเสดงว่าการ Build สำเร็จครับผม แต่ก็อย่าประมาทไป ใครจะไปรู้ว่ามันเอามา Deploy ได้จริงๆมั๊ย ฮาาา ก็ให้ลองใช้คำสั่ง docker run เพื่อทดสอบดูก่อนนะครับ

เเล้วจะเอาไปใช้กับ k8s ได้ไง ???

จะเห็นว่า Docker Image ที่ผม Build ผมใส่ชื่อในรูปของ

“domain-name:port”/project-name:<tag>

ใช่เเล้วครับ เราจะทำ Docker Repo ใช้เองง วู้ววววว เวอร์วังจริงๆ ส่วนใครอยากจะ Export ออกมาเป็น .tar file ก็เเล้วแต่ความศรัทธาเลยครับ ทำไงก็ได้ให้ Image ที่เรา Build ไปอยู่ใน Docker image system ที่เครื่อง k8s-master ก็พอ :D

ในบทความนี้จะเป็น Private Docker Repo นะครับ ซึ่ง Private ในที่นี้คือ การสร้าง Docker Repo ที่อยู่ใน Private Network ของเรา แต่ถ้าท่านต้องการ Deploy บน Cloud ก็อย่าลืมตั้งค่า Firewall ให้ดี เพระในบทความนี้ยังไม่ได้พูดถึงการทำ Authentication ครับ ใครรู้ ชื่อ image ของเรา เค้าก็ดึงได้หมด ระวังนะครับ ฮ้าๆ :D

เริ่มกันเลย ผมจะขอ Run Docker Repo บน Dev Server ที่ผมใช้ ซึ่งก็เครื่องเดียวกับที่ใช้สร้าง กับ Build React ในขั้นตอนก่อนหน้า

ลืมไปปป!! ให้ไปสร้าง Cert , ซื้อ หรือขอ Cert Free จาก Let Encrypt มาก่อน เเล้วก็ไป Add DNS Record docker-repo.demo.com ให้ชี้มาที่ Docker Repo Server และใช้คำสั่ง

docker run -d -p 5000:5000 — restart=always — name registry \
-v /certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2

เตรียม Cert ให้ถูก Path กันด้วยนะครับ อันนี้จะอยู่ที่ ~/certs/domain.crt เเละ ~/certs/domain.key

จากนั้นก็ใช้คำสั่ง docker ps ดูว่ามันทำงานรึเปล่า ถ้ามันโชว์ขึ้นมา ไม่มีปัญหาอะไร ก็เเสดงว่าใช้งานได้เเล้วครับ

Docker Repo ของเรา

ขั้นตอนต่อมาคือ เอา Image ที่เรา Build push ขึ้นไปยัง Docker ที่เราสร้าง ด้วยคำสั่งอันเเสนง่ายดาย

# docker push docker-repo.demo.com:5000/demo-project:v1

เรียบร้อย เสร็จเเล้วครับ 55555 ณ ตอนนี้ Image ของเราก็ขึ้นไปอยู่บน Docker Repo เเล้วเรียบร้อย

โดยเราสามารถตรวจสอบได้ว่ามันขึ้นไปอยู่จริงมั๊ย โดยการ curl ผ่าน url นี้

curl https://docker-repo.demo.com:5000/v2/_catalog

หรือจะใช้ Postman ก็ได้ ไม่ว่ากัน อิอิ :D

ถ้ามีชื่อ Image ของเราตอบกลับมาเเสดงว่ามันไปอยู่ในนั้นเรียบร้อยเเล้วครับ เย้!!

ขอจบตอนที่ 2 ไว้เพียงแค่นี้นะครับ ในตอนต่อไป ผมจะพูดเรื่องการเอา Image ที่เรา build ไป deploy บน k8s เเล้ว รวมไปถึงการทำ Load Balance ด้วย

ขอบคุณเเละสวัสดีครับ

Ref :

Payungsak Klinchampa

Network/System Engineer , DevOps , Blogger.

--

--