Kubernestes concepts

Kubernestes (เรียกสั้นๆโดยทั่วกันว่า Kube) เป็น Docker orchestrator ตัวนึงของ Google และเริ่มเป็น dominated trend ของปี 2020

Concepts

Concept ของ Kube แบ่งเป็นหลายเรื่องซึ่งสามารถอ่านรายละเอียดได้ใน Kubernestes Concept Page แต่สรุปคร่าวๆได้แบบนี้

Components

  • Node - หมายถึงเครื่องคอมพิวเตอร์ที่อยู่ใน cluster ของ Kubernestes
  • Pod - อธิบายคร่าวๆ หมายถึงหน่วยการทำงานที่เล็กที่สุดของ Kube ใน Pod เอง สามารถมีได้หลาย Docker container โดยที่ container ใน Pod เดียวกันจะเสมือนทำงานในเครื่องคอมพิวเตอร์เดียวกัน​ (นั่นคือ สามารถติดต่อกันได้ผ่าน loopback interface)
  • Deployment - การสร้าง Pod สามารถทำได้หลายวิธี โดยสร้างตรงๆก็ได้ หรือในทางปฏิบัติ ควรสร้างผ่าน Deployment controller (ในเอกสารอ้างถึงว่ามันเชื่อมโยงกับ ReplicaSet controller ไม่แน่ใจว่าทำไมถึงเรียกแยกกัน) โดย Deployment สามารถระบุจำนวน Pod สำหรับการทำ resiliency ได้
  • Service - การที่จะ expose Pod ออกจาก Kube cluster จะต้องสร้างทางผ่าน ในที่นี้คือ Service ซึ่งเป็น spec ระบุ port mapping ที่ต้องการ expose
  • Volume - storage ใน Kube ไม่ใช่เป็นการแค่ map path เข้ากับ Docker host แต่มีเรื่อง lifetime, sharing, dynamic allocation, etc. แต่ง่ายสุดคือการใช้ Persistent volume

Volumes

Volume (ref: https://kubernetes.io/docs/concepts/storage/volumes/) สามารถแบ่งตาม "scope" ของการจัดเก็บได้ดังนี้

  • Pod level
  • Host level
  • Network level

Pod level volume

emptyDir เป็น volume ระดับ Pod ซึ่ง map เข้ากับตัว container ของ Pod เอง ความพิเศษของมันคือ volume นี้ จะ share กันระหว่าง containers ใน Pod เดียวกัน

Host level volume

Persistent volume/claim เป็น volume ที่สามารถ map เข้ากับ host โดยผ่าน hostPath

Network level colume

ตัวอย่างเช่น nfs

Specification

Kube config components ต่างๆโดยผ่าน "spec template" แต่ละ component ก็จะมีวิธีเขียน spec ของตนเอง แต่ spec เองก็มีส่วนที่เขียนร่วมกัน เช่น apiVersion, kind, หรือ metadata

Example

apiVersion: v1
kind: PersistentVolume
metadata:
  name: couchbase-storage
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 4Gi
  hostPath:
    path: /data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: couchbase-storage-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  selector:
    matchLabels:
      name: couchbase-storage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: couchbase-deployment
  labels:
    app: couchbase
spec:
  selector:
    matchLabels:
      app: couchbase
  template:
    metadata:
      labels:
        app: couchbase
    spec:
      containers:
      - name: couchbase
        image: couchbase:community
        ports:
        - containerPort: 8091
        - containerPort: 8092
        - containerPort: 8093
        - containerPort: 8094
        - containerPort: 11210
        volumeMounts:
        - mountPath: /opt/couchbase/var
          name: couchbase
      volumes:
      - name: couchbase
        persistentVolumeClaim:
          claimName: couchbase-storage-claim
---
apiVersion: v1
kind: Service
metadata:
  name: couchbase
spec:
  selector:
    app: couchbase
  type: NodePort
  ports:
    - protocol: TCP
      port: 8091
      nodePort: 30000
      name: web
    - protocol: TCP
      port: 8092
      nodePort: 30001
      name: port-8092
    - protocol: TCP
      port: 8093
      nodePort: 30002
      name: port-8093
    - protocol: TCP
      port: 8094
      nodePort: 30003
      name: port-8094
    - protocol: TCP
      port: 11210
      nodePort: 30004
      name: port-11210