Управление 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)}"
}