4.8 KiB
Containerized CoreDNS on Container Optimized OS
This module manages a cloud-config
configuration that starts a containerized CoreDNS service on Container Optimized OS, using the official image.
The resulting cloud-config
can be customized in a number of ways:
- a custom CoreDNS configuration can be set using the
coredns_config
variable - additional files (eg for hosts or zone files) can be passed in via the
files
variable - a completely custom
cloud-config
can be passed in via thecloud_config
variable, and additional template variables can be passed in viaconfig_variables
The default instance configuration inserts iptables rules to allow traffic on the DNS TCP and UDP ports, and the 8080 port for the optional HTTP health check that can be enabled via the CoreDNS health plugin.
Logging and monitoring are enabled via the Google Cloud Logging driver configured for the CoreDNS container, and the Node Problem Detector service started by default on boot.
The module renders the generated cloud config in the cloud_config
output, to be used in instances or instance templates via the user-data
metadata.
For convenience during development or for simple use cases, the module can optionally manage a single instance via the test_instance
variable. If the instance is not needed the instance*tf
files can be safely removed. Refer to the top-level README for more details on the included instance.
Examples
Default CoreDNS configuration
This example will create a cloud-config
that uses the module's defaults, creating a simple DNS forwarder.
module "cos-coredns" {
source = "./modules/cloud-config-container/coredns"
}
# use it as metadata in a compute instance or template
resource "google_compute_instance" "default" {
metadata = {
user-data = module.cos-coredns.cloud_config
}
Custom CoreDNS configuration
This example will create a cloud-config
using a custom CoreDNS configuration, that leverages the CoreDNS hosts plugin to serve a single zone via an included hosts
format file.
module "cos-coredns" {
source = "./modules/cloud-config-container/coredns"
coredns_config = "./modules/cloud-config-container/coredns/Corefile-hosts"
files = {
"/etc/coredns/example.hosts" = {
content = "127.0.0.2 foo.example.org foo"
owner = null
permissions = "0644"
}
}
CoreDNS instance
This example shows how to create the single instance optionally managed by the module, providing all required attributes in the test_instance
variable. The instance is purposefully kept simple and should only be used in development, or when designing infrastructures.
module "cos-coredns" {
source = "./modules/cloud-config-container/coredns"
test_instance = {
project_id = "my-project"
zone = "europe-west1-b"
name = "cos-coredns"
type = "f1-micro"
network = "default"
subnetwork = "https://www.googleapis.com/compute/v1/projects/my-project/regions/europe-west1/subnetworks/my-subnet"
}
}
Variables
name | description | type | required | default |
---|---|---|---|---|
cloud_config | Cloud config template path. If null default will be used. | string |
null |
|
config_variables | Additional variables used to render the cloud-config and CoreDNS templates. | map(any) |
{} |
|
coredns_config | CoreDNS configuration path, if null default will be used. | string |
null |
|
file_defaults | Default owner and permissions for files. | object({…}) |
{…} |
|
files | Map of extra files to create on the instance, path as key. Owner and permissions will use defaults if null. | map(object({…})) |
{} |
Outputs
name | description | sensitive |
---|---|---|
cloud_config | Rendered cloud-config file to be passed as user-data instance metadata. |