From 5ac384ee93d35515f4200d927632537a95fd7986 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Tue, 2 Jul 2019 18:04:50 -0400 Subject: [PATCH 01/14] Add upgrading to v3.0 guide --- docs/upgrading_to_v3.0.md | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 docs/upgrading_to_v3.0.md diff --git a/docs/upgrading_to_v3.0.md b/docs/upgrading_to_v3.0.md new file mode 100644 index 0000000000..6874f9c780 --- /dev/null +++ b/docs/upgrading_to_v3.0.md @@ -0,0 +1,58 @@ +# Upgrading to v3.0 + +The v3.0 release of *kubernetes-engine* is a backwards incompatible +release. + +## Migration Instructions + +### Beta Features + +Beta features are enabled on the `beta-public-cluster` +submodule and the `beta-private-cluster` submodule. + +To migrate from the root module to the `beta-public-cluster` submodule, +update a Terraform configuration like the following example: + +```diff +module "kubernetes_engine_private_cluster" { +- source = "terraform-google-modules/kubernetes-engine/google" ++ source = "terraform-google-modules/kubernetes-engine/google//modules/beta-public-cluster" +- version = "~> 2.0" ++ version = "~> 3.0" + + # ... +``` + +To migrate from the old `private-cluster` submodule to the new +`beta-private-cluster` submodule, update a Terraform configuration +like the following example: + +```diff +module "kubernetes_engine_private_cluster" { +- source = "terraform-google-modules/kubernetes-engine/google//modules/private-cluster" ++ source = "terraform-google-modules/kubernetes-engine/google//modules/beta-private-cluster" +- version = "~> 2.0" ++ version = "~> 3.0" + + # ... +} +``` + +### IP Masqeurade + +In previous versions of this module, IP Masquerade was enabled if the +network policy addon was enabled. IP Masquerade is now managed by an +explicit toggle. To continue using IP Masquerade, update a Terraform +configuration like the following example: + +```diff +module "kubernetes_engine_private_cluster" { + source = "terraform-google-modules/kubernetes-engine/google" +- version = "~> 2.0" ++ version = "~> 3.0" + ++ configure_ip_masq = "true" + # ... +} +``` + From fffd21c440b49290889b9d9473301b7663e91729 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Tue, 2 Jul 2019 18:07:34 -0400 Subject: [PATCH 02/14] [skip ci] Add CHANGELOG entry for 3.0.0 --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f8b1fd3b0..8a62d3ebc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ Extending the adopted spec, each change should have a link to its corresponding ## [Unreleased] +## [v3.0.0] - 2019-07-ZZ + ### Added * Add configuration flag for enable BinAuthZ Admission controller [#160] [#188] @@ -131,7 +133,8 @@ Extending the adopted spec, each change should have a link to its corresponding * Initial release of module. -[Unreleased]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.1.0...HEAD +[Unreleased]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v3.0.0...HEAD +[v3.0.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.1.0...v3.0.0 [v2.1.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.0.1...v2.1.0 [v2.0.1]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.0.0...v2.0.1 [v2.0.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v1.0.1...v2.0.0 From 5e2b268516699b0f809ce8bb8be191816fd9e020 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Tue, 2 Jul 2019 18:11:11 -0400 Subject: [PATCH 03/14] [skip ci] Adjust spacing in diff examples --- docs/upgrading_to_v3.0.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/upgrading_to_v3.0.md b/docs/upgrading_to_v3.0.md index 6874f9c780..8e19003f05 100644 --- a/docs/upgrading_to_v3.0.md +++ b/docs/upgrading_to_v3.0.md @@ -14,13 +14,14 @@ To migrate from the root module to the `beta-public-cluster` submodule, update a Terraform configuration like the following example: ```diff -module "kubernetes_engine_private_cluster" { + module "kubernetes_engine_private_cluster" { - source = "terraform-google-modules/kubernetes-engine/google" + source = "terraform-google-modules/kubernetes-engine/google//modules/beta-public-cluster" - version = "~> 2.0" + version = "~> 3.0" - # ... + # ... + } ``` To migrate from the old `private-cluster` submodule to the new @@ -28,14 +29,14 @@ To migrate from the old `private-cluster` submodule to the new like the following example: ```diff -module "kubernetes_engine_private_cluster" { + module "kubernetes_engine_private_cluster" { - source = "terraform-google-modules/kubernetes-engine/google//modules/private-cluster" + source = "terraform-google-modules/kubernetes-engine/google//modules/beta-private-cluster" - version = "~> 2.0" + version = "~> 3.0" - # ... -} + # ... + } ``` ### IP Masqeurade @@ -46,13 +47,13 @@ explicit toggle. To continue using IP Masquerade, update a Terraform configuration like the following example: ```diff -module "kubernetes_engine_private_cluster" { - source = "terraform-google-modules/kubernetes-engine/google" + module "kubernetes_engine_private_cluster" { + source = "terraform-google-modules/kubernetes-engine/google" - version = "~> 2.0" + version = "~> 3.0" + configure_ip_masq = "true" - # ... -} + # ... + } ``` From c4245031032e151f5de2e5f0d5687c7dbb597679 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Thu, 4 Jul 2019 11:39:41 -0400 Subject: [PATCH 04/14] Add CHANGELOG entry for #203 --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a62d3ebc5..892087843a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ Extending the adopted spec, each change should have a link to its corresponding * Support to scale the default node cluster. [#149] * Support for configuring the network policy provider. [#159] * Support for database encryption. [#165] -* Submodules for public and private clusters with beta features. [#124] [#188] +* Submodules for public and private clusters with beta features. [#124] [#188] [#203] * Support for configuring cluster IPv4 CIDRs. [#193] * Support for configuring IP Masquerade. [#187] * Support for v2.9 of the Google providers. [#198] @@ -145,6 +145,7 @@ Extending the adopted spec, each change should have a link to its corresponding [v0.3.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.2.0...v0.3.0 [v0.2.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.1.0...v0.2.0 +[#203]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/203 [#198]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/198 [#197]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/197 [#193]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/193 From b0d96536a7337eddacec215cbe08b1e49f0cfd3b Mon Sep 17 00:00:00 2001 From: Marko Vlahovic Date: Fri, 5 Jul 2019 16:03:13 -0700 Subject: [PATCH 05/14] Adding support for upstream_nameservers --- .kitchen.yml | 14 +++ README.md | 1 + autogen/dns.tf | 49 +++++++++- autogen/main.tf | 1 + autogen/variables.tf | 6 ++ dns.tf | 49 +++++++++- examples/stub_domains_private/main.tf | 2 +- .../README.md | 50 ++++++++++ .../stub_domains_upstream_nameservers/main.tf | 60 ++++++++++++ .../outputs.tf | 34 +++++++ .../test_outputs.tf | 63 +++++++++++++ .../variables.tf | 48 ++++++++++ examples/upstream_nameservers/README.md | 50 ++++++++++ examples/upstream_nameservers/main.tf | 47 ++++++++++ examples/upstream_nameservers/outputs.tf | 34 +++++++ examples/upstream_nameservers/test_outputs.tf | 63 +++++++++++++ examples/upstream_nameservers/variables.tf | 48 ++++++++++ main.tf | 1 + modules/beta-private-cluster/README.md | 1 + modules/beta-private-cluster/dns.tf | 49 +++++++++- modules/beta-private-cluster/main.tf | 1 + modules/beta-private-cluster/variables.tf | 6 ++ modules/beta-public-cluster/README.md | 1 + modules/beta-public-cluster/dns.tf | 49 +++++++++- modules/beta-public-cluster/main.tf | 1 + modules/beta-public-cluster/variables.tf | 6 ++ modules/private-cluster/README.md | 1 + modules/private-cluster/dns.tf | 49 +++++++++- modules/private-cluster/main.tf | 1 + modules/private-cluster/variables.tf | 6 ++ .../stub_domains_private/terraform.tfvars | 1 + .../example.tf | 28 ++++++ .../network.tf | 47 ++++++++++ .../outputs.tf | 1 + .../terraform.tfvars | 1 + .../variables.tf | 1 + test/fixtures/upstream_nameservers/example.tf | 28 ++++++ test/fixtures/upstream_nameservers/network.tf | 47 ++++++++++ test/fixtures/upstream_nameservers/outputs.tf | 1 + .../upstream_nameservers/terraform.tfvars | 1 + .../upstream_nameservers/variables.tf | 1 + .../controls/gcloud.rb | 50 ++++++++++ .../controls/kubectl.rb | 92 +++++++++++++++++++ .../inspec.yml | 20 ++++ .../upstream_nameservers/controls/gcloud.rb | 50 ++++++++++ .../upstream_nameservers/controls/kubectl.rb | 79 ++++++++++++++++ .../upstream_nameservers/inspec.yml | 20 ++++ variables.tf | 6 ++ 48 files changed, 1254 insertions(+), 11 deletions(-) create mode 100644 examples/stub_domains_upstream_nameservers/README.md create mode 100644 examples/stub_domains_upstream_nameservers/main.tf create mode 100644 examples/stub_domains_upstream_nameservers/outputs.tf create mode 100644 examples/stub_domains_upstream_nameservers/test_outputs.tf create mode 100644 examples/stub_domains_upstream_nameservers/variables.tf create mode 100644 examples/upstream_nameservers/README.md create mode 100644 examples/upstream_nameservers/main.tf create mode 100644 examples/upstream_nameservers/outputs.tf create mode 100644 examples/upstream_nameservers/test_outputs.tf create mode 100644 examples/upstream_nameservers/variables.tf create mode 120000 test/fixtures/stub_domains_private/terraform.tfvars create mode 100644 test/fixtures/stub_domains_upstream_nameservers/example.tf create mode 100644 test/fixtures/stub_domains_upstream_nameservers/network.tf create mode 120000 test/fixtures/stub_domains_upstream_nameservers/outputs.tf create mode 120000 test/fixtures/stub_domains_upstream_nameservers/terraform.tfvars create mode 120000 test/fixtures/stub_domains_upstream_nameservers/variables.tf create mode 100644 test/fixtures/upstream_nameservers/example.tf create mode 100644 test/fixtures/upstream_nameservers/network.tf create mode 120000 test/fixtures/upstream_nameservers/outputs.tf create mode 120000 test/fixtures/upstream_nameservers/terraform.tfvars create mode 120000 test/fixtures/upstream_nameservers/variables.tf create mode 100644 test/integration/stub_domains_upstream_nameservers/controls/gcloud.rb create mode 100644 test/integration/stub_domains_upstream_nameservers/controls/kubectl.rb create mode 100644 test/integration/stub_domains_upstream_nameservers/inspec.yml create mode 100644 test/integration/upstream_nameservers/controls/gcloud.rb create mode 100644 test/integration/upstream_nameservers/controls/kubectl.rb create mode 100644 test/integration/upstream_nameservers/inspec.yml diff --git a/.kitchen.yml b/.kitchen.yml index da159806dc..6bf414c21f 100644 --- a/.kitchen.yml +++ b/.kitchen.yml @@ -104,6 +104,20 @@ suites: systems: - name: stub_domains_private backend: local + - name: "upstream_nameservers" + driver: + root_module_directory: test/fixtures/upstream_nameservers + verifier: + systems: + - name: upstream_nameservers + backend: local + - name: "stub_domains_upstream_nameservers" + driver: + root_module_directory: test/fixtures/stub_domains_upstream_nameservers + verifier: + systems: + - name: stub_domains_upstream_nameservers + backend: local - name: "workload_metadata_config" driver: root_module_directory: test/fixtures/workload_metadata_config diff --git a/README.md b/README.md index 1d068e03ab..c3ec7bc284 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ In either case, upgrading to module version `v1.0.0` will trigger a recreation o | service\_account | The service account to run nodes as if not overridden in `node_pools`. The default value will cause a cluster-specific service account to be created. | string | `"create"` | no | | stub\_domains | Map of stub domains and their resolvers to forward DNS queries for a certain domain to an external DNS server | map | `` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs diff --git a/autogen/dns.tf b/autogen/dns.tf index 1b0d83eb23..43f1a24a2e 100644 --- a/autogen/dns.tf +++ b/autogen/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,48 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = <` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs diff --git a/modules/beta-private-cluster/dns.tf b/modules/beta-private-cluster/dns.tf index 25effe580a..1cd73830bc 100644 --- a/modules/beta-private-cluster/dns.tf +++ b/modules/beta-private-cluster/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,48 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = <` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs diff --git a/modules/beta-public-cluster/dns.tf b/modules/beta-public-cluster/dns.tf index 25effe580a..1cd73830bc 100644 --- a/modules/beta-public-cluster/dns.tf +++ b/modules/beta-public-cluster/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,48 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = <` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs diff --git a/modules/private-cluster/dns.tf b/modules/private-cluster/dns.tf index 25effe580a..1cd73830bc 100644 --- a/modules/private-cluster/dns.tf +++ b/modules/private-cluster/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,48 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = < {}, + "httpLoadBalancing" => {}, + "kubernetesDashboard" => { + "disabled" => true, + }, + "networkPolicyConfig" => {}, + }) + end + end + end +end diff --git a/test/integration/stub_domains_upstream_nameservers/controls/kubectl.rb b/test/integration/stub_domains_upstream_nameservers/controls/kubectl.rb new file mode 100644 index 0000000000..5223cbd2d4 --- /dev/null +++ b/test/integration/stub_domains_upstream_nameservers/controls/kubectl.rb @@ -0,0 +1,92 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'kubeclient' +require 'rest-client' + +require 'base64' + +kubernetes_endpoint = attribute('kubernetes_endpoint') +client_token = attribute('client_token') +ca_certificate = attribute('ca_certificate') + +control "kubectl" do + title "Kubernetes configuration" + + describe "kubernetes" do + let(:kubernetes_http_endpoint) { "https://#{kubernetes_endpoint}/api" } + let(:client) do + cert_store = OpenSSL::X509::Store.new + cert_store.add_cert(OpenSSL::X509::Certificate.new(Base64.decode64(ca_certificate))) + Kubeclient::Client.new( + kubernetes_http_endpoint, + "v1", + ssl_options: { + cert_store: cert_store, + verify_ssl: OpenSSL::SSL::VERIFY_PEER, + }, + auth_options: { + bearer_token: Base64.decode64(client_token), + }, + ) + end + + describe "configmap" do + describe "kube-dns" do + let(:kubedns_configmap) { client.get_config_map("kube-dns", "kube-system") } + + it "is created by Terraform" do + expect(kubedns_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "reflects the stub_domains configuration" do + expect(JSON.parse(kubedns_configmap.data.stubDomains)).to eq({ + "example.com" => [ + "10.254.154.11", + "10.254.154.12", + ], + "example.net" => [ + "10.254.154.11", + "10.254.154.12", + ], + }) + end + + it "reflects the upstream_nameservers configuration" do + expect(JSON.parse(kubedns_configmap.data.upstreamNameservers)).to eq(["8.8.8.8", "8.8.4.4"]) + end + end + + describe "ipmasq" do + let(:ipmasq_configmap) { client.get_config_map("ip-masq-agent", "kube-system") } + + it "is created by Terraform" do + expect(ipmasq_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "is configured properly" do + expect(YAML.load(ipmasq_configmap.data.config)).to eq({ + "nonMasqueradeCIDRs" => [ + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", + ], + "resyncInterval" => "60s", + "masqLinkLocal" => false, + }) + end + end + end + end +end diff --git a/test/integration/stub_domains_upstream_nameservers/inspec.yml b/test/integration/stub_domains_upstream_nameservers/inspec.yml new file mode 100644 index 0000000000..a14a4d1bd7 --- /dev/null +++ b/test/integration/stub_domains_upstream_nameservers/inspec.yml @@ -0,0 +1,20 @@ +name: stub_domains_upstream_nameservers +attributes: + - name: project_id + required: true + type: string + - name: location + required: true + type: string + - name: cluster_name + required: true + type: string + - name: kubernetes_endpoint + required: true + type: string + - name: client_token + required: true + type: string + - name: ca_certificate + required: true + type: string diff --git a/test/integration/upstream_nameservers/controls/gcloud.rb b/test/integration/upstream_nameservers/controls/gcloud.rb new file mode 100644 index 0000000000..03612e151e --- /dev/null +++ b/test/integration/upstream_nameservers/controls/gcloud.rb @@ -0,0 +1,50 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +project_id = attribute('project_id') +location = attribute('location') +cluster_name = attribute('cluster_name') + +control "gcloud" do + title "Google Compute Engine GKE configuration" + describe command("gcloud --project=#{project_id} container clusters --zone=#{location} describe #{cluster_name} --format=json") do + its(:exit_status) { should eq 0 } + its(:stderr) { should eq '' } + + let!(:data) do + if subject.exit_status == 0 + JSON.parse(subject.stdout) + else + {} + end + end + + describe "cluster" do + it "is running" do + expect(data['status']).to eq 'RUNNING' + end + + it "has the expected addon settings" do + expect(data['addonsConfig']).to eq({ + "horizontalPodAutoscaling" => {}, + "httpLoadBalancing" => {}, + "kubernetesDashboard" => { + "disabled" => true, + }, + "networkPolicyConfig" => {}, + }) + end + end + end +end diff --git a/test/integration/upstream_nameservers/controls/kubectl.rb b/test/integration/upstream_nameservers/controls/kubectl.rb new file mode 100644 index 0000000000..36612a02aa --- /dev/null +++ b/test/integration/upstream_nameservers/controls/kubectl.rb @@ -0,0 +1,79 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'kubeclient' +require 'rest-client' + +require 'base64' + +kubernetes_endpoint = attribute('kubernetes_endpoint') +client_token = attribute('client_token') +ca_certificate = attribute('ca_certificate') + +control "kubectl" do + title "Kubernetes configuration" + + describe "kubernetes" do + let(:kubernetes_http_endpoint) { "https://#{kubernetes_endpoint}/api" } + let(:client) do + cert_store = OpenSSL::X509::Store.new + cert_store.add_cert(OpenSSL::X509::Certificate.new(Base64.decode64(ca_certificate))) + Kubeclient::Client.new( + kubernetes_http_endpoint, + "v1", + ssl_options: { + cert_store: cert_store, + verify_ssl: OpenSSL::SSL::VERIFY_PEER, + }, + auth_options: { + bearer_token: Base64.decode64(client_token), + }, + ) + end + + describe "configmap" do + describe "kube-dns" do + let(:kubedns_configmap) { client.get_config_map("kube-dns", "kube-system") } + + it "is created by Terraform" do + expect(kubedns_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "reflects the upstream_nameservers configuration" do + expect(JSON.parse(kubedns_configmap.data.upstreamNameservers)).to eq(["8.8.8.8", "8.8.4.4"]) + end + end + + describe "ipmasq" do + let(:ipmasq_configmap) { client.get_config_map("ip-masq-agent", "kube-system") } + + it "is created by Terraform" do + expect(ipmasq_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "is configured properly" do + expect(YAML.load(ipmasq_configmap.data.config)).to eq({ + "nonMasqueradeCIDRs" => [ + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", + ], + "resyncInterval" => "60s", + "masqLinkLocal" => false, + }) + end + end + end + end +end diff --git a/test/integration/upstream_nameservers/inspec.yml b/test/integration/upstream_nameservers/inspec.yml new file mode 100644 index 0000000000..dd51197410 --- /dev/null +++ b/test/integration/upstream_nameservers/inspec.yml @@ -0,0 +1,20 @@ +name: upstream_nameservers +attributes: + - name: project_id + required: true + type: string + - name: location + required: true + type: string + - name: cluster_name + required: true + type: string + - name: kubernetes_endpoint + required: true + type: string + - name: client_token + required: true + type: string + - name: ca_certificate + required: true + type: string diff --git a/variables.tf b/variables.tf index a4630b3102..acf9e8e006 100644 --- a/variables.tf +++ b/variables.tf @@ -206,6 +206,12 @@ variable "stub_domains" { default = {} } +variable "upstream_nameservers" { + type = "list" + description = "If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf" + default = [] +} + variable "non_masquerade_cidrs" { type = "list" description = "List of strings in CIDR notation that specify the IP address ranges that do not use IP masquerading." From c77334c3a4c43734a8d9fbf4773bbafcf6867e70 Mon Sep 17 00:00:00 2001 From: Marko Vlahovic Date: Fri, 5 Jul 2019 16:47:57 -0700 Subject: [PATCH 06/14] Adding tests to ci --- test/ci/stub-domains-upstream-nameservers.yml | 18 ++++++++++++++++++ test/ci/upstream-nameservers.yml | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 test/ci/stub-domains-upstream-nameservers.yml create mode 100644 test/ci/upstream-nameservers.yml diff --git a/test/ci/stub-domains-upstream-nameservers.yml b/test/ci/stub-domains-upstream-nameservers.yml new file mode 100644 index 0000000000..4015338278 --- /dev/null +++ b/test/ci/stub-domains-upstream-nameservers.yml @@ -0,0 +1,18 @@ +--- + +platform: linux + +inputs: +- name: pull-request + path: terraform-google-kubernetes-engine + +run: + path: make + args: ['test_integration'] + dir: terraform-google-kubernetes-engine + +params: + SUITE: "stub-domains-upstream-nameservers-local" + COMPUTE_ENGINE_SERVICE_ACCOUNT: "" + REGION: "us-east4" + ZONES: '["us-east4-a", "us-east4-b", "us-east4-c"]' diff --git a/test/ci/upstream-nameservers.yml b/test/ci/upstream-nameservers.yml new file mode 100644 index 0000000000..987884010a --- /dev/null +++ b/test/ci/upstream-nameservers.yml @@ -0,0 +1,18 @@ +--- + +platform: linux + +inputs: +- name: pull-request + path: terraform-google-kubernetes-engine + +run: + path: make + args: ['test_integration'] + dir: terraform-google-kubernetes-engine + +params: + SUITE: "upstream-nameservers-local" + COMPUTE_ENGINE_SERVICE_ACCOUNT: "" + REGION: "us-east4" + ZONES: '["us-east4-a", "us-east4-b", "us-east4-c"]' From 7d379796e892cbd1636be71344dba000fa67711f Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Mon, 8 Jul 2019 15:11:32 -0400 Subject: [PATCH 07/14] [skip ci] Add CHANGELOG entry for #207 --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 892087843a..da9cd5610c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Extending the adopted spec, each change should have a link to its corresponding * Support for configuring cluster IPv4 CIDRs. [#193] * Support for configuring IP Masquerade. [#187] * Support for v2.9 of the Google providers. [#198] +* Support for upstreamNameservers. [#207] ### Fixed @@ -145,6 +146,7 @@ Extending the adopted spec, each change should have a link to its corresponding [v0.3.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.2.0...v0.3.0 [v0.2.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.1.0...v0.2.0 +[#207]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/207 [#203]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/203 [#198]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/198 [#197]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/197 From c4458cd96bd77b4828cc69b82649fe5d7e29b8bb Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Mon, 8 Jul 2019 15:17:15 -0400 Subject: [PATCH 08/14] [skip ci] Remove deprecated versions from README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3ec7bc284..2fbe870b62 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ The [project factory](https://github.com/terraform-google-modules/terraform-goog - [kubectl](https://github.com/kubernetes/kubernetes/releases) 1.9.x #### Terraform and Plugins - [Terraform](https://www.terraform.io/downloads.html) 0.11.x -- [terraform-provider-google](https://github.com/terraform-providers/terraform-provider-google) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP][terraform-provider-google] v2.9 ### Configure a Service Account In order to execute this module you must have a Service Account with the From 46e50959b28c10936970b540f637dc499931f328 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Mon, 8 Jul 2019 15:19:44 -0400 Subject: [PATCH 09/14] [skip ci] Adjust CHANGELOG entry for #198 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da9cd5610c..857b6ad5e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,8 +26,8 @@ Extending the adopted spec, each change should have a link to its corresponding ### Fixed -* Dropped support for v2.7 of the Google providers; these versions were - incompatible with the guest accelerator. [#198] +* Dropped support for versions of the Google provider earlier than v2.9; these versions multiple + incompatibilities with the module. [#198] ## [v2.1.0] - 2019-05-30 From b9174dc2eeb97117d09853eaf38eb89148b5b468 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Mon, 8 Jul 2019 15:20:11 -0400 Subject: [PATCH 10/14] [skip ci] Set release date for v3.0.0 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 857b6ad5e7..2f1269c5f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ Extending the adopted spec, each change should have a link to its corresponding ## [Unreleased] -## [v3.0.0] - 2019-07-ZZ +## [v3.0.0] - 2019-07-08 ### Added From 44fb2f61d981035495032b67ecfbc01b344f97ee Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Mon, 8 Jul 2019 15:39:43 -0400 Subject: [PATCH 11/14] Backport provider doc update to README template --- autogen/README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/autogen/README.md b/autogen/README.md index 53b7d4b615..34e1f5f4d6 100644 --- a/autogen/README.md +++ b/autogen/README.md @@ -142,9 +142,9 @@ The [project factory](https://github.com/terraform-google-modules/terraform-goog #### Terraform and Plugins - [Terraform](https://www.terraform.io/downloads.html) 0.11.x {% if private_cluster or beta_cluster %} -- [terraform-provider-google-beta](https://github.com/terraform-providers/terraform-provider-google-beta) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP Beta][terraform-provider-google-beta] v2.9 {% else %} -- [terraform-provider-google](https://github.com/terraform-providers/terraform-provider-google) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP][terraform-provider-google] v2.9 {% endif %} ### Configure a Service Account @@ -317,3 +317,8 @@ command. {% else %} [upgrading-to-v2.0]: docs/upgrading_to_v2.0.md {% endif %} +{% if private_cluster or beta_cluster %} +[terraform-provider-google-beta]: https://github.com/terraform-providers/terraform-provider-google-beta +{% else %} +[terraform-provider-google]: https://github.com/terraform-providers/terraform-provider-google +{% endif %} From 7cb8a00be55605345dd07e1b30ef01483450f890 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Mon, 8 Jul 2019 15:40:11 -0400 Subject: [PATCH 12/14] Add reference to README of v3.0 upgrade guide --- autogen/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/autogen/README.md b/autogen/README.md index 34e1f5f4d6..e43b896ede 100644 --- a/autogen/README.md +++ b/autogen/README.md @@ -111,6 +111,11 @@ Then perform the following commands on the root folder: - `terraform apply` to apply the infrastructure build - `terraform destroy` to destroy the built infrastructure +## Upgrade to v3.0.0 + +v3.0.0 is a breaking release. Refer to the +[Upgrading to v3.0 guide][upgrading-to-v3.0] for details. + ## Upgrade to v2.0.0 v2.0.0 is a breaking release. Refer to the @@ -318,6 +323,11 @@ command. [upgrading-to-v2.0]: docs/upgrading_to_v2.0.md {% endif %} {% if private_cluster or beta_cluster %} +[upgrading-to-v3.0]: ../../docs/upgrading_to_v3.0.md +{% else %} +[upgrading-to-v3.0]: docs/upgrading_to_v3.0.md +{% endif %} +{% if private_cluster or beta_cluster %} [terraform-provider-google-beta]: https://github.com/terraform-providers/terraform-provider-google-beta {% else %} [terraform-provider-google]: https://github.com/terraform-providers/terraform-provider-google From 15f8e40a4e43dde9af8365bee851bc95e1833ef6 Mon Sep 17 00:00:00 2001 From: Aaron Lane Date: Mon, 8 Jul 2019 15:51:14 -0400 Subject: [PATCH 13/14] Fix permanent diff with generate and fmt --- autogen/cluster_regional.tf | 1 + autogen/cluster_zonal.tf | 7 ++++--- autogen/dns.tf | 1 + autogen/main.tf | 5 ++--- autogen/outputs.tf | 1 + 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/autogen/cluster_regional.tf b/autogen/cluster_regional.tf index 847d2808fe..6dcd2e01ed 100644 --- a/autogen/cluster_regional.tf +++ b/autogen/cluster_regional.tf @@ -107,6 +107,7 @@ resource "google_container_cluster" "primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" {% if beta_cluster %} + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" {% endif %} } diff --git a/autogen/cluster_zonal.tf b/autogen/cluster_zonal.tf index c03c57a0f8..24ed5671e6 100644 --- a/autogen/cluster_zonal.tf +++ b/autogen/cluster_zonal.tf @@ -39,10 +39,10 @@ resource "google_container_cluster" "zonal_primary" { monitoring_service = "${var.monitoring_service}" {% if beta_cluster %} - enable_binary_authorization = "${var.enable_binary_authorization}" - pod_security_policy_config = "${var.pod_security_policy_config}" - {% endif %} + enable_binary_authorization = "${var.enable_binary_authorization}" + pod_security_policy_config = "${var.pod_security_policy_config}" + {% endif %} master_authorized_networks_config = ["${var.master_authorized_networks_config}"] master_auth { @@ -108,6 +108,7 @@ resource "google_container_cluster" "zonal_primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" {% if beta_cluster %} + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" {% endif %} } diff --git a/autogen/dns.tf b/autogen/dns.tf index 43f1a24a2e..24a3f34844 100644 --- a/autogen/dns.tf +++ b/autogen/dns.tf @@ -90,6 +90,7 @@ resource "kubernetes_config_map" "kube-dns-upstream-nameservers-and-stub-domains upstreamNameservers = < Date: Mon, 8 Jul 2019 15:52:22 -0400 Subject: [PATCH 14/14] Regenerate modules --- README.md | 7 +++++++ cluster_zonal.tf | 1 - dns.tf | 1 + modules/beta-private-cluster/README.md | 9 ++++++++- modules/beta-private-cluster/cluster_regional.tf | 1 + modules/beta-private-cluster/cluster_zonal.tf | 5 +++-- modules/beta-private-cluster/dns.tf | 1 + modules/beta-private-cluster/main.tf | 4 ++-- modules/beta-private-cluster/outputs.tf | 1 + modules/beta-public-cluster/README.md | 9 ++++++++- modules/beta-public-cluster/cluster_regional.tf | 1 + modules/beta-public-cluster/cluster_zonal.tf | 5 +++-- modules/beta-public-cluster/dns.tf | 1 + modules/beta-public-cluster/main.tf | 4 ++-- modules/beta-public-cluster/outputs.tf | 1 + modules/private-cluster/README.md | 9 ++++++++- modules/private-cluster/cluster_zonal.tf | 1 - modules/private-cluster/dns.tf | 1 + 18 files changed, 49 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 2fbe870b62..f175e8d507 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,11 @@ Then perform the following commands on the root folder: - `terraform apply` to apply the infrastructure build - `terraform destroy` to destroy the built infrastructure +## Upgrade to v3.0.0 + +v3.0.0 is a breaking release. Refer to the +[Upgrading to v3.0 guide][upgrading-to-v3.0] for details. + ## Upgrade to v2.0.0 v2.0.0 is a breaking release. Refer to the @@ -367,3 +372,5 @@ command. * Dockerfiles - hadolint. Can be found in homebrew [upgrading-to-v2.0]: docs/upgrading_to_v2.0.md +[upgrading-to-v3.0]: docs/upgrading_to_v3.0.md +[terraform-provider-google]: https://github.com/terraform-providers/terraform-provider-google diff --git a/cluster_zonal.tf b/cluster_zonal.tf index 8b4eb7cc5a..466b81634d 100644 --- a/cluster_zonal.tf +++ b/cluster_zonal.tf @@ -38,7 +38,6 @@ resource "google_container_cluster" "zonal_primary" { logging_service = "${var.logging_service}" monitoring_service = "${var.monitoring_service}" - master_authorized_networks_config = ["${var.master_authorized_networks_config}"] master_auth { diff --git a/dns.tf b/dns.tf index 1cd73830bc..91b41efac4 100644 --- a/dns.tf +++ b/dns.tf @@ -90,6 +90,7 @@ resource "kubernetes_config_map" "kube-dns-upstream-nameservers-and-stub-domains upstreamNameservers = <