Mulai cepat: Membuat kluster privat Azure Kubernetes Service (AKS) Otomatis di jaringan virtual kustom

Berlaku untuk: ✔️ AKS Otomatis

Azure Kubernetes Service (AKS) Otomatis memberikan pengalaman Kubernetes terkelola termampukan bagi pengembang, teknisi DevOps, dan insinyur platform. Ideal untuk aplikasi modern dan AI, AKS Otomatis mengotomatiskan penyiapan dan operasi kluster AKS dan menyematkan konfigurasi praktik terbaik. Pengguna dari tingkat keterampilan apa pun dapat memperoleh manfaat dari keamanan, performa, dan ketergantungan AKS Otomatis untuk aplikasi mereka. AKS Automatic juga mencakup SLA kesiapan pod yang menjamin 99,9% operasi kesiapan pod yang memenuhi syarat akan selesai dalam waktu 5 menit, memastikan infrastruktur yang andal dan pemulihan otomatis untuk aplikasi Anda. Panduan cepat ini mengasumsikan pemahaman dasar tentang konsep Kubernetes. Untuk informasi selengkapnya, lihat konsep inti Kubernetes untuk Azure Kubernetes Service (AKS).

Panduan cepat ini akan mengajarkan Anda untuk:

  • Buat jaringan virtual.
  • Buat identitas terkelola dengan izin melalui jaringan virtual.
  • Sebarkan kluster AKS Otomatis privat di jaringan virtual.
  • Sambungkan ke klaster privat.
  • Jalankan contoh aplikasi multi-kontainer berupa kelompok layanan mikro dan antarmuka web yang mensimulasikan skenario ritel.

Prasyarat

  • Jika Anda tidak memiliki akun Azure, buat akun free.
  • Azure CLI versi 2.86.0 atau yang lebih baru. Untuk menemukan versi, jalankan az --version perintah. Jika Anda perlu menginstal atau meningkatkan, lihat Install Azure CLI.

Nota

Contoh ini membuat kluster AKS Otomatis menggunakan resource azurerm_kubernetes_automatic_cluster dari penyedia AzureRM, yang memerlukan penyedia AzureRM versi v4.81 atau yang lebih baru. Untuk sampel yang setara yang menggunakan penyedia AzAPI, lihat sampel 101-aks-automatic-private-custom-network-azapi .

  • Identitas kluster dengan Network Contributor penetapan peran bawaan pada subnet server API.
  • Identitas kluster dengan Network Contributor penetapan peran bawaan di jaringan virtual untuk mendukung Penyediaan Otomatis Node.
  • Identitas pengguna yang mengakses kluster dengan Azure Kubernetes Service Cluster User Role dan Azure Kubernetes Service RBAC Writer.
  • Jaringan virtual dengan subnet server API khusus berukuran setidaknya */28 yang didelegasikan ke Microsoft.ContainerService/managedClusters.
    • Jika ada Kelompok Keamanan Jaringan (NSG) yang terpasang pada subnet, pastikan bahwa aturan mengizinkan lalu lintas berikut antara simpul dan server API (API server), Azure Load Balancer dan server API (API server), serta komunikasi pod ke pod.
    • Jika ada Azure Firewall atau metode pembatasan keluaran atau perangkat lainnya, pastikan aturan jaringan keluar yang diperlukan dan FQDN diizinkan.
  • AKS Automatic akan mengaktifkan Azure Policy pada kluster AKS Anda, tetapi Anda harus mendaftarkan terlebih dahulu penyedia sumber daya Microsoft.PolicyInsights dalam langganan Anda agar prosesnya lebih lancar. Untuk informasi selengkapnya, lihat penyedia sumber daya Azure dan jenis-jenisnya.
  • Copot pemasangan ekstensi AKS-preview menggunakan az extension remove -n aks-preview.

Penting

Mulai dari AKS 1.36, kluster AKS Automatic baru secara bawaan akan mengaktifkan Kubernetes Gateway API melalui add-on perutean aplikasi alih-alih Managed NGINX ingress dengan add-on perutean aplikasi karena penghentian Ingress NGINX upstream.

Kluster otomatis yang ada tidak terdampak, tetapi sebaiknya mulai bermigrasi ke Gateway API Kubernetes melalui add-on perutean aplikasi.

Keterbatasan

