Рубрики
Uncategorized

Обеспечение кластера Kubernetes с Terraform

В этом посте вы узнаете, как настроить кластер Azure Kubernetes с использованием Terraform. ПРИМЕЧАНИЕ: Это ар … Tagged с DevOps, Terraform, Azure.

В этом посте вы узнаете, как настроить кластер Azure Kubernetes, используя t Erraform Анкет

ПРИМЕЧАНИЕ: Эта статья предполагает некоторые базовые знания облачных концепций и Microsoft Azure Platform

Terraform ??

Terraform — это инфраструктура в качестве инструмента кода, который позволяет разработчикам и операционным группам автоматизировать то, как они предоставляют свою инфраструктуру.

Зачем писать больше кода для моей инфраструктуры?

Если вы новичок в инфраструктуре в качестве кода, это может показаться дополнительным шагом, когда вы можете просто нажать на несколько кнопок на панели панели Cloud Provider, и оказаться в пути. Но IAC (инфраструктура как код) предлагает довольно много преимуществ.

  1. Поскольку ваша инфраструктура теперь представлена в качестве кода, она проверена
  2. Ваши среды теперь очень воспроизводимы
  3. Теперь вы можете отслеживать изменения в вашей инфраструктуре с течением времени с помощью системы управления версиями, такой как GIT
  4. Развертывания быстрее, потому что вы меньше взаимодействуете с облачным провайдером.

Перед погружением в терраформ вам нужно краткое понимание

Язык конфигурации Hashicorp (HCL).

HCl?

Да, Terraform использует свой собственный язык конфигурации, это может показаться пугающим сначала Но это довольно легко. Вот быстрый взгляд на то, как это выглядит.

resource "azurerm_resource_group" "resource-group" {
  name     = "staging-resource-group"
  location = "West Europe"
}

Ваша инфраструктура в Terraform представлена как «ресурсы», от сети до баз данных или виртуальных машин — все это ресурсы.

Это именно то, что ресурс Блок представляет. Здесь мы создаем azurerm_resource_group Как следует из названия, это ресурсная группа. Группы ресурсов — это то, как вы организуете ресурсы вместе, типичный вариант использования будет размещать все ваши серверы для единого проекта в одну и ту же группу ресурсов.

Затем мы даем блок ресурса имя, подумайте об этом как о имени переменной, которое мы можем использовать по всему файлу Terraform. В блоке ресурсов мы даем нашей группе ресурсов имя, это имя, которое будет дано нашей группе ресурсов в Azure. Наконец мы даем Место где мы хотим, чтобы группа ресурсов была развернута.

Если вы приезжаете из чего -то вроде Ansible, вы можете заметить, насколько разным подходом Terraform к конфигурации, это связано с тем, что Terraform использует то, что известно как императивный стиль конфигурации. В императивном стиле конфигурации вы объявляете состояние, в котором вы хотите свою инфраструктуру, а не в том, как вы хотите достичь этого состояния. Вы можете узнать больше о декларативной и императивной конфигурации здесь

Теперь, когда у вас есть представление о том, как выглядит конфигурация Terraform, давайте погрузитесь.

Настройка проекта

Предварительные условия:

После того, как у вас есть все эта настройка, войдите в свою учетную запись Azure через командную строку, используя следующую команду

$ az login

Следующий клон образца проекта.

$ git clone https://github.com/s1ntaxe770r/aks-terraform-demo.git

Прежде чем мы начнем, нам нужно запустить Terraform Init. Это загрузит любые плагины, от которых зависит поставщик Azure.

$ terraform init

Посмотрите на нашу структуру папок, у вас должно быть что -то подобное.

.
├── main.tf
├── modules
│   └── cluster
│       ├── cluster.tf
│       └── variables.tf
├── README.md
└── variables.tf

2 directories, 6 files

Начиная с вершины, давайте посмотрим на main.tf

#main.tf

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "2.39.0"
    }
  }
}
provider "azurerm" {
  features {}
}

