แผนการเรียนรู้
/

สัปดาห์ที่ 10: Introduction to Container Orchestration with Kubernetes

ก้าวข้ามขีดจำกัดของการรันคอนเทนเนอร์แบบเดี่ยว สู่การบริหารจัดการ Cluster ระดับ Enterprise ด้วย K8s

Agenda วันนี้

  • Problems: ปัญหาของการจัดการ Docker Compose ใน Production
  • Concepts: Container Orchestration คืออะไร?
  • Kubernetes: แนะนำ K8s และสถาปัตยกรรม (Master & Worker Nodes)
  • Deep Dive: Kubelet และ Kube-proxy
  • Core Components: Pods, Deployments, Services, Namespaces
  • Configuration: โครงสร้าง YAML syntax สำหรับ Kubernetes Manifests
DevOps Course: Week 10

ทบทวน: การทำงานของ Docker เบื้องต้น

เราได้เรียนรู้การนำแอปพลิเคชันใส่ลงในกล่อง (Container)

Image

พิมพ์เขียวของแอปฯ ที่รวมโค้ดและไลบรารีทุกอย่างไว้

Container

แอปฯ ที่กำลังรันอยู่ แยกขาดจากระบบหลัก

Docker Compose

เครื่องมือรันหลายคอนเทนเนอร์พร้อมกันบนเครื่องเดียว

ปัญหาของการใช้ Docker Compose ใน Production

เหมาะกับ Dev แต่ไม่พอสำหรับ Prod

คำสั่ง `docker-compose up` หรือ `docker run` อาจจะเพียงพอสำหรับการทดสอบแอปพลิเคชันในสภาพแวดล้อมการพัฒนา (Development Environment) เท่านั้น

  • Single Host: Docker Compose รันคอนเทนเนอร์ทั้งหมดบน Server (Node) เพียงเครื่องเดียว
  • Single Point of Failure: ถ้า Server เครื่องนั้นดับ แอปพลิเคชันทั้งหมดก็จะใช้งานไม่ได้ทันที

ความต้องการระดับ Enterprise

📈

Scalability

เมื่อมีผู้ใช้งานเพิ่มขึ้นอย่างมหาศาล การขยาย (Scale) คอนเทนเนอร์อยู่บนเครื่องเดียวจะทำให้ทรัพยากร (CPU/RAM) ไม่เพียงพอ

🛡️

High Availability (HA)

ในสถานการณ์ Production ระดับ Enterprise ระบบต้องการความพร้อมใช้งานสูง (HA) และการบริหารจัดการที่สามารถ Load Balance ข้ามหลายเซิร์ฟเวอร์ พร้อมระบบกู้คืนอัตโนมัติ (Intelligent Failovers)

Container Orchestration คืออะไร?

แพลตฟอร์ม Orchestration จะช่วยขยายขีดความสามารถในการจัดการวงจรชีวิต (Lifecycle) ให้กับแอปพลิเคชันที่ซับซ้อนและมีหลายคอนเทนเนอร์ที่ถูก Deploy ไว้บน Cluster ของเครื่องโฮสต์หลายๆ เครื่อง

กระบวนการของ Orchestration เกี่ยวข้องกับเครื่องมือที่สามารถทำงานแบบอัตโนมัติ (Automate) ครอบคลุมตั้งแต่การวางคอนเทนเนอร์เริ่มต้น การย้ายคอนเทนเนอร์ไปยังโฮสต์อื่นตามความเหมาะสม ไปจนถึงการ Scale และทำ Failover

เครื่องมือ Orchestrators ในตลาด

มีซอฟต์แวร์หลายตัวที่เกิดมาเพื่อแก้ปัญหานี้

Docker Swarm

มาพร้อมกับ Docker ใช้งานง่าย แต่ฟีเจอร์อาจไม่ซับซ้อนเท่าตัวอื่น

Mesosphere DC/OS

สร้างมาจาก Apache Mesos เหมาะสำหรับ Datacenter ขนาดใหญ่

Kubernetes

ผู้นำตลาดปัจจุบันที่สร้างโดย Google กลายเป็นมาตรฐานหลักของอุตสาหกรรม

☸️

Kubernetes (K8s) คืออะไร?

Kubernetes เป็นแพลตฟอร์มแบบ Open-source สำหรับทำระบบอัตโนมัติในการ Deploy, Scale และจัดการแอปพลิเคชันที่เป็นคอนเทนเนอร์ ข้ามกลุ่มของโฮสต์ (Clusters of hosts)

