Review checklist
นี่คือ checklist ที่ควรไล่ดู — ด้วยตาเปล่า บน diff ไหนก็ได้ ของคุณเองหรือของ AI — หลังจากเครื่องมือใน Verification Tools รันผ่านมาสะอาดแล้ว มันตั้งใจให้พอดีหน้าเดียวสำหรับพิมพ์ออกมา: checklist ที่ไม่มีใครเปิดดูจริงตอนรีวิวไม่มีค่าอะไรเลย ทุกบรรทัดลิงก์ไปบทที่อธิบายว่า ทำไม หน้านี้จึงยังเป็นแค่ลิสต์ ไม่ใช่การรื้อคอร์สมาเล่าซ้ำ กลุ่มต่าง ๆ เรียงตามลำดับเดียวกับ วิธีอ่าน YAML ของ Kubernetes ที่ไม่ได้เขียนเอง บวกกลุ่ม Tooling ปิดท้ายที่ครอบคลุมว่าอีกเจ็ดกลุ่มถูกตรวจสอบจริงได้อย่างไร
flowchart LR A["apiVersion & รูปร่าง"] --> T["dry-run=server จับได้ส่วนใหญ่<br/>(discovery error, strict decoding)"] W["Workload"] --> P["จับได้บางส่วน: immutable-field error จับได้,<br/>ช่องว่างของ headless Service/concurrency จับไม่ได้"] S["Scheduling"] --> P N["Networking"] --> M["ต้องรีวิวด้วยตาเป็นหลัก<br/>(selector/policyTypes เป็น matcher ที่ไม่ถูกตรวจสอบ)"] ST["Storage & config"] --> M Sec["Security"] --> P2["จับได้บางส่วน: PSA/VAP จับ field ที่รู้จัก,<br/>RBAC เกินสิทธิ์ต้อง auth can-i"] O["Observability"] --> M
apiVersion & รูปร่าง
หัวข้อที่มีชื่อว่า “apiVersion & รูปร่าง”apiVersionยัง resolve ได้บนคลัสเตอร์ที่คุณ deploy จริงหรือไม่ (kubectl api-resources,kubectl explain <kind>)?extensions/v1beta1,batch/v1beta1, และnetworking.k8s.io/v1beta1ถูกถอดออกทั้งหมดแล้ว ดู AI Bug Catalog ข้อ 1–3- ยังมีที่ไหนอ้างถึง
kind: PodSecurityPolicyอยู่หรือไม่? ถูกลบไปตั้งแต่ Kubernetes 1.25 — ตัวแทนคือ label บน Namespace บวกกับ Pod Security Admission ดูข้อ 4 Ingressใช้รูปร่างปัจจุบันbackend.service.name/port.number(พร้อมตั้งpathType) ไม่ใช่backend.serviceName/servicePortที่ถูกลบไปแล้วหรือไม่? ดูข้อ 3HorizontalPodAutoscalerปน field ของautoscaling/v1(targetCPUUtilizationPercentage) กับ field ที่มีแค่ในautoscaling/v2(metrics,behavior) ใน object เดียวกันหรือไม่? เป็นBadRequestจริงฝั่ง server ปัจจุบัน ดูข้อ 5
Workload
หัวข้อที่มีชื่อว่า “Workload”- มีใครพยายามเปลี่ยน
spec.selectorของ Deployment ที่ มีอยู่แล้ว หรือไม่? เป็นการปฏิเสธfield is immutableจริงและปัจจุบัน ดู AI Bug Catalog ข้อ 6 และ Deployments and ReplicaSets - Pod template ของ Job เคยตั้ง
restartPolicy: Alwaysหรือไม่? มีแค่OnFailure/Neverที่ valid — ดูข้อ 7 สำหรับการปฏิเสธจริงและปัจจุบัน strategy.rollingUpdateของ Deployment ตั้งทั้งmaxUnavailable: 0และmaxSurge: 0หรือไม่? เป็นการปฏิเสธค่า invalid จริงและปัจจุบัน ไม่ใช่ rollout ที่ค้างซึ่งพบทีหลัง ดูข้อ 8serviceNameของทุก StatefulSet ชี้ไปที่ Service ที่มีอยู่จริง และ headless (clusterIP: None) หรือไม่? ไม่ถูกตรวจสอบตอนสร้าง — ดูข้อ 9 พิสูจน์ด้วยNXDOMAINจริงconcurrencyPolicyตั้งไว้อย่างตั้งใจในทุก CronJob หรือปล่อยไว้ที่ค่า defaultAllowแบบเงียบ ๆ? ดูข้อ 10 พิสูจน์ด้วย Job ที่ทับซ้อนกันจริงselectorของทุก Service ตรงกับlabelsจริงของ Pod template หรือไม่ — เช็กโดยตรง ไม่ใช่แค่สมมติ? ดูข้อ 11 พิสูจน์ด้วยEndpointSliceที่ว่างเปล่าจริง
Scheduling
หัวข้อที่มีชื่อว่า “Scheduling”- ถ้า HPA เล็งไปที่ workload โดยดู CPU/memory utilization container ของ workload นั้นตั้ง
resources.requestsหรือไม่? ดู AI Bug Catalog ข้อ 12 พิสูจน์ด้วยFailedGetResourceMetricจริง และ Horizontal Pod Autoscaling minAvailable(หรือmaxUnavailable) ของทุก PodDisruptionBudget เหลือที่ว่างจริงต่ำกว่าจำนวน replica เต็มหรือไม่? ดูข้อ 13 พิสูจน์ด้วยการ drain ที่ถูกบล็อกถาวรจริง และ Pod Disruption & Cluster Autoscaling
Networking
หัวข้อที่มีชื่อว่า “Networking”policyTypesของ NetworkPolicy ระบุครบทุกทิศทางที่ชื่อหรือ comment ของมันอ้างว่าจำกัดหรือไม่? การละEgressทำให้ทิศทางนั้นไม่ถูกจำกัดเลย ไม่ใช่ “ครอบคลุมโดย default” ดู AI Bug Catalog ข้อ 14 พิสูจน์ด้วย curl ที่ไม่ถูกบล็อกจริง- ถ้า NetworkPolicy เป็น default-deny จริง (
policyTypes: [Ingress, Egress], ไม่มี rule) มันยัง allow egress ไปยังตัวให้บริการ DNS ของคลัสเตอร์ (kube-system, UDP/TCP 53) อย่างชัดเจนหรือไม่? ไม่งั้นทุกการ lookup hostname — รวมถึงชื่อ Service ของ Kubernetes เอง — จะพังไปด้วย ดูข้อ 15 พิสูจน์ด้วยnslookupที่ timeout จริง
Storage & configuration
หัวข้อที่มีชื่อว่า “Storage & configuration”- volume แบบ
hostPathเก็บข้อมูลที่ควรรอดจากการ reschedule ไปยัง node อื่นหรือไม่? พิสูจน์แล้วว่าทิ้งข้อมูลไว้แบบเงียบ ๆ — ดู AI Bug Catalog ข้อ 16 - มีอะไร — comment, ชื่อตัวแปร, runbook — เรียกเนื้อหาของ
Secretว่า “encrypted” หรือไม่? fielddataของมันแค่ base64-encode เท่านั้น ใครก็ตามที่มีสิทธิ์get secretธรรมดาก็ decode กลับได้ทันที ดูข้อ 17
Security
หัวข้อที่มีชื่อว่า “Security”securityContext.privileged: true(หรือhostNetwork/hostPID/hostIPC) ปรากฏเป็นวิธีแก้ permission error ในคอนเทนเนอร์ แทนที่จะเป็น capability หรือ field เฉพาะที่จำเป็นจริง ๆ หรือไม่? ดู AI Bug Catalog ข้อ 18 และ Pod & Cluster Security สำหรับข้อความปฏิเสธจริงของ Pod Security Admission ที่มันสร้าง- Linux capability เคยถูก drop หรือไม่ (
capabilities.drop: ["ALL"]) โดยเพิ่มกลับมาเฉพาะสิ่งที่จำเป็นจริงผ่านcapabilities.add? ดูข้อ 19 automountServiceAccountToken: falseตั้งไว้บน workload ที่ไม่เคยเรียก API server ของ Kubernetes เลยหรือไม่? ดูข้อ 20- ServiceAccount ของ workload เคยถูกผูกกับ
cluster-adminแทนที่จะเป็นRole/ClusterRoleที่จำกัดขอบเขตแคบ ๆ หรือไม่? ดูข้อ 21 พิสูจน์ด้วยkubectl auth can-iจริงที่แสดงขอบเขตทั่วทั้งคลัสเตอร์ และ RBAC & Service Accounts
Observability
หัวข้อที่มีชื่อว่า “Observability”- ทุก Deployment ที่อยู่หลัง Service มี
readinessProbeที่เช็ก endpoint ของแอปจริง ไม่ใช่แค่ “process กำลังรัน” หรือไม่? ดู AI Bug Catalog ข้อ 22 พิสูจน์ด้วยConnection refusedจริงระหว่าง startup และ Probes: Liveness, Readiness, Startup livenessProbeกับreadinessProbeเคยชี้ไปที่ endpoint เดียวกันโดยไม่มีstartupProbeรองรับการ warm-up ที่ช้าหรือไม่? ดูข้อ 23 พิสูจน์ด้วย restart loop ที่เกิดจากตัวเองจริง- คำสั่ง debug สมมติว่า
kubectl exec -it <pod> -- shใช้ได้เสมอ แม้กับ image แบบ minimal หรือ distroless ที่ไม่มี shell เลยหรือไม่?kubectl debug --target(ephemeral container, GA ตั้งแต่ 1.25) คือวิธีแก้จริง ดูข้อ 24 และ Logging & Metrics
Tooling
หัวข้อที่มีชื่อว่า “Tooling”kubectl apply --dry-run=server(ไม่ใช่แค่--dry-run=client) ถูกรันกับ API server จริงก่อนที่จะเชื่อว่าอะไรใน checklist นี้ “น่าจะโอเค” หรือไม่?--dry-run=clientไม่ติดต่อ server เลย และพลาด error ของ discovery/admission/strict-decoding ทุกอันที่ checklist นี้พึ่งพา ดู Verification Tools- CI รัน schema validator จริง (
kubeconform,kube-linter,polaris, หรือtools/verify-manifests.mjsของคอร์สนี้เอง) กับทุก manifest ไม่ใช่แค่คนไล่ดูด้วยตาหรือไม่? ดู Verification Tools - โหมด
warnของ Pod Security Admission (ไม่ใช่แค่enforce) ถูกใช้เป็น linter ที่ทำงานจริง — เช็กทุกครั้งที่ apply แม้ใน namespace ที่ยังไม่พร้อม enforcerestrictedหรือไม่? ดู Pod & Cluster Security