Network Policy trong Kubernetes

Bài viết này giới thiệu về Network Policies trong Kubernetes giúp người học hiểu rõ về luồng traffic và các quy tắc mạng trong Kubernetes. Sử dụng ví dụ đơn giản về luồng traffic giữa web server, API server và database server.

1. Luồng traffic và quy tắc

Quy tắc ingress(traffic đến) cho web server để chấp nhận traffic HTTP trên port 80.

Quy tắc egress(traffic đi) cho web server để cho phép traffic đến API server trên port 5000.

Quy tắc ingress cho API server để chấp nhận traffic trên port 5000.

Quy tắc egress cho API server để cho phép traffic đến database server trên port 3306.

Quy tắc ingress cho database server để chấp nhận traffic trên port 3306.

2. Mạng trong Kubernetes

Mạng trong Kubernetes, bao gồm các thành phần như node, pod và service. Mỗi node, pod và service đều có địa chỉ IP riêng biệt.

Các pod giao tiếp với nhau thông qua virtual private network mà không cần cấu hình bổ sung. Mặc định các Kubernetes cho phép mọi traffic (all-allow) giữa các Pod và service.

3. Network Policies trong Kubernetes

Network Policies, cho phép người dùng kiểm soát luồng traffic giữa các pod. Ví dụ chặn web server truy cập trực tiếp vào database server.

3.1 Cách hoạt động của Network Policies

Network Policy là một đối tượng trong namespace của Kubernetes, tương tự như pod, replica set hoặc service.

Network Policy được liên kết với một hoặc nhiều pod bằng cách sử dụng nhãn (label) và bộ chọn (selector).

Người dùng có thể định nghĩa các quy tắc trong Network Policy, ví dụ như cho phép ingress traffic từ API server đến database server trên port 3306.

Khi Network Policy được tạo, nó sẽ chặn mọi traffic khác đến pod, ngoại trừ traffic phù hợp với quy tắc đã định nghĩa.

3.2 Cách áp dụng Network Policies

Giải thích cách liên kết Network Policy với pod bằng cách sử dụng nhãn và bộ chọn.

Nêu rõ cách định nghĩa quy tắc trong Network Policy, bao gồm:

Loại chính sách (ingress, egress hoặc cả hai).

Quy tắc ingress, bao gồm nguồn traffic, port và bộ chọn pod.

Sử dụng ví dụ để minh họa cách tạo Network Policy.

Ví dụ: Mục tiêu là bảo vệ database pod, chỉ cho phép API pod truy cập vào port 3306 của nó.

Cách thực hiện: 

  • Tạo Network Policy có tên là “db-policy”.
  • Liên kết Network Policy với database pod bằng cách sử dụng nhãn (label) và bộ chọn (selector).
  • Thêm trường podSelector với tùy chọn matchLabels và chỉ định nhãn role=db cho database pod.
  • Việc này sẽ chặn mọi traffic đến và đi từ database pod.

Tạo ingress:

  • Tạo phần ingress trong Network Policy.
  • Mỗi quy tắc trong ingress có hai trường: from và ports.
  • Trường from định nghĩa nguồn traffic được phép đến database pod.
  • Sử dụng podSelector để chỉ định nhãn của API pod.
  • Trường ports định nghĩa port trên database pod mà traffic được phép đến.
  • Trong trường hợp này, port là 3306 với giao thức TCP.

Các loại selector trong from:

Liệt kê ba loại selector được hỗ trợ trong trường from của ingress:

  • podSelector: chọn pod dựa trên nhãn.
  • namespaceSelector: chọn namespace dựa trên nhãn.
  • ipBlock: chọn dải IP.

Các selector này có thể được sử dụng riêng lẻ hoặc kết hợp trong một quy tắc.

4. Network Policies và các giải pháp mạng

Nêu rõ việc Network Policies được áp dụng bởi giải pháp mạng được triển khai trên cluster Kubernetes.

Một số giải pháp mạng hỗ trợ Network Policies, như Cube Router, Calico, Romana và WaveNet.

Lưu ý rằng Flannel không hỗ trợ Network Policies.

Lưu ý rằng Network Policies vẫn có thể được tạo ra ngay cả khi giải pháp mạng không hỗ trợ, nhưng chúng sẽ không được áp dụng.

Việc cấu hình Network Policies có thể ảnh hưởng đến khả năng kết nối và chức năng của ứng dụng. Do đó, cần cẩn thận khi cấu hình các thiết lập này.

How many network policies do you see in the environment?

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: internal-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      name: internal
  policyTypes:
  - Egress
  - Ingress
  ingress:
    - {}
  egress:
  - to:
    - podSelector:
        matchLabels:
          name: mysql
    ports:
    - protocol: TCP
      port: 3306

  - to:
    - podSelector:
        matchLabels:
          name: payroll
    ports:
    - protocol: TCP
      port: 8080

  - ports:
    - port: 53
      protocol: UDP
    - port: 53
      protocol: TCP

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em