Terraform: Error: Kubernetes cluster unreachable: invalid configuration
Terraform: Error: Kubernetes cluster unreachable: invalid configuration
用“terraform destroy”删除kubernetes集群后,我无法再创建它了。
“terraform apply”returns出现以下错误信息:
Error: Kubernetes cluster unreachable: invalid configuration: no
configuration has been provided, try setting KUBERNETES_MASTER
environment variable
这是地形配置:
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"
}
}
P.S。 0.14.7
的 terraform kubernetes 提供程序似乎存在问题
这个版本不能用"load_config_file"=false,只好注释掉,好像是这个issue的原因
P.P.S。这也可能是过时的 cluster_ca_certificate 的问题,terraform 试图使用它:删除这个证书就足够了,虽然我不确定它存储在哪里。
删除 AWS 上的 terraform state S3 存储桶解决了这个问题。
在做一些激进的事情之前,比如直接操纵状态,尝试设置 KUBE_CONFIG_PATH 变量:
export KUBE_CONFIG_PATH=/path/to/.kube/config
在此之后重新运行 plan
或 apply
命令。
这已经解决了我的问题。
删除 运行“terraform”命令所在文件夹中的 .terraform 子文件夹也应该可以解决问题。
我没有针对这种确切情况尝试过,但我今天遇到了类似的问题,所以我决定分享另一个解决方案。与删除 S3 存储桶相比,它似乎不那么激进。
我遇到了同样的问题。我什至手动删除了 EKS 集群,它确实搞砸了 terraform 状态。
然而,在浪费了几个小时之后,我发现有一个非常简单的解决方案。
你可以运行
terraform state rm <resource_type>.<resource_name>
我刚刚执行
terraform state rm `terraform state list | grep eks`
以安全的方式从状态文件中删除特定服务的所有条目。
用“terraform destroy”删除kubernetes集群后,我无法再创建它了。
“terraform apply”returns出现以下错误信息:
Error: Kubernetes cluster unreachable: invalid configuration: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
这是地形配置:
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"
}
}
P.S。 0.14.7
的 terraform kubernetes 提供程序似乎存在问题这个版本不能用"load_config_file"=false,只好注释掉,好像是这个issue的原因
P.P.S。这也可能是过时的 cluster_ca_certificate 的问题,terraform 试图使用它:删除这个证书就足够了,虽然我不确定它存储在哪里。
删除 AWS 上的 terraform state S3 存储桶解决了这个问题。
在做一些激进的事情之前,比如直接操纵状态,尝试设置 KUBE_CONFIG_PATH 变量:
export KUBE_CONFIG_PATH=/path/to/.kube/config
在此之后重新运行 plan
或 apply
命令。
这已经解决了我的问题。
删除 运行“terraform”命令所在文件夹中的 .terraform 子文件夹也应该可以解决问题。
我没有针对这种确切情况尝试过,但我今天遇到了类似的问题,所以我决定分享另一个解决方案。与删除 S3 存储桶相比,它似乎不那么激进。
我遇到了同样的问题。我什至手动删除了 EKS 集群,它确实搞砸了 terraform 状态。
然而,在浪费了几个小时之后,我发现有一个非常简单的解决方案。
你可以运行
terraform state rm <resource_type>.<resource_name>
我刚刚执行
terraform state rm `terraform state list | grep eks`
以安全的方式从状态文件中删除特定服务的所有条目。