我正在为我的论文使用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"
}
型
我是否使用了服务帐户不正确?
如果您需要任何其他代码或信息,请随时询问。
1条答案
按热度按时间epggiuax1#
首先,我解决了创建集群本身的一些问题,现在可以毫无问题地创建它了。至于其他问题,我认为问题在于Helm提供程序需要kubeconfig文件来访问集群,但是当我运行terraform init时集群还没有创建。
为了解决这个问题,我找到了一个解决方案,首先运行:
字符串
这将创建群集。然后我跑:
型
这会将新集群的凭据添加到kubeconfig文件中。然后我跑:
型
这将在新的kubeconfig上下文中使用已经创建的集群凭据再次配置helm提供程序,以便helm提供程序可以将图表安装到集群。
它现在工作,但我想知道是否有另一种方法来做到这一点,而不需要每次都做这整个过程,只使用terraform,而不是终端。
另外,我不明白为什么credentials命令在terraform中不起作用。我也在那里使用,但似乎不重要。