Erstellen eines isolierten Azure Kubernetes-Dienstclusters (Azure Kubernetes Service, AKS)

Organisationen verfügen in der Regel über strenge Sicherheits- und Complianceanforderungen, um den von einem Cluster ausgehenden (Egress-) Netzwerkdatenverkehr zu regulieren und dadurch Risiken einer Datenexfiltration auszuschließen. Standardmäßig verfügen standard-SKU Azure Kubernetes Service (AKS)-Cluster über uneingeschränkten ausgehenden Internetzugriff. Diese Ebene des Netzwerkzugriffs ermöglicht ausgeführten Knoten und Diensten, nach Bedarf auf externe Ressourcen zuzugreifen. Wenn Sie den ausgehenden Datenverkehr einschränken möchten, muss eine begrenzte Anzahl von Ports und Adressen zugänglich sein, um fehlerfreie Clusterwartungsaufgaben verwalten zu können. Das konzeptionelle Dokument für ausgehenden Netzwerk- und FQDN-Regeln für AKS-Cluster stellt eine Liste der erforderlichen Endpunkte für den AKS-Cluster und seine optionalen Add-Ons und Features bereit.

Eine gängige Lösung zum Einschränken ausgehender Datenverkehrs aus dem Cluster besteht darin, ein Firewallgerät zu verwenden, um den Datenverkehr basierend auf Firewallregeln einzuschränken. Die Firewall gilt, wenn Ihre Anwendung ausgehenden Zugriff erfordert, aber wenn ausgehende Anforderungen überprüft und gesichert werden müssen. Das manuelle Konfigurieren einer Firewall mit erforderlichen Ausgangsregeln und FQDNs ist ein umständlicher Prozess, insbesondere, wenn Ihre einzige Anforderung darin besteht, einen isolierten AKS-Cluster ohne ausgehende Abhängigkeiten für das Cluster-Bootstrapping zu erstellen.

Um das Risiko der Datenexfiltration zu verringern, ermöglicht der isolierte Netzwerkcluster das Bootstrapping des AKS-Clusters ohne ausgehende Netzwerkabhängigkeiten, auch zum Abrufen von Clusterkomponenten/Images aus der Microsoft Artifact Registry (MAR). Der Clusteroperator kann stufenweise zulässigen ausgehenden Netzwerkverkehr für jedes Szenario einrichten, das sie einschalten möchten. Dieser Artikel führt Sie durch die Schritte zum Erstellen eines isolierten Netzwerkclusters.

Voraussetzungen

Hinweis

Der Outbound-Typ none ist allgemein verfügbar. Der ausgehende Typ block befindet sich in der Vorschau.

Wichtig

AKS-Previewfunktionen sind auf Self-Service- und Abonnementbasis verfügbar. Vorschauversionen werden „wie besehen“ und „wie verfügbar“ bereitgestellt und sind von den Vereinbarungen zum Service Level und der eingeschränkten Garantie ausgeschlossen. AKS-Vorschauversionen werden teilweise vom Kundendienst nach bestem Wissen und Gewissen abgedeckt. Daher sind diese Funktionen nicht für die Verwendung in Produktionsumgebungen vorgesehen. Weitere Informationen finden Sie in den folgenden Supportartikeln:

  • Dieser Artikel erfordert Version 2.73.0 oder höher der Azure CLI. Bei Verwendung von Azure Cloud Shell ist die aktuelle Version bereits installiert.
  • Sie sollten die aks-preview Azure CLI-Erweiterung Version 9.0.0b2 oder höher installieren, wenn Sie den ausgehenden Typ block (Vorschau) verwenden.
    • Wenn Sie noch nicht über die Erweiterung aks-preview verfügen, installieren Sie diese mit dem Befehl az extension add.
      az extension add --name aks-preview
      
    • Wenn Sie bereits über die Erweiterung aks-preview verfügen, aktualisieren Sie sie über den Befehl az extension update, um sicherzustellen, dass Sie die neueste Version verwenden.
      az extension update --name aks-preview
      
  • Vom Netzwerk isolierte Cluster werden in AKS-Clustern mit Kubernetes Version 1.30 oder höher unterstützt.
  • Wenn Sie die Option "Bring your own( BYO) Azure Container Registry (ACR)" verwenden möchten, müssen Sie sicherstellen, dass ACR premium SKU-Dienstebene ist.
  • Wenn Sie einen netzwerkisolierten Cluster verwenden, der mit API Server-VNet-Integration konfiguriert ist, befolgen Sie die Voraussetzungen und Anweisungen in Verwenden der API Server-VNet-Integration mit Azure Kubernetes Service.

