DevOps 101 Jenkins set Time Zone

สวัสดีครับทุกท่าน DevOps 101 ของเราวันนี้ จะมาพูดถึงการ set Time Zone ของ Jenkins กัน .. ผมเชื่อว่าทุกคนคงเคยใช้ Jenkins กันมาแล้ว ก็เลยไม่ได้ลงรายละเอียดตรงส่วนของการใช้งาน Jenkins .. แต่อาจจะเขียนบทความแยก ในส่วนของการ ติดตั้งใช้งาน Jenkins และการสร้าง CI/CD Pipeline บน Jenkins (Jobs) แยกไปอีกบทความนึงนะครับ ..

โดยปกติแล้ว Jenkins จะอ้างอิงเวลา ที่เป็น UTC นะครับ .. เวลาเรา build Jobs เราอาจจะอยากดูเวลาที่เป็นเวลาประเทศไทย (UTC +7) เราก็ต้องนับ +7 เอาเอง ถึงจะเป็นเวลาจริงๆ ณ ตอนนั้น ใน Time Zone ของเรา .. แต่มี trick ง่ายๆ ในการ set ให้ Jenkins แสดงเวลา เป็น Time Zone ของเราครับ แบ่งเป็น 2 วิธีคือ ..

1.Set ให้ทั้งระบบแสดงเวลาให้ default เป็น Time Zone ที่เราต้องการ

เลือก Manage Jenkins > Script Console จากนั้น ใส่ script ดังนี้ครับ แล้วกด Run

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Bangkok')

2.Set การแสดงผล ของแต่ละ user ให้เป็น Time Zone ที่เราต้องการ

เลือก People > เลือก user เราเอง > Configure > User Defined Time Zone จากนั้นให้เลือก Time Zone ที่เราต้องการครับ

เสร็จแล้วจะเห็นว่า เวลาที่แสดง จะเป็นเวลาที่ตรงกับเวลา ที่เป็น Time Zone ของเราครับ ตัวอย่างผมใส่ Asia/Bangkok เวลาที่แสดง ก็จะเป็นเวลา ณ ปัจจุบัน ของประเทศไทยครับ

ก็สั้นๆ ง่ายๆ นะครับ ในการปรับเวลาของ Jenkins ให้ตรงกับ Time Zone ของเรา ทำให้เราดูได้ง่ายขึ้นครับ .. 🙂

ออกแบบ DevOps Architecture CI/CD Pipeline ให้เหมาะกับงาน และองค์กร

DevOps Architecture CI/CD Pipeline

สวัสดีครับ .. DevOps 101 ของเรา วันนี้มีโจทย์ มาอันนึงครับ ให้ออกแบบ Architecture, Tech Stack และ CI/CD Pipeline ของ Application ที่มีคนใช้งานจำนวนมาก app นึง ให้กับองค์กร ขนาดใหญ่ ระดับพนักงาน 200,000 คน ++ ..

จริงๆ ในการออกแบบ ไม่มีอะไรถูกอะไรผิดครับ .. หลักการง่ายๆ ก็คือ “Simply the best” .. ทำให้ deploy ง่ายๆ .. รองรับ load สูงๆ ให้ได้ .. มีระบบ Monitoring ที่ดี .. และเหมาะสม กับงานและองค์กร ..

เนื่องจาก ทางองค์กร มี Single Sign-On อยู่แล้ว ซึ่งสามารถใช้งานผ่าน AWS Cognito ได้ .. เราก็เลยสามารถ ใช้งานได้เลย และเอาไปต่อกับ CI/CD Tools ที่จำเป็นของเราได้ ไม่ว่าจะเป็น GitLab, Jenkins, Nexus Repository และอื่นๆ ในอนาคต ..

