У меня есть рабочий кластер GKE Kubernetes. Я пытаюсь использовать terraform для развертывания в нем новых ресурсов, но Terraform apply возвращает следующее:
Error: Error applying plan:
2 error(s) occurred:
* kubernetes_pod.test: 1 error(s) occurred:
* kubernetes_pod.test: pods is forbidden: User "client" cannot create pods in the namespace "default"
* module.helm.kubernetes_service_account.tiller: 1 error(s) occurred:
* kubernetes_service_account.tiller: serviceaccounts is forbidden: User "client" cannot create serviceaccounts in the namespace "kube-system"
Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.
Мои файлы terraform следующие:
Ресурсы GKE main.tf
data "terraform_remote_state" "project" {
backend = "gcs"
config {
bucket = "<bucket>"
prefix = "terraform/testing-project"
}
}
data "terraform_remote_state" "gke" {
backend = "gcs"
config {
bucket = "<bucket>"
prefix = "terraform/testing-gke-cluster"
}
}
locals {
host = "${data.terraform_remote_state.gke.endpoint}"
client_certificate = "${base64decode(data.terraform_remote_state.gke.client_certificate)}"
client_key = "${base64decode(data.terraform_remote_state.gke.client_key)}"
cluster_ca_certificate = "${base64decode(data.terraform_remote_state.gke.cluster_ca_certificate)}"
}
provider "kubernetes" {
host = "${local.host}"
client_certificate = "${local.client_certificate}"
client_key = "${local.client_key}"
cluster_ca_certificate = "${local.cluster_ca_certificate}"
}
module "helm" {
source = "../../../Modules/GKE/Helm/"
host = "${local.host}"
client_certificate = "${local.client_certificate}"
client_key = "${local.client_key}"
cluster_ca_certificate = "${local.cluster_ca_certificate}"
}
resource "kubernetes_pod" "test" {
metadata {
name = "terraform-example"
}
spec {
container {
image = "nginx:1.7.9"
name = "example"
env {
name = "environment"
value = "test"
}
}
}
}
И рулевой модуль:
resource "kubernetes_service_account" "tiller" {
automount_service_account_token = true
metadata {
name = "tiller"
namespace = "kube-system"
}
}
resource "kubernetes_cluster_role_binding" "tiller" {
metadata {
name = "tiller"
}
role_ref {
api_group = "rbac.authorization.k8s.io"
kind = "ClusterRole"
name = "cluster-admin"
}
subject {
kind = "ServiceAccount"
name = "${kubernetes_service_account.tiller.metadata.0.name}"
api_group = ""
namespace = "${kubernetes_service_account.tiller.metadata.0.namespace}"
}
}
# initialize Helm provider
provider "helm" {
install_tiller = true
service_account = "${kubernetes_service_account.tiller.metadata.0.name}"
tiller_image = "gcr.io/kubernetes-helm/tiller:v2.11.0"
kubernetes {
host = "${var.host}"
client_certificate = "${var.client_certificate}"
client_key = "${var.client_key}"
cluster_ca_certificate = "${var.cluster_ca_certificate}"
}
}
Я пытался найти решение, и, как мне кажется, это как-то связано со мной, когда я раньше использовал мою учетную запись Google для управления ресурсами с помощью kubectl и kubernetes, у которых сейчас возникли проблемы с учетной записью службы terraform, но я не знаю, как чтобы решить это. Учетная запись службы terraform имеет роли владельца и редактора в проекте.
Вам необходимо назначить привязку ролей или привязку ролей кластера к пользователю «клиенту», чтобы вышеперечисленное работало с использованием RBAC. Когда вы включаете устаревшую авторизацию, вы включаете ABAC, что менее безопасно
По-видимому, это начало работать, когда я включил устаревшую авторизацию. Если бы кто-нибудь мог объяснить почему, я бы отметил это как ответ.