บันทึกการย้าย cscms.me ภาคจบการศึกษา

GitOps 20 เม.ย. 2023

และในที่สุดวันนี้ก็มาถึง เป็นเวลาที่น่าดีใจว่าผมได้จบการศึกษาจาก SIT KMUTT แล้วในปี 2023 นี้ แต่เรื่องการเรียนจบก็ไม่ได้เป็นเรื่องน่ายินดีซะทีเดียว ช่วงเวลา 3-4 ปีที่ดูแล infrastructure ของ cscms.me มา ผมก็จะโดนถามทุกปีว่า

ปีหน้าจะยังใช้ได้อยู่มั้ย

จุดเริ่มต้น

ย้อนความกันเล็กน้อย cscms.me เกิดจากการเป็น grader สำหรับช่วยให้เพื่อนๆ ได้ฝึกทำโจทย์ในช่วงที่ทุกคนต้องเรียนวิชา CSC102 Introduction to computer programming และมันก็ถูกใช้ต่อๆ ไปเรื่อยๆ ในทุกๆปี ทั้งโดยรุ่นน้องที่เข้ามาใหม่และรุ่นน้องค่าย สอวน คอม โดยช่วงปีแรกๆ ผมได้ GCP credit จากพี่พล Patipol Saechan (กราบขอบคุณที่สนับสนุน cscms.me และหลายๆโปรเจคของ CS20 🙏) โดย cscms.me ก็รันอยู่บน Compute Engine ตัวนึง

ในปีถัดๆมา GCP credit ก็จะหมดแล้ว ก็ต้องหาวิธีย้ายออกจาก GCP โดยทางเลือกที่ผมเลือกก็คือ Azure Kubernetes Service เพราะผมได้รับ Azure Credit $150 ต่อเดือน (ย้ายไปตามของฟรี) จากการที่อยู่ในโครงการ Microsoft Learn Student Ambassadors และที่เลือก Kubernetes เพราะว่า...ผมรัก K8S ครับ!! จึงเกิดเป็น Blog นี้ ที่ผมได้ระบายความยากลำบากในการทำ migration แต่ในที่สุด cscms.me ที่รันอยู่บน AKS ก็ใช้งานได้มา 2 ปี

บันทึกการย้าย Service ของ cscms.me
ผมจดเขียนบันทึกนี้เอาไว้ เพื่อระลึกถึงความยากลำบากที่ได้ประสบพบเจอมา จากการย้าย service ต่างๆ ขึ้นไปรันอยู่บน Kubernetes Cluster

ปัญหาที่เจอกับ AKS

ก่อนจะไปถึงว่าผมมีหาทางให้ cscms.me รันต่อไปได้ยังไง ผมขอระบายแบบสั้นๆ ถึงปัญหาที่ได้เจอกับ AKS ก่อน

  • Log Analytics Workspace โคตรแพง Subscription โดน disabled ไปหลายรอบมากเพราะว่า cost มันเกิน limit $150
  • หลังๆ มีปัญหาล่มบ่อย
  • Node pool ใช้งานไม่ได้ เลยจะลบ pool ทิ้ง แต่มันไม่ให้ลบเพราะมี pool เดียว แต่ก็เพิ่ม pool ใหม่ไม่ได้ ก็เลยทำอะไรไม่ได้อยู่ซักพัก
  • Upgrade k8s version แล้ว node ไม่ ready ซะที
  • มีต้องแก้ config ให้ไปใช้ CSI เพราะ K8S version ใหม่ (อันนี้ปัญหาจากตัวผมเอง)
  • มี step ในการทำอะไรที่แปลก ผม start cluster ไม่สำเร็จเพราะ log analytics หายไป (ผมลบทิ้งไปเอง มันกินตัง) พอจะสร้าง log analytics ใหม่ ก็ไม่สำเร็จ เพราะ cluster ไม่ได้ทำงานอยู่ (อ่าว) ก็เลยต้อง start cluster ให้มันขึ้นว่า running (แต่ node ไม่ ready นะ) แล้วสร้าง log analytics ตาม