ในที่นี้ ตัว Application เราเลือกพัฒนาโดยใช้ Next.js เพราะว่า ต้องรองรับ user ที่เข้าใช้งานหลากหลาย ไม่ว่าจะเป็น บน Desktop และ Mobile .. และทางทีม Developer มีความเชี่ยวชาญในส่วนของ Next.js อยู่แล้ว .. ในส่วนของ CI/CD Tools เราเลือกใช้ Jenkins และทำ CI/CD Pipeline เป็น Jenkinsfile (Declarative Pipeline) แบบง่ายๆ stage ตรงไปตรงมา ใครมาอ่าน ก็เข้าใจ .. เพราะว่าอนาคต เราอยากเอา template นี้ ไป reuse ให้ทีมอื่น ในองค์กร เราได้ใช้ตามด้วย ..

ในส่วนของ Artifactory ที่ใช้เก็บ Docker Images และ binary files ต่างๆ เราเลือกใช้ Nexus Repository เป็น private repository ของเรา .. ส่วน SCM (Source Code Management) อันนี้จริงๆ เราคิดว่า เป็นอะไรก็ได้ ไม่ว่าจะ github, gitlab, ecr, bitbucket .. แต่องค์กรเรามี GitLab อยู่แล้ว ก็เลยใช้ตัวนี้ไปเลย .. ส่วนของ static code scan เราเลือกใช้ SonarQube แต่สิ่งที่เราอยากดูจริงๆ ก็เป็นส่วนของ code coverage มากกว่า ..

ในส่วนของ Server ที่เราจะใช้ในการ deploy ตัว Application ของเราขึ้นไป เราเลือกใช้ Amazon EKS (มันคือ k8s cluster บน AWS) เพราะว่าเราไม่ต้องวุ่นวายในการสร้าง k8s cluster ขึ้นมาใช้งานเอง และตัว cost ของ Amazon EKS ก็ไม่ได้แพงกว่า EC2 ธรรมดา เท่าไรนัก ..

ทำไมถึงเลือกใช้ EKS ไม่ใช้ ECS ?

– ผมเองต้องออกตัวไว้ก่อนครับ ว่าความรู้เกี่ยวกับ ECS ของผม แทบจะเป็น 0 .. แต่จากการได้เข้า training กับ AWS ในส่วนของการใช้งาน ECS + DevOps .. ทำให้ผมพอได้รู้บ้างว่า ตัว ECS ทำงานอย่างไร .. เราสามารถ ทำอะไรกับมันได้บ้าง .. ทำให้ผมตัดสินใจได้ทันที ว่างั้นเราไป EKS เถอะ .. เพราะว่า ในการทำ Application ที่รองรับคนใช้งานจำนวนมากนั้น .. การ scale และการ monitoring metrics ต่างๆ ถือว่าเป็นเรื่องสำคัญมาก ซึ่งผมเองคิดว่า EKS ที่เป็น k8s cluster eco system มัน flexible กว่า .. อาจจะเป็นเหตุผลที่เอนเอียงนิดหน่อย จากการที่ผมคุ้นเคยกับ Container Platform ที่เป็น k8s ด้วย .. (k8s, OpenShift)

ในส่วนของ Dashboard & Monitoring Tools ในที่นี้เราเลือกใช้ APM (Application Performance Monitoring) + ELK Stack ในการ monitoring Application ของเรา ที่เป็น Next.js .. ในส่วนของตัว EKS (k8s Cluster) เราเลือกใช้ Lens + Prometheus เป็น manage และ monitoring metrics ต่างๆ .. แต่ตัว Lens เอง มันคือดูแบบ เครื่องใครเครื่องมัน .. อนาคต ถ้าเราอยากทำเป็น dashboard ให้ทั้งทีม ได้ดูผ่านจอ TV LED ร่วมกัน ก็น่าจะเอา Grafana มาทำ dashboard ในส่วนนี้ .. ส่วนตัว Alert Notification เราใช้เป็น webhook ของ MS Teams เพราะว่าทีมเรา และองค์กรเรา ใช้ MS Teams เป็นหลัก ในการทำงานอยู่แล้ว ..

Tech Stack

