GKE NFO 멀티 네트워크 배포 및 검증 고성능 인터페이스

1. 소개

GCP는 오랫동안 VM 인스턴스 수준에서 다중 인터페이스를 지원해 왔습니다. 다중 인터페이스를 사용하면 VM은 최대 7개의 새로운 인터페이스 (기본값 + 7개의 인터페이스)를 서로 다른 VPC에 연결할 수 있습니다. 이제 GKE 네트워킹이 노드에서 실행 중인 포드로 이 동작을 확장합니다. 이 기능 이전에는 GKE 클러스터에서 모든 NodePool이 단일 인터페이스만 보유할 수 있으므로 단일 VPC에 매핑됩니다. 포드의 멀티 네트워크 기능을 통해 사용자는 이제 노드와 GKE 클러스터의 포드에서 2개 이상의 인터페이스를 사용 설정할 수 있습니다.

빌드할 항목

이 튜토리얼에서는 그림 1에 설명된 사용 사례를 보여주는 포괄적인 GKE 멀티닉 환경을 빌드합니다.

  1. Busybox를 활용하여 netdevice-l3-pod를 만들면 다음과 같은 작업을 할 수 있습니다.
  2. PING 실행 및 eth2를 통해 netdevice-vpc의 netdevice-apache 인스턴스로 wget -S
  3. PING 실행 및 eth1을 통해 l3-vpc의 wget -S to l3-apache 인스턴스
  4. Busubox를 활용하여 PING 및 eth1을 통해 wget -S에서 l3-apache 인스턴스로

두 사용 사례 모두 포드의 eth0 인터페이스는 기본 네트워크에 연결됩니다.

그림 1

9d93019ee608587f.png

학습할 내용

  • l3 유형 서브넷을 만드는 방법
  • netdevice 유형 서브넷을 만드는 방법
  • 멀티 NIC GKE 노드 풀을 설정하는 방법
  • netdevice 및 l3 기능으로 포드를 만드는 방법
  • l3 기능으로 포드를 만드는 방법
  • GKE 객체 네트워크를 만들고 검증하는 방법
  • PING, wget 및 방화벽 로그를 사용하여 원격 Apache 서버에 대한 연결을 확인하는 방법

필요한 항목

  • Google Cloud 프로젝트

2. 용어 및 개념

기본 VPC: 기본 VPC는 기본 설정 및 리소스 집합과 함께 제공되는 사전 구성된 VPC입니다. GKE 클러스터가 이 VPC에 생성됩니다.

서브넷: Google Cloud에서 서브넷은 VPC에서 넷마스크를 사용하여 CIDR (클래스 없는 도메인 간 라우팅)을 만드는 방법입니다. 서브넷에는 노드에 할당되는 단일 기본 IP 주소 범위가 있으며 포드와 서비스에 속할 수 있는 보조 범위가 여러 개 있을 수 있습니다.

노드 네트워크: 노드 네트워크는 VPC 및 서브넷 쌍의 전용 조합을 나타냅니다. 이 노드 네트워크 내에서 노드 풀에 속하는 노드에는 기본 IP 주소 범위의 IP 주소가 할당됩니다.

보조 범위: Google Cloud 보조 범위는 VPC의 리전에 속하는 CIDR 및 넷마스크입니다. GKE는 이를 레이어 3 포드 네트워크로 사용합니다. VPC에는 보조 범위가 여러 개 있을 수 있으며, 하나의 포드는 여러 개의 포드 네트워크에 연결될 수 있습니다.

네트워크 (L3 또는 기기): 포드의 연결 지점 역할을 하는 네트워크 객체입니다. 튜토리얼에서 사용하는 네트워크는 l3-network 및 netdevice-network이며 기기는 netdevice 또는 dpdk일 수 있습니다. 기본 네트워크는 필수이며 default-nodepool 서브넷을 기반으로 클러스터를 만들 때 생성됩니다.

