From 7d93d32896fbab1c03dac9503773c0c2d8aec18c Mon Sep 17 00:00:00 2001 From: "Thomas S. Pangborn" Date: Tue, 18 May 2021 09:08:53 -0400 Subject: [PATCH] Initial release --- .gitignore | 10 + CONTRIBUTING.md | 19 + ContributorAgreement.txt | 56 +++ Dockerfile | 22 + LICENSE | 201 ++++++++ README.md | 99 ++++ docker-entrypoint.sh | 8 + docs/CONFIG-VARS.md | 242 ++++++++++ docs/Troubleshooting.md | 15 + docs/images/viya4-iac-gcp-diag.png | Bin 0 -> 255006 bytes docs/user/APIServices.md | 14 + docs/user/AdvancedTerraformUsage.md | 55 +++ docs/user/DockerUsage.md | 137 ++++++ docs/user/Kubeconfig.md | 35 ++ docs/user/KubernetesVersions.md | 122 +++++ docs/user/Locations.md | 32 ++ docs/user/TerraformGCPAuthentication.md | 111 +++++ docs/user/TerraformUsage.md | 83 ++++ examples/sample-input-byo.tfvars | 120 +++++ examples/sample-input-ha.tfvars | 108 +++++ examples/sample-input-minimal.tfvars | 13 + examples/sample-input.tfvars | 110 +++++ files/cloud-init/jump/cloud-config | 37 ++ files/cloud-init/nfs/cloud-config | 64 +++ files/tools/iac_git_info.sh | 10 + files/tools/iac_tooling_version.sh | 27 ++ main.tf | 328 +++++++++++++ modules/google_vm/main.tf | 58 +++ modules/google_vm/outputs.tf | 11 + modules/google_vm/variables.tf | 69 +++ modules/kubeconfig/main.tf | 73 +++ modules/kubeconfig/output.tf | 3 + .../templates/kubeconfig-provider.tmpl | 25 + .../kubeconfig/templates/kubeconfig-sa.tmpl | 20 + modules/kubeconfig/variables.tf | 23 + modules/network/main.tf | 45 ++ modules/network/outputs.tf | 14 + modules/network/variables.tf | 54 +++ network.tf | 119 +++++ outputs.tf | 121 +++++ variables.tf | 446 ++++++++++++++++++ versions.tf | 38 ++ vm.tf | 71 +++ 43 files changed, 3268 insertions(+) create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 ContributorAgreement.txt create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docker-entrypoint.sh create mode 100644 docs/CONFIG-VARS.md create mode 100644 docs/Troubleshooting.md create mode 100644 docs/images/viya4-iac-gcp-diag.png create mode 100644 docs/user/APIServices.md create mode 100644 docs/user/AdvancedTerraformUsage.md create mode 100644 docs/user/DockerUsage.md create mode 100644 docs/user/Kubeconfig.md create mode 100644 docs/user/KubernetesVersions.md create mode 100644 docs/user/Locations.md create mode 100644 docs/user/TerraformGCPAuthentication.md create mode 100644 docs/user/TerraformUsage.md create mode 100644 examples/sample-input-byo.tfvars create mode 100644 examples/sample-input-ha.tfvars create mode 100644 examples/sample-input-minimal.tfvars create mode 100644 examples/sample-input.tfvars create mode 100755 files/cloud-init/jump/cloud-config create mode 100755 files/cloud-init/nfs/cloud-config create mode 100755 files/tools/iac_git_info.sh create mode 100755 files/tools/iac_tooling_version.sh create mode 100644 main.tf create mode 100755 modules/google_vm/main.tf create mode 100755 modules/google_vm/outputs.tf create mode 100755 modules/google_vm/variables.tf create mode 100644 modules/kubeconfig/main.tf create mode 100644 modules/kubeconfig/output.tf create mode 100644 modules/kubeconfig/templates/kubeconfig-provider.tmpl create mode 100644 modules/kubeconfig/templates/kubeconfig-sa.tmpl create mode 100644 modules/kubeconfig/variables.tf create mode 100644 modules/network/main.tf create mode 100755 modules/network/outputs.tf create mode 100644 modules/network/variables.tf create mode 100644 network.tf create mode 100644 outputs.tf create mode 100644 variables.tf create mode 100644 versions.tf create mode 100644 vm.tf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8541e0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +*.plan +*.conf +*.tfstate +.terraform/ +*.tfstate.backup +terraform.tfvars +.terraform.tfstate.lock.info +*.lock.hcl +*.swp diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..97809c9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# How to Contribute + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a signed +[Contributor Agreement](ContributorAgreement.txt). +You (or your employer) retain the copyright to your contribution, +this simply gives us permission to use and redistribute your contributions as +part of the project. + +## Code reviews + +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult +[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more +information on using pull requests. diff --git a/ContributorAgreement.txt b/ContributorAgreement.txt new file mode 100644 index 0000000..5ab4c84 --- /dev/null +++ b/ContributorAgreement.txt @@ -0,0 +1,56 @@ +Contributor Agreement + +Version 1.1 + +Contributions to this software are accepted only when they are +properly accompanied by a Contributor Agreement. The Contributor +Agreement for this software is the Developer's Certificate of Origin +1.1 (DCO) as provided with and required for accepting contributions +to the Linux kernel. + +In each contribution proposed to be included in this software, the +developer must include a "sign-off" that denotes consent to the +terms of the Developer's Certificate of Origin. The sign-off is +a line of text in the description that accompanies the change, +certifying that you have the right to provide the contribution +to be included. For changes provided in source code control (for +example, via a Git pull request) the sign-off must be included in +the commit message in source code control. For changes provided +in email or issue tracking, the sign-off must be included in the +email or the issue, and the sign-off will be incorporated into the +permanent commit message if the contribution is accepted into the +official source code. + +If you can certify the below: + + Developer's Certificate of Origin 1.1 + + By making a contribution to this project, I certify that: + + (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + + (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + + (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + + (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +then you just add a line saying + + Signed-off-by: Random J Developer + +using your real name (sorry, no pseudonyms or anonymous contributions.) \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f6a4d0b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +ARG TERRAFORM_VERSION=0.13.6 +ARG GCP_CLI_VERSION=334.0.0 +FROM hashicorp/terraform:$TERRAFORM_VERSION as terraform + +FROM google/cloud-sdk:$GCP_CLI_VERSION +ARG KUBECTL_VERSION=1.18.8 + +WORKDIR /viya4-iac-gcp + +COPY --from=terraform /bin/terraform /bin/terraform +COPY . . + +RUN apt-get install -y jq \ + && curl -sLO https://storage.googleapis.com/kubernetes-release/release/v$KUBECTL_VERSION/bin/linux/amd64/kubectl \ + && chmod 755 ./kubectl /viya4-iac-gcp/docker-entrypoint.sh \ + && mv ./kubectl /usr/local/bin/kubectl \ + && chmod g=u -R /etc/passwd /etc/group /viya4-iac-gcp \ + && terraform init /viya4-iac-gcp + +ENV TF_VAR_iac_tooling=docker +ENTRYPOINT ["/viya4-iac-gcp/docker-entrypoint.sh"] +VOLUME ["/workspace"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d00fd48 --- /dev/null +++ b/README.md @@ -0,0 +1,99 @@ +# SAS Viya 4 Infrastructure as Code (IaC) for Google Cloud Platform (GCP) + +## Overview + +This project contains Terraform scripts to provision Google GCP infrastructure resources required to deploy SAS Viya 4 products. Here is a list of resources this project can create - + + >- VPC Network and Network Firewalls + >- Managed Google Kubernetes Engine (GKE) cluster + >- System and User GKE Node pools with required Labels and Taints + >- Infrastructure to deploy SAS Viya CAS in SMP or MPP mode + >- Shared Storage options for SAS Viya - Google Filestore (ha) or NFS Server (standard) + >- Google Cloud SQL for PostgreSQL instance, optional + +[Architecture Diagram](./docs/images/viya4-iac-gcp-diag.png?raw=true) + +Once the cloud resources are provisioned, see the [viya4-deployment](https://github.com/sassoftware/viya4-deployment) repo to deploy SAS Viya 4 products. If you need more information on the SAS Viya 4 products refer to the official [SAS® Viya® 4 Operations](https://go.documentation.sas.com/?cdcId=itopscdc&cdcVersion=v_001LTS&docsetId=itopswlcm&docsetTarget=home.htm&locale=en) documentation for more details. + +## Prerequisites + +Operational knowledge of +- [Terraform](https://www.terraform.io/intro/index.html) +- [Docker](https://www.docker.com/) +- [Google Cloud Platform](https://cloud.google.com/) +- [Kubernetes](https://kubernetes.io/docs/concepts/) + +### Required + +- Access to a [**Google Cloud "Project"**](https://cloud.google.com/resource-manager/docs/creating-managing-projects) with [these API Services](docs/user/APIServices.md) enabled. + +- A [Google Cloud Service Account](./docs/user/TerraformGCPAuthentication.md). + +- Terraform or Docker + - #### Terraform + - [Terraform](https://www.terraform.io/downloads.html) - v0.13.6 + - [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl) - v1.18.8 + - [jq](https://stedolan.github.io/jq/) - v1.6Docker + - [gcloud CLI](https://cloud.google.com/sdk/gcloud) - useful as an alternative to the Google Cloud Platform Portal + - #### Docker + - [Docker](https://docs.docker.com/get-docker/) + +## Getting Started + +### Clone this project + +Run these commands in a Terminal session: + +```bash +# clone this repo +git clone https://github.com/sassoftware/viya4-iac-gcp + +# move to directory +cd viya4-iac-gcp +``` + +### Authenticating Terraform to access GCP + +See [Terraform GCP Authentication](./docs/user/TerraformGCPAuthentication.md) for details. + +### Customize Input Values + +Create a file named `terraform.tfvars` to customize any input variable value. For starters, you can copy one of the provided example variable definition files in `./examples` folder. For more details on the variables declared in [variables.tf](variables.tf) refer to [CONFIG-VARS.md](docs/CONFIG-VARS.md). + +**NOTE:** You will need to update the `cidr_blocks` in the [variables.tf](variables.tf) file to allow traffic from your current network. Without these rules, access to the cluster will only be allowed via the GCP Console. + +When using a variable definition file other than `terraform.tfvars`, see [Advanced Terraform Usage](docs/user/AdvancedTerraformUsage.md) for additional command options. + +## Creating and Managing the Cloud Resources + +Create and manage the GCP cloud resources by either + +- using [Terraform](docs/user/TerraformUsage.md) directly on your workstation, or +- using a [Docker container](docs/user/DockerUsage.md). + + +## Troubleshooting + +See [troubleshooting](./docs/Troubleshooting.md) page. + +## Contributing + +> We welcome your contributions! Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to submit contributions to this project. + +## License + +> This project is licensed under the [Apache 2.0 License](LICENSE). + +## Additional Resources + +### GCP + +- Google Cloud CLI - https://cloud.google.com/sdk/gcloud +- Terraform on GCP - https://cloud.google.com/docs/terraform +- Terraform and GCP Service Accounts - https://medium.com/@gmusumeci/how-to-create-a-service-account-for-terraform-in-gcp-google-cloud-platform-f75a0cf918d1 +- GKE intro - https://cloud.google.com/kubernetes-engine + +### Terraform + +- Google Provider - https://www.terraform.io/docs/providers/google/index.html +- Google GKE - https://www.terraform.io/docs/providers/google/r/container_cluster.html diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..c419011 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -e + +# setup container user +echo "viya4-iac-gcp:*:$(id -u):$(id -g):,,,:/viya4-iac-gcp:/bin/bash" >> /etc/passwd +echo "viya4-iac-gcp:*:$(id -G | cut -d' ' -f 2)" >> /etc/group + +exec /bin/terraform $@ diff --git a/docs/CONFIG-VARS.md b/docs/CONFIG-VARS.md new file mode 100644 index 0000000..44ded7a --- /dev/null +++ b/docs/CONFIG-VARS.md @@ -0,0 +1,242 @@ +# List of valid configuration variables +Supported configuration variables are listed in the table below. All variables can also be specified on the command line. Values specified on the command line will override all values in configuration defaults files. + +## Table of Contents + + - [Required Variables](#required-variables) + - [Admin Access](#admin-access) + - [Networking](#networking) + - [Use Existing](#use-existing) + - [General](#general) + - [Nodepools](#nodepools) + - [Default Nodepool](#default-nodepool) + - [Additional Nodepools](#additional-nodepools) + - [Storage](#storage) + - [Postgres](#postgres) + +Terraform input variables can be set in the following ways: +- Individually, with the [-var command line option](https://www.terraform.io/docs/configuration/variables.html#variables-on-the-command-line). +- In [variable definitions (.tfvars) files](https://www.terraform.io/docs/configuration/variables.html#variable-definitions-tfvars-files). We recommend this way for most variables. +- As [environment variables](https://www.terraform.io/docs/configuration/variables.html#environment-variables). + +## Required Variables + +| Name | Description | Type | Default | Notes | +| :--- | :--- | :--- | :--- | :--- | +| prefix | A prefix used in the name of all the GCP resources created by this script. | string | | The prefix string must start with a lowercase letter and contain only lowercase alphanumeric characters and dashes (-), but cannot end with a dash. | +| location | The GCP Region (for example "us-east1") or GCP Zone (for example "us-east1-b") to provision all resources in this script. | string | | See [this topic](user/Locations.md) on how to chose a region or a zone. | +| project | The GCP Project to use | string | | | +| service_account_keyfile | Filename of the Service Account JSON file | string | | +| ssh_public_key | Public ssh key for VMs | string | "~/.ssh/id_rsa.pub" | Value is required in order to access your VMs | + +## GCP Authentication + +The Terraform process manages GCP resources on your behalf. In order to do so, it needs to know the credentials for a GCP identity with the required permissions. + +For more detailed information on what is needed see [Authenticating Terraform to access GCP](https://github.com/sassoftware/viya4-iac-gcp/blob/main/docs/user/TerraformGCPAuthentication.md) + +## Admin Access + +By default, the API of the GCP resources that are being created are only accessible through authenticated GCP clients (e.g. the Google Cloud Portal, the `gcloud` CLI, the Google Cloud Shell, etc. +To allow access for other administrative client applications (for example `kubectl`, `psql`, etc.), you need to open up the GCP firewall to allow access from your source IPs. +To do this, specify ranges of IP in [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing). +Contact your Network System Administrator to find the public CIDR range of your network. + +You can use `default_public_access_cidrs` to set a default range for all created resources. To set different ranges for other resources, define the appropriate variable. Use and empty list `[]` to disallow access explicitly. + +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| default_public_access_cidrs | IP Ranges allowed to access all created cloud resources | list of strings | | Use to to set a default for all Resources | +| cluster_endpoint_public_access_cidrs | IP Ranges allowed to access the GKE cluster api | list of strings | | for client admin access to the cluster, e.g. with `kubectl` | +| vm_public_access_cidrs | IP Ranges allowed to access the VMs | list of strings | | opens port 22 for SSH access to the jump and/or nfs VM | +| postgres_public_access_cidrs | IP Ranges allowed to access the Google Cloud PostgreSQL Server | list of strings ||| + +## Networking +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| gke_subnet_cidr | Address space for the subnet for the GKE resources | string | "192.168.0.0/23" | This variable is ignored when `vpc_name` is set (aka bring your own vnet) | +| gke_pod_subnet_cidr | Secondary address space in the GKE subnet for Kubernetes Pods | string | "10.0.0.0/17" | This variable is ignored when `subnet_names` is set (aka bring your own subnets) | +| gke_services_subnet_cidr | Secondary address space in the GKE subnet for Kubernetes Services | string | "10.1.0.0/22" | This variable is ignored when `subnet_names` is set (aka bring your own subnets) | +| gke_control_plane_subnet_cidr | Address space for the hosted master network | string | "10.2.0.0/28" | When providing your own subnets (by setting `subnet_names` make sure your subnets do not overlap this range | +| misc_subnet_cidr | Address space for the subnet the auxiliary resources (Jump VM and optionally NFS VM) | string | "192.168.2.0/24" | This variable is ignored when `subnet_names` is set (aka bring your own subnet) | + +### Use Existing + +If desired, you can deploy into an existing VPC, use existing subnets, and provide an existing Cloud NAT IP address. You will need a private subnet for the GKE nodes and a public subnet for the Jump VM and (if used) the NFS VM. The GKE subnet requires two secondary CIDR ranges for the Kubernetes Pods and Services (see https://cloud.google.com/kubernetes-engine/docs/concepts/alias-ips#cluster_sizing). + +The existing subnets need to match the same region given in the `location` variable defined [here](#required-variables) + +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| vpc_name | Name of pre-existing VPC | string | null | Only required if deploying into existing VPC | +| subnet_names | Existing subnets/secondary ranges mapped to desired usage | map(string) | null | Only required if deploying into existing subnets. See example below | +| nat_address_name | Name of existing IP address for existing Cloud NAT | string | null | If not given, a Cloud NAT and associated external IP will be created | + +Example `subnet_names` variable: + +```yaml +subnet_names = { + ## Required subnet/range names + "gke" = "my_gke_subnet_name" + "gke_pods_range_name" = "my_secondary_range_for_pods" + "gke_services_range_name" = "my_secondary_range_for_services" + "misc" = "my_misc_subnet_name" +} +``` + +## General + +The application of a Kubernetes version in GCP has some limitations when assigning channels and versions to the cluster. The doc outlining on these limitations can be found in the [Kubernetes Versions](user/KubernetesVersions.md) guide. + +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| kubernetes_version | The GKE cluster K8S version | string | "latest" | Valid values depend on the kubernetes_channel and version required, see https://cloud.google.com/kubernetes-engine/docs/release-notes | +| kubernetes_channel | The GKE cluster channel for auto-updates | string | "UNSPECIFIED" | Possible values: "STABLE", "REGULAR", "RAPID"; Set "UNSPECIFIED" for no auto-updates | +| enable_cluster_autoscaling | Enable cluster autoscaling | bool | false | | +| cluster_autoscaling_max_cpu_cores | MAX number of cores in the cluster | number | 500 | | +| cluster_autoscaling_max_memory_gb | MAX number of gb of memory in the cluster | number | 10000 | | +| create_static_kubeconfig | Allows the user to create a provider / service account based kube config file | bool | false | A value of `false` will default to using the cloud providers mechanism for generating the kubeconfig file. A value of `true` will create a static kubeconfig which utilizes a `Service Account` and `Cluster Role Binding` to provide credentials. | +| regional | Create a regional GKE control plane | bool | true | If false a zonal GKE control plane is created | +| create_jump_vm | Create bastion host | bool | true | | +| create_jump_public_ip | Add public ip to jump VM | bool | true | | +| jump_vm_admin | OS Admin User for the Jump VM | string | "jumpuser" | | +| jump_rwx_filestore_path | File store mount point on Jump server | string | "/viya-share" | | +| tags | Map of common tags to be placed on all GCP resources created by this script | map | {} | | + +## Nodepools + +### Default Nodepool + +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| default_nodepool_vm_type | Type of the default nodepool VMs | string | "e2-standard-8" | | +| default_nodepool_os_disk_size | Disk size for default nodepool VMs in GB | number | 128 || +| default_nodepool_min_nodes | Minimum number of nodes for the default nodepool | number | 1 | | +| default_nodepool_max_nodes | Maximum number of nodes for the default nodepool | number | 5 | | +| default_nodepool_local_ssd_count | Number 375 GB local ssd disks to provision | number | 0 | You can pick up to 24 ssd drives per node | +| default_nodepool_taints | Taints for the default nodepool VMs | list of strings | [] | | +| default_nodepool_labels | Labels to add to the default nodepool VMs | map | {} | | + +### Additional Nodepools + +Additional node pools can be created separate from the default nodepool. This is done with the `node_pools` variable which is a map of objects. Each nodepool requires the following variables: + +| Name | Description | Type | Notes | +| :--- | ---: | ---: | ---: | +| vm_type | Type of the nodepool VMs | string | | +| os_disk_size | Disk size for nodepool VMs in GB | number | | +| min_nodes | Minimum and initial number of nodes for the nodepool | number | Value must be >=0 and <= `max_nodes`. Setting min and max node counts the same disables autoscaling | +| max_nodes | Maximum number of nodes for the nodepool | number | Value must be >= `min_nodes`. Setting min and max node counts the same disables autoscaling | +| node_taints | Taints for the nodepool VMs | list of strings | | +| node_labels | Labels to add to the nodepool VMs | map | | +| local_ssd_count | Number of 375 GB local ssd disks to provision | number | | +| accelerator_count | Number of GPU accelerators associated with this nodepool | number | | +| accelerator_type | Type of GPU accelerator associated with this nodepool | string | To list the available accelerators in your zone use the following command `gcloud compute accelerator-types list --filter="zone:( )"` | + +The default values for the `node_pools` variable are: + +```yaml +cas = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 5 + "node_taints" = ["workload.sas.com/class=cas:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "cas" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" +}, +compute = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 5 + "node_taints" = ["workload.sas.com/class=compute:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "compute" + "launcher.sas.com/prepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" +}, +connect = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 5 + "node_taints" = ["workload.sas.com/class=connect:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "connect" + "launcher.sas.com/prepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" +}, +stateless = { + "vm_type" = "e2-standard-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 5 + "node_taints" = ["workload.sas.com/class=stateless:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateless" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" +}, +stateful = { + "vm_type" = "e2-standard-8" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=stateful:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateful" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" +} +``` + +## Storage + +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| storage_type | Type of Storage. Valid Values: "standard", "ha" | string | "standard" | "standard" creates NFS server VM, "ha" Google Filestore instance | + +### For `storage_type=standard` only (NFS server VM) + +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| create_nfs_public_ip | Add public ip to the NFS server VM | bool | false | The NFS server VM is only created when storage_type="standard" | +| nfs_vm_admin | OS Admin User for the NFS server VM | string | "nfsuser" | The NFS server VM is only created when storage_type="standard" | +| nfs_raid_disk_size | Size in Gb for each disk of the RAID5 cluster on the NFS server VM | number | 128 | The NFS server VM is only created when storage_type="standard" | + +## Postgres + +| Name | Description | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| create_postgres | Create a PostgreSQL server instance | bool | false | | +| postgres_name | The name of the PostgreSQL Server | string | | Once used, a name cannot be reused for up to [one week](https://cloud.google.com/sql/docs/mysql/delete-instance) | +| postgres_machine_type| The machine type for the PostgreSQL server VMs" | string | "db-custom-8-30720" | Google Cloud Postgres supports only shared-core machine types such as db-f1-micro, and custom machine types such as db-custom-2-13312. +| postgres_storage_gb | Minimum storage allowed for the PostgreSQL server | number | 10 | | +| postgres_administrator_login | The Administrator Login for the PostgreSQL Server. Changing this forces a new resource to be created. | string | "pgadmin" | | | +| postgres_administrator_password | The Password associated with the postgres_administrator_login for the PostgreSQL Server | string | | | +| postgres_server_version | The version of the PostgreSQL server instance | string | "11" | Supported values are 11 and 12 | +| postgres_ssl_enforcement_enabled | Enforce SSL on connection to the PostgreSQL database | bool | false | | +| postgres_db_charset | Charset for the PostgreSQL Database | string | "UTF8" | Needs to be a valid PostgreSQL Charset. | +| postgres_db_collation | Collation for the PostgreSQL Database | string | "en_US.UTF8" | Needs to be a valid PostgreSQL Collation. | +| postgres_backups_enabled | Enables postgres backups | bool | true | | +| postgres_backups_start_time | Start time for postgres backups | string | "21:00" | | +| postgres_backups_location | TODO | string | null | | +| postgres_backups_point_in_time_recovery_enabled | Enable point-in-time recovery | bool | false | | +| postgres_db_names | The list of names of PostgreSQL database to create | list | [] | | +| postgres_availability_type | The availability type for the master instance. | string | "ZONAL" | This is only used to set up high availability for the PostgreSQL instance. Can be either `ZONAL` or `REGIONAL`." +| postgres_database_flags | Database flags for the master instance. | list of objects | | More details: https://cloud.google.com/sql/docs/postgres/flags | diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md new file mode 100644 index 0000000..7d22963 --- /dev/null +++ b/docs/Troubleshooting.md @@ -0,0 +1,15 @@ + +## Issue1 +Description. + +Here is a sample of the error: + +``` +Error message: +``` + +**Resolution:** + +``` +any commands to resolve issue +``` \ No newline at end of file diff --git a/docs/images/viya4-iac-gcp-diag.png b/docs/images/viya4-iac-gcp-diag.png new file mode 100644 index 0000000000000000000000000000000000000000..f8225ee811aafadf88daa3b485b2fd612eb95d93 GIT binary patch literal 255006 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