มันต้องมีอะไรผิดพลาดตรงไหนแน่ๆ

จริงๆ แล้ว section นี้ผมไม่ได้ตั้งใจจะเขียน แต่พอดีว่าเจอปัญหาบน AKS ที่อยากจะเล่า (บ่น)

เรื่องมันเกิดจากว่า Azure Subscription ของผมโดน disable เนื่องจากใช้เกิน limit $150 (โทษ Log Analytics Workspace) หลังจาก Subscription ได้ re-enable ใหม่แล้ว ผมก็จะเปิด cluster ขึ้นมาใหม่ แต่มันติดปัญหาอย่างงี้ครับ

node pool กำลังอัพเดทอยู่ อ่อๆ เคๆ รอด้าย

Node pool ของผมอยู่ในสถานะ updating มานานมากๆ พอผมเข้าไปดูใน pool นั้นก็เจอว่า มันไม่มี node รันอยู่เลย

เอ๊า node หายไปไหน

สัญชาตญาณผมก็บอกให้กด Scale node pool สิ จะได้มี node พอกดเข้าไปเพื่อจะ scale node เพิ่มก็เจอ Azure ทำปางห้ามญาติบอกว่า คุณ scale node เพิ่มไม่ได้นะ เพราะ node pool กำลังอัพเกรดอยู่

Node pool กำลัง update แต่ node pool ผมมี 0 node นะ!!

พอเจอแบบนี้ผมก็ โอเค งั้นเดี๋ยวไปสร้าง node pool ใหม่ก็ได้ แล้วค่อยลบอันนี้ทิ้ง พอกดออกมาหน้า node pool แล้วกด add node pool ผมก็เจอปางห้ามญาติอีกครั้ง

อ่าว เพิ่ม node pool ก็ไม่ได้

โอเค งั้นท่าไม้ตาย stop cluster แล้วเปิดขึ้นมาใหม่ เผื่อมันจะหาย และแน่นอนว่าพอผมกด stop cluster ผมก็เจอกับปางห้ามญาติเป็นครั้งที่ 3

นั้นแหละครับ ผมหมดหนทางละ เป็นการลาจาก Azure ที่อยู่มา 2 ปี แบบที่ไม่สวยงามเลย 🥲 ใครอยากฟังผมบ่นตอนเจอปัญหานี้ก็ดูได้ที่ IG ของผมครับ

อะไรของท่านวะครับ AKS!!w

ยังไงต่อกับ cscms.me

กลับเข้าสู่เนื้อหาหลักกันครับ เมื่อผมจบการศึกษาแล้ว Azure Credit จากโครงการ Microsoft Learn Student Ambassadors ก็จะหายไป (มันเป็นโครงการสำหรับนักศึกษาอะนะ) ดังนั้นผมก็ต้องหาที่อยู่ให้ cscms.me ต่อไป โดยแน่นอนว่าต้องจ่ายเงินเอง โดยผมมี requirement หลักๆ ตามนี้

  • Location ที่สิงคโปรหรือใกล้กว่า
  • Workload จะรันบน Kubernetes
  • 2vCPU และ 8GB Ram ขึ้นไป (เพราะตอนอยู่ Azure ใช้ spec นี้)
  • ราคาถูกที่สุดดดดดดดดด

จาก requirement ตามนี้ผมก็เริ่มตามหา Cloud และ VPS เจ้าต่างๆ โดยแน่นอนว่าสำหรับ Cloud เจ้าดังๆ โดนตัดทิ้งหมดเพราะว่า สเปคเครื่องประมาณนี้ต้องจ่ายเดือนละประมาณเกือบ $100 ซึ่งผมไม่ไหวแน่ๆ จนเริ่มได้ทางออกว่า เราไม่จำเป็นต้องเอา Kubernetes Managed Service ก็ได้ เอาเป็น VM เปล่าๆ แล้วมา self-hosted K8S เอง เพราะยังไงก็ใช้ node เดียวอยู่แล้ว ห้าๆๆๆ

ดังนั้นเพื่อที่จะ PoC กับความคิดนี้ ผมก็ลองสร้าง VM บน Azure และลอง set up K8S cluster ขึ้นมาเอง ซึ่งลองมาหลายแบบ หลาย distributions สุดท้ายก็มาจบกับ tools ประมาณนี้ครับ

ซึ่ง Traefik, SealedSecret และ ArgoCD (ลองเล่น ArgoCD) เป็น tools ที่ผมเคยใช้ตอนทำ senior project อยู่แล้ว และประทับใจมากๆ เลยเลือกมาใช้ต่อ ส่วน K3S และ Rancher ก็ลองผิดลองถูกอยู่นาน จนได้ config ที่ Stable

ราคาถูกจนน่าตกใจ

ส่วน VM ผมก็ไปใช้ของ SSDNodes ที่ราคาถูกม๊ากกกก ซึ่งรีวิวบางที่ก็บอกไม่ดี แต่ผมก็เชื่อใจน้อง BSthun ที่เคยใช้มาก่อน ก็เลยกดซื้อเครื่อง 6vCPU + 24GB Ram มาในราคาประมาณ 7000  บาท / 3 ปี ซึ่งก็ต้องรอดูต่อไปในระยะยาว แต่ที่ผ่านมาง ผมก็ไม่เจอปัญหาอะไรนะ ถ้าใครสนใจก็ฝาก referal ด้วยนะครับบ กดเลยยย ถือว่าช่วยค่า server ผม

อะไรย้ายไป Serverless ได้ก็ย้ายไปก่อน

ถ้าใครอ่าน บันทึกการย้าย Service ของ cscms.me มาก่อนก็จะรู้ว่า cscms.me ไม่ได้มีแต่ grader อย่างเดียว มันมี service อื่นๆ อีกด้วย

  • blog.sethanantp.com อันนี้ที่ทุกคนกำลังอ่านอยู่
  • aka.cscms.me บริการย่อ URL
  • tmp.cscms.me ที่เปลี่ยนเป็น storage.cscms.me ไว้ฝากไฟล์ชั่วคราว
  • timetable.cscms.me ดูตารางเรียนของ CS@SIT
  • scroll.cscms.me สำหรับคนที่อยาก scroll mouse ยาวๆ
  • intern.cscms.me เว็บรวบรวมที่ฝึกงานที่สร้างมาแบบด่วนๆ

พอใกล้เรียนจบผมก็พยายามหาทางย้าย service บางตัวไปอยู่ใน serverless ที่ฟรี ให้มากที่สุดเท่าที่จะทำได้ และ service ที่ผมย้ายออกไปก็ได้แก่

  • aka.cscms.me ย้ายไป Cloudflare Worker และก็เก็บข้อมูลใน Cloudflare KV เลย อันนี้เรียกได้ว่า rewrite backend ใหม่สำหรับการย้ายขึ้น Cloudflare เลย (🤟Cloudflare)
  • scroll.cscms.me ย้ายไปอยู่บน Vercel
  • timetable.cscms.me และ intern.cscms.me อยากจะย้ายออกไป serverless แต่ยังไม่ได้ทำ ก็รันบน k8s ไปก่อน

ส่วนอันอื่นๆ มันต้องมี persistent storage จึงให้มันอยู่ใน Kubernetes นี่แหละ

Secret Management ใน K8S กับ options ล้านแปด

