Как импортировать пространство имен сгенерированного кластера Kubernetes в terraform

В моих файлах конфигурации terraform я создаю кластер Kubernetes на GKE и, когда он создается, настраиваю поставщика Kubernetes для доступа к указанному кластеру и выполнения различных действий, таких как настройка пространств имен.

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

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

Команда, которую я использовал для импорта пространств имен, довольно проста:

terraform import kubernetes_namespace.my_new_namespace my_new_namespace

Я также пробовал использовать -provdier="" а также -config="" но безрезультатно.

Конфигурация моего поставщика Kubernetes такова:

provider "kubernetes" {
  version = "~> 1.8"

  host  = module.gke.endpoint
  token = data.google_client_config.current.access_token

  cluster_ca_certificate = base64decode(module.gke.cluster_ca_certificate)
}

Вот пример ресурса пространства имен, который я пытаюсь импортировать:

resource "kubernetes_namespace" "my_new_namespace" {
  metadata {
    name = "my_new_namespace"
  }
}

Команда импорта приводит к следующему:

Ошибка: получить http://localhost/api/v1/namespaces/my_new_namespace: dial tcp [::1]:80: connect: соединение отклонено

Очевидно, он обречен на неудачу, поскольку пытается достичь localhost вместо фактического IP-адреса кластера и его конфигураций.

Есть ли обходной путь для этого варианта использования?

Заранее спасибо.

2 ответа

проблема заключается в поставщике динамических данных. В importоператор не имеет к нему доступа.

Для процесса импорта вам необходимо жестко закодировать значения поставщика.

Измените это:

      provider "kubernetes" {
  version                = "~> 1.8"
  host                   = module.gke.endpoint
  token                  = data.google_client_config.current.access_token
  cluster_ca_certificate = base64decode(module.gke.cluster_ca_certificate)
}

к:

      provider "kubernetes" {
  version                = "~> 1.8"
  host                   = "https://<ip-of-cluster>"
  token                  = "<token>"
  cluster_ca_certificate = base64decode(<cert>)
  load_config_file       = false
}
  • Токен можно получить из gcloud auth print-access-token.
  • IP-адрес и сертификат можно получить, проверив созданный ресурс контейнера с помощью terraform state show module.gke.google_container_cluster.your_cluster_resource_name_here

Для версии провайдера 2+ вам нужно сбросить load_config_file.

Оказавшись на месте, импортируйте и отмените изменения в провайдере.

(1) Создайте запись в файле kubeconfig для своего кластера GKE.

      gcloud container clusters get-credentials cluster-name

см.: https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#generate_kubeconfig_entry

(2) Укажите поставщику terraform Kubernetes ваш kubeconfig:

      provider "kubernetes" {
  config_path = "~/.kube/config"
}
Другие вопросы по тегам