Как импортировать пространство имен сгенерированного кластера 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: наберите tcp [: : 1]: 80: connect: в соединении отказано

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

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

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


person user1384377    schedule 10.09.2019    source источник
comment
Вы можете временно жестко закодировать конфигурацию провайдера из известных выходных данных, пока вы импортируете ресурсы, а затем отменить свои изменения, когда закончите.   -  person ydaetskcoR    schedule 10.09.2019
comment
вы можете получить доступ к кластеру через api? kubectl get ‹something› работает?   -  person JohnMops    schedule 08.11.2020
comment
Эта проблема по-прежнему существует в 2021 году, если у кого-то есть ответ, который был бы потрясающим ...: D   -  person h1fra    schedule 24.05.2021
comment
Да вроде полный тупик искать звуковое решение   -  person Kat Lim Ruiz    schedule 09.06.2021
comment
Захватывает ли он локальный хост из вашего локального kubectl kubeconfig? Если вы можете сделать gcloud container clusters get-credentials для генерации локального kubeconfig, я считаю, что команда terraform import будет использовать ваш локальный kubeconfig / context, я предполагаю, что module.gke.endpoint не возвращается с localhost, поэтому он получает его откуда-то ...   -  person Jai Govindani    schedule 14.07.2021


Ответы (1)


(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 Provider в свой kubeconfig:

provider "kubernetes" {
  config_path = "~/.kube/config"
}
person e2bias    schedule 05.02.2021
comment
это не сработает, потому что импорт выполняется вне контекста плана или применения - person Kat Lim Ruiz; 10.06.2021