การจัดการ Secret ใน Kubernetes นั้นมีเครื่องมือต่างๆ ให้เราเลือกใช้เยอะม๊ากก ไม่ว่าจะเป็น secret manager ต่างๆ อย่างเช่นพวก Hashicorp Vault, Azure Key Vault หรือ KMS ของ AWS และ GCP แต่เครื่องมือที่ผมเลือกก็คือ SealedSecrets ของ Bitnami Labs เหตุผลก็คือ อย่างแรก ผมไม่อยากเสียเงินค่า KMS ของ cloud service provider และอย่างที่สองก็คือมันตรงกับหลักการ GitOps ที่ผมเลือกใช้

GitOps คือการเก็บ config ไว้บน Git เพื่อที่เราจะได้ใช้ความสามารถของ Git มาจัดการ config ได้และทำให้ Git ของเราเป็น single source of truth (อ่านได้ที่ blog ของพี่ปุ๋ย)

เพื่อจะเก็บทุกอย่างไว้บน Git การใช้ SealedSecrets จึงตอบโจทย์ตรงนี้ เพราะมันจะไปดึง key จาก SealedSecrets ที่ deploy อยู่บน cluster ของเรา และ key ตัวนี้มันถูกสร้างขึ้นมาใหม่ตอนเรา deploy มันลงไปใน cluster ทำให้มีแค่ cluster ของเราที่สามารถอ่าน secret ได้  (ไว้ผมจะมาอธิบายการทำงานของ SealedSecrets ในบทความอื่นละกันนะครับ)
นอกจากผมจะใช้ SealedSecrets เพื่อให้ผมสามารถเก็บ secret ใน public git repository ได้อย่างปลอดภัยแล้ว ผมอยากได้ secret ที่เข้ารหัสแล้วเก็บไว้ใน git อีกชุดนึง เนื่องจากถ้า cluster หรือ VM ของผมหายไป secret ที่ถูกเข้ารหัสโดย SealedSecrets ใน git repo ก็จะไม่สามารถถูกอ่านได้เลย และผมก็ต้องเสียเวลาทำ secret ขึ้นมาใหม่ ถ้าหากจะเอาไป deploy ที่อื่น ดังนั้นเครื่องมืออีกตัวที่ผมเลือกใช้ก็คือ sops

sops เป็นเครื่องมือในการเข้ารหัส secret (จริงๆ ไม่ใช่แค่ K8S secret แต่ YAML หรือ JSON อะไรก็ได้) โดยสามารถเลือก key ได้หลายแบบอย่างเช่น PGP, age, KMS จาก Cloud เจ้าต่างๆ เป็นต้น

ผมเลือกใช้ age ในการเข้ารหัส เพรามันดูง่ายดี แถม public/private key ก็ไม่ยาวด้วย ใช้งานง่ายมากๆ ผมก็แค่สร้าง key pair ของ age ขึ้นมา และสั่งให้ sops encrypt YAML ด้วย public key ของผม และก็เอาไปใส่ใน Git ได้เลย ส่วน private key ก็เก็บไว้ใน password manager ที่ผมใช้งานอยู่แล้ว (age สามารถสร้าง key จาก Yubico ได้ด้วยนะ)

จะ SSH เข้า VM ยังไงให้ปลอดภัย

เวลาเราได้ VM มา เราก็ต้อง SSH เพื่อเข้าไปใช้งาน ซึ่งตัวผมโดนโจมตีผ่านการ SSH มาหลายรอบ เช่นการที่โดน SSH เข้ามาที่ GCP Compute Engine และลง script ขุด  Bitcoin จนเครื่องโดนระงับ 🥲 ดังนั้นผมจึงให้ความสำคัญกับ SSH มาก โดยวิธีที่ผมใช้ก็คือการ block traffic ที่ port 22 ออกไปเลย โดยจะให้ request มาจาก localhost และ IP ของเครื่อง MacBook ของผมในวง VPN เท่านั้น ซึ่งผมได้ setup การเข้าถึง SSH ไว้ 2 แบบก็คือ

Cloudflare Tunnel & Access (Zero Trust)

Cloudflare Zero Trust มี feature ให้เราสามารถสร้าง tunnel เชื่อมต่อ service ของเรากับ network ของ Cloudflare ได้ โดยเราสามารถที่จะให้ traffic จาก Internet มาผ่าน Cloudflare และเข้าไปยัง service ที่รันอยู่ของเราได้ (เหมือน ngrok) โดยปกติแล้วผมจะใช้ Cloudflare Tunnel กับ server ที่ไม่มี Public IP เพื่อให้คนอื่นสามารถเข้าถึง service ที่รันอยู่ได้ แต่ในกรณีนี้ผมต้องการให้ SSH ผ่าน Cloudflare และค่อยมาที่ server เพื่อที่เราจะสามารถควบคุมการเข้าถึงโดยการใช้  Access โดยตัวนี้ก็เป็น feature นึงใน Cloudflare Zero Trust เช่นเดียวกัน เราสามารถตั้งได้ว่า domain นี้ ใครจะสามารถเข้าถึงได้บ้าง โดยการสร้าง Allow list อย่างเช่น

  • มี source IP อยู่ในช่วงนี้
  • มี email ตามที่ระบุไว้ (Cloudflare verify โดยการส่ง OTP ไปให้ที่ email นั้นแล้วให้กรอกรหัส)
ก่อนจะเข้าถึง endpoint ได้ต้องผ่านการ verify โดย Cloudflare ก่อน

ดังนั้นผมจึงสามารถควบคุมได้ว่าใครจะสามารถเข้าถึง SSH ของตัว server ผมได้ ถึงแม้ว่ามันจะ expose อยู่บน Internet ก็ตาม ถ้าใครสนใจก็ลองไปอ่านที่เว็บของ Cloudflare ได้ครับ (ใช้ฟรีด้วย 💖Cloudflare)

Zero Trust | Secure Your Hybrid Workforce
Secure any user accessing any application, on any device, in any location. Learn how to modernize security on your roadmap to Zero Trust.

VPN Tailscale

อีกหนึ่งวิธี classic ก็คือการ VPN เข้าไปที่ server แต่แน่นอนว่าผมค่อนข้างขี้เกียจ จึงไปใช้ managed service ซึ่งก็คือ Tailscale

Tailscale
Tailscale is a zero config VPN for building secure networks. Install on any device in minutes. Remote access from any network or physical location.

Tailscale ทำให้เรา setup VPN ได้ง่ายมากๆๆๆ แค่ install และ signin เข้าไปก็พอ เพียงแค่นี้เครื่องของเราก็สามารถคุยกันได้ผ่าน IP address ที่แสดงใน Tailscale โดยที่ไม่ต้อง manage หรือ config อะไรให้ยุ่งยากเลย ซึ่งอันนี้ก็ฟรีเช่นกัน (แค่ 1 user นะ ไม่เกิน 20 devices)

อันนี้ผมแนะนำคลิปจาก Linus Tech Tips ที่สอน setup Tailscale เพื่อจะใช้หลอก Netflix ว่าคนใช้อยู่ในบ้านเดียวกันครับ

Setup server ใหม่ ไม่ยาก ถ้าซ้อมมาก่อน

อย่างที่ผมบอกไปแล้วว่าก่อนที่จะตัดสินใจเช่า VM จาก SSDNodes และเริ่ม setup cluster ผมได้ซ้อมและเทสมากับ Azure VM แล้วว่า configuration ที่ควรจะเป็นต้องเป็นอย่างไร ต้องรัน command อะไรบ้าง และอะไรบ้างที่ใช้งานได้และอะไรที่ใช้งานไม่ได้ พอถึงเวลาที่ต้อง setup K3S และ service ต่างๆใน cluster ผมก็สามารถก๊อปวาง command ที่เคยลองแล้วว่ามันใช้ได้ อย่างรวดเร็ว ทำให้การ setup มันสบายมากๆ (แต่ช่วงตอนที่ลองทำก็เหนื่อยอยู่หลายอาทิตย์เหมือนกันนะ) ดังนั้นถ้าใครมีแผนจะทำอะไร แนะนำว่าให้หาที่ลองก่อน แล้วพอเราได้เจอกับปัญหาและหาทางแก้ไขแล้ว ค่อยมาทำการ setup จริงๆ จะช่วยลดระยะเวลาปวดหัวได้เยอะมากๆ