– Next.js
– GitLab
– Jenkins
– Nexus Repository
– SonarQube
– nginx
– Docker
– Kubernetes (k8s)
– AWS Cognito
– AWS EKS
– Elasticsearch
– Logstash + APM
– Kibana
– Prometheus
– Lens/Grafana
– Microsoft Teams

Jenkins Pipeline Examples

https://github.com/pornpasok/demo-app-k8s

สำหรับท่านใด ที่สนใจ ในการออกแบบ Architecture, Tech Stack และ CI/CD Pipeline ก็สามารถ มา comment พูดคุย แลกเปลี่ยน ปรึกษากันได้ตรงนี้นะครับ .. อย่างที่ผมเน้นย้ำตลอด ไม่มีแบบไหนผิด แบบไหนถูก .. แต่แบบไหนที่เหมาะกับเรา นั่นแหละ คือดีที่สุด ครับ .. 🙂

DevOps 101 Nexus Repository

สวัสดีครับ วันนี้ผมจะมาพูดถึง tools อีกตัวนึง ที่สำคัญมาก ในการทำ CI/CD นะครับ
นั่นก็คือ Repository ที่เอาไว้เก็บของต่างๆ ของเรา ไม่ว่าจะเป็น docker images, libs, หรือ files binary ต่างๆ ที่นิยมกัน ก็จะมี JFrog Artifactory กับ Nexus วันนี้ ผมจะมาพูดถึงเจ้า Nexus กันนะครับ ..

รายละเอียด เพิ่มเติม https://www.sonatype.com/products/repository-pro

ความสามารถของเจ้า Nexus นั้นมีมากมายมากครับ และมี version ที่เป็น OSS อีกด้วย

ส่วนตัวที่ผมใช้ ก็จะใช้เป็น docker repository กับ docker proxy เพื่อใช้งาน ในองค์กร ทั้งแบบ On-Prem และแบบ Public ครับ หลายๆ ท่านอาจจะคุ้นกับ docker hub จะคล้ายๆ กันเลยครับ ..

อธิบายเพิ่มเติมนะครับ

Docker Repository = ที่เก็บ docker images ของเราครับ มองว่าเป็น docker hub ส่วนตัว ประมาณนั้นครับ ..
Docker Proxy = มองว่าเป็น proxy ที่ไปดึง docker images จากที่อื่นอีกที เช่นไปดึงจาก docker hub อะไรพวกนี้ .. ที่ต้องมี docker proxy นอกเหนือจากช่วย caching docker images แล้ว บางที่ network ภายใน ไม่สามารถ access public โดยตรงได้ ก็เลยต้องใช้เป็น docker repository (docker proxy) ภายในแทนครับ ..

มาดูวิธีการติดตั้งกันครับ ในที่นี่ จะติดตั้งแบบใช้ docker นะครับ (อันนี้ตามสะดวกเลยครับ)

1. Create directory nexus-data

mkdir ~/nexus-data

2. Docker Run

docker run -d -p 8081:8081 -p 5000:5000 -p 5001:5001 --name nexus -v ~/nexus-data:/nexus-data sonatype/nexus3

ที่เรา expose ออกมา 3 port ก็เพื่อเอาไว้ จัดการเรื่องต่างๆ ดังนี้ครับ
– Port 8081 สำหรับหน้า Nexus Dashboard
– Port 5000 สำหรับ docker pull
– Port 5001 สำหรับ docket push

3. จากนั้นเข้า หน้า Nexus Dashboard ด้วย IP:PORT

http://localhost:8081/

4. จะขึ้นหน้า ให้เรา Login จาก password ที่ได้จาก file admin.password

cat ~/nexus-data/admin.password
89e5664b-f748-49e4-a7dc-cdcc3febdd6b

5. เมื่อทำการ update new password เรียบร้อยแล้ว จะเข้ามาที่หน้าแรกของ nexus ให้คลิกที่ รูปเฟือง แล้วเลือก Repositories > Create repositories

Create repositories

6. จะเห็นว่า มีให้เราเลือกเยอะแยะมากมาย ว่าจะ create repositories ประเภทไหนกันบ้าง ..

Select Recipe

ในที่นี้ ผมจะเลือกเป็น docker (hosted) เพื่อเอาไว้เก็บ private docker images ที่เอาไว้ใช้กันเองภายในองค์กร หน่วยงาน แทน public docker repository พวก docker hub ..

7. เลือก Create repository: docker (hosted) ใส่ค่าต่างๆ ประมาณนี้

Name: docker-private
HTTP: 5001 (Port 5001 จะเอาไว้ใช้ docker push)

Create repository: docker (hosted)

8. ต่อมาเลือก Create repository: docker (proxy) ใส่ค่าต่างๆ ประมาณนี้

Name: docker-hub
Remote storage: https://registry-1.docker.io
Docker Index: Use Docker Hub

Create repository: docker (proxy)

9. จากนั้นเลือก Create repository: docker (group) เพื่อรวม docker (hosted) และ docker (proxy) เข้าด้วยกัน ใส่ค่าต่างๆ ประมาณนี้

Name: docker-group
HTTP: 5000 (Port 5000 จะเอาไว้ใช้ docker pull)

Create repository: docker (group)

ตรงด้านล่าง ในส่วนของ Group

Member repositories: ให้คลิกเลือก docker-private และ docker-hub มาอยู่ในส่วนของ Members

Member repositories

*** เพิ่มเติม ***

สำหรับ docker repository ที่ URL ไม่มี SSL (https) เราต้องทำการ set เพิ่มเติม ในส่วนของ Docker Desktop ให้รองรับ insecure-registries โดยไปที่ Preferences > Docker Engine จากนั้น เพิ่มส่วนนี้ลงไป ..

"insecure-registries": ["IP:5000", "IP:5001"],

โดย IP ก็คือ IP ของ Server เรา หรือถ้าเป็น domain ก็ใส่ ชื่อ domain ลงไป

insecure-registries

ในกรณีที่เรา ต้องการ ให้ docker pull ได้แบบ anonymous ไม่ต้องมีการ login
ให้มาติ๊กที่ Allow anonymous docker pull: ในส่วนของ docker-group ครับ

Allow anonymous docker pull:

จากนั้น ให้ไปที่ Realms เลือก Docker Bearer Token Realm เป็น Active

Docker Bearer Token Realm

จากนั้นไปที่ Anonymous Access ติ๊ก Allow anonymous users to access the server ในส่วนของ Realm: เลือก Docker Bearer Token Realm

Anonymous Access

มาถึงวิธีการทดสอบครับ

ให้เราลอง ทดสอบง่ายๆ ประมาณนี้

# Docker Login
docker login http://IP:5000
docker login http://IP:5001
# Docker Pull
docker pull IP:5000/nginx
# Docker Build
docker build -t IP:5000/demo-app .
# Docker Tag
docker tag IP:5000/demo-app IP:5001/demo-app
# Docker Push
docker push IP:5001/demo-app 
# Docker Run
docker run -p 5000:5000 IP:5000/demo-app 

เพียงเท่านี้ เราก็จะได้ docker repository ของเราเองมาใช้แล้วครับ 🙂

แล้วพบกับ การแนะนำ tools ต่างๆ ที่จำเป็น และมีประโยชน์ สำหรับ DevOps (CI/CD) ในตอนต่อไปเร็วๆ นี้ครับ ..

ทดสอบการใช้งาน OpenShift 4.2 (OCP4)

OCP4 (OpenShift 4.2)

สวัสดีครับ หลังจากที่ทดลองใช้งาน OpenShift 4.2 มาเดือนกว่าๆ ตั้งแต่เริ่มต้น Prepair Architecture
และร่วมกับ Vendor จากทาง Red Hat (MFEC) ทำการ Install ตลอดจนการแก้ไข จนเริ่มต้นใช้งานได้
เลยจะมาเขียนสรุปไว้เป็นความคิดเห็นสำหรับผู้ที่สนใจ จะใช้งานตัว OpenShift Container Platform (OCP4)

สำหรับตัว OpenShift 4.2 มีอะไรใหม่ๆ ออกมาเพิ่มเติมจาก 3.xx เยอะมาก อ่านรายละเอียดได้ที่
https://blog.openshift.com/introducing-red-hat-openshift-4-2-developers-get-an-expanded-and-improved-toolbox/

ในความคิดเห็นส่วนตัว สำหรับผม ที่ได้ลองเล่น ลองผิดลองถูกมาบ้าง ขอแบ่งเป็นข้อๆ ดังนี้

ข้อดี
– เป็น Enterprise Container Platform สำหรับ On-Premise ที่มี Support จาก Red Hat
– ใช้งานง่าย มี Template สำหรับหลายๆ Language ยอดนิยม, Database ที่เป็น Open Source และ CI/CD Tools
– มี Web Console ที่มี UI ใช้งานได้ง่าย แบ่งเป็น 2 Level คือ Developer/Admin
– มี CLI “oc” ที่ใกล้เคียงกับ “kubectl” ทำให้ใช้งานได้สะดวกสำหรับ คนที่ใช้ k8s มาก่อน
– สามารถ build microservices ได้จากหลากหลายวิธี จาก git และ template ที่มีมาให้
– สามารถมันจัดการ route ระดับ ingress ได้ดีมาก เราสามาถสำหนด endpoint ที่ต้องการได้ (HAProxy)
– มี Topology ที่ทำให้เห็น รายละเอียด และความสัมพันธ์ ระดับ service ได้ชัดเจน และจัดการตรงนี้ได้เลย
– มี Service Mesh ที่ทำให้รู้รายละเอียด ระดับ traffic ของแต่ละ service (Istio, Kiali and Jaeger)
– มี Images registry build-in มาด้วยในตัว
– มี Cloud-native CI/CD with Pipelines (Tekton) หรือจะใช้ Jenkins ด้วยก็ได้
– มี Dashboard และ Monitoring ที่ละเอียดจาก Grafana + Prometheus
– การใช้งานง่าย เหมาะสำหรับผู้เริ่มต้นใช้งาน Container
– Documents ตัว OpenShift จาก Red Hat เอง ค่อนข้างละเอียด และดีมาก

ข้อเสีย
– ราคาสำหรับตัว Enterprise ค่อนข้างสูง
– การ Install ระบบค่อนข้างวุ่นวาย ต้องใช้ การ config DNS และ LB ในการ Install
– เนื่องจากเป็น CoreOS ทำให้ มี tools ต่างๆ ในการวิเคราะห์ปัญหา ติดมาด้วยน้อยมาก
– สำหรับคนที่เคยใช้ Docker หรือ Kubernetes (k8s) มาก่อน ก็ใช่ว่าจะใช้งานง่าย +___+
– ด้วยความที่เน้น เรื่อง security ทำให้ หลายๆ Docker Images ไม่สามารถใช้งานบน OCP4 ได้

สำหรับใครที่อยากทดสอบการใช้งาน ก็เข้าไป Download ตัว Red Hat CodeReady Containers (CRC)
มาทดลองเล่นดูก่อนก็ได้ครับ (เครื่องต้องสเปคสูงหน่อย)
https://developers.redhat.com/products/codeready-containers

ผมเองก็ยังมือใหม่สำหรับ OpenShift 4.2 แต่แนวโน้ม บริษัทขนาดใหญ่ จะไปทางนี้กันหมด
ศึกษาไว้ ก็ไม่เสียหาย ใครที่ทดลองใช้งาน แล้วติดปัญหายังไง หรือมีอะไรจะแนะนำ
ก็เข้ามาพูดคุยกันได้นะครับ LINE ID: pornpasok 🙂

DevOps CI/CD คืออะไร?

CICD Flow

เนื่องในโอกาส ที่มาเริ่มงานใหม่ ด้าน Banking Technology (FinTech) ได้ครบ 1 เดือน ในส่วนของ DevOps เลยจะมาเขียนเล่าว่า การทำงานของ DevOps มีอะไรบ้าง CI/CD คืออะไร? ทำไมสมัยนี้ ถึงเป็นคำที่นิยมใช้กัน ในสายงาน software developer ..

DevOps จริงๆ แล้วเป็นคำใหม่ ที่เอาคำว่า Developer กับ Operator มารวมกัน สมัยก่อน Developer เป็นคนพัฒนา code แต่ไม่มีสิทธิ deploy code ขึ้นใช้งานเอง ต้องมีทีม Operator มาทำการ deploy ให้อีกทีม ซึ่งทั้ง 2 ทีมนี้เป็นคนละทีมกัน ทำให้การทำงานยุ่งยาก เกิดความผิดพลาด และใช้เวลานาน ในการ deploy แต่ละครั้ง ..

CICD

CI/CD (Continuous Integration, Continuous Delivery) เป็นกระบวนการในการทำงาน ตั้งแต่การ Plan -> Code -> Build -> Test -> Release -> Deploy -> Operate -> Monitor หรือบางทีเรียกสั้นๆ ว่า Pipeline ซึ่งสมัยนี้ ก็มี tools ต่างๆ ที่ทำหน้าที่พวกนี้ เยอะมากทั้ง On-Premise และ On-Cloud ที่เรารู้จักกันดี ก็น่าจะเป็น Jenkins ที่เข้ามามีบทบาทมาก ในการทำ CICD ..

ขอบเขตของการทำงาน ของ DevOps แต่ละที่เท่าที่ผมได้เคยลงไปสัมผัส จะไม่เหมือนกัน ขึ้นอยู่ว่า scope ที่ทำได้ มีระดับไหน บางที่ ก็คือทำตั้งแต่ต้นน้ำ ยันปลายน้ำ คือตั้งแต่วางแผน สร้าง Infrastructure เอง ทำ ENV ให้ Dev ใช้ เขียน Pipeline ตลอดจน ทำ Load Test, Performance Test, Security Test และระบบ Monitor & Alert เองทั้งหมด แบบนี้ก็ดีตรงที่จะรู้และเข้าใจ ในแต่ละส่วนอย่างดี ทำให้งานออกมามีประสิทธิภาพ ควบคุมได้ แต่ถ้ามี หลายๆ Project ก็คงทำแบบนี้ไม่ไหว ..

บางที่ DevOps จะมีหน้าที่แค่ทำระบบให้ Dev มาใช้งาน แต่จะไม่มีสิทธิ ในการทำอย่างอื่นเอง แบบด้านบน แบบนี้ ก็จะทำให้ ควบคุมอะไรไม่ได้ทั้งหมด แต่ถ้ามีหลายๆ Project ก็จะรองรับการทำงาน ได้เต็มที่ ..

สำหรับแนวคิด และ Tools ในการทำงานแบบ DevOps (CI/CD) ไม่มีแบบไหนผิด แบบไหนถูก ขึ้นอยู่กับการเอามาประยุกต์ใช้งาน ให้เหมาะสมกับงานของเรา องค์กรของเรา เพื่อทำให้งาน เกิดประสิทธิภาพสูงสุด ตอบโจทย์ผู้ใช้งาน product ของเราให้ดีที่สุด .. และที่สำคัญ ต้อง Monitor ได้ ต้องมี Dashboard เอาไว้ Tracking Metric ต่างๆ ได้ ..

สำหรับใครที่กำลังหางาน DevOps สมัครกันเข้ามาได้ครับ รับรองว่า งานท้าทาย สนุก แน่นอนครับ 🙂
https://th.jobsdb.com/th/th/job/devops-engineer-300003001969662