Dela via


Ansluta till ett API Server VNet-integreringskluster med hjälp av Azure Private Link

Med API Server VNet-integrering kan du placera kontrollplanets IP-adress i ditt eget virtuella nätverk. Mönstret som beskrivs här utökar funktionen till fler virtuella nätverk genom att länka Private Link. Det är användbart för hub-and-spoke-topologier, dedikerade byggnätverk eller virtuella jump-host-nätverk som måste administrera produktionskluster utan att öppna API-servern till det offentliga Internet.

Den här artikeln gäller endast för kluster som skapas med API Server VNet-integrering och visar hur du:

  • Distribuera ett privat AKS-kluster med API Server VNet-integrering.
  • Exponera API-servern via en Private Link Service (PLS) i klustrets virtuella nätverk.
  • Skapa en privat slutpunkt (PE) i ett annat virtuellt nätverk.
  • Konfigurera privat DNS så att Kubernetes-verktyg löser klustrets privata fullständiga domännamn i fjärrnätverket.

Information om privata kluster som inte använder API Server VNet-integrering finns i Skapa ett privat AKS-kluster.

Tillgänglighet i regionen

API Server VNet-integrering är för närvarande tillgänglig i en delmängd av Azure-regioner och omfattas av regionala kapacitetsgränser. Innan du börjar kontrollerar du att målregionen stöds. Mer information finns i API Server VNet-integrering.

Förutsättningar

Krav Minimi
Azure CLI (kommandoradsgränssnittet för Azure) 2.73.0
Behörigheter Deltagare + nätverksdeltagare i båda prenumerationerna

Om du använder anpassade DNS-servrar lägger du till Azures virtuella IP 168.63.129.16 som en överordnad vidarebefordrare.

Ange miljövariabler

Ange följande miljövariabler för användning i hela den här artikeln. Känn dig fri att ersätta platshållarvärdena med dina egna.

LOCATION="westus3"

# Resource groups
AKS_RG="aks-demo-rg"
REMOTE_RG="client-demo-rg"

# AKS cluster
AKS_CLUSTER="aks-private"
AKS_SUBNET="aks-subnet"

# Private Link Service
PLS_NAME="apiserver-pls"
PLS_SUBNET="pls-subnet"
PLS_PREFIX="10.225.0.0/24"

# Remote VNet
REMOTE_VNET="client-vnet"
REMOTE_SUBNET="client-subnet"
REMOTE_VNET_PREFIX="192.168.0.0/16"
REMOTE_SUBNET_PREFIX="192.168.1.0/24"
PE_NAME="aks-pe"
PE_CONN_NAME="aks-pe-conn"

# DNS
DNS_ZONE="private.${LOCATION}.azmk8s.io"
DNS_LINK="dns-link"

Skapa resursgrupper

# Create resource groups for the AKS cluster
az group create --name $AKS_RG --location $LOCATION

# Create a resource group for the remote VNet
az group create --name $REMOTE_RG --location $LOCATION

Distribuera ett privat kluster med API Server VNet-integrering

Viktigt!

API Server VNet-integrering kräver ett eget undernät. Om du inte anger något skapar AKS det automatiskt i nodresursgruppen.

az aks create \
  --name $AKS_CLUSTER \
  --resource-group $AKS_RG \
  --location $LOCATION \
  --enable-private-cluster \
  --enable-apiserver-vnet-integration

När klustret har slutfört etableringen samlar du in den autogenererade nodresursgruppen, klustrets VNet-namn och den privata FQDN-etiketten:

AKS_NODE_RG=$(az aks show -g $AKS_RG -n $AKS_CLUSTER --query nodeResourceGroup -o tsv)
AKS_VNET=$(az network vnet list --resource-group $AKS_NODE_RG --query '[0].name' -o tsv)
DNS_RECORD=$(az aks show -g $AKS_RG -n $AKS_CLUSTER --query privateFqdn -o tsv | cut -d'.' -f1,2)
FRONTEND_IP_CONFIG_ID=$(az network lb show \
  --name kube-apiserver \
  --resource-group $AKS_NODE_RG \
  --query "frontendIPConfigurations[0].id" \
  -o tsv)

Lägg till ett dedikerat undernät för PLS och inaktivera nätverksprinciper som inte stöds i Private Link-undernät.

Skapa PLS och peka den till den interna kube-apiserver-lastbalanseraren som AKS skapade för kontrollplanet.

# Subnet for the PLS
az network vnet subnet create \
  --name $PLS_SUBNET \
  --vnet-name $AKS_VNET \
  --resource-group $AKS_NODE_RG \
  --address-prefixes $PLS_PREFIX \
  --disable-private-link-service-network-policies

# PLS pointing to the API‑server ILB
az network private-link-service create \
  --name $PLS_NAME \
  --resource-group $AKS_NODE_RG \
  --vnet-name $AKS_VNET \
  --subnet $PLS_SUBNET \
  --lb-frontend-ip-configs $FRONTEND_IP_CONFIG_ID \
  --location $LOCATION

Skapa en PrivateEndpoint (PE) i det fjärranslutna virtuella nätverket

