我使用稍微自定义的Terraform配置在AWS上生成我的Kubernetes群集。配置包括连接到群集节点和主节点的EFS实例。为了让Kubernetes将这个EFS实例用于卷,我的Kubernetes YAML需要Terraform生成的EFS实例的id和endpoint / domain。
目前,我的Terraform输出EFS ID和DNS名称,我需要在terraform apply
之后和kubectl apply
YAML之前使用这些值手动编辑我的Kubernetes YAML。
如何自动将这些Terraform输出值传递给Kubernetes?
答案 0 :(得分:0)
我不知道yaml在AWS中设置Kubernetes集群的意思。但是,我总是使用kops设置我的AWS群集。另外,我不明白为什么要将EFS挂载到主节点和/或节点而不是容器。
但是直接回答你的问题:你可以编写一个脚本来输出你的Terraform输出到Helm值文件,然后用它来生成k8s配置。
我在寻找一种方法将TF输出发送到Kubernetes中指定的envvars时偶然发现了这个问题,我希望有更多人这样做。我也怀疑这也是你的问题,或者至少它可以解决你的问题。所以:
您可以使用Kubernetes Terraform provider连接到群集,然后使用kubernetes_config_map
资源创建配置映射。
provider "kubernetes" {}
resource "kubernetes_config_map" "efs_configmap" {
"metadata" {
name = "efs_config" // this will be the name of your configmap
}
data {
efs_id = "${aws_efs_mount_target.efs_mt.0.id}"
efs_dns = "${aws_efs_mount_target.efs_mt.0.dns_name}"
}
}
如果您有秘密参数,请使用kubernetes_secret
资源:
resource "kubernetes_secret" "some_secrets" {
"metadata" {
name = "some_secrets"
}
data {
s3_iam_access_secret = "${aws_iam_access_key.someresourcename.secret}"
rds_password = "${aws_db_instance.someresourcename.password}"
}
}
您可以在设置环境时consume these in your k8s yaml:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: some-app-deployment
spec:
selector:
matchLabels:
app: some
template:
metadata:
labels:
app: some
spec:
containers:
- name: some-app-container
image: some-app-image
env:
- name: EFS_ID
valueFrom:
configMapKeyRef:
name: efs_config
key: efs_id
- name: RDS_PASSWORD
valueFrom:
secretKeyRef:
name: some_secrets
key: rds_password