Как сохранить несколько сетевых интерфейсов при перезагрузках на Google Cloud Platform? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь настроить экземпляр виртуальной машины Compute Engine на Google Cloud Platform (включена бесплатная пробная версия и биллинг) с несколькими (более 2) сетевыми интерфейсами, которые могут подключаться к Интернету даже после перезагрузки. Все, что я пробовал до сих пор, не удается после перезагрузки.

Сначала я создаю несколько сетей:

gcloud compute networks create vpc-1 --subnet-mode custom && gcloud compute firewall-rules create vpc-1-firewall --network vpc-1 --allow tcp:22,tcp:80,tcp:443,icmp && gcloud compute networks subnets create vpc-1-subnet --network vpc-1 --range 10.0.1.0/24 --region us-east4

gcloud compute networks create vpc-2 --subnet-mode custom && gcloud compute firewall-rules create vpc-2-firewall --network vpc-2 --allow tcp:22,tcp:80,tcp:443,icmp && gcloud compute networks subnets create vpc-2-subnet --network vpc-2 --range 10.0.2.0/24 --region us-east4

gcloud compute networks create vpc-3 --subnet-mode custom && gcloud compute firewall-rules create vpc-3-firewall --network vpc-3 --allow tcp:22,tcp:80,tcp:443,icmp && gcloud compute networks subnets create vpc-3-subnet --network vpc-3 --range 10.0.3.0/24 --region us-east4

gcloud compute networks create vpc-4 --subnet-mode custom && gcloud compute firewall-rules create vpc-4-firewall --network vpc-4 --allow tcp:22,tcp:80,tcp:443,icmp && gcloud compute networks subnets create vpc-4-subnet --network vpc-4 --range 10.0.4.0/24 --region us-east4

Затем я создаю экземпляр виртуальной машины с этими сетями:

gcloud compute instances create test-1 --boot-disk-device-name=test-1 --image=ubuntu-1804-bionic-v20190628 --image-project=ubuntu-os-cloud --boot-disk-size=10GB --boot-disk-type=pd-ssd --zone=us-east4-c --machine-type=n1-standard-16 --network-interface subnet=vpc-1-subnet --network-interface subnet=vpc-2-subnet --network-interface subnet=vpc-3-subnet --network-interface subnet=vpc-4-subnet --network-tier=PREMIUM --min-cpu-platform='Intel Skylake'

Пока это работает просто отлично. Когда я SSH подключаюсь к экземпляру виртуальной машины, я могу отправлять запросы на веб-сайты с первым интерфейсом (в моем случае ens4). Тем не менее, другие интерфейсы не работают, даже если они существуют и UP через ip link show. Затем я следую инструкциям на https://cloud.google.com/vpc/docs/create-use-multiple-interfaces#configuring_policy_routing для ens5, ens6 и ens7 со следующим сценарием bash в качестве пользователя root с соответствующими IP-адресами:

ifconfig ens5 10.0.2.6 netmask 255.255.255.255 broadcast 10.0.2.6 mtu 1460
echo "1 rt1" | tee -a /etc/iproute2/rt_tables
ip route add 10.0.2.1 src 10.0.2.6 dev ens5 table rt1
ip route add default via 10.0.2.1 dev ens5 table rt1
ip rule add from 10.0.2.6/32 table rt1
ip rule add to 10.0.2.6/32 table rt1

ifconfig ens6 10.0.3.6 netmask 255.255.255.255 broadcast 10.0.3.6 mtu 1460
echo "2 rt2" | tee -a /etc/iproute2/rt_tables
ip route add 10.0.3.1 src 10.0.3.6 dev ens6 table rt2
ip route add default via 10.0.3.1 dev ens6 table rt2
ip rule add from 10.0.3.6/32 table rt2
ip rule add to 10.0.3.6/32 table rt2

ifconfig ens7 10.0.4.6 netmask 255.255.255.255 broadcast 10.0.4.6 mtu 1460
echo "3 rt3" | tee -a /etc/iproute2/rt_tables
ip route add 10.0.4.1 src 10.0.4.6 dev ens7 table rt3
ip route add default via 10.0.4.1 dev ens7 table rt3
ip rule add from 10.0.4.6/32 table rt3
ip rule add to 10.0.4.6/32 table rt3

Это работает! Я могу делать запросы, используя все сетевые интерфейсы (ens4, ens5, ens6 и ens7). Однако после перезагрузки все сетевые интерфейсы не могут подключаться к каким-либо веб-сайтам как до, так и после запуска вышеуказанного сценария bash (без первых двух строк каждого раздела). Если я пытаюсь запустить curl https://google.com, например, команду, которая работает до перезагрузки, я получаю следующую ошибку: curl: (6) Could not resolve host: google.com на любом интерфейсе, который я пробую. Даже если я перезагружаюсь без каких-либо изменений или запуска каких-либо сценариев, я сталкиваюсь с той же проблемой (тоже на ens4). Как я могу сохранить (и, если возможно, автоматизировать) то, что я сделал при перезагрузке?

1 Ответ

0 голосов
/ 05 июля 2019

Я воспроизвел ваш контекст, однако кажется, что команда gcloud для создания виртуальной машины не точна, по крайней мере для подсетей, определенных ранее:

- тип машины = стандарт n1-1

Не позволит вам создать виртуальную машину с более чем двумя сетевыми картами согласно Создание экземпляров с несколькими сетевыми интерфейсами .

- zone = us-central1-a

Это также приведет к ошибке.Ваши подсети были созданы в регионе us-east4.

Очевидно, что изменение команд в соответствии с созданием VPC и VM устранит это несоответствие.Ничего особенного.

Способ автоматизации создания маршрутов при развертывании / перезагрузке виртуальной машины заключается в настройке пользовательских метаданных, автоматически создавая маршруты при каждом перезапуске экземпляра, согласно Выполнение.Скрипты запуска .

Пожалуйста, следуйте пути в консоли GCP:

Compute Engine → Экземпляры виртуальной машины → Нажмите на имя экземпляра → РЕДАКТИРОВАТЬ → Пользовательские метаданные → Добавить элемент

И добавьте следующие данные:

Key=       startup-script

Value=     ip route add 10.0.2.1 src 10.0.2.6 dev ens5 table rt1

           ip route add default via 10.0.2.1 dev ens5 table rt1

           ip rule add from 10.0.2.6/32 table rt1

           ip rule add to 10.0.2.6/32 table rt1

Сделайте то же самое для всех дополнительных сетевых карт.Команда "echo" не нужна, поскольку она записывает регистр в файл "/ etc / iproute2 / rt_tables", и это постоянно.Тем не менее, изменения «ip route» изменчивы.Они исчезнут после каждой перезагрузки.Использование сценария запуска позволит вам запускать команды одновременно с началом загрузки.

...