จัดการ ConfigMap และ Secret ใน Kubernetes อย่างปลอดภัย

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 คุณสามารถจัดการแอปพลิเคชันของคุณได้อย่างมีประสิทธิภาพและปลอดภัย