Развертывание и проверка мультисети GKE NFO & Высокопроизводительный интерфейс

1. Введение

GCP давно поддерживает несколько сетевых интерфейсов на уровне экземпляра виртуальной машины. Благодаря поддержке нескольких интерфейсов виртуальная машина может подключить до 7 новых интерфейсов (по умолчанию + 7 интерфейсов) к различным VPC. Теперь сетевые возможности GKE распространяют это поведение на поды, работающие на узлах. До появления этой функции кластеры GKE позволяли всем пулам узлов иметь только один интерфейс и, следовательно, быть привязанными к одной VPC. Благодаря функции Multi-Network on Pods пользователь теперь может включить более одного интерфейса на узлах и для подов в кластере GKE.

Что вы построите

В этом руководстве вы создадите комплексную многоядерную среду GKE, иллюстрирующую сценарий(ы) использования, показанный(е) на рисунке 1.

  1. Создайте netdevice-l3-pod с использованием busybox для выполнения следующих действий:
  2. Выполните команды PING и wget -S для подключения к экземпляру netdevice-apache в netdevice-vpc через eth2.
  3. Выполните команды PING и wget -S для доступа к экземпляру l3-apache в l3-vpc через eth1.
  4. Создайте под l3, использующий busybox, для выполнения команд PING и wget -S к экземпляру l3-apache через eth1.

В обоих случаях интерфейс eth0 пода подключен к сети по умолчанию.

Рисунок 1

9d93019ee608587f.png

Что вы узнаете

  • Как создать подсеть типа L3
  • Как создать подсеть типа netdevice
  • Как создать пул узлов GKE с несколькими сетевыми интерфейсами
  • Как создать под с поддержкой NetDevice и L3.
  • Как создать под с возможностями уровня L3
  • Как создать и проверить объектную сеть GKE
  • Как проверить подключение к удаленным серверам Apache с помощью команд PING, wget и журналов брандмауэра.

Что вам понадобится

  • Проект Google Cloud

2. Терминология и понятия

Основная VPC: Основная VPC — это предварительно настроенная VPC, которая поставляется с набором настроек и ресурсов по умолчанию. Кластер GKE создается в этой VPC.

Подсеть: В Google Cloud подсеть — это способ создания бесклассовой междоменной маршрутизации (CIDR) с использованием масок подсети в VPC. Подсеть имеет один основной диапазон IP-адресов, который назначается узлам, и может иметь несколько дополнительных диапазонов, которые могут принадлежать подам и сервисам.

Сеть узлов: Сеть узлов представляет собой выделенную комбинацию пары VPC и подсети. В рамках этой сети узлам, принадлежащим пулу узлов, выделяются IP-адреса из основного диапазона IP-адресов.

Вторичный диапазон: Вторичный диапазон Google Cloud — это CIDR и маска подсети, принадлежащие региону в VPC. GKE использует его в качестве сети Pod уровня 3. VPC может иметь несколько вторичных диапазонов, и Pod может подключаться к нескольким сетям Pod.

Сеть (L3 или устройство): объект сети, служащий точкой подключения для подов. В руководстве используются сети l3-network и netdevice-network, где устройством может быть либо netdevice, либо dpdk. Сеть по умолчанию является обязательной и создается при создании кластера на основе подсети default-nodepool.

Сети третьего уровня соответствуют вторичному диапазону в подсети, обозначаемому следующим образом:

VPC -> Имя подсети -> Имя вторичного диапазона

Сеть устройств соответствует подсети в VPC и представляется следующим образом:

VPC -> Имя подсети

Сеть Pod-ов по умолчанию: Google Cloud создает сеть Pod-ов по умолчанию во время создания кластера. В качестве сети узлов используется основная VPC. Сеть Pod-ов по умолчанию доступна на всех узлах кластера и Pod-ах.

Поды с несколькими интерфейсами: Поды с несколькими интерфейсами в GKE не могут подключаться к одной и той же сети Pod, поскольку каждый интерфейс Pod должен быть подключен к уникальной сети.

Обновите проект, чтобы он поддерживал практическое занятие.

