ConfigMap และ Secret เป็นองค์ประกอบสำคัญของ Kubernetes ที่ใช้เมื่อคุณต้องการจัดเก็บค่าการตั้งค่า หรือข้อมูลที่เป็นความลับ ConfigMap ใช้สำหรับค่ารูปแบบข้อความ ตัวแปร และไฟล์กำหนดค่า ส่วน Secret ใช้เก็บข้อมูลที่ไวต่อความปลอดภัย เช่น รหัสผ่านและโทเคน หากคุณต้องการจัดเก็บข้อมูลและค่าผ่านเซิร์ฟเวอร์บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง อย่างมีประสิทธิภาพ บทความนี้จะช่วยให้คุณเข้าใจความแตกต่างระหว่าง ConfigMap และ Secret พร้อมวิธีการจัดเก็บค่าอย่างปลอดภัย
ConfigMap คืออะไร
ConfigMap เป็น object ของ Kubernetes ที่ใช้เก็บข้อมูลการตั้งค่า เช่น ไฟล์การตั้งค่า และตัวแปรสภาพแวดล้อมที่ไม่เป็นความลับ ตัวอย่างของข้อมูลที่เก็บไว้ใน ConfigMap:
- ค่าการตั้งค่าของแอปพลิเคชัน
- ตัวแปรสภาพแวดล้อม (Environment Variables)
- ไฟล์ค่าข้อมูล XML, JSON, YAML
- คำสั่ง Command line
Secret คืออะไร
Secret เป็น object ของ Kubernetes ที่คล้ายกับ ConfigMap แต่มีความแตกต่างที่สำคัญคือ Secret ใช้เก็บข้อมูลที่มีความลับและปิดการเข้าถึง โดยมี base64 encoding ที่ให้ระดับของการปิดกั้นพื้นฐาน Secret ควรถูกปิดกั้นจากผู้ที่ไม่มีสิทธิ์เข้าถึง
ประเภทของ Secret ที่พบบ่อยใน Kubernetes:
- Opaque: ค่าเริ่มต้นสำหรับข้อมูลทั่วไป
- kubernetes.io/service-account-token: Token สำหรับ Service account
- kubernetes.io/dockercfg: Docker configuration ที่ serialized
- kubernetes.io/dockercfg-json: Docker configuration ที่ Base64 encoded
- kubernetes.io/basic-auth: ข้อมูลสำหรับการยืนยันตัวตนแบบ Basic
- kubernetes.io/ssh-auth: ข้อมูลการยืนยันตัวตน SSH
- kubernetes.io/tls: ใบรับรอง TLS และคีย์ที่จับคู่กัน
วิธีที่ 1: ใช้ kubectl create configmap
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
วิธีที่ 2: สร้าง ConfigMap จากไฟล์
kubectl create configmap app-config --from-file=config.ini
วิธีที่ 3: สร้าง ConfigMap จาก YAML manifest
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
database_url: "postgresql://db:5432/mydb"
app_name: "MyApp"
log_level: "INFO"
ใช้คำสั่งนี้เพื่อสร้าง ConfigMap:
kubectl apply -f configmap.yaml
1. ใช้เป็น Environment Variables
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image:latest
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: my-config
key: database_url
2. มาวนต์ ConfigMap เป็น Volume ในคอนเทนเนอร์
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image:latest
volumeMounts:
- name: config
mountPath: /etc/config
volumes:
- name: config
configMap:
name: my-config
วิธีที่ 1: ใช้ kubectl create secret
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret123
วิธีที่ 2: สร้าง Secret จาก YAML manifest
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # base64 encoded "admin"
password: c2VjcmV0MTIz # base64 encoded "secret123"
วิธีใช้งาน Secret ใน Pod
ดูตัวอย่างการใช้ข้อมูลจาก Secret ในการสร้าง Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: myapp:latest
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
การตรวจสอบ ConfigMap และ Secret
ดูรายการ ConfigMap ที่สร้างแล้ว:
kubectl get configmap
kubectl describe configmap my-config
kubectl get configmap my-config -o yaml
ดูรายการ Secret ที่สร้างแล้ว:
kubectl get secret
kubectl describe secret my-secret
kubectl get secret my-secret -o yaml
การอัปเดต ConfigMap และ Secret
อัปเดต ConfigMap โดยใช้คำสั่ง:
kubectl edit configmap my-config
อัปเดต Secret โดยใช้คำสั่ง:
kubectl edit secret my-secret
การลบ ConfigMap และ Secret
kubectl delete configmap my-config
kubectl delete secret my-secret
ConfigMap
- ขนาดจำกัด ประมาณ 1MB ต่อ ConfigMap
- ใช้สำหรับค่าการตั้งค่าทั่วไป
- ไม่มี encryption เนื่องจากเก็บในรูปแบบ plain text
Secret
- เหมาะสำหรับข้อมูลที่ไวต่อความปลอดภัย เช่น รหัสผ่าน โทเคน และคีย์
- ควรเก็บใน etcd ที่มี encryption เพื่อความปลอดภัยที่ดีขึ้น
- แยกออกจาก ConfigMap เพื่อความปลอดภัยที่ดีขึ้น
การจัดเก็บข้อมูลอย่างปลอดภัยใน Kubernetes
- ใช้ ConfigMap สำหรับเก็บค่าการตั้งค่าทั่วไปที่ไม่มีความลับ
- ใช้ Secret สำหรับข้อมูลที่เป็นความลับ เช่น รหัสผ่านและโทเคน
- หลีกเลี่ยงการเก็บค่าคงที่ใน Container images
- ใช้ external secrets management tools สำหรับการจัดการขั้นสูง
ตัวอย่างการใช้งาน: Database Credentials
นี่คือตัวอย่างการเก็บ Database Credentials อย่างปลอดภัย:
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
stringData:
username: admin
password: mySecurePassword123
---
apiVersion: v1
kind: Pod
metadata:
name: db-app
spec:
containers:
- name: app
image: myapp:latest
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
สรุป
ConfigMap และ Secret เป็นวิธีสำคัญใน Kubernetes ที่ช่วยให้คุณจัดการการตั้งค่าและข้อมูลความลับอย่างปลอดภัยบน Kubernetes Cluster ของ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง โดยการแยกข้อมูลออกจากภาพของ Container คุณสามารถจัดการแอปพลิเคชันของคุณได้อย่างมีประสิทธิภาพและปลอดภัย
