GKE NFO マルチネットワークのデプロイと検証高性能インターフェース

1. はじめに

GCP は長い間、VM インスタンス レベルで複数のインターフェースをサポートしてきました。複数のインターフェースを使用すると、VM は最大 7 つの新しいインターフェース(デフォルト + 7 つのインターフェース)を別の VPC に接続できます。GKE ネットワーキングでは、ノードで実行されている Pod にこの動作が拡張されました。この機能が導入される前は、GKE クラスタではすべてのノードプールにインターフェースが 1 つしかないため、単一の VPC にマッピングされていました。Pod のマルチネットワーク機能を使用すると、ユーザーは GKE クラスタ内のノードと Pod で複数のインターフェースを有効にできるようになりました。

作成するアプリの概要

このチュートリアルでは、図 1 に示すユースケースを示す包括的な GKE マルチ NIC 環境を構築します。

  1. Busybox を利用して netdevice-l3-pod を作成します。手順は次のとおりです。
  2. PING を実行して、wget -S を eth2 を介して netdevice-vpc の netdevice-apache インスタンスへ
  3. PING を実行して、eth1 を介して l3-vpc の l3-apache インスタンスへ wget -S を適用
  4. busybox を利用して PING を実行する l3 Pod を作成し、eth1 を介した l3-apache インスタンスへの wget -S

どちらのユースケースでも、Pod の eth0 インターフェースはデフォルト ネットワークに接続されます。

図 1

9d93019ee608587f.png

学習内容

  • l3 タイプのサブネットの作成方法
  • netdevice タイプのサブネットを作成する方法
  • マルチ NIC GKE ノードプールを確立する方法
  • netdevice 機能と l3 機能を備えた Pod の作成方法
  • L3 機能を備えた Pod の作成方法
  • GKE オブジェクト ネットワークを作成して検証する方法
  • PING、wget、ファイアウォールのログを使用して、リモートの Apache サーバーへの接続を検証する方法

必要なもの

  • Google Cloud プロジェクト

2. 用語と概念

プライマリ VPC: プライマリ VPC は事前構成済みの VPC で、デフォルトの設定とリソースが含まれています。GKE クラスタはこの VPC に作成されます。

サブネット: Google Cloud では、サブネットは VPC 内でネットマスクを使用してクラスレス ドメイン間ルーティング(CIDR)を作成する方法です。サブネットには、ノードに割り当てられる単一のプライマリ IP アドレス範囲があり、Pod と Service に属する複数のセカンダリ範囲を持つことができます。

ノード ネットワーク: ノード ネットワークは、VPC とサブネットのペアの専用の組み合わせを指します。このノードネットワーク内では、ノードプールに属するノードに、プライマリ IP アドレス範囲から IP アドレスが割り振られます。

セカンダリ範囲: Google Cloud のセカンダリ範囲は、VPC 内のリージョンに属する CIDR とネットマスクです。GKE はこれをレイヤ 3 Pod ネットワークとして使用します。VPC は複数のセカンダリ範囲を持つことができ、Pod は複数の Pod ネットワークに接続できます。

ネットワーク(L3 またはデバイス): Pod の接続ポイントとして機能するネットワーク オブジェクト。このチュートリアルでは、ネットワークは l3-network と netdevice-network であり、デバイスは netdevice または dpdk のいずれかです。デフォルト ネットワークは必須であり、default-nodepool サブネットに基づいてクラスタの作成時に作成されます。

レイヤ 3 ネットワークは、次のようにサブネットのセカンダリ範囲に対応します。

VPC ->サブネット名 ->セカンダリ範囲の名前

デバイス ネットワークは VPC 上のサブネットに対応し、次のように表されます。

VPC ->サブネット名

デフォルトの Pod ネットワーク: Google Cloud は、クラスタの作成時にデフォルトの Pod ネットワークを作成します。デフォルトの Pod ネットワークは、ノード ネットワークとしてプライマリ VPC を使用します。デフォルトの Pod ネットワークは、デフォルトですべてのクラスタノードと Pod で使用できます。