Batasan berikut berlaku untuk kluster AKS Otomatis:

  • AKS Otomatis umumnya tersedia di region berikut: australiaeast, austriaeast, belgiumcentral, brazilsouth, canadacentral, centralindia, centralus, chilecentral, denmarkeast, eastasia, eastus, eastus2, francecentral, germanywestcentral, indonesiacentral, israelcentral, italynorth, japaneast, japanwest, koreacentral, malaysiawest, mexicocentral, newzealandnorth, northeurope, norwayeast, polandcentral, southafricanorth, southcentralus, southeastasia, spaincentral, swedencentral, switzerlandnorth, uaenorth, uksouth, westeurope, westus2, westus3.
    • Kluster AKS Otomatis baru secara default mengaktifkan kumpulan simpul sistem terkelola dan LocalDNS. Anda tidak dapat membuat kluster AKS Otomatis tanpa kumpulan simpul sistem terkelola di wilayah mana pun.
  • Kluster Otomatis AKS memiliki penguncian grup sumber daya node yang telah dikonfigurasi sebelumnya, yang tidak mengizinkan perubahan pada grup sumber daya MC_, mencegah tautan jaringan virtual pada zona Private DNS default. Untuk skenario DNS lintas VNet atau kustom, gunakan jaringan kustom dan DNS privat dengan mengikuti Buat kluster privat Azure Kubernetes Service (AKS) Otomatis dalam jaringan virtual kustom.
  • Azure CLI versi 2.86.0 atau yang lebih baru diperlukan. Untuk menemukan versi, jalankan az --version perintah. Jika Anda perlu menginstal atau meningkatkan, lihat Install Azure CLI.
  • Ekstensi berikut ini tidak didukung:
  • Node Windows tidak didukung.
  • Migrasi dari SKU dasar AKS ke SKU otomatis tidak didukung.
  • Migrasi antara kluster AKS Otomatis tanpa kumpulan simpul sistem terkelola dan kluster AKS Otomatis dengan kumpulan simpul sistem terkelola tidak didukung.

Tentukan variabel

Tentukan variabel berikut yang digunakan dalam langkah-langkah berikutnya.

RG_NAME=automatic-rg
VNET_NAME=automatic-vnet
CLUSTER_NAME=automatic
IDENTITY_NAME=automatic-uami
LOCATION=eastus
SUBSCRIPTION_ID=$(az account show --query id -o tsv)

Membuat grup sumber daya

Grup sumber daya Azure adalah grup logis tempat sumber daya Azure disebarkan dan dikelola.

Mmebuat grup sumber daya menggunakan perintah buat grup az.

az group create -n ${RG_NAME} -l ${LOCATION}

Contoh output berikut menyerupai pembuatan grup sumber daya yang berhasil:

{
  "id": "/subscriptions/<guid>/resourceGroups/automatic-rg",
  "location": "canadacentral",
  "managedBy": null,
  "name": "automatic-rg",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Membuat jaringan virtual

Buat jaringan virtual menggunakan az network vnet create perintah . Buat subnet server API dan subnet kluster menggunakan perintah az network vnet subnet create.

Saat menggunakan jaringan virtual kustom dengan AKS Otomatis, Anda harus membuat subnet server API. AKS akan mendelegasikan subnet untuk Microsoft.ContainerService/managedClusters atas nama Anda, yang memberikan izin layanan AKS untuk menyuntikkan pod server API dan load balancer internal ke subnet tersebut. Anda tidak dapat menggunakan subnet untuk beban kerja lain, tetapi Anda dapat menggunakannya untuk beberapa kluster AKS yang terletak di jaringan virtual yang sama. Ukuran subnet server API minimum yang didukung adalah /28.

Peringatan

Kluster AKS mencadangkan setidaknya sembilan (9) IP di ruang alamat subnet. Kehabisan alamat IP dapat mencegah penskalaan server API dan menyebabkan pemadaman server API.

az network vnet create --name ${VNET_NAME} \
--resource-group ${RG_NAME} \
--location ${LOCATION} \
--address-prefixes 172.19.0.0/16

az network vnet subnet create --resource-group ${RG_NAME} \
--vnet-name ${VNET_NAME} \
--name apiServerSubnet \
--delegations Microsoft.ContainerService/managedClusters \
--address-prefixes 172.19.0.0/28

az network vnet subnet create --resource-group ${RG_NAME} \
--vnet-name ${VNET_NAME} \
--name userNodeSubnet \
--address-prefixes 172.19.1.0/24

az network vnet subnet create --resource-group ${RG_NAME} \
--vnet-name ${VNET_NAME} \
--name managedSystemNodeSubnet \
--address-prefixes 172.19.0.64/26

Aturan grup keamanan jaringan

Semua lalu lintas dalam jaringan virtual diizinkan secara default. Tetapi jika Anda menambahkan aturan Network Security Group (NSG) untuk membatasi lalu lintas antara subnet yang berbeda, pastikan bahwa aturan keamanan NSG mengizinkan jenis komunikasi berikut:

Tujuan Sumber Protokol Pelabuhan Gunakan
APIServer Subnet CIDR subnet simpul pengguna dan subnet simpul sistem PKT 443 dan 4443 Diperlukan untuk mengaktifkan komunikasi antara Node dan server API.
APIServer Subnet CIDR Azure Load Balancer PKT 9988 Diperlukan untuk mengaktifkan komunikasi antara Azure Load Balancer dan server API. Anda juga dapat mengaktifkan semua komunikasi antara Azure Load Balancer dan CIDR Subnet API Server.
Simpul CIDR Simpul CIDR Semua Protokol Semua Port Diperlukan untuk mengaktifkan komunikasi antara Simpul.
Simpul CIDR Pod CIDR Semua Protokol Semua Port Diperlukan untuk Perutean lalu lintas layanan.
Pod CIDR Pod CIDR Semua Protokol Semua Port Diperlukan untuk komunikasi antar Pod dan dari Pod ke Service, termasuk komunikasi DNS.

Membuat identitas terkelola dan memberinya izin di jaringan virtual

Buat identitas terkelola menggunakan az identity create perintah dan ambil ID utama. Tetapkan peran Kontributor Jaringan pada jaringan virtual ke identitas terkelola az role assignment create menggunakan perintah .

az identity create \
--resource-group ${RG_NAME} \
 --name ${IDENTITY_NAME} \
 --location ${LOCATION}

IDENTITY_PRINCIPAL_ID=$(az identity show --resource-group ${RG_NAME} --name ${IDENTITY_NAME} --query principalId -o tsv)

az role assignment create \
--scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}" \
--role "Network Contributor" \
--assignee-object-id "${IDENTITY_PRINCIPAL_ID}" \
--assignee-principal-type ServicePrincipal

