recent
أخبار ساخنة

شرح إعداد network policy في Kubernetes ... بالخطوات

الصفحة الرئيسية
شرح إعداد network policy في في Kubernetes ... بالخطوات



بشكل تلقائي تقبل الـ pods حركة المرور من أي مصدر.
network policy تحدد كيفية اتصال مجموعة من الـ pods ببعضها البعض وبعناصر الشبكة الأخرى.
 تستخدم NetworkPolicy التسميات (labels) لتحديد الـ pods وتحديد القواعد (rules) لتحديد حركة المرور المسموح بها للـ pods المحددة بمجرد تطبيق الـ network policy على pod معينة سترفض الـ pod الاتصالات غير المسموح بها في NetworkPolicy.

ستستمر الـ pods التي لم يتم تحديدها بواسطة أي network policy في قبول كل حركة المرور.

المتطلبات

Kubernetes Cluster تحتوي على node واحدة على الأقل.

إنشاء Network Policies

Ingress Network Policy


قم بإنشاء hello-web pod مع تسمية app-destination-pod والخدمة التي سنسمح فيها بحركة المرور الواردة على المنفذ 8080.

kubectl run hello-web --labels app=destination-pod --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --
kubectl get pod | grep hello-web

kubectl get service | grep hello-web



قم بإنشاء ملف تعريف إدخال باستخدام المحتوى التالي الذي يسمح بحركة المرور على hello-web مع التسمية app = destination-pod على المنفذ 8080 من الـ pod المطابقة للتسمية app = source-pod.


vim ingress.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: destination-pod-allow-from-source-pod
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: destination-pod
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: source-pod



قبل أن ننشئ ingress policy  قم بإنشاء pod ذات تسمية app = unknown لا تتطابق مع القاعدة.


kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1

الآن عندما نحاول الوصول إلى hello-web الخاص بنا على المنفذ 8080 من هذه الـ  pod  سيكون متاحًا.

wget -qO- --timeout=2 http://hello-web:8080



أنشئ الآن policy تسمح بالاتصال على الـ pod بالتسمية app = destination-pod من المجموعة التي تحمل التسمية app = source-pod.
احصل على التفاصيل عنها.


kubectl apply -f ingress.yml
kubectl get networkpolicy destination-pod-allow-from-source-pod



الآن قم مرة أخرى بإنشاء pod ذات تسمية لا تتطابق مع القاعدة المحددة في الـ policy.


kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1

إذا حاولنا مرة أخرى الوصول إلى الـ pod التي تسمى hello-web من هذه المجموعة فلن يمكن الوصول إليها.

wget -qO- --timeout=2 http://hello-web:8080



دعنا ننشئ pod يطابق قاعدة الـ network policy  أي pod مع التسمية "app = source-app" 

kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-1

Now, if we try to access the "hello-web" pod  from the pod with label "app=source-pod", the "hello-web" can be accessed.
إذا حاولنا الوصول إلى الـ pod  التي تسمى  hello-web من الـ pod  ذات التسمية app = source-pod فيمكن الوصول إليها.

wget -qO- --timeout=2 http://hello-web:8080



يمكنك أن ترى أنه يمكن الوصول إلى الـ pod التي تسمى hello-web من الـ pod التي تحمل التسمية app = source-pod.
هذا يعني أننا قمنا بتقييد الاتصالات على hello-web ولا يمكن الاتصال بها إلا من البودات التي تحمل التسمية "app = source-pod".

Egress Network Policy

أنشئ ملفًا جديدًا لـ Egress Network Policy  بالمحتوى التالي.


vim egress.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: source-pod-allow-to-destination-pod
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: source-pod
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: destination-pod
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP




ستسمح الـ policy السابقة بالاتصالات الصادرة من الـ pod ذات التسمية app = source-pod إلى الـ pod ذات التسمية app = destination-pod وأيضًا على المنفذ 53 للـ DNS.

قبل أن نطبق Egress Policy قم بإنشاء الـ pod ذات التسمية hello-web-2 وخدمة لا تتوافق مع الـ Policy.

kubectl run hello-web-2 --labels app=hello-2 --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
kubectl get pod | grep hello-web-2
kubectl get service | grep hello-web-2


الآن قم بإنشاء الـ pod يحمل التسمية app = source-pod.

kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-2

قبل أن نطبق Egress policy يمكن الوصول إلى كل من التطبيقين hello-web و hello-web-2 من المجموعة التي تحمل التسمية app = source-pod.

wget -qO- --timeout=2 http://hello-web:8080
wget -qO- --timeout=2 http://hello-web-2:8080



الآن ، قم بإنشاء Network policy مع قاعدة الـ egress.


kubectl create -f egress.yml
kubectl get networkpolicy | grep source-pod-allow-to-destination-pod



انشئ pod يحمل التسمية app = source-pod ونحاول الوصول إلى كل من pod app = source-pod


kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-3
wget -qO- --timeout=2 http://hello-web:8080

wget -qO- --timeout=2 http://hello-web-2:8080


في الشاشة السابقة يمكنك ملاحظة أنه هذه المرة لم يكن من الممكن الوصول إلى الـ pod ذات التسمية hello-web-2 لأنه لا يتطابق مع الـ egress policy التي تسمح بالاتصال من الـ pod الذي يحمل التسمية app = source-pod إلى الـ pod باستخدام التسمية app = destination-pod.


google-playkhamsatmostaqltradent