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

1. מבוא

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

מה תפַתחו

במדריך הזה תלמדו ליצור סביבה מקיפה של GKE multinic שממחישה את התרחישים לדוגמה שמתוארים באיור 1.

  1. יצירת netdevice-l3-pod תוך שימוש בתיבת הדואר העמוסה כדי:
  2. ביצוע קוד אימות (PING) wget -s למופע netdevice-apache ב-netdevice-vpc דרך eth2
  3. ביצוע קוד אימות (PING) wget -S ל-l3-apache instance ב-l3-vpc דרך eth1
  4. ליצור l3-pod שמנצל את תיבת הדואר הנכנס כדי לבצע קוד אימות (PING) wget -s ל-l3-apache instance מעל eth1

בשני התרחישים, ממשק eth0 של רצף המודעות מחובר לרשת ברירת המחדל.

איור 1

9d93019ee608587f.png

מה תלמדו

  • איך יוצרים רשת משנה מסוג l3
  • איך ליצור תת-רשת לסוג netdevice
  • איך ליצור מאגר צמתים מרובה קריאות ל-GKE
  • איך ליצור Pod עם יכולות netdevice ו-l3
  • איך ליצור Pod עם יכולות l3
  • איך ליצור רשת אובייקטים ב-GKE ולאמת אותה
  • איך לאמת את הקישוריות לשרתי Apache מרוחקים באמצעות יומני PING, wget ו-Firewall

מה צריך להכין

  • פרויקט ב-Google Cloud

2. טרמינולוגיה ומושגים

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

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

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

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

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

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

VPC -> שם רשת משנה -> שם הטווח המשני

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

VPC -> שם רשת המשנה

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

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

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

ב-Codelab הזה נעשה שימוש ב-$variables כדי לעזור בהטמעת ההגדרות של gcloud ב-Cloud Shell.

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

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

3. הגדרת VPC ראשי

יצירת ה-VPC הראשי

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

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

יצירת הצומת ורשתות המשנה המשניות

Inside 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-data מנהלים-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

Inside 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

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

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

יצירת רשתות המשנה netdevice-vpc

ב-Inside 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 Shell.

gcloud compute routers create netdevice-cr --network netdevice-vpc --region us-central1

יוצרים את שער NAT בתוך Cloud Shell.

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.

Inside 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

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

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

יוצרים את רשתות המשנה l3-vpc

Inside 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

ב-Inside 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 Shell.

gcloud compute routers create l3-cr --network l3-vpc --region us-central1

יוצרים את שער NAT בתוך Cloud Shell.

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.

Inside 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. יצירת מאגר צמתים מרובה

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

-additional-node-network (נדרש לממשקים של סוג המכשיר)

דוגמה:

--additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet

-רשת צמתים נוספת ו- -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 ממשקים סה"כ (ברירת המחדל, 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. מאמתים את מאגר הצמתים הבולטים

בתוך 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 ו-GKENetworkParamSet kubernetes כדי ליצור את רשת ה-netdevice שתשמש לשיוך Pods בשלבים מאוחרים יותר.

יצירת אובייקט 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, מאמתים שסוג הסטטוס של הרשת ברשת המכשיר מוכן.

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

ב-Inside 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>

Inside Cloud Shell, מאמתים בשלב מאוחר יותר את בלוק ה-CIDR 192.168.10.0/24 של gkenetworkparamset.

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

בשלבים הבאים תיצרו אובייקט Network ו-GKENetworkParamSet kubernetes כדי ליצור את רשת l3 שתשמש לשיוך Pods בשלבים מאוחרים יותר.

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

ב-Inside 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 

Inside Cloud Shell, מאמתים שסוג הסטטוס מוכן לשימוש ברשת l3.

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

ב-Inside 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"

Inside Cloud Shell, מחילים את הכלי l3-network-parm.yaml

kubectl apply -f l3-network-parm.yaml 

Inside Cloud Shell, מאמתים שסיבת הסטטוס ב-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>

Inside 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 עם ארגז פעילות, שמוכר בשם 'סכין צבא שוויצרי'. שתומך ביותר מ-300 פקודות נפוצות. רצף המודעות מוגדר לתקשר עם l3-vpc באמצעות eth1 ו-netdevice-vpc באמצעות eth2.

בתוך Cloud Shell, יוצרים את הקונטיינר לתיבה עמוסה בשם 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

מאמתים את כתובות ה-IP שמוקצות לממשקי Pod ב-Inside Cloud Shell.

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

Inside 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, יוצאים מה-Pod מהמכונה.

exit

12. יצירת l3-pod

בקטע הבא, יוצרים את תא ה-l3 המתאים לתיבת הדואר הנכנס, ומכונה גם 'סכין שוויצרית צבאית'. שתומך ביותר מ-300 פקודות נפוצות. רצף המודעות מוגדר לתקשורת עם l3-vpc באמצעות eth1 בלבד.

בתוך Cloud Shell, יוצרים את הקונטיינר לתיבה עמוסה בשם 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

Inside 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

מאמתים את כתובות ה-IP שמוקצות לממשקי Pod ב-Inside Cloud Shell.

kubectl get pods l3-pod -o yaml

בדוגמה שמוצגת, השדה networking.gke.io/pod-ips מכיל את כתובות ה-IP שמשויכות לממשקי pod מ-l3-network. כתובת ה-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

Inside 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. עדכונים לגבי חומת האש

כדי לאפשר קישוריות ממאגר ה-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: אפשר להפעיל מ-netdevice-subnet אל 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: אפשר להפעיל מ-sec-range-l3-subnet אל l3-apache

ב-Inside 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 ומרשת l3, אפשר להתחבר לשרתי Apache ב-netdevice-vpc וב-l3-vpc.

לעומת זאת, כשמבצעים wget -S מ-l3-pod, לא ניתן להתחבר לשרת Apache ב-netdevice-vpc, כי ה-l3-pod מוגדר רק עם ממשק מרשת l3.

קבלת כתובת IP של שרת Apache

מ-Cloud Console, כדי להשיג את כתובת ה-IP של שרתי Apache, עוברים אל Compute Engine ← VM instances

fee492b4fd303859.png

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

Inside 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 ל-l3-apache

Inside 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

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

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

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

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

Inside 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. יומני חומת אש

Firewall Rules Logging מאפשר לבדוק, לאמת ולנתח את ההשפעות של כללי חומת האש. לדוגמה, אפשר לקבוע אם כלל של חומת אש שמיועד לדחות תעבורת נתונים פועל כראוי. רישום כללי חומת אש שימושי גם אם אתם צריכים לקבוע כמה חיבורים מושפעים מכלל נתון של חומת אש.

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

ממסוף Cloud, עוברים אל Logging ← Logs Explorer

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

280d00f2c5ce6109.png

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

ae4638ed9b718ac6.png

כדי לעיין ביומנים נוספים של חומת האש, עוברים אל VPC Network → Firewall ← Allow-ingress-from-netdevice-network-to-all-vpc-instances ובוחרים באפשרות 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. מזל טוב

כל הכבוד! הגדרת בהצלחה וביצעת אימות של מאגר צמתים רב-תכליתי ויצירתי רצפי מודעות (Pods) עם ארגז עומס (poding) כדי לאמת קישוריות L3 וסוג מכשיר לשרתי Apache באמצעות קוד אימות ו-wget.

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

ב-Cosmopup שלנו חושבים שמדריכים הם מדהימים!

e6d3675ca7c6911f.jpeg

המשך קריאה סרטונים

מסמכי עזר