Membuat kluster AKS Otomatis privat di jaringan virtual kustom

Untuk membuat kluster AKS Otomatis privat, gunakan perintah az aks create . Perhatikan penggunaan --enable-private-cluster bendera.

Nota

Anda dapat merujuk ke dokumentasi kluster privat untuk mengonfigurasi opsi lain seperti menonaktifkan FQDN publik kluster dan mengonfigurasi zona DNS privat.

az aks create \
--resource-group ${RG_NAME} \
--name ${CLUSTER_NAME} \
--location ${LOCATION} \
--apiserver-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/apiServerSubnet" \
--node-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/userNodeSubnet" \
--system-node-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/managedSystemNodeSubnet" 
--assign-identity "/subscriptions/${SUBSCRIPTION_ID}/resourcegroups/${RG_NAME}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${IDENTITY_NAME}" \
--sku automatic \
--enable-private-cluster \
--no-ssh-key

Setelah beberapa menit, perintah selesai dan kembalikan informasi berformat JSON tentang kluster.

Menyambungkan ke kluster

Ketika kluster AKS Otomatis dibuat sebagai kluster privat, titik akhir server API tidak memiliki alamat IP publik. Untuk mengelola server API, misalnya melalui kubectl, Anda perlu terhubung melalui komputer yang memiliki akses ke jaringan virtual Azure kluster. Ada beberapa opsi untuk membangun konektivitas jaringan ke kluster privat:

Membuat komputer virtual di jaringan virtual yang sama dengan kluster AKS adalah opsi term mudah. ExpressRoute dan VPN menambahkan biaya dan memerlukan kompleksitas jaringan lainnya. Peering jaringan virtual mengharuskan Anda merencanakan rentang CIDR jaringan Anda untuk memastikan tidak ada rentang yang tumpang tindih. Untuk informasi selengkapnya, lihat Opsi untuk menyambungkan ke kluster privat.

Untuk mengelola kluster Kube, gunakan klien baris perintah Kube, kubectl. kubectl sudah diinstal jika Anda menggunakan Azure Cloud Shell. Untuk menginstal kubectl secara lokal, jalankan perintah az aks install-cli . Kluster Otomatis AKS dikonfigurasi dengan Microsoft Entra ID untuk kontrol akses berbasis peran (RBAC) Kubernetes .

Saat Anda membuat kluster menggunakan Azure CLI, pengguna Anda diperuntukkan peran bawaan untuk Azure Kubernetes Service RBAC Cluster Admin.

Konfigurasikan kubectl untuk terhubung ke kluster Kubernetes menggunakan perintah az aks get-credentials. Perintah ini mengunduh kredensial dan mengonfigurasi CLI Kubernetes untuk menggunakannya.

az aks get-credentials --resource-group ${RG_NAME} --name ${CLUSTER_NAME}

Verifikasi koneksi ke kluster menggunakan perintah kubectl get. Perintah ini menampilkan daftar node kluster.

kubectl get nodes

Contoh output berikut menunjukkan bagaimana Anda diminta untuk masuk.

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

Setelah Anda masuk, output sampel berikut menunjukkan kumpulan simpul sistem terkelola. Pastikan status simpul siap.

NAME                           STATUS   ROLES    AGE   VERSION
aks-hostedpool-16652789-vms1   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms2   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms3   Ready    <none>   19m   v1.34.7
aks-system-surge-zq4d2         Ready    <none>   19m   v1.34.7

