Управление GKE и его развертыванием с Terraform

Я могу использовать terraform развернуть Kubernetes кластер в GKE,

Тогда я настроил провайдера для Kubernetes следующее:

provider "kubernetes" {
  host                    = "${data.google_container_cluster.primary.endpoint}"

  client_certificate      = "${base64decode(data.google_container_cluster.primary.master_auth.0.client_certificate)}"
  client_key              = "${base64decode(data.google_container_cluster.primary.master_auth.0.client_key)}"
  cluster_ca_certificate  = "${base64decode(data.google_container_cluster.primary.master_auth.0.cluster_ca_certificate)}"
}

По умолчанию, terraform взаимодействует с Kubernetes с пользователем client, который не имеет полномочий для создания (например) развертываний. Таким образом, я получаю эту ошибку, когда пытаюсь применить свои изменения с terraform:

Error: Error applying plan:

1 error(s) occurred:

 * kubernetes_deployment.foo: 1 error(s) occurred:

 * kubernetes_deployment.foo: Failed to create deployment: deployments.apps is forbidden: User "client" cannot create deployments.apps in the namespace "default"

Я не знаю, как мне действовать сейчас, как я должен дать эти разрешения client пользователь?

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

username              = "${data.google_container_cluster.primary.master_auth.0.username}"
password              = "${data.google_container_cluster.primary.master_auth.0.password}"

Есть ли другой лучший способ сделать это?

2 ответа

  • вы можете использовать сервисную учетную запись, на которой запущена terraform
data "google_client_config" "default" {}

provider "kubernetes" {
  host     = "${google_container_cluster.default.endpoint}"

  token = "${data.google_client_config.default.access_token}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.default.master_auth.0.cluster_ca_certificate)}"

  load_config_file = false
}

ИЛИ ЖЕ

  • дать разрешения по умолчанию "клиент"
  • Но вам нужна действительная аутентификация на провайдере кластера GKE для запуска циклической зависимости: / ups
resource "kubernetes_cluster_role_binding" "default" {
  metadata {
    name = "client-certificate-cluster-admin"
  }
  role_ref {
    api_group = "rbac.authorization.k8s.io"
    kind = "ClusterRole"
    name = "cluster-admin"
  }
  subject {
    kind = "User"
    name = "client"
    api_group = "rbac.authorization.k8s.io"
  }
  subject {
    kind = "ServiceAccount"
    name = "default"
    namespace = "kube-system"
  }
  subject {
    kind = "Group"
    name = "system:masters"
    api_group = "rbac.authorization.k8s.io"
  }
}

Похоже, что используемому пользователю не хватает необходимой роли RBAC для создания развертываний. Убедитесь, что у пользователя есть правильные глаголы для ресурса развертывания. Вы можете взглянуть на эти примеры ролей, чтобы иметь представление об этом.

Вы должны предоставить оба. Посмотрите в этом примере, как интегрировать провайдера Kubernetes с провайдером Google.

Пример того, как настроить провайдера Kubernetes:

provider "kubernetes" {
  host     = "${var.host}"
  username = "${var.username}"
  password = "${var.password}"

  client_certificate     = "${base64decode(var.client_certificate)}"
  client_key             = "${base64decode(var.client_key)}"
  cluster_ca_certificate = "${base64decode(var.cluster_ca_certificate)}"
}