Patipat Ponyanan
Grean Developers Family
2 min readApr 16, 2018

--

Devops on Kubernetes ตอน From source code to running application แบบบ้านๆ

วันนี้จะมาเล่าวิธีการเอา Source Code ของเราขึ้นไป Deploy บน Kubernetes แบบอัตโนมัติ ขอเพียงแค่ Developer push code ไปยัง Repository จากนั้นทุกขั้นตอนจะถูกทำงานอัตโนมัติ จนได้แอพที่สามารถใช้งานได้

ที่มาของปัญหา
จากปกติที่เราทำแบบ Manual ต้องเสียทรัพยากรของเราไปหนึ่งอัตรา บวกกับความช้าและยังมีโอกาสผิดพลาดจาก Human error ด้วย ดังนั้นการที่จะแก้ปัญหาดังกล่าวแบบง่ายๆ เลยคือทำ Automate ซะ

วิธีการแก้ไขปัญหา
เมื่อต้องการเปลี่ยนการทำงานจาก Manual มาเป็น Automate ควรเข้าใจแต่ละขั้นตอนก่อนว่ามีที่ไปที่มาอย่างไร แล้วจึงค่อยคิดวิธีหรือหาเครื่องมือมาแก้ปัญหา

  • ขั้นตอนในท่า manual
    - เริ่มจาก Developer เขียน Code เสร็จ push ไปยัง Repository
    - ทำ Docker Images
    - บอก k8s ว่า ออเจ้ามี Docker Images ใหม่มานะ Update ด้วย

Workflow ก็จะมีหน้าตาประมาณนี้
การทำ Docker Image ก็จะแตกต่างกันไปตามภาษาที่ใช้ในการพัฒนา ขอยกตัวอย่างเป็น Java ที่ต้องมีการทำไฟล์ .war/.jar ขึ้นมาก่อน จากนั้นจึงนำไฟล์ดังกล่าวไปอัพเดทเป็น Docker Image ตัวใหม่

Docker Image สามารถสร้างจาก Dockerfile ได้

ตัวอย่าง Dockerfile

FROM tomcat:8.0.69-jre8
WORKDIR /usr/local/tomcat
COPY java-app.war webapps/
CMD ["catalina.sh", "run"]

การทำงานคือมี Image หลักเป็น tomcat จากนั้นนำ java-app.war ไปวางใน webapps เปิด tomcat

เมื่อเราสั่ง docker build ก็จะได้ docker image ตัวใหม่มา อย่าลืมติด tag เพื่อระบุเวอร์ชั่นใหม่ด้วย จากนั้นก็ push ไปเก็บที่ Repository โอเคได้ docker image ล่ะ

ต่อมา ต้องบอก k8sให้อัพเดท docker image ตัวใหม่ ซึ่งเราสามารถเปลี่ยน docker image ใน yaml file ที่เราใช้ในการ deploy ตอนแรกได้เลย

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: songkarn
spec:
template:
metadata:
name: sampleapp
spec:
containers:
- name: hello-songkarn
#image: javaapp:v1
image: javaapp:v2

จากนั้นใช้ kubectl apply ตามด้วย yaml file เพื่อเป็นการบอกให้ k8s อัพเดท docker image ตัวใหม่

Workflow (Manual)

สรุปขั้นตอนการทำงาน
เมื่อ Code ถูก push ไปยัง Repository
1. Build war
Input: Source Code Output: war file
2. Build Docker image
Input: dockerfile, war file Output: Docker image
3. Push Docker image
Input: docker image Output: Docker image in repository
4. Run kubectl
Input: k8s yaml file Output: application ที่มี docker image ตัวใหม่

  • ขั้นตอนในท่า Automate
    โยนงานทุกอย่างให้ jenkins ทำ ในการใช้งาน jenkins เราสามารถเขียน Jenkinsfile เพื่อตั้งค่าขั้นตอนการทำงานต่างๆ ได้ และ push Jenkinsfile เข้าไปใน Source code repository เมื่อ jenkins clone repository มา จะทำการสร้าง job ตามคอนฟิคใน Jenkinsfile ข้อดีคือเรามีคอนฟิคเก็บไว้ในรูปแบบของ code กรณีที่ jenkins ล่มขึ้นมาคอนฟิคเราจะไม่หายไปด้วย

การให้ Jenkins เริ่มทำงานทุกครั้งที่มีการเปลี่ยนแปลงเกิดขึ้นที่ Source Code repository สามารถทำได้สองแบบ
1.คอนฟิคให้ jenkins ไปเช็ค repository ว่ามีอัพเดทไหม โดยสามารถกำหนดความถี่ของการตรวจเช็คได้
2.ตั้ง webhook ที่ Repository ให้ยิงไปที่ jenkins ทุกครั้งที่มีการเปลี่ยนแปลงเกิดขึ้น

Workflow (Automate)

***ก่อนจะเปลี่ยนมาใช้ท่า automate ลองจับเวลาในท่า manual ดู เพื่อเป็นตัวชี้วัดว่าชีวิตจะดีขึ้นไหม

สรุปผลการดำเนินงาน
จากทั้งหมดที่ทำไป เราสามารถนำ source code ของเราขึ้นไป deploy บน k8s ในแบบอัตโนมัติ โดย developer เพียงแค่ push source code เท่านั้น
ซึ่งจริงๆ แล้วอาจจะมีขั้นตอนเพิ่มอีก ทั้งในด้านการ testing, security ซึ่งหากเราเข้าใจว่าสิ่งเหล่านี้จะไปอยู่ตรงไหนใน workflow ก็ไม่ยากเลยที่จะเพิ่มเข้าไป
สิ่งสำคัญเลยคือต้องเข้าใจขั้นตอนปกติก่อนว่ามันทำอย่างไร แล้วจึงหา tools มาประยุกต์ใช้งาน และก่อนทำควรหาตัวชี้วัดว่าทำแล้วจะดีขึ้นจริง

เพิ่มเติ่ม ณ ตอนนี้มีโปรเจค jenkins-x ซึ่งเป็นการทำ ci/cd สำหรับ k8s โดยเฉพาะหากใครสนใจท่าที่ advance กว่าก็สามารถศึกษาเพิ่มเติ่มได้ที่นี่ http://jenkins-x.io/

--

--