Chính sách mạng trong Kubernetes

theanh

Administrator
Nhân viên
Theo mặc định, các pod chấp nhận lưu lượng từ bất kỳ nguồn nào. Chính sách mạng giúp chỉ định cách một nhóm pod có thể giao tiếp với nhau và các điểm cuối mạng khác. NetworkPolicy sử dụng nhãn để chọn các pod và xác định các quy tắc để chỉ định lưu lượng nào được phép đến các pod đã chọn. Khi có một NetworkPolicy được áp dụng cho một pod cụ thể, pod đó sẽ từ chối các kết nối không được phép NetworkPolicy. Các pod không được bất kỳ NetworkPolicy nào chọn sẽ tiếp tục chấp nhận tất cả lưu lượng.

Để biết thêm thông tin chi tiết về NetworkPolicy, hãy truy cập trang chính thức của Kubernetes tại đây.

Trong bài viết này, chúng ta sẽ xem cách sử dụng Ingress và Egress NetworkPolicy trong đó ingress là lưu lượng truy cập đến pod và egress là lưu lượng truy cập đi ra khỏi pod.

Điều kiện tiên quyết​

  1. Cụm Kubernetes có ít nhất 1 nút công nhân.
    Nếu bạn muốn tìm hiểu cách tạo Cụm Kubernetes, hãy nhấp vào đây. Hướng dẫn này sẽ giúp bạn tạo cụm Kubernetes với 1 Master và 2 Node trên AWS Ubuntu 18.04 EC2 Instances.

Chúng ta sẽ làm gì?​

  1. Tạo chính sách mạng

Tạo chính sách mạng​

Chính sách mạng Ingress​

Tạo pod hello-web có nhãn "app-destination-pod" và dịch vụ mà chúng ta sẽ cho phép lưu lượng truy cập đến trên cổng 8080.
Mã:
kubectl run hello-web --labels app=destination-pod --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --
Mã:
kubectl get pod | grep hello-web
Mã:
kubectl lấy dịch vụ | grep hello-web


Tạo tệp aningressdefinition bằng nội dung sau cho phép lưu lượng truy cập vào pod "hello-web" có nhãn "app=destination-pod" trên cổng 8080 từ pod khớp với nhãn "app=source-pod".
Mã:
vim ingress.yml
Mã:
kind: NetworkPolicyapiVersion: networking.k8s.io/v1metadata: name: destination-pod-allow-from-source-podspec: policyTypes: - Ingress podSelector: matchLabels: app: destination-pod ingress: - from: - podSelector: matchLabels: app: source-pod


Trước khi tạo chính sách aningress, hãy tạo một pod có nhãn "app=unknown" không khớp với quy tắc của chính sách.
Mã:
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
Bây giờ khi chúng ta thử truy cập "hello-web"podon cổng 8080 từ thispod, pod sẽ có thể truy cập được.
Mã:
wget -qO- --timeout=2 http://hello-web:8080


Bây giờ hãy tạo một chính sách cho phép kết nối trên pod có nhãn "app=destination-pod" từ pod có nhãn "app=source-pod" và lấy thông tin chi tiết về chính sách đó.
Mã:
kubectl apply -f ingress.yml
Mã:
kubectl get networkpolicy destination-pod-allow-from-source-pod


Bây giờ, hãy tạo lại một pod có nhãn không khớp với quy tắc được xác định trong chính sách.
Mã:
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
Nếu chúng ta thử truy cập pod "hello-web" từ pod này một lần nữa, pod "hello-web" sẽ không thể truy cập được.
Mã:
wget -qO- --timeout=2 http://hello-web:8080


Lần này, hãy tạo một pod khớp với quy tắc chính sách mạng, tức là pod có nhãn "app=source-app"
Mã:
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-1
Bây giờ, nếu chúng ta thử truy cập pod "hello-web" từ pod có nhãn "app=source-pod", thì có thể truy cập được "hello-web".
Mã:
wget -qO- --timeout=2 http://hello-web:8080


Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng "hello-web"pod có thể truy cập được từ pod có nhãn "app=source-pod". Điều này có nghĩa là chúng tôi đã hạn chế các kết nối trên "hello-web" của mình và chỉ những pod có nhãn "app=source-pod" mới có thể kết nối với nó.

Chính sách EgressNetwork​

Tạo một tệp mới cho Chính sách mạng Egress với nội dung sau.
Mã:
vim egress.yml
Mã:
kind: NetworkPolicyapiVersion: networking.k8s.io/v1metadata: name: source-pod-allow-to-destination-podspec: policyTypes: - Egress podSelector: matchLabels: app: source-pod egress: - to: - podSelector: matchLabels: app: destination-pod - ports: - port: 53 protocol: TCP - port: 53 protocol: UDP


Chính sách trên sẽ cho phép các kết nối đi từ pod có nhãn "app=source-pod" đến pod với nhãn "app=destination-pod" và cũng trên cổng 53 để phân giải DNS.

Trước khi áp dụng Chính sách thoát trong cụm, hãy tạo apod "hello-web-2" và dịch vụ không khớp với chính sách của chúng tôi.
Mã:
kubectl chạy hello-web-2 --labels app=hello-2 --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
Mã:
kubectl lấy pod | grep hello-web-2
Mã:
kubectl lấy dịch vụ | grep hello-web-2


Bây giờ, hãy tạo apod với nhãn "app=source-pod".
Mã:
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-2
Trước khi áp dụng chính sách Egress, cả hai ứng dụng "hello-web" và "hello-web-2" đều có thể được truy cập từ pod với nhãn "app=source-pod"
Mã:
wget -qO- --timeout=2http://hello-web:8080
Mã:
wget -qO- --timeout=2http://hello-web-2:8080


Bây giờ, hãy tạo một chính sách mạng với quy tắc egress.
Mã:
kubectl create -f egress.yml
Mã:
kubectl get networkpolicy | grep source-pod-allow-to-destination-pod


Hãy tạo một pod có nhãn "app=source-pod" và thử truy cập cả pod "app=source-pod"
Mã:
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-3
wget -qO- --timeout=2http://hello-web:8080
Mã:
wget -qO- --timeout=2 http://hello-web-2:8080


Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng lần này pod "hello-web-2" không thể truy cập được vì nó không khớp với chính sách thoát cho phép kết nối từ pod có nhãn "app=source-pod" đến pod có nhãn "app=destination-pod".

Kết luận​

Trong bài viết này, chúng ta đã thấy các bước để tạo chính sách mạng ingress và egress. Chúng ta cũng thấy cách kết nối đến và đi có thể bị hạn chế bằng cách sử dụng ingress và egress tương ứng và để hiểu rõ hơn về điều này, chúng ta đã thấy cách triển khai bằng một ứng dụng web đơn giản.
 
Back
Bên trên