From 6f31ae64342d3d2c0cf200860b741c297d0d5ab0 Mon Sep 17 00:00:00 2001 From: Matt Kornfield Date: Tue, 4 Jul 2023 17:14:20 -0700 Subject: [PATCH] Install knative --- knative/.gitignore | 3 ++ knative/README.md | 40 ++++++++++++++++ knative/dev/backend.tf | 17 +++++++ knative/dev/main.tf | 4 ++ knative/dev/provider.tf | 10 ++++ knative/knative_k8s/knative_eventing.yaml | 10 ++++ knative/knative_k8s/knative_serving.yaml | 10 ++++ knative/knative_k8s/main.tf | 58 +++++++++++++++++++++++ knative/knative_k8s/provider.tf | 13 +++++ knative/knative_k8s/variables.tf | 3 ++ knative/prod/backend.tf | 17 +++++++ knative/prod/main.tf | 4 ++ knative/prod/provider.tf | 10 ++++ knative/test/backend.tf | 17 +++++++ knative/test/main.tf | 4 ++ knative/test/provider.tf | 10 ++++ 16 files changed, 230 insertions(+) create mode 100644 knative/.gitignore create mode 100644 knative/README.md create mode 100644 knative/dev/backend.tf create mode 100644 knative/dev/main.tf create mode 100644 knative/dev/provider.tf create mode 100644 knative/knative_k8s/knative_eventing.yaml create mode 100644 knative/knative_k8s/knative_serving.yaml create mode 100644 knative/knative_k8s/main.tf create mode 100644 knative/knative_k8s/provider.tf create mode 100644 knative/knative_k8s/variables.tf create mode 100644 knative/prod/backend.tf create mode 100644 knative/prod/main.tf create mode 100644 knative/prod/provider.tf create mode 100644 knative/test/backend.tf create mode 100644 knative/test/main.tf create mode 100644 knative/test/provider.tf diff --git a/knative/.gitignore b/knative/.gitignore new file mode 100644 index 0000000..4f03565 --- /dev/null +++ b/knative/.gitignore @@ -0,0 +1,3 @@ +template +build +.secrets diff --git a/knative/README.md b/knative/README.md new file mode 100644 index 0000000..f8ff70f --- /dev/null +++ b/knative/README.md @@ -0,0 +1,40 @@ +# What is Knative? + +A way to deploy FaaS objects into Kubernetes + +## How to get started + +Install the CLI + +```bash +brew tap knative-sandbox/kn-plugins +brew install func +``` + +To deploy a Knative function, use a yaml like the following: + +```yaml +apiVersion: serving.knative.dev/v1 +kind: Service +metadata: + name: hello +spec: + template: + spec: + containers: + - image: ghcr.io/knative/helloworld-go:latest # Container to be used + ports: + - containerPort: 8080 + env: + - name: TARGET # Env vars + value: "World" +``` + +The lifecycle of building and deploying the image used as the service +is described [here](https://knative.dev/docs/getting-started/create-a-function/) + +e.g. the following will create a folder with a python function in it + +```bash +func create -l python hello +``` diff --git a/knative/dev/backend.tf b/knative/dev/backend.tf new file mode 100644 index 0000000..f0581eb --- /dev/null +++ b/knative/dev/backend.tf @@ -0,0 +1,17 @@ + +terraform { + # DigitalOcean uses the S3 spec. + backend "s3" { + bucket = "treetracker-dev-terraform" + key = "terraform-knative.tfstate" + endpoint = "https://sfo2.digitaloceanspaces.com" + # DO uses the S3 format + # eu-west-1 is used to pass TF validation + # Region is ACTUALLY sfo2 on DO + region = "eu-west-1" + # Deactivate a few checks as TF will attempt these against AWS + skip_credentials_validation = true + skip_metadata_api_check = true + skip_region_validation = true + } +} diff --git a/knative/dev/main.tf b/knative/dev/main.tf new file mode 100644 index 0000000..8991f3a --- /dev/null +++ b/knative/dev/main.tf @@ -0,0 +1,4 @@ +module "knative" { + source = "../knative_k8s" + cluster_name = "dev-k8s-treetracker" +} diff --git a/knative/dev/provider.tf b/knative/dev/provider.tf new file mode 100644 index 0000000..1f4b1a9 --- /dev/null +++ b/knative/dev/provider.tf @@ -0,0 +1,10 @@ +terraform { + required_providers { + digitalocean = { + source = "digitalocean/digitalocean" + version = "2.28.1" + } + kubernetes = "2.16.1" + helm = "2.8.0" + } +} diff --git a/knative/knative_k8s/knative_eventing.yaml b/knative/knative_k8s/knative_eventing.yaml new file mode 100644 index 0000000..232b31f --- /dev/null +++ b/knative/knative_k8s/knative_eventing.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: knative-eventing +--- +apiVersion: operator.knative.dev/v1beta1 +kind: KnativeEventing +metadata: + name: knative-eventing + namespace: knative-eventing diff --git a/knative/knative_k8s/knative_serving.yaml b/knative/knative_k8s/knative_serving.yaml new file mode 100644 index 0000000..cabebb5 --- /dev/null +++ b/knative/knative_k8s/knative_serving.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: knative-serving +--- +apiVersion: operator.knative.dev/v1beta1 +kind: KnativeServing +metadata: + name: knative-serving + namespace: knative-serving diff --git a/knative/knative_k8s/main.tf b/knative/knative_k8s/main.tf new file mode 100644 index 0000000..5006ecf --- /dev/null +++ b/knative/knative_k8s/main.tf @@ -0,0 +1,58 @@ +data "digitalocean_kubernetes_cluster" "dev" { + name = var.cluster_name +} + + +provider "kubernetes" { + host = data.digitalocean_kubernetes_cluster.dev.endpoint + token = data.digitalocean_kubernetes_cluster.dev.kube_config[0].token + cluster_ca_certificate = base64decode( + data.digitalocean_kubernetes_cluster.dev.kube_config[0].cluster_ca_certificate + ) +} + +provider "kubectl" { + host = data.digitalocean_kubernetes_cluster.dev.endpoint + token = data.digitalocean_kubernetes_cluster.dev.kube_config[0].token + cluster_ca_certificate = base64decode( + data.digitalocean_kubernetes_cluster.dev.kube_config[0].cluster_ca_certificate + ) +} + +data "http" "knative_operator_yaml" { + url = "https://github.com/knative/operator/releases/download/knative-v1.10.2/operator.yaml" + + # Optional request headers + request_headers = { + Accept = "application/yaml" + } +} + +data "kubectl_file_documents" "docs" { + content = tostring(data.http.knative_operator_yaml.body) +} + +resource "kubectl_manifest" "knative_operator" { + for_each = data.kubectl_file_documents.docs.manifests + yaml_body = each.value +} + +data "kubectl_file_documents" "serving_docs" { + content = file("${path.module}/knative_serving.yaml") +} + +resource "kubectl_manifest" "knative_serving" { + for_each = data.kubectl_file_documents.serving_docs.manifests + yaml_body = each.value +} + + + +data "kubectl_file_documents" "eventing_docs" { + content = file("${path.module}/knative_eventing.yaml") +} + +resource "kubectl_manifest" "knative_eventing" { + for_each = data.kubectl_file_documents.eventing_docs.manifests + yaml_body = each.value +} diff --git a/knative/knative_k8s/provider.tf b/knative/knative_k8s/provider.tf new file mode 100644 index 0000000..9a23e08 --- /dev/null +++ b/knative/knative_k8s/provider.tf @@ -0,0 +1,13 @@ +terraform { + required_providers { + digitalocean = { + source = "digitalocean/digitalocean" + version = "2.28.1" + } + kubernetes = "2.16.1" + kubectl = { + source = "gavinbunney/kubectl" + version = "1.14.0" + } + } +} diff --git a/knative/knative_k8s/variables.tf b/knative/knative_k8s/variables.tf new file mode 100644 index 0000000..abbf86f --- /dev/null +++ b/knative/knative_k8s/variables.tf @@ -0,0 +1,3 @@ +variable "cluster_name" { + type = string +} diff --git a/knative/prod/backend.tf b/knative/prod/backend.tf new file mode 100644 index 0000000..82337a4 --- /dev/null +++ b/knative/prod/backend.tf @@ -0,0 +1,17 @@ + +terraform { + # DigitalOcean uses the S3 spec. + backend "s3" { + bucket = "treetracker-production-terraform" + key = "terraform-knative.tfstate" + endpoint = "https://sfo2.digitaloceanspaces.com" + # DO uses the S3 format + # eu-west-1 is used to pass TF validation + # Region is ACTUALLY sfo2 on DO + region = "eu-west-1" + # Deactivate a few checks as TF will attempt these against AWS + skip_credentials_validation = true + skip_metadata_api_check = true + skip_region_validation = true + } +} diff --git a/knative/prod/main.tf b/knative/prod/main.tf new file mode 100644 index 0000000..0122520 --- /dev/null +++ b/knative/prod/main.tf @@ -0,0 +1,4 @@ +module "knative" { + source = "../knative_k8s" + cluster_name = "prod-k8s-treetracker" +} diff --git a/knative/prod/provider.tf b/knative/prod/provider.tf new file mode 100644 index 0000000..1f4b1a9 --- /dev/null +++ b/knative/prod/provider.tf @@ -0,0 +1,10 @@ +terraform { + required_providers { + digitalocean = { + source = "digitalocean/digitalocean" + version = "2.28.1" + } + kubernetes = "2.16.1" + helm = "2.8.0" + } +} diff --git a/knative/test/backend.tf b/knative/test/backend.tf new file mode 100644 index 0000000..c90fef3 --- /dev/null +++ b/knative/test/backend.tf @@ -0,0 +1,17 @@ + +terraform { + # DigitalOcean uses the S3 spec. + backend "s3" { + bucket = "treetracker-test-terraform" + key = "terraform-knative.tfstate" + endpoint = "https://sfo2.digitaloceanspaces.com" + # DO uses the S3 format + # eu-west-1 is used to pass TF validation + # Region is ACTUALLY sfo2 on DO + region = "eu-west-1" + # Deactivate a few checks as TF will attempt these against AWS + skip_credentials_validation = true + skip_metadata_api_check = true + skip_region_validation = true + } +} diff --git a/knative/test/main.tf b/knative/test/main.tf new file mode 100644 index 0000000..1d1e270 --- /dev/null +++ b/knative/test/main.tf @@ -0,0 +1,4 @@ +module "knative" { + source = "../knative_k8s" + cluster_name = "test-k8s-treetracker" +} diff --git a/knative/test/provider.tf b/knative/test/provider.tf new file mode 100644 index 0000000..1f4b1a9 --- /dev/null +++ b/knative/test/provider.tf @@ -0,0 +1,10 @@ +terraform { + required_providers { + digitalocean = { + source = "digitalocean/digitalocean" + version = "2.28.1" + } + kubernetes = "2.16.1" + helm = "2.8.0" + } +}