1. บทนำ
GCP รองรับอินเทอร์เฟซหลายรายการที่ระดับอินสแตนซ์ VM มานานแล้ว เมื่อมีหลายอินเทอร์เฟซ VM จะเชื่อมต่ออินเทอร์เฟซใหม่ได้สูงสุด 7 รายการ (ค่าเริ่มต้น + 7 อินเทอร์เฟซ) กับ VPC ที่แตกต่างกัน ตอนนี้การเชื่อมต่อเครือข่าย GKE ได้ขยายลักษณะการทำงานนี้ไปยังพ็อดที่ทำงานบนโหนดแล้ว ก่อนที่จะมีฟีเจอร์นี้ คลัสเตอร์ GKE อนุญาตให้ NodePool ทั้งหมดมีอินเทอร์เฟซเดียวเท่านั้น และจึงต้องแมปกับ VPC เดียว ฟีเจอร์เครือข่ายหลายรายการในพ็อดช่วยให้ผู้ใช้เปิดใช้อินเทอร์เฟซมากกว่า 1 รายการในโหนดและสำหรับพ็อดในคลัสเตอร์ GKE ได้แล้ว
สิ่งที่คุณจะสร้าง
ในบทแนะนำนี้ คุณจะได้สร้างสภาพแวดล้อม GKE แบบหลาย NIC ที่ครอบคลุม ซึ่งแสดงกรณีการใช้งานที่แสดงในรูปที่ 1
- สร้าง netdevice-l3-pod โดยใช้ busybox เพื่อทำสิ่งต่อไปนี้
- เรียกใช้ PING และ wget -S ไปยังอินสแตนซ์ netdevice-apache ใน netdevice-vpc ผ่าน eth2
- เรียกใช้ PING และ wget -S ไปยังอินสแตนซ์ l3-apache ใน l3-vpc ผ่าน eth1
- สร้าง l3-pod โดยใช้ busybox เพื่อดำเนินการ PING และ wget -S ไปยังอินสแตนซ์ l3-apache ผ่าน eth1
ในทั้ง 2 กรณีการใช้งาน อินเทอร์เฟซ eth0 ของพ็อดจะเชื่อมต่อกับเครือข่ายเริ่มต้น
รูปที่ 1

สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างซับเน็ตประเภท L3
- วิธีสร้างซับเน็ตประเภทอุปกรณ์เครือข่าย
- วิธีสร้าง Node Pool ของ 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 หลักเดียวซึ่งกำหนดให้กับโหนด และอาจมีช่วงรองหลายช่วงที่อาจเป็นของพ็อดและบริการ
เครือข่ายโหนด: เครือข่ายโหนดหมายถึงการจับคู่ VPC และซับเน็ตโดยเฉพาะ ภายในเครือข่ายโหนดนี้ ระบบจะจัดสรรที่อยู่ IP จากช่วงที่อยู่ IP หลักให้กับโหนดที่อยู่ใน Node Pool
ช่วงรอง: ช่วงรองของ Google Cloud คือ CIDR และเน็ตมาสก์ที่เป็นของภูมิภาคใน VPC GKE ใช้สิ่งนี้เป็นเครือข่ายพ็อดเลเยอร์ 3 VPC มีช่วงที่สองได้หลายช่วง และพ็อดเชื่อมต่อกับเครือข่ายพ็อดได้หลายเครือข่าย
เครือข่าย (L3 หรืออุปกรณ์): ออบเจ็กต์เครือข่ายที่ทำหน้าที่เป็นจุดเชื่อมต่อสำหรับพ็อด ในบทแนะนำ เครือข่ายคือ l3-network และ netdevice-network ซึ่งอุปกรณ์อาจเป็น netdevice หรือ dpdk ก็ได้ เครือข่ายเริ่มต้นเป็นสิ่งที่จำเป็นและจะสร้างขึ้นเมื่อสร้างคลัสเตอร์โดยอิงตามซับเน็ตของ Node Pool เริ่มต้น
เครือข่ายเลเยอร์ 3 สอดคล้องกับช่วงรองในซับเน็ต ซึ่งแสดงเป็น
VPC -> ชื่อซับเน็ต -> ชื่อช่วงที่ 2
เครือข่ายอุปกรณ์สอดคล้องกับซับเน็ตใน 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 หลักเพื่อสร้าง Node Pool เริ่มต้นด้วยแฟล็กที่จำเป็น ได้แก่ –enable-multi-networking และ –enable-dataplane-v2 เพื่อรองรับ Node Pool แบบหลาย NIC
สร้างคลัสเตอร์ 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 รายการจาก 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
สร้างซับเน็ตที่ใช้สำหรับเครือข่ายอุปกรณ์เครือข่ายแบบหลาย NIC ภายใน 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
สร้างเครือข่ายย่อยสำหรับอินสแตนซ์ 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 Router ภายใน 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 แบบหลาย NIC
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 Router ภายใน 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. สร้าง Node Pool แบบหลาย NIC
ในส่วนต่อไปนี้ คุณจะสร้าง Node Pool แบบหลาย 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
ประเภทเครื่อง: เมื่อติดตั้งใช้งาน Node Pool ให้พิจารณาการขึ้นต่อกันของประเภทเครื่อง เช่น ประเภทเครื่องอย่าง "e2-standard-4" ที่มี vCPU 4 ตัวจะรองรับ VPC ได้สูงสุด 4 รายการ ตัวอย่างเช่น netdevice-l3-pod จะมีอินเทอร์เฟซทั้งหมด 3 รายการ (ค่าเริ่มต้น, netdevice และ l3) ดังนั้นประเภทเครื่องที่ใช้ในบทแนะนำคือ e2-standard-4
สร้าง NodePool ที่ประกอบด้วยอุปกรณ์ประเภทและ L3 ภายใน Cloud Shell โดยใช้คำสั่งต่อไปนี้
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 ให้ตรวจสอบว่ามีการสร้างโหนด 3 รายการจาก multinic-node-pool ดังนี้
kubectl get nodes
ตัวอย่าง
user@$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p Ready <none> 15m v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb Ready <none> 15m v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-0tfx Ready <none> 3m51s v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-86gz Ready <none> 3m51s v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-t66p Ready <none> 3m51s v1.27.3-gke.100
9. สร้าง netdevice-network
ในขั้นตอนต่อไปนี้ คุณจะสร้างออบเจ็กต์ Kubernetes ของ Network และ GKENetworkParamSet เพื่อสร้าง netdevice-network ที่จะใช้เชื่อมโยง Pod ในขั้นตอนต่อๆ ไป
สร้างออบเจ็กต์ netdevice-network
สร้างออบเจ็กต์เครือข่าย YAML netdevice-network.yaml ใน Cloud Shell โดยใช้โปรแกรมแก้ไข VI หรือ nano โปรดทราบว่า "เส้นทางไปยัง" คือซับเน็ต 172.16.10.0/28 (netdevice-apache) ใน netdevice-vpc
apiVersion: networking.gke.io/v1
kind: Network
metadata:
name: netdevice-network
spec:
type: "Device"
parametersRef:
group: networking.gke.io
kind: GKENetworkParamSet
name: "netdevice"
routes:
- to: "172.16.10.0/28"
ภายใน Cloud Shell ให้ใช้ netdevice-network.yaml ดังนี้
kubectl apply -f netdevice-network.yaml
ใน Cloud Shell ให้ตรวจสอบว่าประเภทสถานะของ netdevice-network เป็น "พร้อม"
kubectl describe networks netdevice-network
ตัวอย่าง
user@$ kubectl describe networks netdevice-network
Name: netdevice-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:37:38Z
Generation: 1
Resource Version: 1578594
UID: 46d75374-9fcc-42be-baeb-48e074747052
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: netdevice
Routes:
To: 172.16.10.0/28
Type: Device
Status:
Conditions:
Last Transition Time: 2023-07-30T22:37:38Z
Message: GKENetworkParamSet resource was deleted: netdevice
Reason: GNPDeleted
Status: False
Type: ParamsReady
Last Transition Time: 2023-07-30T22:37:38Z
Message: Resource referenced by params is not ready
Reason: ParamsNotReady
Status: False
Type: Ready
Events: <none>
สร้าง GKENetworkParamSet
สร้างออบเจ็กต์เครือข่าย YAML netdevice-network-parm.yaml ภายใน Cloud Shell โดยใช้โปรแกรมแก้ไข 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
สร้างออบเจ็กต์เครือข่าย YAML l3-network.yaml โดยใช้โปรแกรมแก้ไข VI หรือ nano ใน Cloud Shell โปรดทราบว่า "เส้นทางไปยัง" คือซับเน็ต 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
สร้างออบเจ็กต์เครือข่าย YAML l3-network-parm.yaml โดยใช้โปรแกรมแก้ไข VI หรือ nano ภายใน Cloud Shell โปรดทราบว่าข้อกำหนดจะแมปกับการติดตั้งใช้งานซับเน็ต 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 คือ 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 ที่ใช้สร้างอินเทอร์เฟซพ็อด
kubectl describe gkenetworkparamsets.networking.gke.io l3-network
ตัวอย่าง
user@$ kubectl describe gkenetworkparamsets.networking.gke.io l3-network
Name: l3-network
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: GKENetworkParamSet
Metadata:
Creation Timestamp: 2023-07-30T22:46:14Z
Finalizers:
networking.gke.io/gnp-controller
Generation: 1
Resource Version: 1583656
UID: 4c1f521b-0088-4005-b000-626ca5205326
Spec:
podIPv4Ranges:
Range Names:
sec-range-l3-subnet
Vpc: l3-vpc
Vpc Subnet: l3-subnet
Status:
Conditions:
Last Transition Time: 2023-07-30T22:46:14Z
Message:
Reason: GNPReady
Status: True
Type: Ready
Network Name: l3-network
Pod CID Rs:
Cidr Blocks:
10.0.8.0/21
Events: <none>
11. สร้าง netdevice-l3-pod
ในส่วนต่อไปนี้ คุณจะได้สร้าง netdevice-l3-pod ที่เรียกใช้ busybox ซึ่งเป็นที่รู้จักกันในชื่อ "มีดพับอเนกประสงค์" ที่รองรับคำสั่งทั่วไปมากกว่า 300 รายการ พ็อดได้รับการกำหนดค่าให้สื่อสารกับ l3-vpc โดยใช้ eth1 และ netdevice-vpc โดยใช้ eth2
สร้างคอนเทนเนอร์ Busybox ชื่อ netdevice-l3-pod.yaml โดยใช้โปรแกรมแก้ไข VI หรือ nano ใน Cloud Shell
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
ภายใน Cloud Shell ให้ตรวจสอบที่อยู่ IP ที่กำหนดให้กับอินเทอร์เฟซของ Pod
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
ใน Cloud Shell ให้ตรวจสอบเส้นทางไปยัง netdevice-vpc และ l3-vpc จาก netdevice-l3-pod โดยทำดังนี้
kubectl exec --stdin --tty netdevice-l3-pod -- /bin/sh
สร้างอินสแตนซ์และตรวจสอบอินเทอร์เฟซพ็อด
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)
สร้างอินสแตนซ์ ตรวจสอบเส้นทางพ็อด
ip route
ตัวอย่าง
/ # ip route
default via 10.0.1.1 dev eth0 #primary-vpc
10.0.1.0/24 via 10.0.1.1 dev eth0 src 10.0.1.22
10.0.1.1 dev eth0 scope link src 10.0.1.22
10.0.8.0/21 via 10.0.8.1 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.1 dev eth1 scope link
172.16.10.0/28 via 192.168.10.1 dev eth2 #netdevice-vpc (netdevice-apache subnet)
172.16.20.0/28 via 10.0.8.1 dev eth1 #l3-vpc (l3-apache subnet)
192.168.10.0/24 via 192.168.10.1 dev eth2 #pod interface subnet
192.168.10.1 dev eth2 scope link
หากต้องการกลับไปที่ Cloud Shell ให้ออกจากพ็อดจากอินสแตนซ์
exit
12. สร้าง l3-pod
ในส่วนต่อไปนี้ คุณจะสร้าง l3-pod ที่เรียกใช้ busybox ซึ่งรู้จักกันในชื่อ "มีดพับอเนกประสงค์" ที่รองรับคำสั่งทั่วไปมากกว่า 300 รายการ พ็อดได้รับการกำหนดค่าให้สื่อสารกับ l3-vpc โดยใช้ eth1 เท่านั้น
สร้างคอนเทนเนอร์ Busybox ชื่อ l3-pod.yaml โดยใช้โปรแกรมแก้ไข VI หรือ nano ใน Cloud Shell
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
ใช้ l3-pod.yaml ใน Cloud Shell
kubectl apply -f l3-pod.yaml
ตรวจสอบการสร้าง l3-pod
ตรวจสอบว่า 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
ภายใน Cloud Shell ให้ตรวจสอบที่อยู่ IP ที่กำหนดให้กับอินเทอร์เฟซของ Pod
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-pod
ใน Cloud Shell ให้ตรวจสอบเส้นทางไปยัง l3-vpc จาก netdevice-l3-pod โดยทำดังนี้
kubectl exec --stdin --tty l3-pod -- /bin/sh
สร้างอินสแตนซ์และตรวจสอบอินเทอร์เฟซพ็อด
ifconfig
ในตัวอย่างนี้ eth0 เชื่อมต่อกับเครือข่ายเริ่มต้น ส่วน eth1 เชื่อมต่อกับ l3-network
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 22:29:30:09:6B:58
inet addr:10.0.2.12 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:558 (558.0 B)
eth1 Link encap:Ethernet HWaddr 6E:6D:FC:C3:FF:AF
inet addr:10.0.8.22 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:446 (446.0 B) TX bytes:516 (516.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
จาก l3-pod ให้ตรวจสอบเส้นทางไปยัง l3-vpc (172.16.20.0/28)
สร้างอินสแตนซ์ ตรวจสอบเส้นทางพ็อด
ip route
ตัวอย่าง
/ # ip route
default via 10.0.2.1 dev eth0 #primary-vpc
10.0.2.0/24 via 10.0.2.1 dev eth0 src 10.0.2.12
10.0.2.1 dev eth0 scope link src 10.0.2.12
10.0.8.0/21 via 10.0.8.17 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.17 dev eth1 scope link #pod interface subnet
172.16.20.0/28 via 10.0.8.17 dev eth1 #l3-vpc (l3-apache subnet)
หากต้องการกลับไปที่ Cloud Shell ให้ออกจากพ็อดจากอินสแตนซ์
exit
13. การอัปเดตไฟร์วอลล์
หากต้องการอนุญาตการเชื่อมต่อจาก GKE multicnic-pool ไปยัง netdevice-vpc และ l3-vpc คุณต้องมีกฎไฟร์วอลล์ขาเข้า คุณจะสร้างกฎไฟร์วอลล์ที่ระบุช่วงต้นทางเป็นซับเน็ตเครือข่ายพ็อด เช่น 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
สร้างกฎไฟร์วอลล์ใน l3-vpc ภายใน Cloud Shell เพื่ออนุญาตให้ sec-range-l3-subnet เข้าถึงอินสแตนซ์ l3-apache
gcloud compute --project=$projectid firewall-rules create allow-ingress-from-l3-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=l3-vpc --action=ALLOW --rules=all --source-ranges=10.0.8.0/21 --enable-logging
14. ตรวจสอบการเชื่อมต่อพ็อด
ในส่วนต่อไปนี้ คุณจะยืนยันการเชื่อมต่อกับอินสแตนซ์ Apache จาก netdevice-l3-pod และ l3-pod โดยการเข้าสู่ระบบพ็อดและเรียกใช้ wget -S ที่ตรวจสอบการดาวน์โหลดหน้าแรกของเซิร์ฟเวอร์ Apache เนื่องจากมีการกำหนดค่า netdevice-l3-pod ด้วยอินเทอร์เฟซจาก netdevice-network และ l3-network จึงสามารถเชื่อมต่อกับเซิร์ฟเวอร์ Apache ใน netdevice-vpc และ l3-vpc ได้
ในทางตรงกันข้าม เมื่อเรียกใช้ wget -S จาก l3-pod จะเชื่อมต่อกับเซิร์ฟเวอร์ Apache ใน netdevice-vpc ไม่ได้ เนื่องจาก l3-pod ได้รับการกำหนดค่าด้วยอินเทอร์เฟซจาก l3-network เท่านั้น
รับที่อยู่ IP ของเซิร์ฟเวอร์ Apache
จาก Cloud Console ให้รับที่อยู่ IP ของเซิร์ฟเวอร์ Apache โดยไปที่ Compute Engine → อินสแตนซ์ VM

การทดสอบการเชื่อมต่อจาก 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 → Logs Explorer
แทรกการค้นหาด้านล่างตามภาพหน้าจอ แล้วเลือกเรียกใช้การค้นหา jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")

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

หากต้องการดูบันทึกไฟร์วอลล์เพิ่มเติม ให้ไปที่เครือข่าย VPC → ไฟร์วอลล์ → allow-ingress-from-netdevice-network-to-all-vpc-instances จากนั้นเลือกดูใน 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. ขอแสดงความยินดี
ขอแสดงความยินดี คุณได้กำหนดค่าและตรวจสอบการสร้างกลุ่มโหนดแบบหลาย NIC และการสร้างพ็อดที่เรียกใช้ Busybox เพื่อตรวจสอบการเชื่อมต่อ L3 และประเภทอุปกรณ์กับเซิร์ฟเวอร์ Apache โดยใช้ PING และ wget เรียบร้อยแล้ว
นอกจากนี้ คุณยังได้เรียนรู้วิธีใช้ประโยชน์จากบันทึกไฟร์วอลล์เพื่อตรวจสอบแพ็กเก็ตต้นทางและปลายทางระหว่างคอนเทนเนอร์พ็อดและเซิร์ฟเวอร์ Apache
Cosmopup คิดว่าบทแนะนำนั้นยอดเยี่ยมมาก!!

อ่านเพิ่มเติมและวิดีโอ
- การสร้างคลัสเตอร์ GKE (การสาธิต)
- GKE: แนวคิดเกี่ยวกับเครือข่าย
- บล็อกเกี่ยวกับคอนเทนเนอร์และ Kubernetes