Kubernetes คือ ตอนที่ 6 : การจัดการข้อมูลที่ละเอียดอ่อน (Sensitive Data) ด้วย ConfigMaps และ Secrets

  1. ทำความเข้าใจกับ ConfigMaps
  2. ทำความเข้าใจกับ Secrets
  3. ปฏิบัติที่ดีที่สุด (Best Practices)

เมื่อทำแอปพลิเคชันสำหรับ Kubernetes ทักษะที่จำเป็นคือการรู้วิธีจัดการการกำหนดค่าแอปพลิเคชันและข้อมูลที่ละเอียดอ่อน Kubernetes มีทรัพยากรในตัว 2 รายการสำหรับวัตถุประสงค์นี้ ได้แก่ ConfigMaps และ Secrets ทรัพยากรเหล่านี้ช่วยให้คุณสามารถแยกข้อมูลการกำหนดค่าและข้อมูลที่ละเอียดอ่อนออกจากโค้ดแอปพลิเคชัน ซึ่งสอดคล้องกับแนวปฏิบัติที่ดีที่สุดของวิธีการแอพ 12 ปัจจัย ในบทความนี้ เราจะสำรวจทรัพยากรทั้งสองนี้และแสดงวิธีใช้ทรัพยากรเหล่านี้ในการทำแอพของคุณ

1. ทำความเข้าใจกับ ConfigMaps

ConfigMaps ใน Kubernetes ช่วยให้คุณแยกข้อมูลการกำหนดค่าออกจากโค้ดแอปพลิเคชันได้ การแยกนี้ให้ประโยชน์สองประการ ประการแรก คุณสามารถเปลี่ยนข้อมูลการกำหนดค่าโดยไม่ต้องสร้างคอนเทนเนอร์แอปพลิเคชันใหม่ ประการที่สอง คุณสามารถแชร์ข้อมูลการกำหนดค่าระหว่างคอมโพเนนต์ต่างๆ ของในการทำแอพของคุณได้อย่างง่ายดาย

ConfigMap เป็นพจนานุกรมของคู่คีย์-ค่าที่สามารถใช้เพื่อจัดเก็บข้อมูลการกำหนดค่าในรูปแบบที่เข้าถึงและจัดการได้ง่าย ข้อมูลที่จัดเก็บไว้ใน ConfigMap สามารถเข้าถึงได้ในแอปพลิเคชันของคุณหลายวิธี รวมถึงเป็นตัวแปรสภาพแวดล้อม อาร์กิวเมนต์บรรทัดคำสั่ง หรือเป็นไฟล์ในวอลุ่ม

มาสร้าง ConfigMap สำหรับแอปพลิเคชันตัวอย่างกัน:

kubectl create configmap app-config --from-literal=LOG_LEVEL=DEBUG --from-literal=DATABASE_URL=jdbc:mysql://localhost:3306/mydb

ในคำสั่งด้านบน เรากำลังสร้าง ConfigMap ที่มี app-config สองรายการ: LOG_LEVELตั้ งค่าเป็น DEBUG และ DATABASE_URL ตั้งค่าเป็นสตริงการเชื่อมต่อฐานข้อมูลสมมุติฐาน

ตอนนี้ มาดูกันว่าเราจะใช้ ConfigMap นี้ใน Pod ได้อย่างไร:

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: myapp:1.0
    envFrom:
    - configMapRef:
        name: app-config

ในคำจำกัดความของ Pod เรากำลังใช้ฟิลด์ envFrom เพื่อนำเข้าคู่คีย์-ค่าทั้งหมดจาก app-configConfigMap เป็นตัวแปรสภาพแวดล้อม

2. ทำความเข้าใจกับ Secrets

แม้ว่า ConfigMaps เหมาะสำหรับการจัดเก็บข้อมูลการกำหนดค่าที่ไม่ละเอียดอ่อน แต่ Kubernetes Secrets มีไว้สำหรับข้อมูลที่ละเอียดอ่อน เช่น รหัสผ่าน โทเค็น OAuth คีย์ ssh เป็นต้น Kubernetes Secrets คล้ายกับ ConfigMaps แต่มีคุณสมบัติเพิ่มเติมสำหรับจัดการข้อมูลที่ละเอียดอ่อน

