[英]Terraform & OpenStack - Zero downtime flavor change
我正在使用openstack_compute_instance_v2
在 OpenStack 中創建實例。 存在生命周期設置create_before_destroy = true
。 如果我更改卷大小(需要替換實例),它就可以正常工作。
但。 當我進行風味更改時,可以通過使用 OpenStack 中的resize instance
選項來完成,它就是這樣做的,但不關心任何 HA。 在調整大小完成之前,集群中的所有實例將在 20-30 秒內不可用。
我怎樣才能改變這種行為?
一些設置,如 Ansible 的serial
設置,或其他一些選項會派上用場。 但我什么也找不到。 任何能讓我說“至少有一半的實例需要始終在線”的解決方案。
Terraform 版本:12.20。
Openstack Terraform 提供程序知道它可以通過使用調整大小 API 調用來更新flavor
,而不必銷毀實例並重新創建它。
不幸的是,當與create_before_destroy
生命周期自定義相結合時,當前沒有強制可變事物執行銷毀/創建或創建/銷毀的生命周期選項,因此您不能輕易強制它替換實例。
在這些情況下,一種選擇是找到一個無法就地修改的參數(這些在資源的基礎提供程序源代碼中的架構上的ForceNew
標志注意到),然后對可變參數進行更改也級聯對不可變參數的更改。
這里的一個常見示例是在啟動模板(與不可變的啟動配置相比是可變的)更改時替換 AWS 自動擴展組,這樣您就可以立即推出更改,而不是等待 ASG 隨着時間的推移慢慢替換實例。 一個簡單的示例如下所示:
variable "ami_id" {
default = "ami-123456"
}
resource "random_pet" "ami_random_name" {
keepers = {
# Generate a new pet name each time we switch to a new AMI id
ami_id = var.ami_id
}
}
resource "aws_launch_template" "example" {
name_prefix = "example-"
image_id = var.ami_id
instance_type = "t2.small"
vpc_security_group_ids = ["sg-123456"]
}
resource "aws_autoscaling_group" "example" {
name = "${aws_launch_template.example.name}-${random_pet.ami_random_name.id}"
vpc_zone_identifier = ["subnet-123456"]
min_size = 1
max_size = 3
launch_template {
id = aws_launch_template.example.id
version = "$Latest"
}
lifecycle {
create_before_destroy = true
}
}
在上面的示例中,對 AMI 的更改會觸發一個新的隨機寵物名稱,該名稱會更改作為不可變字段的 ASG 名稱,因此這會觸發替換 ASG。 因為 ASG 具有create_before_destroy
生命周期自定義,所以它將創建一個新的 ASG,等待最少數量的實例通過 EC2 健康檢查,然后銷毀舊的 ASG。
對於您的情況,您還可以在openstack_compute_instance_v2
資源上使用name
參數,因為它也是一個不可變字段。 因此,一個基本示例可能如下所示:
variable "flavor_name" {
default = "FLAVOR_1"
}
resource "random_pet" "flavor_random_name" {
keepers = {
# Generate a new pet name each time we switch to a new flavor
flavor_name = var.flavor_name
}
}
resource "openstack_compute_instance_v2" "example" {
name = "example-${random_pet.flavor_random_name}"
image_id = "ad091b52-742f-469e-8f3c-fd81cadf0743"
flavor_name = var.flavor_name
key_pair = "my_key_pair_name"
security_groups = ["default"]
metadata = {
this = "that"
}
network {
name = "my_network"
}
}
所以。 起初,我已經開始研究如何按照@ydaetskcoR 的建議使用隨機實例名稱。
Name
不是一個選項,既因為在 openstack 中它是一個可變參數,又因為我有一個無法更改的確定命名模式。
我已經開始尋找可以修改的其他參數,以強制創建而不是修改實例。 我發現了關於personality
。 https://www.terraform.io/docs/providers/openstack/r/compute_instance_v2.html#instance-with-personality
但它也沒有奏效。 主要是因為似乎不再支持個性:
從 2.57 微版本開始,不推薦使用個性文件。 使用 metadata 和 user_data 自定義服務器實例。 https://docs.openstack.org/api-ref/compute/
不確定 terraform 是否不支持,或者還有其他問題。 但我選擇了user_data
。 我已經在計算實例模塊中使用了 user_data,所以添加一些風味數據應該沒有問題。
因此,在user_data
我添加了以下內容:
user_data = "runcmd:\n - echo ${var.host["flavor"]} > /tmp/tf_flavor"
無需隨機寵物名稱,無需更改實例名稱。 只需通過在某處添加風味名稱來改變他們的“個性”。 當風味改變時,這確實會強制重新創建實例。
所以。 而不是簡單地:
# module.instance.openstack_compute_instance_v2.server[0] will be updated in-place
~ resource "openstack_compute_instance_v2" "server" {
我現在有了:
-/+ destroy and then create replacement
+/- create replacement and then destroy
Terraform will perform the following actions:
# module.instance.openstack_compute_instance_v2.server[0] must be replaced
+/- resource "openstack_compute_instance_v2" "server" {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.