Festlegen von Umgebungsvariablen

Legen Sie die Umgebungsvariablen fest, die in diesem Artikel verwendet werden. Der ACR-Name muss global eindeutig sein und nur alphanumerische Zeichen in Kleinbuchstaben enthalten.

RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
AKS_NAME="myAKSCluster"
VNET_NAME="myVNet"
AKS_SUBNET_NAME="aksSubnet"
ACR_SUBNET_NAME="acrSubnet"
APISERVER_SUBNET_NAME="apiServerSubnet"
REGISTRY_NAME="myregistry${RANDOM}"
CLUSTER_IDENTITY_NAME="clusterIdentity"
KUBELET_IDENTITY_NAME="kubeletIdentity"

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}
  • Ein Azure-Konto mit einem aktiven Abonnement. Falls Sie kein Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
  • Installieren und konfigurieren Sie Terraform.
  • Azure CLI installiert und mithilfe von az login angemeldet, wird zum Überprüfen der Bereitstellung und zum Herstellen einer Verbindung mit dem Cluster verwendet. Installieren Sie Azure CLI, wenn Sie sie noch nicht haben.
  • kubectl installiert, um eine Verbindung mit dem Cluster herzustellen. Wenn Sie Azure Cloud Shell verwenden, ist kubectl bereits installiert. Um sie lokal zu installieren, verwenden Sie den az aks install-cli Befehl.
  • jq installiert und zum Parsen des Terraform-Status bei der Überprüfung der Bereitstellung verwendet. In Azure Cloud Shell ist jq bereits installiert.

Bereitstellen eines isolierten Netzwerkclusters mit AKS-verwalteter ACR

AKS erstellt, verwaltet und stimmt eine ACR-Ressource in dieser Option ab. Sie müssen weder irgendwelche Berechtigungen zuweisen noch die ACR verwalten. AKS verwaltet die Cacheregeln, die private Verbindung und den privaten Endpunkt, die im netzwerkisolierten Cluster verwendet werden.

Erstellen eines netzwerkisolierten Clusters

Wenn Sie einen isolierten AKS-Cluster erstellen, wählen Sie einen der folgenden privaten Clustermodi aus: private linkbasierte oder API-Server-VNet-Integration.

Legen Sie die Artefaktquelle und den ausgehenden Typ basierend auf ihren Netzwerkisolationsanforderungen fest.

Parameter Akzeptierte Werte /Effekt
--bootstrap-artifact-source DirectRuft Bilder direkt aus Microsoft Artifact Registry (MAR) ab und ist nicht isoliert. Cache Ruft Bilder von einem privaten ACR ab und ist netzwerkisoliert.
--outbound-type none konfiguriert keine ausgehenden Verbindungen für den Cluster, damit Sie sie selbst konfigurieren können. block (Vorschau) blockiert alle ausgehenden Verbindungen.

Erstellen Sie einen privaten, linkbasierten isolierten Netzwerkcluster, indem Sie den Befehl "az aks create " mit --bootstrap-artifact-source, --enable-private-clusterund --outbound-type Parametern ausführen.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster

API-Server-VNET-Integration

Erstellen Sie einen mit API-Server-VNet-Integration konfigurierten Netzwerk-isolierten Cluster, indem Sie den Az aks Create-Befehl mit --bootstrap-artifact-source, --enable-private-cluster--enable-apiserver-vnet-integration und --outbound-type Parametern ausführen.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration

Aktualisieren eines vorhandenen AKS-Clusters zu einem netzwerkisolierten Clustertyp

Wenn Sie die Netzwerkisolation lieber für einen vorhandenen AKS-Cluster aktivieren möchten, anstatt einen neuen Cluster zu erstellen, verwenden Sie den Befehl az aks update.

Um das Netzwerkisolationsfeature in einem vorhandenen AKS-Cluster zu aktivieren, führen Sie zunächst den folgenden Befehl aus, um bootstrap-artifact-source zu aktualisieren:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache

Anschließend müssen Sie alle vorhandenen Knotenpools manuell neu abbilden:

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Hinweis

Sie müssen sicherstellen, dass die ausgehende Verbindung besteht, bis das erste Reimaging abgeschlossen ist. Führen Sie Folgendes aus, um zu überprüfen, ob die Neuabbildung abgeschlossen ist:

NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done

Warten Sie, bis das Reimage abgeschlossen ist, und führen Sie dann den folgenden Befehl aus, um outbound-type zu aktualisieren.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none

Wichtig

Denken Sie daran, die Knotenpools des Clusters sofort neu zu abbilden, nachdem Sie die Artefaktquelle auf Cache aktualisiert haben. Andernfalls wird das Feature für den Cluster nicht wirksam.

Bereitstellen eines netzwerkisolierten Clusters mit eigener ACR

AKS unterstützt Ihre BYO (Bring your own) ACR. Zur Unterstützung des BYO ACR-Szenarios müssen Sie einen privaten ACR-Endpunkt und eine private DNS-Zone konfigurieren, bevor Sie den AKS-Cluster erstellen.

Die folgenden Schritte zeigen, wie Sie diese Ressourcen vorbereiten:

  • Benutzerdefiniertes virtuelles Netzwerk und Subnetze für AKS und ACR
  • ACR, ACR-Cacheregel, privater Endpunkt und private DNS-Zone
  • Benutzerdefinierte Steuerungsebenenidentität und Kubelet-Identität

Schritt 1: Erstellen des virtuellen Netzwerks und der Subnetze

az network vnet create  --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --address-prefixes 192.168.0.0/16

az network vnet subnet create --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.1.0/24

SUBNET_ID=$(az network vnet subnet show --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' --output tsv)

az network vnet subnet create --name ${ACR_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.2.0/24 --private-endpoint-network-policies Disabled

Schritt 2: Deaktivieren der ausgehenden Verbindung des virtuellen Netzwerks (optional)

Konfigurieren Sie beispielsweise das AKS-Subnetz als privat, indem Sie den standardmäßigen ausgehenden Zugriff auf false festlegen.

az network vnet subnet update --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${AKS_SUBNET_NAME} --default-outbound false

Weitere unterstützte Methoden und Übergangsüberlegungen finden Sie unter Deaktivieren der ausgehenden Verbindung mit virtuellen Netzwerken.

Schritt 3: Erstellen des ACR und Aktivieren des Artefaktcaches

  1. Erstellen Sie die ACR mit deaktiviertem öffentlichem Netzwerkzugriff.

    az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false
    
    REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP}  --query 'id' --output tsv)
    
  2. Erstellen Sie eine ACR-Cacheregel mithilfe des folgenden Befehls, damit Benutzer MAR-Containerimages und Binärdateien im neuen ACR zwischenspeichern können. Der Cacheregelname und die Namen von Repositorys müssen den Anweisungen im nächsten Abschnitt folgen.

    az acr cache create -n aks-managed-mcr -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "aks-managed-repository/*"
    

Hinweis

Mit BYO ACR müssen Sie sicherstellen, dass die ACR-Cacheregel wie oben erstellt und ordnungsgemäß verwaltet wird. Dieser Schritt ist entscheidend für die Erstellung, Funktionsweise und Aktualisierung von Clustern. Diese Cacheregel sollte NICHT geändert werden.

Schritt 4: Erstellen eines privaten Endpunkts für das ACR

az network private-endpoint create --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --subnet ${ACR_SUBNET_NAME} --private-connection-resource-id ${REGISTRY_ID} --group-id registry --connection-name myConnection

NETWORK_INTERFACE_ID=$(az network private-endpoint show --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --query 'networkInterfaces[0].id' --output tsv)

REGISTRY_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" --output tsv)

DATA_ENDPOINT_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$LOCATION'].privateIPAddress" --output tsv)

Schritt 5: Erstellen einer privaten DNS-Zone und Hinzufügen von Einträgen

Erstellen Sie eine privaten DNS-Zone namens privatelink.azurecr.io. Fügen Sie die Datensätze für den Registrierungs-REST-Endpunkt {REGISTRY_NAME}.azurecr.io und den Registrierungsdatenendpunkt {REGISTRY_NAME}.{LOCATION}.data.azurecr.io hinzu.

az network private-dns zone create --resource-group ${RESOURCE_GROUP} --name "privatelink.azurecr.io"

az network private-dns link vnet create --resource-group ${RESOURCE_GROUP} --zone-name "privatelink.azurecr.io" --name MyDNSLink --virtual-network ${VNET_NAME} --registration-enabled false

az network private-dns record-set a create --name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${REGISTRY_PRIVATE_IP}

