Skip to content

Commit faeed85

Browse files
committed
start adding AKS
1 parent 397969b commit faeed85

File tree

10 files changed

+295
-1
lines changed

10 files changed

+295
-1
lines changed

_examples/aks/README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# AKS (Azure Kubernetes Service)
2+
3+
This example shows how to use the Terraform Kubernetes Provider and Terraform Helm Provider to configure an AKS cluster. The example builds the AKS cluster and applies the Kubernetes configurations in a single operation.
4+
5+
You will need the following environment variables to be set:
6+
7+
- `ARM_SUBSCRIPTION_ID`
8+
- `ARM_TENANT_ID`
9+
- `ARM_CLIENT_ID`
10+
- `ARM_CLIENT_SECRET`
11+
12+
See [AWS Provider docs](https://www.terraform.io/docs/providers/aws/index.html#configuration-reference) for more details about these variables and alternatives, like `AWS_PROFILE`.
13+
14+
To install the EKS cluster using default values, run terraform init and apply from the directory containing this README.
15+
16+
```
17+
terraform init
18+
terraform apply
19+
```
20+
21+
## Kubeconfig for manual CLI access
22+
23+
This example generates a kubeconfig file in the current working directory. However, the token in this config expires in 15 minutes. The token can be refreshed by running `terraform apply` again. Export the KUBECONFIG to manually access the cluster:
24+
25+
```
26+
terraform apply
27+
export KUBECONFIG=$(terraform output kubeconfig_path|jq -r)
28+
kubectl get pods -n test
29+
```
30+
31+
## Optional variables
32+
33+
The Kubernetes version can be specified at apply time:
34+
35+
```
36+
terraform apply -var=kubernetes_version=1.18
37+
```
38+
39+
See https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html for currently available versions.
40+

_examples/aks/aks-cluster/main.tf

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
provider "azurerm" {
2+
features {}
3+
}
4+
5+
resource "azurerm_resource_group" "test" {
6+
name = local.cluster_name
7+
location = var.location
8+
}
9+
10+
resource "azurerm_kubernetes_cluster" "test" {
11+
name = local.cluster_name
12+
location = azurerm_resource_group.test.location
13+
resource_group_name = azurerm_resource_group.test.name
14+
dns_prefix = local.cluster_name
15+
16+
default_node_pool {
17+
name = "default"
18+
node_count = 1
19+
vm_size = "Standard_DS2_v2"
20+
}
21+
22+
identity {
23+
type = "SystemAssigned"
24+
}
25+
26+
addon_profile {
27+
aci_connector_linux {
28+
enabled = false
29+
}
30+
31+
azure_policy {
32+
enabled = false
33+
}
34+
35+
http_application_routing {
36+
enabled = false
37+
}
38+
39+
kube_dashboard {
40+
enabled = true
41+
}
42+
43+
oms_agent {
44+
enabled = false
45+
}
46+
}
47+
}
48+
49+
resource "local_file" "kubeconfig" {
50+
content = azurerm_kubernetes_cluster.test.kube_config_raw
51+
filename = "${path.module}/kubeconfig"
52+
}
53+
54+
resource "azurerm_managed_disk" "test" {
55+
name = "testdisk"
56+
location = azurerm_resource_group.test.location
57+
resource_group_name = azurerm_resource_group.test.name
58+
storage_account_type = "Standard_LRS"
59+
create_option = "Empty"
60+
disk_size_gb = "1"
61+
tags = {
62+
environment = azurerm_resource_group.test.name
63+
}
64+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
output "cluster_ca_cert" {
2+
value = azurerm_kubernetes_cluster.example.kube_config.0.client_certificate
3+
}
4+
5+
output "cluster_endpoint" {
6+
value = azurerm_kubernetes_cluster.example.kube_config.0.endpoint
7+
}
8+
9+
output "data_disk_uri" {
10+
value = azurerm_managed_disk.test.id
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
variable "kubernetes_version" {
2+
default = "1.18"
3+
}
4+
5+
variable "workers_count" {
6+
default = "3"
7+
}
8+
9+
variable "cluster_name" {
10+
type = string
11+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# This fetches a new token, which will expire in 1 hour.
2+
data "azurerm_kubernetes_cluster" "main" {
3+
name = var.cluster_name
4+
resource_group_name = var.cluster_name
5+
}
6+
7+
provider "kubernetes" {
8+
host = "${data.azurerm_kubernetes_cluster.main.kube_config.0.host}"
9+
client_certificate = "${base64decode(data.azurerm_kubernetes_cluster.main.kube_config.0.client_certificate)}"
10+
client_key = "${base64decode(data.azurerm_kubernetes_cluster.main.kube_config.0.client_key)}"
11+
cluster_ca_certificate = "${base64decode(data.azurerm_kubernetes_cluster.main.kube_config.0.cluster_ca_certificate)}"
12+
}
13+
14+
resource "kubernetes_namespace" "test" {
15+
depends_on = [var.cluster_name]
16+
metadata {
17+
name = "test"
18+
}
19+
}
20+
21+
resource "kubernetes_persistent_volume" "test" {
22+
depends_on = [var.cluster_name]
23+
metadata {
24+
name = "test"
25+
}
26+
spec {
27+
capacity = {
28+
storage = "1Gi"
29+
}
30+
access_modes = ["ReadWriteOnce"]
31+
persistent_volume_source {
32+
azure_disk {
33+
caching_mode = "None"
34+
data_disk_uri = var.disk_uri
35+
disk_name = "managed"
36+
kind = "Managed"
37+
}
38+
}
39+
}
40+
}
41+
42+
resource "kubernetes_deployment" "test" {
43+
metadata {
44+
name = "test"
45+
namespace= kubernetes_namespace.test.metadata.0.name
46+
}
47+
spec {
48+
replicas = 2
49+
selector {
50+
match_labels = {
51+
TestLabelOne = "one"
52+
}
53+
}
54+
template {
55+
metadata {
56+
labels = {
57+
TestLabelOne = "one"
58+
}
59+
}
60+
spec {
61+
container {
62+
image = "nginx:1.19.4"
63+
name = "tf-acc-test"
64+
65+
resources {
66+
limits = {
67+
memory = "512M"
68+
cpu = "1"
69+
}
70+
requests = {
71+
memory = "256M"
72+
cpu = "50m"
73+
}
74+
}
75+
}
76+
}
77+
}
78+
}
79+
}
80+
81+
provider "helm" {
82+
kubernetes {
83+
host = var.cluster_endpoint
84+
token = data.google_client_config.default.access_token
85+
cluster_ca_certificate = base64decode(var.cluster_ca_cert)
86+
}
87+
}
88+
89+
resource helm_release nginx_ingress {
90+
name = "nginx-ingress-controller"
91+
92+
repository = "https://charts.bitnami.com/bitnami"
93+
chart = "nginx-ingress-controller"
94+
95+
set {
96+
name = "service.type"
97+
value = "ClusterIP"
98+
}
99+
}
100+
101+
data "template_file" "kubeconfig" {
102+
template = file("${path.module}/kubeconfig-template.yaml")
103+
104+
vars = {
105+
cluster_name = var.cluster_name
106+
endpoint = var.cluster_endpoint
107+
cluster_ca = var.cluster_ca_cert
108+
cluster_token = data.google_client_config.default.access_token
109+
}
110+
}
111+
112+
resource "local_file" "kubeconfig" {
113+
depends_on = [var.cluster_id]
114+
content = data.template_file.kubeconfig.rendered
115+
filename = "${path.root}/kubeconfig"
116+
}
117+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
azurerm_managed_disk.test.id

_examples/aks/main.tf

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
terraform {
2+
required_providers {
3+
kubernetes = {
4+
 source = "hashicorp/kubernetes"
5+
# version = "2.0"
6+
 }
7+
google = {
8+
 source = "hashicorp/azure"
9+
 version = "2.42"
10+
 }
11+
helm = {
12+
 source = "hashicorp/helm"
13+
 version = "2.0.1"
14+
 }
15+
 }
16+
}
17+
18+
resource "random_id" "cluster_name" {
19+
byte_length = 5
20+
}
21+
22+
23+
module "aks-cluster" {
24+
source = "./aks-cluster"
25+
cluster_name = local.cluster_name
26+
}
27+
28+
module "kubernetes-config" {
29+
source = "./kubernetes-config"
30+
cluster_name = module.aks-cluster.cluster_name
31+
cluster_id = module.aks-cluster.cluster_id # creates dependency on cluster creation
32+
cluster_endpoint = module.aks-cluster.cluster_endpoint
33+
cluster_ca_cert = module.aks-cluster.cluster_ca_cert
34+
}
35+

_examples/aks/outputs.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
output "kubeconfig_path" {
2+
value = abspath("${path.root}/kubeconfig")
3+
}
4+
5+
output "cluster_name" {
6+
value = local.cluster_name
7+
}

_examples/aks/variables.tf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
variable "location" {
2+
type = string
3+
default = "westus2"
4+
}
5+
6+
locals {
7+
cluster_name = "tf-k8s-${random_id.cluster_name.hex}"
8+
}

_examples/gke/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ resource "random_id" "cluster_name" {
1919
}
2020

2121
locals {
22-
cluster_name = "tf-acc-test-${random_id.cluster_name.hex}"
22+
cluster_name = "tf-k8s-${random_id.cluster_name.hex}"
2323
}
2424

2525
module "gke-cluster" {

0 commit comments

Comments
 (0)