สัปดาห์นี้มาช้านิดนึง ไปลองทำ Fun-Ex มา 55 หัวข้อประมาณนี้
1 .DevOps
- Why DevOps
Flow เดิม Waterfall ทำเสร็จ กว่าจะ Deploy อีกนาน โดยอาจจะให้ Change Approval Board (CAB) อนุมัติ ก่อนให้ทีม Operation ทำงาน กว่าจะแก้ได้ช้า และมีปัญหาเรื่อง Enviroment
DevOps มีคน Idea มาจากฝั่ง Ops ตอนปี 2006-2007 มีคำถาม Migrate ยังแล้วจะรู้ว่าใช้ได้ไหม ทำทีละส่วนและเทส + แนวคิด Agile เกิด #DevOps ปี 2009 โดยมี 3 มุม
- People - Developer + Operation ทำด้วยกันองค์กร ทำให้เกิด
- Collective Ownership
- ลด Silo
- เพือการ Sync + Communication - Process
- Iterative + Feedback ตอนนี้ Agile
- MVP Product ได้ Feedback แล้วมาปรับ
- Tech Continuous Integration / Continuous Delivery / Continuous Deployment / Monitoring + Observability - Tools - เครื่องมือมาช่วย People /Process ถ้าสายนี้จะมี CNCF Landscape ในมุมต่างๆ
- CAMS และ CALMS
mindset อะไรที่เสริมให้เกิด DevOps
- Culture - เรื่องของจนให้ทำงานร่วมกัน
- Automation - ลดงานมือ อย่างแนวคิด Continuous Integration / Continuous Delivery / Continuous Deployment / Monitoring + OBserability
- Metric - เห็นว่าตอนนี้ระบบเป็นยังไง มันมี 3 Pillar Obserability
- Sharing - KM + เสริม idea
นอกจากตัว CAMS พี่ปุ้ยมีแนะนำอีกตัว CALMS ซึ่งจะเพิ่มในส่วนของ L ขึ้นมา โดยคุณ Jez Humble นั้น ซึ่ง L คือ
- Lean - จัดการพวก waste ทำให้กระบวนการของเรามันกระชับขึ้น
Ref: CALMS Framework | Atlassian
- 4 Keys Metric (Dora Metric)
- Lead time from commit to change - commit มันบิ้ว แล้ว Deploy ต้องรอนานแต่ไหน
- Deployment frequency - Deploy บ่อยได้ขนาดไหน รองรับ Change
- Change failure rate -แก้ไปพังบ่อยไหม พังซ้ำไหม
- Mean time to recovery - พังไปแล้ว ดับไฟยังไงถอยยังไง
Ref: DORA Metrics: Measuring What Really Matters About Your Software Delivery | Sourced Group
- DevOps Benefit
- Speed
- Rapid Delivery
- Reliability (แก้อะไรแล้วมั่นใจ ระบบไม่พัง)
- Scale
- Improved Collaboration - คุยกัน Sync / share km
- Security - sync กัน ทำตาม policy ได้ แล้วตอนนี้ Shift อีก DevSecOps
- 12 Factor
//เหมือนเคยเขียน เดี๋ยวค่อยไปรวม Blog
- Codebase - มีการ Track ได้ ปกติตอนนี้ใช้พวก Git + Deploy ได้บ่อย
- Dependencies - กำหนดแบบ Fixed Ver และแยกสำหรับ Dev/Prod อันนี้เพิ่งรู้แยก Env
- Config - จัดให้อยู่ตาม ENV จะได้ยัดค่าง่ายๆ
- Backing Services - s attached resources อย่างให้มี Coupling มากไป เช่น เอาจะเปลี่ยนอะไร แก้ของ Config อย่าง DB ใส่ URL + Protocal ได้เลย เป็นต้น
- Build, Release, Run - แยก Stage ให้ชั้นแจก
- Processes - Stateless for scale
- Port Binding - แยก Port การใช้งาน
- Concurrency - เสริมจาก 6 ทำให้ Scale ได้ง่่าย เกิด แก่เจ็บ ตายเป็นวัฏจักร
- Disposability- fast startup + Graceful Shutdown
- Dev/Prod Parity- แยก ENV ให้ใกล้เคียง ลดปัญหาตอน Deploy Container มาช่วยตรงนี้
- Logs- Event Stream ควรเป็น Standard IO ให้ตัวอื่นมาอ่าน เช่น Fluentd
- Admin Process - เพิ่มการ Initial ของ Admin ให้อยู่ใน App เลย
2. Containerized Application
- Docker / Docker Compose
สำหรับ Docker / Docker Compose ของ Ref ไปอีก Blog นะ
Docker benefit
- Standardization & Efficiently Management เหมือนตู้ Container ยกไปทั้งชุด
- Speed & Agility
- Security สิ่งที่ทำข้างในจะไม่กระทบข้างนอก หมายถึงสิทธิของ user ข้างใน
- Cost Optimization ขึ้นได้ไว้ และถูก จากเดิมใช้ VM มีตัวช่วยจาก
- namespace - linux kernel เอาไว้ทด แยกพื้นที่การทำงานออกจากกัน userspace
- cgroup - เอาไว้คตุมการใช้งาน namespace เช่น การใช resource cpu mem
- Docker Compose - Test Sandbox
อันนี้เรียกว่าเป็นเทคนิคใหม่ และกัน ส่วนตัวไม่เคยใช้ท่านี้ ส่วนตัวเอาสร้าง Env แล้วยิงจาก Tools ข้างนอกอีกที เลยมาลองสักหน่อย Docker Compose - Test Sandbox Docker Compose ผูกกับ Dockerfile เพื่อให้มันสร้าง Environment สำหรับการทดสอบ และ Initial DB โดยที่มี 3 ส่วน
- System Under Test - Dockerfile
FROM golang:1.22.1-alpine3.19 AS build WORKDIR /app COPY . ./ RUN go mod download RUN go build -o /bin/app FROM alpine:3.19.1 COPY --from=build /bin/app /bin EXPOSE 1323 RUN adduser -D -u 2024 appuser USER appuser CMD [ "/bin/app" ]
- Integration Test - เอามา Run Test Dockerfile.test
FROM golang:1.22.1-alpine3.19 # Set working directory WORKDIR /go/src/target EXPOSE 1323 # Run tests CMD CGO_ENABLED=0 go test -v --tags=integration ./...
- Dependency ต่างๆ พวก Database
- Full Compose File
version: '3' networks: integration-test: driver: bridge services: walletapi_tests: build: context: . dockerfile: ./Dockerfile.test volumes: - .:/go/src/target depends_on: - walletapi networks: - integration-test env_file: - ./test.env walletapi: build: context: . dockerfile: Dockerfile ports: - "1323:1323" volumes: - .:/app depends_on: db: condition: service_healthy env_file: - ./test.env networks: - integration-test db: image: postgres:16.0 environment: POSTGRES_DB: wallet POSTGRES_USER: root POSTGRES_PASSWORD: password volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "5432:5432" networks: - integration-test healthcheck: test: ["CMD-SHELL", "pg_isready"]
- Command
//Setup and Run Test docker compose -f docker-compose-integration-test.yaml up --build --abort-on-container-exit --exit-code-from walletapi_tests //Tear Down docker compose -f docker-compose-integration-test.yaml down
3. Infrastructure as a Code (IaC)
- IaC คือ อะไร
- IaC - Infrastructure as a Code เอาไว้สร้าง คุม Stage Create / Change / Destroy
เอามา สร้าง Infra พอเป็น Text ก็ทำ Versioning - IaC มี 2 กลุ่ม
- Configuration Management ลง SW ใน Infra (VM) ที่มี Chef / Puppet / Ansible
- Infrastructure Orchestration - สร้าง Infra (VM / Container) Cloud Formation/Terraform / K8S
- Before IaC
โจทย์ ถ้าต้องการลง Nginx บน Ubuntu
Without IaC - กดมือ สร้าง VM (EC2) โดยดึง image จาก AMI จะเอา ubuntu เพียวๆ หรือ ubuntu ที่ pack Nginx
With IaC เขียน Declarative File โดยใช้ Terraform (มันต่อกับ Cloud ได้หลายค่าย) โดย
- กำหนด Provider ใช้ของ Cloud ค่ายไหน + Resource File กำหนด State ของ Service ต่างๆ เช่น
- VM (EC2) ว่าจะให้มี Spec อะไร เอา image ตัวไหนมาลง
- VNET เฮ้ย VPC มี subnet อะไร
- security group - filter port ไหน
เป็นต้น - Command ที่เกี่ยวข้อง
teraform init teraform plan #ลองดูว่า IaC ถ้า Execte จริงสำเร็จไหม teraform apply #ลุยจริง เสียเงินจริง
ใน VDO จะอิงจาก AWS จะต้องมี aws account + aws cli + Terraform แล้ว Setup Sonor Community (AMI ของ Bitnami) //ผมดองของ Skooldio 555 ซื้อมาดูอันแรกไป 30% เอง
นอกจากนี้ Terraform มันมี Version Cloud ด้วย Terraform.io by HashiCorp โดย Pattern ใช้ประมาณนี้
- GitHub คุม Flow โดย GitHub Action
- Terraform cloud มาคุม State //แอบสงสัย มันสั่งเองได้ โดยไม่ผ่าน GitHub Action หรือ ถ้าประหยัด ใช้ GitHub Action สร้าง VM ลง Terraform
- ปลายทางอย่าง Cloud มีให้ SECRET กับ Terraform มันจะได้เข้าไปสั่งได้
4. GitOps
- GitOps
- Declarative -> IaC
- Versioned and Immutable -> IaC มันเป็น Code นี่ เก็บได้
- Pulled Automatically มีคนมาปรับ State ให้อีกถึง IaC คนในที่นี้ ArgoCD / terraform.io มีการทำ pull model
เมือก่อนเราอาจจะให้ Jenkins มาเข้าจัดการ ซึ่งทำให้ตัว Jenkins Overload มาไป และมีความเสี่ยงด้าน Security - Continuously Reconciled -> ปรับ Deployment ตาม IaC
State ที่ดูแลเป็นอะไรได้บ้าง Resource ที่อยู่ใน Cloud / K8S
- K8S
- Container Orchestration + Scale แก้ข้อจำกัดของ docker / docker compose
- แยก Section ของระบบตาม namespace , service . deployment, pod
Sample AWS LB > EKS (K8S)
- ArgoCD
Tools ทำ Continuous Delivery มัน Reconciled State ตาม Declarative ที่ประกาศไว้ใน Git pull base / web hook ก็มี (ไม่เคยลองเล่น) และตัว Argo มี Tools อื่นๆ Argo Workflow
- Related Blog K8S+GitOps
- The Cloud Camp Week#06 (K8S Part1:Overview)
- The Cloud Camp Week#07 (K8S Part2:K8S Object)
- The Cloud Camp Week#08 (K8S Part3: Store Data)
- The Cloud Camp Week#09 (K8S Part4: Resource/HealthCheck/Scale/Scheduler)
- The Cloud Camp Week#11 (ฺGitOps)
5. Continuous Integration / Delivery / Deployment (CI/CD)
- Continuous Integration
- เดิม เอาชอบเอา Code มาเทรวมกันตู้มเดียว แล้วก็พัง
- แนวทาง ตอนนี้ พยายามเอาเข้าที่ละนิด (Small Integration) + ทำ Test
- ทำให้พบปัญหาได้เร็ว
- ลดความเสี่ยงตอน เทรวม Code
- ลดเวลา Automate เพิ่ม Deploy ให้ถี่ขึ้น
CI Pipeline - ขั้นตอนการทำงาน มี Action ต่างๆ เช่น Build Test จาก Event ต่างๆ เช่น Push Merge บราๆ
- Continuous Delivery
- ทำ Software fast feedback การ control business decision แต่ต้องคุยกระบวนการให้เรียบร้อยนะ
- fast release + rollback พอ Build เสร็จก็ deploy ในทุกๆ Environment นะ เพื่อมาช่วยให้ Business ตัดสินใจเช่น UAT / SIT / Release Prod (Manual)
- Continuous Deployment
Continuous Deployment = Continuous Integration + Continuous Delivery
รายละเอียดเต็มลองดูเพิ่มจาก The Cloud Camp Week#10 (CI/CD – GitHub Action)
6. IaC Tear Down
เอาขึ้นไปแล้ว ตอนถอยควรทำตามลำดับ จะได้ไม่มี Resource ค้าง และกินเงินเราไป โดยลำดับอีกจาก Demo
- ArgoCD - Delete Deployment
- Terraform - Destroy Plan > Approve > รอ Apply
- Cloud
ถ้าใช้ Cloud ดู Cost และใน K8S ผมเอาท่านี้
kubectl delete -f <your_file>.yaml //น่าจะหมดมั้ง 555
ดูหัวข้อแล้ว แอบคล้ายกับ Cloud Camp ตอนนี้เปิดรุ่น 2 แล้วเผื่อไปสมัครครับ Jumpbox - 📣สิ้นสุดการรอคอย เรากลับมาอีกครั้ง ✨✨The Cloud Camp... | Facebook
และมี Fun-Exให้ลองทำ ลุยครับ pingkunga/go-fun-exercise-api (github.com) มีความรู้สึกอย่างนึง
- แก้อะไรแล้วต้องทำ Test ไม่แน่ใจว่าตัวภาษามา lock หรือป่าว ตอนแรกไปทำ API ให้จบก่อน Test แรก Run ไม่ได้เลย ต้องมาไล่ Implement ให้ครบ
- Pattern ของ Integration Test สอนไป 2 แบบ อันนี้ผม ทักไปถาม ใน Discord และ เดวรอทีมงานตอบ ฮ่าๆ
- พวกการทำ Transaction เหมือนยังไม่ได้สอน ลองหาๆดู ทาง Go เองมีเหมือนกัน Executing transactions - The Go Programming Language
จดจาก Sharing Section ผมมีไปแขร์ไปพูดไปเร็วเลย แต่มี Idea จากหลายคน
- go autoload env
- custom error handle //check ซ่อน error save exception
- go get squirrel sql generator
หนังสือแนะนำ
- The Phoenix Project- บอกเล่าความจริงตอนทำ Project แล้วแก้ไง ทำไม DevOps เห็นใน
Chat จะ The Unicorn Project - The DevOps Handbook - Engineering Practice / Automation
- Domain Driven Design เล่มลิง แน่เลย //มา Revise ใช้
- 100 Go Mistakes and How to Avoid Them (manning.com)
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.