Membuat jaringan virtual

File Bicep ini mendefinisikan jaringan virtual.

@description('The location of the managed cluster resource.')
param location string = resourceGroup().location

@description('The name of the virtual network.')
param vnetName string = 'aksAutomaticVnet'

@description('The address prefix of the virtual network.')
param addressPrefix string = '172.19.0.0/16'

@description('The name of the API server subnet.')
param apiServerSubnetName string = 'apiServerSubnet'

@description('The subnet prefix of the API server subnet.')
param apiServerSubnetPrefix string = '172.19.0.0/28'

@description('The name of the user node subnet.')
param userNodeSubnetName string = 'userNodeSubnet'

@description('The subnet prefix of the user node subnet.')
param userNodeSubnetPrefix string = '172.19.1.0/24'

@description('The name of the system node subnet.')
param systemNodeSubnetName string = 'systemNodeSubnet'

@description('The subnet prefix of the system node subnet.')
param systemNodeSubnetPrefix string = '172.19.0.64/26'

// Virtual network with an API server subnet, a user node subnet, and a system node subnet
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-09-01' = {
    name: vnetName
    location: location
    properties: {
        addressSpace: {
            addressPrefixes: [ addressPrefix ]
        }
        subnets: [
            {
                name: apiServerSubnetName
                properties: {
                    addressPrefix: apiServerSubnetPrefix
                }
            }
            {
                name: userNodeSubnetName
                properties: {
                    addressPrefix: userNodeSubnetPrefix
                }
            }
            {
                name: systemNodeSubnetName
                properties: {
                    addressPrefix: systemNodeSubnetPrefix
                }
            }
        ]
    }
}

output apiServerSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, apiServerSubnetName)
output userNodeSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, userNodeSubnetName)
output systemNodeSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, systemNodeSubnetName)

Simpan file Bicep virtualNetwork.bicep ke komputer lokal Anda.

Penting

File Bicep mengatur param vnetName ke aksAutomaticVnet, param addressPrefix ke 172.19.0.0/16, apiServerSubnetPrefix param ke 172.19.0.0/28, dan apiServerSubnetPrefix param ke 172.19.1.0/24. Jika Anda ingin menggunakan nilai yang berbeda, pastikan untuk memperbarui string ke nilai pilihan Anda.

Sebarkan file Bicep menggunakan Azure CLI.

az deployment group create --resource-group <resource-group> --template-file virtualNetwork.bicep

Semua lalu lintas dalam jaringan virtual diizinkan secara default. Tetapi jika Anda menambahkan aturan Network Security Group (NSG) untuk membatasi lalu lintas antara subnet yang berbeda, pastikan bahwa aturan keamanan NSG mengizinkan jenis komunikasi berikut:

Tujuan Sumber Protokol Pelabuhan Gunakan
APIServer Subnet CIDR subnet simpul pengguna dan subnet simpul sistem PKT 443 dan 4443 Diperlukan untuk mengaktifkan komunikasi antara Node dan server API.
APIServer Subnet CIDR Azure Load Balancer PKT 9988 Diperlukan untuk mengaktifkan komunikasi antara Azure Load Balancer dan server API. Anda juga dapat mengaktifkan semua komunikasi antara Azure Load Balancer dan CIDR Subnet API Server.
Simpul CIDR Simpul CIDR Semua Protokol Semua Port Diperlukan untuk mengaktifkan komunikasi antara Simpul.
Simpul CIDR Pod CIDR Semua Protokol Semua Port Diperlukan untuk Perutean lalu lintas layanan.
Pod CIDR Pod CIDR Semua Protokol Semua Port Diperlukan untuk komunikasi antar Pod dan dari Pod ke Service, termasuk komunikasi DNS.

Buat identitas terkelola

File Bicep ini menentukan identitas terkelola yang ditetapkan pengguna.

param location string = resourceGroup().location
param uamiName string = 'aksAutomaticUAMI'

resource userAssignedManagedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: uamiName
  location: location
}

output uamiId string = userAssignedManagedIdentity.id
output uamiPrincipalId string = userAssignedManagedIdentity.properties.principalId
output uamiClientId string = userAssignedManagedIdentity.properties.clientId

Simpan file Bicep uami.bicep ke komputer lokal Anda.

Penting

File Bicep mengatur param uamiName ke aksAutomaticUAMI. Jika Anda ingin menggunakan nama identitas yang berbeda, pastikan untuk memperbarui string ke nama pilihan Anda.

Sebarkan file Bicep menggunakan Azure CLI.

az deployment group create --resource-group <resource-group> --template-file uami.bicep

Menetapkan peran Kontributor Jaringan melalui jaringan virtual

File Bicep ini mendefinisikan penetapan peran melalui jaringan virtual.