*มักถูกเรียกย่อๆ ว่า K8s (K ตามด้วยตัวอักษร 8 ตัว และจบด้วย s)

หน้าที่หลักของ Kubernetes

Service Discovery & Load Balancing

กระจาย Traffic ไม่ให้คอนเทนเนอร์ตัวใดตัวหนึ่งรับโหลดหนักเกินไป

Storage Orchestration

จัดการเชื่อมต่อ Storage (เช่น Local, AWS EBS, NFS) เข้ากับแอปฯ อัตโนมัติ

Automated Rollouts & Rollbacks

อัปเดตแอปเวอร์ชันใหม่แบบไม่สะดุด และถอยกลับได้ทันทีถ้าพัง

Self-healing

รีสตาร์ทคอนเทนเนอร์ที่พัง หรือย้ายไปเครื่องอื่นเมื่อโฮสต์มีปัญหา

สถาปัตยกรรมของ Kubernetes

ระบบถูกออกแบบเป็น Cluster ที่แบ่งเป็น 2 ส่วนหลักๆ

Master Node

(Control Plane)

ทำหน้าที่เป็นสมองสั่งการ จัดการและควบคุมภาพรวมของ Cluster

↔️

Worker Node 1

Worker Node 2

องค์ประกอบของ Master Node (Control Plane)

kube-apiserver

ประตูหน้าบ้านของ K8s ทุกการสื่อสาร (UI, CLI) ต้องวิ่งผ่านตัวนี้

etcd

ฐานข้อมูล Key-Value ความเร็วสูง เก็บข้อมูลสถานะทั้งหมดของ Cluster (Source of Truth)

kube-scheduler

ทำหน้าที่ตัดสินใจว่า คอนเทนเนอร์ตัวใหม่ ควรไปรันที่ Worker Node เครื่องไหน

kube-controller-manager

คอยตรวจสอบว่าระบบทำงานตรงตามสถานะที่ผู้ใช้ต้องการหรือไม่ (Desired State)

องค์ประกอบของ Worker Node

คอมพิวเตอร์ลูกข่ายที่รับหน้าที่รันแอปพลิเคชัน (Workloads) จริงๆ

🤖
Kubelet

เอเจนต์ที่รับคำสั่งจาก Master Node

🌐
Kube-proxy

จัดการกฎด้าน Network และการสื่อสาร

🐳
Container Runtime

ตัวรันคอนเทนเนอร์ (เช่น containerd, CRI-O, Docker)

เจาะลึก: Kubelet

"ผู้จัดการประจำสาขา"

  • เป็น Agent หลักที่รันอยู่บนแต่ละ Worker Node
  • รับประกันว่าคอนเทนเนอร์ต่างๆ ทำงานอยู่ใน "Pod" ตามที่ได้รับคำสั่งจาก Master (kube-apiserver)
  • คอยตรวจสอบสถานะ (Health check) ของคอนเทนเนอร์บนเครื่องตัวเอง แล้วรายงานกลับไปยัง Master เสมอ

เจาะลึก: Kube-proxy

"เจ้าหน้าที่จราจรเครือข่าย"

  • รันอยู่บนทุกๆ Worker Node
  • ทำหน้าที่รักษากฎของ Network (Network Rules) ภายในโฮสต์
  • เปิดให้คอนเทนเนอร์สื่อสารกันเองได้ใน Cluster หรือสื่อสารกับโลกภายนอก (Internet)
  • ทำงานร่วมกับ Service (องค์ประกอบที่เราจะพูดถึงต่อไป) เพื่อจัดการ Load Balancing

Kubernetes Core Components

ใน Kubernetes เราไม่สั่งงานโดยตรงไปที่ Container แต่เราสั่งผ่านสิ่งที่เรียกว่า "Objects"

📦 Pods
🔄 Deployments
🔌 Services
🏢 Namespaces

1. Pods 📦

Kubernetes จะจัดกลุ่มคอนเทนเนอร์ที่ทำงานร่วมกันเป็นแอปพลิเคชัน ให้อยู่ในหน่วยทางตรรกะ (Logical units) เดียวกันเพื่อการจัดการที่ง่ายขึ้น

