Danh sách bài viết trong series Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Lộ Trình Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Bài 1: Giới Thiệu Kubernetes Và Khái Niệm Cluster Cho CKAD
- Bài 2: Cài Đặt Minikube Và sử dụng kubectl Cơ Bản
- Bài 3: Quản Lý Pod Cơ Bản (Create, Delete, Describe)
- Bài 4: Sử Dụng ConfigMap Và Secret Trong YAML
- Bài 5: Quản Lý Environment Variables Và Command/Args
- Bài 6: Cấu Hình Deployment Và Replica Set
- Bài 7: Thiết Kế Pod Với Nhiều Container
- Bài 8: Sử Dụng Sidecar Và Init Container
- Bài 9: Chia Sẻ Tài Nguyên Giữa Các Container
- Bài 10: Giám Sát Log Và Events Với kubectl logs
- Bài 11: Debug Pod Với kubectl describe Và exec
- Bài 12: Tối Ưu Pod Với Resource Limits Và Requests
- Bài 13: Sử Dụng Liveness Và Readiness Probes
- Bài 14: Tối Ưu Hóa Pod Với HPA (Horizontal Pod Autoscaler)
- Bài 15: Cấu Hình Service (ClusterIP, NodePort)
- Bài 16: Sử Dụng Ingress Và Network Policy
- Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes
- Bài 18: Sử Dụng Volume (emptyDir, hostPath)
- Bài 19: Cấu Hình Persistent Volume Và Persistent Volume Claim
- Bài 20: Tổng Kết, Mẹo Thi CKAD, Bài Tập Thực Hành Cuối
Sau khi đã học cách cấu hình Service (ClusterIP, NodePort) ở Bài 15, chúng ta tiếp tục bước sang phần Ingress và Network Policy hai chủ đề quan trọng nhất trong domain Services & Networking (20% trọng số kỳ thi CKAD).
Bài viết này thuộc domain Services & Networking, tập trung vào hai thành phần chính Ingress (điều phối HTTP/HTTPS traffic) và Network Policy (kiểm soát traffic giữa các Pod). Trong kỳ thi, bạn thường gặp task như tạo Ingress để route /api sang api-svc:8080, thêm TLS cho Ingress với secret có sẵn, hoặc viết Network Policy chỉ cho phép Pod có label role=web truy cập Pod role=api trên port 8080 và deny toàn bộ traffic còn lại. Những bài như vậy không khó về mặt cú pháp, nhưng rất dễ sai nếu không nắm rõ pathType, policyTypes, hoặc selectors.
Ingress HTTP/HTTPS Routing Thông Minh
1. Ingress Là Gì? Tại Sao Cần Nó?
Ingress là một API resource cho phép quản lý external access vào Services qua HTTP/HTTPS, hỗ trợ path-based routing, host-based routing, TLS termination và load balancing.
| Vấn đề với NodePort/LoadBalancer | Giải pháp bằng Ingress |
|---|---|
| Mỗi Service cần port riêng => nhanh hết port | Một IP duy nhất, route dựa trên path/host |
| Không hỗ trợ HTTPS/TLS | TLS offload tại Ingress Controller |
| Không route theo URL | Dùng rules linh hoạt: /api => backend, /web => frontend |
CKAD Tip: Ingress không phải Service, mà là tập hợp rule được Ingress Controller (như NGINX) thực thi. Trong môi trường thi, Ingress Controller đã được cài sẵn.
2. Cài Đặt Ingress Controller (Local/Minikube)
Trong thi CKAD, Ingress Controller có sẵn. Nếu bạn muốn tự thực hành:
minikube addons enable ingress
kubectl get pods -n ingress-nginx
Nếu chưa thấy namespace ingress-nginx, hãy chờ 1–2 phút để hệ thống khởi tạo controller.
3. Cấu Trúc YAML Ingress Cơ Bản
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-svc
port:
number: 80
- path: /app2
pathType: Exact
backend:
service:
name: app2-svc
port:
number: 8080
CKAD Golden Rule:
pathType: Prefix, Exact hoặc ImplementationSpecific.- Không có
host=> rule áp dụng cho tất cả host. - Annotations phụ thuộc vào controller (VD:
nginx.ingress.kubernetes.io/...).
4. Thực Hành: Tạo Ingress Cho 2 Service
Giả sử bạn có hai Deployment nginx và httpd đã có sẵn Service.
Tạo file ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
spec:
rules:
- http:
paths:
- path: /nginx
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
- path: /httpd
pathType: Prefix
backend:
service:
name: httpd-service
port:
number: 80
Áp dụng:
kubectl apply -f ingress.yaml
5. Test Ingress
minikube ip
curl http://$(minikube ip)/nginx
curl http://$(minikube ip)/httpd
Trong thi CKAD, có thể test từ pod nội bộ:
kubectl run test --image=busybox --rm -it -- sh
wget -qO- http://ingress-ip/nginx
6. Ingress Với TLS (Nâng Cao)
kubectl create secret tls my-tls --key=privkey.pem --cert=cert.pem
Thêm vào Ingress:
spec:
tls:
- hosts:
- example.com
secretName: my-tls
CKAD Tip: Có thể gặp yêu cầu “add TLS với secret có sẵn”.
7. Debug Ingress Không Hoạt Động
| Lỗi | Nguyên nhân | Fix |
|---|---|---|
| 404 Not Found | Sai path hoặc service | kubectl describe ingress |
| No Address | Controller chưa gán IP | Check pod ingress-nginx |
| Invalid host | Sai host rule |
Dùng --resolve trong curl |
Debug nhanh:
kubectl describe ingress demo-ingress
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
Network Policy Bảo Mật Traffic Trong Cluster
1. Network Policy Là Gì?
Network Policy là firewall ở cấp Pod, định nghĩa các rule ingress/egress dựa trên labels, namespaces, ports hoặc IPs. Mặc định, Kubernetes allow all traffic => tiềm ẩn rủi ro bảo mật.
| Loại Policy | Mô tả |
|---|---|
| Ingress | Kiểm soát traffic vào pod |
| Egress | Kiểm soát traffic ra khỏi pod |
Trong kỳ thi, luôn giả định CNI hỗ trợ Network Policy (Calico hoặc Cilium).
2. YAML Mẫu Network Policy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 5432
CKAD Golden Rule:
podSelector: chọn pod áp dụng.from/to: có thể gồm podSelector, namespaceSelector hoặc ipBlock.- Không có rule nào => Deny all.
3. Thực Hành: Allow Frontend => Backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
namespace: backend-ns
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: frontend-project
ports:
- protocol: TCP
port: 80
Test:
kubectl -n frontend-ns exec -it frontend-pod -- curl backend-svc.backend-ns:80
kubectl exec -it other-pod -- curl backend-svc.backend-ns:80 # Timeout
4. Policy Deny All
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Mẹo: Deny all trước, rồi thêm các rule allow cụ thể.
5. Debug Network Policy
| Lỗi | Nguyên nhân | Cách fix |
|---|---|---|
| Traffic vẫn qua | Sai selector | kubectl describe netpol |
| Deny sai | Thiếu policyTypes |
Thêm Ingress/Egress |
| Không áp dụng | CNI không hỗ trợ | Trong thi luôn có hỗ trợ |
Bài Tập CKAD (8 Phút)
Đề:
Trong namespace secure:
- Tạo 2 Service (
api-svc,web-svc) - Tạo Ingress
main-ingressvới route/api=>api-svc:8080,/=>web-svc:80 - Tạo Network Policy
api-policychỉ cho phéprole=webtruy cậprole=apiqua port 8080.
Đáp án: giữ nguyên như bài bạn gửi YAML services, ingress, netpol
Liên Hệ Với Chứng Chỉ CKAD
Domain Services & Networking (20%) thường có 2–3 câu hỏi xoay quanh Ingress và Network Policy, với tổng điểm rất cao vì đòi hỏi bạn hiểu rõ cấu trúc YAML và tư duy kết nối giữa các tài nguyên.
Trong kỳ thi, bạn có thể gặp task như:
- Tạo Ingress route
/api=>api-svc:8080,/=>web-svc:80. - Thêm TLS vào Ingress có sẵn bằng secret
my-tls. - Tạo Network Policy cho phép traffic từ namespace
frontendđến pod có labelapp=backendport 80. - Debug tình huống traffic không bị block do sai
podSelectorhoặc thiếupolicyTypes.
Mẹo thi:
- Luôn dùng API version
networking.k8s.io/v1(các version cũ đã bị deprecate). - Với Ingress, chú ý
pathTypevàbackend.service.port.number. - Với Network Policy, luôn xác định rõ
podSelectormục tiêu và loại policy (Ingress,Egress). - Kiểm tra bằng
kubectl describe ingresshoặckubectl get netpolđể xem điều kiện apply thực tế.
Tóm Tắt Kiến Thức Cho CKAD
| Khái niệm | Giá trị cần nhớ |
|---|---|
| Ingress API | networking.k8s.io/v1 |
| PathType | Prefix, Exact |
| Policy Types | Ingress, Egress |
| Selectors | podSelector, namespaceSelector, ipBlock |
| Default Behavior | Allow all nếu không có policy |
Kết Luận
Bài này mình đã hướng dẫn chi tiết cách sử dụng Ingress để expose HTTP/HTTPS và Network Policy để bảo vệ traffic nội bộ, kèm ví dụ thực hành và bài tập đúng format CKAD. Bạn giờ đã có thể tự tin cấu hình routing nâng cao và thiết lập bảo mật network trong Kubernetes. Tiếp theo, ở Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes, chúng ta sẽ khép lại domain Networking với các kỹ thuật kiểm soát traffic và cân bằng tải ở cấp hệ thống.
Lúc viết đến bài 12 tưởng như dừng rồi mỗi ngày rảnh viết tí mà cũng gần xong. Mong rằng hữu ích cho mọi người : )