@description('The name of the virtual network.')
param vnetName string = 'aksAutomaticVnet'

@description('The principal ID of the user assigned managed identity.')
param uamiPrincipalId string

// Get a reference to the virtual network
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-09-01' existing ={
  name: vnetName
}

// Assign the Network Contributor role to the user assigned managed identity on the virtual network
// '4d97b98b-1d4f-4787-a291-c67834d212e7' is the built-in Network Contributor role definition
// See: https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/networking#network-contributor
resource networkContributorRoleAssignmentToVirtualNetwork 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(uamiPrincipalId, '4d97b98b-1d4f-4787-a291-c67834d212e7', resourceGroup().id, virtualNetwork.name)
  scope: virtualNetwork
  properties: {
      roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')
      principalId: uamiPrincipalId
  }
}

Simpan file Bicep roleAssignments.bicep ke komputer lokal Anda.

Penting

File Bicep mengatur param vnetName ke aksAutomaticVnet. Jika Anda menggunakan nama jaringan virtual yang berbeda, pastikan untuk memperbarui string ke nama jaringan virtual pilihan Anda.

Sebarkan file Bicep menggunakan Azure CLI. Anda perlu memberikan ID prinsipal identitas pengguna yang ditetapkan.

az deployment group create --resource-group <resource-group> --template-file roleAssignments.bicep \
--parameters uamiPrincipalId=<user assigned identity prinicipal id>

Membuat kluster AKS Otomatis privat di jaringan virtual kustom

File Bicep ini mendefinisikan kluster Otomatis AKS.

Nota

Anda dapat merujuk ke dokumentasi kluster privat untuk mengonfigurasi opsi lain seperti menonaktifkan FQDN publik kluster dan mengonfigurasi zona DNS privat.

@description('The name of the managed cluster resource.')
param clusterName string = 'aksPrivateAutomaticCluster'

@description('The location of the managed cluster resource.')
param location string = resourceGroup().location

@description('The resource ID of the API server subnet.')
param apiServerSubnetId string

@description('The resource ID of the user node subnet.')
param userNodeSubnetId string

@description('The resource ID of the system node subnet.')
param systemNodeSubnetId string

@description('The resource ID of the user assigned managed identity.')
param uamiId string

/// Create the private AKS Automatic cluster using the custom virtual network and user assigned managed identity
resource aks 'Microsoft.ContainerService/managedClusters@2024-03-02-preview' = {
  name: clusterName
  location: location  
  sku: {
    name: 'Automatic'
  }
  properties: {
    apiServerAccessProfile: {
        subnetId: apiServerSubnetId
        enablePrivateCluster: true
    }
    networkProfile: {
      outboundType: 'loadBalancer'
    }
    hostedSystemProfile: {
      systemNodeSubnetID: systemNodeSubnetId
      nodeSubnetID: userNodeSubnetId
    }
  }
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${uamiId}': {}
    }
  }
}

Simpan file Bicep aks.bicep ke komputer lokal Anda.

Penting

File Bicep mengatur param clusterName ke aksPrivateAutomaticCluster. Jika Anda menginginkan nama kluster yang berbeda, pastikan untuk memperbarui string ke nama kluster pilihan Anda.

Sebarkan file Bicep menggunakan Azure CLI. Anda perlu memberikan ID sumber daya subnet server API, ID sumber daya subnet simpul pengguna, ID sumber daya subnet simpul sistem, dan ID sumber daya identitas terkelola yang ditetapkan pengguna.

az deployment group create --resource-group <resource-group> --template-file aks.bicep \
--parameters apiServerSubnetId=<API server subnet resource id> \
--parameters nodeSubnetId=<user node subnet resource id> \
--parameters systemNodeSubnetId=<system node subnet resource id> \
--parameters uamiPrincipalId=<user assigned identity prinicipal id>

Menyambungkan ke kluster

Ketika kluster AKS Otomatis dibuat sebagai kluster privat, titik akhir server API tidak memiliki alamat IP publik. Untuk mengelola server API, misalnya melalui kubectl, Anda perlu terhubung melalui komputer yang memiliki akses ke jaringan virtual Azure kluster. Ada beberapa opsi untuk membangun konektivitas jaringan ke kluster privat:

Membuat komputer virtual di jaringan virtual yang sama dengan kluster AKS adalah opsi term mudah. Rute Ekspres dan VPN menambahkan biaya dan memerlukan lebih banyak kompleksitas jaringan. Peering jaringan virtual mengharuskan Anda merencanakan rentang CIDR jaringan Anda untuk memastikan tidak ada rentang yang tumpang tindih. Untuk informasi selengkapnya, lihat Opsi untuk menyambungkan ke kluster privat.

