Private Docs

Change Log ของ cluster — ทำอะไรไป เมื่อไหร่ และผลคืออะไร

บันทึกทุกการเปลี่ยนแปลงที่ลงมือกับ aks-SupperApp-dev เรียงตามเวลา พร้อมเหตุผล ผลที่คาด ผลที่วัดได้จริง และคำสั่ง rollback — ไว้ให้ย้อนดูได้ว่าบิลที่เปลี่ยนไปมาจากอะไร

อัปเดต: 2026-08-23

ทำไมต้องมีหน้านี้: เราแก้หลายอย่างในเวลาไล่เลี่ยกัน · พอบิลเดือนหน้าออกมาจะได้ตอบได้ว่า อะไรทำให้เปลี่ยน ไม่ใช่เดา

กติกา: ทุกแถวต้องมี วันเวลา · ทำอะไร · ทำไม · ผลที่คาด · ผลที่วัดได้จริง · rollback · ช่อง “วัดได้จริง” ปล่อยว่างไว้จนกว่าจะวัด ห้ามเติมด้วยการเดา


เส้นเวลาจำนวนเครื่อง

เวลาuser nodeรวมเกิดอะไร
21/0856จุดตั้งต้น
22/08 เช้า56right-size CPU/memory ลง (PR #2438, #2439) — ยังไม่ยุบ
22/08 ~06
56เปิด ignore-daemonsets-utilization=true — ยังไม่ยุบทันที
23/08 ~02
45✅ ยุบ 1 (vmss000033) หลังรอ ~20 ชม.
23/08 ~09
34✅ ยุบอีก 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 + uatPR #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 ไม่ยุบ
rollbackrevert PR

#2 · right-size memory requestPR #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 เปลี่ยนไปคนละภาพ
rollbackrevert 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 ออกจาก ArgoCDPR #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 ของ SITPR #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 กลับ
ผลที่คาดคืน 1.55 cores + internal LB 1 ตัว ($12/เดือน) · หยุด pod oscillation
วัดได้จริง✅ pool 91% → 78% · pod หาย 16 ตัว · dev/uat diff = 0 ชื่อต่อชื่อ · node ไม่ลด (ยังติด skipNodesWithSystemPods)
rollbackmanifest อยู่ใน 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 showrotationPollInterval: 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

⏳ ค้างรอวัดผล

#เรื่องวัดยังไงวัดเมื่อไหร่
11KV poll 1haz 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 → FreeOwner จอดไว้ 22/08 (~$70/เดือน)
ลบ private endpoint ของ SIT~$50/เดือน แต่ ทีมเราไม่มีสิทธิ์ ต้องให้ Infra teamCost review §4

🎯 คิวถัดไป

  1. app-routing — ลบ CR default (ไม่มี Ingress ใช้เลย) + argocd-nginx-internal (ไม่มีใครเปิด UI) + minReplicas: 1 · lever ที่ใหญ่ที่สุดที่เหลือ ⚠️ ต้องเช็ค DNS ก่อน โดยเฉพาะ public IP 20.198.139.25
  2. แก้ DNS ให้ sync-employee — เลือกทาง A / B / C
  3. rotate credential ที่ hardcode อยู่ใน Console_SyncEmployee/Program.cs
  4. วัดผล #11 วันที่ 25/08