ประการแรก ข้อมูลลับจะถูกเก็บไว้ในการเข้ารหัส Base64 ซึ่งจะปิดบังข้อมูลจากผู้สังเกตการณ์ทั่วไป ประการที่สอง Secrets สามารถติดตั้งเป็นไดรฟ์ข้อมูลแบบอ่านอย่างเดียวในพ็อด ซึ่งป้องกันแอปพลิเคชันจากการแก้ไขข้อมูลที่ละเอียดอ่อนโดยไม่ตั้งใจ

ตอนนี้มาสร้าง Secrets สำหรับแอปพลิเคชันตัวอย่างของเรา:

echo -n 'mysecret' > ./username.txt
echo -n 'mypassword' > ./password.txt
kubectl create secret generic app-secrets --from-file=./username.txt --from-file=./password.txt

ในคำสั่งด้านบน เรากำลังสร้าง Secret ที่มีชื่อ app-secrets สองรายการ: a username และ password ทั้งสองเก็บไว้ในไฟล์แยกกัน

มาดูกันว่าเราจะใช้ Secret นี้ใน Pod ได้อย่างไร:

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: myapp:1.0
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secrets"
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: app-secrets

ในคำจำกัดความของ Pod เรากำลังติดตั้ง app-secretsSecret เป็นไดรฟ์ข้อมูลที่เส้นทาง /etc/secrets แต่ละคีย์ใน Secret จะสร้างไฟล์ในไดเร็กทอรีนี้ และเนื้อหาไฟล์จะเป็นค่าที่สอดคล้องกันจาก Secret

3. ปฏิบัติที่ดีที่สุด (Best Practices)

แนวทางปฏิบัติที่ดีที่สุดที่ควรคำนึงถึงเมื่อทำงานกับ ConfigMaps และ Secrets มีดังนี้

  • ไม่รวมข้อมูลที่ละเอียดอ่อนใน ConfigMap แม้ว่า ConfigMaps จะไม่ได้มีไว้สำหรับข้อมูลที่ละเอียดอ่อน แต่การใส่ข้อมูลที่ละเอียดอ่อนใน ConfigMap เพื่อความสะดวกก็อาจดึงดูดใจได้ ต่อต้านการทดลองนี้
  • ใช้ชื่อเฉพาะสำหรับ Secrets และ ConfigMaps ชื่อของ Secrets และ ConfigMaps จะมองเห็นได้ในบันทึกและที่อื่นๆ ดังนั้น หลีกเลี่ยงการใช้ข้อมูลที่ละเอียดอ่อนในชื่อ Secrets และ ConfigMaps
  • ใช้ RBAC เพื่อจำกัดการเข้าถึงข้อมูลลับ ตามค่าเริ่มต้น ผู้ใช้หรือกระบวนการใดๆ ที่สามารถสร้าง Pod จะสามารถเข้าถึงข้อมูลลับใดๆ ในเนมสเปซเดียวกันได้เช่นกัน ค่าเริ่มต้นนี้สะดวกแต่ไม่ปลอดภัย ใช้การควบคุมการเข้าถึงตามบทบาท (RBAC) เพื่อจำกัดผู้ที่สามารถเข้าถึงข้อมูลลับ
  • จำกัด อายุการใช้งานของ Secrets หมุนเวียนข้อมูลลับบ่อยๆ และยกเลิกเมื่อไม่ต้องการอีกต่อไป หาก Secrets รั่วไหล ความเสียหายจะถูกจำกัดหาก Secrets นั้นใกล้จะหมดอายุ

ConfigMaps และ Secrets ของ Kubernetes เป็นเครื่องมือที่มีประสิทธิภาพสำหรับจัดการข้อมูลการกำหนดค่าและข้อมูลที่ละเอียดอ่อนในแอปพลิเคชันของคุณ การแยกข้อมูลนี้ออกจากโค้ดแอปพลิเคชันของคุณ คุณสามารถทำแอพที่ปลอดภัยยิ่งขึ้น กำหนดค่าได้มากขึ้น และจัดการได้ง่ายขึ้น เริ่มใช้ ConfigMaps และ Secrets วันนี้เพื่อทำแอพที่มีประสิทธิภาพและปลอดภัยมากขึ้นบน Kubernetes


Kubernetes คืออะไร

Kubernetes คือ ตอนที่ 5 : ทำความเข้าใจกับพื้นที่เก็บข้อมูล (Storage)
Kubernetes คือ ตอนที่ 7 : RBAC และ ความปลอดภัย