Untuk mengelola kluster Kube, gunakan klien baris perintah Kube, kubectl. kubectl sudah diinstal jika Anda menggunakan Azure Cloud Shell. Untuk menginstal kubectl secara lokal, jalankan perintah az aks install-cli . Kluster Otomatis AKS dikonfigurasi dengan Microsoft Entra ID untuk kontrol akses berbasis peran (RBAC) Kubernetes .

Penting

Saat membuat kluster menggunakan Bicep, Anda perlu menetapkan salah satu peran bawaan seperti Azure Kubernetes Service RBAC Reader, Azure Kubernetes Service RBAC Writer, Azure Kubernetes Service RBAC Admin, atau Azure Kubernetes Service RBAC Cluster Admin kepada pengguna Anda, dilingkupkan ke kluster atau namespace tertentu, misalnya menggunakan az role assignment create --role "Azure Kubernetes Service RBAC Cluster Admin" --scope <AKS cluster resource id> --assignee user@contoso.com. Pastikan juga pengguna Anda memiliki peran bawaan Azure Kubernetes Service Cluster User untuk dapat menjalankan az aks get-credentials, lalu mendapatkan kubeconfig kluster AKS Anda menggunakan perintah az aks get-credentials.

Konfigurasikan kubectl untuk terhubung ke kluster Kubernetes menggunakan perintah az aks get-credentials. Perintah ini mengunduh kredensial dan mengonfigurasi CLI Kubernetes untuk menggunakannya.

az aks get-credentials --resource-group <resource-group> --name <cluster-name>

Verifikasi koneksi ke kluster menggunakan perintah kubectl get. Perintah ini menampilkan daftar node kluster.

kubectl get nodes

Contoh output berikut menunjukkan bagaimana Anda diminta untuk masuk.

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

Setelah Anda masuk, output sampel berikut menunjukkan kumpulan simpul sistem terkelola. Pastikan status simpul siap.

NAME                           STATUS   ROLES    AGE   VERSION
aks-hostedpool-16652789-vms1   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms2   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms3   Ready    <none>   19m   v1.34.7
aks-system-surge-zq4d2         Ready    <none>   19m   v1.34.7

Meninjau kode Terraform

  1. Buat direktori untuk menguji sampel kode Terraform dan atur sebagai direktori saat ini.

  2. Buat file bernama providers.tf dan masukkan kode berikut:

    terraform {
      required_version = ">= 1.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>5.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Buat file bernama main.tf dan tambahkan kode berikut:

    # Create a random name for the resource group using random_pet
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    # Create a resource group using the generated random name
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Create the custom virtual network that hosts the cluster
    resource "azurerm_virtual_network" "vnet" {
      name                = var.virtual_network_name
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      address_space       = var.virtual_network_address_space
    }
    
    # Create the subnet delegated to AKS for API Server VNet Integration
    resource "azurerm_subnet" "api_server" {
      name                 = "apiServerSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = var.api_server_subnet_address_prefixes
    
      delegation {
        name = "aks-delegation"
    
        service_delegation {
          name    = "Microsoft.ContainerService/managedClusters"
          actions = ["Microsoft.Network/virtualNetworks/subnets/join/action"]
        }
      }
    }
    
    # Create the subnet that hosts the user node pools
    resource "azurerm_subnet" "user_nodes" {
      name                 = "userNodeSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = var.user_node_subnet_address_prefixes
    }
    
    # Create the subnet that hosts the managed system node pool
    resource "azurerm_subnet" "system_nodes" {
      name                 = "managedSystemNodeSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = var.system_node_subnet_address_prefixes
    
      lifecycle {
        # AKS adds its own managed cluster delegation to this subnet after the
        # cluster is created.
        ignore_changes = [delegation]
      }
    }
    
    # Create the user-assigned managed identity used by the cluster
    resource "azurerm_user_assigned_identity" "aks" {
      name                = var.identity_name
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    # Grant the cluster identity Network Contributor on the virtual network
    resource "azurerm_role_assignment" "network_contributor" {
      scope                = azurerm_virtual_network.vnet.id
      role_definition_name = "Network Contributor"
      principal_id         = azurerm_user_assigned_identity.aks.principal_id
      principal_type       = "ServicePrincipal"
    }
    
    # Create a random name for the AKS Automatic cluster
    resource "random_pet" "cluster_name" {
      prefix = var.cluster_name_prefix
    }
    
    # Create the private AKS Automatic cluster in the custom virtual network
    resource "azurerm_kubernetes_automatic_cluster" "aks_automatic" {
      name                = random_pet.cluster_name.id
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      identity {
        type         = "UserAssigned"
        identity_ids = [azurerm_user_assigned_identity.aks.id]
      }
    
      api_server_access {
        subnet_id = azurerm_subnet.api_server.id
      }
    
      hosted_system {
        node_subnet_id        = azurerm_subnet.user_nodes.id
        system_node_subnet_id = azurerm_subnet.system_nodes.id
      }
    
      # The private_cluster block gives the API server a private IP address in the
      # virtual network. Reaching it requires private connectivity and DNS
      # resolution of the private FQDN, which peering, a VPN, or ExpressRoute can
      # provide from outside this virtual network.
      private_cluster {
        public_fully_qualified_domain_name_enabled = var.public_fully_qualified_domain_name_enabled
      }
    
      depends_on = [azurerm_role_assignment.network_contributor]
    }
    
  4. Buat file bernama variables.tf dan tambahkan kode berikut:

    variable "resource_group_location" {
      type        = string
      default     = "westus2"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "cluster_name_prefix" {
      type        = string
      default     = "aks-automatic"
      description = "Prefix of the AKS Automatic cluster name that's combined with a random ID so the name is unique in your Azure subscription."
    }
    
    variable "public_fully_qualified_domain_name_enabled" {
      type        = bool
      default     = false
      description = "Whether to provision a public FQDN for the private cluster."
    }
    
    variable "virtual_network_name" {
      type        = string
      default     = "aks-automatic-vnet"
      description = "Name of the custom virtual network that hosts the cluster."
    }
    
    variable "identity_name" {
      type        = string
      default     = "aks-automatic-identity"
      description = "Name of the user-assigned managed identity that the cluster uses."
    }
    
    variable "virtual_network_address_space" {
      type        = list(string)
      default     = ["172.19.0.0/16"]
      description = "Address space of the custom virtual network."
    }
    
    variable "api_server_subnet_address_prefixes" {
      type        = list(string)
      default     = ["172.19.0.0/28"]
      description = "Address prefixes of the subnet delegated to the cluster API server."
    }
    
    variable "user_node_subnet_address_prefixes" {
      type        = list(string)
      default     = ["172.19.1.0/24"]
      description = "Address prefixes of the subnet that hosts the user node pools."
    }
    
    variable "system_node_subnet_address_prefixes" {
      type        = list(string)
      default     = ["172.19.0.64/26"]
      description = "Address prefixes of the subnet that hosts the managed system node pool."
    }
    
  5. Buat file bernama outputs.tf dan masukkan kode berikut:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "cluster_name" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.name
    }
    
    output "cluster_id" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.id
    }
    
    output "node_resource_group_id" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.node_resource_group_id
    }
    
    output "virtual_network_name" {
      value = azurerm_virtual_network.vnet.name
    }
    
    output "private_fully_qualified_domain_name" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.private_fully_qualified_domain_name
    }
    