az network private-dns record-set a create --name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${DATA_ENDPOINT_PRIVATE_IP}

Schritt 6: Erstellen von Identitäten auf Steuerungsebene und Kubelet-Identitäten

Steuerungsebenenidentität

az identity create --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

CLUSTER_IDENTITY_RESOURCE_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

CLUSTER_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Kubelet-Identität

az identity create --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

KUBELET_IDENTITY_RESOURCE_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

KUBELET_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Wenn Sie einen vorhandenen AKS-Cluster aktualisieren, überspringen Sie die vorherigen Befehle zum Erstellen von Identitäten, und rufen Sie die vorhandene Kubelet-Identitätsobjekt-ID ab:

KUBELET_IDENTITY_PRINCIPAL_ID=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --query identityProfile.kubeletidentity.objectId -o tsv)

Erteilen von ACR-Pullberechtigungen für die Kubelet-Identität

Überprüfen Sie den Rollenzuweisungsberechtigungsmodus der Registrierung, und wählen Sie die entsprechende Pullrolle aus. ABAC-fähige Registrierungen verwenden die Container Registry Repository Reader Rolle. Nicht ABAC-fähige Registrierungen verwenden die AcrPull Rolle.

ROLE_ASSIGNMENT_MODE=$(az acr show --name ${REGISTRY_NAME} --resource-group ${RESOURCE_GROUP} --query roleAssignmentMode -o tsv)

if [[ "${ROLE_ASSIGNMENT_MODE}" == "rbac-abac" ]]; then
  ACR_PULL_ROLE="Container Registry Repository Reader"
else
  ACR_PULL_ROLE="AcrPull"
fi

az role assignment create --role "${ACR_PULL_ROLE}" --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

Nachdem Sie diese Ressourcen konfiguriert haben, können Sie den netzwerkisolierten AKS-Cluster mit BYO ACR erstellen.

Schritt 7: Erstellen eines isolierten Netzwerkclusters mithilfe von BYO ACR

Wenn Sie einen isolierten Netzwerkcluster erstellen, wählen Sie einen der folgenden privaten Clustermodi aus: private linkbasierte oder API-Server-VNet-Integration.

Legen Sie die Artefaktquelle und den ausgehenden Typ basierend auf ihren Netzwerkisolationsanforderungen fest.

Parameter Akzeptierte Werte /Effekt
--bootstrap-artifact-source DirectRuft Bilder direkt aus Microsoft Artifact Registry (MAR) ab und ist nicht isoliert. Cache Ruft Bilder von einem privaten ACR ab und ist netzwerkisoliert.
--outbound-type none konfiguriert keine ausgehenden Verbindungen für den Cluster, damit Sie sie selbst konfigurieren können. block (Vorschau) blockiert alle ausgehenden Verbindungen.

Erstellen Sie einen auf Private Link basierenden, netzwerkisolierten AKS-Cluster, der auf Ihre ACR zugreift, indem Sie den Befehl az aks create mit den erforderlichen Parametern ausführen.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster

API-Server-VNET-Integration

Erstellen Sie für einen netzwerkisolten Cluster, der mit der VNet-Integration von API-Servern konfiguriert ist, zuerst ein Subnetz, und weisen Sie die richtige Rolle mit den folgenden Befehlen zu:

