- vừa được xem lúc

Restrict network trong K8s với NetworkPolicy

0 0 50

Người đăng: Hoàng Việt

Theo Viblo Asia

NetworkPolicy làm gì?

Network Policy giúp chúng ta kiểm soát lưu lượng truy cập mạng trong cụm Cluster tại Layer 3,4. Để có thể xác định được gói tin có được chấp nhận hay không ta có thể lọc với các thành phần:

Thông qua các label được gắn vào pod Thông qua 1 cụm các pod chung namespace Thông qua một dải IP (IP Block) VD: 172.0.1.0/24

Có thể xem NetworkPolicy sẽ định nghĩa ra các "firewall rules" để kiểm tra các gói tin đến và đi trước mỗi Pod.

Định nghĩa NetworkPolicy

NetworkPolicy là một resource trong k8s, chính vì vậy ta sẽ định nghĩa dưới file Yaml.

Network Policy sẽ kiểm soát lưu lượng mạng vào (Ingress) và ra (Egress)

Ingress

Mặc định nếu không khai báo trường Ingress thì sẽ allow toàn bộ traffic vào pod, ví dụ sau sẽ cho phép kết nối đến pod chạy dịch vụ mysql tại port 3306

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: name: test-networkpolicy (1) namespace: default (2)
spec: policyTypes: (3) - Ingress ingress: - from: - ipBlock: (4) cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - podSelector: (5) matchLabels: role: frontend - namespaceSelector: (6) matchLabels: kubernetes.io/metadata.name: test-namespace ports: (7) - port: 3306 protocol: TCP podSelector: (8) matchLabels: app.kubernetes.io/instance: mysql

Giải thích:

(1) Tên của networkPolicy sẽ tạo

(2) Namespace sẽ áp dụng NetworkPolicy này, nếu không khai báo thì mặc định sẽ apply cho namespace mặc định trong kube config.

(3) Liệt kê các loại Policy sẽ định nghĩa. (Ingress, Egress hoặc cả 2)

(4) Liệt kê dải IP sẽ được chấp thuận kết nối (Ví dụ này sẽ allow dải 172.17.0.0 đến 172.17.255.255 trừ dải ở giữa 172.17.1.0 đến 172.17.1.255 )

(5) Cho phép các pod có label là role=fontend được kết nối.

(6) Cho phép các pod từ namespace có label là kubernetes.io/metadata.name=test-namespace được kết nối.

(7) Định nghĩa các destination port được kết nối đến cùng giao thức, ở đây là port của MySQL 3306 với giao thức TCP.

(8) Chọn các pod có label app.kubernetes.io/instance: mysql trong namespace default để áp dụng policy.

Egress:

Tương tự Ingress, Egress sẽ định nghĩa luật cho phép những gói tin nào được phép đi ra ngoài. Egress sẽ lọc gói tin bằng Destination IP và Destination Port.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: name: test-network-policy namespace: default
spec: podSelector: matchLabels: role: db policyTypes: (1) - Egress egress: - to: - ipBlock: (2) cidr: 10.0.0.0/24 ports: (3) - protocol: TCP port: 5978 endPort: 8000

Giải thích:

(1) Định nghĩa kiểu luật sẽ áp dụng (Ingress hoặc Egress)

(2) Xác định IP đích mà được phép giao tiếp

(3) Xác định số hiệu cổng đích được phép giao tiếp (Ở phiên bản K8s 1.22 cho phép ta định nghĩa 1 dải các Port bằng cách thêm trường endPort)

Một số case đặc biệt

Deny toàn bộ Ingress traffic vào toàn bộ pod trong namespace mặc định (Không khai báo namespace thì sẽ áp dụng cho namespace mặc định)

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: name: default-deny-ingress
spec: podSelector: {} policyTypes: - Ingress

Allow toàn bộ traffic vào toàn bộ pod

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: name: allow-all-ingress
spec: podSelector: {} ingress: - {} policyTypes: - Ingress

Deny toàn bộ Egress traffic

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: name: default-deny-egress
spec: podSelector: {} policyTypes: - Egress

Allow toàn bộ Egress traffic

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: name: allow-all-egress
spec: podSelector: {} egress: - {} policyTypes: - Egress

Tham khảo:

https://kubernetes.io/docs/concepts/services-networking/network-policies/

https://sysdig.com/learn-cloud-native/kubernetes-security/network-security/

https://viblo.asia/p/kubernetes-series-bai-14-podsecuritypolicies-networkpolicy-security-cho-cluster-nodes-va-network-djeZ1d1gKWz

Bình luận

Bài viết tương tự

- vừa được xem lúc

Phần 1: Giới thiệu về Kubernetes

Kubernetes là gì. Trang chủ: https://kubernetes.io/. Ai cần Kubernetes.

0 0 97

- vừa được xem lúc

Thực hành K8S trên Google Cloud

Kubernetes (K8S) trở nên quá phổ biến ở thời điểm hiện tại, ai cũng nói về nó. Trong bài hôm nay mình sẽ không đi quá nhiều vào các định nghĩa, mà đi thẳng vào thực tế để mọi người dễ hình dung.

0 0 31

- vừa được xem lúc

Kubernetes best practices - Liveness và Readiness Health checks

Mở đầu. Kubernetes cung cấp cho bạn một framework để chạy các hệ phân tán một cách mạnh mẽ.

0 0 46

- vừa được xem lúc

Kubernetes - deployment.yaml explained

Trong bài trước, mình có giới thiệu chạy các câu lệnh K8S bằng Command Line. Để tạo 1 deloyment đơn giản chỉ cần chạy lệnh.

0 0 88

- vừa được xem lúc

Tìm hiểu cơ bản về Kubernetes - K8s (Part 2): Minikube

Lời mở đầu. .

0 0 44

- vừa được xem lúc

ETCD - Bộ não của Kubernetes và cách cài đặt cụm ETCD Cluster (High Availability)

Hello anh em, sau vài ngày nghiên cứu đọc lại liệu cũng như cài cắm thủ công đủ thể loại, với vô số lỗi fail thì mình cũng cài đặt thành công cụm etcd cluster một cách thủ công. Trước giờ chuyên tạo c

0 0 41