Change Log ของ cluster — ทำอะไรไป เมื่อไหร่ และผลคืออะไร
บันทึกทุกการเปลี่ยนแปลงที่ลงมือกับ aks-SupperApp-dev เรียงตามเวลา พร้อมเหตุผล ผลที่คาด ผลที่วัดได้จริง และคำสั่ง rollback — ไว้ให้ย้อนดูได้ว่าบิลที่เปลี่ยนไปมาจากอะไร
อัปเดต: 2026-08-23
ทำไมต้องมีหน้านี้: เราแก้หลายอย่างในเวลาไล่เลี่ยกัน · พอบิลเดือนหน้าออกมาจะได้ตอบได้ว่า อะไรทำให้เปลี่ยน ไม่ใช่เดา
กติกา: ทุกแถวต้องมี วันเวลา · ทำอะไร · ทำไม · ผลที่คาด · ผลที่วัดได้จริง · rollback · ช่อง “วัดได้จริง” ปล่อยว่างไว้จนกว่าจะวัด ห้ามเติมด้วยการเดา
เส้นเวลาจำนวนเครื่อง
| เวลา | user node | รวม | เกิดอะไร |
|---|---|---|---|
| 21/08 | 5 | 6 | จุดตั้งต้น |
| 22/08 เช้า | 5 | 6 | right-size CPU/memory ลง (PR #2438, #2439) — ยังไม่ยุบ |
| 22/08 ~06 | 5 | 6 | เปิด ignore-daemonsets-utilization=true — ยังไม่ยุบทันที |
| 23/08 ~02 | 4 | 5 | ✅ ยุบ 1 (vmss000033) หลังรอ ~20 ชม. |
| 23/08 ~09 | 3 | 4 | ✅ ยุบอีก 1 (vmss00000h) — หลัง AKS auto-upgrade node image ดูรายการ #10 |
รวมยุบไปแล้ว 2 เครื่อง ≈ $308/เดือน (ตัวเลข list price $154/เครื่อง = VM $143 + disk $11 · ยังไม่เคยเห็นบิลจริงหลังเปลี่ยน)
รายการเปลี่ยนแปลง
22/08/2026
#1 · right-size CPU request ของ dev + uat — PR #2438 merged c39a6100… (2e434c67)
| ทำอะไร | service ทั่วไป 100m → 50m · user/thirdparty 250m → 100m (46 ไฟล์) · พ่วง sonarqube memory 2Gi → 3Gi |
| ทำไม | CPU request พองกว่าใช้จริง 7 เท่า · sonarqube ใช้เกิน request 116% เสี่ยงโดน evict ตอนยุบ node |
| ผลที่คาด | CPU request user pool 89% → 74% |
| วัดได้จริง | ✅ 89% → 74% ตรงตามคาด · node ไม่ยุบ |
| rollback | revert PR |
#2 · right-size memory request — PR #2439 merged 04d74ec9
| ทำอะไร | dependency-track 4Gi → 1536Mi + cpu 500m → 100m · frontend 256Mi → 64Mi + cpu 100m → 50m · user/thirdparty (dev+uat) 512Mi → 256Mi |
| ทำไม | จองเกินใช้จริง 3–16 เท่า |
| ผลที่คาด | คืน memory ~4.2 GiB + CPU ~0.45 core |
| วัดได้จริง | ✅ ตรง · node ไม่ยุบ · ⚠️ pod restart ทั้งหมด ทำให้ scheduler เกลี่ยใหม่ ตัวเลข utilization เปลี่ยนไปคนละภาพ |
| rollback | revert PR |
#3 · 🔧 cluster-autoscaler: เลิกนับ DaemonSet ตอนคิด utilization
az aks update -g sua-azure-nonprd -n aks-SupperApp-dev \
--cluster-autoscaler-profile ignore-daemonsets-utilization=true skip-nodes-with-local-storage=false
| ทำไม | DaemonSet 859m/node (22%) ถูกนับเข้า utilization ทั้งที่หายไปพร้อม node → ไม่มี node ไหนต่ำกว่าเกณฑ์ 0.5 เลย |
| ผลที่คาด | ปลดล็อกให้ CA ยุบ node ได้ |
| วัดได้จริง | ✅ ยุบ 1 node แต่ใช้เวลา ~20 ชม. ไม่ใช่ 10 นาที — เฝ้าดู 20 นาทีแรกยังเห็น NoCandidates |
| ⚠️ กับดัก | ต้องส่ง skip-nodes-with-local-storage=false พ่วงเสมอ — cluster นี้ตั้งค่าสวน default ไว้ ถ้าไม่ส่งจะถูก reset เงียบๆ |
| rollback | คำสั่งเดิม เปลี่ยนเป็น ignore-daemonsets-utilization=false (พ่วง flag ตัวที่สองเหมือนกัน) |
23/08/2026
#4 · ถอด SIT ออกจาก ArgoCD — PR #2460 merged c39a6100
ลบ superapp-sit-application.yaml, superapp-sit-observability.yaml, superapp-sit-appset.yaml + destination 2 บรรทัดใน superapp-project.yaml · ไม่กระทบ cluster (app ถูกสร้างด้วยมือ ไม่มี ownerReferences) · rollback = revert PR แล้ว kubectl apply เอง
#5 · ลบ manifest ของ SIT — PR #2461 merged 0c73e2c5
ลบ src/yamls/sit/ 120 ไฟล์ · inert · rollback = git show 0c73e2c5^:src/yamls/sit/... หรือกู้จาก branch sit ที่ยังไม่ถูกลบ
#6 · 🔧 ลบ SIT ออกจาก cluster จริง (manual)
kubectl delete applicationset superapp-sit-services -n argocd # -> app *-sit 17 ตัวหายตาม
kubectl delete application superapp-sit superapp-sit-observability -n argocd
kubectl delete ns superappsit observability-sit
kubectl delete nginxingresscontroller sit-nginx-internal # -> คืน internal LB 172.29.88.4
| ⚠️ ลำดับบังคับ | ต้องลบ ApplicationSet ก่อน ไม่งั้น appset (อ่าน branch sit) จะสร้าง resource กลับ |
| ผลที่คาด | คืน |
| วัดได้จริง | ✅ pool 91% → 78% · pod หาย 16 ตัว · dev/uat diff = 0 ชื่อต่อชื่อ · node ไม่ลด (ยังติด skipNodesWithSystemPods) |
| rollback | manifest อยู่ใน git history + branch sit · backup YAML อยู่ใน scratchpad ของ session (ไม่ถาวร) |
#7 · 🔧 build + push image sync-employee (manual — repo ไม่มี CI)
build จาก Console_SyncEmployee origin/main (5edd7fc) → push suaazcrdev.../sync-employee:dev-5edd7fc
| ทำไม | image ที่รันอยู่ (dev-889f3a3, 31/07) build จาก base dotnet/runtime ที่ไม่มี ASP.NET Core framework · Dockerfile บน main แก้แล้วตั้งแต่ 17/08 แต่ repo ไม่มี pipeline เลยไม่มีใคร build |
| วัดได้จริง | ✅ dotnet --list-runtimes ใน image ใหม่มี Microsoft.AspNetCore.App 10.0.11 ที่ขาดอยู่ · app start ผ่านแล้ว |
| ยังไม่จบ | ไปตายที่ DNS ต่อ (รายละเอียด) |
#8 · ชี้ CronJob ไป image ใหม่ — PR #2462 merged 3eec11ee · 1 บรรทัด · rollback = revert PR
#9 · 🔧 ลบ Job ที่ fail ค้าง (manual)
sync-employee-29790360 (ของจริง) และ sync-employee-verify (Job ทดสอบที่เราสร้างเอง) · บทเรียน: Job ทดสอบก็ทิ้ง pod Error ค้างเหมือนกัน ต้องลบทุกครั้งหลังอ่าน log
#10 · 📌 ไม่ใช่เรา — AKS auto-upgrade node image
| เกิดอะไร | node ทั้ง 4 ตัวถูกสร้างใหม่หมดช่วง ~09 (อายุ 73–90 นาที ตอนตรวจ 10) |
| ทำไม | autoUpgradeProfile.nodeOsUpgradeChannel: NodeImage — AKS อัปเดต node image ให้อัตโนมัติ (image AKSAzureLinux-V3gen2-202608.06.1) |
| ผลข้างเคียงที่สำคัญ | 🔑 pod ถูกเกลี่ยใหม่ทั้งหมด → มี node หลุดจากการถูกกันด้วย skipNodesWithSystemPods → CA ยุบได้อีก 1 เครื่อง (4 → 3) |
| ข้อสรุปที่ได้ | เพดาน skipNodesWithSystemPods ไม่ถาวร — การหมุน node ทำให้ addon ย้ายที่ และอาจปลดล็อกการยุบเองโดยที่เราไม่ได้ทำอะไร |
#11 · 🔧 Key Vault CSI: poll 2m → 1h
az aks update -g sua-azure-nonprd -n aks-SupperApp-dev \
--enable-secret-rotation --rotation-poll-interval 1h
| ทำไม | บิล Key Vault $55–58/เดือน เป็นค่า transaction แทบทั้งหมด · วัดจริง 7 วัน = 609,085 tx/วัน และแยกชนิดแล้วพบว่า secretget 90.7% + authentication 6.3% + secretlist 3.0% = ~99% โตตามความถี่ที่ poll (ส่วนที่ไม่เกี่ยวกับ poll มีแค่ 163 ครั้งใน 3 วัน) |
| หลักฐานว่าเป็น CSI จริง | authentication 39,176/วัน ≈ 45 pod × 30 ครั้ง/ชม. × 24 = 32,400 ตรงเกือบเป๊ะ |
| ผลที่คาด | ลด transaction 30 เท่า → ~$2/เดือน (จาก ~$57) |
| วัดได้จริง | ⏳ ยังไม่วัด — ต้องรอ 48 ชม. แล้ว query ServiceApiHit ใหม่ |
| ยืนยันว่าลงจริงแล้ว | az aks show → rotationPollInterval: 1h · CSI DaemonSet arg → --rotation-poll-interval=1h · pod restart ครบ 4 ตัว Running · cluster non-Running = 0 |
| เสียอะไร | secret ที่เปลี่ยนใน KV จะถึง pod ภายใน 1 ชม. แทน 2 นาที (non-prod รับได้) |
| ⚠️ กับดัก | ต้องส่ง --enable-secret-rotation พ่วง ไม่งั้น rotation จะถูกปิดทั้งหมด — กับดักตระกูลเดียวกับ #3 |
| rollback | คำสั่งเดิม เปลี่ยนเป็น --rotation-poll-interval 2m |
⏳ ค้างรอวัดผล
| # | เรื่อง | วัดยังไง | วัดเมื่อไหร่ |
|---|---|---|---|
| 11 | KV poll 1h | az monitor metrics list --resource sua-azure-nonprd-kv --resource-group sua-azure-nonprd --resource-type Microsoft.KeyVault/vaults --metric ServiceApiHit --aggregation Total --interval P1D --offset 3d · เทียบกับฐาน 609,085 tx/วัน | 25/08 (48 ชม. หลังเปลี่ยน) |
| 1–10 | ค่าเครื่องที่ลดลงจริง | Cost Management บรรทัด Virtual Machines ของ RG MC_sua-azure-nonprd_... เทียบเดือน ส.ค. กับ ก.ย. | ต้นเดือน ก.ย. |
| ทั้งหมด | บิลรวม non-prd | เทียบกับฐาน ก.ค. $3,387.56 | ต้นเดือน ก.ย. |
🔴 ห้ามเขียนตัวเลขประหยัดลงเอกสารอื่นก่อนช่องนี้ถูกเติม — วันนี้ประมาณการพลาดมาแล้ว 3 ครั้ง (KV $40–50 → จริง ~$55 แต่ด้วยเหตุผลคนละอย่าง · addon 2,660m → จริง 260m · platform overhead 9.5 เท่า → จริง 5–10 เท่า)
❌ ตัดสินใจแล้วว่ายังไม่ทำ
| เรื่อง | เหตุผล | ดูรายละเอียด |
|---|---|---|
| เอา ArgoCD ออก | ประหยัด $0 (ไม่ตั้ง resource request เลย) · เป็นการตัดสินใจเรื่อง workflow ไม่ใช่เงิน | AKS scale-down §5.1 |
| ลบ database SIT | ประหยัด $0 (PG คิดจาก storage ที่จอง ซึ่งอยู่ที่ขั้นต่ำ 32 GB แล้ว) · ลบแล้วกู้ไม่ได้ | Cost review §4 |
| ปิด pod กลางคืน 22–07 | ติด 3 ด่าน (systemPods / ArgoCD selfHeal / HPA) · และได้ node เดียวกับแผน app-routing ไม่ได้บวกกัน | AKS scale-down §5.4 |
| ปิด Azure addon เพื่อลด node | ผลจริงต่อ autoscaler = 260m ไม่ใช่ 2,660m เพราะ #3 ทำให้ CA เลิกนับ DaemonSet | ค่าผ่านทางของ AKS |
| AKS tier → Free | Owner จอดไว้ 22/08 (~$70/เดือน) | — |
| ลบ private endpoint ของ SIT | ~$50/เดือน แต่ ทีมเราไม่มีสิทธิ์ ต้องให้ Infra team | Cost review §4 |
🎯 คิวถัดไป
app-routing— ลบ CRdefault(ไม่มี Ingress ใช้เลย) +argocd-nginx-internal(ไม่มีใครเปิด UI) +minReplicas: 1· lever ที่ใหญ่ที่สุดที่เหลือ ⚠️ ต้องเช็ค DNS ก่อน โดยเฉพาะ public IP20.198.139.25- แก้ DNS ให้
sync-employee— เลือกทาง A / B / C - rotate credential ที่ hardcode อยู่ใน
Console_SyncEmployee/Program.cs - วัดผล #11 วันที่ 25/08