az network vnet subnet create --name ${APISERVER_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.3.0/24 --delegations Microsoft.ContainerService/managedClusters

export APISERVER_SUBNET_ID=$(az network vnet subnet show --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${APISERVER_SUBNET_NAME} --query id -o tsv)
az role assignment create --scope ${APISERVER_SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

az role assignment create --scope ${SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

Erstellen Sie einen isolierten privaten Netzwerkcluster, der mit der API-Server-VNet-Integration konfiguriert ist, und greifen Sie auf Ihre ACR zu, indem Sie den Befehl "az aks create " mit den erforderlichen Parametern ausführen.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}

Aktualisieren eines vorhandenen AKS-Clusters

Wenn Sie die Netzwerkisolation lieber für einen vorhandenen AKS-Cluster aktivieren möchten, anstatt einen neuen Cluster zu erstellen, verwenden Sie den Befehl az aks update.

Verwenden Sie beim Erstellen des privaten Endpunkts und der privaten DNS-Zone für die BYO ACR das vorhandene virtuelle Netzwerk und die Subnetze des vorhandenen AKS-Clusters. Wenn Sie der Kubelet-Identität die entsprechende ACR-Pullrolle zuweisen, verwenden Sie die vorhandene Kubelet-Identität des vorhandenen AKS-Clusters.

Um das Netzwerkisolationsfeature in einem vorhandenen AKS-Cluster zu aktivieren, führen Sie zunächst den folgenden Befehl aus, um bootstrap-artifact-source zu aktualisieren:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID}

Anschließend müssen Sie alle vorhandenen Knotenpools manuell neu abbilden:

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Hinweis

Sie müssen sicherstellen, dass die ausgehende Verbindung besteht, bis das erste Reimaging abgeschlossen ist. Führen Sie Folgendes aus, um zu überprüfen, ob die Neuabbildung abgeschlossen ist:

NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done

Warten Sie, bis das Reimage abgeschlossen ist, und führen Sie dann den folgenden Befehl aus, um outbound-type zu aktualisieren.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none

Wichtig

Denken Sie daran, die Knotenpools des Clusters sofort neu zu abbilden, nachdem Sie die Artefaktquelle auf Cache aktualisiert haben. Andernfalls wird das Feature für den Cluster nicht wirksam.

Aktualisieren Ihrer ACR-ID

Sie können das private ACR aktualisieren, das mit einem isolierten Netzwerkcluster verwendet wird. Verwenden Sie den Befehl az aks show, um die ACR-Ressourcen-ID zu identifizieren.

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

Die Aktualisierung der ACR-ID wird ausgeführt, indem der Befehl az aks update mit den Parametern --bootstrap-artifact-source und --bootstrap-container-registry-resource-id ausgeführt wird.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id <new-byo-acr-resource-id>

Wenn Sie die ACR-ID in einem vorhandenen Cluster aktualisieren, müssen Sie für alle vorhandenen Knoten manuell ein Reimaging durchführen.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Wichtig

Vergessen Sie nicht, für die Knotenpools des Clusters ein Reimaging durchzuführen, nachdem Sie die Funktion für die Netzwerkisolation im Cluster aktiviert haben. Andernfalls wird das Feature für den Cluster nicht wirksam.

Stellen Sie mit Terraform einen netzwerkisolierten Cluster bereit

In diesem Terraform-Beispiel wird ein netzwerkisolierter Cluster mithilfe der oben in diesem Artikel beschriebenen AKS-verwalteten ACR-Option bereitgestellt. Der AzureRM-Anbieter macht noch nicht alle netzwerkisolten Bootstrapeinstellungen verfügbar, die in diesem Beispiel verwendet werden. Daher verwendet das Beispiel den AzAPI-Anbieter, um die verwaltete Clusterressource für die erforderliche API-Version bereitzustellen. Ein Terraform-Beispiel für die Bring your own (BYO) ACR-Option ist derzeit nicht verfügbar. Um BYO ACR zu verwenden, folgen Sie den Azure CLI Anleitungen weiter oben in diesem Artikel.

Im Beispiel werden die folgenden Ressourcen bereitgestellt:

  • Eine Ressourcengruppe (Microsoft.Resources/resourceGroups).
  • Ein netzwerkisolierter AKS-Cluster (Microsoft.ContainerService/managedClusters), der Folgendes verwendet:
    • Eine vom System zugewiesene verwaltete Identität.
    • Ein einzelner Systemknotenpool mit einem Standard_D2s_v3 Knoten und deaktivierter automatischer Skalierung.
    • Das azure Netzwerk-Plugin, wobei outboundType auf none gesetzt ist, sodass der Cluster beim Bootstrapping keine Abhängigkeiten von ausgehenden Netzwerkverbindungen hat.
    • apiServerAccessProfile.enablePrivateCluster auf true gesetzt, wodurch ein privater Cluster auf Basis eines privaten Links erstellt wird.
    • bootstrapProfile.artifactSourcefestgelegt auf Cache, sodass AKS einen eigenen ACR-Cache erstellt, verwaltet und in Einklang bringt, um den Cluster zu bootstrapieren, anstatt direkt aus Microsoft Artifact Registry (MAR) abzurufen. Wie weiter oben in diesem Artikel beschrieben, müssen Sie diese ACR nicht selbst erstellen oder verwalten, und AKS behandelt die Cacheregeln, die private Verknüpfung und den privaten Endpunkt, den der vom Netzwerk isolierte Cluster verwendet.

Der Cluster wird mit der in der Bereitstellungsregion unterstützten Kubernetes-Standardversion erstellt. Um eine bestimmte Version festzulegen, fügen Sie kubernetesVersion zum properties-Block des Clusters in main.tf hinzu und bestätigen Sie mithilfe des Befehls az aks get-versions, dass die Version in der Region verfügbar ist.

  1. Erstellen Sie ein Verzeichnis, um den Terraform-Beispielcode zu testen, und machen Sie es zum aktuellen Verzeichnis.

  2. Erstellen Sie eine Datei mit dem Namen main.tf , und kopieren Sie die folgende getestete Beispielkonfiguration in die Datei.

    terraform {
      required_version = ">= 1.6.0"
    
      required_providers {
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.6"
        }
      }
    }
    
    provider "azapi" {}
    
    resource "random_string" "suffix" {
      length  = 6
      upper   = false
      special = false
    }
    
    locals {
      location            = "westus2"
      resource_group_name = "rg-aks-network-isolated-${random_string.suffix.result}"
      aks_name            = "aks-netisolated-${random_string.suffix.result}"
      dns_prefix          = "aksnetiso${random_string.suffix.result}"
    }
    
    resource "azapi_resource" "resource_group" {
      type     = "Microsoft.Resources/resourceGroups@2024-03-01"
      name     = local.resource_group_name
      location = local.location
    }
    
    resource "azapi_resource" "aks_cluster" {
      type      = "Microsoft.ContainerService/managedClusters@2025-08-01"
      name      = local.aks_name
      parent_id = azapi_resource.resource_group.id
      location  = local.location
    
      identity {
        type = "SystemAssigned"
      }
    
      body = {
        properties = {
          dnsPrefix = local.dns_prefix
          agentPoolProfiles = [
            {
              name              = "systempool"
              count             = 1
              vmSize            = "Standard_D2s_v3"
              mode              = "System"
              osType            = "Linux"
              type              = "VirtualMachineScaleSets"
              enableAutoScaling = false
            }
          ]
          networkProfile = {
            networkPlugin = "azure"
            outboundType  = "none"
          }
          apiServerAccessProfile = {
            enablePrivateCluster = true
          }
          bootstrapProfile = {
            artifactSource = "Cache"
          }
        }
      }
    }
    

