Bài 16: Sử Dụng Ingress Và Network Policy

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.

https://i.imgur.com/K80I4gN.png

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 nginxhttpd đã 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 Policyfirewall ở 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:

  1. Tạo 2 Service (api-svc, web-svc)
  2. Tạo Ingress main-ingress với route /api => api-svc:8080, / => web-svc:80
  3. Tạo Network Policy api-policy chỉ cho phép role=web truy cập role=api qua 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 IngressNetwork 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ó label app=backend port 80.
  • Debug tình huống traffic không bị block do sai podSelector hoặc thiếu policyTypes.

Mẹo thi:

  • Luôn dùng API version networking.k8s.io/v1 (các version cũ đã bị deprecate).
  • Với Ingress, chú ý pathTypebackend.service.port.number.
  • Với Network Policy, luôn xác định rõ podSelector mục tiêu và loại policy (Ingress, Egress).
  • Kiểm tra bằng kubectl describe ingress hoặc kubectl 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 : )

Điều hướng chuỗi bài viết<< Bài 15: Cấu Hình Service (ClusterIP, NodePort)>> Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận