簡體   English   中英

Terraform:錯誤:Kube.netes 集群不可訪問:配置無效

[英]Terraform: Error: Kubernetes cluster unreachable: invalid configuration

使用“terraform destroy”刪除 kube.netes 集群后,我無法再創建它。

“terraform apply”返回以下錯誤消息:

錯誤:Kube.netes cluster unreachable: invalid configuration: no configuration has been provided, try setting KUBE.NETES_MASTER 環境變量

這是 terraform 配置:

terraform {
  backend "s3" {
    bucket = "skyglass-msur"
    key    = "terraform/backend"
    region = "us-east-1"
  }
}

locals {
  env_name         = "staging"
  aws_region       = "us-east-1"
  k8s_cluster_name = "ms-cluster"
}

variable "mysql_password" {
  type        = string
  description = "Expected to be retrieved from environment variable TF_VAR_mysql_password"
}

provider "aws" {
  region = local.aws_region
}

data "aws_eks_cluster" "msur" {
  name = module.aws-kubernetes-cluster.eks_cluster_id
}

module "aws-network" {
  source = "github.com/skyglass-microservices/module-aws-network"

  env_name              = local.env_name
  vpc_name              = "msur-VPC"
  cluster_name          = local.k8s_cluster_name
  aws_region            = local.aws_region
  main_vpc_cidr         = "10.10.0.0/16"
  public_subnet_a_cidr  = "10.10.0.0/18"
  public_subnet_b_cidr  = "10.10.64.0/18"
  private_subnet_a_cidr = "10.10.128.0/18"
  private_subnet_b_cidr = "10.10.192.0/18"
}

module "aws-kubernetes-cluster" {
  source = "github.com/skyglass-microservices/module-aws-kubernetes"

  ms_namespace       = "microservices"
  env_name           = local.env_name
  aws_region         = local.aws_region
  cluster_name       = local.k8s_cluster_name
  vpc_id             = module.aws-network.vpc_id
  cluster_subnet_ids = module.aws-network.subnet_ids

  nodegroup_subnet_ids     = module.aws-network.private_subnet_ids
  nodegroup_disk_size      = "20"
  nodegroup_instance_types = ["t3.medium"]
  nodegroup_desired_size   = 1
  nodegroup_min_size       = 1
  nodegroup_max_size       = 5
}

# Create namespace
# Use kubernetes provider to work with the kubernetes cluster API
provider "kubernetes" {
  # load_config_file       = false
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.msur.certificate_authority.0.data)
  host                   = data.aws_eks_cluster.msur.endpoint
  exec {
    api_version = "client.authentication.k8s.io/v1alpha1"
    command     = "aws-iam-authenticator"
    args        = ["token", "-i", "${data.aws_eks_cluster.msur.name}"]
  }
}

# Create a namespace for microservice pods
resource "kubernetes_namespace" "ms-namespace" {
  metadata {
    name = "microservices"
  }
}

PS 0.14.7 的 terraform kube.netes 提供程序似乎存在問題

我在這個版本中不能使用“load_config_file”= false,所以我不得不評論它,這似乎是這個問題的原因。

PPS 這也可能是過時的 cluster_ca_certificate 的問題,terraform 嘗試使用:刪除此證書就足夠了,盡管我不確定它存儲在哪里。

在進行諸如直接操作 state 之類的激進操作之前,請嘗試設置 KUBE_CONFIG_PATH 變量:

export KUBE_CONFIG_PATH=/path/to/.kube/config

在此之后重新運行planapply命令。 這為我解決了這個問題。

我遇到過同樣的問題。 我什至手動刪除了真正搞砸了 terraform state 的 EKS 集群。

但是,浪費了幾個小時后,我發現有一個非常簡單的解決方案。

你可以跑

terraform state rm <resource_type>.<resource_name>

我剛剛執行

terraform state rm `terraform state list | grep eks`

以安全的方式從 state 文件中刪除特定服務的所有條目。

刪除 AWS 上的 terraform state S3 存儲桶解決了該問題。

刪除運行“terraform”命令的文件夾中的.terraform 子文件夾也應該可以解決問題。

我沒有針對這種確切的情況嘗試過,但我今天遇到了類似的問題,所以我決定分享另一個解決方案。 它似乎沒有刪除 S3 存儲桶那么激進。

就我而言,當我嘗試使用“tf destroy”銷毀資源時發生此錯誤

對我來說合乎邏輯的解決方案是執行以下操作:

  1. 在 terraform state 上運行“tf apply -refresh=true”,您將在其中引導 K8S 集群。 這是工作區,您在其中 output K8S 憑據 (k8s_cluster_access_token)
  2. 在 terraform state 上運行 'tf apply -refresh=true',即使用上述 K8S 憑據創建 K8S 資源。
  3. 運行'tf destroy'(成功完成)

當我需要對需要刪除一些資源的集群進行更新時,這發生在我身上。 您也可以嘗試運行terraform apply -refresh=false並讓它銷毀它。

我通過使用官方helm提供程序而不是kube.netes解決了這個問題。

首先,我們列出所需的提供商:

terraform {
  backend "s3" {
    bucket  = "..."
    key     = "..."
    region  = "..."
    profile = "..."
  }

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.49"
    }

    kubernetes = {
      source  = "hashicorp/kubernetes"
      version = "~> 2.16.1"
    }

    helm = {
      source  = "hashicorp/helm"
      version = "~> 2.8.0"
    }
  }
}

然后,我們配置提供者:

data "aws_eks_cluster" "cluster" {
  name = var.cluster_name
}

provider "helm" {
  kubernetes {
    host                   = data.aws_eks_cluster.cluster.endpoint
    cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
    exec {
      api_version = "client.authentication.k8s.io/v1"
      command = "aws"
      args = [
        "eks",
        "get-token",
        "--cluster-name",
        data.aws_eks_cluster.cluster.name,
        "--profile",
        var.profile
      ]
    }
  }
}

最后,我們通過helm_release資源添加圖表:

resource "helm_release" "foo" {
  name             = "foo"
  chart            = "foo"
  repository       = "https://foo.bar/chart"
  namespace        = "foo"
  create_namespace = true
  values           = [templatefile("${path.module}/chart/values.yaml", {})]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM