使用 Terraform 和 Kubernetes 部署时如何修改 Docker 容器中的文件?

Ant*_*ton 4 docker kubernetes terraform

作为更大模块的一部分,我想部署一个nginx容器并替换其默认的nginx.conf. 新配置应使用部署时生成的Terraform资源数据来构建。有办法做到吗?

Ant*_*ton 5

我设法按照以下步骤将标准 nginx.conf 替换为动态生成的:

  1. 创建带有动态数据占位符的模板配置文件
  2. 使用 Terraform 的数据源解析文件template_file
  3. 将解析后的数据存储在 ConfigMap 中,并将该映射挂载为 Nginx 容器的卷

一步步:

创建名为nginx-conf.tpl的 nginx.conf 模板:

events {
  worker_connections  4096;  ## Default: 1024
}
http {
  server {
    listen 80;
    listen [::]:80;

    server_name ${server_name};

    location /_plugin/kibana {
        proxy_pass https://${elasticsearch_kibana_endpoint};
    }
    location / {
        proxy_pass https://${elasticsearch_endpoint};
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用以下 Terraform 代码解析nginx-conf.tpl模板:

data "template_file" "nginx" {
  template = "${file("${path.module}/nginx-conf.tpl")}"
  vars = {
    elasticsearch_endpoint        = "${aws_elasticsearch_domain.example-name.endpoint}"
    elasticsearch_kibana_endpoint = "${aws_elasticsearch_domain.example-name.kibana_endpoint}"
    server_name                   = "${var.server_name}"
  }
}
Run Code Online (Sandbox Code Playgroud)

创建一个 ConfigMap 并将解析后的模板与nginx.confkey 一起存储在其中:

resource "kubernetes_config_map" "nginx" {
  metadata {
    name = "nginx"
  }
  data = {
    "nginx.conf" = data.template_file.nginx.rendered
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,将 ConfigMap 键挂载为容器卷:

# ...
spec {
  # ...
  container {
    # ...
    volume_mount {
      name       = "nginx-conf"
      mount_path = "/etc/nginx"
    }
  }
  volume {
    name = "nginx-conf"
    config_map {
      name = "nginx"
      items {
        key  = "nginx.conf"
        path = "nginx.conf"
      }
    }
  }
}
# ...
Run Code Online (Sandbox Code Playgroud)

就是这样。Nginx 服务器将开始使用提供的配置。

有用的链接:Kubernetes ConfigMap 作为卷Terraform Temple_file 数据源文档