จุดเด่นของ Pods:

  • เป็น หน่วยที่เล็กที่สุด ใน Kubernetes ที่เราสามารถ Deploy ได้
  • 1 Pod สามารถมี 1 Container (ปกติ) หรือ หลาย Containers (เช่น ตัวหลัก + ตัวดึง Log)
  • คอนเทนเนอร์ใน Pod เดียวกัน จะแชร์ IP Address, Network, และ Storage (Volumes) เหมือนอยู่ในคอมพิวเตอร์เครื่องเดียวกันเป๊ะ

เปรียบเทียบ: Pods กับ Containers

🐳

Container

ตัวแอปพลิเคชัน

Pod IP: 10.1.x.x
🐳
🐳

Pod

กล่องหุ้ม Container

*Kubernetes ไม่สนว่าข้างในรันด้วย Docker หรือ Container Runtime อื่น แต่มันจัดการผ่าน Pod

2. Deployments 🔄

ในความเป็นจริง เราไม่ค่อยสั่งสร้าง Pod ขึ้นมาตรงๆ เพราะถ้า Pod ตาย มันก็ตายไปเลย ไม่ฟื้นขึ้นมาใหม่

หน้าที่ของ Deployment:

  • ควบคุมการสร้าง Pod และ รับประกันจำนวนสำเนา (Replicas) ให้อยู่ครบตามที่สั่งเสมอ
  • ถ้า Pod พัง Deployment จะสั่งรัน Pod ใหม่มาแทนที่อัตโนมัติ (Self-healing)
  • รองรับการอัปเดตเวอร์ชันใหม่ (Rolling Updates) และสามารถ Rollback กลับได้อย่างรวดเร็ว

Deployment: "Desired State"

คุณแค่บอกว่า "อยากได้อะไร" เดี๋ยว K8s จัดการให้เอง

Desired State

"ฉันขอ Pod ของ Nginx 3 ตัว"

⚖️

Current State

"ตอนนี้มี Pod รันอยู่แค่ 2 ตัว (อีกตัวพัง)"

➡ K8s Controller จะตรวจพบความต่าง และสั่งสร้าง Pod เพิ่มอีก 1 ตัวทันที!

3. Services 🔌

"ปัญหาของ Pod คือ IP ไม่คงที่"

เวลา Deployment สร้าง Pod ใหม่ขึ้นมาแทนตัวที่พัง IP Address ของ Pod นั้นจะเปลี่ยนไปเสมอ ทำให้ส่วนอื่นของระบบ (เช่น Frontend) ไม่รู้ว่าจะต้องส่ง Request ไปที่ IP ไหน

หน้าที่ของ Service:

  • สร้าง IP Address กลางที่ คงที่ (Static) และชื่อ DNS ให้กับกลุ่มของ Pods
  • ทำหน้าที่เป็น Load Balancer กระจายทราฟฟิกไปยัง Pod ย่อยๆ ทุกตัว

ประเภทของ Service (Service Types)

ClusterIP (Default)

ให้ IP ภายใน Cluster คุยกันเองได้เท่านั้น 외부 (Internet) เข้าถึงไม่ได้ เหมาะสำหรับ Database

NodePort

เปิด Port เฉพาะ (30000-32767) บนทุกๆ Worker Node สามารถเข้าถึงผ่าน `NodeIP:NodePort`

LoadBalancer

สั่งให้ Cloud Provider (เช่น AWS, Azure) จ่าย External IP เพื่อรับ Traffic จาก Internet โดยตรง

4. Namespaces 🏢

เปรียบเสมือน "Cluster เสมือน (Virtual Clusters)" ที่ซ้อนอยู่ใน Cluster จริง

ช่วยในการแบ่งขอบเขตและแยก Resource ออกจากกัน เหมาะสำหรับ:

  • แบ่ง Environment: เช่น namespace `dev`, `staging`, `production`
  • แบ่งทีมทำงาน: ทีม A มองไม่เห็น Pod ของ ทีม B (Multi-tenant)
  • จัดการทรัพยากร: สามารถจำกัด (Quota) CPU/RAM สูงสุดในแต่ละ Namespace ได้

YAML Syntax สำหรับ Kubernetes

การสั่งงาน K8s เราจะไม่ค่อยใช้คำสั่ง Command line ตรงๆ (Imperative) แต่เราจะเขียนไฟล์ Manifests ด้วยภาษา YAML (Declarative)

"บอก K8s ว่าผลลัพธ์สุดท้ายที่ต้องการคืออะไร แล้วปล่อยให้ระบบจัดการที่เหลือเอง"

ข้อดี: สามารถเก็บไฟล์ YAML ไว้ใน Git (Version Control) เพื่อติดตามการแก้ไข และทำ GitOps ได้

โครงสร้างพื้นฐานของ Kubernetes YAML

ทุกๆ Manifest file ใน K8s จะต้องประกอบด้วย 4 ส่วนสำคัญ (Root fields):

apiVersion:

ระบุเวอร์ชันของ API K8s (เช่น v1, apps/v1)

kind:

ชนิดของ Object (เช่น Pod, Deployment, Service)

metadata:

ข้อมูลระบุตัวตน (เช่น name, labels, namespace)

spec:

สเปคที่ต้องการให้ทำงาน (เช่น container image, จำนวน replicas, พอร์ต)

ตัวอย่าง YAML: Deployment

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

spec:

  replicas: 3 # ขอ 3 สำเนา

  selector:

    matchLabels:

      app: nginx

  template: # (ข้อมูลส่วนของ Pod)

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:latest

        ports:

        - containerPort: 80

ตัวอย่าง YAML: Service

apiVersion: v1

kind: Service

metadata:

  name: nginx-service

spec:

  type: LoadBalancer # ขอ IP ภายนอก

  selector:

    app: nginx # ค้นหา Pod ที่มีป้ายชื่อ (label) นี้

  ports:

    - protocol: TCP

      port: 80 # พอร์ตของ Service

      targetPort: 80 # พอร์ตของ Container

นำ YAML ไปใช้งานจริงด้วย `kubectl`

เมื่อเขียน YAML เสร็จ เราจะใช้เครื่องมือ `kubectl` ในการสั่งรัน K8s

# คำสั่งเวทมนตร์ (สร้างทุกอย่างตามที่ระบุในไฟล์)

$ kubectl apply -f nginx-deployment.yaml

deployment.apps/nginx-deployment created


# ตรวจสอบว่า Pod รันขึ้นมาหรือยัง

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

nginx-deployment-7fb96c846b-xyz12 1/1 Running 0 10s

nginx-deployment-7fb96c846b-abc34 1/1 Running 0 10s

nginx-deployment-7fb96c846b-def56 1/1 Running 0 10s

Kubernetes Ecosystem ในคลาวด์

การติดตั้ง K8s ด้วยตัวเองตั้งแต่ศูนย์ (The Hard Way) ค่อนข้างซับซ้อน ปัจจุบัน Cloud Providers มักจะให้บริการ Managed Kubernetes เพื่อดูแล Master Node ให้เรา:

  • GKE (Google Kubernetes Engine): บริการ K8s จากผู้สร้าง ถือว่าเสถียรที่สุดตัวหนึ่ง
  • EKS (Amazon Elastic Kubernetes Service): บริการที่คนใช้เยอะที่สุดสำหรับผู้ใช้ AWS
  • AKS (Azure Kubernetes Service): ตัวเลือกหลักบน Microsoft Azure

*ผู้พัฒนาเพียงแค่กำหนด Worker Node และสั่งงานผ่าน `kubectl` ทำให้ชีวิตง่ายขึ้นมหาศาล

สรุปบทเรียน (Summary)

ปัญหาของ Docker Compose: ไม่ตอบโจทย์ระดับ Prod ขาดความสามารถในการ Scale และทำ HA ข้ามหลายโฮสต์
Kubernetes (K8s): คือ Orchestrator ที่ช่วยจัดการคอนเทนเนอร์จำนวนมากอัตโนมัติ
Architecture: Master สั่งการ ส่วน Worker (มี Kubelet/Kube-proxy) ทำงานรัน Container
Core Components: Pod = หน่วยย่อย, Deployment = ควบคุม Replica, Service = Network
YAML Manifests: สั่งงานแบบ Declarative ระบุ Desired State แล้วให้ K8s ทำให้เป็นจริง
💬

Q & A

มีคำถามเกี่ยวกับ Kubernetes Architecture หรือ Concepts ไหมครับ?

เตรียมตัวทำ Lab! ☸️

Next: Hands-on Kubernetes

ในส่วนปฏิบัติการถัดไป เราจะนำทฤษฎีมาลองปฏิบัติจริง โดยการจำลอง K8s Cluster ลงบนเครื่องคอมพิวเตอร์ของคุณ!

  • ติดตั้งโปรแกรมจำลอง Cluster (เลือกใช้ Minikube หรือ K3s)
  • ทดลองใช้ kubectl CLI เบื้องต้น
  • สร้างและ Deploy Pod แรกของคุณ (Nginx)
  • สร้าง Service เพื่อ Expose เว็บไซต์ให้ออกสู่ภายนอก