module "cluster" {
  source                = "./modules/cluster"
  ssh_key               = var.ssh_key
  location              = var.location
  kubernetes_version    = var.kubernetes_version

}

Сначала мы объявляем, какой поставщик мы используем, и именно так Terraform знает, на какой облачной платформе мы намерены использовать, это может быть Google Cloud, AWS или любой другой поставщик, которого они поддерживают. Вы можете узнать больше о поставщиках Terraform Здесь Анкет Также важно отметить, что каждый блок поставщика обычно находится в документации, поэтому вам не нужно записывать это каждый раз.

Далее мы определяем модуль Заблокируйте его папку, где находится наш модуль, и несколько переменных.

Модули ??

Модули в Terraform — это способ отделить вашу конфигурацию, поэтому каждый модуль может выполнять определенную задачу. Конечно, мы могли бы просто сбросить всю нашу конфигурацию в main.tf Но это делает вещи неуклюжими и менее портативными.

Теперь давайте посмотрим на папку кластера в каталоге модулей.

modules/cluster
├── cluster.tf
└── variables.tf

0 directories, 2 files

Давайте посмотрим на cluster.tf

#modules/cluster/cluster.tf

resource "azurerm_resource_group" "aks-resource" {
    name = "kubernetes-resource-group"
    location = var.location
}

resource "azurerm_kubernetes_cluster" "aks-cluster" {
    **name = "terraform-cluster"
    location = azurerm_resource_group.aks-resource.location
    resource_group_name = azurerm_resource_group.aks-resource.name
    dns_prefix = "terrafo**rm-cluster"
    kubernetes_version = var.kubernetes_version

    default_node_pool {
      name = "default"
      node_count = 2
      vm_size = "Standard_A2_v2"
      type = "VirtualMachineScaleSets"
    }


  identity {
    type = "SystemAssigned"
  }

    linux_profile {
        admin_username = var.admin_user
        ssh_key {
            key_data = var.ssh_key
        }
    }

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

}

В первой части конфигурации мы определяем группу ресурсов для нашего кластера и умно называем ее «kubernetes-resource-group» и даем ему местоположение, которое будет поступать из переменной, которая определена в переменные.tf Анкет Следующая часть — фактические характеристики нашего кластера Kubernetes. Сначала мы говорим Terraform, что мы хотим кластера Azure Kubernetes, используя Ресурс "azurerm_kubernetes_cluster" , затем мы даем нашему кластеру имя, местоположение и группу ресурсов. Мы можем использовать местоположение группы ресурсов, которую мы определили ранее, используя ссылочное имя AKS-Resource плюс значение, которое мы хотим. В этом случае это местоположение, поэтому мы используем aks-resource.location Анкет

Есть еще два блока, которые нам нужно, чтобы обратить внимание. Первое существо default_node_pool Блок и второй linux_profile Анкет

default_node_pool Блок позволяет нам определить, сколько узлов мы хотим запустить и какие виртуальные машины мы хотим запустить на наших узлах. Важно выбирать правильный размер для своих узлов, так как это может повлиять на стоимость и производительность. Вы можете взглянуть на то, что предлагает Azure размеры виртуальной машины и их варианты использования по сравнению с Здесь Анкет node_count сообщает Terraform, сколько узлов мы хотим, чтобы наш кластер имел. Затем мы определяем виртуальную машину. Здесь я использую и Серия ВМ с 4 концертами оперативной памяти и двумя ядрами процессора. Наконец, мы даем ему тип «наборов виртуальных машин», который в основном позволяет создавать группу автоматического масштабирования виртуальных машин

Последний блок, на который мы должны посмотреть, — это linux_profile Анкет Это создает пользователя, которого мы можем использовать для SSH в один из наших узлов, если что -то пойдет не так. Здесь мы просто передаем переменные блока.

Я намеренно не проходил все блоки, потому что в большинстве случаев вам не нужно их менять, и если вы делаете документацию, довольно легко пройти.

Наконец давайте посмотрим на переменные.tf Как вы уже догадались, мы определили все переменные, на которые мы ссылались ранее.

