פריסה ואימות של GKE NFO מרובה רשתות & ממשק בעל ביצועים גבוהים

1. מבוא

מערכת GCP תומכת כבר זמן רב בכמה ממשקים ברמת מופע של מכונה וירטואלית. עם ממשקים מרובים, מכונה וירטואלית יכולה להתחבר לעד 7 ממשקים חדשים (ברירת מחדל + 7 ממשקים) לרשתות VPC שונות. התנהגות הזו מורחבת עכשיו ב-GKE Networking גם ל-Pods שפועלים בצמתים. לפני שהשקנו את התכונה הזו, באשכולות GKE כל NodePools יכלו לכלול רק ממשק אחד, ולכן הם מופו ל-VPC אחד. התכונה Multi-Network on Pods מאפשרת למשתמשים להפעיל יותר מממשק אחד בצמתים וב-Pods באשכול GKE.

מה תפַתחו

במדריך הזה תבנו סביבת GKE מקיפה עם כמה כרטיסי NIC, שממחישה את תרחישי השימוש שמוצגים באיור 1.

  1. יוצרים את netdevice-l3-pod באמצעות busybox כדי:
  2. מבצעים PING ו-wget -S למכונת netdevice-apache ב-netdevice-vpc דרך eth2
  3. מבצעים PING ו-wget -S למופע l3-apache ב-l3-vpc דרך eth1
  4. יוצרים l3-pod באמצעות busybox כדי לבצע PING ו-wget -S למופע l3-apache דרך eth1

בשני תרחישי השימוש, הממשק eth0 של ה-pod מחובר לרשת ברירת המחדל.

איור 1

9d93019ee608587f.png

מה תלמדו

  • איך יוצרים תת-רשת מסוג L3
  • איך יוצרים רשת משנה מסוג netdevice
  • איך יוצרים מאגר צמתים של GKE עם כמה כרטיסי NIC
  • איך יוצרים פוד עם יכולות של netdevice ו-L3
  • איך יוצרים תרמיל עם יכולות L3
  • איך יוצרים ומאמתים רשת אובייקטים של GKE
  • איך מאמתים את הקישוריות לשרתי Apache מרוחקים באמצעות PING, ‏ wget ויומני חומת אש

מה תצטרכו

  • פרויקט ב-Google Cloud

2. הסברים על המונחים

VPC ראשי: VPC ראשי הוא VPC שהוגדר מראש ומגיע עם קבוצה של הגדרות ומשאבים שמוגדרים כברירת מחדל. אשכול GKE נוצר ב-VPC הזה.

תת-רשת: ב-Google Cloud, ‏ תת-רשת היא הדרך ליצור Classless Inter-Domain Routing‏ (CIDR) עם מסכות רשת ב-VPC. לרשת משנה יש טווח כתובות IP ראשי יחיד שמוקצה לצמתים, ויכולים להיות לה כמה טווחי כתובות משניים שיכולים להיות שייכים ל-Pods ולשירותים.

רשת צמתים: רשת הצמתים מתייחסת לשילוב ייעודי של VPC וזוג תת-רשתות. בתוך רשת הצמתים הזו, לצמתים ששייכים למאגר הצמתים מוקצות כתובות IP מטווח כתובות ה-IP הראשי.

טווח משני: טווח משני ב-Google Cloud הוא CIDR ומסכת רשת ששייכים לאזור ב-VPC. ‫GKE משתמש בזה כרשת פודים בשכבה 3. ל-VPC יכולים להיות כמה טווחי משנה, ו-Pod יכול להתחבר לכמה רשתות Pod.

רשת (L3 או מכשיר): אובייקט רשת שמשמש כנקודת חיבור ל-Pods. במדריך, הרשתות הן l3-network ו-netdevice-network, והמכשיר יכול להיות netdevice או dpdk. רשת ברירת המחדל היא חובה והיא נוצרת כשיוצרים את האשכול על סמך רשת המשנה של ברירת המחדל של מאגר הצמתים.

רשתות בשכבה 3 תואמות לטווח משני ברשת משנה, והן מיוצגות כך:

VPC -> Subnet Name -> Secondary Range Name

רשת המכשיר תואמת לתת-רשת ב-VPC, והיא מיוצגת כך:

VPC -> Subnet Name

רשת ברירת מחדל של Pod: ‏ Google Cloud יוצרת רשת ברירת מחדל של Pod במהלך יצירת האשכול. רשת ה-Pod שמוגדרת כברירת מחדל משתמשת ב-VPC הראשי כרשת הצמתים. כברירת מחדל, רשת ה-Pod זמינה בכל הצמתים וה-Pods של האשכול.

‫Pods עם כמה ממשקים: אי אפשר לחבר Pods עם כמה ממשקים ב-GKE לאותה רשת Pod, כי כל ממשק של ה-Pod צריך להיות מחובר לרשת ייחודית.

עדכון הפרויקט כדי לתמוך ב-codelab

ב-Codelab הזה נעשה שימוש במשתנים כדי להקל על הטמעת ההגדרה של 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 הראשי כדי ליצור את מאגר הצמתים (node pool) שמוגדר כברירת מחדל עם הדגלים הנדרשים –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, בודקים שנוצרו שני צמתים מ-default-pool:

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, יוצרים את התת-רשת שמשמשת לרשת של מכשיר הרשת עם כמה כרטיסי רשת:

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, יוצרים את Cloud Router.

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. הגדרת l3-vpc

יצירת רשת l3-vpc

ב-Cloud Shell, מבצעים את הפעולות הבאות:

gcloud compute networks create l3-vpc --project=$projectid --subnet-mode=custom

יצירת תת-הרשתות של l3-vpc

