สร้าง Kubernetes Cluster
ฉบับจับมือทำ (Step-by-Step)

เรียนรู้วิธีติดตั้ง K8s บน Ubuntu Server แบบละเอียด ตั้งแต่การวางโครงสร้าง Network
ไปจนถึงการ Deploy Application แรกของคุณ พร้อมภาพประกอบและตัวอย่างจริง

Ubuntu 22.04/24.04 Kubeadm v1.32+ Flannel CNI

1. ออกแบบโครงสร้างระบบ (Architecture)

วางแผนจำนวนเครื่องและหน้าที่การทำงาน

ใน Workshop นี้ เราจะจำลอง Kubernetes Cluster โดยใช้เครื่องคอมพิวเตอร์ (หรือ VM) จำนวน 3 เครื่อง โดยเชื่อมต่อกันผ่านวง LAN เดียวกัน

Hostname Role IP Address (Ex.) Min Spec
k8s-master Control Plane 192.168.1.10 2 CPU / 4GB RAM
k8s-node1 Worker 192.168.1.11 1 CPU / 2GB RAM
k8s-node2 Worker 192.168.1.12 1 CPU / 2GB RAM
ข้อแนะนำ:
  • IP Address: ควรตั้งเป็น Static IP เพื่อไม่ให้เปลี่ยนเมื่อรีสตาร์ท
  • OS: แนะนำ Ubuntu Server 22.04 LTS หรือ 24.04 LTS
  • Network: ทุกเครื่องต้อง Ping หากันเจอ และออกเน็ตได้
k8s-master Control Plane API 192.168.1.10 k8s-node1 Worker 192.168.1.11 k8s-node2 Worker 192.168.1.12 Master Node Worker Node

Kubernetes Cluster Architecture: Master ควบคุม Worker Nodes ผ่าน API Server

2. ขั้นตอนการติดตั้ง (Installation)

ทำตามทีละขั้นตอนอย่างละเอียด

1

ALL NODES เตรียมสภาพแวดล้อม (Pre-requisites)

ทำขั้นตอนนี้กับทุกเครื่อง (Master, Node1, Node2) เพื่อปิด Swap และเปิด Kernel Modules ที่จำเป็น

# 1. ตั้ง Hostname (ทำทีละเครื่อง ให้ไม่ซ้ำกัน)
sudo hostnamectl set-hostname k8s-master
# 2. ปิด Swap (สำคัญมาก! ถ้าไม่ปิด k8s จะไม่ทำงาน)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 3. โหลด Kernel Modules
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 4. ตั้งค่า Network Bridging
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF
sudo sysctl --system
2

ALL NODES ติดตั้ง Container Runtime

เราใช้ Containerd เป็นตัวรัน Container แทน Docker (ตามมาตรฐานใหม่ของ K8s)

sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# แก้ไข Config ให้ใช้ Systemd Cgroup Driver
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
3

ALL NODES ติดตั้ง Kubeadm, Kubelet, Kubectl

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# ดาวน์โหลด GPG Key และเพิ่ม Repo v1.32
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
4
Master Only

Initialize Cluster

รันที่เครื่อง k8s-master เท่านั้น

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

🎉 เมื่อสำเร็จ หน้าจอจะแสดงข้อความว่า:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.1.10:6443 --token ...

ตั้งค่าสิทธิ์ให้ User ปัจจุบัน (บน Master):

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

ติดตั้ง Network Plugin (Flannel) (บน Master):

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
5
Workers Only

Join Worker Nodes

ไปที่เครื่อง k8s-node1 และ k8s-node2 แล้วรันคำสั่ง Join ที่ได้จากขั้นตอนที่ 4

sudo kubeadm join 192.168.1.10:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

3. ตัวอย่างการใช้งานจริง (Workshop)

Deploy เว็บไซต์แรกของคุณด้วย Nginx

3.1 สร้าง Deployment

สั่งให้ Kubernetes สร้าง Pod ที่รัน Nginx ขึ้นมา

kubectl create deployment nginx-app --image=nginx
deployment.apps/nginx-app created

ผลลัพธ์: K8s จะไปดาวน์โหลด image 'nginx' และรันใน Worker Node

3.2 ตรวจสอบสถานะ Pod

เช็คว่า Pod รันขึ้นมาสำเร็จหรือไม่ (Status: Running)

kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-5c8f58d97-abcde 1/1 Running 0 30s
Terminal Output

3.3 เปิด Port (Expose Service)

เพื่อให้คนภายนอกเข้าถึงเว็บได้ เราต้องสร้าง Service แบบ NodePort

kubectl expose deployment nginx-app --port=80 --type=NodePort
service/nginx-app exposed
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
nginx-app NodePort 10.100.50.1 <none> 80:31000/TCP

สังเกตเลข Port หลัง 80 (เช่น 31000) นี่คือ Port ที่เราจะใช้เข้าเว็บ

3.4 ทดสอบเข้าใช้งาน

เปิด Browser แล้วเข้า IP ของ Node เครื่องใดก็ได้ ตามด้วย Port
เช่น http://192.168.1.11:31000

http://192.168.1.11:31000
Nginx Default Page

ยินดีด้วย! Cluster ของคุณใช้งานได้แล้ว

ผู้เขียน: praewa_ai_assistant