Menginisialisasi Terraform

Jalankan terraform init untuk menginisialisasi implementasi Terraform. Perintah ini mengunduh penyedia Azure yang diperlukan untuk mengelola sumber daya Azure Anda.

terraform init -upgrade

Buat rencana pelaksanaan Terraform

Jalankan terraform plan untuk membuat rencana pelaksanaan.

terraform plan -out main.tfplan

Terapkan rencana implementasi Terraform

Untuk menerapkan rencana eksekusi pada infrastruktur cloud Anda, jalankan terraform apply.

terraform apply main.tfplan

Membuat kluster Otomatis AKS membutuhkan waktu beberapa menit untuk diselesaikan.

Memverifikasi kluster

  1. Dapatkan nama grup sumber daya Azure dan nama kluster.

    resource_group_name=$(terraform output -raw resource_group_name)
    cluster_name=$(terraform output -raw cluster_name)
    
  2. Jalankan az aks show untuk menampilkan kluster dan mengonfirmasi bahwa kluster tersebut bersifat privat dan menggunakan SKU Automatic.

    az aks show --resource-group $resource_group_name --name $cluster_name --query "{name:name, sku:sku, provisioningState:provisioningState, privateCluster:apiServerAccessProfile.enablePrivateCluster}"
    

Menyambungkan ke kluster

Server API kluster privat tidak memiliki alamat IP publik, sehingga Anda mengelolanya dari komputer yang memiliki akses jaringan ke jaringan virtual kluster. Anda memiliki beberapa opsi untuk membangun konektivitas tersebut:

Untuk informasi selengkapnya, lihat Opsi untuk menyambungkan ke kluster privat.

Dari komputer dengan konektivitas ke jaringan virtual, konfigurasikan kubectl untuk terhubung ke kluster Kubernetes Anda dengan menggunakan perintah az aks get-credentials . Kluster Otomatis AKS dikonfigurasi dengan Microsoft Entra ID untuk kontrol akses berbasis peran (RBAC) Kubernetes .

az aks get-credentials --resource-group $resource_group_name --name $cluster_name

Verifikasi koneksi ke kluster Anda dengan menggunakan perintah kubectl get .

kubectl get nodes

Menyebarkan aplikasi

