2
votes

Gérer GKE et ses déploiements avec Terraform

Je peux utiliser terraform pour déployer un cluster Kubernetes dans GKE .

Ensuite, j'ai configuré le fournisseur pour Kubernetes comme suit:

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

Par défaut, terraform interagit avec Kubernetes avec l'utilisateur client , qui n'a pas le pouvoir de créer (par exemple) des déploiements. Donc j'obtiens cette erreur lorsque j'essaye d'appliquer mes modifications avec 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"

Je ne sais pas comment dois-je procéder maintenant, comment dois-je J'accorde ces autorisations à l'utilisateur client ?

Si les champs suivants sont ajoutés au fournisseur, je suis en mesure d'effectuer des déploiements, bien qu'après avoir lu la documentation, il semble que ces informations soient utilisé pour la communication HTTP avec le cluster, ce qui n'est pas sûr si cela se fait via Internet.

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)}"
}

Y a-t-il une autre meilleure façon de le faire ?


1 commentaires

Si vous trouvez des ressources supplémentaires sur la façon de procéder, n'hésitez pas à modifier votre question. Je suis actuellement coincé sur le même problème, il ne semble pas y avoir d'exemple complet de bout en bout sur la façon de déployer un cluster GKE et un déploiement Kubernetes à l'intérieur avec le plus récent RBAC.


3 Réponses :


0
votes

Il semble que l'utilisateur que vous utilisez ne dispose pas du rôle RBAC requis pour créer des déploiements. Assurez-vous que l'utilisateur dispose des verbes corrects pour la ressource de déploiements. Vous pouvez consulter ces Exemples de rôles pour avoir une idée à ce sujet.


0 commentaires

0
votes

Vous devez fournir les deux. Consultez cet exemple comment intégrer le fournisseur Kubernetes avec le fournisseur Google.

Exemple de configuration du fournisseur 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)}"
}


1 commentaires

Vous devez inclure les informations clés du lien dans votre réponse.



8
votes
  • vous pouvez utiliser le compte de service qui exécute le terraform
  • 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"
      }
    }
    

    OU

    • donner des autorisations au "client" par défaut
    • Mais vous avez besoin d'une authentification valide sur le fournisseur de cluster GKE pour exécuter ceci: / augmente la dépendance circulaire ici
    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
    }
    

1 commentaires

Merci! Mon terraform fonctionnait avec une identité GCP qui disposait des droits nécessaires sur le cluster, mais je ne savais pas comment configurer le fournisseur Kubernetes pour utiliser ces informations d'identification. Votre premier exemple, montrant comment utiliser "google_client_config" pour obtenir le jeton OAuth, était ce dont j'avais besoin. Si quelqu'un se trouve dans une situation similaire, j'ajouterai que vous devez vous assurer que vous ne spécifiez pas de valeur "client_certificate" ou "client_key" lors de l'utilisation de cette solution - seul "token" doit être fourni.