Skip to content

Commit

Permalink
add stateless redis-guestbook example
Browse files Browse the repository at this point in the history
  • Loading branch information
jhole89 committed Apr 21, 2020
1 parent 4776b16 commit 05d9eff
Show file tree
Hide file tree
Showing 10 changed files with 224 additions and 0 deletions.
26 changes: 26 additions & 0 deletions okteto-redis-guestbook/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# okteto-redis-guestbook
Example of running [redis-guestbook](https://kubernetes.io/docs/tutorials/stateless-application/guestbook/)
on [okteto-cloud](https://cloud.okteto.com/) using pure terraform

Prerequisites
* [Terraform > 0.12](https://www.terraform.io/downloads.html)
* [Okteto Cloud account](https://cloud.okteto.com/#/login)

Steps:
1. Clone repo: `git clone [email protected]:jhole89/terraform-k8s-example.git`
2. Change to this directory: `cd okteto-redis-guestbook`
3. Initialise terraform: `terraform init`
4. Copy tfvars template: `cp terraform.tfvars.template terraform.tfvars`
5. Fill in `terraform.tfvars` with Okteto values (found in your `okteto-kube.config` - make sure your
`okteto-kube.config` is also in your `~/.kube/config`)
6. Apply terraform plan: `terraform apply --auto-approve` - you should see the following output
```
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Outputs:

frontend_url = https://frontend-jhole89.cloud.okteto.net/
```
6. The plan outputs the `url` exposed through the kubernetes service. You can now hit the
endpoint using any web browser.
7. Once no longer required you can remove all resources: `terraform destroy --auto-approve`
61 changes: 61 additions & 0 deletions okteto-redis-guestbook/frontend.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
locals {
labels = {
app = "guestbook"
tier = "frontend"
}
}

resource "kubernetes_deployment" "frontend" {
metadata {
name = local.labels.tier
namespace = var.okteto_cluster_namespace
labels = {
app = local.labels.app
}
}
spec {
selector {
match_labels = local.labels
}
replicas = 3
template {
metadata {
labels = local.labels
}
spec {
container {
name = "php-redis"
image = "gcr.io/google-samples/gb-frontend:v4"
resources {
requests {
cpu = "100m"
memory = "100Mi"
}
}
env {
name = "GET_HOSTS_FROM"
value = "dns"
}
port {
container_port = 80
}
}
}
}
}
}

resource "kubernetes_service" "frontend" {
metadata {
name = kubernetes_deployment.frontend.metadata[0].name
namespace = var.okteto_cluster_namespace
labels = kubernetes_deployment.frontend.spec[0].template[0].metadata[0].labels
}
spec {
type = "NodePort"
port {
port = 80
}
selector = kubernetes_deployment.frontend.spec[0].template[0].metadata[0].labels
}
}
3 changes: 3 additions & 0 deletions okteto-redis-guestbook/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
output "frontend_url" {
value = "https://${kubernetes_service.frontend.metadata[0].name}-${var.okteto_cluster_namespace}.cloud.okteto.net/"
}
4 changes: 4 additions & 0 deletions okteto-redis-guestbook/provider.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
provider "kubernetes" {
config_context_auth_info = var.okteto_cluser_user
config_context_cluster = var.okteto_cluster_name
}
22 changes: 22 additions & 0 deletions okteto-redis-guestbook/redis.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module "master" {
source = "./redis"

namespace = var.okteto_cluster_namespace
role = "master"
container_port = 6379
service_port = 6379
}

module "slave" {
source = "./redis"

namespace = var.okteto_cluster_namespace
role = "slave"
replicas = 2
container_port = 6379
service_port = 6379
env = [{
name = "GET_HOSTS_FROM"
value = "dns"
}]
}
69 changes: 69 additions & 0 deletions okteto-redis-guestbook/redis/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
locals {
labels = {
app = "redis"
tier = "backend"
role = var.role
}
}

resource "kubernetes_deployment" "deployment" {
metadata {
name = "${local.labels.app}-${local.labels.role}"
namespace = var.namespace
labels = {
app = local.labels.app
}
}

spec {
replicas = 1

selector {
match_labels = local.labels
}
template {
metadata {
labels = local.labels
}
spec {
container {
name = local.labels.role
image = var.role == "master" ? "k8s.gcr.io/redis:e2e" : "gcr.io/google_samples/gb-redisslave:v3"
resources {
requests {
cpu = "100m"
memory = "100Mi"
}
}
port {
container_port = var.container_port
}
dynamic env {
for_each = var.env
content {
name = env.value["name"]
value = env.value["value"]
}
}
}
}
}
}
}

resource "kubernetes_service" "service" {
metadata {
name = kubernetes_deployment.deployment.metadata[0].name
namespace = var.namespace
labels = kubernetes_deployment.deployment.spec[0].template[0].metadata[0].labels
}

spec {
selector = kubernetes_deployment.deployment.metadata[0].labels

port {
port = var.service_port
target_port = kubernetes_deployment.deployment.spec[0].template[0].spec[0].container[0].port[0].container_port
}
}
}
3 changes: 3 additions & 0 deletions okteto-redis-guestbook/redis/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
output "service_endpoint" {
value = "https://${kubernetes_service.service.metadata[0].name}-${var.namespace}.cloud.okteto.net/"
}
30 changes: 30 additions & 0 deletions okteto-redis-guestbook/redis/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
variable "role" {
type = string
description = "The node role. Must be one of master | slave"
default = "slave"
}

variable "namespace" {
type = string
description = "k8s namespace"
}

variable "replicas" {
type = number
default = 1
}

variable "container_port" {
type = number
description = "The container port"
}

variable "service_port" {
type = number
description = "The service port"
}

variable "env" {
type = list(map(string))
default = []
}
3 changes: 3 additions & 0 deletions okteto-redis-guestbook/terraform.tfvars.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
okteto_cluster_name = ""
okteto_cluser_user = ""
okteto_cluster_namespace = ""
3 changes: 3 additions & 0 deletions okteto-redis-guestbook/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
variable "okteto_cluster_name" {}
variable "okteto_cluser_user" {}
variable "okteto_cluster_namespace" {}

0 comments on commit 05d9eff

Please sign in to comment.