使用Terraform和Helm无法访问Kubernetes集群

mlnl4t2r  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(1)|浏览(102)

我正在为我的论文使用terraform创建一个GKE集群。一开始我能够创建它,但后来我添加了Istio,prometheus等。所以我摧毁了这个集群,用这些重新创建它。我开始得到同样的错误:无法访问Kubernetes集群。我已经检查了凭据问题并添加了一个服务帐户,它没有工作。
我认为这是helm的凭据问题,我用它来创建istio和插件。我还认为这可能是kubeconfig文件的问题,我不知道如何解决。我设置了KUBE_CONFIG_PATH,但它没有帮助。
最后,我决定再次尝试只创建集群,但它仍然不工作,我得到了错误:无法访问Kubernetes集群。这是怎么回事我想这要么与证书有关,要么与kubeconfig有关,但在这一点上我迷路了。
有人遇到过这个问题吗?你是怎么解决的?
Terraform提供程序文件:

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "4.63.1"
    }

    kubernetes = {
      source = "hashicorp/kubernetes"
      version = "2.21.1"
    }

    helm = {
      source = "hashicorp/helm"
      version = "2.10.1"
    }

    kubectl = {
      source  = "gavinbunney/kubectl"
      version = ">= 1.7.0"
    }
  }
}

provider "google" {
  project = var.gcp_project_id
  region  = var.region
  credentials = file("${var.credentials_gcp}/service-account.json")
}

provider "kubernetes" {
  # config_path = "~/.kube/config"
  # config_context = "gke_kube-testing-384710_europe-west1_thesis-cluster"
  host                   = "https://${google_container_cluster.primary.endpoint}"
  token                  = data.google_client_config.main.access_token
  cluster_ca_certificate = base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)
}

provider "helm" {
  kubernetes {
    config_path = "~/.kube/config"
  }
}

字符串
terraform kubernetes文件:

resource "google_container_cluster" "primary" {
    name = var.name
    location =  var.zone
    remove_default_node_pool = true
    initial_node_count = 1 

    network = google_compute_network.main.self_link
    subnetwork = google_compute_subnetwork.private.self_link

    logging_service = "none"         # "logging.googleapis.com/kubernetes"
    monitoring_service = "none"      # "monotoring/googleapis.com/kubernetes"   
    networking_mode = "VPC_NATIVE"

    # Optional, for multi-zonal cluster
    node_locations = var.multi-zonal ? local.zones : []   # if multi-zonal == true then use the zones in locals, else use []
     

     addons_config {
        http_load_balancing {
          disabled = true
        }

        horizontal_pod_autoscaling {
          disabled = true
        }
     }

     vertical_pod_autoscaling {
       enabled = false
     }

     release_channel {
       channel = "REGULAR"
     }

     workload_identity_config {
       workload_pool = "${var.gcp_project_id}.svc.id.goog"
     }

     ip_allocation_policy {
       cluster_secondary_range_name = "k8s-pod-range"
       services_secondary_range_name = "k8s-service-range"
    depends_on = [ 
      # module.enable_google_apis,
      # module.gcloud
      ]
     }

     private_cluster_config {
       enable_private_nodes = true
       enable_private_endpoint = false
       master_ipv4_cidr_block = "172.16.0.0/28"
     }
}

# Get credentials for cluster
resource "null_resource" "gcloud-connection" {
  provisioner "local-exec" {
    command = "gcloud container clusters get-credentials ${var.name} --zone ${var.zone} --project ${var.gcp_project_id}"
  }

  depends_on = [ google_container_cluster.primary ]
}

# Apply YAML kubernetes-manifest configurations      
resource "null_resource" "apply_deployment" {
  provisioner "local-exec" {
    interpreter = ["bash", "-exc"]
    command     = "kubectl apply -k ${var.filepath_manifest} -n ${var.namespace}"
  }

  depends_on = [ 
    null_resource.gcloud-connection
  ]
}

resource "google_service_account" "kubernetes" {
    account_id = "kubernetes"
}


我是否使用了服务帐户不正确?
如果您需要任何其他代码或信息,请随时询问。

epggiuax

epggiuax1#

首先,我解决了创建集群本身的一些问题,现在可以毫无问题地创建它了。至于其他问题,我认为问题在于Helm提供程序需要kubeconfig文件来访问集群,但是当我运行terraform init时集群还没有创建。
为了解决这个问题,我找到了一个解决方案,首先运行:

terraform apply -target=google_container_node_pool.general --auto-approve

字符串
这将创建群集。然后我跑:

gcloud container clusters get-credentials <cluster-name> --zone <zone> --project <project-id>


这会将新集群的凭据添加到kubeconfig文件中。然后我跑:

terraform apply --auto-approve


这将在新的kubeconfig上下文中使用已经创建的集群凭据再次配置helm提供程序,以便helm提供程序可以将图表安装到集群。
它现在工作,但我想知道是否有另一种方法来做到这一点,而不需要每次都做这整个过程,只使用terraform,而不是终端。
另外,我不明白为什么credentials命令在terraform中不起作用。我也在那里使用,但似乎不重要。

相关问题