เมื่อทำแอปพลิเคชันสำหรับ 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-config
ConfigMap เป็นตัวแปรสภาพแวดล้อม
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-secrets
Secret เป็นไดรฟ์ข้อมูลที่เส้นทาง /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