Add quickstart sample for private AKS cluster with custom DNS
This commit is contained in:
parent
cc6b61aa3a
commit
713cbfc0a7
55
quickstart/301-aks-private-cluster/README.md
Normal file
55
quickstart/301-aks-private-cluster/README.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# Private Azure Kubernetes Service with Custom DNS Server
|
||||||
|
|
||||||
|
This template deploys a private Azure Kubernetes Service cluster configured with custom DNS server. A new VNet with provided
|
||||||
|
custom DNS server would be provisioned and the AKS cluster is deployed into this new VNet. The DNS server's VNet would
|
||||||
|
also be linked to AKS provisioned private DNS zone, so that AKS cluster's private FQDN could be resolved successfully on
|
||||||
|
custom DNS server.
|
||||||
|
|
||||||
|
To use this template, ensure the following pre-requirements have been set:
|
||||||
|
|
||||||
|
* Azure CLI and terraform installed locally
|
||||||
|
* Pre-configure DNS servers outside of AKS VNet
|
||||||
|
* Forward AKS cluster FQDN `azmk8s.io` (or only private cluster FQDN `privatelink.<region>.azmk8s.io`) to Azure DNS `168.63.129.16`
|
||||||
|
* Get the DNS servers IP address, which would be set in `custom_dns`
|
||||||
|
* Get the DNS server's VNet resource ID, which would be set in `custom_dns_vnet_id`
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
| Terraform Resource Type | Description |
|
||||||
|
|-------------------------|-------------|
|
||||||
|
| `azurerm_resource_group` | The resource group all resources are deployed into |
|
||||||
|
| `azurerm_virtual_network` | The VNet that AKS cluster would be deployed on |
|
||||||
|
| `azurerm_subnet` | The subnet that AKS cluster would be deployed on |
|
||||||
|
| `azurerm_kubernetes_cluster` | The AKS cluster |
|
||||||
|
| `null_resource.dns_zone_link` | Link custom DNS server's VNet to AKS private DNS zone|
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `resource_group_name` | Name of the Azure resource group|
|
||||||
|
| `cluster_name` | Name of the AKS cluster|
|
||||||
|
| `custom_dns` | IP of custom DNS server|
|
||||||
|
| `custom_dns_vnet_id` |Resource ID of the Azure VNet that holds custom DNS server|
|
||||||
|
| `client_id` | The service principal ID|
|
||||||
|
| `client_secret` | The service principal password|
|
||||||
|
| `agent_count` | The number of K8S nodes to provision|
|
||||||
|
| `kubernetes_version` | The version of K8S to provision|
|
||||||
|
| `ssh_public_key` | The SSH public key of K8S nodes |
|
||||||
|
| `dns_prefix` | The DNS prefix of AKS cluster |
|
||||||
|
| `location` | The location of Azure resources |
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```sh
|
||||||
|
terraform plan \
|
||||||
|
-var 'resource_group_name=aks-quickstart' \
|
||||||
|
-var 'cluster_name=aks' \
|
||||||
|
-var 'custom_dns=<your-custom-dns-IP>' \
|
||||||
|
-var 'custom_dns_vnet_id=<your-custom-dns-vnet-id>' \
|
||||||
|
-var 'client_id=<your-client-id>' \
|
||||||
|
-var 'client_secret=<your-client-secret>' \
|
||||||
|
-out demo.tfplan
|
||||||
|
|
||||||
|
terraform apply demo.tfplan
|
||||||
|
```
|
55
quickstart/301-aks-private-cluster/aks.tf
Normal file
55
quickstart/301-aks-private-cluster/aks.tf
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
resource "azurerm_resource_group" "k8s" {
|
||||||
|
name = "${var.resource_group_name}"
|
||||||
|
location = "${var.location}"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "azurerm_virtual_network" "myvnet" {
|
||||||
|
name = "myvnet"
|
||||||
|
location = "${azurerm_resource_group.k8s.location}"
|
||||||
|
resource_group_name = "${azurerm_resource_group.k8s.name}"
|
||||||
|
address_space = ["10.240.0.0/16"]
|
||||||
|
dns_servers = ["${var.custom_dns}"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "azurerm_subnet" "mysubnet" {
|
||||||
|
name = "mysubnet"
|
||||||
|
resource_group_name = "${azurerm_resource_group.k8s.name}"
|
||||||
|
address_prefixes = ["10.240.10.0/24"]
|
||||||
|
virtual_network_name = "${azurerm_virtual_network.myvnet.name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "azurerm_kubernetes_cluster" "k8s" {
|
||||||
|
name = "${var.cluster_name}"
|
||||||
|
location = "${azurerm_resource_group.k8s.location}"
|
||||||
|
resource_group_name = "${azurerm_resource_group.k8s.name}"
|
||||||
|
dns_prefix = "${var.dns_prefix}"
|
||||||
|
kubernetes_version = "${var.kubernetes_version}"
|
||||||
|
private_cluster_enabled = true
|
||||||
|
|
||||||
|
linux_profile {
|
||||||
|
admin_username = "azureuser"
|
||||||
|
|
||||||
|
ssh_key {
|
||||||
|
key_data = "${file("${var.ssh_public_key}")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default_node_pool {
|
||||||
|
name = "agentpool1"
|
||||||
|
node_count = "${var.agent_count}"
|
||||||
|
vm_size = "Standard_D2_v3"
|
||||||
|
os_disk_size_gb = 30
|
||||||
|
vnet_subnet_id = "${azurerm_subnet.mysubnet.id}"
|
||||||
|
}
|
||||||
|
|
||||||
|
service_principal {
|
||||||
|
client_id = "${var.client_id}"
|
||||||
|
client_secret = "${var.client_secret}"
|
||||||
|
}
|
||||||
|
|
||||||
|
network_profile {
|
||||||
|
network_plugin = "azure"
|
||||||
|
load_balancer_sku = "standard"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
35
quickstart/301-aks-private-cluster/dns-zone-link.sh
Executable file
35
quickstart/301-aks-private-cluster/dns-zone-link.sh
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Query AKS private DNS zone and then link it to custom DNS VNet.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
wait-for-node-resource-group() {
|
||||||
|
NODE_RESOURCE_GROUP=$(az aks show -g ${AKS_RESOURCE_GROUP} -n ${AKS_CLUSTER_NAME} -o json 2>/dev/null | jq -r '.nodeResourceGroup')
|
||||||
|
while [ "${NODE_RESOURCE_GROUP}" == "" ]; do
|
||||||
|
echo "Waiting for node resource group..."
|
||||||
|
sleep 5
|
||||||
|
NODE_RESOURCE_GROUP=$(az aks show -g ${AKS_RESOURCE_GROUP} -n ${AKS_CLUSTER_NAME} -o json 2>/dev/null | jq -r '.nodeResourceGroup')
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
wait-for-private-dns-zone() {
|
||||||
|
length=$(az network private-dns zone list -g ${NODE_RESOURCE_GROUP} -o json 2>/dev/null | jq '. | length')
|
||||||
|
while [[ $length -eq 0 ]]; do
|
||||||
|
echo "Waiting for private DNS zone..."
|
||||||
|
sleep 5
|
||||||
|
length=$(az network private-dns zone list -g ${NODE_RESOURCE_GROUP} -o json 2>/dev/null | jq '. | length')
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
wait-for-node-resource-group
|
||||||
|
NODE_RESOURCE_GROUP=$(az aks show -g ${AKS_RESOURCE_GROUP} -n ${AKS_CLUSTER_NAME} -o json 2>/dev/null | jq -r '.nodeResourceGroup')
|
||||||
|
wait-for-private-dns-zone
|
||||||
|
ZONE_NAME=$(az network private-dns zone list -g ${NODE_RESOURCE_GROUP} -o json | jq -r '.[0].name')
|
||||||
|
echo "Get the private DNS Zone ${ZONE_NAME}"
|
||||||
|
az network private-dns link vnet create -o json \
|
||||||
|
-g ${NODE_RESOURCE_GROUP} \
|
||||||
|
-n private-dns-link \
|
||||||
|
--registration-enabled false \
|
||||||
|
--zone-name ${ZONE_NAME} \
|
||||||
|
--virtual-network ${DNS_VNET}
|
||||||
|
|
||||||
|
echo "Private DNS Zone ${ZONE_NAME} has been linked to VNet ${DNS_VNET}."
|
13
quickstart/301-aks-private-cluster/dns-zone.tf
Normal file
13
quickstart/301-aks-private-cluster/dns-zone.tf
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
resource "null_resource" "dns_zone_link" {
|
||||||
|
|
||||||
|
provisioner "local-exec" {
|
||||||
|
interpreter = ["bash"]
|
||||||
|
command = "dns-zone-link.sh"
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
DNS_VNET = "${var.custom_dns_vnet_id}"
|
||||||
|
AKS_RESOURCE_GROUP="${var.resource_group_name}"
|
||||||
|
AKS_CLUSTER_NAME="${var.cluster_name}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
quickstart/301-aks-private-cluster/main.tf
Normal file
4
quickstart/301-aks-private-cluster/main.tf
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
provider "azurerm" {
|
||||||
|
version = "~>2.11"
|
||||||
|
features {}
|
||||||
|
}
|
7
quickstart/301-aks-private-cluster/output.tf
Normal file
7
quickstart/301-aks-private-cluster/output.tf
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
output "kube_config" {
|
||||||
|
value = "${azurerm_kubernetes_cluster.k8s.kube_config_raw}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "host" {
|
||||||
|
value = "${azurerm_kubernetes_cluster.k8s.kube_config.0.host}"
|
||||||
|
}
|
65
quickstart/301-aks-private-cluster/variables.tf
Normal file
65
quickstart/301-aks-private-cluster/variables.tf
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
variable resource_group_name {
|
||||||
|
type = string
|
||||||
|
description = "Name of the Azure resource group"
|
||||||
|
default = "aks-quickstart"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable cluster_name {
|
||||||
|
type = string
|
||||||
|
description = "Name of the AKS cluster"
|
||||||
|
default = "demo-private"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable custom_dns {
|
||||||
|
type = string
|
||||||
|
description = "IP of custom DNS server"
|
||||||
|
default = "168.63.129.16"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable custom_dns_vnet_id {
|
||||||
|
type = string
|
||||||
|
description = "Resource ID of the Azure VNet that holds custom DNS server"
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "client_id" {
|
||||||
|
type = string
|
||||||
|
description = "The service principal ID"
|
||||||
|
default = "<client-id>"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "client_secret" {
|
||||||
|
type = string
|
||||||
|
description = "The service principal password"
|
||||||
|
default = "<client-secret>"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "agent_count" {
|
||||||
|
type = string
|
||||||
|
description = "The number of K8S nodes to provision"
|
||||||
|
default = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "kubernetes_version" {
|
||||||
|
type = string
|
||||||
|
description = "The version of K8S to provision"
|
||||||
|
default = "1.17.9"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_public_key" {
|
||||||
|
type = string
|
||||||
|
description = "The SSH public key of K8S nodes"
|
||||||
|
default = "~/.ssh/id_rsa.pub"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "dns_prefix" {
|
||||||
|
type = string
|
||||||
|
description = "The DNS prefix"
|
||||||
|
default = "aks"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable location {
|
||||||
|
type = string
|
||||||
|
description = "The location"
|
||||||
|
default = "East US"
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user