11 12.pods yml demo
1. Bốn "Trụ cột" của một file YAML trong Kubernetes¶
Mọi file định nghĩa đối tượng trong Kubernetes (dù là Pod, Service, hay Deployment,...) đều phải có 4 trường (fields) ở cấp cao nhất. Đây là các trường bắt buộc:
-
apiVersion
: -
Là gì? Phiên bản của Kubernetes API mà bạn đang sử dụng để tạo đối tượng.
-
Ví dụ (cho Pod):
v1
-
kind
: -
Là gì? Loại đối tượng mà bạn đang muốn tạo.
-
Ví dụ (cho Pod):
Pod
-
metadata
: -
Là gì? "Dữ liệu về dữ liệu" - tức là các thông tin mô tả về đối tượng, như tên, nhãn,... Đây là một dictionary (đối tượng).
name
: Tên của Pod (ví dụ:my-app-pod
).-
labels
: Một dictionary chứa các cặp key-value (nhãn). Labels cực kỳ quan trọng, giúp bạn lọc và nhóm các đối tượng sau này (ví dụ:app: my-app
,env: production
). -
spec
(viết tắt của Specification): -
Là gì? Đây là phần quan trọng nhất, nơi bạn định nghĩa trạng thái mong muốn của đối tượng.
- Cấu trúc của
spec
sẽ khác nhau tùy thuộc vàokind
của đối tượng.
⚠️ Lưu ý về thụt đầu dòng (indentation) trong YAML: YAML rất nhạy cảm với khoảng trắng. Các thuộc tính con phải được thụt vào so với thuộc tính cha, và các thuộc tính ngang hàng phải có cùng mức thụt lề.
2. "Mổ xẻ" phần spec
của một Pod¶
Đối với một đối tượng có kind: Pod
, phần spec
sẽ mô tả các container sẽ chạy bên trong Pod đó.
spec
chứa một thuộc tính quan trọng làcontainers
.containers
là một danh sách (list/array). Lý do nó là một danh sách vì một Pod có thể chứa nhiều container.- Mỗi mục trong danh sách
containers
là một dictionary mô tả một container, với hai thuộc tính bắt buộc: name
: Tên bạn đặt cho container (ví dụ:nginx-container
).image
: Tên của Docker image sẽ được sử dụng để chạy container (ví dụ:nginx
).
3. Ví dụ một file pod-definition.yaml
hoàn chỉnh¶
Đây là một file YAML đầy đủ để tạo một Pod đơn giản chạy NGINX:
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
labels:
app: my-app
spec:
containers:
- name: nginx-container
image: nginx
4. Thực thi và Quản lý Pod trong Kubernetes¶
4.1. Tạo Pod từ file YAML¶
# Tạo Pod (báo lỗi nếu đã tồn tại)
kubectl create -f pod-definition.yaml
# Tạo hoặc cập nhật Pod (khuyến nghị)
kubectl apply -f pod-definition.yaml
4.2. Kiểm tra và Giám sát Pod¶
# Xem danh sách Pod
kubectl get pods
kubectl get pods -o wide # Thông tin chi tiết
kubectl get pods -l app=my-app # Lọc theo label
kubectl get pods -A # Tất cả namespace
# Xem thông tin chi tiết
kubectl describe pod my-app-pod
# Theo dõi logs
kubectl logs my-app-pod
kubectl logs -f my-app-pod # Theo thời gian thực
4.3. Tương tác với Pod¶
# Truy cập vào container
kubectl exec -it my-app-pod -- /bin/bash
# Chạy lệnh trong container
kubectl exec my-app-pod -- ls -la
# Port forwarding
kubectl port-forward my-app-pod 8080:80
4.4. Xóa Pod¶
kubectl delete pod my-app-pod
kubectl delete -f pod-definition.yaml
kubectl delete pods -l app=my-app # Xóa theo label
5. Tạo Pod nhanh với kubectl run¶
5.1. Các lệnh cơ bản¶
# Tạo Pod đơn giản
kubectl run nginx-pod --image=nginx
# Tạo Pod với labels và port
kubectl run webapp --image=nginx --port=80 --labels="app=web,env=prod"
# Tạo file YAML (không tạo Pod thực tế)
kubectl run redis-pod --image=redis --dry-run=client -o yaml > redis-pod.yaml
5.2. Pod với cấu hình nâng cao¶
# nginx-advanced.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-advanced
labels:
app: nginx
tier: frontend
spec:
containers:
- name: nginx-container
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
env:
- name: NGINX_PORT
value: "80"
6. Troubleshooting và Debug Pod¶
6.1. Kiểm tra trạng thái¶
# Xem Pod có vấn đề
kubectl get pods --field-selector=status.phase!=Running
# Xem events hệ thống
kubectl get events --sort-by=.metadata.creationTimestamp
# Theo dõi trạng thái realtime
kubectl get pods -w
6.2. Phân tích và Debug¶
# Xem resource usage
kubectl top pods
# Xem cấu hình Pod ở dạng YAML
kubectl get pod nginx-pod -o yaml
# Xem logs container trước đó
kubectl logs nginx-pod --previous
7. Lab thực hành tổng hợp¶
# 1. Tạo Pod với labels
kubectl run webapp --image=nginx:1.21 --port=80 --labels="app=webapp,env=prod"
# 2. Kiểm tra và theo dõi
kubectl get pods -l app=webapp
kubectl describe pod webapp
kubectl logs webapp
# 3. Test kết nối
kubectl port-forward webapp 8080:80 &
curl localhost:8080
# 4. Backup và cleanup
kubectl get pod webapp -o yaml > webapp-backup.yaml
kubectl delete pod webapp
8. Tóm tắt cho kỳ thi CKA 📝¶
4 trường bắt buộc của YAML:
apiVersion: v1
(cho Pod)kind: Pod
metadata
: name, labelsspec
: containers (name, image)
Lệnh quan trọng:
kubectl apply -f file.yaml
- Tạo/cập nhậtkubectl get pods -o wide
- Xem danh sáchkubectl describe pod <name>
- Debugkubectl logs <pod>
- Xem logskubectl exec -it <pod> -- /bin/bash
- Truy cập container
Tips:
- Luôn sử dụng
apply
thay vìcreate
- Labels quan trọng cho việc quản lý
- Sử dụng
describe
để troubleshoot dry-run
để tạo YAML template nhanh