สิ่งที่ต้องเตรียม: RAM อย่างน้อย 4GB และพื้นที่ว่างในฮาร์ดดิสก์

Lab: Hello Kubernetes ☸️

จำลอง K8s Cluster บนเครื่องส่วนตัว และทดลอง Deploy แอปพลิเคชันแรกของคุณ

🎯 เป้าหมายของ Lab

  • ✅ ติดตั้งและเริ่มต้นใช้งาน Minikube (หรือ K3s) เป็น Local Cluster
  • ✅ ทำความคุ้นเคยกับคำสั่งพื้นฐานของ kubectl CLI
  • ✅ เขียนไฟล์ YAML เพื่อสร้างและ Deploy Nginx Pod
  • ✅ สร้าง Service (NodePort) เพื่อ Expose เว็บไซต์ให้ออกสู่ภายนอก

Step 1: จำลอง Cluster ด้วย Minikube

Minikube เป็นเครื่องมือที่ใช้สร้าง K8s Cluster แบบ 1-Node (รวม Master/Worker ในตัว) สำหรับใช้พัฒนาและทดสอบบนเครื่องส่วนตัว (มี Docker เป็น Prerequisites)

# 1. เปิด Terminal (หรือ PowerShell/WSL) แล้วพิมพ์คำสั่งเริ่มต้น Minikube

$ minikube start


# ผลลัพธ์ที่ควรจะเห็น (อาจใช้เวลาดาวน์โหลด Image สักพักในครั้งแรก):

😄 minikube vX.X.X on ...

✨ Automatically selected the docker driver

🐳 Starting control plane node minikube in cluster minikube

🚜 Pulling base image ...

🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

*หมายเหตุ: หากเครื่องของคุณสเปคน้อย สามารถเลือกใช้ K3s หรือ K3d เป็นทางเลือกที่เบากว่าได้

Step 2: ตรวจสอบ Cluster ด้วย kubectl

kubectl คือไม้กายสิทธิ์ของเราในการสั่งงาน Kubernetes ลองใช้คำสั่งเพื่อเช็คสถานะ Cluster กัน

# 1. ดูข้อมูลการเชื่อมต่อของ Cluster

$ kubectl cluster-info

Kubernetes control plane is running at https://127.0.0.1:XXXXX

CoreDNS is running at https://127.0.0.1:XXXXX/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy


# 2. ตรวจสอบโหนด (Nodes) ที่รันอยู่

$ kubectl get nodes

NAME STATUS ROLES AGE VERSION

minikube Ready control-plane 2m v1.x.x

✅ ถ้าสถานะ Node เป็น Ready แสดงว่าพร้อมสำหรับ Deploy แอปพลิเคชันแล้ว!

Step 3: เขียนไฟล์ YAML สำหรับ Pod

เราจะใช้วิธีแบบ Declarative โดยการเขียนไฟล์ YAML เพื่อบอก K8s ว่าเราต้องการรัน Nginx (Web Server)

# สร้างไฟล์ชื่อ nginx-pod.yaml

$ nano nginx-pod.yaml


apiVersion: v1

kind: Pod

metadata:

  name: my-nginx-pod # ชื่อของ Pod

  labels:

    app: web # ป้ายกำกับ (สำคัญมากตอนทำ Service)

spec:

  containers:

  - name: nginx-container

    image: nginx:latest # ดึง Image Nginx จาก Docker Hub

    ports:

    - containerPort: 80 # พอร์ตที่คอนเทนเนอร์ทำงาน

Step 4: สั่ง Deploy Pod และตรวจสอบสถานะ

นำไฟล์ YAML ไปรันบน Kubernetes Cluster และคอยดูสถานะการสร้าง Pod

# 1. Apply ไฟล์ YAML

$ kubectl apply -f nginx-pod.yaml

pod/my-nginx-pod created


# 2. ดูสถานะของ Pods ทั้งหมด (อาจจะขึ้น ContainerCreating รอสักครู่)

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

my-nginx-pod 1/1 Running 0 15s


# 3. ขอดูรายละเอียดเชิงลึกของ Pod (เอาไว้ใช้เวลา Error)

$ kubectl describe pod my-nginx-pod

