ติดตั้งใช้งานและตรวจสอบ GKE NFO แบบหลายเครือข่าย & อินเทอร์เฟซประสิทธิภาพสูง

เกี่ยวกับ Codelab นี้
schedule91 นาที
subjectอัปเดตล่าสุดเมื่อ 15 สิงหาคม 2566
account_circleเขียนโดย Deepak Michael

GCP รองรับอินเทอร์เฟซหลายรายการในระดับอินสแตนซ์ VM มาอย่างยาวนาน เมื่อมีอินเทอร์เฟซที่หลากหลาย VM จะเชื่อมต่ออินเทอร์เฟซใหม่ได้สูงสุด 7 อินเทอร์เฟซ (ค่าเริ่มต้น + อินเทอร์เฟซ 7 รายการ) กับ VPC ที่แตกต่างกัน ขณะนี้เครือข่าย GKE ได้ขยายลักษณะการทำงานนี้ไปยังพ็อดที่กำลังทำงานอยู่บนโหนด ก่อนใช้ฟีเจอร์นี้ คลัสเตอร์ GKE อนุญาตให้ Node Pool ทั้งหมดมีอินเทอร์เฟซเดียวและจะแมปกับ VPC รายการเดียว เมื่อใช้ฟีเจอร์หลายเครือข่ายบนพ็อด ผู้ใช้จะเปิดใช้อินเทอร์เฟซมากกว่า 1 อินเทอร์เฟซบนโหนดและสำหรับพ็อดในคลัสเตอร์ GKE ได้

ในบทแนะนำนี้ คุณจะสร้างสภาพแวดล้อมมัลตินิกของ GKE ที่ครอบคลุมซึ่งแสดงตัวอย่างกรณีการใช้งานในรูปที่ 1

  1. สร้าง netdevice-l3-pod โดยใช้กล่องข้อมูลของไม่ว่างเพื่อทำสิ่งต่อไปนี้
  2. ดำเนินการ PING และ wget -S ไปยังอินสแตนซ์ netdevice-apache ใน netdevice-vpc ผ่าน eth2
  3. ดำเนินการ PING และ อินสแตนซ์ wget -S เป็น l3-apache ใน l3-vpc ผ่าน eth1
  4. สร้างพ็อด l3 โดยใช้ประโยชน์จากกล่องไม่ว่างเพื่อดำเนินการ PING และ wget -S ถึง l3-apache อินสแตนซ์ผ่าน eth1

ในกรณีการใช้งานทั้ง 2 กรณี อินเทอร์เฟซ eth0 ของพ็อดจะเชื่อมต่อกับเครือข่ายเริ่มต้น

รูปที่ 1

9d93019ee608587f.png

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างซับเน็ตประเภท l3
  • วิธีสร้างซับเน็ตของประเภทอุปกรณ์เน็ต
  • วิธีสร้าง Node Pool ของ GKE แบบ Multi-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 หลักเดียวที่กำหนดให้กับโหนด และสามารถมีช่วงรองหลายช่วงที่เป็นของพ็อดและบริการได้

เครือข่ายโหนด: เครือข่ายโหนดหมายถึงการผสมเฉพาะ VPC และคู่ซับเน็ต ภายในเครือข่ายโหนดนี้ โหนดของ Node Pool คือที่อยู่ IP ที่จัดสรรจากช่วงที่อยู่ IP หลัก

ช่วงรอง: ช่วงรองของ Google Cloud คือ CIDR และเน็ตมาสก์ที่อยู่ในภูมิภาคใน VPC GKE จะใช้สิ่งนี้เป็นเครือข่ายพ็อดเลเยอร์ 3 VPC มีช่วงรองได้หลายช่วง และพ็อดจะเชื่อมต่อกับเครือข่ายพ็อดได้หลายเครือข่าย

เครือข่าย (L3 หรืออุปกรณ์): ออบเจ็กต์เครือข่ายที่ทำหน้าที่เป็นจุดเชื่อมต่อสำหรับพ็อด ในบทแนะนำ เครือข่ายประกอบด้วย l3-network และ netdevice-network ซึ่งอุปกรณ์อาจเป็น netdevice หรือ dpdk ก็ได้ คุณต้องระบุเครือข่ายเริ่มต้นเมื่อสร้างคลัสเตอร์ตามซับเน็ตเริ่มต้นของ Node Pool

เครือข่ายเลเยอร์ 3 จะสอดคล้องกับช่วงรองในซับเน็ต ซึ่งแสดงเป็น

VPC -> ชื่อซับเน็ต -> ชื่อช่วงรอง

เครือข่ายอุปกรณ์สอดคล้องกับซับเน็ตบน VPC โดยแสดงเป็น

VPC -> ชื่อซับเน็ต

เครือข่ายพ็อดเริ่มต้น: Google Cloud จะสร้างเครือข่ายพ็อดเริ่มต้นระหว่างการสร้างคลัสเตอร์ เครือข่ายพ็อดเริ่มต้นจะใช้ VPC หลักเป็นเครือข่ายโหนด เครือข่ายพ็อดเริ่มต้นจะพร้อมใช้งานบนโหนดและพ็อดของคลัสเตอร์ทั้งหมดโดยค่าเริ่มต้น

พ็อดที่มีอินเทอร์เฟซหลายรายการ: พ็อดที่มีหลายอินเทอร์เฟซใน GKE จะเชื่อมต่อกับเครือข่ายพ็อดเดียวกันไม่ได้เนื่องจากอินเทอร์เฟซของพ็อดแต่ละรายการต้องเชื่อมต่อกับเครือข่ายที่ไม่ซ้ำกัน

อัปเดตโปรเจ็กต์เพื่อรองรับ Codelab

Codelab นี้ใช้ $variables เพื่อช่วยในการติดตั้งใช้งานการกำหนดค่า 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 หลัก เพื่อสร้าง Nodepool เริ่มต้นพร้อมแฟล็กที่จำเป็น –enable-multi-networking และ –enable-dataplane-v2 เพื่อรองรับ Multi-nic Nodepool

สร้างคลัสเตอร์ GKE ใน Cloud Shell ดังนี้

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 ให้ตรวจสอบว่ามีโหนด 2 โหนดที่สร้างขึ้นจากพูลเริ่มต้น

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 ให้สร้างซับเน็ตที่ใช้สำหรับ netdevice-network แบบหลายเทคนิคดังนี้

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

สร้างซับเน็ตสำหรับอินสแตนซ์ netdevice-apache ภายใน Cloud Shell ดังนี้

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 ใช้ในบทแนะนำสำหรับการติดตั้งแพ็กเกจซอฟต์แวร์เนื่องจากอินสแตนซ์ VM ไม่มีที่อยู่ IP ภายนอก

สร้างเราเตอร์ระบบคลาวด์ใน 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

สร้างอินสแตนซ์ใน 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-multinic

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

สร้างซับเน็ตสำหรับอินสแตนซ์ l3-apache ใน Cloud Shell ดังนี้

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 ใช้ในบทแนะนำสำหรับการติดตั้งแพ็กเกจซอฟต์แวร์เนื่องจากอินสแตนซ์ VM ไม่มีที่อยู่ IP ภายนอก

สร้างเราเตอร์ระบบคลาวด์ใน 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

สร้างอินสแตนซ์ใน 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. สร้าง Nodepool แบบหลายตำแหน่ง

ในส่วนต่อไปนี้ คุณจะต้องสร้าง Multinic Node Pool ซึ่งประกอบด้วยแฟล็กต่อไปนี้

–เครือข่ายโหนดเพิ่มเติม (จำเป็นสำหรับอินเทอร์เฟซประเภทอุปกรณ์)

ตัวอย่าง

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

–เครือข่ายโหนดเพิ่มเติมและ –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

ประเภทเครื่อง: เมื่อทำให้ Node Pool ใช้งานได้ ให้พิจารณาทรัพยากร Dependency ของประเภทเครื่อง เช่น ประเภทเครื่องอย่าง "e2-standard-4" เมื่อมี vCPU จำนวน 4 ตัว จะรองรับ VPC รวมได้สูงสุด 4 รายการ ตัวอย่างเช่น netdevice-l3-pod จะมีอินเทอร์เฟซทั้งหมด 3 อินเทอร์เฟซ (ค่าเริ่มต้น, netdevice และ l3) ดังนั้นประเภทเครื่องที่ใช้ในบทแนะนำคือ e2-standard-4

ใน Cloud Shell ให้สร้าง Nodepool ที่ประกอบด้วยอุปกรณ์ประเภทและ 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 ให้ตรวจสอบว่ามีโหนด 3 โหนดที่สร้างขึ้นจากพูลโหนดแบบมัลตินิคดังต่อไปนี้

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 ที่จะใช้ในการเชื่อมโยงพ็อดในขั้นตอนถัดไป

สร้างออบเจ็กต์ netdevice-network

ภายใน Cloud Shell ให้สร้างออบเจ็กต์เครือข่าย YAML netdevice-network.yaml โดยใช้ตัวแก้ไข VI หรือนาโน จด "เส้นทางไปยัง" คือซับเน็ต 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 หรือนาโน ข้อมูลจำเพาะจะแมปกับการทำให้ซับเน็ตของ 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 GNPParms Ready และ 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:    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>

ตรวจสอบบล็อก gkenetworkparamset CIDR 192.168.10.0/24 ที่ใช้สำหรับอินเทอร์เฟซพ็อดในขั้นตอนถัดไปภายใน Cloud Shell

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 ที่จะใช้ในการเชื่อมโยงพ็อดในขั้นตอนถัดไป

สร้างออบเจ็กต์เครือข่าย l3

ใน Cloud Shell ให้สร้างออบเจ็กต์เครือข่าย YAML l3-network.yaml โดยใช้ตัวแก้ไข VI หรือนาโน จด "เส้นทางไปยัง" คือซับเน็ต 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 พร้อมใช้งาน

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 หรือนาโน โปรดสังเกตการแมปข้อมูลจำเพาะกับการทำให้ซับเน็ต 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 ให้ตรวจสอบเหตุผลของสถานะ l3-network คือ GNPParms Ready และ 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:    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 ที่ใช้ในการสร้างอินเทอร์เฟซพ็อด

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 ที่เรียกใช้กล่องไม่ว่าง หรือที่เรียกว่า "Swiss Army knife" ที่รองรับคำสั่งทั่วไปมากกว่า 300 คำสั่ง พ็อดได้รับการกำหนดค่าให้สื่อสารกับ l3-vpc โดยใช้ eth1 และ netdevice-vpc โดยใช้ eth2

ใน Cloud Shell ให้สร้างคอนเทนเนอร์กล่องที่ไม่ว่างชื่อ netdevice-l3-pod.yaml โดยใช้ตัวแก้ไข VI หรือนาโน

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

ตรวจสอบว่า netdevice-l3-pod กำลังทำงานอยู่ใน Cloud Shell หรือไม่

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 ที่กำหนดให้กับอินเทอร์เฟซพ็อดใน Cloud Shell

kubectl get pods netdevice-l3-pod -o yaml

ในตัวอย่างที่ระบุ ช่อง networking.gke.io/pod-ips มีที่อยู่ IP ที่เชื่อมโยงกับอินเทอร์เฟซพ็อดจาก 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

ตรวจสอบเส้นทางไปยัง netdevice-vpc และ l3-vpc จาก netdevice-l3-pod ใน Cloud Shell

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

สร้างอินสแตนซ์ ตรวจสอบอินเทอร์เฟซพ็อด ดังนี้

ifconfig

ในตัวอย่าง eth0 จะเชื่อมต่อกับเครือข่ายเริ่มต้น, eth1 เชื่อมต่อกับเครือข่าย l3 และ 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)

สร้างอินสแตนซ์ ตรวจสอบเส้นทางของพ็อด

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

ในส่วนต่อไปนี้ คุณจะได้สร้างกล่องชาร์จ l3-pod หรือที่เรียกว่า "มีดทหารสวิส" ที่รองรับคำสั่งทั่วไปมากกว่า 300 คำสั่ง พ็อดได้รับการกำหนดค่าให้สื่อสารกับ l3-vpc โดยใช้ eth1 เท่านั้น

สร้างคอนเทนเนอร์กล่องที่ไม่ว่างชื่อ l3-pod.yaml ใน Cloud Shell โดยใช้ตัวแก้ไข VI หรือนาโน

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

ตรวจสอบว่า netdevice-l3-pod กำลังทำงานอยู่ใน Cloud Shell หรือไม่

kubectl get pods l3-pod

ตัวอย่าง

user@$ kubectl get pods l3-pod
NAME     READY   STATUS    RESTARTS   AGE
l3
-pod   1/1     Running   0          52s