#variables.tf

variable "location" {
    type = string
    description = "resource location"
    default = "East US"
}

variable "kubernetes_version" {
  type = string
  description = "k8's version"
  default = "1.19.6"
}

variable "admin_user"{
  type = string
  description = "username for linux_profile"
  default = "enderdragon"
}

variable "ssh_key" {
   description = "ssh_key for admin_user"
}

Чтобы определить переменную, мы используем ключевое слово переменной, даем ей имя, и внутри кудрявых скоб мы определяем, какой тип, в данном случае это строка, необязательное описание и значение по умолчанию, которое также является необязательным.

Теперь мы почти готовы создать наш кластер Но сначала нам нужно генерировать ключ SSH, если вы помните, что мы создали переменную для нее ранее. Если у вас есть пара клавиш SSH, вы можете пропустить этот шаг

$ ssh-keygen -t rsa -b 4096

Вы можете оставить все в качестве по умолчанию, нажав Enter. Затем мы экспортируем ключ в переменную среды.

$ export TF_VAR_ssh_key=$( cat ~/.ssh/id_rsa.pub)

Обратите внимание на Tf_var Префикс перед именем фактического имени переменной. Это так Terraform знает о переменной среды и может использовать ее. Вы также должны отметить, что имя переменной должно соответствовать одному в переменные.tf Анкет

Прежде чем мы на самом деле создам нашу инфраструктуру, всегда хорошая идея, чтобы увидеть, какой именно терраформ будет создавать, к счастью, у Terraform есть команда для этого

$ terraform plan

Вывод должен выглядеть примерно так

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.cluster.azurerm_kubernetes_cluster.aks-cluster will be created
  + resource "azurerm_kubernetes_cluster" "aks-cluster" {
      + dns_prefix              = "terraform-cluster"
      + fqdn                    = (known after apply)
      + id                      = (known after apply)
      + kube_admin_config       = (known after apply)
      + kube_admin_config_raw   = (sensitive value)
      + kube_config             = (known after apply)
      + kube_config_raw         = (sensitive value)
      + kubelet_identity        = (known after apply)
      + kubernetes_version      = "1.19.1"
      + location                = "eastus"
      + name                    = "terraform-cluster"
      + node_resource_group     = (known after apply)
      + private_cluster_enabled = (known after apply)
      + private_fqdn            = (known after apply)
      + private_link_enabled    = (known after apply)
      + resource_group_name     = "kubernetes-resource-group"
      + sku_tier                = "Free"

      + addon_profile {
          + aci_connector_linux {
              + enabled     = (known after apply)
              + subnet_name = (known after apply)
            }

          + azure_policy {
              + enabled = (known after apply)
            }

          + http_application_routing {
              + enabled                            = (known after apply)
              + http_application_routing_zone_name = (known after apply)
            }

          + kube_dashboard {
              + enabled = (known after apply)
            }

          + oms_agent {
              + enabled                    = (known after apply)
              + log_analytics_workspace_id = (known after apply)
              + oms_agent_identity         = (known after apply)
            }
        }

      + auto_scaler_profile {
          + balance_similar_node_groups      = (known after apply)
          + max_graceful_termination_sec     = (known after apply)
          + scale_down_delay_after_add       = (known after apply)
          + scale_down_delay_after_delete    = (known after apply)
          + scale_down_delay_after_failure   = (known after apply)
          + scale_down_unneeded              = (known after apply)
          + scale_down_unready               = (known after apply)
          + scale_down_utilization_threshold = (known after apply)
          + scan_interval                    = (known after apply)
        }

      + default_node_pool {
          + max_pods             = (known after apply)
          + name                 = "default"
          + node_count           = 2
          + orchestrator_version = (known after apply)
          + os_disk_size_gb      = (known after apply)
          + os_disk_type         = "Managed"
          + type                 = "VirtualMachineScaleSets"
          + vm_size              = "Standard_A2_v2"
        }

      + identity {
          + principal_id = (known after apply)
          + tenant_id    = (known after apply)
          + type         = "SystemAssigned"
        }

      + linux_profile {
          + admin_username = "enderdragon"

          + ssh_key {
              + key_data = "jsdksdnjcdkcdomocadcadpadmoOSNSINCDOICECDCWCdacwdcwcwccdscdfvevtbrbrtbevF
CDSCSASACDCDACDCDCdsdsacdq$q@#qfesad== you@probablyyourdesktop"
            }
        }

      + network_profile {
          + dns_service_ip     = (known after apply)
          + docker_bridge_cidr = (known after apply)
          + load_balancer_sku  = "Standard"
          + network_plugin     = "kubenet"
          + network_policy     = (known after apply)
          + outbound_type      = "loadBalancer"
          + pod_cidr           = (known after apply)
          + service_cidr       = (known after apply)

          + load_balancer_profile {
              + effective_outbound_ips    = (known after apply)
              + idle_timeout_in_minutes   = (known after apply)
              + managed_outbound_ip_count = (known after apply)
              + outbound_ip_address_ids   = (known after apply)
              + outbound_ip_prefix_ids    = (known after apply)
              + outbound_ports_allocated  = (known after apply)
            }
        }

      + role_based_access_control {
          + enabled = (known after apply)

          + azure_active_directory {
              + admin_group_object_ids = (known after apply)
              + client_app_id          = (known after apply)
              + managed                = (known after apply)
              + server_app_id          = (known after apply)
              + server_app_secret      = (sensitive value)
              + tenant_id              = (known after apply)
            }
        }

      + windows_profile {
          + admin_password = (sensitive value)
          + admin_username = (known after apply)
        }
    }

  # module.cluster.azurerm_resource_group.aks-resource will be created
  + resource "azurerm_resource_group" "aks-resource" {
      + id       = (known after apply)
      + location = "eastus"
      + name     = "kubernetes-resource-group"
    }

Plan: 2 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Если все выглядит хорошо, мы можем применить нашу конфигурацию, используя:

$ terraform apply

Terraform побуждает вас в последний раз, чтобы убедиться, что вы хотите продолжить введите «Да» и посмотрите, как происходит волшебство. После того, как ресурсы были подготовлены к вашей панели приборной панели Azure. Вы должны увидеть что -то вроде этого:

Как видите, Terraform настроил все необходимое, чтобы развернуть кластер, и нам не нужно было все указывать. Нажмите на кластер Terraform и давайте убедитесь, что все выглядит хорошо.

И там у вас есть это, мы развернули кластер Kubernetes с нашими желаемыми спецификациями, и Terraform все сделали тяжелую работу.

Как только вы закончите, это так же просто, как бежать Terraform Drouss Чтобы снести все ресурсы, которые вы только что предоставили.

Быстрый резюме

Вы узнали:

  • Почему важна инфраструктура как кода, важна
  • Основы HCL (язык конфигурации Hashicorp)
  • Как обеспечить кластер Kubernetes с Terraform

Если вам интересно, куда идти отсюда. Вот некоторые вещи, которые вы можете попробовать.

  • Здесь мы аутентифицировались через Azure CLI, но это не совсем идеально. Вместо этого вы можете использовать директор службы с более упорядоченными разрешениями. Проверьте это над здесь
  • Вы никогда не должны хранить свой файл состояния в управлении версиями, так как это может содержать конфиденциальную информацию. Вместо этого вы можете поместить это в Azure Blob Store Анкет
  • Есть лучшие способы передать переменные Terraform, которые я здесь не охватывал, но это Сообщение на веб -сайте Terraform должно пройти через это.
  • Окончательно. Эта статья не может охватить все, что есть для Terraform, поэтому я настоятельно рекомендую взглянуть на Terraform Документация, она имеет некоторую конфигурацию шаблона, чтобы начать предоставлять ресурсы.

Все образцы кода, используемые в этом уроке, можно найти здесь

Оригинал: «https://dev.to/s1ntaxe770r/provisioning-an-azure-kubernetes-cluster-with-terraform-171o»