簡體   English   中英

Terraform 和 OpenStack - 零停機時間變化

[英]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。

TF計划: https://pastebin.com/ECfWYYX3

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM