Написать в техподдержку Позвонить нам
Админпанель Выход

Содержание статьи:

    Работа с Terraform в Kubernetes

    Описание

    Terraform - это локальный клиент (программа на персональном компьютере), с помощью которой можно управлять инфраструктурой в облаке как кодом (IaС). Это позволяет затрачивать меньше времени на рутинные операции и снижает риск возникновения ошибок за счет использования скриптов.

    Для того, чтобы управлять кластерами Kubernetes в облаке Mail.ru Cloud Solutions потребуется подключить одновременно OpenStack terraform provider и MCS terraform provider.

    Детальная инструкция по провайдеру MCS для Terraform доступна по этой ссылке https://mcs.mail.ru/terraform/docs

    Начало работы с terraform

    Для начала использования MCS Terrafom Provider обратитесь к следующей статье.

    Основные команды

    Также может понадобится знать некоторые основные команды и требования Terraform, прежде чем можно будет начать что-либо делать в кластере:

    terraform init: Инициализирует рабочий каталог Terraform. 

    terraform validate: Подтверждает правильность синтаксиса файла Terraform.

    terraform plan: Генерирует файл изменений и показывает, что изменится при запуске. Рекомендуем выполнить эту команду перед запуском команды apply, чтобы убедиться, что результаты будут соответствовать намерениям.

    terraform apply: Строит или изменяет инфраструктуру. Команда покажет план выполнения и потребует ответа «да» или «нет» (если не используется --auto-approve флаг, который заставит его выполняться автоматически).

    terraform refresh: Обновляет локальный файл состояния относительно реальных ресурсов. Это гарантирует, что Terraform имеет точное представление о том, что находится в текущей среде.

    terraform destroy: Удаляет и удаляет инфраструктуру, управляемую Terraform. Это приведет к безвозвратному удалению всего, что создано и сохранено в файле состояния из кластера.

    Создание и изменение ресурсов кластера

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

    Создание k8s кластера

    terraform {
      required_providers {
        mcs = "~> 0.1.0"
      }
    }
    
    variable "k8s-template-test" {
        type = string
        default = "9e7a9856-4e63-4d38-b105-65850df5eb4e"
    }
    
    variable "k8s-template" {
        type = string
        default = "95663bae-6763-4a53-9424-831975285cc1"
    }
    
    variable "public-key-file" {
        type = string
        default = "~/.ssh/id_rsa.pub"
    }
    
    variable "k8s-flavor-test" {
        type = string
        default = "Basic-1-1-10"
    }
    
    variable "k8s-flavor" {
        type = string
        default = "Basic-1-2-20"
    }
    
    resource "openstack_networking_network_v2" "k8s" {
      name           = "k8s-net"
      admin_state_up = true
    }
    
    resource "openstack_networking_subnet_v2" "k8s-subnetwork" {
      name            = "k8s-subnet"
      network_id      = openstack_networking_network_v2.k8s.id
      cidr            = "10.100.0.0/16"
      ip_version      = 4
      dns_nameservers = ["8.8.8.8", "8.8.4.4"]
    }
    
    data "openstack_networking_network_v2" "extnet" {
      name = "ext-net"
    }
    
    resource "openstack_networking_router_v2" "k8s" {
      name                = "k8s-router"
      admin_state_up      = true
      external_network_id = data.openstack_networking_network_v2.extnet.id
    }
    
    resource "openstack_networking_router_interface_v2" "k8s" {
      router_id = openstack_networking_router_v2.k8s.id
      subnet_id = openstack_networking_subnet_v2.k8s-subnetwork.id
    }
    
    resource "openstack_compute_keypair_v2" "keypair" {
      name       = "default"
      public_key = file(var.public-key-file)
    }
    
    data "openstack_compute_flavor_v2" "k8s" {
      name = var.k8s-flavor
    }
    
    data "mcs_kubernetes_clustertemplate" "ct" {
      version = 16
    }
    
    resource "mcs_kubernetes_cluster" "k8s-cluster" {
      depends_on = [
        openstack_networking_router_interface_v2.k8s,
      ]
      name = "k8s-cluster"
      cluster_template_id = data.mcs_kubernetes_clustertemplate.ct.id
      master_flavor       = data.openstack_compute_flavor_v2.k8s.id
      master_count        = 1
      keypair = openstack_compute_keypair_v2.keypair.id
      network_id = openstack_networking_network_v2.k8s.id
      subnet_id = openstack_networking_subnet_v2.k8s-subnetwork.id
    }

    Обновление k8s кластера

    terraform {
      required_providers {
        mcs = "~> 0.1.0"
      }
    }
    
    variable "k8s-template-test" {
        type = string
        default = "9e7a9856-4e63-4d38-b105-65850df5eb4e"
    }
    
    variable "k8s-template" {
        type = string
        default = "95663bae-6763-4a53-9424-831975285cc1"
    }
    
    variable "public-key-file" {
        type = string
        default = "~/.ssh/id_rsa.pub"
    }
    
    variable "k8s-flavor-test" {
        type = string
        default = "Basic-1-1-10"
    }
    
    variable "k8s-flavor" {
        type = string
        default = "Basic-1-2-20"
    }
    
    variable "k8s-network-id" {
        type = string
        default = "95663bae-6763-4a53-9424-831975285cc1"
    }
    
    variable "k8s-router-id" {
        type = string
        default = "95663bae-6763-4a53-9424-831975285cc1"
    }
    
    variable "k8s-subnetwork-id" {
        type = string
        default = "95663bae-6763-4a53-9424-831975285cc1"
    }
    
    variable "new-master-flavor" {
        type = string
        default = "d659fa16-c7fb-42cf-8a5e-9bcbe80a7538"
    }
    
    resource "openstack_networking_network_v2" "k8s" {
      name           = "k8s-net"
      admin_state_up = true
    }
    
    resource "openstack_networking_subnet_v2" "k8s-subnetwork" {
      name            = "k8s-subnet"
      network_id      = var.k8s-network-id
      cidr            = "10.100.0.0/16"
      ip_version      = 4
      dns_nameservers = ["8.8.8.8", "8.8.4.4"]
    }
    
    data "openstack_networking_network_v2" "extnet" {
      name = "ext-net"
    }
    
    resource "openstack_networking_router_v2" "k8s" {
      name                = "k8s-router"
      admin_state_up      = true
      external_network_id = data.openstack_networking_network_v2.extnet.id
    }
    
    resource "openstack_networking_router_interface_v2" "k8s" {
      router_id = var.k8s-router-id
      subnet_id = var.k8s-subnet-id
    }
    
    resource "openstack_compute_keypair_v2" "keypair" {
      name       = "default"
      public_key = file(var.public-key-file)
    }
    
    data "openstack_compute_flavor_v2" "k8s" {
      name = var.k8s-flavor
    }
    
    data "mcs_kubernetes_clustertemplate" "ct" {
      version = 16
    }
    
    resource "mcs_kubernetes_cluster" "k8s-cluster" {
      master_flavor = vars.new-master-flavor
      name = "k8s-cluster"
      cluster_template_id = data.mcs_kubernetes_clustertemplate.ct.id
      master_flavor       = data.openstack_compute_flavor_v2.k8s.id
      master_count        = 1
      keypair = openstack_compute_keypair_v2.keypair.id
      network_id = openstack_networking_network_v2.k8s.id
      subnet_id = openstack_networking_subnet_v2.k8s-subnetwork.id
    }

    Добавление nodegroup в существующий k8s кластер

    terraform {
      required_providers {
        mcs = "~> 0.1.0"
      }
    }
    
    data "mcs_kubernetes_cluster" "your_cluster" {
      uuid = "your_cluster_uuid"
    }
    
    resource "mcs_kubernetes_node_group" "default_ng" {
      cluster_id = data.mcs_kubernetes_cluster.your_cluster.id
      node_count = 1
      name = "default"
      max_nodes = 5
      min_nodes = 1
    }

    Cоздание, изменение и удаление группы узлов k8s кластера

    Пример использования

    resource "mcs_kubernetes_node_group" "mynodegroup" {
        cluster_id = your_cluster_id
        name = my_new_node_group
    }

    Поддерживаются следующие аргументы:

    cluster_id - (Обязательно) UUID существующего кластера.

    name - (Необязательно) Имя создаваемой группы узлов. Если ничего не указано, будет сгенерировано случайное имя.

    flavor_id - (Необязательно) Тип этой группы узлов. Изменение этого заставит создать новую группу узлов.

    node_count - (Обязательно) Количество узлов для этой группы узлов. Должно быть больше 0. Если autoscaling_enabledпараметр установлен, этот атрибут будет проигнорирован во время обновления.

    max_nodes - (Необязательно) Максимально разрешенные узлы для этой группы узлов.

    min_nodes - (Необязательно) Минимально допустимые узлы для этой группы узлов. По умолчанию 0, если не установлено.

    volume_size - (Необязательно) Размер тома, из которого загружаются узлы, в ГБ. Изменение этого заставит создать новую группу узлов.

    volume_type - (Необязательно) Тип тома, из которого загружаются узлы. Изменение этого заставит создать новую группу узлов.

    autoscaling_enabled - (Необязательно) Определяет, включено ли автомасштабирование.

    labels - (Необязательно) Список пар ключ-значение, представляющих дополнительные свойства группы узлов.

    taints - (Необязательно) Список объектов, представляющих группы узлов с ограничениями (taints). Каждый объект должен иметь следующие атрибуты: ключ, значение, эффект.

    Атрибуты

    id должен соответствовать идентификатору найденного шаблона кластера. Кроме того, экспортируются следующие атрибуты:

    name - Имя группы узлов.

    cluster_id - UUID кластера, которому принадлежит группа узлов.

    node_count - Количество узлов в группе узлов.

    max_nodes - Максимальное количество узлов в группе узлов.

    min_nodes - Минимальное количество узлов в группе узлов.

    availability_zones - Список зон доступности.

    volume_size - Размер тома, из которого загружаются узлы, в ГБ.

    volume_type - Тип тома, из которого загружаются узлы.

    flavor_id - Идентификатор аромата.

    autoscaling_enabled - Определяет, включено ли автомасштабирование.

    uuid - UUID группы узлов кластера.

    state - Определяет текущее состояние группы узлов (РАБОТАЕТ, ВЫКЛЮЧЕНИЕ, ОШИБКА).

    nodes - Список объектов группы узлов.

    labels - Список пар ключ-значение, представляющих дополнительные свойства группы узлов.

    taints - Список объектов, представляющих группы узлов с ограничениями (taints) .

    Импорт

    Группы узлов можно импортировать с помощью id, например:

    $ terraform import mcs_kubernetes_node_group.ng ng_uuid



    Полезна ли была эта статья?