В этом практическом занятии используется переменная `$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, указав подсети primary-vpc, чтобы создать пул узлов по умолчанию с необходимыми флагами –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 убедитесь, что из пула по умолчанию сгенерированы два узла:

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

Настройка облачного маршрутизатора и NAT.

В данном руководстве для установки программных пакетов используется Cloud NAT, поскольку у экземпляра виртуальной машины нет внешнего IP-адреса.

Внутри Cloud Shell создайте облачный маршрутизатор.

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

Настройка облачного маршрутизатора и NAT.

В данном руководстве для установки программных пакетов используется Cloud NAT, поскольку у экземпляра виртуальной машины нет внешнего IP-адреса.

Внутри Cloud Shell создайте облачный маршрутизатор.

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. Создайте пул узлов с многоадресной сетевой картой (multinic nodepool).

В следующем разделе вы создадите пул узлов с несколькими сетевыми интерфейсами, состоящий из следующих флагов:

–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 виртуальными процессорами может поддерживать до 4 VPC в общей сложности. Например, netdevice-l3-pod будет иметь в общей сложности 3 интерфейса (default, netdevice и l3), поэтому в руководстве используется тип машины e2-standard-4.

Внутри Cloud Shell создайте пул узлов, состоящий из устройства типа Device и уровня 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 убедитесь, что из пула многоузловых узлов сгенерированы три узла:

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.

Внутри Cloud Shell создайте сетевой объект YAML netdevice-network.yaml с помощью редактора VI или nano. Обратите внимание, что "routes to" — это подсеть 172.16.10.0/28 (netdevice-apache) в netdevice-vpc.

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

Внутри Cloud Shell примените файл netdevice-network.yaml:

kubectl apply -f netdevice-network.yaml 

Внутри Cloud Shell убедитесь, что тип состояния netdevice-network — «Готов».

kubectl describe networks netdevice-network

Пример:

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

Создайте набор параметров сети GKENetworkParamSet.

Внутри Cloud Shell создайте сетевой объект в формате YAML netdevice-network-parm.yaml с помощью редактора VI или 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 Status Reason 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 gkenetworkparamset 192.168.10.0/24, используемый для интерфейса Pod(s).

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, которая будет использоваться для связывания подов на последующих этапах.

Создайте объект сети L3.

Внутри Cloud Shell создайте сетевой объект в формате YAML l3-network.yaml с помощью редактора VI или nano. Обратите внимание, что "routes to" — это подсеть 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 — «Готов».

kubectl describe networks l3-network

Пример:

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

Создайте набор параметров сети GKENetworkParamSet.

Внутри Cloud Shell создайте сетевой объект в формате YAML l3-network-parm.yaml с помощью редактора VI или nano. Обратите внимание, что спецификация соответствует развертыванию подсети l3-vpc.

apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: "l3-network"
spec:
  vpc: "l3-vpc"
  vpcSubnet: "l3-subnet"
  podIPv4Ranges:
    rangeNames:
    - "sec-range-l3-subnet"

Внутри Cloud Shell выполните команду `apply l3-network-parm.yaml`.

kubectl apply -f l3-network-parm.yaml 

Внутри Cloud Shell убедитесь, что в параметре l3-network Status Reason указано 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.

Внутри Cloud Shell создайте контейнер busybox с именем netdevice-l3-pod.yaml, используя редактор VI или nano.

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

Внутри Cloud Shell примените файл netdevice-l3-pod.yaml.

kubectl apply -f netdevice-l3-pod.yaml

Проверка создания netdevice-l3-pod

Внутри Cloud Shell проверьте, запущен ли netdevice-l3-pod:

kubectl get pods netdevice-l3-pod

Пример:

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

Внутри 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, а eth2 — к сети сетевого устройства.

/ # 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 

Чтобы вернуться в облачную оболочку, выйдите из пода в экземпляре.

exit

12. Создайте l3-pod

В следующем разделе вы создадите под l3-pod с запущенным busybox, который можно назвать «швейцарским армейским ножом» и который поддерживает более 300 распространенных команд. Под настроен на связь с l3-vpc только через eth1.

Внутри Cloud Shell создайте контейнер busybox с именем l3-pod.yaml, используя редактор VI или nano.

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

Внутри 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-адреса, назначенные интерфейсам Pod-ов.

kubectl get pods l3-pod -o yaml

В приведенном примере поле networking.gke.io/pod-ips содержит IP-адреса, связанные с интерфейсами подов из сети l3. 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.

/ # 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)

Чтобы вернуться в облачную оболочку, выйдите из пода в экземпляре.

exit

13. Обновления брандмауэра

Для обеспечения возможности подключения из пула GKE multicnic к 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

Внутри Cloud Shell создайте правило брандмауэра в l3-vpc, разрешающее доступ sec-range-l3-subnet к экземпляру l3-apache.

gcloud compute --project=$projectid firewall-rules create allow-ingress-from-l3-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=l3-vpc --action=ALLOW --rules=all --source-ranges=10.0.8.0/21 --enable-logging

14. Проверьте подключение модуля.

В следующем разделе вы проверите подключение к экземплярам Apache из netdevice-l3-pod и l3-pod, войдя в эти модули и выполнив команду wget -S, которая подтвердит загрузку домашней страницы серверов Apache. Поскольку netdevice-l3-pod настроен с использованием интерфейсов из netdevice-network и l3-network, подключение к серверам Apache в netdevice-vpc и l3-vpc возможно.

Напротив, при выполнении команды wget -S из l3-pod подключение к серверу Apache в netdevice-vpc невозможно, поскольку l3-pod настроен только с интерфейсом из сети l3.

Получить IP-адрес сервера Apache

В консоли Cloud Console можно получить IP-адрес серверов Apache, перейдя в раздел Compute Engine → Экземпляры виртуальных машин.

fee492b4fd303859.png

тест подключения netdevice-l3-pod к netdevice-apache

Внутри Cloud Shell войдите в netdevice-l3-pod:

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

Из контейнера выполните проверку связи (ping) с экземпляром netdevice-apache, используя IP-адрес, полученный на предыдущем шаге.

ping <insert-your-ip> -c 4

Пример:

/ #  ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes
64 bytes from 172.16.10.2: seq=0 ttl=64 time=1.952 ms
64 bytes from 172.16.10.2: seq=1 ttl=64 time=0.471 ms
64 bytes from 172.16.10.2: seq=2 ttl=64 time=0.446 ms
64 bytes from 172.16.10.2: seq=3 ttl=64 time=0.505 ms

--- 172.16.10.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.446/0.843/1.952 ms
/ # 

Внутри Cloud Shell выполните команду wget -S для экземпляра netdevice-apache, используя IP-адрес, полученный на предыдущем шаге; код 200 OK означает успешную загрузку веб-страницы.

wget -S <insert-your-ip>

Пример:

/ # wget -S 172.16.10.2
Connecting to 172.16.10.2 (172.16.10.2:80)
  HTTP/1.1 200 OK
  Date: Mon, 31 Jul 2023 03:12:58 GMT
  Server: Apache/2.4.56 (Debian)
  Last-Modified: Sat, 29 Jul 2023 00:32:44 GMT
  ETag: "2c-6019555f54266"
  Accept-Ranges: bytes
  Content-Length: 44
  Connection: close
  Content-Type: text/html
  
saving to 'index.html'
index.html           100% |********************************|    44  0:00:00 ETA
'index.html' saved
/ # 

тест подключения netdevice-l3-pod к l3-apache

Внутри Cloud Shell выполните проверку связи (ping) с экземпляром l3-apache, используя IP-адрес, полученный на предыдущем шаге.

ping <insert-your-ip> -c 4

Пример:

/ # ping 172.16.20.3 -c 4
PING 172.16.20.3 (172.16.20.3): 56 data bytes
64 bytes from 172.16.20.3: seq=0 ttl=63 time=2.059 ms
64 bytes from 172.16.20.3: seq=1 ttl=63 time=0.533 ms
64 bytes from 172.16.20.3: seq=2 ttl=63 time=0.485 ms
64 bytes from 172.16.20.3: seq=3 ttl=63 time=0.462 ms

--- 172.16.20.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.462/0.884/2.059 ms
/ # 

Внутри Cloud Shell удалите предыдущий файл index.html и выполните команду wget -S для экземпляра l3-apache, используя IP-адрес, полученный на предыдущем шаге. Код 200 OK означает успешную загрузку веб-страницы.

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

Пример:

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

Чтобы вернуться в облачную оболочку, выйдите из пода в экземпляре.

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 перейдите в раздел «Журналы» → «Обозреватель журналов».

Вставьте приведенный ниже запрос в соответствии со скриншотом и выберите «Выполнить запрос»: jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")

280d00f2c5ce6109.png

Более детальный анализ перехваченных данных предоставляет администраторам безопасности информацию, начиная от исходного и целевого IP-адреса, порта, протокола и имени пула узлов.

ae4638ed9b718ac6.png

Для более подробного изучения журналов брандмауэра перейдите в раздел Сеть VPC → Брандмауэр → разрешить входящий трафик из сети сетевого устройства в любой экземпляр VPC, затем выберите «Просмотреть в обозревателе журналов».

16. Уборка

В Cloud Shell удалите компоненты учебного пособия.

gcloud compute instances delete l3-apache netdevice-apache --zone=us-central1-a --quiet

gcloud compute routers delete l3-cr netdevice-cr --region=us-central1 --quiet

gcloud container clusters delete multinic-gke --zone=us-central1-a --quiet

gcloud compute firewall-rules delete allow-ingress-from-l3-network-to-all-vpc-instances allow-ingress-from-netdevice-network-to-all-vpc-instances --quiet

gcloud compute networks subnets delete l3-apache l3-subnet netdevice-apache netdevice-subnet primary-node-subnet --region=us-central1 --quiet

gcloud compute networks delete l3-vpc netdevice-vpc primary-vpc --quiet

17. Поздравляем!

Поздравляем, вы успешно настроили и проверили создание пула узлов multinic и создание подов с запущенным busybox для проверки подключения L3 и типа устройства к серверам Apache с помощью PING и wget.

Вы также научились использовать журналы брандмауэра для анализа исходных и целевых пакетов между контейнерами Pod и серверами Apache.

Cosmopup считает, что обучающие материалы — это здорово!!

e6d3675ca7c6911f.jpeg

Дополнительная литература и видеоматериалы

Справочная документация