spinny:~/writing $ vim introduction-to-kubernetes.md
1~2หากคุณทำงานในโลกของการพัฒนาซอฟต์แวร์ คุณคงเคยได้ยินเกี่ยวกับ Kubernetes แต่มันคืออะไรกันแน่ และทำไมจึงกลายเป็นมาตรฐานโดยพฤตินัยสำหรับการจัดการแอปพลิเคชันที่ทำงานบนคอนเทนเนอร์? คู่มือนี้จะพาคุณจากพื้นฐานไปสู่แนวคิดหลัก พร้อมตัวอย่างเชิงปฏิบัติและแผนภาพเพื่อช่วยให้คุณเข้าใจ3~4## ก่อน Kubernetes: ประวัติศาสตร์เล็กน้อย5~6เพื่อเข้าใจว่าทำไม Kubernetes จึงเป็นนวัตกรรม มาย้อนกลับไปดูกัน7~81. **การ Deploy แบบดั้งเดิม**: เดิมทีแอปพลิเคชันทำงานบนเซิร์ฟเวอร์จริง วิธีนี้มีราคาแพง ยากต่อการขยาย และเกิดปัญหาการแย่งทรัพยากร92. **การ Deploy แบบ Virtualized**: จากนั้น Virtual Machines (VMs) ก็มาถึง VMs ช่วยให้สามารถรันแอปพลิเคชันหลายตัวแยกจากกันบนฮาร์ดแวร์เดียวกัน ปรับปรุงการใช้ทรัพยากรและความปลอดภัย อย่างไรก็ตาม แต่ละ VM รันระบบปฏิบัติการทั้งระบบ ซึ่งใช้ทรัพยากรมาก103. **การ Deploy แบบ Containerized**: คอนเทนเนอร์ (เช่น Docker) คือวิวัฒนาการถัดไป พวกมันใช้ระบบปฏิบัติการของโฮสต์ร่วมกันแต่รันกระบวนการแยก มีน้ำหนักเบา เริ่มต้นเร็ว และพกพาได้11~12คอนเทนเนอร์แก้ปัญหาความสามารถในการพกพาแต่สร้างปัญหาอื่น: จะจัดการคอนเทนเนอร์หลายร้อย (หรือหลายพัน) ตัวในสภาพแวดล้อมการผลิตได้อย่างไร? จะมั่นใจได้อย่างไรว่าพวกมันทำงานอยู่เสมอ สื่อสารกันได้ และปรับขนาดตามโหลด?13~14นี่คือจุดที่ **Kubernetes** เข้ามา15~16## Kubernetes คืออะไร?17~18Kubernetes (มักย่อเป็น **K8s**) เป็นแพลตฟอร์มโอเพนซอร์สสำหรับการจัดการคอนเทนเนอร์ พูดง่ายๆ คือมันทำให้การ deploy การปรับขนาด และการจัดการแอปพลิเคชันบนคอนเทนเนอร์เป็นไปโดยอัตโนมัติ สร้างโดย Google และปัจจุบันดูแลโดย Cloud Native Computing Foundation (CNCF) Kubernetes กลายเป็นเครื่องมือหลักสำหรับทุกคนที่ทำงานกับ microservices ในขนาดใหญ่19~20## สถาปัตยกรรมของ Kubernetes Cluster21~22สภาพแวดล้อม Kubernetes เรียกว่า **cluster** Cluster ประกอบด้วยชุดของเครื่อง เรียกว่า **nodes** ซึ่งรันแอปพลิเคชันของเรา สถาปัตยกรรมแบ่งออกเป็นสองส่วนหลัก: Control Plane และ Worker Nodes23~24```mermaid25graph TD26 subgraph "Control Plane (Master)"27 A["API Server"]28 B["etcd"]29 C["Scheduler"]30 D["Controller Manager"]31 end32~33 subgraph "Worker Node 1"34 E["Kubelet"] --- F["Container Runtime"]35 G["Kube-proxy"]36 F --- H["Pod"]37 F --- I["Pod"]38 end39~40 subgraph "Worker Node 2"41 J["Kubelet"] --- K["Container Runtime"]42 L["Kube-proxy"]43 K --- M["Pod"]44 end45~46 A -- "Communicates with" --> E47 A -- "Communicates with" --> J48 User -- "kubectl" --> A49 C -- "Assigns Pods to Nodes" --> E50 D -- "Maintains state" --> A51 A -- "Saves/Reads state" --> B52```53~54### Control Plane55~56Control Plane คือ "สมอง" ของ cluster มันทำการตัดสินใจระดับสากล (เช่น การจัดตาราง) และตรวจจับและตอบสนองต่อเหตุการณ์ใน cluster ส่วนประกอบหลักคือ:57~58- **API Server (`kube-apiserver`)**: เป็นประตูสู่ cluster มันเปิดเผย Kubernetes API ซึ่งใช้โดยผู้ใช้ (ผ่าน `kubectl`) ส่วนประกอบของ cluster และเครื่องมือภายนอกในการสื่อสาร59- **etcd**: ฐานข้อมูล key-value ที่สอดคล้องและมีความพร้อมใช้งานสูง เก็บข้อมูลทั้งหมดของ cluster แสดงสถานะที่ต้องการและปัจจุบันของระบบ60- **Scheduler (`kube-scheduler`)**: กำหนด Pods ที่สร้างใหม่ให้กับ Worker Node ที่มีอยู่ โดยพิจารณาจากความต้องการทรัพยากร นโยบาย และข้อจำกัดอื่นๆ61- **Controller Manager (`kube-controller-manager`)**: รัน controllers ซึ่งเป็นลูปควบคุมที่เฝ้าดูสถานะของ cluster และทำงานเพื่อนำไปสู่สถานะที่ต้องการ ตัวอย่างเช่น `Node Controller` จัดการ nodes ในขณะที่ `Replication Controller` รับรองว่าจำนวน Pods ที่ถูกต้องกำลังทำงาน62~63### Worker Node64~65Worker Nodes คือเครื่อง (จริงหรือเสมือน) ที่แอปพลิเคชันทำงานจริง แต่ละ node ถูกจัดการโดย Control Plane และประกอบด้วยส่วนประกอบต่อไปนี้:66~67- **Kubelet**: เอเจนต์ที่ทำงานบนแต่ละ node รับรองว่าคอนเทนเนอร์ที่อธิบายใน Pods กำลังทำงานและมีสุขภาพดี68- **Kube-proxy**: พร็อกซีเครือข่ายที่จัดการกฎเครือข่ายบน nodes ช่วยให้การสื่อสารเครือข่ายไปยัง Pods จากเซสชันเครือข่ายภายในหรือภายนอก cluster69- **Container Runtime**: ซอฟต์แวร์ที่รับผิดชอบการรันคอนเทนเนอร์ Docker เป็นที่รู้จักมากที่สุด แต่ Kubernetes ยังรองรับ runtime อื่นๆ เช่น `containerd` และ `CRI-O`70~71## Object พื้นฐานของ Kubernetes72~73ใน Kubernetes ทุกอย่างแสดงด้วย **objects** Objects เหล่านี้คือ "บันทึกเจตนา": เมื่อคุณสร้าง object Kubernetes จะทำงานอย่างต่อเนื่องเพื่อให้แน่ใจว่ามันมีอยู่และตรงกับสถานะที่ต้องการ74~75นี่คือสิ่งที่สำคัญที่สุด:76~77### Pod78~79**Pod** คือหน่วยการทำงานเล็กที่สุดใน Kubernetes มันแสดงถึงคอนเทนเนอร์หนึ่งตัวหรือมากกว่าที่ทำงานร่วมกันบน node เดียวกัน แชร์ทรัพยากรเช่น เครือข่ายและพื้นที่จัดเก็บ80~81โดยทั่วไปคุณรันคอนเทนเนอร์เพียงตัวเดียวต่อ Pod แต่ในสถานการณ์ขั้นสูง (เช่น "sidecar containers" สำหรับ logging หรือ monitoring) คุณอาจมีมากกว่านั้น82~83คุณแทบจะไม่เคยสร้าง Pods โดยตรง คุณใช้ abstraction ระดับสูงกว่าเช่น Deployments84~85### Deployment86~87**Deployment** คือ object ที่คุณจะใช้บ่อยที่สุด มันอธิบายสถานะที่ต้องการสำหรับกลุ่มของ Pods ที่เหมือนกัน Deployment controller รับผิดชอบ:88~89- สร้างและจัดการ **ReplicaSet** (object อีกตัวที่รับรองว่าจำนวนสำเนาเฉพาะของ Pod จะทำงานอยู่เสมอ)90- **ปรับขนาด** จำนวน Pods ขึ้นหรือลง91- จัดการ **อัปเดต** แอปพลิเคชันในลักษณะที่ควบคุมได้ (เช่น *Rolling Update*) โดยไม่มีเวลาหยุดทำงาน92~93ตัวอย่างไฟล์ YAML สำหรับ Deployment ที่รัน 3 สำเนาของ NGINX server:94~95```yaml96# nginx-deployment.yaml97apiVersion: apps/v198kind: Deployment99metadata:100 name: nginx-deployment101spec:102 replicas: 3103 selector:104 matchLabels:105 app: nginx106 template:107 metadata:108 labels:109 app: nginx110 spec:111 containers:112 - name: nginx113 image: nginx:1.14.2114 ports:115 - containerPort: 80116```117~118### Service119~120Pods ใน Kubernetes เป็นชั่วคราว: สามารถสร้างและทำลายได้ตลอดเวลา แต่ละ Pod มี IP address ของตัวเอง แต่ IP นี้ไม่เสถียร แล้วเราจะ expose แอปพลิเคชันอย่างน่าเชื่อถือได้อย่างไร?121~122ด้วย **Service** Service คือ abstraction ที่กำหนดชุดตรรกะของ Pods และนโยบายในการเข้าถึง มันให้ **จุดเข้าถึงที่เสถียร** (IP address เสมือนและชื่อ DNS) สำหรับกลุ่ม Pods123~124```mermaid125graph TD126 subgraph "Service (nginx-service)"127 A["ClusterIP: 10.96.0.10"]128 end129~130 subgraph "Pods"131 B("Pod 1 - IP: 192.168.1.2")132 C("Pod 2 - IP: 192.168.1.3")133 D("Pod 3 - IP: 192.168.1.4")134 end135~136 A -- "Selector: app=nginx" --> B137 A -- "Selector: app=nginx" --> C138 A -- "Selector: app=nginx" --> D139~140 Client -- "Request to nginx-service" --> A141```142~143Service ใช้ `selector` ที่ใช้ `labels` เพื่อค้นหา Pods ที่ควรส่งต่อทราฟฟิก144~145วิธีสร้าง Service สำหรับ NGINX Deployment ของเรา:146~147```yaml148# nginx-service.yaml149apiVersion: v1150kind: Service151metadata:152 name: nginx-service153spec:154 selector:155 app: nginx156 ports:157 - protocol: TCP158 port: 80159 targetPort: 80160 type: ClusterIP # Default - exposes the service only within the cluster161```162~163มี Service หลายประเภท:164- `ClusterIP`: Expose service บน IP ภายใน cluster (ค่าเริ่มต้น)165- `NodePort`: Expose service บน port คงที่บนแต่ละ Worker Node166- `LoadBalancer`: สร้าง load balancer ภายนอกใน cloud provider (เช่น AWS, GCP) และกำหนด IP สาธารณะให้ service167~168### Ingress169~170Service แบบ `LoadBalancer` ดีมาก แต่การสร้างหนึ่งตัวสำหรับแต่ละ service อาจมีราคาแพง เพื่อ expose หลาย service HTTP/HTTPS สู่โลกภายนอก คุณใช้ **Ingress**171~172Ingress ทำหน้าที่เป็น "เราเตอร์อัจฉริยะ" สำหรับทราฟฟิกภายนอก ช่วยให้คุณกำหนดกฎเส้นทางตาม host (เช่น `api.mysite.com`) หรือ path (เช่น `mysite.com/api`)173~174```mermaid175graph LR176 User -- "mysite.com/api" --> Ingress177 User -- "mysite.com/ui" --> Ingress178~179 subgraph "Cluster"180 Ingress -- "/api" --> ServiceA("api-service")181 Ingress -- "/ui" --> ServiceB("ui-service")182~183 ServiceA --> PodA1("API Pod 1")184 ServiceA --> PodA2("API Pod 2")185~186 ServiceB --> PodB1("UI Pod 1")187 ServiceB --> PodB2("UI Pod 2")188 end189```190~191ตัวอย่าง Ingress:192```yaml193# example-ingress.yaml194apiVersion: networking.k8s.io/v1195kind: Ingress196metadata:197 name: example-ingress198spec:199 rules:200 - host: mysite.com201 http:202 paths:203 - path: /api204 pathType: Prefix205 backend:206 service:207 name: api-service208 port:209 number: 8080210 - path: /ui211 pathType: Prefix212 backend:213 service:214 name: ui-service215 port:216 number: 3000217```218~219### Object ที่เป็นประโยชน์อื่นๆ220~221- **Namespace**: ช่วยให้สร้าง "cluster เสมือน" ภายใน cluster จริง มีประโยชน์สำหรับการแยกสภาพแวดล้อม (เช่น `development`, `staging`, `production`) หรือทีม222- **ConfigMap และ Secret**: สำหรับจัดการข้อมูลการกำหนดค่าและความลับ (เช่น รหัสผ่านหรือ API key) แยกจาก container image223- **StatefulSet**: คล้ายกับ Deployment แต่เฉพาะสำหรับแอปพลิเคชันที่มีสถานะ (เช่น ฐานข้อมูล) ที่ต้องการ network identity ที่เสถียรและ persistent storage224- **PersistentVolume (PV) และ PersistentVolumeClaim (PVC)**: สำหรับจัดการ persistent storage ใน cluster225~226## บทสรุป227~228Kubernetes เป็นเครื่องมือที่ทรงพลังอย่างเหลือเชื่อ แต่เส้นโค้งการเรียนรู้อาจสูงชัน คู่มือนี้เพียงแตะผิวเผิน แต่หวังว่าจะให้ความเข้าใจที่มั่นคงเกี่ยวกับแนวคิดพื้นฐาน229~230**ทำอะไรต่อ?**231- **ทดลองในเครื่อง**: ติดตั้ง [Minikube](https://minikube.sigs.k8s.io/docs/start/) หรือ [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/) เพื่อสร้าง Kubernetes cluster บนคอมพิวเตอร์ของคุณ232- **ใช้ `kubectl`**: ทำความคุ้นเคยกับคำสั่ง `kubectl` เครื่องมือหลักของคุณสำหรับการโต้ตอบกับ cluster ลองสร้าง NGINX Deployment และ Service จากบทความนี้233- **สำรวจบทช่วยสอนอย่างเป็นทางการ**: [เอกสาร Kubernetes](https://kubernetes.io/docs/tutorials/) เป็นแหล่งข้อมูลที่ยอดเยี่ยมเต็มไปด้วยตัวอย่าง234~235การจัดการคอนเทนเนอร์เป็นทักษะพื้นฐานในโลก cloud-native และการเชี่ยวชาญ Kubernetes จะเปิดโลกแห่งความเป็นไปได้ สนุกกับมัน!236~
NORMAL · introduction-to-kubernetes.md [readonly]236 lines · :q to close