레이어 3 네트워크는 다음과 같이 표시되는 서브넷의 보조 범위에 해당합니다.

VPC -> 서브넷 이름 -> 보조 범위 이름

기기 네트워크는 다음과 같이 표시되는 VPC의 서브넷에 해당합니다.

VPC -> 서브넷 이름

기본 포드 네트워크: Google Cloud는 클러스터 생성 중에 기본 포드 네트워크를 만듭니다. 기본 포드 네트워크는 기본 VPC를 노드 네트워크로 사용합니다. 기본적으로 모든 클러스터 노드와 포드에서 기본 포드 네트워크를 사용할 수 있습니다.

다중 인터페이스가 있는 포드: 포드의 각 인터페이스가 고유한 네트워크에 연결되어야 하므로 GKE의 인터페이스가 여러 개인 포드는 동일한 포드 네트워크에 연결할 수 없습니다.

Codelab을 지원하도록 프로젝트 업데이트

이 Codelab에서는 $variables를 사용하여 Cloud Shell에서 gcloud 구성을 구현하는 데 도움을 줍니다.

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 클러스터 생성

primary-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 내에서 default-pool에서 두 개의 노드가 생성되는지 확인합니다.

kubectl get nodes

예:

user@$ kubectl get nodes
NAME                                          STATUS   ROLES    AGE    VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p   Ready    <none>   2m4s   v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb   Ready    <none>   2m4s   v1.27.3-gke.100

5. netdevice-vpc 설정

netdevice-vpc 네트워크 만들기

Cloud Shell 내에서 다음을 수행합니다.

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

netdevice-vpc 서브넷 만들기

Cloud Shell 내에서 멀티닉 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)는 멀티닉 l3-네트워크에 사용됩니다.

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

Cloud Shell 내에서 l3-apache 인스턴스의 서브넷을 만듭니다.

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

Cloud Router 및 NAT 구성

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. 멀티닉 노드 풀 만들기

다음 섹션에서는 다음 플래그로 구성된 멀티닉 노드 풀을 만듭니다.

–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. 다중 노드 풀 검증

Cloud Shell 내에서 multinic-node-pool의 세 개 노드가 생성되는지 확인합니다.

kubectl get nodes

예:

user@$ kubectl get nodes
NAME                                                STATUS   ROLES    AGE     VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p         Ready    <none>   15m     v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb         Ready    <none>   15m     v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-0tfx   Ready    <none>   3m51s   v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-86gz   Ready    <none>   3m51s   v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-t66p   Ready    <none>   3m51s   v1.27.3-gke.100

9. netdevice-network 만들기

다음 단계에서는 네트워크 및 GKENetworkParamSet Kubernetes 객체를 생성하여 이후 단계에서 포드를 연결하는 데 사용할 netdevice-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 상태 유형이 '준비됨'인지 확인합니다.

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 내에서 이후 단계의 포드 인터페이스에 사용되는 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 네트워크 만들기

다음 단계에서는 네트워크 및 GKENetworkParamSet Kubernetes 객체를 생성하여 이후 단계에서 포드를 연결하는 데 사용할 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-네트워크 상태 유형이 '준비됨'인지 확인합니다.

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 네트워크 상태 이유가 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 만들기

다음 섹션에서는 'Swiss Army knife'라고 하는 Busybox를 실행하는 netdevice-l3-pod를 만듭니다. 300개 이상의 일반적인 명령을 지원합니다. 포드는 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 내에서 포드 인터페이스에 할당된 IP 주소의 유효성을 검사합니다.

kubectl get pods netdevice-l3-pod -o yaml

제공된 예에서 networking.gke.io/pod-ips 필드에는 l3-network 및 netdevice-network의 포드 인터페이스에 연결된 IP 주소가 포함됩니다. 기본 네트워크 IP 주소 10.0.1.22는 podIP 아래에 자세히 설명되어 있습니다.

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