複数のインターフェースを持つ Pod: GKE で複数のインターフェースを持つ Pod は、Pod の各インターフェースを固有のネットワークに接続する必要があるため、同じ Pod ネットワークに接続できません。

Codelab をサポートするようにプロジェクトを更新する

この Codelab では、Cloud Shell での gcloud 構成の実装に役立つ $variables を使用します。

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 クラスタの作成

プライマリ VPC サブネットを指定して限定公開 GKE クラスタを作成し、マルチ NIC ノードプールをサポートするには、必要なフラグ –enable-multi-networking と –enable-dataplane-v2 を指定してデフォルトのノードプールを作成します。

Cloud Shell で、GKE クラスタを作成します。

gcloud container clusters create multinic-gke \
    --zone "us-central1-a" \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --enable-multi-networking \
    --network "primary-vpc" --subnetwork "primary-node-subnet" \
    --num-nodes=2 \
    --max-pods-per-node=32 \
    --cluster-secondary-range-name=sec-range-primay-vpc \
    --no-enable-master-authorized-networks \
    --release-channel "regular" \
    --enable-private-nodes --master-ipv4-cidr "100.100.10.0/28" \
    --enable-ip-alias

multinic-gke クラスタを検証する

Cloud Shell 内で、クラスタの認証を行います。

gcloud container clusters get-credentials multinic-gke --zone us-central1-a --project $projectid

Cloud Shell で、デフォルト プールから 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

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 の構成

VM インスタンスに外部 IP アドレスがないため、ソフトウェア パッケージのインストールのチュートリアルでは Cloud NAT を使用します。

Cloud Shell で Cloud Router を作成します。

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

Cloud Shell 内で、NAT ゲートウェイを作成します。

gcloud compute routers nats create cloud-nat-netdevice --router=netdevice-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

netdevice-apache インスタンスを作成する

次のセクションでは、netdevice-apache インスタンスを作成します。

Cloud Shell 内でインスタンスを作成します。

gcloud compute instances create netdevice-apache \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=netdevice-apache \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the netdevice-apache instance !!' | tee /var/www/html/index.html
      EOF"

6. l3-vpc の設定

l3-vpc ネットワークを作成する

Cloud Shell で、次のコマンドを実行します。

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

l3-vpc サブネットを作成する

Cloud Shell 内で、プライマリ範囲とセカンダリ範囲のサブネットを作成します。セカンダリ範囲(sec-range-l3-subnet)はマルチ NIC l3-network に使用されます。

gcloud compute networks subnets create l3-subnet --project=$projectid --range=192.168.20.0/24 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access --secondary-range=sec-range-l3-subnet=10.0.8.0/21

Cloud Shell 内で、l3-apache インスタンスのサブネットを作成します。

gcloud compute networks subnets create l3-apache --project=$projectid --range=172.16.20.0/28 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access

Cloud Router と NAT の構成

VM インスタンスに外部 IP アドレスがないため、ソフトウェア パッケージのインストールのチュートリアルでは Cloud NAT を使用します。

Cloud Shell で Cloud Router を作成します。

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

Cloud Shell 内で、NAT ゲートウェイを作成します。

gcloud compute routers nats create cloud-nat-l3 --router=l3-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

l3-apache インスタンスを作成する

次のセクションでは、l3-apache インスタンスを作成します。

Cloud Shell 内でインスタンスを作成します。

gcloud compute instances create l3-apache \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=l3-apache \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the l3-apache instance !!' | tee /var/www/html/index.html
      EOF"

7. マルチ NIC ノードプールを作成する

次のセクションでは、次のフラグで構成されるマルチ NIC ノードプールを作成します。

–additional-node-network(デバイスタイプのインターフェースの場合は必須)

例:

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

–additional-node-network と–additional-pod-network(L3 タイプのインターフェースでは必須)

例:

--additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8

