Skip to main content

Kubernetes Custom Resource Definitions (CRDs)

Introduction

ใน Kubernetes, Custom Resource Definitions (CRDs) เป็นฟีเจอร์ที่ช่วยให้คุณสามารถสร้าง Custom Resources (CRs) ของคุณเองที่สามารถใช้งานร่วมกับ Kubernetes API ได้ CRD ช่วยให้คุณสามารถขยาย Kubernetes API เพื่อรองรับการจัดการกับ resource ใหม่ๆ ที่ไม่อยู่ในกลุ่ม resources พื้นฐานเช่น Pod, Service หรือ Deployment โดยการสร้างชนิดข้อมูลที่เหมาะสมกับแอปพลิเคชันหรือการใช้งานเฉพาะ

การใช้งาน CRD จะทำให้ Kubernetes สามารถรับรู้และจัดการ Custom Resources ของคุณเหมือนกับทรัพยากรอื่นๆ ใน Kubernetes เช่นเดียวกับ Pod หรือ Service

Key Concepts

  1. Custom Resource (CR):

    • Custom Resource (CR) คือ Resource ใหม่ที่คุณสร้างขึ้นภายใต้ Kubernetes API ซึ่งสามารถมีการตั้งค่าและชนิดข้อมูลที่เฉพาะเจาะจงตามความต้องการของแอปพลิเคชันของคุณ
    • การสร้าง CR จะต้องสร้างผ่าน Custom Resource Definition (CRD) ซึ่งกำหนดว่า CR ของคุณมีลักษณะอย่างไร
  2. Custom Resource Definition (CRD):

    • CRD คือชนิดของ Resource ที่ใช้ในการสร้าง Custom Resource ใหม่ ๆ ภายใต้ Kubernetes API โดย CRD จะระบุรายละเอียดของ Custom Resource รวมถึงฟิลด์และการตั้งค่าที่สามารถใช้งานได้
    • เมื่อ CRD ถูกสร้างขึ้น, Kubernetes จะสร้าง API endpoint ใหม่สำหรับ Custom Resources ที่เกี่ยวข้อง
  3. Kinds:

    • ใน CRD, kind ของ Resource จะถูกกำหนดเพื่อบ่งชี้ถึงชื่อและประเภทของ Resource ที่คุณต้องการสร้าง
    • kind นี้จะถูกใช้ในคำสั่ง kubectl เพื่อจัดการกับ Custom Resource
  4. Validation:

    • CRD รองรับการ Validation ของข้อมูลที่ถูกส่งเข้าไปใน Custom Resources ซึ่งช่วยให้สามารถกำหนดกฎเกณฑ์ของข้อมูลที่จะถูกใช้ใน Custom Resources
  5. Scope:

    • CRD สามารถกำหนด scope เป็น Namespaced หรือ Cluster เพื่อกำหนดว่า Custom Resource ของคุณจะถูกใช้งานเฉพาะภายใน namespace เดียวหรือสามารถใช้ได้ทั่วทั้ง Cluster

How CRDs Work

Creating a Custom Resource Definition (CRD)

การสร้าง Custom Resource Definition (CRD) จะใช้ kubectl หรือไฟล์ YAML เพื่อสร้างการตั้งค่า CRD ที่ต้องการ

Example of a CRD YAML

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: examples.mycompany.com
spec:
group: mycompany.com
names:
kind: Example
plural: examples
singular: example
shortNames:
- ex
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
field1:
type: string
field2:
type: integer

ในตัวอย่างนี้:

  • group: ชื่อกลุ่มของ Custom Resource ที่คุณต้องการสร้าง (mycompany.com)
  • names: ชื่อของ Custom Resource ที่จะใช้กับ kubectl เช่น example หรือ examples
  • scope: กำหนดว่า Custom Resource นี้จะถูกใช้งานภายใน namespace (Namespaced) หรือทั่วทั้ง Cluster (Cluster)
  • versions: กำหนดเวอร์ชันของ CRD, ซึ่งในตัวอย่างนี้มีเวอร์ชันเดียวคือ v1
  • schema: กำหนดโครงสร้างของข้อมูลที่อนุญาตใน Custom Resource โดยใช้ OpenAPI v3

Creating a Custom Resource (CR)

เมื่อ CRD ถูกสร้างขึ้นแล้ว, คุณสามารถสร้าง Custom Resource (CR) ที่ตรงตาม CRD ที่คุณกำหนด

Example of a Custom Resource YAML

apiVersion: mycompany.com/v1
kind: Example
metadata:
name: example1
spec:
field1: "Hello, World!"
field2: 42

ในตัวอย่างนี้:

  • apiVersion จะใช้กลุ่มและเวอร์ชันที่คุณกำหนดใน CRD
  • kind จะใช้ Example ซึ่งถูกกำหนดใน CRD
  • spec จะมีข้อมูลที่เกี่ยวข้องกับ Custom Resource ของคุณ

Accessing and Managing Custom Resources

หลังจากที่คุณสร้าง CRD และ CR แล้ว, คุณสามารถใช้งาน kubectl เพื่อจัดการ Custom Resources เหล่านั้น เช่น การสร้าง, ดูข้อมูล, อัปเดต, หรือลบ Custom Resource

# Create a Custom Resource
kubectl apply -f example-cr.yaml

# List Custom Resources
kubectl get examples

# View a specific Custom Resource
kubectl get example example1 -o yaml

# Delete a Custom Resource
kubectl delete example example1

Custom Controllers

หลังจากที่คุณสร้าง Custom Resource, คุณสามารถสร้าง Custom Controllers ที่จะช่วยในการจัดการหรือทำงานกับ Custom Resources ของคุณได้

  • Custom Controllers คือโปรแกรมที่ทำงานใน Kubernetes Cluster เพื่อสังเกตและจัดการ Custom Resources ตามที่คุณต้องการ
  • Operator คือรูปแบบหนึ่งของ Custom Controller ที่ใช้เพื่อจัดการ Resource และให้การทำงานอัตโนมัติสำหรับการตั้งค่าและดูแลรักษาแอปพลิเคชัน

Best Practices for CRDs

  1. Versioning:

    • ใช้ versioning สำหรับ CRD เพื่อจัดการการเปลี่ยนแปลงที่เกิดขึ้นใน Custom Resource เมื่อแอปพลิเคชันเติบโตและมีการปรับปรุง
  2. Validation:

    • กำหนด schema validation สำหรับ Custom Resource เพื่อให้แน่ใจว่าข้อมูลที่ถูกส่งเข้าไปมีความถูกต้องตามที่ต้องการ
  3. Naming Conventions:

    • ใช้ชื่อที่มีความหมายและตรงตามมาตรฐานในกลุ่มและชนิดของ Custom Resource เพื่อให้ง่ายในการจัดการและบำรุงรักษา
  4. Avoid Overuse:

    • ใช้ CRD สำหรับกรณีที่จำเป็นต้องขยาย Kubernetes API เพื่อให้เหมาะสมกับแอปพลิเคชันของคุณ แต่อย่าใช้ CRD มากเกินไปเพราะอาจทำให้ Kubernetes Cluster ซับซ้อนเกินไป
  5. Monitor and Audit:

    • ควรตั้งค่าและใช้งานเครื่องมือที่ช่วยในการตรวจสอบและตรวจสอบการใช้ Custom Resources และการเปลี่ยนแปลงใน CRDs เพื่อความปลอดภัยและการบำรุงรักษา

Conclusion

Custom Resource Definitions (CRDs) ช่วยให้คุณสามารถขยาย Kubernetes API เพื่อสร้าง Custom Resources ที่เหมาะสมกับความต้องการของแอปพลิเคชันหรือการใช้งานของคุณ การใช้ CRD ทำให้ Kubernetes สามารถจัดการกับทรัพยากรใหม่ๆ ที่ไม่ได้มีอยู่ใน Kubernetes โดยเริ่มต้น CRD รองรับการจัดการทรัพยากรที่เฉพาะเจาะจงและสามารถกำหนด Validation และ Schema ได้