Secret — เก็บข้อมูลลับ
รหัสผ่าน, token, cert แยกจาก config ทั่วไป
พื้นฐานที่ควรรู้: นอกจากการตั้งค่าทั่วไปแล้ว ระบบมักต้องการรหัสผ่าน (Passwords), กุญแจ API (API Keys) หรือใบรับรอง (Certificates) ซึ่งเป็นข้อมูลที่อ่อนไหว หากหลุดไปอาจทำให้ระบบถูกโจมตีได้
Secret เหมือนตู้เซฟเทียบกับป้ายตั้งค่า (ConfigMap) ที่แปะโล่ง ๆ · ใช้เก็บของที่ห้ามหลุด: รหัสผ่านฐานข้อมูล, API key, TLS cert
Secret หน้าตาคล้าย ConfigMap แต่ตั้งใจใช้กับข้อมูลลับ · ค่าถูกเก็บแบบ base64-encoded และ K8s ควบคุมการเข้าถึงเข้มกว่า
# สร้างจาก literal (K8s เข้ารหัส base64 ให้)
kubectl create secret generic db-cred \
--from-literal=DB_PASSWORD='s3cr3t!'
# อ้างใน container:
# env:
# - name: DB_PASSWORD
# valueFrom:
# secretKeyRef: { name: db-cred, key: DB_PASSWORD }สรุป Key Takeaways
- Secret = ที่เก็บข้อมูลลับ (รหัสผ่าน, token, cert) แยกจาก ConfigMap
- ค่าเป็น base64 ซึ่งไม่ใช่การเข้ารหัส — ต้องเปิด encryption at rest + RBAC
- อย่า commit Secret ดิบลง Git · งานจริงใช้ Vault/Sealed Secrets/External Secrets
คำถามที่พบบ่อย
Secret ปลอดภัยกว่า ConfigMap จริงไหม
โดย default แทบไม่ต่าง — Secret แค่ base64 (encode ไม่ใช่ encrypt) ใครมีสิทธิ์อ่านก็ decode ได้ — ที่ทำให้ปลอดภัยจริงคือ: เปิด encryption at rest ของ etcd, จำกัด RBAC ว่าใครอ่าน Secret ได้, และงานจริงจังใช้ external secret manager (AWS Secrets Manager, Vault) sync เข้ามา
เก็บ secret ใน git ยังไงให้ถูกวิธี
ห้าม commit secret ตรงๆ เด็ดขาด — ทางเลือก: (1) Sealed Secrets เข้ารหัสไว้ให้ controller ใน cluster ถอดเอง (2) External Secrets Operator ดึงจาก secret manager ภายนอก (3) SOPS เข้ารหัสไฟล์ — ใน GitOps ทุกอย่างอยู่ใน git ได้ ยกเว้นความลับที่ต้องผ่านการเข้ารหัสเสมอ

