Я использую частный кластер GKE и хочу добавить шлюз NAT, чтобы я мог создавать правила брандмауэра из запросов, поступающих из кластера (по умолчанию общедоступные IP-адреса для всех узлов являются эфемерными, поэтому их трудно отслеживать).
Я пытаюсь следовать описанным инструкциям Вот, и Вот (чтобы создать высокодоступный NAT, вариант первой ссылки).
Я могу установить terraform
, Создайте terraform.tfvars
в моем рабочем каталоге и запустите terraform init
. Когда я бегу terraform plan
, Я получаю много ошибок, например:
Error: Unsupported attribute
on ../../main.tf line 51, in module "nat-gateway":
51: module_enabled = "${var.module_enabled}"
An attribute named "module_enabled" is not expected here.
Error: Unsupported attribute
on ../../main.tf line 52, in module "nat-gateway":
52: project = "${var.project}"
An attribute named "project" is not expected here.
Error: Unsupported attribute
on ../../main.tf line 53, in module "nat-gateway":
53: region = "${var.region}"
An attribute named "region" is not expected here.
Error: Unsupported attribute
on ../../main.tf line 54, in module "nat-gateway":
54: zone = "${local.zone}"
An attribute named "zone" is not expected here.
...
Я получаю сообщение об ошибке почти при каждом вводе в этот модуль (Это то, что ../../main.tf
указывает на).
module "nat-gateway" {
source = "GoogleCloudPlatform/managed-instance-group/google"
version = "1.1.14"
module_enabled = "${var.module_enabled}"
project = "${var.project}"
region = "${var.region}"
zone = "${local.zone}"
network = "${var.network}"
subnetwork = "${var.subnetwork}"
target_tags = ["${local.instance_tags}"]
instance_labels = "${var.instance_labels}"
service_account_email = "${var.service_account_email}"
machine_type = "${var.machine_type}"
name = "${local.name}"
compute_image = "${var.compute_image}"
size = 1
network_ip = "${var.ip}"
can_ip_forward = "true"
service_port = "80"
service_port_name = "http"
startup_script = "${data.template_file.nat-startup-script.rendered}"
wait_for_instances = true
metadata = "${var.metadata}"
ssh_fw_rule = "${var.ssh_fw_rule}"
ssh_source_ranges = "${var.ssh_source_ranges}"
http_health_check = "${var.autohealing_enabled}"
update_strategy = "ROLLING_UPDATE"
rolling_update_policy = [
{
type = "PROACTIVE"
minimal_action = "REPLACE"
max_surge_fixed = 0
max_unavailable_fixed = 1
min_ready_sec = 30
},
]
access_config = [
{
nat_ip = "${element(concat(google_compute_address.default.*.address, data.google_compute_address.default.*.address, list("")), 0)}"
},
]
}
Я также заметил, что ошибки, которые я получаю, - это поля, которые объявлены Вот но нет Вот, так что похоже, что это какое-то несовпадение версии.
Я пытался изменить этот строку, как показано ниже, чтобы получить последнюю версию из github вместо реестра terraform, но это не решило проблему.
// before:
module "nat-gateway" {
source = "GoogleCloudPlatform/managed-instance-group/google"
version = "1.1.14"
// after:
module "nat-gateway" {
source = "github.com/GoogleCloudPlatform/terraform-google-managed-instance-group"
Мой рабочий каталог examples/gke-ha-nat-gateway/
, если это важно. Вся среда такая же, как только что клонированная с github, за исключением terraform.tfvars
.
К сожалению, у меня нет опыта работы с Terraform, поэтому я действительно не знаю, как отлаживать эти ошибки.
Спасибо за помощь!
Поскольку вы используете GCP, вы можете рассмотреть Облачный NAT конфигурации, а не создание собственного шлюза NAT.
Похоже, что адреса 'fda3: e722: ac3 :: / 48' используются, когда виртуальные машины обращаются к службам, размещенным в Google. Если вы обращаетесь к любой службе за пределами Google, он увидит ваши IP-адреса NAT. Что касается того, что исходный IP-адрес является случайным IPv6 (когда узлы подключаются к сайту) вместо созданного статического IPv4, вы можете добавить 'fda3: e722: ac3: 10: 30: dXXX: aXX: 0/96' в правила брандмауэра.