Terraform AWS EKS kubectl 配置
Terraform AWS EKS kubectl configuration
我正在 AWS 云上部署 AWS Elastic Kubernetes 集群。从我的本地机器部署集群时,我遇到了一个小错误,即使我们不能确切地说这是一个错误。
因此,当我使用本地计算机上的 terraform 图表部署 eks 集群时,它会在 AWS 上部署所有基础设施要求,但是当它必须部署集群时,它需要通过 kubectl,但是 kubectl 没有配置新创建的集群,然后 terraform 抛出错误。
我通过使用以下命令将 kubectl 与新创建的集群绑定来轻松解决此错误,但我不想手动执行此操作,那么有没有什么方法可以用相同的方式配置 kubectl。
命令 - aws eks --region us-west-2 update-kubeconfig --name clustername
仅供参考 - 我正在使用 AWS CLI。
您可以使用 terraform local-exec provisioner。
resource "null_resource" "kubectl" {
depends_on = <CLUSTER_IS_READY>
provisioner "local-exec" {
command = "aws eks --region us-west-2 update-kubeconfig --name clustername"
}
}
}
您需要准备好一些东西:
- 对集群的依赖resource/module:awe_eks_cluster、terraform-aws-modules/eks/aws、等等
- 何时重新生成(在特定情况下 vs 总是 vs 从不,即只生成一次)
- 使用哪个 shell(bash 因为它最常见)
- 如果失败则错误退出(set -e)
- 等待集群准备就绪(aws eks 等待)
- 更新 kubeconfig
比如我用
resource "null_resource" "merge_kubeconfig" {
triggers = {
always = timestamp()
}
depends_on = [module.eks_cluster]
provisioner "local-exec" {
interpreter = ["/bin/bash", "-c"]
command = <<EOT
set -e
echo 'Applying Auth ConfigMap with kubectl...'
aws eks wait cluster-active --name '${local.cluster_name}'
aws eks update-kubeconfig --name '${local.cluster_name}' --alias '${local.cluster_name}-${var.region}' --region=${var.region}
EOT
}
}
请注意,有几件事可能导致 kubeconfig 需要重新合并,例如新证书、新用户等,这可能有点棘手。如果 terraform apply 是 运行,那么总是重新合并的成本是最小的,因此在时间戳上触发。根据需要进行调整,例如我看到过这样使用:
triggers = {
cluster_updated = join("", aws_eks_cluster.default.*.id)
worker_roles_updated = local.map_worker_roles_yaml
additional_roles_updated = local.map_additional_iam_roles_yaml
additional_users_updated = local.map_additional_iam_users_yaml
additional_aws_accounts_updated = local.map_additional_aws_accounts_yaml
configmap_auth_file_content_changed = join("", local_file.configmap_auth.*.content)
configmap_auth_file_id_changed = join("", local_file.configmap_auth.*.id)
}
我正在 AWS 云上部署 AWS Elastic Kubernetes 集群。从我的本地机器部署集群时,我遇到了一个小错误,即使我们不能确切地说这是一个错误。
因此,当我使用本地计算机上的 terraform 图表部署 eks 集群时,它会在 AWS 上部署所有基础设施要求,但是当它必须部署集群时,它需要通过 kubectl,但是 kubectl 没有配置新创建的集群,然后 terraform 抛出错误。
我通过使用以下命令将 kubectl 与新创建的集群绑定来轻松解决此错误,但我不想手动执行此操作,那么有没有什么方法可以用相同的方式配置 kubectl。
命令 - aws eks --region us-west-2 update-kubeconfig --name clustername
仅供参考 - 我正在使用 AWS CLI。
您可以使用 terraform local-exec provisioner。
resource "null_resource" "kubectl" {
depends_on = <CLUSTER_IS_READY>
provisioner "local-exec" {
command = "aws eks --region us-west-2 update-kubeconfig --name clustername"
}
}
}
您需要准备好一些东西:
- 对集群的依赖resource/module:awe_eks_cluster、terraform-aws-modules/eks/aws、等等
- 何时重新生成(在特定情况下 vs 总是 vs 从不,即只生成一次)
- 使用哪个 shell(bash 因为它最常见)
- 如果失败则错误退出(set -e)
- 等待集群准备就绪(aws eks 等待)
- 更新 kubeconfig
比如我用
resource "null_resource" "merge_kubeconfig" {
triggers = {
always = timestamp()
}
depends_on = [module.eks_cluster]
provisioner "local-exec" {
interpreter = ["/bin/bash", "-c"]
command = <<EOT
set -e
echo 'Applying Auth ConfigMap with kubectl...'
aws eks wait cluster-active --name '${local.cluster_name}'
aws eks update-kubeconfig --name '${local.cluster_name}' --alias '${local.cluster_name}-${var.region}' --region=${var.region}
EOT
}
}
请注意,有几件事可能导致 kubeconfig 需要重新合并,例如新证书、新用户等,这可能有点棘手。如果 terraform apply 是 运行,那么总是重新合并的成本是最小的,因此在时间戳上触发。根据需要进行调整,例如我看到过这样使用:
triggers = {
cluster_updated = join("", aws_eks_cluster.default.*.id)
worker_roles_updated = local.map_worker_roles_yaml
additional_roles_updated = local.map_additional_iam_roles_yaml
additional_users_updated = local.map_additional_iam_users_yaml
additional_aws_accounts_updated = local.map_additional_aws_accounts_yaml
configmap_auth_file_content_changed = join("", local_file.configmap_auth.*.content)
configmap_auth_file_id_changed = join("", local_file.configmap_auth.*.id)
}