---
title: "Create a basic Managed Kubernetes cluster via Terraform"
sidebar_label: "Create a basic cluster"
description: "How to create a basic Managed Kubernetes cluster on a cloud server with one node group and network infrastructure"
sidebar_position: 1
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import ConfigureProviders from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/configure-providers.mdx'
import ConfigureProvidersConfig from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/configure-providers-config.mdx'
import CreateRouter from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-networks/create-router.mdx'
import CreateNetworks from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/managed-kubernetes/create-networks.mdx'
import CreateResourcesAlert from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/create-resources-alert.mdx'
import {TabItemLabel} from '@selectel/docux/components'

# Create a basic Managed Kubernetes cluster via Terraform

<CreateResourcesAlert />

<br />

1. Optional: [configure providers](#configure-providers).
2. [Create a private network and subnet](#create-networks).
3. [Create a cloud router connected to the internet](#create-router).
4. [Create a basic cluster](#create-basic-cluster).
5. [Create a node group with a network volume](#create-node-group).

## Configuration files \{#config}

<details>
  <summary>Example file for configuring providers</summary>

  <ConfigureProvidersConfig />
</details>

<details>
  <summary>Example file for a basic cluster with nodes of custom configuration</summary>

  ```hcl
  resource "openstack_networking_network_v2" "network_1" {
    name           = "private-network"
    admin_state_up = "true"
  }

  resource "openstack_networking_subnet_v2" "subnet_1" {
    network_id = openstack_networking_network_v2.network_1.id
    cidr       = "192.168.199.0/24"
  }

  data "openstack_networking_network_v2" "external_network_1" {
    external = true
  }

  resource "openstack_networking_router_v2" "router_1" {
    name                = "router"
    external_network_id = data.openstack_networking_network_v2.external_network_1.id
  }

  resource "openstack_networking_router_interface_v2" "router_interface_1" {
    router_id = openstack_networking_router_v2.router_1.id
    subnet_id = openstack_networking_subnet_v2.subnet_1.id
  }

  data "selectel_mks_kube_versions_v1" "versions" {
    project_id = selectel_vpc_project_v2.project_1.id
    region     = "ru-9"
  }

  resource "selectel_mks_cluster_v1" "cluster_1" {
    name                              = "basic-cluster"
    project_id                        = selectel_vpc_project_v2.project_1.id
    region                            = "ru-9"
    kube_version                      = data.selectel_mks_kube_versions_v1.versions.latest_version
    zonal                             = true
    enable_patch_version_auto_upgrade = false
    network_id                        = openstack_networking_network_v2.network_1.id
    subnet_id                         = openstack_networking_subnet_v2.subnet_1.id
    maintenance_window_start          = "00:00:00"
  }

  resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
    cluster_id                   = selectel_mks_cluster_v1.cluster_1.id
    project_id                   = selectel_mks_cluster_v1.cluster_1.project_id
    region                       = selectel_mks_cluster_v1.cluster_1.region
    availability_zone            = "ru-9a"
    nodes_count                  = "2"
    cpus                         = 2
    ram_mb                       = 4096
    volume_gb                    = 32
    volume_type                  = "fast.ru-9a"
    install_nvidia_device_plugin = false
    labels                       = {
      "label-key0": "label-value0",
      "label-key1": "label-value1",
      "label-key2": "label-value2",
    }
  }
  ```
</details>

<details>
  <summary>Example file for a basic cluster with nodes of fixed configuration (flavors)</summary>

  ```hcl
  resource "openstack_networking_network_v2" "network_1" {
    name           = "private-network"
    admin_state_up = "true"
  }

  resource "openstack_networking_subnet_v2" "subnet_1" {
    network_id = openstack_networking_network_v2.network_1.id
    cidr       = "192.168.199.0/24"
  }

  data "openstack_networking_network_v2" "external_network_1" {
    external = true
  }

  resource "openstack_networking_router_v2" "router_1" {
    name                = "router"
    external_network_id = data.openstack_networking_network_v2.external_network_1.id
  }

  resource "openstack_networking_router_interface_v2" "router_interface_1" {
    router_id = openstack_networking_router_v2.router_1.id
    subnet_id = openstack_networking_subnet_v2.subnet_1.id
  }

  data "selectel_mks_kube_versions_v1" "versions" {
    project_id = selectel_vpc_project_v2.project_1.id
    region     = "ru-9"
  }

  resource "selectel_mks_cluster_v1" "cluster_1" {
    name                              = "basic-cluster"
    project_id                        = selectel_vpc_project_v2.project_1.id
    region                            = "ru-9"
    kube_version                      = data.selectel_mks_kube_versions_v1.versions.latest_version
    zonal                             = true
    enable_patch_version_auto_upgrade = false
    network_id                        = openstack_networking_network_v2.network_1.id
    subnet_id                         = openstack_networking_subnet_v2.subnet_1.id
    maintenance_window_start          = "00:00:00"
  }

  resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
    cluster_id                   = selectel_mks_cluster_v1.cluster_1.id
    project_id                   = selectel_mks_cluster_v1.cluster_1.project_id
    region                       = selectel_mks_cluster_v1.cluster_1.region
    availability_zone            = "ru-9a"
    nodes_count                  = "2"
    flavor_id                    = "1013"
    volume_gb                    = 32
    volume_type                  = "fast.ru-9a"
    install_nvidia_device_plugin = false
    labels                       = {
      "label-key0": "label-value0",
      "label-key1": "label-value1",
      "label-key2": "label-value2",
    }
  }
  ```
</details>

## 1. Optional: configure providers \{#configure-providers}

If you have [configured the Selectel and OpenStack providers](/terraform/configure-terraform-environment/#configure-providers), skip this step.

<ConfigureProviders />

## 2. Create a private network and subnet \{#create-networks}

<CreateNetworks />

## 3. Create a cloud router connected to the internet \{#create-router}

<CreateRouter />

## 4. Create a basic cluster \{#create-basic-cluster}

```hcl
data "selectel_mks_kube_versions_v1" "versions" {
  project_id = selectel_vpc_project_v2.project_1.id
  region     = "ru-9"
}

resource "selectel_mks_cluster_v1" "cluster_1" {
  name                              = "basic-cluster"
  project_id                        = selectel_vpc_project_v2.project_1.id
  region                            = "ru-9"
  kube_version                      = data.selectel_mks_kube_versions_v1.versions.latest_version
  zonal                             = true
  enable_patch_version_auto_upgrade = false
  network_id                        = openstack_networking_network_v2.network_1.id
  subnet_id                         = openstack_networking_subnet_v2.subnet_1.id
  maintenance_window_start          = "00:00:00"
}

```

Where:

* `name` — cluster name, maximum 32 characters — Latin letters, numbers, and hyphens;

* `region` — [pool](/infrastructure/locations/#pool), in which the cluster will be created, for example, `ru-9`. The list of available pools can be viewed in the [Availability Matrix](/infrastructure/product-availability-by-location/).

See the detailed description of the [selectel\_mks\_cluster\_v1](/terraform/selectel-provider-reference/resources/mks_cluster_v1/) resource.

## 5. Create a node group with a network volume \{#create-node-group}

<Tabs queryString="create-node-group">
  <TabItem value="flavors" default>
    <TabItemLabel>
      Fixed configuration
    </TabItemLabel>

    ```hcl
    resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
      cluster_id                   = selectel_mks_cluster_v1.cluster_1.id
      project_id                   = selectel_mks_cluster_v1.cluster_1.project_id
      region                       = selectel_mks_cluster_v1.cluster_1.region
      availability_zone            = "ru-9a"
      nodes_count                  = "2"
      flavor_id                    = "1013"
      volume_gb                    = 32
      volume_type                  = "fast.ru-9a"
      install_nvidia_device_plugin = false
      labels                       = {
        "label-key0": "label-value0",
        "label-key1": "label-value1",
        "label-key2": "label-value2",
      }
    }
    ```

    Where:

    * `availability_zone` — [pool segment](/infrastructure/locations/#pool) where the node group will be located, for example, `ru-9a`;

    * `nodes_count` — number of worker nodes in the node group. The maximum number of nodes is 15;

    * `flavor_id` — flavor ID. Flavors correspond to [cloud server configurations](/cloud-servers/create/configurations/) and determine the number of vCPU, RAM, and the size of the local disk (optional) of the node. For example, `3031` — flavor for creating a node with the GPU Line configuration with 4 vCPU, 32 GB RAM. You can [view the list of flavors in a specific pool in OpenStack CLI](/managed-kubernetes/node-groups/create-node-group/#view-flavors-pool-list);

    * `volume_gb` — disk size in GB. If the disk size is specified in the configuration you chose in the `flavor_id` argument, then the `volume_gb` argument does not need to be specified. The limits for available values can be found in the [Comparing node configurations on a cloud server](/managed-kubernetes/node-groups/configurations/#comparing-node-configurations) table;

    * `volume_type` — disk type in the `<type>.<pool_segment>` format, for example, `basic.ru-9a`:

      * `<type>` — `basic`, `universal`, or `fast`;
      * `<pool_segment>` — [pool segment](/infrastructure/locations/#pool) where the network volume will be created, for example, `ru-9a`;

    * `install_nvidia_device_plugin` — confirms or cancels the installation of GPU drivers and NVIDIA® Device Plugin:

      * `true` — for flavors with GPU, confirms the installation of GPU drivers and NVIDIA® Device Plugin;
      * `false` — for flavors with and without GPU, disables the installation of GPU drivers and NVIDIA® Device Plugin. You can [install drivers for GPU node groups manually](/managed-kubernetes/node-groups/gpu-drivers/#install-gpu-drivers).

    See the detailed description of the [selectel\_mks\_nodegroup\_v1](/terraform/selectel-provider-reference/resources/mks_nodegroup_v1/) resource.
  </TabItem>

  <TabItem value="custom">
    <TabItemLabel>
      Custom configuration
    </TabItemLabel>

    ```hcl
    resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
      cluster_id                   = selectel_mks_cluster_v1.cluster_1.id
      project_id                   = selectel_mks_cluster_v1.cluster_1.project_id
      region                       = selectel_mks_cluster_v1.cluster_1.region
      availability_zone            = "ru-9a"
      nodes_count                  = "2"
      cpus                         = 2
      ram_mb                       = 4096
      volume_gb                    = 32
      volume_type                  = "fast.ru-9a"
      install_nvidia_device_plugin = false
      labels                       = {
        "label-key0": "label-value0",
        "label-key1": "label-value1",
        "label-key2": "label-value2",
      }
    }
    ```

    Where:

    * `availability_zone` — [pool segment](/infrastructure/locations/#pool) where the node group will be located, for example, `ru-9a`;

    * `nodes_count` — number of worker nodes in the node group. The maximum number of nodes is 15;

    * `cpus` — number of vCPU per node;

    * `ram_mb` — amount of RAM per node in MB;

    * `volume_gb` — disk size in GB;

    * `volume_type` — disk type in the `<type>.<pool_segment>` format, for example, `basic.ru-9a`:

      * `<type>` — `basic`, `universal`, or `fast`;
      * `<pool_segment>` — [pool segment](/infrastructure/locations/#pool) where the network volume will be created, for example, `ru-9a`;

    * `install_nvidia_device_plugin` — confirms or cancels the installation of GPU drivers and NVIDIA® Device Plugin:

      * `true` — for flavors with GPU, confirms the installation of GPU drivers and NVIDIA® Device Plugin;
      * `false` — for flavors with and without GPU, disables the installation of GPU drivers and NVIDIA® Device Plugin. You can [install drivers for GPU node groups manually](/managed-kubernetes/node-groups/gpu-drivers/#install-gpu-drivers).

    See the detailed description of the [selectel\_mks\_nodegroup\_v1](/terraform/selectel-provider-reference/resources/mks_nodegroup_v1/) resource.
  </TabItem>
</Tabs>

<Formbricks />
