Pods với YAML
1. Bốn trường gốc
Mọi file định nghĩa object Kubernetes đều có 4 trường gốc bắt buộc:
apiVersion: v1 # phiên bản API của loại object
kind: Pod # loại object
metadata: # thông tin nhận dạng: name, labels...
name: myapp-pod
labels:
app: myapp
type: front-end
spec: # mô tả mong muốn: container nào, image gì...
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
| Trường | Kiểu | Ghi chú |
|---|---|---|
apiVersion | string | Phụ thuộc kind (bảng dưới) |
kind | string | Viết hoa đúng: Pod, ReplicaSet, Deployment… |
metadata | dictionary | Chỉ nhận các key Kubernetes định nghĩa (name, labels, namespace, annotations…) |
spec | dictionary | Nội dung khác nhau theo từng loại object |
2. apiVersion theo kind
| kind | apiVersion |
|---|---|
| Pod | v1 |
| Service | v1 |
| Namespace, ConfigMap, Secret | v1 |
| ReplicaSet | apps/v1 |
| Deployment | apps/v1 |
| DaemonSet, StatefulSet | apps/v1 |
apps/v1nghĩa là groupapps, versionv1. Các object gốc như Pod thuộc "core group" nên chỉ ghiv1.- Các bản cũ như
extensions/v1beta1,apps/v1beta1đã bị gỡ – gặp trong tài liệu cũ thì đổi sangapps/v1.
💡 Mẹo
Không nhớ apiVersion? Dùng kubectl api-resources | grep -i deployment hoặc kubectl explain deployment.
3. labels nằm ở đâu?
namevàlabelslà anh em (cùng cấp) bên trongmetadata.labelslà dictionary, bạn tự đặt bất kỳ key nào (app,type,tier…). Sau này dùng để lọc và để Service/ReplicaSet chọn Pod.
4. containers là một danh sách
containers là list (dấu -), vì một Pod có thể có nhiều container. Mỗi phần tử là một dictionary gồm name, image…
5. Thụt lề – đúng và sai
# ✅ ĐÚNG
metadata:
name: myapp-pod
labels:
app: myapp
# ❌ SAI – labels thụt sâu hơn name → thành con của name
metadata:
name: myapp-pod
labels:
app: myapp
- YAML dùng dấu cách, không dùng tab.
- Các key cùng cấp phải thẳng hàng.
6. Tạo Pod từ file
kubectl create -f pod.yaml # tạo mới, báo lỗi nếu đã tồn tại
kubectl apply -f pod.yaml # tạo mới hoặc cập nhật
kubectl get pods
kubectl describe pod myapp-pod
7. Demo: tạo Pod từ YAML trên cluster lab
vi pod.yaml # gõ nội dung ở mục 1 (dùng dấu cách, không dùng tab)
cat pod.yaml # kiểm tra lại thụt lề
kubectl apply -f pod.yaml
# pod/myapp-pod created
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# myapp-pod 0/1 ContainerCreating 0 3s
kubectl get pods -o wide # xem Pod chạy trên node nào, IP gì
kubectl describe pod myapp-pod # xem labels, image, và phần Events ở cuối
Phần Events trong describe cho thấy đúng trình tự đã học ở bài kiến trúc:
Events:
Type Reason From Message
---- ------ ---- -------
Normal Scheduled default-scheduler Successfully assigned default/myapp-pod to k8s-worker1
Normal Pulling kubelet Pulling image "nginx"
Normal Pulled kubelet Successfully pulled image "nginx"
Normal Created kubelet Created container nginx-container
Normal Started kubelet Started container nginx-container
- Dòng
Scheduleddo scheduler ghi; các dòng sau do kubelet ghi.
💡 Mẹo vim
Thêm vào ~/.vimrc để Tab thành 2 dấu cách:
set expandtab tabstop=2 shiftwidth=2
8. Lỗi YAML thường gặp
| Thông báo lỗi | Nguyên nhân |
|---|---|
error converting YAML to JSON: yaml: line X: mapping values are not allowed | Sai thụt lề hoặc thiếu dấu cách sau : |
found character that cannot start any token | Dùng tab thay cho dấu cách |
no matches for kind "Deployment" in version "v1" | Sai apiVersion (phải là apps/v1) |
unknown field "xxx" | Gõ sai tên trường hoặc đặt sai cấp |
Invalid value: "MyPod" | Tên phải là chữ thường, số, - |