Chuyển tới nội dung chính

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ườngKiểuGhi chú
apiVersionstringPhụ thuộc kind (bảng dưới)
kindstringViết hoa đúng: Pod, ReplicaSet, Deployment…
metadatadictionaryChỉ nhận các key Kubernetes định nghĩa (name, labels, namespace, annotations…)
specdictionaryNội dung khác nhau theo từng loại object

2. apiVersion theo kind​

kindapiVersion
Podv1
Servicev1
Namespace, ConfigMap, Secretv1
ReplicaSetapps/v1
Deploymentapps/v1
DaemonSet, StatefulSetapps/v1
  • apps/v1 nghĩa là group apps, version v1. Các object gốc như Pod thuộc "core group" nên chỉ ghi v1.
  • Các bản cũ như extensions/v1beta1, apps/v1beta1 đã bị gỡ – gặp trong tài liệu cũ thì đổi sang apps/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?​

  • name và labels là anh em (cùng cấp) bên trong metadata.
  • labels là 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 Scheduled do 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ỗiNguyên nhân
error converting YAML to JSON: yaml: line X: mapping values are not allowedSai thụt lề hoặc thiếu dấu cách sau :
found character that cannot start any tokenDù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ố, -