マシンタイプ: ノードプールをデプロイする際は、マシンタイプの依存関係を考慮してください。たとえば、「e2-standard-4」のようなマシンタイプ最大 4 つの VPC をサポートできます。たとえば、netdevice-l3-pod には合計 3 つのインターフェース(デフォルト、netdevice、l3)があるため、このチュートリアルで使用するマシンタイプは e2-standard-4 です。

Cloud Shell 内で、タイプと L3 で構成されるノードプールを作成します。

gcloud container --project "$projectid" node-pools create "multinic-node-pool" --cluster "multinic-gke" --zone "us-central1-a" --additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet --additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8 --machine-type "e2-standard-4"

8. multnic-node-pool を検証する

Cloud Shell 内で、multinic-node-pool から 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 オブジェクトを生成して、後のステップで Pod を関連付けるために使用する netdevice-network を作成します。

netdevice-network オブジェクトを作成する

Cloud Shell 内で、VI エディタまたは nano を使用してネットワーク オブジェクト YAML netdevice-network.yaml を作成します。[routes to] というnetdevice-vpc のサブネットは 172.16.10.0/28(netdevice-apache)です。

apiVersion: networking.gke.io/v1
kind: Network
metadata:
    name: netdevice-network
spec:
    type: "Device"
    parametersRef:
      group: networking.gke.io
      kind: GKENetworkParamSet
      name: "netdevice"
    routes:
    - to: "172.16.10.0/28"

Cloud Shell 内で netdevice-network.yaml を適用します。

kubectl apply -f netdevice-network.yaml 

Cloud Shell 内で、netdevice-network ステータス タイプが Ready になっていることを確認します。

kubectl describe networks netdevice-network

例:

user@$ kubectl describe networks netdevice-network
Name:         netdevice-network
Namespace:    
Labels:       <none>
Annotations:  networking.gke.io/in-use: false
API Version:  networking.gke.io/v1
Kind:         Network
Metadata:
  Creation Timestamp:  2023-07-30T22:37:38Z
  Generation:          1
  Resource Version:    1578594
  UID:                 46d75374-9fcc-42be-baeb-48e074747052
Spec:
  Parameters Ref:
    Group:  networking.gke.io
    Kind:   GKENetworkParamSet
    Name:   netdevice
  Routes:
    To:  172.16.10.0/28
  Type:  Device
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:37:38Z
    Message:               GKENetworkParamSet resource was deleted: netdevice
    Reason:                GNPDeleted
    Status:                False
    Type:                  ParamsReady
    Last Transition Time:  2023-07-30T22:37:38Z
    Message:               Resource referenced by params is not ready
    Reason:                ParamsNotReady
    Status:                False
    Type:                  Ready
Events:                    <none>

GKENetworkParamSet を作成する

Cloud Shell 内で、VI エディタまたは nano を使用してネットワーク オブジェクト YAML netdevice-network-parm.yaml を作成します。この仕様は 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 内で、後のステップで Pod インターフェースに使用する gkenetworkparamset CIDR ブロック 192.168.10.0/24 を検証します。

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 オブジェクトを生成して、後のステップで Pod を関連付けるために使用する l3 ネットワークを作成します。

l3 ネットワーク オブジェクトを作成する

Cloud Shell 内で、VI エディタまたは nano を使用してネットワーク オブジェクト YAML l3-network.yaml を作成します。[routes to] というl3-vpc のサブネット 172.16.20.0/28(l3-apache)です。

apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: l3-network
spec:
  type: "L3"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: "l3-network"
  routes:
  - to: "172.16.20.0/28"

Cloud Shell 内で l3-network.yaml を適用します。

kubectl apply -f l3-network.yaml 

Cloud Shell で、l3-network のステータス タイプが Ready になっていることを確認します。

kubectl describe networks l3-network

例:

