Перейти к содержанию

# K8S через тофу на проксе

Сделаю наверное перевод с дополнениями

В этом посте я буду использовать следующие продукты:

- Proxmox - домашняя страница
- Ubuntu - домашняя страница
- OpenTofu - домашняя страница
- поставщик terraform для bpg/proxmox — реестр и github
- Ansible - домашняя страница
- Kubespray - домашняя страница и github

### Установить OpenTofu

Чтобы начать работу с OpenTofu, я установил его на свой компьютер с Linux с помощью Snap, но есть и несколько других альтернатив. Подробнее см. на официальной странице документации OpenTofu.

    sudo snap install --classic opentofu

Теперь OpenTofu установлен, и я могу начать его использовать. Я также установил автозаполнение bash следующим образом:

    tofu -install-autocomplete # restart shell session...

Я решил создать отдельную папку для своих «проектов», поэтому я создал папку в своей домашней папке под названием *tofu/proxmox, в которой у меня есть разные подпапки в зависимости от задач или ресурсов, для которых я буду использовать OpenTofu.

    tofu/proxmox/
    ├── k8s-cluster-02
    ├── proxmox-images

## Сетевое зеркало реестра провайдеров terraform

Так как реестры и тераформ заблокированы для РФ требуется использовать пути обхода.
Для использования зеркала добавьте в файл настроек terraform следующий код:

    provider_installation {
      network_mirror {
        url     = "https://nm.tf.org.ru/"
        include = ["registry.terraform.io/*/*"]
      }
      direct {
        exclude = ["registry.terraform.io/*/*"]
      }
    }

- В Windows файл должен называться `terraform.rc` и находиться в каталоге `%APPDATA%` соответствующего пользователя. Расположение каталога зависит от версии Windows. Чтобы найти этот каталог в своей системе используйте `$env:APPDATA` в PowerShell.
- В остальных системах файл должен называться `.terraformrc` и находиться в домашнем каталоге пользователя. (/home/ubadmin)

## Другие сайты

## Зеркала реестров

- registry.comcloud.xyz
- terraform-mirror.yandexcloud.net

## Зеркала релизов

- hashicorp-releases.website.yandexcloud.net
- hc-mirror.express42.net
- releases.comcloud.xyz

## Документация

- docs.comcloud.xyz

### Провайдер OpenTofu Proxmox

Чтобы использовать OpenTofu с Proxmox, мне нужен провайдер, который может использовать API Proxmox. Я быстро изучил различные варианты и остановился на этом провайдере: bpg/proxmox. Он кажется очень активным и недавно обновлялся (согласно репозиторию git здесь)

Поставщик OpenTofu/Terraform определяется следующим образом, а приведенный ниже пример настраивает установку поставщика bpg/proxmox, необходимого для взаимодействия с Proxmox.
terraform {

      required_providers {
        proxmox = {
          source = "registry.terraform.io/bpg/proxmox"
        }
        local = {
          source = "registry.terraform.io/hashicorp/local"
        }
        null = {
          source = "registry.terraform.io/hashicorp/null"
        }
        time = {
          source = "registry.terraform.io/hashicorp/time"
        }
      }
    }

    provider "proxmox" {
      endpoint  = var.pve_api_url
      api_token = "${var.pve_token_id}=${var.pve_token_secret}"
      insecure  = true
      ssh {
        agent    = true
        username = "root"
      }
    }

Я сохраню это содержимое в файле под названием providers.tf
Сначала краткое объяснение двух разделов выше. Разделы terraform указывают OpenTofu/Terraform, какой провайдер следует загрузить и включить. Поле version определяет конкретную версию для использования, а не последнюю, а именно эту версию. Использование этого поля гарантирует, что ваша автоматизация не сломается, если в версии провайдера произойдут какие-либо изменения в API.
Раздел provider настраивает взаимодействие прокси-провайдера с Proxmox. Вместо обычного имени пользователя и пароля я решил использовать токен API. Здесь я использую значение переменной в ключах endpoint и api-token, которые определены в другом файле под названием variables.tf и credentials.auto.tfvars. В моей системе автоматизации есть задачи, для которых требуется взаимодействие с Proxmox по SSH, поэтому я также включил его, настроив поле ssh.

Для получения дополнительной информации о провайдере bpg/proxmox перейдите сюда

### Подготовьте Proxmox с помощью токена API для поставщика OpenTofu bpg/proxmox

Чтобы использовать описанный выше провайдер с Proxmox, мне нужно подготовить Proxmox для использования токена API. Я следовал документации провайдера bpg/proxmox здесь

    # Create the user
    sudo pveum user add terraform@pve

    # Create a role for the user above
    sudo pveum role add Terraform -privs "Datastore.Allocate Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify SDN.Use VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt User.Modify"

    # Assign the terraform user to the above role
    sudo pveum aclmod / -user terraform@pve -role Terraform

    # Create the token
    sudo pveum user token add terraform@pve provider --privsep=0

    ┌──────────────┬──────────────────────────────────────┐
    │ key          │ value                                │
    ╞══════════════╪══════════════════════════════════════╡
    │ full-tokenid │ terraform@pve!provider               │
    ├──────────────┼──────────────────────────────────────┤
    │ info         │ {"privsep":"0"}                      │
    ├──────────────┼──────────────────────────────────────┤
    │ value        │ <token>                               │
    └──────────────┴──────────────────────────────────────┘
    # make a backup of the token

Теперь я могу войти в свой узел Proxmox по SSH без пароля с моего Linux-шлюза. Но при использовании в сочетании с opentofu этого недостаточно. Мне нужно загрузить ключ в хранилище ключей. Если я этого не сделаю, автоматизация, требующая доступа по SSH, завершится ошибкой с этим сообщением:

    Error: failed to open SSH client: unable to authenticate user "root" over SSH to "172.18.5.102:22". Please verify that ssh-agent is correctly loaded with an authorized key via 'ssh-add -L' (NOTE: configurations in ~/.ssh/config are not considered by golang's ssh implementation). The exact error from ssh.Dial: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain

Для того что бы избавиться от ошибки нужно выполнить команды в терминале:

    eval `ssh-agent -s`
    ssh-add /home/ubadmin/.ssh/id_ed25519