Step 5: เขียนไฟล์ YAML สำหรับ Service

ถึง Pod จะรันแล้ว แต่เราจะเข้าเว็บจากเบราว์เซอร์เราไม่ได้ เพราะมันอยู่ใน Private IP ของ K8s! เราต้องสร้าง Service ชนิด NodePort เพื่อเจาะช่องโหว่ (Expose) ออกมา

# สร้างไฟล์ชื่อ nginx-svc.yaml

$ nano nginx-svc.yaml


apiVersion: v1

kind: Service

metadata:

  name: nginx-service

spec:

  type: NodePort # เปิดพอร์ตที่ระดับ Node (เครื่อง Minikube)

  selector:

    app: web # 🌟 ตรงนี้ต้องตรงกับ Label ของ Pod! (app: web)

  ports:

    - port: 80 # พอร์ตของ Service

      targetPort: 80 # พอร์ตของ Container (Nginx)

      nodePort: 30080 # พอร์ตที่จะถูกเปิดให้เข้าถึงได้จากภายนอก (30000-32767)

Step 6: สร้าง Service และตรวจสอบ

Deploy ตัว Service ขึ้นไปบน Cluster เพื่อเชื่อมต่อกับ Pod ที่รันอยู่

# 1. Apply ไฟล์ Service YAML

$ kubectl apply -f nginx-svc.yaml

service/nginx-service created


# 2. ตรวจสอบสถานะของ Services

$ kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 30m nginx-service NodePort 10.105.x.x 80:30080/TCP 10s

สังเกตว่า nginx-service ถูกสร้างขึ้นมาและชี้ Port 80 ไปที่พอร์ตภายนอก 30080 แล้ว

Step 7: ทดสอบเข้าถึงเว็บ (Access Nginx)

Minikube มีเครื่องมืออำนวยความสะดวกในการหา IP และ Port เพื่อเปิดเว็บไซต์ผ่านเบราว์เซอร์อัตโนมัติ

# พิมพ์คำสั่งนี้ใน Terminal

$ minikube service nginx-service


|-----------|---------------|-------------|

| NAMESPACE | NAME | TARGET PORT |

|-----------|---------------|-------------|

| default | nginx-service | 80 |

|-----------|---------------|-------------|

🎉 Opening service default/nginx-service in default browser...

🎉 ผลลัพธ์:

เบราว์เซอร์ของคุณจะถูกเปิดขึ้นมาที่ URL เช่น http://127.0.0.1:XXXXX หรือ http://192.168.49.2:30080

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working.

🛠️ Troubleshooting (การแก้ปัญหาเบื้องต้นใน K8s)

Pod ติดสถานะ ImagePullBackOff

สาเหตุ: พิมพ์ชื่อ Image ผิด หรือระบบดึง Image จาก Docker Hub ไม่ได้

แก้: ใช้คำสั่ง kubectl describe pod [name] เพื่อดู Error Log บรรทัดล่างสุด

Pod ติดสถานะ CrashLoopBackOff

สาเหตุ: แอปพลิเคชันในคอนเทนเนอร์แครชทันทีที่รัน

แก้: ดูสาเหตุการพังได้ด้วยคำสั่ง kubectl logs [name]

เข้าเว็บไม่ได้ (Connection Refused)

สาเหตุ: Service ไม่เจอ Pod หรือระบุ Port ผิด

แก้: เช็ค selector (app: web) ใน Service ว่าสะกดตรงกับ labels ใน Pod แบบตัวอักษรต่อตัวอักษรหรือไม่

🥳

ภารกิจแรกสำเร็จ! การส่งงาน

รายละเอียดการส่งผลการทำ Lab (Submission):

  • ไฟล์ YAML:
    • ส่งไฟล์ nginx-pod.yaml
    • ส่งไฟล์ nginx-svc.yaml
  • Screenshots (จัดทำเป็น PDF):
    • ภาพ Terminal ที่รันคำสั่ง kubectl get pods และ kubectl get svc โชว์สถานะ Running และพอร์ต
    • ภาพหน้าเบราว์เซอร์ที่แสดงผลหน้าเว็บ Welcome to nginx! โดยมี URL เป็น Local IP/Port (เช่น localhost:xxxxx หรือ 192.168.x.x:30080)
⚠️ อย่าลืมพิมพ์คำสั่ง minikube stop เมื่อทำ Lab เสร็จเพื่อคืนทรัพยากรให้คอมพิวเตอร์ของคุณ