8;R6DSk~m}+fZ5sm{m^Px0MX& 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 literal 0 HcmV?d00001 diff --git a/docs/user/APIServices.md b/docs/user/APIServices.md new file mode 100644 index 0000000..6b2d0e7 --- /dev/null +++ b/docs/user/APIServices.md @@ -0,0 +1,14 @@ +## API Services + +Make sure your Google Cloud Project has at least the following API Services enabled: + +| API Service Name | Description/Link | Use | +| :--- | :--- | :--- | +| `container.googleapis.com` | [Kubernetes Engine API](https://console.cloud.google.com/apis/library/container.googleapis.com) || +| `compute.googleapis.com`| [Compute Engine API](https://console.cloud.google.com/apis/library/compute.googleapis.com) || +| `file.googleapis.com` | [Cloud Filestore API](https://console.cloud.google.com/apis/library/file.googleapis.com) | Needed for `storage_type="ha"` | +| `sqladmin.googleapis.com`| [Cloud SQL Admin API](https://console.cloud.google.com/apis/library/sqladmin.googleapis.com) | Needed when creating an [SQL Postgres instance](../CONFIG-VARS.md#postgres) +| `servicenetworking.googleapis.com`| [Service Networking API](https://console.cloud.google.com/apis/library/servicenetworking.googleapis.com) | Needed when creating an [SQL Postgres instance](../CONFIG-VARS.md#postgres) +| `cloudresourcemanager.googleapis.com`| [Cloud Resource Manager API](https://console.cloud.google.com/apis/library/cloudresourcemanager.googleapis.com) | Needed if you create an [SQL Postgres instance](../CONFIG-VARS.md#postgres) | + +Further detail on [enabling API Services](https://cloud.google.com/apis/docs/getting-started#enabling_apis). diff --git a/docs/user/AdvancedTerraformUsage.md b/docs/user/AdvancedTerraformUsage.md new file mode 100644 index 0000000..9b34fb0 --- /dev/null +++ b/docs/user/AdvancedTerraformUsage.md @@ -0,0 +1,55 @@ + +# Advanced Terraform Usage + +## Terraform - Plan + +Once Terraform project is initialized, ```terraform plan``` command can be run multiple times to generate a plan to review prior to running ```terraform apply``` that actually creating cloud resources. This is helpful to: + +1) verify that the Terraform script runs with no errors +2) review the cloud resources and dependencies before creating them +3) when run after infrastructure has been created with '*terraform apply*' it diffs between the local definitions and the actual infrastructure + +Terraform accepts inputs when prompted or you can conveniently pass them into the command line with ```-var``` or ```-var-file``` options. This overrides any default values in ```variables.tf``` + +```bash +# to generate a terraform plan +terraform plan -var-file=sample-input.tfvars -out ./my-viya4-iac.plan +``` + +## Terraform - Show + +Run ```terraform show``` command to display the plan again + +```bash +# to review the plan +terraform show my-viya4-iac.plan +``` + +## Terraform - Apply + +After any errors are resolved and satisfied with the plan, run the ```terraform apply``` command to create resources on the cloud provider. When a plan file is not provided, Terraform generates a plan at that time that may differ from previous ```plan``` runs. + +```bash +# run apply to create resources based on the plan +terraform apply ./my-viya4-iac.plan +``` + +## Terraform - State + +After the resources are created use ```terraform state list``` to list all the resources and ```terraform state show``` to get details of a resource. + +```bash +terraform state list +# to get more details on a partictular resource +terraform state show +``` + +## Terraform - Output + +To display the outputs captured by terraform you can use the `terraform output` command to show all or a specific output variable. + +```bash +terraform output +# to get the value of a specific output variable +terraform output +``` diff --git a/docs/user/DockerUsage.md b/docs/user/DockerUsage.md new file mode 100644 index 0000000..f740fe4 --- /dev/null +++ b/docs/user/DockerUsage.md @@ -0,0 +1,137 @@ +# Using Docker Container + +## Prereqs + +- Docker [installed on your workstation](../../README.md#docker). + +- Prepare your `terraform.tfvars` file, as described in [Customize Input Values](../../README.md#customize-input-values). + +## Preparation + +### Docker image + +Run the following command to create the `viya4-iac-gcp` Docker image using the provided [Dockerfile](../../Dockerfile) + +```bash +docker build -t viya4-iac-gcp . +``` + +The Docker image `viya4-iac-gcp` will contain Terraform and 'kubectl' executables. The Docker entrypoint for the image is `terraform` that will be run with sub-commands in the subsequent steps. + +### Service Account Keyfile for GCP Authentication + +Prepare a file with GCP authentication info, as described in [Authenticating Terraform to access GCP](./TerraformGCPAuthentication.md) and store it outside of this repo in a secuire file, for example `$HOME/.viya4-tf-gcp-service-account.json`. + +### Docker Volume Mounts + +Add volume mounts to the `docker run` command for all files and directories that must be accessible from inside the container. +- `--volume=$HOME/.viya4-tf-gcp-service-account.json:/.viya4-tf-gcp-service-account.json` Service Account Key file for GCP authentication +- `--volume=$HOME/.ssh:/.ssh` for [`ssh_public_key`](../CONFIG-VARS.md#required-variables) variable in the `terraform.tfvars` file +- `--volume=$(pwd):/workspace` for local directory where `terraform.tfvars` file resides and where `terraform.tfstate` file will be written. To grant Docker, permission to write to the local directory use [`--user` option](https://docs.docker.com/engine/reference/run/#user) + +The most common filre references are the values of the [`service_account_keyfile`](./CONFIG-VARS.md#required-variables) and [`ssh_public_key`](./CONFIG-VARS.md#required-variables) variables in the `terraform.tfvars` file. + +**Note** that local references to `$HOME` (or "`~`") need to map to the root directory `/` in the container. + +### Variable Definitions (.tfvars) File + +Prepare your `terraform.tfvars` file, as described in [Customize Input Values](../../README.md#customize-input-values). + +## Running Terraform Commands + +### Preview Cloud Resources (optional) + +To preview the cloud resources before creating, run the Docker image `viya4-iac-gcp` with the `plan` command + +```bash +docker run --rm --group-add root \ + --user "$(id -u):$(id -g)" \ + --volume $HOME/.viya4-tf-gcp-service-account.json:/.viya4-tf-gcp-service-account.json \ + --volume $HOME/.ssh:/.ssh \ + --volume $(pwd):/workspace \ + viya4-iac-gcp \ + plan -var-file=/workspace/terraform.tfvars \ + -state=/workspace/terraform.tfstate +``` + +### Create Cloud Resources + +To create the cloud resources, run the Docker image `viya4-iac-gcp` with the `apply` command and `-auto-approve` option + +```bash +docker run --rm --group-add root \ + --user "$(id -u):$(id -g)" \ + --volume $HOME/.viya4-tf-gcp-service-account.json:/.viya4-tf-gcp-service-account.json \ + --volume $HOME/.ssh:/.ssh \ + --volume $(pwd):/workspace \ + viya4-iac-gcp \ + apply -auto-approve \ + -var-file=/workspace/terraform.tfvars \ + -state=/workspace/terraform.tfstate +``` + +This command can take a few minutes to complete. Once complete, Terraform output values are written to the console. The 'KUBECONFIG' file for the cluster is written to `[prefix]-gke-kubeconfig.conf` in the current directory `$(pwd)`. + +### Display Outputs + +Once the cloud resources have been created with `apply` command, to display Terraform output values, run the Docker image `viya4-iac-gcp` with `output` command + +```bash +docker run --rm --group-add root \ + --user "$(id -u):$(id -g)" \ + --volume $HOME/.viya4-tf-gcp-service-account.json:/.viya4-tf-gcp-service-account.json \ + --volume $HOME/.ssh:/.ssh \ + --volume $(pwd):/workspace \ + viya4-iac-gcp \ + output -state=/workspace/terraform.tfstate +``` + +### Modify Cloud Resources + +After provisioning the infrastructure if further changes were to be made then update corresponding variables with desired values in `terraform.tfvars` and run the Docker image `viya4-iac-gcp` with the `apply` command and `-auto-approve` option again + +```bash +docker run --rm --group-add root \ + --user "$(id -u):$(id -g)" \ + --volume $HOME/.viya4-tf-gcp-service-account.json:/.viya4-tf-gcp-service-account.json \ + --volume $HOME/.ssh:/.ssh \ + --volume $(pwd):/workspace \ + viya4-iac-gcp \ + apply -auto-approve \ + -var-file=/workspace/terraform.tfvars \ + -state=/workspace/terraform.tfstate +``` + +### Tear Down Cloud Resources + +To destroy all the cloud resources created with the previous commands, run the Docker image `viya4-iac-gcp` with the `destroy` command and `-auto-approve` option + +```bash +docker run --rm --group-add root \ + --user "$(id -u):$(id -g)" \ + --volume $HOME/.viya4-tf-gcp-service-account.json:/.viya4-tf-gcp-service-account.json \ + --volume $HOME/.ssh:/.ssh \ + --volume $(pwd):/workspace \ + viya4-iac-gcp \ + destroy -auto-approve \ + -var-file=/workspace/terraform.tfvars \ + -state=/workspace/terraform.tfstate +``` +**NOTE:** The 'destroy' action is irreversible. + +## Interacting with Kubernetes cluster + +[Creating the cloud resources](#create-cloud-resources) writes the `kube_config` output value to a file `./[prefix]-gke-kubeconfig.conf`. When the Kubernetes cluster is ready, use `--entrypoint kubectl` to interact with the cluster. + +**Note** this requires [`cluster_endpoint_public_access_cidrs`](../CONFIG-VARS.md#admin-access) value to be set to your local ip or CIDR range. + +### `kubectl` Example: + +```bash +docker run --rm \ + --env=KUBECONFIG=/workspace/-gke-kubeconfig.conf \ + --volume=$(pwd):/workspace \ + --entrypoint kubectl \ + viya4-iac-gcp get nodes + +``` diff --git a/docs/user/Kubeconfig.md b/docs/user/Kubeconfig.md new file mode 100644 index 0000000..92843e9 --- /dev/null +++ b/docs/user/Kubeconfig.md @@ -0,0 +1,35 @@ +# Kubernetes Configuration File Generation + +## Overview + +The release of Kubernetes v1.19+ is dropping support for `basic authentication` via the --basic-auth-file flag. Release notes for that are [here](https://v1-19.docs.kubernetes.io/docs/setup/release/notes/#urgent-upgrade-notes) + +With the removal of this feature, the generation of the kube config file for the Infrastructure as Code (IaC) reposistories will now support two new options while removing the basic auth feature. + +The options are: + +- Provider Based +- Kuberenetes Service Account and Cluster Role Binding + +### Provider Based - Goolge Cloud Provider + +This option creates a kube config file that utiizies the `gcloud` executable from Google. This mehtod generates a `token` and `expiration date` that are embeded in the kube config file and are refreshed each time you use the kube config file to access your cluster. This `token` is tied to the current authentication method used for the provider so its quite safe. + +Portability is also limited given then file is tied to the authentication method used to create the file. + +### Kuberenetes Service Account and Cluster Role Binding + +This options creates a static kube config file utilizing the createion of the following: + +- Service Account +- Cluster Role Binding + +Once created the `Service Account` is used to provide the `ca cert` and `token` embeded in the kube config file. + +This file is quite portable as the `ca cert` and `token` for the cluster are static. Any who has this file can access the cluster. + +## Usage + +| Name | Descrption | Type | Default | Notes | +| :--- | ---: | ---: | ---: | ---: | +| create_static_kubeconfig | Creates a static kube config file who's authentication is backed by a `Serivce Account` and `Cluster Role Binding` in your kubernetes clluster. | bool | false | Setting to `true` creates a file that easliy sharable such as in a development or testing scenario | diff --git a/docs/user/KubernetesVersions.md b/docs/user/KubernetesVersions.md new file mode 100644 index 0000000..fe767ee --- /dev/null +++ b/docs/user/KubernetesVersions.md @@ -0,0 +1,122 @@ +# Kubernetes Versions + +Setting versions within the Google Cloud Platform (GCP) environment is slightly different from setting a version within other cloud providers + +There are two scenarios that are supported. These are: + +- Version Based +- Channel Based + +These options are ***mutually exclusive***. If you choose [Version Based](#version-based) you can specify a version and not a channel. If you choose [Channel Based](#channel-based) you can choose a channel and you'll be assigned the `defaultVersion` for that channel. + +In the examples below value `LOCATION` can refer to a region or zone depending on how you are setting up your cluster. it's up to you to determine the correct value for the location that will translate back into the tfvars file value to create the cluster. + +## Version Based + +Setting a specific version of your kubernetes cluster is derived by finding the active `version` values for your zone/region. + +To do this run the following command: + +```bash +export LOCATION="" +gcloud container get-server-config --format "yaml(validMasterVersions)" --zone $LOCATION +``` + +The output for this command will display a list of currently supported kubernetes versions that can be used on the current control plane nodes of your cluster. + +Here's an example of running the command and that output: + +```bash +export LOCATION="us-east1-b" +gcloud container get-server-config --format "yaml(validMasterVersions)" --zone $LOCATION +Fetching server config for us-east1-b +validMasterVersions: +- 1.18.16-gke.1200 +- 1.18.16-gke.500 +- 1.18.16-gke.302 +- 1.18.16-gke.300 +- 1.18.15-gke.1502 +- 1.18.15-gke.1501 +- 1.18.15-gke.1500 +- 1.18.15-gke.1102 +- 1.18.15-gke.1100 +- 1.18.14-gke.1600 +- 1.18.14-gke.1200 +- 1.18.12-gke.1210 +- 1.17.17-gke.3700 +- 1.17.17-gke.3000 +- 1.17.17-gke.2800 +- 1.17.17-gke.1500 +- 1.17.17-gke.1101 +- 1.17.17-gke.1100 +- 1.17.15-gke.800 +- 1.16.15-gke.12500 +- 1.16.15-gke.11800 +- 1.16.15-gke.10600 +- 1.16.15-gke.7801 +- 1.15.12-gke.6002 +``` + +**NOTE**: This value will also be the value applied to the compute nodes of your custer. + +From here you would take one of these values and set the `kubernets_version` variable in your tfvars files like this: + +```bash +kubernetes_version = "1.18.15-gke.1102" +``` + +Do not set the `kubernetes_channel` variable. + +**NOTE**: If you find that the version you would like to use in your kubernetes cluster is not listed, you will need to go the [Channel Based](#channel-based) section to find the desired version. + +## Channel Based + +Setting a specific channel for your kubernetes cluster will use the `defaultVersion` provided by that channel. This is the only way to work with a version of kubernetes that has been recently released and/or is not listed in the [Version Based](#version-based) section. + +To find out what versions are supported by which channel you first run this command: + +```bash +export LOCATION="" +gcloud container get-server-config --format "yaml(channels)" --zone $LOCATION +``` + +The output from this command will display the channels and their current `defaultVersion` value. This `defaultVersion` value is what will be assigned to your cluster upon creation. + +Here's an example of running the command and that output: + +```bash +export LOCATION="us-east1-b" +gcloud container get-server-config --format "yaml(channels)" --zone $LOCATION +Fetching server config for us-east1-b +channels: +- channel: RAPID + defaultVersion: 1.19.8-gke.1000 + validVersions: + - 1.20.4-gke.1800 + - 1.19.8-gke.1600 + - 1.19.8-gke.1000 +- channel: REGULAR + defaultVersion: 1.18.15-gke.1501 + validVersions: + - 1.18.16-gke.302 + - 1.18.15-gke.1502 + - 1.18.15-gke.1501 +- channel: STABLE + defaultVersion: 1.17.17-gke.1101 + validVersions: + - 1.17.17-gke.2800 + - 1.17.17-gke.1101 + - 1.16.15-gke.7801 +``` + +From this example output if you are looking to create a kubernetes cluster with v1.19 then you would choose the 'RAPID' channel. + +From here you would set the `kubernetes_channel` variable in your tfvars files like this: + +```bash +kubernetes_channel = "RAPID" +``` + +This assignment results in a cluster being created with the version: `1.19.8-gke.1000` for this example. + +Do not set the `kubernetes_version` variable. diff --git a/docs/user/Locations.md b/docs/user/Locations.md new file mode 100644 index 0000000..886a3a0 --- /dev/null +++ b/docs/user/Locations.md @@ -0,0 +1,32 @@ +## Resource Locations + +Goople Cloud Platform resources are hosted in different data centers worldwide, divided into [Regions and Zones](https://cloud.google.com/compute/docs/regions-zones). + +You control the location of your Viya4 IAC resources by setting the `location` variable to either a Region or a Zone. + +In each case, a regional Cluster will be created, that is, the cluster control plane will be replicated in all zones in the region. + +All other resources will be zonal. + + +If you choose a Region: + +| Resouuce | Location | +| :--- | :--- | +| Cluster Control Plane | Regional in the specified Region | +| Default Node VMs | 1st Zone of the specified Region | +| GKE Cluster node VMs | 1st Zone of the specified Region | +| Jump VM | 1st Zone of the specified Region | +| NFS VM | 1st Zone of the specified Region | +| Postgres | Zonal in the 1st Zone the specified Region | + +If you chose a Zone: + +| Resouuce | Location | +| :--- | :--- | +| Cluster Control Plane | Regional in the Region of the specified Zone | +| Default Node VMs | In the specified Zone | +| GKE Cluster node VMs | In the specified Zone | +| Jump VM | In the specified Zone | +| NFS VM | In the specified Zone | +| Postgres | Zonal in the specified Zone | diff --git a/docs/user/TerraformGCPAuthentication.md b/docs/user/TerraformGCPAuthentication.md new file mode 100644 index 0000000..676df27 --- /dev/null +++ b/docs/user/TerraformGCPAuthentication.md @@ -0,0 +1,111 @@ +# Authenticating Terraform to access GCP + +Terraform creates and destroys resources in the Google Cloud Platform on your behalf. +In order to do so, it needs to authenticate itself to GCP with the appropriate permissions. + +This project uses a GCP Service Account to authenticate with GCP. You will need a Service Account with the appropriate permissions. You can use an existing Service Account, or preferably create a dedicated Service Account. + +You then create a keyfile in JSON format with the Service Account information. Terraform uses that keyfile to authenticate to GCP + +## Create a GCP Service Account + +How to create a GCP Service Account: https://cloud.google.com/iam/docs/creating-managing-service-accounts + +gcloud CLI Example: + +```bash +SA_NAME="" # <=== CHANGE +gcloud iam service-accounts create $SA_NAME --description "Service Account used Terraform Viya4 Infrastructure" --display-name "$SA_NAME" +``` + +## Apply the necessary Roles to the Service Account + +The Service Account will need the following [IAM roles](https://cloud.google.com/compute/docs/access/iam#predefinedroles): + +| Role Name | Description | Use | +| :--- | :--- | :--- | +| `roles/cloudsql.admin` | Cloud SQL Admin | Needed if you create an [SQL Postgres instance](../CONFIG-VARS.md#postgres) | +| `roles/compute.admin` | Compute Admin | Cluster creation | +| `roles/compute.networkAdmin` | Compute Network Admin | Network creation | +| `roles/compute.securityAdmin` | Compute Security Admin | Terraform Kubernetes Engine Module | +| `roles/compute.viewer` | Compute Viewer | Terraform Kubernetes Engine Module | +| `roles/container.admin` | Kubernetes Engine Admin | Cluster creation | +| `roles/container.clusterAdmin` | Kubernetes Engine Cluster Admin | Terraform Kubernetes Engine Module | +| `roles/container.developer` | Kubernetes Engine Developer | Cluster creation | +| `roles/file.editor` | Cloud Filestore Editor | Needed for [`storage_type=="HA"`](../CONFIG-VARS.md#storage) | +| `roles/iam.serviceAccountAdmin` | Service Account Admin | Terraform Kubernetes Engine Module | +| `roles/iam.serviceAccountUser` | Service Account User | Terraform Kubernetes Engine Module | +| `roles/resourcemanager.projectIamAdmin` | Project IAM Admin | Terraform Kubernetes Engine Module | + +How modify IAM access to GCP resources: https://cloud.google.com/iam/docs/granting-changing-revoking-access + +gcloud CLI Example: +```bash +PROJECT="" # <== CHANGE +SA_NAME="" # <== CHANGE +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/cloudsql.admin +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/compute.admin +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/compute.networkAdmin +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/compute.securityAdmin +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/compute.viewer +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/container.admin +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/container.clusterAdmin +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/container.developer +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/file.editor +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/iam.serviceAccountAdmin +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/iam.serviceAccountUser +gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/resourcemanager.projectIamAdmin +``` + +## Verfiy the necessary Roles have been applied to the Service Account + +Run the following command: + +```bash +PROJECT="" # <== CHANGE +SA_NAME="" # <== CHANGE +gcloud projects get-iam-policy $PROJECT \ +--flatten="bindings[].members" \ +--format='table(bindings.role)' \ +--filter="bindings.members:$SA_NAME" | grep -v ROLE | sort -u +``` + +The output should look like this: + +```bash +roles/cloudsql.admin +roles/compute.admin +roles/compute.networkAdmin +roles/compute.securityAdmin +roles/compute.viewer +roles/container.admin +roles/container.clusterAdmin +roles/container.developer +roles/file.editor +roles/iam.serviceAccountAdmin +roles/iam.serviceAccountUser +roles/resourcemanager.projectIamAdmin +``` + +## Create the Service Account Keyfile + +Manage key files using the Cloud Console: https://console.cloud.google.com/apis/credentials/serviceaccountkey + +gcloud CLI Example: + +```bash +PROJECT="" # <== CHANGE +SA_NAME="" # <== CHANGE +SA_KEY_FILE="$HOME/.viya4-tf-gcp-service-account.json" +gcloud iam service-accounts keys create ${SA_KEY_FILE} --iam-account ${SA_NAME}@${PROJECT}.iam.gserviceaccount.com +chmod 500 ${SA_KEY_FILE} # secure the keyfile +``` + +## Terraform project variables to authenticate with GCP + +As part of your [Terraform input variables](../../README.md#customize-input-values), set these values: + +| Name | Description | +| :--- | :--- | +| project | The GCP Project to use | +| service_account_keyfile | Filename of the Service Account JSON file | diff --git a/docs/user/TerraformUsage.md b/docs/user/TerraformUsage.md new file mode 100644 index 0000000..dbf6e07 --- /dev/null +++ b/docs/user/TerraformUsage.md @@ -0,0 +1,83 @@ +# Using the Terraform CLI + +## Prereqs + +When using the Terraform CLI, make sure you have all the necessary tools [installed on your workstation](../../README.md#terraform). + +## Preparation + +### Set GCP Authentication + +Prepare a file with authentication info, as described in [Authenticating Terraform to access GCP](./TerraformGCPAuthentication.md). + +### Pepare Variable Definitions (.tfvars) File + +Prepare your `terraform.tfvars` file, as described in [Customize Input Values](../../README.md#customize-input-values). + +## Running Terraform Commands + +### Initialize Terraform Environment + +Initialize the Terraform environment for this project by running + +```bash +terraform init +``` + +This creates a `.terraform` directory locally and initializes Terraform plugins and modules used in this project. + +**Note:** `terraform init` only needs to be run once unless new Terraform plugins or modules were added. + +### Preview Cloud Resources (optional) + +To preview the resources that the Terraform script will create, run + +```bash +terraform plan +``` + +### Create Cloud Resources + +When satisfied with the plan and ready to create cloud resources, run + +```bash +terraform apply -auto-approve +``` + +This command can take a few minutes to complete. Once complete, Terraform output values are written to the console. + +The kubeconfig file for the cluster is being written to `[prefix]-gke-kubeconfig.conf` in the current directory `$(pwd)`. + +### Display Outputs + +Once the cloud resources have been created with `apply` command, to display Terraform output values, run + +```bash +terraform output +``` + +### Modify Cloud Resources + +After provisioning the infrastructure, if further changes were to be made then add the variable and desired value to `terraform.tfvars` and run `terrafom apply` again. + +### Tear Down Cloud Resources + +To destroy the kubernetes cluster and all related resources, run + +```bash +terraform destroy +``` +NOTE: The "destroy" action is irreversible. + +## Interacting with the Kubernetes cluster + +[Creating the cloud resources](#create-cloud-resources) writes the `kube_config` output value to a file `./[prefix]-gke-kubeconfig.conf`. When the Kubernetes cluster is ready, use `kubectl` to interact with the cluster. + +**Note** this requires [`cluster_endpoint_public_access_cidrs`](../CONFIG-VARS.md#admin-access) value to be set to your local ip or CIDR range. + +### Example Using `kubectl` + +```bash +export KUBECONFIG=$(pwd)/-aks-kubeconfig.conf +kubectl get nodes +``` diff --git a/examples/sample-input-byo.tfvars b/examples/sample-input-byo.tfvars new file mode 100644 index 0000000..3bfbd81 --- /dev/null +++ b/examples/sample-input-byo.tfvars @@ -0,0 +1,120 @@ +# !NOTE! - These are only a subset of variables.tf provided for sample. +# Customize this file to add any variables from 'variables.tf' that you want +# to change their default values. + +# **************** REQUIRED VARIABLES **************** +# These required variables' values MUST be provided by the User +prefix = "" +location = "" # e.g., "us-east1-b"" +project = "" +service_account_keyfile = "" +ssh_public_key = "~/.ssh/id_rsa.pub" +# +# **************** REQUIRED VARIABLES **************** + +# Source address ranges to allow client admin access to the cloud resources +default_public_access_cidrs = [] # e.g., ["123.45.6.89/32"] + +# Bring your own existing resources +vpc_name = "existing-vpc-name" +subnet_names = { + gke = "" + gke_pods_range_name = "" + gke_services_range_name = "" + misc = "" +} +nat_address_name = "" + +# add labels to the created resources +tags = {} # e.g., { "key1" = "value1", "key2" = "value2" } + +# Postgres config +create_postgres = true # set this to "false" when using internal Crunchy Postgres +postgres_ssl_enforcement_enabled = false +postgres_administrator_password = "mySup3rS3cretPassw0rd" + +# GKE config +default_nodepool_min_nodes = 2 +default_nodepool_vm_type = "e2-standard-8" + +# Node Pools config +node_pools = { + cas = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 1 + "node_taints" = ["workload.sas.com/class=cas:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "cas" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + compute = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 1 + "node_taints" = ["workload.sas.com/class=compute:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "compute" + "launcher.sas.com/prepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + connect = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 1 + "node_taints" = ["workload.sas.com/class=connect:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "connect" + "launcher.sas.com/prepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + stateless = { + "vm_type" = "e2-standard-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 2 + "node_taints" = ["workload.sas.com/class=stateless:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateless" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + stateful = { + "vm_type" = "e2-standard-8" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=stateful:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateful" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + } +} + +# Jump Box +create_jump_public_ip = true +jump_vm_admin = "jumpuser" + +# Storage for SAS Viya CAS/Compute +storage_type = "standard" +# required ONLY when storage_type is "standard" to create NFS Server VM +create_nfs_public_ip = false +nfs_vm_admin = "nfsuser" +nfs_raid_disk_size = 128 diff --git a/examples/sample-input-ha.tfvars b/examples/sample-input-ha.tfvars new file mode 100644 index 0000000..bac2677 --- /dev/null +++ b/examples/sample-input-ha.tfvars @@ -0,0 +1,108 @@ +# !NOTE! - These are only a subset of variables.tf provided for sample. +# Customize this file to add any variables from 'variables.tf' that you want +# to change their default values. + +# **************** REQUIRED VARIABLES **************** +# These required variables' values MUST be provided by the User +prefix = "" +location = "" # e.g., "us-east1-b"" +project = "" +service_account_keyfile = "" +ssh_public_key = "~/.ssh/id_rsa.pub" +# +# **************** REQUIRED VARIABLES **************** + +# Source address ranges to allow client admin access to the cloud resources +default_public_access_cidrs = [] # e.g., ["123.45.6.89/32"] + +# add labels to the created resources +tags = {} # e.g., { "key1" = "value1", "key2" = "value2" } + +# Postgres config +create_postgres = true # set this to "false" when using internal Crunchy Postgres +postgres_ssl_enforcement_enabled = false +postgres_administrator_password = "mySup3rS3cretPassw0rd" + +# GKE config +default_nodepool_min_nodes = 2 +default_nodepool_vm_type = "e2-standard-8" + +# Node Pools config +node_pools = { + cas = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 2 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=cas:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "cas" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + compute = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 2 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=compute:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "compute" + "launcher.sas.comprepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + connect = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 2 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=connect:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "connect" + "launcher.sas.com/prepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + stateless = { + "vm_type" = "e2-standard-16" + "os_disk_size" = 200 + "min_nodes" = 2 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=stateless:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateless" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + stateful = { + "vm_type" = "e2-standard-8" + "os_disk_size" = 200 + "min_nodes" = 2 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=stateful:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateful" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + } +} +# Jump Box +create_jump_public_ip = true +jump_vm_admin = "jumpuser" + +# Storage for Viya Compute Services +# Supported storage_type values +# "standard" - Custom managed NFS Server VM and disks +# "ha" - Google Filestore +storage_type = "ha" diff --git a/examples/sample-input-minimal.tfvars b/examples/sample-input-minimal.tfvars new file mode 100644 index 0000000..8b0b34e --- /dev/null +++ b/examples/sample-input-minimal.tfvars @@ -0,0 +1,13 @@ +# !NOTE! - These are only a subset of variables.tf provided for sample. +# Customize this file to add any variables from 'variables.tf' that you want +# to change their default values. + +# **************** REQUIRED VARIABLES **************** +# These required variables' values MUST be provided by the User +prefix = "" +location = "" # e.g., "us-east1-b"" +project = "" +service_account_keyfile = "" +ssh_public_key = "~/.ssh/id_rsa.pub" +# +# **************** REQUIRED VARIABLES **************** diff --git a/examples/sample-input.tfvars b/examples/sample-input.tfvars new file mode 100644 index 0000000..65e1a2c --- /dev/null +++ b/examples/sample-input.tfvars @@ -0,0 +1,110 @@ +# !NOTE! - These are only a subset of variables.tf provided for sample. +# Customize this file to add any variables from 'variables.tf' that you want +# to change their default values. + +# **************** REQUIRED VARIABLES **************** +# These required variables' values MUST be provided by the User +prefix = "" +location = "" # e.g., "us-east1-b"" +project = "" +service_account_keyfile = "" +ssh_public_key = "~/.ssh/id_rsa.pub" +# +# **************** REQUIRED VARIABLES **************** + +# Source address ranges to allow client admin access to the cloud resources +default_public_access_cidrs = [] # e.g., ["123.45.6.89/32"] + +# add labels to the created resources +tags = {} # e.g., { "key1" = "value1", "key2" = "value2" } + +# Postgres config +create_postgres = true # set this to "false" when using internal Crunchy Postgres +postgres_ssl_enforcement_enabled = false +postgres_administrator_password = "mySup3rS3cretPassw0rd" + +# GKE config +default_nodepool_min_nodes = 2 +default_nodepool_vm_type = "e2-standard-8" + +# Node Pools config +node_pools = { + cas = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 1 + "node_taints" = ["workload.sas.com/class=cas:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "cas" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + compute = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 1 + "node_taints" = ["workload.sas.com/class=compute:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "compute" + "launcher.sas.com/prepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + connect = { + "vm_type" = "n1-highmem-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 1 + "node_taints" = ["workload.sas.com/class=connect:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "connect" + "launcher.sas.com/prepullImage" = "sas-programming-environment" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + stateless = { + "vm_type" = "e2-standard-16" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 2 + "node_taints" = ["workload.sas.com/class=stateless:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateless" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + }, + stateful = { + "vm_type" = "e2-standard-8" + "os_disk_size" = 200 + "min_nodes" = 1 + "max_nodes" = 3 + "node_taints" = ["workload.sas.com/class=stateful:NoSchedule"] + "node_labels" = { + "workload.sas.com/class" = "stateful" + } + "local_ssd_count" = 0 + "accelerator_count" = 0 + "accelerator_type" = "" + } +} + +# Jump Box +create_jump_public_ip = true +jump_vm_admin = "jumpuser" + +# Storage for SAS Viya CAS/Compute +storage_type = "standard" +# required ONLY when storage_type is "standard" to create NFS Server VM +create_nfs_public_ip = false +nfs_vm_admin = "nfsuser" +nfs_raid_disk_size = 128 diff --git a/files/cloud-init/jump/cloud-config b/files/cloud-init/jump/cloud-config new file mode 100755 index 0000000..51c44ac --- /dev/null +++ b/files/cloud-init/jump/cloud-config @@ -0,0 +1,37 @@ +#cloud-config +system_info: + default_user: + name: ${vm_admin} + +# +# First we'll update the repo and then update the OS. +# +package_update: true +package_upgrade: true + +# +# Install packages +# +packages: + - nfs-common + +# +# Update /etc/fstab +# +mounts: + - [ "${nfs_rwx_filestore_endpoint}:${nfs_rwx_filestore_path}", "${jump_rwx_filestore_path}", nfs, "_netdev,auto,x-systemd.automount,x-systemd.mount-timeout=10,timeo=14,x-systemd.idle-timeout=1min,relatime,hard,rsize=65536,wsize=65536,vers=3,tcp,namlen=255,retrans=2,sec=sys,local_lock=none", "0", "0" ] + +# +# Add nfs mounts +# +runcmd: + # + # mount the nfs + # + - while [ `df -h | grep "${nfs_rwx_filestore_endpoint}:${nfs_rwx_filestore_path}" | wc -l` -eq 0 ]; do sleep 5 && mount -a ; done + # + # Change permissions and owener + # + - mkdir -p ${jump_rwx_filestore_path}/pvs + - $(chmod -fR 777 ${jump_rwx_filestore_path} ; echo) + - $(chown -R nobody:nogroup ${jump_rwx_filestore_path} ; echo) diff --git a/files/cloud-init/nfs/cloud-config b/files/cloud-init/nfs/cloud-config new file mode 100755 index 0000000..a0c6c78 --- /dev/null +++ b/files/cloud-init/nfs/cloud-config @@ -0,0 +1,64 @@ +#cloud-config +system_info: + default_user: + name: ${vm_admin} + +# +# Wait for gcp disks to be mounted then continue +# +bootcmd: + - while [ `find /dev/disk/by-id/google-*-nfs-server-disk-* -type l | wc -l` -lt 4 ]; do sleep 5; done + +# +# First we'll update the repo and then update the OS. +# +package_update: true +package_upgrade: true + +# +# Install packages +# +packages: + - nfs-kernel-server + +# +# Create mount directories +# +runcmd: + # + # Create /export directory with the correct owner/permissions + # + - mkdir /export + + # + # Update systemctl services + # + - systemctl enable nfs-kernel-server + - systemctl start nfs-kernel-server + - systemctl enable rpc-statd + - systemctl start rpc-statd + # + # Create Raid5 Array + # + - pvcreate $(find /dev/disk/by-id/google-*-nfs-server-disk-* -type l | xargs) + - vgcreate data-vg01 $(find /dev/disk/by-id/google-*-nfs-server-disk-* -type l | xargs) + - lvcreate --type raid5 --extents 100%FREE --stripes 3 --name data-lv01 data-vg01 + - mkfs -t ext4 /dev/data-vg01/data-lv01 + # + # Update /etc/fstab + # + - echo "/dev/data-vg01/data-lv01 /export ext4 defaults,nofail,x-systemd.requires=cloud-init.service,barrier=0,discard 0 2" >>/etc/fstab + - mount -a + # + # Update /etc/exports - NOTE: The CIDR provided works for the whole VPC + # + - echo "/export ${misc_subnet_cidr}(rw,no_root_squash,async,insecure,fsid=0,crossmnt,no_subtree_check)" >> /etc/exports + - echo "/export ${gke_subnet_cidr}(rw,no_root_squash,async,insecure,fsid=0,crossmnt,no_subtree_check)" >> /etc/exports + # + # Restart nfs-server service + # + - exportfs -a + - systemctl restart nfs-kernel-server + + - chown nobody:nogroup /export -R + - chmod -R 0777 /export diff --git a/files/tools/iac_git_info.sh b/files/tools/iac_git_info.sh new file mode 100755 index 0000000..381f07e --- /dev/null +++ b/files/tools/iac_git_info.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# We need to return an error if things don't work +set -e + +if [[ -f $(which git) ]] && ( [[ -d "$(pwd)/.git" ]] || ( [[ -f "$(pwd)/.git" ]] && [[ $(cat "$(pwd)/.git" | grep "modules" ) ]] )) ; then + git log -1 --format=format:'{ "git-hash": "%H" }' +else + echo '{ "git-hash": "N/A" }' +fi diff --git a/files/tools/iac_tooling_version.sh b/files/tools/iac_tooling_version.sh new file mode 100755 index 0000000..8dc2d8d --- /dev/null +++ b/files/tools/iac_tooling_version.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# We need to return an error if things don't work +set -e + +function check_deps() { + test -f $(which jq) || error_exit "jq command not detected in path, please install it" +} + +check_deps + +TERRAFORM_INFO="$(terraform version -json)" +TERRAFORM_VERSION=$(echo $TERRAFORM_INFO | jq .terraform_version ) +TERRAFORM_REVISION=$(echo $TERRAFORM_INFO | jq .terraform_revision ) +PROVIDER_SELECTIONS=$(echo $TERRAFORM_INFO | jq -c .provider_selections ) +TERRAFORM_OUTDATED=$(echo $TERRAFORM_INFO | jq .terraform_outdated ) +# echo "${TERRAFORM_INFO | jq " + +jq -n \ + --arg terraform_version "$TERRAFORM_VERSION" \ + --arg terraform_revision "$TERRAFORM_REVISION" \ + --arg terraform_outdated "$TERRAFORM_OUTDATED" \ + --arg provider_selections "$PROVIDER_SELECTIONS" \ + '{"terraform_version":$terraform_version, "terraform_revision":$terraform_revision, "terraform_outdated":$terraform_outdated, "provider_selections":$provider_selections}' + +# echo "$(echo $TERRAFORM_INFO |jq -cr)" +# The end! diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..6a12b73 --- /dev/null +++ b/main.tf @@ -0,0 +1,328 @@ +provider "google" { + credentials = file(var.service_account_keyfile) + project = var.project +} + +provider "google-beta" { + credentials = file(var.service_account_keyfile) + project = var.project +} + +provider "kubernetes" { + host = "https://${module.gke.endpoint}" + cluster_ca_certificate = base64decode(module.gke.ca_certificate) + token = data.google_client_config.current.access_token + load_config_file = false +} + +data "google_client_config" "current" {} + +# Used for locals below. +data "google_compute_zones" "available" { + region = local.region +} + +locals { + + # get the region from "location", or else from the local config + region = var.location != "" ? regex("^[a-z0-9]*-[a-z0-9]*", var.location) : data.google_client_config.current.region + + # get the zone from "location", or else from the local config. If none is set, default to the first zone in the region + is_region = var.location != "" ? var.location == regex("^[a-z0-9]*-[a-z0-9]*", var.location) : false + first_zone = length(data.google_compute_zones.available.names) > 0 ? data.google_compute_zones.available.names[0] : "" + # all_zones = length(data.google_compute_zones.available.names) > 0 ? join(",", [for item in data.google_compute_zones.available.names : format("%s", item)]) : "" + zone = ( var.location != "" ? (local.is_region ? local.first_zone : var.location) : (data.google_client_config.current.zone == "" ? local.first_zone : data.google_client_config.current.zone) ) + location = var.location != "" ? var.location : local.zone + + default_public_access_cidrs = var.default_public_access_cidrs == null ? [] : var.default_public_access_cidrs + vm_public_access_cidrs = var.vm_public_access_cidrs == null ? local.default_public_access_cidrs : var.vm_public_access_cidrs + postgres_public_access_cidrs = var.postgres_public_access_cidrs == null ? local.default_public_access_cidrs : var.postgres_public_access_cidrs + + ssh_public_key = file(var.ssh_public_key) + + kubeconfig_path = var.iac_tooling == "docker" ? "/workspace/${var.prefix}-gke-kubeconfig.conf" : "${var.prefix}-gke-kubeconfig.conf" + + taint_effects = { + NoSchedule = "NO_SCHEDULE" + PreferNoSchedule = "PREFER_NO_SCHEDULE" + NoExecute = "NO_EXECUTE" + } + + node_pools_and_accelerator_taints = { + for node_pool, settings in var.node_pools: node_pool => { + accelerator_count = settings.accelerator_count + accelerator_type = settings.accelerator_type + local_ssd_count = settings.local_ssd_count + max_nodes = settings.max_nodes + min_nodes = settings.min_nodes + node_labels = settings.node_labels + os_disk_size = settings.os_disk_size + vm_type = settings.vm_type + node_taints = settings.accelerator_count >0 ? concat( settings.node_taints, ["nvidia.com/gpu=present:NoSchedule"]) : settings.node_taints + } + } + + node_pools = merge(local.node_pools_and_accelerator_taints, { + default = { + "vm_type" = var.default_nodepool_vm_type + "os_disk_size" = var.default_nodepool_os_disk_size + "min_nodes" = var.default_nodepool_min_nodes + "max_nodes" = var.default_nodepool_max_nodes + "node_taints" = var.default_nodepool_taints + "node_labels" = merge(var.tags, var.default_nodepool_labels,{"kubernetes.azure.com/mode"="system"}) + "local_ssd_count" = var.default_nodepool_local_ssd_count + "accelerator_count" = 0 + "accelerator_type" = "" + } + }) + + subnet_names_defaults = { + gke = "${var.prefix}-gke-subnet" + misc = "${var.prefix}-misc-subnet" + gke_pods_range_name = "${var.prefix}-gke-pods" + gke_services_range_name = "${var.prefix}-gke-services" + } + + subnet_names = length(var.subnet_names) == 0 ? local.subnet_names_defaults : var.subnet_names + + gke_subnet_cidr = length(var.subnet_names) == 0 ? var.gke_subnet_cidr : module.vpc.subnets["gke"].ip_cidr_range + misc_subnet_cidr = length(var.subnet_names) == 0 ? var.misc_subnet_cidr : module.vpc.subnets["misc"].ip_cidr_range + + gke_pod_range_index = length(var.subnet_names) == 0 ? index(module.vpc.subnets["gke"].secondary_ip_range.*.range_name, local.subnet_names["gke_pods_range_name"]) : 0 + gke_pod_subnet_cidr = length(var.subnet_names) == 0 ? var.gke_pod_subnet_cidr : module.vpc.subnets["gke"].secondary_ip_range[local.gke_pod_range_index].ip_cidr_range + +} + +data "external" "git_hash" { + program = ["files/tools/iac_git_info.sh"] +} + +data "external" "iac_tooling_version" { + program = ["files/tools/iac_tooling_version.sh"] +} + +resource "kubernetes_config_map" "sas_iac_buildinfo" { + metadata { + name = "sas-iac-buildinfo" + namespace = "kube-system" + } + + data = { + git-hash = lookup(data.external.git_hash.result, "git-hash") + iac-tooling = var.iac_tooling + terraform = < settings.node_labels + } + + node_pools_taints = { + for nodepool, settings in local.node_pools: nodepool => [ + for taint in settings.node_taints: { + key = split("=", split(":", taint)[0])[0] + value = split("=", split(":", taint)[0])[1] + effect = local.taint_effects[split(":", taint)[1]] + } + ] + } + + depends_on = [module.vpc] +} + +module "kubeconfig" { + source = "./modules/kubeconfig" + prefix = var.prefix + create_static_kubeconfig = var.create_static_kubeconfig + path = local.kubeconfig_path + namespace = "kube-system" + + cluster_name = module.gke.name + endpoint = "https://${module.gke.endpoint}" + ca_crt = module.gke.ca_certificate + + depends_on = [ module.gke ] +} + +module "postgresql" { + providers = { + google-beta = google-beta + } + source = "GoogleCloudPlatform/sql-db/google//modules/postgresql" + version = "4.5.0" + project_id = var.project + count = var.create_postgres ? 1 : 0 + + name = lower("${var.prefix}-pgsql") + random_instance_name = true // Need this because of this: https://cloud.google.com/sql/docs/mysql/delete-instance + zone = local.zone + + region = local.region // regex("^[a-z0-9]*-[a-z0-9]*", var.location) + availability_type = var.postgres_availability_type + + deletion_protection = false + module_depends_on = [google_service_networking_connection.private_vpc_connection] + + tier = var.postgres_machine_type + disk_size = var.postgres_storage_gb + + enable_default_db = false + user_name = var.postgres_administrator_login + user_password = var.postgres_administrator_password + user_labels = var.tags + + database_version = "POSTGRES_${var.postgres_server_version}" + database_flags = var.postgres_database_flags + db_charset = var.postgres_db_charset + db_collation = var.postgres_db_collation + + backup_configuration = { + enabled = var.postgres_backups_enabled + start_time = var.postgres_backups_start_time + location = var.postgres_backups_location + point_in_time_recovery_enabled = var.postgres_backups_point_in_time_recovery_enabled + } + + ip_configuration = { + private_network = module.vpc.network_self_link + require_ssl = var.postgres_ssl_enforcement_enabled + + ipv4_enabled = length(local.postgres_public_access_cidrs) > 0 ? true : false + authorized_networks = [ + for cidr in local.postgres_public_access_cidrs: { + value = cidr + } + ] + } + + additional_databases = [ + for db in var.postgres_db_names: { + name = db + charset = var.postgres_db_charset + collation = var.postgres_db_collation + } + ] +} + +module "sql_proxy_sa" { + source = "terraform-google-modules/service-accounts/google" + version = "4.0.0" + count = var.create_postgres ? 1 : 0 + project_id = var.project + prefix = var.prefix + names = ["sql-proxy-sa"] + project_roles = ["${var.project}=>roles/cloudsql.admin"] + display_name = "IAC-managed service account for cluster ${var.prefix} and sql-proxy integration." +} diff --git a/modules/google_vm/main.tf b/modules/google_vm/main.tf new file mode 100755 index 0000000..d8cd1f0 --- /dev/null +++ b/modules/google_vm/main.tf @@ -0,0 +1,58 @@ +module "address" { + source = "terraform-google-modules/address/google" + version = "2.1.1" + project_id = var.project + region = var.region + address_type = "EXTERNAL" + names = var.create_public_ip ? [ "${var.name}-address" ] : [] +} + +resource "google_compute_instance" "google_vm" { + name = var.name + machine_type = var.machine_type + zone = var.zone + labels = var.tags + + tags = [var.name] # to match the firewall rule + + boot_disk { + initialize_params { + image = var.os_image + } + } + + network_interface { + subnetwork = var.subnet + + dynamic "access_config" { + for_each = module.address.addresses + content { + nat_ip = access_config.value + } + } + } + + metadata = { + ssh-keys = "${var.vm_admin}:${var.ssh_public_key}" + user-data = var.user_data // cloud-init + } + + dynamic "attached_disk" { + for_each = google_compute_disk.raid_disk + content { + source = attached_disk.value.self_link + device_name = attached_disk.value.name + } + } + + allow_stopping_for_update = true +} + +resource "google_compute_disk" "raid_disk" { + count = var.data_disk_count + zone = var.zone + name = "${var.name}-disk-${count.index}" + labels = var.tags + type = var.data_disk_type + size = var.data_disk_size +} diff --git a/modules/google_vm/outputs.tf b/modules/google_vm/outputs.tf new file mode 100755 index 0000000..1bbe5a6 --- /dev/null +++ b/modules/google_vm/outputs.tf @@ -0,0 +1,11 @@ +output "private_ip" { + value = google_compute_instance.google_vm.network_interface.0.network_ip +} + +output "public_ip" { + value = length(module.address.addresses) > 0 ? module.address.addresses[0] : null +} + +output "admin_username" { + value = var.vm_admin +} diff --git a/modules/google_vm/variables.tf b/modules/google_vm/variables.tf new file mode 100755 index 0000000..4f68ebb --- /dev/null +++ b/modules/google_vm/variables.tf @@ -0,0 +1,69 @@ +variable "name" { + type = string +} + +variable "project" { + type = string +} + +variable "region" { + type = string +} + +variable "zone" { + type = string +} + +variable "subnet" { + type = string +} + +variable "create_public_ip" { + default = false +} + +variable "tags" { + description = "Map of common tags to be placed on the Resources" + type = map + default = { project_name = "viya401", cost_center = "rnd", environment = "dev" } +} + +variable "machine_type" { + default = "m5.4xlarge" +} + +variable "user_data" { + default = "" +} + +variable "user_data_type" { + default = "" # "cloud-config" "startup-script" +} + +variable "vm_admin" { + description = "Login account for VM" + default = "googleuser" +} + +variable "ssh_public_key" { + description = "Path to ssh public key" + default = "~/.ssh/id_rsa.pub" +} + +variable "os_image" { + default = "ubuntu-os-cloud/ubuntu-1804-lts" # FAMILY/PROJECT glcoud compute images list +} + + +variable "data_disk_count" { + default = 0 +} + +variable "data_disk_size" { + default = 128 +} + +variable "data_disk_type" { + default = "pd-ssd" +} + diff --git a/modules/kubeconfig/main.tf b/modules/kubeconfig/main.tf new file mode 100644 index 0000000..20ce701 --- /dev/null +++ b/modules/kubeconfig/main.tf @@ -0,0 +1,73 @@ +locals { + service_account_name = "${var.prefix}-cluster-admin-sa" + cluster_role_binding_name = "${var.prefix}-cluster-admin-crb" + service_account_secret_name = "${var.prefix}-sa-secret" +} + +# Provider based kube config data/template/resources +data "template_file" "kubeconfig_provider" { + count = var.create_static_kubeconfig ? 0 : 1 + template = file("${path.module}/templates/kubeconfig-provider.tmpl") + + vars = { + cluster_name = var.cluster_name + endpoint = var.endpoint + ca_crt = var.ca_crt + } +} + +# Service Account based kube config data/template/resources +data "kubernetes_secret" "sa_secret" { + count = var.create_static_kubeconfig ? 1 : 0 + metadata { + name = kubernetes_service_account.kubernetes_sa.0.default_secret_name + namespace = var.namespace + } +} + +data "template_file" "kubeconfig_sa" { + count = var.create_static_kubeconfig ? 1 : 0 + template = file("${path.module}/templates/kubeconfig-sa.tmpl") + + vars = { + cluster_name = var.cluster_name + endpoint = var.endpoint + name = local.service_account_name + ca_crt = base64encode(lookup(data.kubernetes_secret.sa_secret.0.data,"ca.crt", "")) + token = lookup(data.kubernetes_secret.sa_secret.0.data,"token", "") + namespace = var.namespace + } +} + +resource "kubernetes_service_account" "kubernetes_sa" { + count = var.create_static_kubeconfig ? 1 : 0 + metadata { + name = local.service_account_name + namespace = var.namespace + } +} + +resource "kubernetes_cluster_role_binding" "kubernetes_crb" { + count = var.create_static_kubeconfig ? 1 : 0 + metadata { + name = local.cluster_role_binding_name + } + role_ref { + api_group = "rbac.authorization.k8s.io" + kind = "ClusterRole" + name = "cluster-admin" + } + subject { + kind = "ServiceAccount" + name = local.service_account_name + namespace = var.namespace + } +} + +# kube config file generation +resource "local_file" "kubeconfig" { + content = var.create_static_kubeconfig ? data.template_file.kubeconfig_sa.0.rendered : data.template_file.kubeconfig_provider.0.rendered + filename = var.path + file_permission = "0644" + directory_permission = "0755" +} diff --git a/modules/kubeconfig/output.tf b/modules/kubeconfig/output.tf new file mode 100644 index 0000000..a70eeb7 --- /dev/null +++ b/modules/kubeconfig/output.tf @@ -0,0 +1,3 @@ +output "kube_config" { + value = local_file.kubeconfig.content +} diff --git a/modules/kubeconfig/templates/kubeconfig-provider.tmpl b/modules/kubeconfig/templates/kubeconfig-provider.tmpl new file mode 100644 index 0000000..a2beb27 --- /dev/null +++ b/modules/kubeconfig/templates/kubeconfig-provider.tmpl @@ -0,0 +1,25 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: ${ca_crt} + server: '${endpoint}' + name: ${cluster_name} +contexts: +- context: + cluster: ${cluster_name} + user: ${cluster_name} + name: ${cluster_name} +current-context: ${cluster_name} +kind: Config +preferences: {} +users: +- name: ${cluster_name} + user: + auth-provider: + config: + cmd-args: config config-helper --format=json + cmd-path: gcloud + access-token: '{.credential.access_token}' + expiry-key: '{.credential.token_expiry}' + token-key: '{.credential.access_token}' + name: gcp diff --git a/modules/kubeconfig/templates/kubeconfig-sa.tmpl b/modules/kubeconfig/templates/kubeconfig-sa.tmpl new file mode 100644 index 0000000..b512ebb --- /dev/null +++ b/modules/kubeconfig/templates/kubeconfig-sa.tmpl @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Config +clusters: + - name: ${cluster_name} + cluster: + server: '${endpoint}' + certificate-authority-data: >- + ${ca_crt} +users: + - name: ${name} + user: + token: >- + ${token} +contexts: + - name: ${cluster_name} + context: + user: ${name} + cluster: ${cluster_name} + namespace: ${namespace} +current-context: ${cluster_name} diff --git a/modules/kubeconfig/variables.tf b/modules/kubeconfig/variables.tf new file mode 100644 index 0000000..70ef932 --- /dev/null +++ b/modules/kubeconfig/variables.tf @@ -0,0 +1,23 @@ +variable "prefix" { + description = "A prefix used for all Google Cloud resources created by this script" + type = string +} + +variable "namespace" { + description = "Namespace that the service account and cluster role binding will placed." + type = string + default = "kube-system" +} + +variable "create_static_kubeconfig" { + description = "Allows the user to create a provider / service account based kube config file" + type = bool + default = false +} + +variable "path" {} +variable "cluster_name" {} +variable "endpoint" {} +variable "ca_crt" {} + + diff --git a/modules/network/main.tf b/modules/network/main.tf new file mode 100644 index 0000000..7bc7fd9 --- /dev/null +++ b/modules/network/main.tf @@ -0,0 +1,45 @@ +data "google_compute_network" "vpc" { + count = length(var.vpc_name) == 0 ? 0 : 1 + name = var.vpc_name +} +resource "google_compute_network" "vpc" { + count = length(var.vpc_name) < 1 ? 1 : 0 + name = "${var.prefix}-vpc" + auto_create_subnetworks = false +} + +data "google_compute_subnetwork" "gke_subnet" { + count = var.create_subnets ? 0 : 1 + name = var.subnet_names["gke"] + region = var.region +} +resource "google_compute_subnetwork" "gke_subnet" { + count = var.create_subnets ? 1 : 0 + name = var.subnet_names["gke"] + ip_cidr_range = var.gke_subnet_cidr + region = var.region + network = length(var.vpc_name) == 0 ? google_compute_network.vpc.0.id : data.google_compute_network.vpc.0.id + private_ip_google_access = true + secondary_ip_range { + range_name = var.subnet_names["gke_pods_range_name"] + ip_cidr_range = var.gke_pod_subnet_cidr // /17 + } + secondary_ip_range { + range_name = var.subnet_names["gke_services_range_name"] + ip_cidr_range = var.gke_service_subnet_cidr // /22 + } +} + +data "google_compute_subnetwork" "misc_subnet" { + count = var.create_subnets ? 0 : 1 + name = var.subnet_names["misc"] + region = var.region +} +resource "google_compute_subnetwork" "misc_subnet" { + count = var.create_subnets ? 1 : 0 + name = var.subnet_names["misc"] + ip_cidr_range = var.misc_subnet_cidr + region = var.region + network = length(var.vpc_name) == 0 ? google_compute_network.vpc.0.id : data.google_compute_network.vpc.0.id + private_ip_google_access = false +} diff --git a/modules/network/outputs.tf b/modules/network/outputs.tf new file mode 100755 index 0000000..b229378 --- /dev/null +++ b/modules/network/outputs.tf @@ -0,0 +1,14 @@ +output "network_name" { + value = length(var.vpc_name) == 0 ? element(coalescelist(google_compute_network.vpc.*.name,[" "]),0) : var.vpc_name +} + +output "network_self_link" { + value = length(var.vpc_name) == 0 ? element(coalescelist(google_compute_network.vpc.*.self_link,[" "]),0) : data.google_compute_network.vpc.0.self_link +} + +output subnets { + value = { + gke : var.create_subnets ? element(coalescelist(google_compute_subnetwork.gke_subnet,[" "]),0) : data.google_compute_subnetwork.gke_subnet.0 + misc: var.create_subnets ? element(coalescelist(google_compute_subnetwork.misc_subnet,[" "]),0) : data.google_compute_subnetwork.misc_subnet.0 + } +} diff --git a/modules/network/variables.tf b/modules/network/variables.tf new file mode 100644 index 0000000..713f994 --- /dev/null +++ b/modules/network/variables.tf @@ -0,0 +1,54 @@ +variable "prefix" { + type = string +} + +variable "project" { + type = string +} + +variable "region" { + type = string +} + +variable "tags" { + description = "Map of tags to be placed on the Resources" + type = map + default = {} +} + +# Network +variable "vpc_name" { + type = string + default = "" + description = "Name of pre-exising VPC. Leave blank to have one created" +} +variable "subnet_names" { + type = map(string) + default = {} + description = "Map subnet usage roles to existing subnet names" +} + +variable "create_subnets" { + type = bool +} + +variable "gke_subnet_cidr" { + default = "192.168.0.0/23" +} + +variable "misc_subnet_cidr" { + default = "192.168.2.0/24" +} + +variable "gke_pod_subnet_cidr" { + default = "10.0.0.0/17" +} + +variable "gke_service_subnet_cidr" { + default = "10.1.0.0/22" +} + +variable "gke_control_plane_subnet_cidr" { + default = "10.2.0.0/28" +} + diff --git a/network.tf b/network.tf new file mode 100644 index 0000000..4a94edd --- /dev/null +++ b/network.tf @@ -0,0 +1,119 @@ +data "google_compute_address" "nat_address" { + count = length(var.nat_address_name) == 0 ? 0 : 1 + name = var.nat_address_name + project = var.project + region = local.region +} + +module "nat_address" { + count = length(var.nat_address_name) == 0 ? 1 : 0 + source = "terraform-google-modules/address/google" + version = "2.1.1" + project_id = var.project + region = local.region + address_type = "EXTERNAL" + names = [ + "${var.prefix}-nat-address" + ] +} + +module "cloud_nat" { + count = length(var.nat_address_name) == 0 ? 1 : 0 + source = "terraform-google-modules/cloud-nat/google" + version = "1.4.0" + project_id = var.project + name = "${var.prefix}-cloud-nat" + region = local.region + create_router = true + router = "${var.prefix}-router" + network = module.vpc.network_self_link + nat_ips = module.nat_address.0.self_links +} + + +module "vpc" { + source = "./modules/network" + vpc_name = trimspace(var.vpc_name) + project = var.project + prefix = var.prefix + region = local.region + subnet_names = local.subnet_names + create_subnets = length(var.subnet_names) == 0 ? true : false + gke_subnet_cidr = var.gke_subnet_cidr + misc_subnet_cidr = var.misc_subnet_cidr + gke_pod_subnet_cidr = var.gke_pod_subnet_cidr + gke_service_subnet_cidr = var.gke_service_subnet_cidr +} + + +# All about how to use "private ip" to configure access from gke to cloud sql: +# https://cloud.google.com/sql/docs/postgres/private-ip + +resource "google_compute_global_address" "private_ip_address" { + name = "${var.prefix}-private-ip-address" + count = var.create_postgres ? 1 : 0 + + purpose = "VPC_PEERING" + address_type = "INTERNAL" + address = "192.168.4.0" + prefix_length = 22 + network = module.vpc.network_self_link +} + +resource "google_service_networking_connection" "private_vpc_connection" { + count = var.create_postgres ? 1 : 0 + + network = module.vpc.network_name + service = "servicenetworking.googleapis.com" + reserved_peering_ranges = [google_compute_global_address.private_ip_address[0].name] +} + +resource "google_compute_firewall" "nfs_vm_cluster_firewall" { + name = "${var.prefix}-nfs-server-cluster-firewall" + count = var.storage_type == "standard" ? 1 : 0 + network = module.vpc.network_name + + allow { + protocol = "tcp" + } + allow { + protocol = "udp" + } + + target_tags = ["${var.prefix}-nfs-server"] # matches the tag on the nfs server + + # the node group vms are tagged with the cluster name + source_tags = ["${var.prefix}-gke", "${var.prefix}-jump-server"] + source_ranges = distinct(concat([local.gke_pod_subnet_cidr], [local.gke_subnet_cidr])) # allow the pods +} + +resource "google_compute_firewall" "nfs_vm_firewall" { + name = "${var.prefix}-nfs-server-firewall" + count = (var.storage_type == "standard" && var.create_nfs_public_ip) ? 1 : 0 + network = module.vpc.network_name + + allow { + protocol = "tcp" + ports = ["22"] + } + + target_tags = ["${var.prefix}-nfs-server"] # matches the tag on the jump server + + source_ranges = local.vm_public_access_cidrs +} + +resource "google_compute_firewall" "jump_vm_firewall" { + name = "${var.prefix}-jump-server-firewall" + count = (var.create_jump_public_ip && var.create_jump_vm && length(local.vm_public_access_cidrs) != 0) ? 1 : 0 + + network = module.vpc.network_name + + allow { + protocol = "tcp" + ports = ["22"] + } + + target_tags = ["${var.prefix}-jump-server"] # matches the tag on the jump server + + source_ranges = local.vm_public_access_cidrs +} diff --git a/outputs.tf b/outputs.tf new file mode 100644 index 0000000..79a5583 --- /dev/null +++ b/outputs.tf @@ -0,0 +1,121 @@ +output "cluster_name" { + description = "GKE Cluster name" + value = module.gke.name +} + +output "cluster_endpoint" { + description = "GKE Cluster public IP" + value = module.gke.endpoint +} + +output "kube_config" { + value = module.kubeconfig.kube_config +} + +output "postgres_fqdn" { + description = "Private IP of the PostgreSQL server. Use this value to set DATABASE_HOST in your Viya deployment." + value = var.create_postgres ? module.postgresql.0.private_ip_address : null +} + +output "postgres_server_public_ip" { + description = "Public IP of the PostgreSQL server. Use this value to connect database clients." + value = (var.create_postgres && (length(local.postgres_public_access_cidrs) > 0)) ? module.postgresql.0.public_ip_address : null +} + +output "postgres_server_name" { + value = var.create_postgres ? module.postgresql.0.instance_name : null +} + +output "postgres_connection_name" { + value = var.create_postgres ? module.postgresql.0.instance_connection_name : null +} + +output "postgres_admin" { + value = var.create_postgres ? var.postgres_administrator_login : null +} + +output "postgres_password" { + value = var.create_postgres ? var.postgres_administrator_password : null +} + +output "postgres_server_id" { + value = var.create_postgres ? module.postgresql.0.instance_name : null +} + +output "postgres_server_port" { + value = var.create_postgres ? "5432" : null +} + +output "postgres_server_cert" { + value = var.create_postgres ? module.postgresql.0.instance_server_ca_cert.0.cert : null +} + +output "sql_proxy_sa_email" { + value = var.create_postgres ? module.sql_proxy_sa.0.service_account.email : null +} + +output "rwx_filestore_endpoint" { + description = "Shared Storage private IP" + value = var.storage_type == "ha" ? element(coalescelist(google_filestore_instance.rwx.*.networks.0.ip_addresses.0,[""]),0) : module.nfs_server.0.private_ip +} + +output "rwx_filestore_path" { + description = "Shared Storage mount path" + value = var.storage_type == "ha" ? "/${element(coalescelist(google_filestore_instance.rwx.*.file_shares.0.name,[""]),0)}" : "/export" +} + +output "nat_ip" { + description = "Public IP of NAT for private network." + value = length(var.nat_address_name) == 0 ? (length(module.nat_address.0.addresses) > 0 ? element(module.nat_address.0.addresses, 0) : null) : data.google_compute_address.nat_address.0.address +} + +output "prefix" { + value = var.prefix +} + +output "location" { + value = var.location +} + +output "provider_account" { + value = data.google_client_config.current.project +} + +output "provider" { + value = "gcp" +} + +# # bastion server +output "jump_private_ip" { + value = var.create_jump_vm ? module.jump_server.0.private_ip : null +} + +output "jump_public_ip" { + value = var.create_jump_vm ? module.jump_server.0.public_ip : null +} + +output "jump_rwx_filestore_path" { + value = var.create_jump_vm ? var.jump_rwx_filestore_path : null +} + +output "jump_admin_username" { + value = var.create_jump_vm ? module.jump_server.0.admin_username : null +} + +# NFS server +output "nfs_private_ip" { + value = var.storage_type == "ha" ? null : module.nfs_server.0.private_ip +} + +output "nfs_public_ip" { + value = var.storage_type == "ha" ? null : module.nfs_server.0.public_ip +} + +output "nfs_admin_username" { + value = var.storage_type == "ha" ? null : module.nfs_server.0.admin_username +} + +# Container regsitry +output "cr_endpoint" { + value = var.create_container_registry ? "https://gcr.io/${var.project}" : null +} diff --git a/variables.tf b/variables.tf new file mode 100644 index 0000000..ee50188 --- /dev/null +++ b/variables.tf @@ -0,0 +1,446 @@ +variable "prefix" { + description = "A prefix used in the name for all cloud resources created by this script. The prefix string must start with lowercase letter and contain only lowercase alphanumeric characters and hyphen or dash(-), but can not start or end with '-'." + validation { + condition = can(regex("^[a-z][-0-9a-z]*[0-9a-z]$", var.prefix)) + error_message = "ERROR: Value of 'prefix'\n * must start with lowercase letter\n * can only contain lowercase letters, numbers, and hyphen or dash(-), but can't start or end with '-'." + } +} + +variable "location" { + description = <