user@$ kubectl describe networks l3-network
Name:         l3-network
Namespace:    
Labels:       <none>
Annotations:  networking.gke.io/in-use: false
API Version:  networking.gke.io/v1
Kind:         Network
Metadata:
  Creation Timestamp:  2023-07-30T22:43:54Z
  Generation:          1
  Resource Version:    1582307
  UID:                 426804be-35c9-4cc5-bd26-00b94be2ef9a
Spec:
  Parameters Ref:
    Group:  networking.gke.io
    Kind:   GKENetworkParamSet
    Name:   l3-network
  Routes:
  to:  172.16.20.0/28
  Type:  L3
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:43:54Z
    Message:               GKENetworkParamSet resource was deleted: l3-network
    Reason:                GNPDeleted
    Status:                False
    Type:                  ParamsReady
    Last Transition Time:  2023-07-30T22:43:54Z
    Message:               Resource referenced by params is not ready
    Reason:                ParamsNotReady
    Status:                False
    Type:                  Ready
Events:                    <none>

GKENetworkParamSet を作成する

Cloud Shell 内で、VI エディタまたは nano を使用してネットワーク オブジェクト YAML l3-network-parm.yaml を作成します。仕様が 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 内で、Pod インターフェースの作成に使用された 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 を作成する

次のセクションでは、「Swiss Army knife」という名前の netdevice-l3-pod で busybox を実行するように作成します。一般的なコマンドを 300 以上サポートしています。この Pod は、eth1 を使用して l3-vpc と通信し、eth2 を使用して netdevice-vpc と通信するように構成されています。

Cloud Shell 内で、VI エディタまたは nano を使用して netdevice-l3-pod.yaml という名前のビジーボックス コンテナを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: netdevice-l3-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
      {"interfaceName":"eth0","network":"default"},
      {"interfaceName":"eth1","network":"l3-network"},
      {"interfaceName":"eth2","network":"netdevice-network"}
      ]
spec:
  containers:
  - name: netdevice-l3-pod
    image: busybox
    command: ["sleep", "10m"]
    ports:
    - containerPort: 80
  restartPolicy: Always

Cloud Shell 内で netdevice-l3-pod.yaml を適用します。

kubectl apply -f netdevice-l3-pod.yaml

netdevice-l3-pod の作成を検証する

Cloud Shell 内で、netdevice-l3-pod が実行されていることを確認します。

kubectl get pods netdevice-l3-pod

例:

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

Cloud Shell 内で、Pod インターフェースに割り当てられた IP アドレスを検証します。

kubectl get pods netdevice-l3-pod -o yaml

提供されている例では、networking.gke.io/pod-ips フィールドに、l3-network と netdevice-network からの Pod インターフェースに関連付けられた IP アドレスが含まれています。デフォルトのネットワーク 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-l3-pod から netdevice-vpc と l3-vpc へのルートを検証します。

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

インスタンスを形成し、Pod インターフェースを検証します。

ifconfig

この例では、eth0 は default ネットワーク、eth1 は l3-network、eth2 は netdevice-network にそれぞれ接続している。

/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 26:E3:1B:14:6E:0C  
          inet addr:10.0.1.22  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:446 (446.0 B)  TX bytes:558 (558.0 B)

eth1      Link encap:Ethernet  HWaddr 92:78:4E:CB:F2:D4  
          inet addr:10.0.8.4  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:446 (446.0 B)  TX bytes:516 (516.0 B)

