1. مقدمة
يتيح Google Cloud Platform منذ فترة طويلة استخدام واجهات متعددة على مستوى مثيل الجهاز الافتراضي. باستخدام واجهات متعددة، يمكن لآلة افتراضية ربط ما يصل إلى 7 واجهات جديدة (الواجهة التلقائية + 7 واجهات) بشبكات VPC مختلفة. توسّع خدمة GKE Networking هذا السلوك ليشمل اللوحات التي تعمل على العُقد. قبل توفّر هذه الميزة، كانت مجموعات GKE تسمح لجميع NodePools بأن تتضمّن واجهة واحدة فقط، وبالتالي يتم ربطها بشبكة VPC واحدة. باستخدام ميزة "الشبكات المتعددة على الحاويات"، يمكن للمستخدم الآن تفعيل أكثر من واجهة واحدة على العُقد والحاويات في مجموعة GKE.
ما ستنشئه
في هذا البرنامج التعليمي، ستنشئ بيئة شاملة متعددة واجهات الشبكة في GKE توضّح حالات الاستخدام الموضّحة في الشكل 1.
- أنشئ netdevice-l3-pod باستخدام busybox لتنفيذ ما يلي:
- تنفيذ PING وwget -S على مثيل netdevice-apache في شبكة netdevice-vpc عبر eth2
- تنفيذ PING وwget -S على مثيل l3-apache في l3-vpc عبر eth1
- أنشئ مجموعة l3-pod تستخدم busybox لتنفيذ PING وwget -S إلى مثيل l3-apache عبر eth1
في كلتا حالتي الاستخدام، تكون واجهة eth0 الخاصة بالحزمة مرتبطة بالشبكة التلقائية.
الشكل 1

ما ستتعلمه
- كيفية إنشاء شبكة فرعية من النوع l3
- كيفية إنشاء شبكة فرعية من نوع netdevice
- كيفية إنشاء مجموعة عقد GKE متعددة واجهات الشبكة
- كيفية إنشاء مجموعة أجهزة مع إمكانات netdevice وl3
- كيفية إنشاء مجموعة باستخدام إمكانات المستوى 3
- كيفية إنشاء شبكة كائنات GKE والتحقّق من صحتها
- كيفية التحقّق من إمكانية الاتصال بخوادم Apache البعيدة باستخدام PING وwget وسجلات جدار الحماية
المتطلبات
- مشروع Google Cloud
2. المصطلحات والمفاهيم
شبكة VPC الأساسية: شبكة VPC الأساسية هي شبكة VPC تم إعدادها مسبقًا وتتضمّن مجموعة من الإعدادات والموارد التلقائية. يتم إنشاء مجموعة GKE في شبكة VPC هذه.
الشبكة الفرعية: في Google Cloud، الشبكة الفرعية هي طريقة لإنشاء توجيه بين النطاقات بدون فئات (CIDR) باستخدام أقنعة الشبكة في شبكة VPC. تحتوي الشبكة الفرعية على نطاق عنوان IP أساسي واحد يتم تعيينه للعُقد، ويمكن أن تحتوي على نطاقات ثانوية متعددة يمكن أن تنتمي إلى وحدات Pod وخدمات.
شبكة العُقدة: تشير شبكة العُقدة إلى مجموعة مخصّصة من شبكة VPC وشبكة فرعية. ضمن شبكة العُقد هذه، يتم تخصيص عناوين IP للعُقد التابعة لمجموعة أجهزة ذات التخصيص نفسه من نطاق عناوين IP الأساسي.
النطاق الثانوي: النطاق الثانوي في Google Cloud هو CIDR وقناع شبكة ينتميان إلى منطقة في شبكة VPC. يستخدم GKE هذا الخيار كشبكة Pod من الطبقة 3. يمكن أن تحتوي شبكة VPC على نطاقات ثانوية متعددة، ويمكن أن يرتبط Pod بشبكات Pod متعددة.
الشبكة (الطبقة 3 أو الجهاز): عنصر شبكة يعمل كنقطة اتصال للحاويات. في البرنامج التعليمي، تكون الشبكات l3-network وnetdevice-network، حيث يمكن أن يكون الجهاز إما netdevice أو dpdk. الشبكة التلقائية إلزامية ويتم إنشاؤها عند إنشاء المجموعة استنادًا إلى الشبكة الفرعية التلقائية لمجموعة العُقد.
تتجاوب شبكات الطبقة 3 مع نطاق ثانوي على شبكة فرعية، ويتم تمثيله على النحو التالي:
VPC -> اسم الشبكة الفرعية -> اسم النطاق الثانوي
تتطابق شبكة الجهاز مع شبكة فرعية على شبكة VPC، ويتم تمثيلها على النحو التالي:
VPC -> اسم الشبكة الفرعية
شبكة Pod التلقائية: تنشئ Google Cloud شبكة Pod تلقائية أثناء إنشاء المجموعة. تستخدم شبكة Pod التلقائية شبكة VPC الأساسية كشبكة عقدة. تتوفّر شبكة Pod التلقائية على جميع عُقد المجموعات وPods تلقائيًا.
حاويات Pod متعددة الواجهات: لا يمكن ربط حاويات Pod متعددة الواجهات في GKE بشبكة Pod نفسها لأنّه يجب ربط كل واجهة من واجهات الحاوية بشبكة فريدة.
تعديل المشروع ليتوافق مع الدرس التطبيقي
يستفيد هذا الدرس التطبيقي حول الترميز من المتغيرات $للمساعدة في تنفيذ إعدادات gcloud في Cloud Shell.
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
3- إعداد شبكة VPC الأساسية
إنشاء شبكة VPC الأساسية
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks create primary-vpc --project=$projectid --subnet-mode=custom
إنشاء العقدة والشبكات الفرعية الثانوية
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks subnets create primary-node-subnet --project=$projectid --range=192.168.0.0/24 --network=primary-vpc --region=us-central1 --enable-private-ip-google-access --secondary-range=sec-range-primay-vpc=10.0.0.0/21
4. إنشاء مجموعة GKE
أنشئ مجموعة GKE خاصة تحدّد الشبكات الفرعية لشبكة VPC الأساسية لإنشاء مجموعة العُقد التلقائية باستخدام العلامتَين المطلوبتَين enable-multi-networking وenable-dataplane-v2 لإتاحة مجموعات العُقد المتعددة واجهات الشبكة.
داخل Cloud Shell، أنشئ مجموعة GKE:
gcloud container clusters create multinic-gke \
--zone "us-central1-a" \
--enable-dataplane-v2 \
--enable-ip-alias \
--enable-multi-networking \
--network "primary-vpc" --subnetwork "primary-node-subnet" \
--num-nodes=2 \
--max-pods-per-node=32 \
--cluster-secondary-range-name=sec-range-primay-vpc \
--no-enable-master-authorized-networks \
--release-channel "regular" \
--enable-private-nodes --master-ipv4-cidr "100.100.10.0/28" \
--enable-ip-alias
التحقّق من صحة مجموعة multinic-gke
داخل Cloud Shell، صادِق على المجموعة:
gcloud container clusters get-credentials multinic-gke --zone us-central1-a --project $projectid
داخل Cloud Shell، تحقَّق من إنشاء عقدتَين من المجموعة التلقائية:
kubectl get nodes
مثال:
user@$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p Ready <none> 2m4s v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb Ready <none> 2m4s v1.27.3-gke.100
5. إعداد netdevice-vpc
إنشاء شبكة netdevice-vpc
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks create netdevice-vpc --project=$projectid --subnet-mode=custom
إنشاء الشبكات الفرعية netdevice-vpc
داخل Cloud Shell، أنشئ الشبكة الفرعية المستخدَمة لشبكة multinic netdevice:
gcloud compute networks subnets create netdevice-subnet --project=$projectid --range=192.168.10.0/24 --network=netdevice-vpc --region=us-central1 --enable-private-ip-google-access
داخل Cloud Shell، أنشئ شبكة فرعية لمثيل netdevice-apache:
gcloud compute networks subnets create netdevice-apache --project=$projectid --range=172.16.10.0/28 --network=netdevice-vpc --region=us-central1 --enable-private-ip-google-access
إعداد Cloud Router وNAT
يتم استخدام Cloud NAT في البرنامج التعليمي لتثبيت حزمة البرامج لأنّ مثيل الجهاز الافتراضي لا يتضمّن عنوان IP خارجيًا.
داخل Cloud Shell، أنشئ موجّه السحابة.
gcloud compute routers create netdevice-cr --network netdevice-vpc --region us-central1
داخل Cloud Shell، أنشئ بوابة NAT.
gcloud compute routers nats create cloud-nat-netdevice --router=netdevice-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
إنشاء مثيل netdevice-apache
في القسم التالي، ستنشئ مثيل netdevice-apache.
داخل Cloud Shell، أنشئ المثيل:
gcloud compute instances create netdevice-apache \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=netdevice-apache \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Welcome to the netdevice-apache instance !!' | tee /var/www/html/index.html
EOF"
6. إعداد شبكة VPC من الطبقة 3
إنشاء شبكة l3-vpc
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks create l3-vpc --project=$projectid --subnet-mode=custom
إنشاء الشبكات الفرعية لشبكة VPC من الطبقة 3
داخل Cloud Shell، أنشئ شبكة فرعية ذات نطاق أساسي ونطاق ثانوي. يتم استخدام النطاق الثانوي(sec-range-l3-subnet) لشبكة الطبقة 3 ذات واجهات الشبكة المتعددة:
gcloud compute networks subnets create l3-subnet --project=$projectid --range=192.168.20.0/24 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access --secondary-range=sec-range-l3-subnet=10.0.8.0/21
داخل Cloud Shell، أنشئ شبكة فرعية لمثيل l3-apache:
gcloud compute networks subnets create l3-apache --project=$projectid --range=172.16.20.0/28 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access
إعداد Cloud Router وNAT
يتم استخدام Cloud NAT في البرنامج التعليمي لتثبيت حزمة البرامج لأنّ مثيل الجهاز الافتراضي لا يتضمّن عنوان IP خارجيًا.
داخل Cloud Shell، أنشئ موجّه السحابة.
gcloud compute routers create l3-cr --network l3-vpc --region us-central1
داخل Cloud Shell، أنشئ بوابة NAT.
gcloud compute routers nats create cloud-nat-l3 --router=l3-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
إنشاء مثيل l3-apache
في القسم التالي، ستنشئ مثيل l3-apache.
داخل Cloud Shell، أنشئ المثيل:
gcloud compute instances create l3-apache \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=l3-apache \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Welcome to the l3-apache instance !!' | tee /var/www/html/index.html
EOF"
7. إنشاء مجموعة عقد multinic
في القسم التالي، ستنشئ مجموعة عقد متعددة واجهات الشبكة تتألف من العلامات التالية:
–additional-node-network (مطلوب لواجهات نوع الجهاز)
مثال:
--additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet
–additional-node-network & –additional-pod-network ( مطلوب لواجهات النوع L3)
مثال:
--additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8
نوع الجهاز: عند نشر مجموعة أجهزة ذات التخصيص نفسه، يجب مراعاة تبعية نوع الجهاز. على سبيل المثال، يمكن لنوع الجهاز "e2-standard-4" الذي يتضمّن 4 وحدات معالجة مركزية افتراضية أن يتيح ما يصل إلى 4 شبكات VPC إجمالاً. على سبيل المثال، سيحتوي netdevice-l3-pod على 3 واجهات إجمالاً (تلقائية وnetdevice وl3)، وبالتالي يكون نوع الجهاز المستخدَم في البرنامج التعليمي هو e2-standard-4.
داخل Cloud Shell، أنشئ مجموعة العُقد التي تتألف من جهاز من النوع L3:
gcloud container --project "$projectid" node-pools create "multinic-node-pool" --cluster "multinic-gke" --zone "us-central1-a" --additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet --additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8 --machine-type "e2-standard-4"
8. التحقّق من صحة multnic-node-pool
داخل Cloud Shell، تحقَّق من إنشاء ثلاث عُقد من multinic-node-pool:
kubectl get nodes
مثال:
user@$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p Ready <none> 15m v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb Ready <none> 15m v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-0tfx Ready <none> 3m51s v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-86gz Ready <none> 3m51s v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-t66p Ready <none> 3m51s v1.27.3-gke.100
9- إنشاء netdevice-network
في الخطوات التالية، ستنشئ عنصر Kubernetes باسم Network وGKNetworkParamSet لإنشاء شبكة netdevice التي سيتم استخدامها لربط وحدات Pod في خطوات لاحقة.
إنشاء عنصر netdevice-network
داخل Cloud Shell، أنشئ عنصر شبكة YAML netdevice-network.yaml باستخدام محرِّر VI أو nano. يُرجى العِلم أنّ "المسارات إلى" هي الشبكة الفرعية 172.16.10.0/28 (netdevice-apache) في netdevice-vpc.
apiVersion: networking.gke.io/v1
kind: Network
metadata:
name: netdevice-network
spec:
type: "Device"
parametersRef:
group: networking.gke.io
kind: GKENetworkParamSet
name: "netdevice"
routes:
- to: "172.16.10.0/28"
داخل Cloud Shell، طبِّق netdevice-network.yaml:
kubectl apply -f netdevice-network.yaml
داخل Cloud Shell، تأكَّد من أنّ "نوع الحالة" في netdevice-network هو "جاهز".
kubectl describe networks netdevice-network
مثال:
user@$ kubectl describe networks netdevice-network
Name: netdevice-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:37:38Z
Generation: 1
Resource Version: 1578594
UID: 46d75374-9fcc-42be-baeb-48e074747052
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: netdevice
Routes:
To: 172.16.10.0/28
Type: Device
Status:
Conditions:
Last Transition Time: 2023-07-30T22:37:38Z
Message: GKENetworkParamSet resource was deleted: netdevice
Reason: GNPDeleted
Status: False
Type: ParamsReady
Last Transition Time: 2023-07-30T22:37:38Z
Message: Resource referenced by params is not ready
Reason: ParamsNotReady
Status: False
Type: Ready
Events: <none>
إنشاء GKENetworkParamSet
في Cloud Shell، أنشئ عنصر الشبكة YAML netdevice-network-parm.yaml باستخدام محرّر VI أو nano. تتطابق المواصفات مع عملية نشر الشبكة الفرعية netdevice-vpc.
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
name: "netdevice"
spec:
vpc: "netdevice-vpc"
vpcSubnet: "netdevice-subnet"
deviceMode: "NetDevice"
داخل Cloud Shell، طبِّق netdevice-network-parm.yaml
kubectl apply -f netdevice-network-parm.yaml
داخل Cloud Shell، تحقَّق من صحة netdevice-network Status Reason GNPParmsReady وNetworkReady:
kubectl describe networks netdevice-network
مثال:
user@$ kubectl describe networks netdevice-network
Name: netdevice-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:37:38Z
Generation: 1
Resource Version: 1579791
UID: 46d75374-9fcc-42be-baeb-48e074747052
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: netdevice
Routes:
To: 172.16.10.0/28
Type: Device
Status:
Conditions:
Last Transition Time: 2023-07-30T22:39:44Z
Message:
Reason: GNPParamsReady
Status: True
Type: ParamsReady
Last Transition Time: 2023-07-30T22:39:44Z
Message:
Reason: NetworkReady
Status: True
Type: Ready
Events: <none>
داخل Cloud Shell، تحقَّق من صحة حظر CIDR gkenetworkparamset 192.168.10.0/24 المستخدَم لواجهة وحدات Pod في خطوة لاحقة.
kubectl describe gkenetworkparamsets.networking.gke.io netdevice
مثال:
user@$ kubectl describe gkenetworkparamsets.networking.gke.io netdevice
Name: netdevice
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: GKENetworkParamSet
Metadata:
Creation Timestamp: 2023-07-30T22:39:43Z
Finalizers:
networking.gke.io/gnp-controller
networking.gke.io/high-perf-finalizer
Generation: 1
Resource Version: 1579919
UID: 6fe36b0c-0091-4b6a-9d28-67596cbce845
Spec:
Device Mode: NetDevice
Vpc: netdevice-vpc
Vpc Subnet: netdevice-subnet
Status:
Conditions:
Last Transition Time: 2023-07-30T22:39:43Z
Message:
Reason: GNPReady
Status: True
Type: Ready
Network Name: netdevice-network
Pod CID Rs:
Cidr Blocks:
192.168.10.0/24
Events: <none>
10. إنشاء شبكات الطبقة 3
في الخطوات التالية، ستنشئ عنصر Kubernetes باسم Network وGKENetworkParamSet لإنشاء شبكة الطبقة 3 التي سيتم استخدامها لربط وحدات Pod في خطوات لاحقة.
إنشاء عنصر شبكة من المستوى 3
داخل Cloud Shell، أنشئ كائن الشبكة YAML l3-network.yaml باستخدام محرِّر VI أو nano. لاحظ أنّ "المسارات إلى" هي الشبكة الفرعية 172.16.20.0/28 (l3-apache) في l3-vpc.
apiVersion: networking.gke.io/v1
kind: Network
metadata:
name: l3-network
spec:
type: "L3"
parametersRef:
group: networking.gke.io
kind: GKENetworkParamSet
name: "l3-network"
routes:
- to: "172.16.20.0/28"
داخل Cloud Shell، طبِّق l3-network.yaml:
kubectl apply -f l3-network.yaml
داخل Cloud Shell، تحقّق من أنّ "نوع الحالة" لشبكة الطبقة 3 هو "جاهز".
kubectl describe networks l3-network
مثال:
user@$ kubectl describe networks l3-network
Name: l3-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:43:54Z
Generation: 1
Resource Version: 1582307
UID: 426804be-35c9-4cc5-bd26-00b94be2ef9a
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: l3-network
Routes:
to: 172.16.20.0/28
Type: L3
Status:
Conditions:
Last Transition Time: 2023-07-30T22:43:54Z
Message: GKENetworkParamSet resource was deleted: l3-network
Reason: GNPDeleted
Status: False
Type: ParamsReady
Last Transition Time: 2023-07-30T22:43:54Z
Message: Resource referenced by params is not ready
Reason: ParamsNotReady
Status: False
Type: Ready
Events: <none>
إنشاء GKENetworkParamSet
داخل Cloud Shell، أنشئ كائن الشبكة YAML l3-network-parm.yaml باستخدام محرّر VI أو nano. لاحظ أنّ الخريطة المواصفاتية تتوافق مع نشر الشبكة الفرعية l3-vpc.
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
name: "l3-network"
spec:
vpc: "l3-vpc"
vpcSubnet: "l3-subnet"
podIPv4Ranges:
rangeNames:
- "sec-range-l3-subnet"
داخل Cloud Shell، طبِّق l3-network-parm.yaml
kubectl apply -f l3-network-parm.yaml
داخل Cloud Shell، تحقَّق من أنّ "سبب الحالة" لشبكة الطبقة 3 هو GNPParmsReady وNetworkReady:
kubectl describe networks l3-network
مثال:
user@$ kubectl describe networks l3-network
Name: l3-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:43:54Z
Generation: 1
Resource Version: 1583647
UID: 426804be-35c9-4cc5-bd26-00b94be2ef9a
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: l3-network
Routes:
To: 172.16.20.0/28
Type: L3
Status:
Conditions:
Last Transition Time: 2023-07-30T22:46:14Z
Message:
Reason: GNPParamsReady
Status: True
Type: ParamsReady
Last Transition Time: 2023-07-30T22:46:14Z
Message:
Reason: NetworkReady
Status: True
Type: Ready
Events: <none>
داخل Cloud Shell، تحقّق من صحة gkenetworkparamset l3-network CIDR 10.0.8.0/21 المستخدَم لإنشاء واجهة وحدة pod.
kubectl describe gkenetworkparamsets.networking.gke.io l3-network
مثال:
user@$ kubectl describe gkenetworkparamsets.networking.gke.io l3-network
Name: l3-network
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: GKENetworkParamSet
Metadata:
Creation Timestamp: 2023-07-30T22:46:14Z
Finalizers:
networking.gke.io/gnp-controller
Generation: 1
Resource Version: 1583656
UID: 4c1f521b-0088-4005-b000-626ca5205326
Spec:
podIPv4Ranges:
Range Names:
sec-range-l3-subnet
Vpc: l3-vpc
Vpc Subnet: l3-subnet
Status:
Conditions:
Last Transition Time: 2023-07-30T22:46:14Z
Message:
Reason: GNPReady
Status: True
Type: Ready
Network Name: l3-network
Pod CID Rs:
Cidr Blocks:
10.0.8.0/21
Events: <none>
11. إنشاء netdevice-l3-pod
في القسم التالي، ستنشئ netdevice-l3-pod الذي يشغّل busybox، المعروف باسم "سكين الجيش السويسري" الذي يتيح أكثر من 300 أمر شائع. تم ضبط الحاوية للتواصل مع l3-vpc باستخدام eth1 وnetdevice-vpc باستخدام eth2.
داخل Cloud Shell، أنشئ حاوية busy box باسم netdevice-l3-pod.yaml باستخدام محرّر VI أو nano.
apiVersion: v1
kind: Pod
metadata:
name: netdevice-l3-pod
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"},
{"interfaceName":"eth2","network":"netdevice-network"}
]
spec:
containers:
- name: netdevice-l3-pod
image: busybox
command: ["sleep", "10m"]
ports:
- containerPort: 80
restartPolicy: Always
داخل Cloud Shell، طبِّق netdevice-l3-pod.yaml
kubectl apply -f netdevice-l3-pod.yaml
التحقّق من صحة إنشاء netdevice-l3-pod
داخل Cloud Shell، تحقَّق من أنّ netdevice-l3-pod قيد التشغيل:
kubectl get pods netdevice-l3-pod
مثال:
user@$ kubectl get pods netdevice-l3-pod
NAME READY STATUS RESTARTS AGE
netdevice-l3-pod 1/1 Running 0 74s
داخل Cloud Shell، تحقَّق من صحة عناوين IP المخصّصة لواجهات Pod.
kubectl get pods netdevice-l3-pod -o yaml
في المثال المقدَّم، يحتوي الحقل networking.gke.io/pod-ips على عناوين IP المرتبطة بواجهات وحدة pod من شبكة الطبقة 3 وشبكة netdevice. يتم توضيح عنوان IP التلقائي للشبكة 10.0.1.22 ضمن podIPs:
user@$ kubectl get pods netdevice-l3-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"networking.gke.io/default-interface":"eth0","networking.gke.io/interfaces":"[\n{\"interfaceName\":\"eth0\",\"network\":\"default\"},\n{\"interfaceName\":\"eth1\",\"network\":\"l3-network\"},\n{\"interfaceName\":\"eth2\",\"network\":\"netdevice-network\"}\n]\n"},"name":"netdevice-l3-pod","namespace":"default"},"spec":{"containers":[{"command":["sleep","10m"],"image":"busybox","name":"netdevice-l3-pod","ports":[{"containerPort":80}]}],"restartPolicy":"Always"}}
networking.gke.io/default-interface: eth0
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"},
{"interfaceName":"eth2","network":"netdevice-network"}
]
networking.gke.io/pod-ips: '[{"networkName":"l3-network","ip":"10.0.8.4"},{"networkName":"netdevice-network","ip":"192.168.10.2"}]'
creationTimestamp: "2023-07-30T22:49:27Z"
name: netdevice-l3-pod
namespace: default
resourceVersion: "1585567"
uid: d9e43c75-e0d1-4f31-91b0-129bc53bbf64
spec:
containers:
- command:
- sleep
- 10m
image: busybox
imagePullPolicy: Always
name: netdevice-l3-pod
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
networking.gke.io.networks/l3-network.IP: "1"
networking.gke.io.networks/netdevice-network: "1"
networking.gke.io.networks/netdevice-network.IP: "1"
requests:
networking.gke.io.networks/l3-network.IP: "1"
networking.gke.io.networks/netdevice-network: "1"
networking.gke.io.networks/netdevice-network.IP: "1"
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-f2wpb
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: gke-multinic-gke-multinic-node-pool-135699a1-86gz
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
- effect: NoSchedule
key: networking.gke.io.networks/l3-network.IP
operator: Exists
- effect: NoSchedule
key: networking.gke.io.networks/netdevice-network
operator: Exists
- effect: NoSchedule
key: networking.gke.io.networks/netdevice-network.IP
operator: Exists
volumes:
- name: kube-api-access-f2wpb
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:28Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:33Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:33Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:28Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://dcd9ead2f69824ccc37c109a47b1f3f5eb7b3e60ce3865e317dd729685b66a5c
image: docker.io/library/busybox:latest
imageID: docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
lastState: {}
name: netdevice-l3-pod
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2023-07-30T22:49:32Z"
hostIP: 192.168.0.4
phase: Running
podIP: 10.0.1.22
podIPs:
- ip: 10.0.1.22
qosClass: BestEffort
startTime: "2023-07-30T22:49:28Z"
التحقّق من صحة مسارات netdevice-l3-pod
داخل Cloud Shell، تحقَّق من صحة المسارات إلى netdevice-vpc وl3-vpc من netdevice-l3-pod:
kubectl exec --stdin --tty netdevice-l3-pod -- /bin/sh
أنشئ الجهاز الظاهري، وتحقَّق من صحة واجهات وحدة Pod:
ifconfig
في المثال، تكون eth0 مرتبطة بالشبكة التلقائية، وeth1 مرتبطة بشبكة l3، وeth2 مرتبطة بشبكة netdevice.
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 26:E3:1B:14:6E:0C
inet addr:10.0.1.22 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:558 (558.0 B)
eth1 Link encap:Ethernet HWaddr 92:78:4E:CB:F2:D4
inet addr:10.0.8.4 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:446 (446.0 B) TX bytes:516 (516.0 B)
eth2 Link encap:Ethernet HWaddr 42:01:C0:A8:0A:02
inet addr:192.168.10.2 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:50581 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:26169 (25.5 KiB) TX bytes:2148170 (2.0 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
من netdevice-l3-pod، تحقّق من صحة المسارات إلى netdevice-vpc (172.16.10.0/28) وl3-vpc (172.16.20.0/28).
أنشئ المثيل، وتحقّق من صحة مسارات وحدة pod:
ip route
مثال:
/ # ip route
default via 10.0.1.1 dev eth0 #primary-vpc
10.0.1.0/24 via 10.0.1.1 dev eth0 src 10.0.1.22
10.0.1.1 dev eth0 scope link src 10.0.1.22
10.0.8.0/21 via 10.0.8.1 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.1 dev eth1 scope link
172.16.10.0/28 via 192.168.10.1 dev eth2 #netdevice-vpc (netdevice-apache subnet)
172.16.20.0/28 via 10.0.8.1 dev eth1 #l3-vpc (l3-apache subnet)
192.168.10.0/24 via 192.168.10.1 dev eth2 #pod interface subnet
192.168.10.1 dev eth2 scope link
للرجوع إلى Cloud Shell، اخرج من الحاوية من الجهاز الظاهري.
exit
12. إنشاء l3-pod
في القسم التالي، ستنشئ l3-pod الذي يشغّل busybox، والمعروف باسم "سكين الجيش السويسري" الذي يتيح أكثر من 300 أمر شائع. تم ضبط وحدة pod للتواصل مع l3-vpc باستخدام eth1 فقط.
داخل Cloud Shell، أنشئ حاوية busy box باسم l3-pod.yaml باستخدام محرّر VI أو nano.
apiVersion: v1
kind: Pod
metadata:
name: l3-pod
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"}
]
spec:
containers:
- name: l3-pod
image: busybox
command: ["sleep", "10m"]
ports:
- containerPort: 80
restartPolicy: Always
داخل Cloud Shell، طبِّق الملف l3-pod.yaml.
kubectl apply -f l3-pod.yaml
التحقّق من صحة إنشاء l3-pod
داخل Cloud Shell، تحقَّق من أنّ netdevice-l3-pod قيد التشغيل:
kubectl get pods l3-pod
مثال:
user@$ kubectl get pods l3-pod
NAME READY STATUS RESTARTS AGE
l3-pod 1/1 Running 0 52s
داخل Cloud Shell، تحقَّق من صحة عناوين IP المخصّصة لواجهات Pod.
kubectl get pods l3-pod -o yaml
في المثال المقدَّم، يحتوي الحقل networking.gke.io/pod-ips على عناوين IP المرتبطة بواجهات وحدة pod من شبكة الطبقة 3. يتم توضيح عنوان IP التلقائي للشبكة 10.0.2.12 ضمن podIPs:
user@$ kubectl get pods l3-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"networking.gke.io/default-interface":"eth0","networking.gke.io/interfaces":"[\n{\"interfaceName\":\"eth0\",\"network\":\"default\"},\n{\"interfaceName\":\"eth1\",\"network\":\"l3-network\"}\n]\n"},"name":"l3-pod","namespace":"default"},"spec":{"containers":[{"command":["sleep","10m"],"image":"busybox","name":"l3-pod","ports":[{"containerPort":80}]}],"restartPolicy":"Always"}}
networking.gke.io/default-interface: eth0
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"}
]
networking.gke.io/pod-ips: '[{"networkName":"l3-network","ip":"10.0.8.22"}]'
creationTimestamp: "2023-07-30T23:22:29Z"
name: l3-pod
namespace: default
resourceVersion: "1604447"
uid: 79a86afd-2a50-433d-9d48-367acb82c1d0
spec:
containers:
- command:
- sleep
- 10m
image: busybox
imagePullPolicy: Always
name: l3-pod
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
networking.gke.io.networks/l3-network.IP: "1"
requests:
networking.gke.io.networks/l3-network.IP: "1"
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-w9d24
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: gke-multinic-gke-multinic-node-pool-135699a1-t66p
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
- effect: NoSchedule
key: networking.gke.io.networks/l3-network.IP
operator: Exists
volumes:
- name: kube-api-access-w9d24
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:29Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:35Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:35Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:29Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://1d5fe2854bba0a0d955c157a58bcfd4e34cecf8837edfd7df2760134f869e966
image: docker.io/library/busybox:latest
imageID: docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
lastState: {}
name: l3-pod
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2023-07-30T23:22:35Z"
hostIP: 192.168.0.5
phase: Running
podIP: 10.0.2.12
podIPs:
- ip: 10.0.2.12
qosClass: BestEffort
startTime: "2023-07-30T23:22:29Z"
التحقّق من صحة مسارات l3-pod
داخل Cloud Shell، تحقَّق من صحة المسارات إلى l3-vpc من netdevice-l3-pod:
kubectl exec --stdin --tty l3-pod -- /bin/sh
أنشئ الجهاز الظاهري، وتحقَّق من صحة واجهات وحدة Pod:
ifconfig
في المثال، تكون eth0 متصلة بالشبكة التلقائية، بينما تكون eth1 متصلة بشبكة l3-network.
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 22:29:30:09:6B:58
inet addr:10.0.2.12 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:558 (558.0 B)
eth1 Link encap:Ethernet HWaddr 6E:6D:FC:C3:FF:AF
inet addr:10.0.8.22 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:446 (446.0 B) TX bytes:516 (516.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
من l3-pod، تحقّق من صحة المسارات إلى l3-vpc (172.16.20.0/28).
أنشئ المثيل، وتحقّق من صحة مسارات وحدة pod:
ip route
مثال:
/ # ip route
default via 10.0.2.1 dev eth0 #primary-vpc
10.0.2.0/24 via 10.0.2.1 dev eth0 src 10.0.2.12
10.0.2.1 dev eth0 scope link src 10.0.2.12
10.0.8.0/21 via 10.0.8.17 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.17 dev eth1 scope link #pod interface subnet
172.16.20.0/28 via 10.0.8.17 dev eth1 #l3-vpc (l3-apache subnet)
للرجوع إلى Cloud Shell، اخرج من الحاوية من الجهاز الظاهري.
exit
13. تحديثات جدار الحماية
للسماح بالاتصال من GKE multicnic-pool إلى netdevice-vpc، يجب توفير قواعد جدار الحماية الواردة netdevice-vpc وl3-vpc. ستنشئ قواعد جدار الحماية التي تحدّد نطاق المصدر على أنّه الشبكة الفرعية لشبكة وحدة pod، مثل netdevice-subnet وsec-range-l3-subnet.
على سبيل المثال، الحاوية التي تم إنشاؤها مؤخرًا، l3-pod، الواجهة eth2 10.0.8.22 (المخصّصة من sec-range-l3-subnet) هي عنوان IP المصدر عند الاتصال بمثيل l3-apache في l3-vpc.
netdevice-vpc: Allow from netdevice-subnet to netdevice-apache
داخل Cloud Shell، أنشئ قاعدة جدار الحماية في netdevice-vpc التي تسمح للشبكة الفرعية netdevice بالوصول إلى مثيل netdevice-apache.
gcloud compute --project=$projectid firewall-rules create allow-ingress-from-netdevice-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=netdevice-vpc --action=ALLOW --rules=all --source-ranges=192.168.10.0/24 --enable-logging
l3-vpc: Allow from sec-range-l3-subnet to l3-apache
داخل Cloud Shell، أنشئ قاعدة جدار الحماية في l3-vpc التي تسمح لـ sec-range-l3-subnet بالوصول إلى مثيل l3-apache.
gcloud compute --project=$projectid firewall-rules create allow-ingress-from-l3-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=l3-vpc --action=ALLOW --rules=all --source-ranges=10.0.8.0/21 --enable-logging
14. التحقّق من إمكانية الاتصال بالحاويات
في القسم التالي، ستتحقّق من إمكانية الاتصال بمثيلات Apache من netdevice-l3-pod وl3-pod عن طريق تسجيل الدخول إلى الحاويات وتشغيل wget -S الذي يتحقّق من تنزيل الصفحة الرئيسية لخوادم Apache. بما أنّ netdevice-l3-pod تم إعداده باستخدام واجهات من netdevice-network وl3-network، يمكن الاتصال بخوادم Apache في netdevice-vpc وl3-vpc.
في المقابل، عند تنفيذ wget -S من l3-pod، لا يمكن الاتصال بخادم Apache في netdevice-vpc لأنّ l3-pod يتم إعداده فقط باستخدام واجهة من l3-network.
الحصول على عنوان IP لخادم Apache
من Cloud Console، احصل على عنوان IP لخوادم Apache من خلال الانتقال إلى Compute Engine → مثيلات الأجهزة الافتراضية

اختبار الاتصال من netdevice-l3-pod إلى netdevice-apache
داخل Cloud Shell، سجِّل الدخول إلى netdevice-l3-pod:
kubectl exec --stdin --tty netdevice-l3-pod -- /bin/sh
من الحاوية، نفِّذ اختبار ping إلى مثيل netdevice-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة.
ping <insert-your-ip> -c 4
مثال:
/ # ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes
64 bytes from 172.16.10.2: seq=0 ttl=64 time=1.952 ms
64 bytes from 172.16.10.2: seq=1 ttl=64 time=0.471 ms
64 bytes from 172.16.10.2: seq=2 ttl=64 time=0.446 ms
64 bytes from 172.16.10.2: seq=3 ttl=64 time=0.505 ms
--- 172.16.10.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.446/0.843/1.952 ms
/ #
داخل Cloud Shell، نفِّذ الأمر wget -S على مثيل netdevice-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة، يشير الرمز 200 OK إلى اكتمال تنزيل صفحة الويب بنجاح.
wget -S <insert-your-ip>
مثال:
/ # wget -S 172.16.10.2
Connecting to 172.16.10.2 (172.16.10.2:80)
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 03:12:58 GMT
Server: Apache/2.4.56 (Debian)
Last-Modified: Sat, 29 Jul 2023 00:32:44 GMT
ETag: "2c-6019555f54266"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
saving to 'index.html'
index.html 100% |********************************| 44 0:00:00 ETA
'index.html' saved
/ #
اختبار الاتصال من netdevice-l3-pod إلى l3-apache
داخل Cloud Shell، نفِّذ عملية ping إلى مثيل l3-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة.
ping <insert-your-ip> -c 4
مثال:
/ # ping 172.16.20.3 -c 4
PING 172.16.20.3 (172.16.20.3): 56 data bytes
64 bytes from 172.16.20.3: seq=0 ttl=63 time=2.059 ms
64 bytes from 172.16.20.3: seq=1 ttl=63 time=0.533 ms
64 bytes from 172.16.20.3: seq=2 ttl=63 time=0.485 ms
64 bytes from 172.16.20.3: seq=3 ttl=63 time=0.462 ms
--- 172.16.20.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.462/0.884/2.059 ms
/ #
في Cloud Shell، احذف ملف index.html السابق ونفِّذ الأمر wget -S على مثيل l3-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة، يشير الرمز 200 OK إلى تنزيل صفحة الويب بنجاح.
rm index.html
wget -S <insert-your-ip>
مثال:
/ # rm index.html
/ # wget -S 172.16.20.3
Connecting to 172.16.20.3 (172.16.20.3:80)
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 03:41:32 GMT
Server: Apache/2.4.56 (Debian)
Last-Modified: Mon, 31 Jul 2023 03:24:21 GMT
ETag: "25-601bff76f04b7"
Accept-Ranges: bytes
Content-Length: 37
Connection: close
Content-Type: text/html
saving to 'index.html'
index.html 100% |*******************************************************************************************************| 37 0:00:00 ETA
'index.html' saved
للرجوع إلى Cloud Shell، اخرج من الحاوية من الجهاز الظاهري.
exit
اختبار اتصال l3-pod بجهاز الشبكة Apache
داخل Cloud Shell، سجِّل الدخول إلى l3-pod:
kubectl exec --stdin --tty l3-pod -- /bin/sh
من الحاوية، نفِّذ اختبار ping إلى مثيل netdevice-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة. بما أنّ l3-pod ليس لديه واجهة مرتبطة بشبكة netdevice، سيتعذّر تنفيذ الأمر ping.
ping <insert-your-ip> -c 4
مثال:
/ # ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes
--- 172.16.10.2 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
اختياري: داخل Cloud Shell، نفِّذ الأمر wget -S على مثيل netdevice-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة والذي سينتهي مهل تنفيذه.
wget -S <insert-your-ip>
مثال:
/ # wget -S 172.16.10.2
Connecting to 172.16.10.2 (172.16.10.2:80)
wget: can't connect to remote host (172.16.10.2): Connection timed out
اختبار اتصال l3-pod بـ l3-apache
داخل Cloud Shell، نفِّذ عملية ping إلى مثيل l3-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة.
ping <insert-your-ip> -c 4
مثال:
/ # ping 172.16.20.3 -c 4
PING 172.16.20.3 (172.16.20.3): 56 data bytes
64 bytes from 172.16.20.3: seq=0 ttl=63 time=1.824 ms
64 bytes from 172.16.20.3: seq=1 ttl=63 time=0.513 ms
64 bytes from 172.16.20.3: seq=2 ttl=63 time=0.482 ms
64 bytes from 172.16.20.3: seq=3 ttl=63 time=0.532 ms
--- 172.16.20.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.482/0.837/1.824 ms
/ #
داخل Cloud Shell، نفِّذ الأمر wget -S على مثيل l3-apache استنادًا إلى عنوان IP الذي تم الحصول عليه من الخطوة السابقة، يشير الرمز 200 OK إلى تنزيل صفحة الويب بنجاح.
wget -S <insert-your-ip>
مثال:
/ # wget -S 172.16.20.3
Connecting to 172.16.20.3 (172.16.20.3:80)
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 03:52:08 GMT
Server: Apache/2.4.56 (Debian)
Last-Modified: Mon, 31 Jul 2023 03:24:21 GMT
ETag: "25-601bff76f04b7"
Accept-Ranges: bytes
Content-Length: 37
Connection: close
Content-Type: text/html
saving to 'index.html'
index.html 100% |*******************************************************************************************************| 37 0:00:00 ETA
'index.html' saved
/ #
15. سجلّات جدار الحماية
تتيح لك ميزة "تسجيل قواعد جدار الحماية" تدقيق تأثيرات قواعد جدار الحماية والتحقّق منها وتحليلها. على سبيل المثال، يمكنك تحديد ما إذا كانت قاعدة جدار الحماية المصمَّمة لرفض الزيارات تعمل على النحو المطلوب. تكون ميزة "تسجيل قواعد جدار الحماية" مفيدة أيضًا إذا كنت بحاجة إلى تحديد عدد عمليات الربط المتأثرة بقاعدة جدار حماية معيّنة.
في البرنامج التعليمي، فعّلت تسجيل جدار الحماية عند إنشاء قواعد جدار الحماية الواردة. لنلقِ نظرة على المعلومات التي تم الحصول عليها من السجلات.
من Cloud Console، انتقِل إلى Logging → مستكشف السجلّات
أدرِج طلب البحث أدناه وفقًا للقطة الشاشة واختَر "تنفيذ طلب البحث" jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")

يوفّر إلقاء نظرة فاحصة على عملية تسجيل معلومات لعِناصر الأمان الخاصة بمسؤولي الأمان، بدءًا من عنوان IP المصدر والوجهة والمنفذ والبروتوكول واسم مجموعة العُقد.

لاستكشاف المزيد من سجلّات جدار الحماية، انتقِل إلى "شبكة VPC" → "جدار الحماية" → "السماح بالوصول من شبكة أجهزة الشبكة إلى جميع مثيلات VPC"، ثمّ اختَر "عرض" في "مستكشف السجلّات".
16. تَنظيم
من Cloud Shell، احذف مكوّنات البرنامج التعليمي.
gcloud compute instances delete l3-apache netdevice-apache --zone=us-central1-a --quiet
gcloud compute routers delete l3-cr netdevice-cr --region=us-central1 --quiet
gcloud container clusters delete multinic-gke --zone=us-central1-a --quiet
gcloud compute firewall-rules delete allow-ingress-from-l3-network-to-all-vpc-instances allow-ingress-from-netdevice-network-to-all-vpc-instances --quiet
gcloud compute networks subnets delete l3-apache l3-subnet netdevice-apache netdevice-subnet primary-node-subnet --region=us-central1 --quiet
gcloud compute networks delete l3-vpc netdevice-vpc primary-vpc --quiet
17. تهانينا
تهانينا، لقد نجحت في إعداد عملية إنشاء مجموعة عقد متعددة الواجهات والتحقّق منها، وإنشاء وحدات pod تشغّل busybox للتحقّق من اتصال الطبقة 3 ونوع الجهاز بخوادم Apache باستخدام PING وwget.
تعرّفت أيضًا على كيفية الاستفادة من سجلات جدار الحماية لفحص حِزم المصدر والوجهة بين حاويات Pod وخوادم Apache.
تعتقد Cosmopup أنّ الفيديوهات التعليمية رائعة!!