Terraform initialisieren

Führen Sie terraform init aus, um die Bereitstellung der Terraform zu initialisieren. Dieser Befehl lädt die zum Verwalten der Ressourcen in diesem Beispiel erforderlichen azapi- und random-Provider herunter.

terraform init -upgrade

Formatieren und Überprüfen der Konfiguration

Führen Sie die Ausführung terraform fmt aus, um die Konfigurationsdatei zu formatieren, und terraform validate um zu bestätigen, dass die Konfiguration syntaktisch gültig ist.

terraform fmt
terraform validate

Terraform-Ausführungsplan erstellen

Ausführen terraform plan , um einen Ausführungsplan zu erstellen.

terraform plan -out main.tfplan

Wenden Sie einen Terraform-Ausführungsplan an

Führen Sie diesen terraform apply Befehl aus, um den Ausführungsplan auf Ihr Azure-Abonnement anzuwenden.

terraform apply main.tfplan

Das Erstellen der Ressourcengruppe und des privaten, netzwerkisolten AKS-Clusters dauert mehrere Minuten.

Überprüfen Sie die Bereitstellung

In diesem Beispiel werden keine Terraform-Outputs definiert. Verwenden Sie daher terraform show -json zusammen mit jq, um nach Abschluss von terraform apply die Namen der generierten Ressourcengruppe und des Clusters aus dem Ressourcenstatus abzurufen. Sie verwalten beide Ressourcen über den azapi-Anbieter, und ihr name-Attribut enthält den ermittelten Ressourcennamen.

RESOURCE_GROUP=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.resource_group") | .values.name')
AKS_NAME=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.aks_cluster") | .values.name')

Vergewissern Sie sich, dass der Cluster mit den erwarteten isolierten Netzwerkeinstellungen mithilfe des az aks show Befehls erstellt wurde.

az aks show --resource-group $RESOURCE_GROUP --name $AKS_NAME --query "{outboundType:networkProfile.outboundType, artifactSource:bootstrapProfile.artifactSource, privateCluster:apiServerAccessProfile.enablePrivateCluster}"

Die Ausgabe zeigt, dass outboundType auf none, artifactSource auf privateCluster und Cache auf true festgelegt ist, was bestätigt, dass der Cluster netzwerkisoliert ist und über den AKS-verwalteten ACR-Cache initialisiert wird.

Herstellen einer Verbindung mit dem Cluster

Da es sich um einen privaten Cluster handelt, stellen Sie eine Verbindung von einem Client her, der über eine Netzwerkleitung verfügt, mit dem privaten Endpunkt des Clusters, z. B. einem virtuellen Computer im selben oder einem virtuellen Peernetzwerk, oder Azure Cloud Shell, wenn sie mit dem virtuellen Netzwerk des Clusters verbunden ist. Rufen Sie die Clusteranmeldeinformationen mithilfe des az aks get-credentials Befehls ab, und überprüfen Sie dann die Verbindung mithilfe des kubectl get nodes Befehls.

az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME
kubectl get nodes

Bereinigen von Ressourcen

Wenn Sie die in diesem Artikel erstellten Ressourcen nicht mehr benötigen, entfernen Sie sie, um weitere Gebühren zu vermeiden.

Warning

Beim Ausführen terraform destroy wird jede Ressource entfernt, die in der Terraform-Zustandsdatei für diese Konfiguration nachverfolgt wird, einschließlich der Ressourcengruppe und des AKS-Clusters. Überprüfen Sie den Plan sorgfältig, bevor Sie ihn ausführen, und führen Sie ihn nicht auf gemeinsam genutzter oder Produktivinfrastruktur aus.

Führen Sie terraform plan mit der -destroy Kennzeichnung aus, um zu überprüfen, was Terraform entfernt.

terraform plan -destroy -out main.destroy.tfplan

Führen Sie die Ausführung terraform apply aus, um den Zerstörungsplan anzuwenden und alle von diesem Beispiel erstellten Ressourcen zu entfernen.

terraform apply main.destroy.tfplan

Überprüfen, ob der isolierte Netzwerkcluster auf AKS aktiviert ist

Verwenden Sie den az aks show Befehl, um zu überprüfen, ob das netzwerkisolierte Clusterfeature aktiviert ist.

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

Die folgende Ausgabe zeigt einen netzwerkisolierten Cluster, der mit dem none Outbound-Typ konfiguriert ist. Vergewissern Sie sich, dass outboundType auf none oder block gesetzt ist und dass artifactSource auf Cache gesetzt ist. Das containerRegistryId Feld identifiziert den ACR, der für das Bootstrapping verwendet wird.

{
  "kubernetesVersion": "<major>.<minor>.<patch>",
  "name": "myAKSCluster",
  "type": "Microsoft.ContainerService/ManagedClusters",
  "properties": {
    "networkProfile": {
      "outboundType": "none"
    },
    "bootstrapProfile": {
      "artifactSource": "Cache",
      "containerRegistryId": "/subscriptions/my-subscription-id/resourceGroups/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
    }
  }
}

Netzwerkisolierten Cluster in AKS deaktivieren

Deaktivieren Sie das Feature für netzwerkisolierte Cluster, indem Sie den Befehl az aks update mit den Parametern --bootstrap-artifact-source und --outbound-type ausführen.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Direct --outbound-type LoadBalancer

Wenn Sie das Feature für einen vorhandenen Cluster deaktivieren, müssen Sie für alle vorhandenen Knoten manuell ein Reimaging durchführen.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Wichtig

Vergessen Sie nicht, für die Knotenpools des Clusters ein Reimaging durchzuführen, nachdem Sie die Funktion für die Netzwerkisolation im Cluster deaktiviert haben. Andernfalls wird das Feature für den Cluster nicht wirksam.

Problembehandlung

Wenn Probleme auftreten, z. B. Fehler beim Abrufen von Images, lesen Sie unter Problembehandlung bei netzwerkisolierten AKS-Clustern (Azure Kubernetes Service) nach.

Nächste Schritte

Wenn Sie eine Konfiguration mit Einschränkungen des ausgehenden Datenverkehrs mithilfe der Azure-Firewall einrichten möchten, lesen Sie Steuern des ausgehenden Datenverkehrs mithilfe von Azure Firewall in AKS.

Informationen zur Einschränkung der Kommunikation zwischen Pods sowie zu Ost-West-Datenverkehrseinschränkungen innerhalb des Clusters finden Sie unter Sicherer Datenverkehr zwischen Pods durch Netzwerkrichtlinien in AKS (Azure Kubernetes Service).