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