В этом посте вы узнаете, как настроить кластер Azure Kubernetes, используя t Erraform Анкет
ПРИМЕЧАНИЕ: Эта статья предполагает некоторые базовые знания облачных концепций и Microsoft Azure Platform
Terraform ??
Terraform — это инфраструктура в качестве инструмента кода, который позволяет разработчикам и операционным группам автоматизировать то, как они предоставляют свою инфраструктуру.
Зачем писать больше кода для моей инфраструктуры?
Если вы новичок в инфраструктуре в качестве кода, это может показаться дополнительным шагом, когда вы можете просто нажать на несколько кнопок на панели панели Cloud Provider, и оказаться в пути. Но IAC (инфраструктура как код) предлагает довольно много преимуществ.
- Поскольку ваша инфраструктура теперь представлена в качестве кода, она проверена
- Ваши среды теперь очень воспроизводимы
- Теперь вы можете отслеживать изменения в вашей инфраструктуре с течением времени с помощью системы управления версиями, такой как GIT
- Развертывания быстрее, потому что вы меньше взаимодействуете с облачным провайдером.
Перед погружением в терраформ вам нужно краткое понимание
Язык конфигурации 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 Account
- Git
- Azure Кли
- 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»