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.
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".
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.
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.
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 đó.
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.
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.
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"
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".
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 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.
Bây giờ, hãy tạo apod với nhãn "app=source-pod".
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"
Bây giờ, hãy tạo một chính sách mạng với quy tắc egress.
Hãy tạo một pod có nhãn "app=source-pod" và thử truy cập cả pod "app=source-pod"
wget -qO- --timeout=2http://hello-web: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".
Để 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
- 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ì?
- 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
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
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
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
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
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".