เมื่อทุกอย่างลงตัว ก็เรี่มเลอ

หลังจากผมได้ทดลองมาเป็นเดือน วันที่ 9 เมษา 2023 ผมก็สั่ง VM และจ่ายเงินให้ SSDNodes เป็นที่เรียบร้อย ในช่วง 3 ทุ่มของวันนั้น และแน่นอนว่าผมซ้อมมาเป็นอย่างดี ในคืนนั้นก่อนเที่ยงคืน ผมสามารถ setup K3S, Rancher, Traefik, ArgoCD, SealedSecret, และ AdGuard Home ได้เสร็จก่อนเที่ยงคืนด้วยซ้ำ โดย service และหน้า dashboard ต่างๆ ก็สามารถเข้าถึงได้จาก Internet อย่างไม่มีปัญหา และวันต่อมาก็เริ่มย้าย blog.sethanantp.com อันนี้ และก็ทำการลง monitoring ต่างๆ

เศร้าใจ

ทีนี้ปัญหาอยู่ที่ว่า เราจะย้าย onlinejudge วันไหนดี เพราะกลัวว่ามีคนทำโจทย์อยู่ แต่แล้วก็เหมือนฟ้าเป็นใจ Azure Subscription ผมถูกระงับ(อีกแล้ว)ในวันที่ 12 เมษา 2023 เนื่องจากยอดใช้งานไปชน limit ที่ $150 ทำให้ทุกอย่างหยุดทั้งหมด รวมไปถึง disk ที่ผมต้องเอา data ออกมาด้วย ผมเลยถือโอกาสนี้ในการย้าย onlinejudge มาที่ cluster ใหม่เลย โดยใช้ data ของวันที่ 3 เมษา 2023 ซึ่งเป็นอันที่ลอง export ออกมาเพื่อเทส จริงๆ ในช่วงวันที่ 3-12 มันก็มีคนทำโจทย์แหละ แต่ผมก็ใช้วิธีค่อย insert SQL ตามให้ไปทีหลัง ดังนั้น cscms.me onlinejudge จึงสามารถใช้งานได้ในวันที่ 12 เมษา 2023 โดยรันอยู่บน cluster ใหม่ ในขณะที่ cluster เก่าโดนระงับอยู่นั้นเอง

เพราะฉะนั้นผมก็เหลือ service สุดท้ายที่ต้องเอา data ออกมาก็คือ CSCMS Storage กับ CSCMS Intern ทางเดียวก็คือต้องรอหมดรอบ Azure Billing และค่อยไป export data ออกมาและเอาไปใส่ cluster ใหม่ ​ซึ่งก็ทำสำเร็จในวันที่ 19 เมษา 2023

ส่วน service อย่าง CSCMS Timetable ก็ย้ายมาได้เลย เพราะอันนี้เก็บ data เป็น JSON ใน Git อยู่แล้ว

สรุปแล้ว มันออกมาหน้าตาเป็นอย่างงี้นะ

ตอนนี้ cscms.me รันอยู่บน Kubernetes ที่ผม self-hosted เอง โดยใช้ K3S และลง Rancher เพื่อทำ cluster management (โคตรเปลือง resource มีอยู่ cluster เดียว cluster ก็มีแค่ node เดียว แต่อยากได้งะ 🥺) Rancher ก็จะมี dashboard สวยๆ ให้เราได้ดูภาพรวมของ cluster

Rancher Dashboard

Ingress สำหรับรับ request เข้ามาก็เป็น Traefik ซึ่งมี dashboard สวยๆ ให้ดู route ต่างๆเหมือนกัน

