Применение Terraform, как увеличить счетчик и добавить рабочие узлы Kubernetes к существующим рабочим?
Я развернул кластер k8s на голом железе, используя terraform, следуя этому репозиторию на github
Теперь у меня три узла:
ewr1-контроллер, ewr1-worker-0, ewr1-worker-1
Затем я хотел бы запустить terraform apply и увеличить рабочие узлы (*ewr1-worker-3, ewr1-worker-4... *), сохранив существующие контроллер и рабочие узлы. Я попытался увеличить count.index, чтобы начать с 3, однако он по-прежнему перезаписывает существующие рабочие.
resource "packet_device" "k8s_workers" {
project_id = "${packet_project.kubenet.id}"
facilities = "${var.facilities}"
count = "${var.worker_count}"
plan = "${var.worker_plan}"
operating_system = "ubuntu_16_04"
hostname = "${format("%s-%s-%d", "${var.facilities[0]}", "worker", count.index+3)}"
billing_cycle = "hourly"
tags = ["kubernetes", "k8s", "worker"]
}
Я не пробовал, но если попробую
terraform state rm 'packet_device.k8s_workers'
Я предполагаю, что эти рабочие узлы не будут управляться мастером kubernetes. Я не хочу создавать все узлы вначале, потому что рабочие узлы, которые я добавляю, будут иметь разные спецификации (типы экземпляров).
Весь скрипт, который я использовал, доступен здесь, в этом репозитории на github. Я признателен, если бы кто-нибудь мог сказать, чего мне здесь не хватает и как этого добиться.
Спасибо!
2 ответа
Я решил эту проблему, изменив и удалив модули, ресурсы из terraform.state: вручную изменив его и используя состояние terraform rm <--->.
Оставив ( удалить состояние) раздел, который я хочу оставить как есть.
Изменение разделов в terraform.state, которые я хочу изменить при добавлении новых серверов.
Увеличение счетчика для добавления новых ресурсов, см. Интерполяция терраформ.
Я использую облачный провайдер для развертывания k8s, и он не поддерживает автоматические вызовы k8s HA или VA. Это может быть неоптимальным решением, как указывали другие, но если это не то, что вам нужно делать довольно часто, terraform может выполнить эту работу, хотя и трудно.
Изменение размера узла лучше всего решать с помощью автомасштабирования. Использование Terraform для масштабирования пула узлов может быть не оптимальным подходом, поскольку инструмент предназначен для объявления состояния системы, а не для его динамического изменения. Лучшим подходом для этого является использование облачного автоматического масштабирования. В "голом металле" можно реализоватьCloudProvider interface
(например, облачный, такой как AWS, GCP, Azure), как описано здесь
После реализации этого вам необходимо определить, может ли ваша реализация K8s использоваться Terraform в качестве провайдера, и если это так, найдите пул узлов.autoscaler
ресурс, который позволяет autoscaling
.
Подводя итог, Terraform не предназначен для использования в качестве autoscaler
учитывая его природу декларативного языка, описывающего инфраструктуру.
Функции автомасштабирования в K8s предназначены для решения такого рода требований.