eth2      Link encap:Ethernet  HWaddr 42:01:C0:A8:0A:02  
          inet addr:192.168.10.2  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:73 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50581 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:26169 (25.5 KiB)  TX bytes:2148170 (2.0 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

netdevice-l3-pod から、netdevice-vpc(172.16.10.0/28)と l3-vpc(172.16.20.0/28)へのルートを検証します。

インスタンスを形成し、Pod のルートを検証します。

ip route

例:

/ # ip route
default via 10.0.1.1 dev eth0 #primary-vpc
10.0.1.0/24 via 10.0.1.1 dev eth0  src 10.0.1.22 
10.0.1.1 dev eth0 scope link  src 10.0.1.22 
10.0.8.0/21 via 10.0.8.1 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.1 dev eth1 scope link 
172.16.10.0/28 via 192.168.10.1 dev eth2 #netdevice-vpc (netdevice-apache subnet)
172.16.20.0/28 via 10.0.8.1 dev eth1 #l3-vpc (l3-apache subnet)
192.168.10.0/24 via 192.168.10.1 dev eth2 #pod interface subnet
192.168.10.1 dev eth2 scope link 

Cloud Shell に戻るには、インスタンスから Pod を終了します。

exit

12. l3-pod を作成する

次のセクションでは、l3-pod で実行中の busybox(スイス アーミー ナイフ)を作成します。一般的なコマンドを 300 以上サポートしています。この Pod は、eth1 のみを使用して l3-vpc と通信するように構成されています。

Cloud Shell 内で、VI エディタまたは nano を使用して l3-pod.yaml という名前のビジーボックス コンテナを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: l3-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
      {"interfaceName":"eth0","network":"default"},
      {"interfaceName":"eth1","network":"l3-network"}
      ]
spec:
  containers:
  - name: l3-pod
    image: busybox
    command: ["sleep", "10m"]
    ports:
    - containerPort: 80
  restartPolicy: Always

Cloud Shell 内で l3-pod.yaml を適用します。

kubectl apply -f l3-pod.yaml

l3-Pod の作成を検証する

Cloud Shell 内で、netdevice-l3-pod が実行されていることを確認します。

kubectl get pods l3-pod

例:

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

Cloud Shell 内で、Pod インターフェースに割り当てられた IP アドレスを検証します。

kubectl get pods l3-pod -o yaml

提供されている例では、networking.gke.io/pod-ips フィールドに、l3-network からの Pod インターフェースに関連付けられた IP アドレスが含まれています。デフォルトのネットワーク 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 内で、netdevice-l3-pod から l3-vpc へのルートを検証します。

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

インスタンスを形成し、Pod インターフェースを検証します。

ifconfig

この例では、eth0 はデフォルトネットワークに接続され、eth1 は l3-network に接続されます。

/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 22:29:30:09:6B:58  
          inet addr:10.0.2.12  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:446 (446.0 B)  TX bytes:558 (558.0 B)