# Remote VNet and subnet
az network vnet create \
  --name $REMOTE_VNET \
  --resource-group $REMOTE_RG \
  --location $LOCATION \
  --address-prefixes $REMOTE_VNET_PREFIX

az network vnet subnet create \
  --name $REMOTE_SUBNET \
  --vnet-name $REMOTE_VNET \
  --resource-group $REMOTE_RG \
  --address-prefixes $REMOTE_SUBNET_PREFIX

# Private Endpoint
PLS_ID=$(az network private-link-service show \
  --name $PLS_NAME \
  --resource-group $AKS_NODE_RG \
  --query id -o tsv)

az network private-endpoint create \
  --name $PE_NAME \
  --resource-group $REMOTE_RG \
  --vnet-name $REMOTE_VNET \
  --subnet $REMOTE_SUBNET \
  --private-connection-resource-id $PLS_ID \
  --connection-name $PE_CONN_NAME \
  --location $LOCATION

När den privata slutpunkten har slutfört etableringen noterar du dess nätverksgränssnitts-ID (NIC) så att du kan hämta den allokerade privata IP-adressen.

PE_NIC_ID=$(az network private-endpoint show \
  --name $PE_NAME \
  --resource-group $REMOTE_RG \
  --query 'networkInterfaces[0].id' \
  --output tsv)

# Capture the IP from the NIC
PE_IP=$(az network nic show \
  --ids $PE_NIC_ID \
  --query 'ipConfigurations[0].privateIPAddress' \
  --output tsv)

Konfigurera privat DNS

# Create or reuse the regional DNS zone
az network private-dns zone create \
  --name $DNS_ZONE \
  --resource-group $REMOTE_RG

az network private-dns record-set a create \
  --name $DNS_RECORD \
  --zone-name $DNS_ZONE \
  --resource-group $REMOTE_RG

az network private-dns record-set a add-record \
  --record-set-name $DNS_RECORD \
  --zone-name $DNS_ZONE \
  --resource-group $REMOTE_RG \
  --ipv4-address $PE_IP

# Link zone to the remote VNet
REMOTE_VNET_ID=$(az network vnet show \
  --name $REMOTE_VNET \
  --resource-group $REMOTE_RG \
  --query id -o tsv)

az network private-dns link vnet create \
  --name $DNS_LINK \
  --zone-name $DNS_ZONE \
  --resource-group $REMOTE_RG \
  --virtual-network $REMOTE_VNET_ID \
  --registration-enabled false

Testa anslutningen

Om du försöker testa anslutningen lokalt kan det uppstå ett fel eftersom DNS-zonen inte är länkad till det lokala nätverket.

az aks get-credentials --resource-group $AKS_RG --name $AKS_CLUSTER
kubectl get nodes

Distribuera en virtuell testdator i det fjärranslutna virtuella nätverket

Om du vill bekräfta sökvägen för den privata slutpunkten distribuerar du en virtuell testdator i det fjärranslutna virtuella nätverket och använder den för att ansluta till AKS-klustret.

# Create Network Security Group that allows inbound SSH (TCP 22)
az network nsg create \
  --name "${REMOTE_VNET}-nsg" \
  --resource-group $REMOTE_RG \
  --location $LOCATION

az network nsg rule create \
  --nsg-name "${REMOTE_VNET}-nsg" \
  --resource-group $REMOTE_RG \
  --name allow-ssh \
  --priority 100 \
  --access Allow \
  --protocol Tcp \
  --direction Inbound \
  --source-address-prefixes '*' \
  --destination-port-ranges 22

# Associate the NSG with the remote subnet
az network vnet subnet update \
  --name $REMOTE_SUBNET \
  --vnet-name $REMOTE_VNET \
  --resource-group $REMOTE_RG \
  --network-security-group "${REMOTE_VNET}-nsg"

# Create a small Ubuntu VM in that subnet (with a public IP for quick SSH)
az vm create \
  --resource-group $REMOTE_RG \
  --name test-vm \
  --image Ubuntu2204 \
  --size Standard_B2s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --vnet-name $REMOTE_VNET \
  --subnet $REMOTE_SUBNET \
  --public-ip-sku Standard

# Capture the public IP address
VM_PUBLIC_IP=$(az vm show -d -g $REMOTE_RG -n test-vm --query publicIps -o tsv)

Anslut till den virtuella datorn och testa anslutningen

ssh -i ~/.ssh/id_rsa azureuser@$VM_PUBLIC_IP

# Inside the VM
# Install Azure CLI 
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# Install kubectl
sudo az aks install-cli

# re-export the aks variables
export AKS_RG="aks-demo-rg"
export AKS_CLUSTER="aks-private"

# login to Azure. Follow the instructions to authenticate
az login

# Get the AKS credentials
az aks get-credentials --resource-group $AKS_RG --name $AKS_CLUSTER

# Test the connection
kubectl get nodes

# You should see the AKS nodes

# Exit the VM
exit

Rensa resurser

Om du vill undvika löpande Azure-avgifter tar du bort resursgrupperna med hjälp av az group delete kommandot .

az group delete --name $AKS_RG --yes --no-wait
az group delete --name $REMOTE_RG --yes --no-wait

Nästa steg