ב-Cloud Shell, יוצרים תת-רשת עם טווח ראשי וטווח משני. הטווח המשני(sec-range-l3-subnet) משמש לרשת l3 עם כמה כרטיסי רשת:

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, יוצרים את Cloud Router.

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. יצירת מאגר צמתים עם כמה כרטיסי NIC

בקטע הבא, תיצרו מאגר צמתים עם כמה כרטיסי רשת שמורכב מהדגלים הבאים:

‫‎–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 יחידות vCPU יכול לתמוך בסך הכול ב-4 רשתות VPC. לדוגמה, ל-netdevice-l3-pod יהיו 3 ממשקים בסך הכול (default,‏ netdevice ו-l3), ולכן סוג המכונה שמשמש במדריך הוא e2-standard-4.

ב-Cloud Shell, יוצרים את מאגר הצמתים שכולל מכשיר מסוג Type ו-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

בשלבים הבאים תיצרו אובייקט Network ו-GKENetworkParamSet של Kubernetes כדי ליצור את netdevice-network שישמש לשיוך של 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 הוא Ready.

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 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‏ 192.168.10.0/24 של gkenetworkparamset שמשמש לממשק של ה-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. יצירת רשתות L3

בשלבים הבאים תיצרו אובייקט Kubernetes מסוג Network ו-GKENetworkParamSet כדי ליצור את רשת L3 שתשמש לשיוך של Pod בשלבים מאוחרים יותר.

יצירת אובייקט רשת l3

ב-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, מוודאים שסוג הסטטוס של l3-network הוא Ready (מוכן).

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, מאמתים ש-Status Reason של l3-network הוא 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 פקודות נפוצות. ה-pod מוגדר לתקשר עם 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 מהרשת l3-network ומהרשת netdevice-network. כתובת ה-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-network ו-eth2 מחובר ל-netdevice-network.

/ # 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, יוצאים מה-pod מהמופע.

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 שמשויכות לממשקי הפוד מרשת l3. כתובת ה-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.

/ # 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, יוצאים מה-pod מהמופע.

exit

13. עדכונים של חומת האש

כדי לאפשר קישוריות מ-GKE multicnic-pool אל netdevice-vpc, נדרשים כללים לחומת האש של l3-vpc ingress. תצטרכו ליצור כללי חומת אש שבהם טווח המקור הוא תת-הרשת של רשת ה-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-subnet למופע 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. אימות הקישוריות של ה-Pod

בקטע הבא, תאמתו את הקישוריות למופעי Apache מ-netdevice-l3-pod ומ-l3-pod על ידי התחברות ל-pods והפעלת 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 → VM instances (מכונות וירטואליות).

fee492b4fd303859.png

בדיקת קישוריות מ-netdevice-l3-pod אל netdevice-apache

ב-Cloud Shell, מתחברים אל netdevice-l3-pod:

kubectl exec --stdin --tty netdevice-l3-pod   -- /bin/sh

מהקונטיינר, מבצעים פינג למופע 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 to l3-apache connectivity test

ב-Cloud Shell, מבצעים פינג למכונת 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, יוצאים מה-pod מהמופע.

exit

בדיקת קישוריות מ-l3-pod אל netdevice-apache

ב-Cloud Shell, מתחברים אל l3-pod:

kubectl exec --stdin --tty l3-pod   -- /bin/sh

מהקונטיינר, מבצעים פינג למופע netdevice-apache על סמך כתובת ה-IP שהתקבלה בשלב הקודם. מכיוון של-l3-pod אין ממשק שמשויך ל-netdevice-network, הפינג ייכשל.

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, מבצעים פינג למכונת 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. יומני חומת אש

התכונה 'ניהול כללי חומת אש' מאפשרת לבצע ביקורת, לאמת ולנתח את ההשפעות של כללי חומת האש. לדוגמה, אפשר לבדוק אם כלל חומת אש שנועד לדחות תנועה פועל כמצופה. התכונה 'ניהול כללי חומת אש' שימושית גם אם רוצים לדעת כמה חיבורים מושפעים מכלל חומת אש מסוים.

במדריך הפעלתם את רישום ביומן של חומת האש כשיוצרים את כללי חומת האש של תעבורת הנתונים הנכנסת (ingress). בואו נסתכל על המידע שמתקבל מקובצי היומן.

במסוף Cloud, עוברים אל Logging (רישום ביומן) → Logs Explorer (כלי לבדיקת יומנים).

מזינים את השאילתה שלמטה לפי צילום המסך ובוחרים באפשרות Run query jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")‎

280d00f2c5ce6109.png

בדיקה מעמיקה של לכידה מספקת רכיבי מידע לאדמינים של אבטחה, החל מכתובת ה-IP של המקור והיעד, היציאה, הפרוטוקול ושם מאגר הצמתים.

ae4638ed9b718ac6.png

כדי לעיין ביומני חומת אש נוספים, עוברים אל VPC Network (רשת VPC) → Firewall (חומת אש) → allow-ingress-from-netdevice-network-to-all-vpc-instances (התרת תעבורת נתונים נכנסת מרשת מכשיר רשת לכל המופעים של VPC) ובוחרים באפשרות view (תצוגה) ב-Logs Explorer.

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. מזל טוב

סיימתם בהצלחה להגדיר ולאמת יצירה של מאגר צמתים עם כמה כרטיסי רשת ויצירה של פודים שמריצים busybox כדי לאמת את הקישוריות של L3 וסוג המכשיר לשרתי Apache באמצעות PING ו-wget.

למדתם גם איך להשתמש ביומני חומת האש כדי לבדוק חבילות של מקור ויעד בין קונטיינרים של Pod ושרתי Apache.

‫Cosmopup חושב שסרטוני הדרכה הם מדהימים!!

e6d3675ca7c6911f.jpeg

קריאה נוספת וסרטונים

מסמכי עזר