eth1      Link encap:Ethernet  HWaddr 6E:6D:FC:C3:FF:AF  
          inet addr:10.0.8.22  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:446 (446.0 B)  TX bytes:516 (516.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

l3-pod から l3-vpc(172.16.20.0/28)へのルートを検証します。

インスタンスを形成し、Pod のルートを検証します。

ip route

例:

/ # ip route
default via 10.0.2.1 dev eth0 #primary-vpc
10.0.2.0/24 via 10.0.2.1 dev eth0  src 10.0.2.12 
10.0.2.1 dev eth0 scope link  src 10.0.2.12 
10.0.8.0/21 via 10.0.8.17 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.17 dev eth1 scope link #pod interface subnet
172.16.20.0/28 via 10.0.8.17 dev eth1 #l3-vpc (l3-apache subnet)

Cloud Shell に戻るには、インスタンスから Pod を終了します。

exit

13. ファイアウォールの更新

GKE multicnic-pool から netdevice-vpc と l3-vpc の上り(内向き)ファイアウォール ルールへの接続を許可するには、上り(内向き)ファイアウォール ルールが必要です。ソース範囲を Pod ネットワークのサブネットとして指定するファイアウォール ルールを作成します。次に例を示します。netdevice-subnet、sec-range-l3-subnet。

たとえば、最近作成されたコンテナ「l3-pod, eth2」の Interface 10.0.8.22(sec-range-l3-subnet から割り当て)は、l3-vpc の l3-apache インスタンスに接続する際の送信元 IP アドレスです。

netdevice-vpc: netdevice-subnet から netdevice-apache への許可

Cloud Shell で、netdevice-subnet に netdevice-apache インスタンスへのアクセスを許可するファイアウォール ルールを netdevice-vpc に作成します。

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 で、sec-range-l3-subnet に l3-apache インスタンスへのアクセスを許可するファイアウォール ルールを l3-vpc に作成します。

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 の接続を検証する

次のセクションでは、netdevice-l3-pod と l3-pod から Apache インスタンスへの接続を確認します。そのためには、Pod にログインして wget -S を実行し、apache サーバーのホームページのダウンロードを検証します。netdevice-l3-pod には netdevice-network と l3-network からのインターフェースが構成されているため、netdevice-vpc と l3-vpc にある Apache サーバーへの接続が可能です。

一方、l3-pod から wget -S を実行すると、l3-pod は l3-network からのインターフェースのみで構成されるため、netdevice-vpc で Apache サーバーに接続することはできません。

Apache サーバーの IP アドレスを取得する

Cloud コンソールで、[Compute Engine] → [VM インスタンス] に移動して Apache サーバーの IP アドレスを取得します。

fee492b4fd303859.png

netdevice-l3-pod と netdevice-apache の接続テスト

Cloud Shell 内で、netdevice-l3-pod にログインします。

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

前の手順で取得した IP アドレスに基づいて、コンテナから netdevice-apache インスタンスへの 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
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 内で、前の手順で取得した IP アドレスに基づいて netdevice-apache インスタンスに対して wget -S を実行します。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 内で、前の手順で取得した IP アドレスに基づいて l3-apache インスタンスに対して ping を実行します。

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 ファイルを削除し、前のステップで取得した IP アドレスに基づいて wget -S から l3-apache のインスタンスに対して実行します。200 OK は、ウェブページのダウンロードが成功したことを示します。

rm index.html 
wget -S <insert-your-ip>

例:

/ # rm index.html 
/ # wget -S 172.16.20.3
Connecting to 172.16.20.3 (172.16.20.3:80)
  HTTP/1.1 200 OK
  Date: Mon, 31 Jul 2023 03:41:32 GMT
  Server: Apache/2.4.56 (Debian)
  Last-Modified: Mon, 31 Jul 2023 03:24:21 GMT
  ETag: "25-601bff76f04b7"
  Accept-Ranges: bytes
  Content-Length: 37
  Connection: close
  Content-Type: text/html
  
saving to 'index.html'
index.html           100% |*******************************************************************************************************|    37  0:00:00 ETA
'index.html' saved

Cloud Shell に戻るには、インスタンスから Pod を終了します。

exit

l3-pod から netdevice-apache への接続テスト

Cloud Shell 内で l3-pod にログインします。

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

前の手順で取得した IP アドレスに基づいて、コンテナから netdevice-apache インスタンスへの ping を実行します。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 内で、前の手順で取得した IP アドレスに基づいて l3-apache インスタンスに対して ping を実行します。

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 内で、前のステップで取得した IP アドレスに基づいて wget -S を l3-apache インスタンスに対して実行します。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 コンソールで、[ロギング] → [ログ エクスプローラ] に移動します。

スクリーンショットに沿って以下のクエリを挿入し、[Run query jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")] を選択します

280d00f2c5ce6109.png

キャプチャを詳しく調べることで、セキュリティ管理者にとって情報要素が得られます。送信元と宛先の IP アドレス、ポート、プロトコル

ae4638ed9b718ac6.png

ファイアウォール ログをさらに確認するには、[VPC ネットワーク] → [ファイアウォール] → [allow-ingress-from-netdevice-network-to-all-vpc-instances] に移動し、ログ エクスプローラで [表示] を選択します。

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 を実行している Pod の作成が正常に終了し、PING と wget を使用して Apache サーバーへの L3 と Device タイプの接続を検証できました。

また、ファイアウォール ログを活用して、Pod コンテナと Apache サーバー間の送信元パケットと宛先パケットを検査する方法も学びました。

コスモパップはチュートリアルを素晴らしいと思っています!!

e6d3675ca7c6911f.jpeg

参考資料と動画

リファレンス ドキュメント