๐ Kubernetes ๅฎๆดๅ ฅ้ๆๅ:ๅพ้ถ้จ็ฝฒ K3s ๅฐ Pod / Service / Ingress ๅ จๆต็จๅฏฆๆฐ
Kubernetes(K8s)ๆฏ็ฎๅๅฎนๅจ็ทจๆ็ๆฅญ็ๆจๆบ,ไฝๅฎๆน็ๅฎ่ฃ้ๆชป้ซ、่ณๆบ้ๆฑๅคง。
K3s ๆฏ็ฑ Rancher ้็ผ็่ผ้ๅ Kubernetes,ๅฎ่ฃๅช้ไธ่กๆไปค,่จๆถ้ซ้ๆฑๅ
512 MB,
้ๅธธ้ฉๅ Home Lab、Proxmox VM、ๅญธ็ฟ็ฐๅข ไฝฟ็จ,็็ข็ญ็ดๅ่ฝไธๆจฃๅฎๆด。
ๆฌ็ฏๅพๅฎ่ฃๅฐ Ingress ๅ
จๆต็จๅฏฆๆฐ,ๅธถไฝ ๅปบ็ซ็ฌฌไธๅฅๅฏ็จ็ K3s ๅข้。
๐ ็ฎ้
- K3s ่ K8s ็ๅทฎ็ฐ
- ็ฐๅข่ฆๅ่ๅฎ่ฃ
- kubectl ๅบ็คๆไฝ
- Namespace ่่ณๆบ้้ข
- ้จ็ฝฒ็ฌฌไธๅ App(Deployment + Pod)
- Service ๅฐๅคๆด้ฒๆๅ
- Ingress ็ตฑไธๅ ฅๅฃ็ฎก็
- ConfigMap ่ Secret
- PV / PVC ๆไน ๅๅฒๅญ
- ๅธธ่ฆๅ้กๆๆฅ
⚖️ ไธ、K3s ่ K8s ็ๅทฎ็ฐ
| ้ ็ฎ | K8s(ๅฎๆน) | K3s(่ผ้็) |
|---|---|---|
| ๅฎ่ฃ้ฃๅบฆ | ่ค้,้ kubeadm / ๅคๆญฅ้ฉ | ไธ่ก curl ๆไปค |
| ๆไฝ่จๆถ้ซ | 2 GB+ | 512 MB |
| ๅ งๅปบๅ ไปถ | ้่ช่ก้ธ้ | Traefik Ingress、CoreDNS、Flannel、Metrics Server ๅ งๅปบ |
| ่ณๆๅบซ | etcd | SQLite(ๅฎ็ฏ้ป)/ etcd(HA) |
| ้ฉ็จๅ ดๆฏ | ๅคงๅไผๆฅญๅข้ | Home Lab、้็ทฃ้็ฎ、ๅญธ็ฟ、ๅฐๅ็็ข |
| kubectl ็ธๅฎนๆง | ๅฎๆด | ๅฎๆด(100% API ็ธๅฎน) |
๐ก K3s ๅฎๆดๆฏๆดๆๆ Kubernetes API,ๅจ K3s ๅญธๅฐ็็ฅ่ญๅฏไปฅ็ดๆฅ็จๅจๆญฃๅผ K8s ็ฐๅข。
๐ฅ️ ไบ、็ฐๅข่ฆๅ่ๅฎ่ฃ
ๅปบ่ญฐ่ฆๆ ผ
| ็ฏ้ป้กๅ | ่ง่ฒ | ๆไฝ่ฆๆ ผ | ๅปบ่ญฐ่ฆๆ ผ |
|---|---|---|---|
| Server(Master) | ๆงๅถๅนณ้ข | 1 CPU / 512 MB | 2 CPU / 2 GB |
| Agent(Worker) | ๅท่กๅทฅไฝ่ฒ ่ผ | 1 CPU / 512 MB | 2 CPU / 2 GB |
ๆฌ็ฏไปฅ ๅฎ็ฏ้ป(all-in-one) ็คบ็ฏ,OS ็บ Ubuntu 22.04 / Debian 12。
1️⃣ ๅฎ่ฃ K3s Server
# ไธ้ตๅฎ่ฃ(ๅฎๆน่
ณๆฌ)
curl -sfL https://get.k3s.io | sh -
# ๅฎ่ฃๅฎๆๅพ็ขบ่ช็ๆ
sudo systemctl status k3s
# ็ขบ่ช็ฏ้ปๅ ๅ
ฅ
sudo kubectl get nodes
ๅฎ่ฃๅฎๆๅพ kubectl ๅทฒ่ชๅ่จญๅฎ,/etc/rancher/k3s/k3s.yaml ็บ kubeconfig ๆชๆก。
2️⃣ ่จญๅฎ kubectl ็ตฆไธ่ฌไฝฟ็จ่ ไฝฟ็จ
mkdir -p $HOME/.kube
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
echo 'export KUBECONFIG=$HOME/.kube/config' >> ~/.bashrc
source ~/.bashrc
# ้ฉ่ญ
kubectl get nodes
3️⃣ ๅ ๅ ฅ Worker ็ฏ้ป(ๅค็ฏ้ปๆ)
# ๅจ Server ไธๅๅพ Token
sudo cat /var/lib/rancher/k3s/server/node-token
# ๅจ Agent ็ฏ้ปๅท่ก
curl -sfL https://get.k3s.io | K3S_URL=https://<SERVER_IP>:6443 \
K3S_TOKEN=<NODE_TOKEN> sh -
๐ง ไธ、kubectl ๅบ็คๆไฝ
ๅธธ็จๆไปค้ๆฅ
# ๆฅ็็ฏ้ป
kubectl get nodes -o wide
# ๆฅ็ๆๆ Namespace ็ Pod
kubectl get pods -A
# ๆฅ็็นๅฎ Namespace
kubectl get pods -n kube-system
# ๆฅ็่ณๆบ่ฉณ็ดฐ่ณ่จ
kubectl describe pod <pod-name>
# ๆฅ็ Pod ๆฅ่ช
kubectl logs <pod-name>
kubectl logs -f <pod-name> # ๆ็บ่ผธๅบ
# ้ฒๅ
ฅ Pod ๅ
ง้จ
kubectl exec -it <pod-name> -- /bin/bash
# ๅช้ค่ณๆบ
kubectl delete pod <pod-name>
kubectl delete -f manifest.yaml
ๅฟซ้ๅฅๅ่จญๅฎ(ๅปบ่ญฐๅ ๅ ฅ ~/.bashrc)
alias k='kubectl'
alias kga='kubectl get all -A'
alias kgp='kubectl get pods'
alias kdp='kubectl describe pod'
๐ ๅ、Namespace ่่ณๆบ้้ข
Namespace ๆฏ K8s ไธญ็้่ผฏ้้ขๅฎไฝ,ไธๅๅฐๆก / ็ฐๅขๅปบ่ญฐ็จไธๅ Namespace ็ฎก็。
# ๆฅ็ๆๆ Namespace
kubectl get namespaces
# ๅปบ็ซ Namespace
kubectl create namespace myapp
# ๅจๆๅฎ Namespace ๆไฝ
kubectl get pods -n myapp
# ่จญๅฎ้ ่จญ Namespace(้ฟๅ
ๆฏๆฌกๅ -n)
kubectl config set-context --current --namespace=myapp
K3s ้ ่จญ Namespace:
default:้ ่จญๆไฝ็ฉบ้kube-system:็ณป็ตฑๅ ไปถ(CoreDNS、Traefik ็ญ)kube-public:ๅ ฌ้ๅฏ่ฎ่ณๆบ
๐ณ ไบ、้จ็ฝฒ็ฌฌไธๅ App(Deployment + Pod)
ๆฆๅฟต่ชชๆ
- Pod:K8s ๆๅฐ้จ็ฝฒๅฎไฝ,ๅ ๅซไธๅๆๅคๅ Container
- Deployment:็ฎก็ Pod ็ๅฏๆฌๆธ้、ๆปพๅๆดๆฐ、่ชๅ้ๅ
- ReplicaSet:็ฑ Deployment ่ชๅ็ฎก็,็ขบไฟ Pod ๆธ้
ๆนๅผไธ:ๆไปค็ดๆฅ้จ็ฝฒ(ๅฟซ้ๆธฌ่ฉฆ)
# ้จ็ฝฒ nginx
kubectl create deployment nginx --image=nginx:latest --replicas=2
# ๆฅ็็ๆ
kubectl get deployment nginx
kubectl get pods -l app=nginx
ๆนๅผไบ:YAML ๅฎฃๅๅผ้จ็ฝฒ(ๅปบ่ญฐ)
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: myapp
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "250m"
# ๅฅ็จ
kubectl apply -f deployment.yaml
# ๆฅ็ Rollout ็ๆ
kubectl rollout status deployment/nginx -n myapp
# ๆดๆฐๆ ๅๆช(ๆปพๅๆดๆฐ)
kubectl set image deployment/nginx nginx=nginx:1.26 -n myapp
# ๅๆปพ
kubectl rollout undo deployment/nginx -n myapp
๐ ๅ ญ、Service ๅฐๅคๆด้ฒๆๅ
Pod ็ IP ๆฏๅๆ ็,Service ๆไพ็ฉฉๅฎ็ๅญๅๅ ฅๅฃ,่ชๅๅ Load Balancing。
Service ้กๅๆฏ่ผ
| ้กๅ | ่ชชๆ | ้ฉ็จๅ ดๆฏ |
|---|---|---|
| ClusterIP | ๅข้ๅ ง้จ IP,้ ่จญ้กๅ | ๆๅ้้่จ |
| NodePort | ้ๆพ Node ็ๅบๅฎ Port(30000-32767) | ้็ผๆธฌ่ฉฆ、็ดๆฅๅญๅ |
| LoadBalancer | ้ฒ็ซฏ็ฐๅข่ชๅ้ ็ฝฎๅค้จ LB | ้ฒ็ซฏ(AWS/GCP/Azure) |
ๅปบ็ซ NodePort Service
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: myapp
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # Service Port
targetPort: 80 # Container Port
nodePort: 30080 # ๅฐๅค Port(ๅฏ็็ฅ่ฎ็ณป็ตฑ่ชๅๅ้
)
kubectl apply -f service.yaml
# ๆฅ็
kubectl get svc -n myapp
# ๆธฌ่ฉฆ(ๅพ Host ๅญๅ)
curl http://<NODE_IP>:30080
๐ ไธ、Ingress ็ตฑไธๅ ฅๅฃ็ฎก็
K3s ๅ งๅปบ Traefik Ingress Controller,ๅฏ็จๅๅ่ทฏ็ฑๅฐไธๅ Service,ไธ้่ฆๆฏๅๆๅ้ไธๅ Port。
Ingress ๆถๆง
Internet
↓
Traefik(80/443)
├── /app-a → Service A → Pods
└── /app-b → Service B → Pods
ๅปบ็ซ Ingress ่ฆๅ
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: myapp
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
rules:
- host: nginx.local # ๆฌๆฉๆธฌ่ฉฆๅฏๅ ๅฐ /etc/hosts
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
kubectl apply -f ingress.yaml
# ๆฅ็ Ingress
kubectl get ingress -n myapp
# ๆฌๆฉๆธฌ่ฉฆ(ๅ ๅฐ /etc/hosts)
echo "<NODE_IP> nginx.local" | sudo tee -a /etc/hosts
curl http://nginx.local
ๅค่ทฏ็ฑ Ingress ็ฏไพ
spec:
rules:
- host: mysite.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-svc
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 3000
๐ ๅ ซ、ConfigMap ่ Secret
ConfigMap — ๅญๆพ้ๆฉๅฏ่จญๅฎ
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: myapp
data:
APP_ENV: production
LOG_LEVEL: info
DB_HOST: mariadb-svc
# ๅจ Deployment ไธญไฝฟ็จ ConfigMap
spec:
containers:
- name: myapp
image: myapp:latest
envFrom:
- configMapRef:
name: app-config
Secret — ๅญๆพๆฉๅฏ่ณๆ(Base64 ็ทจ็ขผ)
# ็ข็ base64
echo -n 'mypassword' | base64
# ่ผธๅบ:bXlwYXNzd29yZA==
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
namespace: myapp
type: Opaque
data:
DB_PASSWORD: bXlwYXNzd29yZA==
DB_USER: YWRtaW4=
# ๅจ Pod ไธญไฝฟ็จ Secret
spec:
containers:
- name: myapp
image: myapp:latest
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORD
๐พ ไน、PV / PVC ๆไน ๅๅฒๅญ
Pod ้ๅๅพ่ณๆๆๆถๅคฑ,้่ฆ PersistentVolume(PV) ๅ PersistentVolumeClaim(PVC) ไฟๅญ่ณๆ。
K3s ๅ งๅปบ Local Path Provisioner,ๅฏ่ชๅๅปบ็ซ PV(่ณๆๅญๅจ Node ๆฌๆฉ็ฃ็ข)。
ๅปบ็ซ PVC
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-data
namespace: myapp
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path # K3s ้ ่จญ StorageClass
resources:
requests:
storage: 1Gi
# ๅจ Deployment ๆ่ผ PVC
spec:
containers:
- name: nginx
image: nginx:1.25
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: nginx-data
# ๆฅ็ PVC ็ๆ
(Bound = ๅทฒๆ่ผ)
kubectl get pvc -n myapp
❓ ๅ、ๅธธ่ฆๅ้กๆๆฅ
ๅ้ก 1:Pod ไธ็ด CrashLoopBackOff
ๆๆฅๆญฅ้ฉ:
# ๆฅ็่ฉณ็ดฐ้ฏ่ชค
kubectl describe pod <pod-name> -n myapp
# ๆฅ็ๆ่ฟ 50 ่ก Log
kubectl logs <pod-name> --previous --tail=50 -n myapp
ๅธธ่ฆๅๅ :ๆ ๅไธๅญๅจ、็ฐๅข่ฎๆธ็ผบๅฐ、่ณๆบไธ่ถณ(OOMKilled)
ๅ้ก 2:Pod ็ๆ Pending
kubectl describe pod <pod-name> -n myapp
# ็ Events ๆฌไฝ
ๅธธ่ฆๅๅ :Node ่ณๆบไธ่ถณ(CPU/Memory)、PVC ๆช Bound、Node ๆ Taint
ๅ้ก 3:Service ็กๆณๅญๅ
# ็ขบ่ช Endpoints ๆฏๅฆๆ Pod IP
kubectl get endpoints <service-name> -n myapp
# ็ขบ่ช Pod Label ๆฏๅฆ่ Service Selector ไธ่ด
kubectl get pods --show-labels -n myapp
ๅ้ก 4:Ingress 404 / ็กๆณ่ทฏ็ฑ
# ๆฅ็ Traefik ๆฅ่ช
kubectl logs -n kube-system -l app.kubernetes.io/name=traefik
# ็ขบ่ช Ingress ๆฏๅฆๆญฃ็ขบๅปบ็ซ
kubectl describe ingress <ingress-name> -n myapp
ๅ้ก 5:ๆฅ็ๅข้ๆด้ซ่ณๆบไฝฟ็จ
# ้่ฆ Metrics Server(K3s ๅทฒๅ
งๅปบ)
kubectl top nodes
kubectl top pods -A
๐ ็ธฝ็ต
K3s ่ฎ Kubernetes ็ๅ
ฅ้้ๆชปๅคงๅน
้ไฝ,ๅช้ไธๅฐ Linux VM ๅฐฑ่ฝ้ซ้ฉๅฎๆด็ K8s ๅ่ฝ。
ๆฌ็ฏๆถต่ไบๅพๅฎ่ฃๅฐ Deployment → Service → Ingress → ConfigMap → PVC ็ๅฎๆดๆต็จ,
้ๅฅๆถๆงๅฏไปฅ็ดๆฅๅปถไผธๅฐๅค็ฏ้ปๅข้ๆๆญฃๅผ K8s ็ฐๅข,ๅญธ็ฟๆๆฌไธๆฌกๆๅฎ。
| ๅ ไปถ | ๅ่ฝ |
|---|---|
| Deployment | ็ฎก็ Pod ๅฏๆฌ、ๆปพๅๆดๆฐ |
| Service | ็ฉฉๅฎๅ ฅๅฃ、่ฒ ่ผๅนณ่กก |
| Ingress | ๅๅ่ทฏ็ฑ、็ตฑไธๅฐๅคๅ ฅๅฃ |
| ConfigMap | ๆณจๅ ฅ็ฐๅข่จญๅฎ |
| Secret | ๅฎๅ จๅญๆพๆฉๅฏ |
| PVC | ่ณๆๆไน ๅ |
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