Rui*_*ins 7 kubernetes terraform
我用terraform
, kubernetes
,cassandra
和做了一些实验elassandra
,我用模块分隔了所有,但现在我无法删除特定的模块。
我正在使用gitlab-ci
,并将 terraform 状态存储在 AWS 后端。这意味着,每次我更改 terraform 文件中的基础设施时,在 之后git push
,基础设施将更新为gitlab-ci
运行terraform init
,terraform plan
和terraform apply
.
我的 terraform 主文件是这样的:
# main.tf
##########################################################################################################################################
# BACKEND #
##########################################################################################################################################
terraform {
backend "s3" {}
}
data "terraform_remote_state" "state" {
backend = "s3"
config {
bucket = "${var.tf_state_bucket}"
dynamodb_table = "${var.tf_state_table}"
region = "${var.aws-region}"
key = "${var.tf_key}"
}
}
##########################################################################################################################################
# Modules #
##########################################################################################################################################
# Cloud Providers: -----------------------------------------------------------------------------------------------------------------------
module "gke" {
source = "./gke"
project = "${var.gcloud_project}"
workspace = "${terraform.workspace}"
region = "${var.region}"
zone = "${var.gcloud-zone}"
username = "${var.username}"
password = "${var.password}"
}
module "aws" {
source = "./aws-config"
aws-region = "${var.aws-region}"
aws-access_key = "${var.aws-access_key}"
aws-secret_key = "${var.aws-secret_key}"
}
# Elassandra: ----------------------------------------------------------------------------------------------------------------------------
module "k8s-elassandra" {
source = "./k8s-elassandra"
host = "${module.gke.host}"
username = "${var.username}"
password = "${var.password}"
client_certificate = "${module.gke.client_certificate}"
client_key = "${module.gke.client_key}"
cluster_ca_certificate = "${module.gke.cluster_ca_certificate}"
}
# Cassandra: ----------------------------------------------------------------------------------------------------------------------------
module "k8s-cassandra" {
source = "./k8s-cassandra"
host = "${module.gke.host}"
username = "${var.username}"
password = "${var.password}"
client_certificate = "${module.gke.client_certificate}"
client_key = "${module.gke.client_key}"
cluster_ca_certificate = "${module.gke.cluster_ca_certificate}"
}
Run Code Online (Sandbox Code Playgroud)
这是我的目录树:
.
??? aws-config
? ??? terraform_s3.tf
? ??? variables.tf
??? gke
? ??? cluster.tf
? ??? gcloud_access_key.json
? ??? gcp.tf
? ??? variables.tf
??? k8s-cassandra
? ??? k8s.tf
? ??? limit_ranges.tf
? ??? quotas.tf
? ??? services.tf
? ??? stateful_set.tf
? ??? variables.tf
??? k8s-elassandra
? ??? k8s.tf
? ??? limit_ranges.tf
? ??? quotas.tf
? ??? services.tf
? ??? stateful_set.tf
? ??? variables.tf
??? main.tf
??? variables.tf
Run Code Online (Sandbox Code Playgroud)
我在这里被阻止:
-> 我想移除模块 k8s-cassandra
main.tf
( module "k8s-cassandra" {...
) 中的模块,我会收到此错误:TERRAFORM PLAN... 获取状态锁定。这可能需要一些时间...正在释放状态锁定。这可能需要一些时间...
错误:module.k8s-cassandra.kubernetes_stateful_set.cassandra:module.k8s-cassandra.provider.kubernetes 的配置不存在;所有操作都需要提供程序配置块
terraform destroy -target=module.k8s-cassandra -auto-approve
之间terraform init
和terraform plan
剧照无法正常工作。任何人都可以帮助我,好吗?谢谢 :)
Mar*_*ins 14
此错误消息的含义是 Terraform 依赖provider "kubernetes"
模块内的块k8s-cassandra
来配置 AWS 提供程序。通过从源代码中删除模块,您已经隐式地删除了该配置,因此无法删除已存在于状态中的现有对象——执行此操作所需的提供程序配置不存在。
尽管 Terraform 允许provider
在子模块中使用块以提高灵活性,但文档建议将所有块都保留在根模块中,并使用providers
映射或通过名称自动继承按名称将提供者配置传递到子模块中。
provider "kubernetes" {
# global kubernetes provider config
}
module "k8s-cassandra" {
# ...module arguments...
# provider "kubernetes" is automatically inherited by default, but you
# can also set it explicitly:
providers = {
"kubernetes" = "kubernetes"
}
}
Run Code Online (Sandbox Code Playgroud)
为了摆脱你已经遇到的冲突情况,答案是临时恢复module "k8s-cassandra"
块,然后在删除它之前销毁它管理的对象,使用-target
选项:
terraform destroy -target module.k8s-cassandra
Run Code Online (Sandbox Code Playgroud)
一旦该模块管理的所有对象都被销毁并从状态中删除,您就可以安全地module "k8s-cassandra"
从配置中删除该块。
为了防止这种情况再次发生,您应该在这里重新处理根和子模块,以便提供者配置都在根模块中,子模块只继承从根传入的提供者配置。有关更多信息,请参阅文档中的模块内提供程序。
归档时间: |
|
查看次数: |
9133 次 |
最近记录: |