인스턴스를 형성하고 포드 인터페이스의 유효성을 검사합니다.

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 실행 바쁜 박스를 만듭니다. 300개 이상의 일반적인 명령을 지원합니다. 포드는 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 내에서 포드 인터페이스에 할당된 IP 주소의 유효성을 검사합니다.

kubectl get pods l3-pod -o yaml

제공된 예시에서 networking.gke.io/pod-ips 필드에는 l3-network의 포드 인터페이스에 연결된 IP 주소가 포함됩니다. 기본 네트워크 IP 주소 10.0.2.12는 podIP에 자세히 설명되어 있습니다.

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

인스턴스를 형성하고 포드 인터페이스의 유효성을 검사합니다.

ifconfig

이 예에서 eth0은 기본 네트워크에 연결되어 있고 eth1은 l3-네트워크에 연결됩니다.

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

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

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

l3-pod에서 l3-vpc (172.16.20.0/28)로의 경로를 검증합니다.

인스턴스를 형성하고 포드 경로를 검증합니다.

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에서 할당됨)는 l3-vpc의 l3-apache 인스턴스에 연결할 때 소스 IP 주소입니다.

netdevice-vpc: netdevice-subnet에서 netdevice-apache까지 허용

Cloud Shell 내에서 netdevice-vpc에 netdevice-apache 인스턴스에 대한 netdevice-subnet의 액세스를 허용하는 방화벽 규칙을 만듭니다.

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-apache 인스턴스에 대한 sec-range-l3-subnet 액세스를 허용하는 방화벽 규칙을 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. 포드 연결 검증

다음 섹션에서는 포드에 로그인하고 Apache 서버 홈페이지의 다운로드를 검증하는 wget -S를 실행하여 netdevice-l3-pod 및 l3-pod에서 Apache 인스턴스에 대한 연결을 확인합니다. netdevice-l3-pod는 netdevice-network 및 l3-network의 인터페이스로 구성되므로 netdevice-vpc 및 l3-vpc의 Apache 서버에 연결할 수 있습니다.

반면에 l3-pod에서 wget -S를 수행하는 경우 l3-pod는 l3-네트워크의 인터페이스로만 구성되므로 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 <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 주소를 기반으로 wget -S to netdevice-apache 인스턴스를 수행합니다. 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 <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로 돌아가려면 인스턴스에서 포드를 종료합니다.

exit

l3-pod와 netdevice-apache 연결 테스트

Cloud Shell 내에서 l3-pod에 로그인합니다.

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

컨테이너에서 이전 단계에서 얻은 IP 주소를 기반으로 netdevice-apache 인스턴스에 대한 핑을 수행합니다. l3-pod에는 netdevice-network와 연결된 인터페이스가 없으므로 핑이 실패합니다.

ping <insert-your-ip> -c 4

예:

/ # ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes


--- 172.16.10.2 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

선택사항: Cloud Shell 내에서 시간 초과가 발생하는 이전 단계에서 얻은 IP 주소에 따라 wget -S를 netdevice-apache 인스턴스에 수행합니다.

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 <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 콘솔에서 Logging → 로그 탐색기로 이동합니다.

스크린샷에 따라 아래 쿼리를 삽입하고 쿼리 실행 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. 축하합니다

수고하셨습니다. PING와 wget을 사용하여 Apache 서버에 대한 L3 및 기기 유형 연결을 검증하기 위해 멀티닉 노드 풀을 만들고 Busybox를 실행하는 포드를 만들어 구성 및 검증했습니다.

또한 방화벽 로그를 활용하여 포드 컨테이너와 Apache 서버 간의 소스 및 대상 패킷을 검사하는 방법도 배웠습니다.

Cosmopup은 튜토리얼이 멋지다고 생각합니다.

e6d3675ca7c6911f.jpeg

추가 자료 및 동영상

참조 문서