Traefik Dashboard

Workload ถูกจัดการด้วย ArgoCD และแน่นอนว่ามันก็มี dashboard ให้ดูอีกแล้ว ว่า applications ที่มันจัดการอยู่เป็นอย่างไรบ้าง (เป็นพวกบ้า dashbord)

ArgoCD Dashboard

และถ้าคุณคิดว่านั้นคือ dashboard ทั้งหมดแล้ว เรายังมีอีก!! ผมลง monitoring ผ่าน Rancher โดยมันก็คือ Prometheus กับ Grafana นี่แหละ ซึ่งทำให้ผมสามารถ monitoring ได้ละเอียดมากขึ้น นอกจากนี้ตัว Traefik ก็ expose metrict API ให้ Prometheus อีกด้วย เพราะฉะนั้นก็เลยได้ dashboard อีกมากมายมาดูเล่นๆ

Grafana
dashboard และพวกหน้า admin ถูกคั่นไว้ด้วย Basic Auth อีกที โดยการใช้ Traefik ทำ middleware
Secret ที่ถูก encrypt ด้วย sops (ขวา) และ SealedSecrets (ซ้าย)

Secret ภายใน cluster ถูกจัดการโดย SealedSecrets ซึ่งถูก encrypt และใส่ไว้ใน Git repo ส่วน Secret ที่เอาไว้ใช้ backup ในกรณีที่ cluster เป็นอะไรไป ก็ถูก encrypt ด้วย sops และก็อยู่ใน Git repo เช่นเดียวกัน

Configuration ที่ผมใช้สามารถเข้าไปดูได้ที่ GitHub Repo เลยนะครับ

GitHub - thetkpark/cscms-services-deployment at argocd
A bunch of YAML files for cscms Kubernetes cluster - GitHub - thetkpark/cscms-services-deployment at argocd

ปัญหาที่เจอหลังจากย้าย

CPU Throttle สูงมาก แม้จะไม่มีคนใช้ (มีผมคนเดียว)

อันนี้เป็นปัญหามาตั้งแต่ cscms.me อยู่บน AKS แล้วแหละ (มีปัญหามา 2 ปี) ก็คือ CPU Throttle พอย้ายมาผมเจอปัญหานี้มากกว่าเดิมอีก สุดท้ายก็ยังไม่รู้ว่าเป็นเพราะอะไร จนกระทั่งไปอ่านบทความจากทาง Lineman Wongnai ที่เซฟเอาไว้ โดนตัวปัญหาก็คือ CPU Limit นี่แหละ ที่ผมเพิ่งรู้ว่ามันทำงานแบบนี้ และพอเอาออก ปัญหา throttle ก็หายไปเลย แนะนำให้ลองอ่านดูครับ ผมรัก technical blog แบบนี้มากๆ

CPU Limit บน Kubernetes คือ สิ่งที่สร้างความปวดหัวให้กับ LINE MAN Wongnai
วันนี้ผมจะพาไปพบกับฟีเจอร์ของ Kubernetes ที่ทั้งน่าใช้ แล้วก็น่าปวดหัวมากชื่อว่า CPU Limit ที่สร้างความเจ็บปวดให้ LINE MAN Wongnai มากมาย

Stat ที่น่าสนใจของ cscms.me

  • มี users ทั้งหมด 503 users
  • โจทย์ 181 ข้อ
  • Submission ทั้งหมด 40,510 ครั้ง
  • โจทย์ที่คนทำเยอะที่สุดคือ CSC102 Quiz#1 2019 Mr.John Wick จำนวน 1546 submission
  • โจทย์ที่ percent ผ่านน้อยที่สุดคือ A+B Problem ผ่านแค่ 4.29% เท่านั้น
  • เมื่อก่อนมีโจทย์ระดับ High เพียงข้อเดียว และเมื่อมีคนทำได้ boyplus ก็ปรับมันลงเป็น Mid