ตรวจสอบที่อยู่ IP ที่กำหนดให้กับอินเทอร์เฟซพ็อดใน Cloud Shell

kubectl get pods l3-pod -o yaml

ในตัวอย่างที่ระบุ ช่อง networking.gke.io/pod-ips มีที่อยู่ IP ที่เชื่อมโยงกับอินเทอร์เฟซพ็อดจาก 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

ตรวจสอบเส้นทางไปยัง l3-vpc จาก netdevice-l3-pod ใน Cloud Shell

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

สร้างอินสแตนซ์ ตรวจสอบอินเทอร์เฟซพ็อด ดังนี้

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 ให้ตรวจสอบเส้นทางไปยัง l3-vpc (172.16.20.0/28)

สร้างอินสแตนซ์ ตรวจสอบเส้นทางของพ็อด

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. การอัปเดตไฟร์วอลล์

หากต้องการอนุญาตการเชื่อมต่อจาก Multicnic Pool ของ GKE ไปยังกฎไฟร์วอลล์ขาเข้าของ netdevice-vpc และ l3-vpc คุณจะสร้างกฎไฟร์วอลล์ที่ระบุช่วงต้นทางเป็นซับเน็ตของเครือข่ายพ็อด เช่น netdevice-subnet, sec-range-l3-subnet

ตัวอย่างเช่น คอนเทนเนอร์ที่เพิ่งสร้างขึ้น l3-pod, eth2 Interface 10.0.8.22 (จัดสรรจาก sec-range-l3-subnet) คือที่อยู่ IP ต้นทางเมื่อเชื่อมต่อกับอินสแตนซ์ l3-apache ใน l3-vpc

netdevice-vpc: อนุญาตจาก netdevice-subnet ไปยัง netdevice-apache

สร้างไฟร์วอลล์ใน netdevice-vpc ใน Cloud Shell เพื่ออนุญาตให้ 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

ใน 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 จึงสามารถเชื่อมต่อเซิร์ฟเวอร์ Apache ใน netdevice-vpc และ l3-vpc ได้

ในทางตรงกันข้าม เมื่อดำเนินการ wget -S จาก l3-pod จะเชื่อมต่อกับเซิร์ฟเวอร์ Apache ใน netdevice-vpc ไม่ได้เนื่องจาก l3-pod ได้รับการกำหนดค่าด้วยอินเทอร์เฟซจากเครือข่าย l3 เท่านั้น

รับที่อยู่ IP ของเซิร์ฟเวอร์ Apache

จาก Cloud Console ให้รับที่อยู่ IP ของเซิร์ฟเวอร์ Apache โดยไปที่ Compute Engine → อินสแตนซ์ VM

fee492b4fd303859.png

การทดสอบการเชื่อมต่อ 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 กับ netdevice-apache

ใน Cloud Shell ให้เข้าสู่ระบบ l3-pod:

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

จากคอนเทนเนอร์ ให้ใช้อินสแตนซ์ ping ไปยัง netdevice-apache ตามที่อยู่ IP ที่ได้รับจากขั้นตอนก่อนหน้า เนื่องจาก l3-pod ไม่มีอินเทอร์เฟซที่เชื่อมโยงกับ netdevice-network การใช้คำสั่ง 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")

280d00f2c5ce6109.png

การดูภาพอย่างละเอียดช่วยเพิ่มองค์ประกอบข้อมูลสำหรับผู้ดูแลระบบด้านความปลอดภัย ตั้งแต่ที่อยู่ IP ต้นทางและปลายทาง, พอร์ต, โปรโตคอล และชื่อ Nodepool

ae4638ed9b718ac6.png

หากต้องการสำรวจบันทึกไฟร์วอลล์เพิ่มเติม ให้ไปที่เครือข่าย 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. ขอแสดงความยินดี

{0/}

และคุณยังได้เรียนรู้วิธีใช้ประโยชน์จากบันทึกไฟร์วอลล์เพื่อตรวจสอบแพ็กเก็ตต้นทางและปลายทางระหว่างคอนเทนเนอร์ของพ็อดกับเซิร์ฟเวอร์ Apache ด้วย

Cosmopup คิดว่าบทแนะนำยอดเยี่ยม!!

e6d3675ca7c6911f.jpeg

อ่านเพิ่มเติมและ วิดีโอ

เอกสารอ้างอิง