Как разместить развертывание разных aks в одной группе ресурсов / кластере?

#azure #kubernetes #terraform #terraform-provider-azure

#azure #kubernetes #terraform #terraform-provider-azure

Вопрос:

Текущее состояние: у меня есть все службы в кластере и только в одной resource_group. Моя проблема в том, что мне приходится каждый раз запускать все службы, и мое развертывание становится медленным.

Что я хочу сделать: я хочу разделить каждую службу в моем каталоге, чтобы я мог развернуть ее отдельно. Теперь у меня есть серверная часть для каждой службы, так что у нее может быть свое собственное удаленное состояние, и при развертывании ничего не изменится. Однако могу ли я по-прежнему использовать все службы в одной и той же resource_group? Если да, то как я могу этого добиться? Если мне нужно создать группу ресурсов для каждой службы, которую я хочу развернуть отдельно, могу ли я по-прежнему использовать тот же кластер?

main.tf

 provider "azurerm" {
  version = "2.23.0"
  features {}
}

resource "azurerm_resource_group" "main" {
  name     = "${var.resource_group_name}-${var.environment}"
  location = var.location

  timeouts {
    create = "20m"
    delete = "20m"
  }
}
resource "tls_private_key" "key" {
  algorithm = "RSA"
}

resource "azurerm_kubernetes_cluster" "main" {

  name                            = "${var.cluster_name}-${var.environment}"
  location                        = azurerm_resource_group.main.location
  resource_group_name             = azurerm_resource_group.main.name
  dns_prefix                      = "${var.dns_prefix}-${var.environment}"
  node_resource_group             = "${var.resource_group_name}-${var.environment}-worker"
  kubernetes_version = "1.18.6"

  linux_profile {
    admin_username = var.admin_username

    ssh_key {
      key_data = "${trimspace(tls_private_key.key.public_key_openssh)} ${var.admin_username}@azure.com"
    }
  }

  default_node_pool {
    name            = "default"
    node_count      = var.agent_count
    vm_size         = "Standard_B2s"
    os_disk_size_gb = 30
  }

  role_based_access_control {
    enabled = "false"
  }

  addon_profile {
    kube_dashboard {
      enabled = "true"
    }
  }

  network_profile {
    network_plugin    = "kubenet"
    load_balancer_sku = "Standard"
  }

  timeouts {
    create = "40m"
    delete = "40m"
  }

  service_principal {
    client_id     = var.client_id
    client_secret = var.client_secret
  }

  tags = {
    Environment = "Production"
  }
}

provider "kubernetes" {
  version          = "1.12.0"
  load_config_file = "false"

  host = azurerm_kubernetes_cluster.main.kube_config[0].host

  client_certificate = base64decode(
    azurerm_kubernetes_cluster.main.kube_config[0].client_certificate,
  )

  client_key = base64decode(azurerm_kubernetes_cluster.main.kube_config[0].client_key)
  cluster_ca_certificate = base64decode(
    azurerm_kubernetes_cluster.main.kube_config[0].cluster_ca_certificate,
  )
}
  

backend.tf (для основного)

 terraform {
  backend "azurerm" {}
}
  

client.tf (служба, которую я хочу развернуть отдельно)

 resource "kubernetes_deployment" "client" {
  metadata {
    name = "client"

    labels = {
      serviceName = "client"
    }
  }

  timeouts {
    create = "20m"
    delete = "20m"
  }

  spec {

    progress_deadline_seconds = 600

    replicas = 1

    selector {
      match_labels = {
        serviceName = "client"
      }
    }

    template {
      metadata {
        labels = {
          serviceName = "client"
        }
      }
      }
    }
  }
}

resource "kubernetes_service" "client" {
  metadata {
    name = "client"
  }

  spec {
    selector = {
      serviceName = kubernetes_deployment.client.metadata[0].labels.serviceName
    }

    port {
      port        = 80
      target_port = 80
    }
  }
}

  

backend.tf (для клиента)

 terraform {
  backend "azurerm" {
    resource_group_name = "test-storage"
    storage_account_name = "test"
    container_name = "terraform"
    key="test"
  }
}

  

deployment.sh

 terraform -v
terraform init 
    -backend-config="resource_group_name=$TF_BACKEND_RES_GROUP" 
    -backend-config="storage_account_name=$TF_BACKEND_STORAGE_ACC" 
    -backend-config="container_name=$TF_BACKEND_CONTAINER" 

terraform plan
    
terraform apply -target="azurerm_resource_group.main" -auto-approve 
    -var "environment=$ENVIRONMENT" 
    -var "tag_version=$TAG_VERSION" 
  

PS: При необходимости я могу создать тестовую группу ресурсов с нуля. Не беспокойтесь о его текущем состоянии.

PS2: Файлы состояния сохраняются в нужном месте, с этим проблем нет.

Ответ №1:

Если вы хотите развернуть ресурсы отдельно, вы могли бы взглянуть на terraform apply с помощью этого параметра.

   -target=resource       Resource to target. Operation will be limited to this
                         resource and its dependencies. This flag can be used
                         multiple times.
  

Например, просто разверните группу ресурсов и ее зависимости следующим образом,

 terraform apply -target="azurerm_resource_group.main"
  

Комментарии:

1. Даже если мое развертывание не завершается с ошибкой, мой клиент не обновляется. Вот результат, который я получаю: применить завершено! Ресурсы: 0 добавлено, 0 изменено, 0 уничтожено.

2. Вы просто обновляете ресурс (редактируете исходный файл terraform) вместо развертывания нового? Не могли бы вы удалить старый файл состояния, а затем развернуть эти ресурсы отдельно?

3. Я полностью удалил старую группу ресурсов. Я только что обнаружил, что при запуске terraform plan отображаются правильные обновления. Я думаю, что то, что я делаю -target=»azurerm_resource_group.main», неверно.

4. Не могли бы вы удалить свои старые файлы состояния или переименовать их и развернуть ресурсы в качестве моего ответа? Поскольку terraform apply полагается на ваш старый файл состояний. Если ресурс отображается в файле состояния, то terraform apply ничего не делает. Для короткого теста вы можете просто создать группу ресурсов с помощью виртуальной сети.

5. Как вы сказали, я удалил оба своих файла состояния, а также перестроил кластер перед запуском нового кода. У меня все та же проблема, изменения клиента не применяются к моей основной группе ресурсов / кластеру.