กราบขอบคุณทุกคนที่ทำให้ cscms.me มีวันนี้

มาถึงจุดๆ นี้ก็ต้องขอบคุณเพื่อนๆ พี่ๆ น้องๆ ที่ใช้งาน cscms.me และ service อื่นๆ มาโดยตลอด ทั้งคนที่ "ใช้" จริงๆ และคนที่พยายามหาช่องโหว่ (ซึ่งมี)

ตลอดเวลาที่เป็นนักศึกษา cscms.me เป็น playground ให้ผมและเพื่อนๆ  service ต่างๆที่ทำงานอยู่ ถูกพัฒนาขึ้นเพราะการหาทำ เพราะการที่เราคิดว่าเราเป็น developer เราจะต้องพัฒนาอะไรสักอย่างมาเพื่อแก้ปัญหาที่เราเจอ(และต้องเล่นใหญ่!!) โดยผลของมันก็คือทุกคนได้พัฒนาทักษะมากมายที่สามารถเอาไปใช้ทำงานต่อไปได้

ผมหวังว่า cscms.me จะเป็นส่วนช่วยให้รุ่นน้องหลายๆ คน ได้ฝึกฝนทักษะ programming ต่อไปในอนาคต (อย่างน้อยๆ ก็ 3 ปีที่จ่ายค่า VM ไปแล้วอะนะ)

และสุดท้ายนี้ขอขอบคุณบุคคลเหล่านี้ที่ทำให้ cscms.me เกิดขึ้นมาและยังคงอยู่ต่อไปได้

  • Ponny035 สำหรับ GCP Credit จำนวนมาก
  • boyplus และ thanawat.bcr ที่ออกโจทย์เป็นร้อยข้อ และโปรเจคหาทำจำนวนมาก
  • GGolfz สำหรับโปรเจคหาทำต่างๆ
  • ขอบคุณชิงลี่และกุเรปปุ ที่ช่วยออกแบบหน้าเว็บให้
  • BSthun และ Mixko50 ที่ให้คำแนะนำและนำเสนอความหาทำแบบที่พี่ไม่เคยคิดได้ถึง
  • เพื่อนๆ CS20 ทุกคน สำหรับการใช้งาน cscms.me ตั้งแต่วันแรก
  • ขอบคุณพี่ๆ ที่เคยให้คำแนะนำหลายๆอย่าง
  • รุ่นน้องทุกคนที่ submit code กันอย่างหนักหน่วง
  • พี่ป๊อป ที่ยังไม่ block domain ของเราในมหาลัย
  • QingdaoU ที่สร้างและ open-source OnlineJudge

อนาคตของ cscms.me จะเป็นต่อไปอย่างไร โปรดติดตามในภาคต่อไป!!

พื้นที่ขายของ

เพิ่งได้รางวัลสาขา Customer-Focused จาก 2023 MongoDB APAC Innovation Award ด้วยนะ

สำหรับใครที่กำลังหางานอยู่นะครับ ตอนนี้ทีม MAKE by KBank กำลังรับคนอยู่ ตำแหน่งที่ต้องการก็จะเป็น Flutter และ Golang developer อย่างละ 5 คนเลย ไม่ได้จำกัดประสบการณ์ ที่นี่บรรยาการในการทำงานดีมากๆ ครับ ถ้าหากว่าใครสนใจก็ตามไปดูที่โพสของพี่ Bank ได้เลยนะครับ

ไปสมัครกันนนนนน

ส่วนถ้าใครยังไม่เคยใช้ MAKE by KBank แนะนำให้ลองเปิดบัญชีดูนะครับ ตอนนี้ผมเลิกใช้ app ธนาคารอื่นมาใช้ MAKE เป็นหลักละครับ 👍

แท็ก

Sethanant Pipatpakorn

Innovation Engineer @ KLabs, KBTG CS20 SKN36