Untuk menyebarkan aplikasi, Anda menggunakan file manifes untuk membuat semua objek yang diperlukan untuk menjalankan aplikasi AKS Store. File manifes Kubernetes menentukan keadaan kluster yang diinginkan, seperti image kontainer mana yang akan dijalankan. Manifes mencakup penyebaran dan layanan Kubernetes berikut:

Screenshot arsitektur sampel Azure Store.

  • Simpan depan: Aplikasi web bagi pelanggan untuk melihat produk dan melakukan pemesanan.
  • Layanan produk: Menampilkan informasi produk.
  • Layanan pemesanan: Penempatan pesanan.
  • Rabbit MQ: Antrean pesan untuk pesanan.

Nota

Kami tidak menyarankan untuk menjalankan kontainer stateful, seperti Rabbit MQ, tanpa penyimpanan persisten untuk produksi. Kontainer ini digunakan di sini untuk kesederhanaan, tetapi sebaiknya gunakan layanan terkelola, seperti Azure Cosmos DB atau Azure Service Bus.

  1. Buat namespace aks-store-demo untuk menyebarkan sumber daya Kubernetes.

    kubectl create ns aks-store-demo
    
  2. Sebarkan aplikasi menggunakan perintah kubectl apply ke dalam namespace aks-store-demo. File YAML yang menentukan penyebaran berada di GitHub.

    kubectl apply -n aks-store-demo -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-ingress-quickstart.yaml
    

    Contoh output berikut menunjukkan penyebaran dan layanan:

    statefulset.apps/rabbitmq created
    configmap/rabbitmq-enabled-plugins created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    ingress/store-front created
    

Uji aplikasi

Ketika aplikasi berjalan, layanan Kubernetes mengekspos front end aplikasi ke internet. Diperlukan beberapa menit untuk menyelesaikan proses ini.

  1. Periksa status pod yang telah dideploy menggunakan perintah kubectl get pods. Pastikan semua pod berada dalam keadaan Running sebelum melanjutkan. Jika ini adalah beban kerja pertama yang Anda deploy, mungkin memerlukan beberapa menit bagi penyediaan node otomatis untuk membuat pool node guna menjalankan pod.

    kubectl get pods -n aks-store-demo
    
  2. Periksa alamat IP publik untuk aplikasi tampilan depan toko. Pantau kemajuan menggunakan perintah kubectl get service dengan argumen --watch.

    kubectl get ingress store-front -n aks-store-demo --watch
    

    Output ADDRESS untuk layanan store-front pada awalnya tampil kosong.

    NAME          CLASS                                HOSTS   ADDRESS        PORTS   AGE
    store-front   webapprouting.kubernetes.azure.com   *                      80      12m
    
  3. Setelah ALAMAT berubah dari kosong ke alamat IP publik yang sebenarnya, gunakan CTRL-C untuk menghentikan kubectl proses tontonan.

    Contoh output berikut menunjukkan alamat IP publik yang valid yang ditetapkan ke layanan:

    NAME          CLASS                                HOSTS   ADDRESS        PORTS   AGE
    store-front   webapprouting.kubernetes.azure.com   *       4.255.22.196   80      12m
    
  4. Buka browser web ke alamat IP eksternal ingress Anda untuk melihat aplikasi Azure Store beraksi.

    Cuplikan layar aplikasi sampel AKS Store.

Menghapus kluster

Jika Anda tidak berencana untuk melalui tutorial AKS, bersihkan sumber daya yang tidak perlu untuk menghindari biaya Azure. Jalankan perintah az group delete untuk menghapus grup sumber daya, layanan kontainer, dan semua sumber daya terkait.

az group delete --name <resource-group> --yes --no-wait

Nota

Kluster AKS dibuat dengan identitas terkelola yang ditetapkan pengguna. Jika Anda tidak memerlukan identitas tersebut lagi, Anda dapat menghapusnya secara manual.

Saat Anda tidak lagi memerlukan sumber daya yang dibuat melalui Terraform, jalankan terraform plan dan tentukan flag destroy.

terraform plan -destroy -out main.destroy.tfplan

Jalankan terraform apply untuk menerapkan rencana pelaksanaan.

terraform apply main.destroy.tfplan

Langkah berikutnya

Dalam panduan mulai cepat ini, Anda telah menyebarkan kluster Kubernetes privat dengan menggunakan AKS Otomatis di dalam jaringan virtual kustom dan kemudian menyebarkan aplikasi multi-kontainer sederhana untuk kluster tersebut. Aplikasi sampel ini hanya untuk tujuan demo dan tidak mewakili semua praktik terbaik untuk aplikasi Kubernetes. Untuk panduan tentang membuat solusi lengkap dengan AKS untuk produksi, lihat panduan solusi AKS.

Untuk mempelajari selengkapnya tentang AKS Otomatis, lanjutkan ke pengenalan.