Как импортировать пространство имен сгенерированного кластера 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
(2) Укажите поставщику terraform Kubernetes ваш kubeconfig:
provider "kubernetes" {
config_path = "~/.kube/config"
}