Übung: Konfigurieren von Azure Policy für Kubernetes auf einem AKS-Cluster

Abgeschlossen

Azure Policy für Kubernetes unterstützt Organisationen dabei, Governance- und gesetzliche Anforderungen zu erfüllen, bewährte Methoden zu implementieren und organisatorische Konventionen für Cloudumgebungen einzurichten.

Entwicklungsteams in Ihrem Unternehmen nutzen Azure Kubernetes Service (AKS) als Entwicklungsplattform. Sie erkennen, dass Sie die Kosten am besten verwalten können, indem Sie Geschäftsregeln durchsetzen, die Grenzwerte für Workloads und Ressourcen festlegen. Sie möchten sicherstellen, dass Entwickler Workloads nur innerhalb bestimmter CPU- und Speicherzuweisungsgrenzen bereitstellen können. Das System muss das Ausführen von Workloads verhindern, die diese Grenzwerte überschreiten.

In dieser Übung aktivieren Sie Azure Policy für AKS in Ihrem Cluster und fügen die Richtlinie CPU- und Arbeitsspeicherressourcen für Container in einem Kubernetes-Cluster dürfen die angegebenen Limits nicht überschreiten hinzu. Dann testen Sie, ob die Richtlinie die Planung von Workloads verweigert, die die Ressourcenparameter der Richtlinie überschreiten.

Aktivieren der ContainerService- und PolicyInsights-Ressourcenanbieter

  1. Melden Sie sich mit Ihrem Azure-Konto bei Azure Cloud Shell an. Wählen Sie die Bash-Version von Cloud Shell aus.

  2. Azure Policy für AKS erfordert, dass die Clusterversion 1.14 oder höher ist. Führen Sie das folgende Skript zum Überprüfen der AKS-Clusterversion aus:

    az aks list
    

    Stellen Sie sicher, dass die gemeldete Clusterversion 1.14 oder höher ist.

  3. Registrieren Sie den Azure Kubernetes Service-Anbieter, indem Sie den Befehl az provider register ausführen:

    az provider register --namespace Microsoft.ContainerService
    
  4. Registrieren Sie den Azure Policy-Anbieter, indem Sie den Befehl az provider register ausführen:

    az provider register --namespace Microsoft.PolicyInsights
    
  5. Aktivieren Sie die Add-On-Installation, indem Sie den Befehl az feature register ausführen:

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. Überprüfen Sie, ob die Registrierung erfolgreich war, indem Sie die Featurelistentabelle abfragen. Verwenden Sie den az feature list-Befehl, um die Abfrage auszuführen. Die Registrierung der Funktion kann einige Minuten in Anspruch nehmen, so dass Sie das Ergebnis regelmäßig überprüfen müssen.

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    Wenn für die Cloud Shell-Sitzung ein Timeout auftritt, können Sie den Registrierungsprozess über das Azure-Portal mithilfe des Onboardingvorschaubereichs nachverfolgen.

  7. Führen Sie den az provider register-Befehl aus, um das Update zu verteilen, nachdem Sie sichergestellt haben, dass der Abfragebefehl für die Featureliste die Angabe „Registered“ (Registriert) anzeigt:

    az provider register -n Microsoft.ContainerService
    

Aktivieren von Azure Policy auf Ihrem Cluster

  1. Führen Sie den az aks enable-addons-Befehl aus, um das azure-policy-Add-On für Ihren Cluster zu aktivieren:

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. Vergewissern Sie sich, dass der azure-policy-Pod im kube-system-Namespace installiert ist und der gatekeeper-Pod im gatekeeper-system-Namespace. Führen Sie hierzu die folgenden kubectl get pods-Befehle aus:

    kubectl get pods -n kube-system
    

    Ihre Ausgabe sollte in etwa wie folgt aussehen:

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    Ihre Ausgabe sollte in etwa wie folgt aussehen:

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. Stellen Sie abschließend sicher, dass das neueste Add-On installiert ist, indem Sie den az aks show-Befehl ausführen. Dieser Befehl ruft die Konfigurationsinformationen für Ihren Cluster ab.

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    Ihre Ausgabe sollte in etwa wie folgt aussehen:

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    Sie können nun zum Azure-Portal wechseln, um die Richtlinie mit dem Namen CPU- und Speicherressourcenlimits des Kubernetes-Clustercontainers sollten die angegebenen Grenzwerte nicht überschreiten zu konfigurieren.

Zuweisen einer integrierten Richtliniendefinition

Sie verwenden den Policy-Dienst im Azure-Portal, um die neue Azure Policy-Instanz zu konfigurieren.

  1. Melden Sie sich beim Azure-Portal an.

  2. Suchen Sie den Dienst Policy im Azure-Portal. Suchen Sie hierfür über die Suchleiste oben im Portal nach Policy, und wählen Sie den Eintrag aus.

  3. Wählen Sie den Dienst Policy in der Liste der Dienste aus, wie hier gezeigt:

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    Das Policy-Dashboard wird mit einer Übersicht geöffnet, in der alle Ihre zugewiesenen Richtlinien, der Status der Ressourcen und die Auswirkungen von Richtlinien auf diese angezeigt werden. Wenn Sie keine Richtlinien zugewiesen haben, ist das Dashboard leer.

  4. Klicken Sie im linken Menübereich unter Erstellung auf Zuweisungen:

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. Wie zuvor beschrieben gibt es zwei Möglichkeiten, eine Richtlinienzuweisung zu erstellen: Entweder Sie weisen eine Initiative oder eine Richtlinie zu. Klicken Sie auf der oberen Menüleiste auf Richtlinie zuweisen:

    Screenshot that shows the new policy assignment option.

    Der Bereich Richtlinie zuweisen wird angezeigt.

  6. Geben Sie zum Erstellen der Richtlinie auf der Registerkarte Grundlagen die folgenden Werte für die einzelnen Einstellungen ein.

    Einstellung Wert
    Bereich
    `Scope` Klicken Sie auf die Schaltfläche mit den Auslassungspunkten. Der Bereich Bereich wird angezeigt. Wählen Sie unter Abonnement das Abonnement aus, das Ihre Ressourcengruppe enthält. Wählen Sie für Ressourcengruppe die Gruppe rg-akscostsaving und dann die Schaltfläche Auswählen aus.
    Ausschlüsse Lassen Sie dieses Feld leer.
    Grundlagen
    Richtliniendefinition Klicken Sie auf die Schaltfläche mit den Auslassungspunkten. Der Bereich Verfügbare Definitionen wird angezeigt. Filtern Sie die Auswahl im Suchfeld, indem Sie CPU eingeben. Wählen Sie auf der Registerkarte Richtliniendefinitionen die Option CPU- und Arbeitsspeicherressourcen für Container in einem Kubernetes-Cluster dürfen die angegebenen Limits nicht überschreiten und dann Hinzufügen aus.
    Zuweisungsname Akzeptieren Sie den Standardwert.
    BESCHREIBUNG Lassen Sie dieses Feld leer.
    Durchsetzung von Richtlinien Stellen Sie sicher, dass diese Option auf Aktiviert festgelegt ist.
    Zugewiesen von Akzeptieren Sie den Standardwert.

    Im Folgenden sehen Sie ein Beispiel für die ausgefüllte Registerkarte Grundeinstellungen:

    Screenshot that shows the information captured in the Basics tab.

  7. Klicken Sie auf die Registerkarte Parameter, um die Parameter für die Richtlinie anzugeben.

  8. Legen Sie die folgenden Werte für die einzelnen Parametereinstellungen fest:

    Einstellung Wert
    Maximal zulässige CPU-Einheiten Legen Sie den Wert auf 200m fest. Die Richtlinie gleicht diesen Wert sowohl mit dem Workload-Ressourcenanforderungswert als auch mit dem Workloadgrenzwert in der Workloadmanifestdatei ab.
    Maximal zulässige Arbeitsspeicherbytes Legen Sie den Wert auf 256Mi fest. Die Richtlinie gleicht diesen Wert sowohl mit dem Workload-Ressourcenanforderungswert als auch mit dem Workloadgrenzwert in der Workloadmanifestdatei ab.

    Im Folgenden sehen Sie ein Beispiel für die ausgefüllte Registerkarte Parameter:

    Screenshot that shows the information captured in the Parameters tab.

  9. Klicken Sie auf die Registerkarte Wartung. Auf dieser Registerkarte legen Sie fest, wie sich die neue Richtlinie auf bereits vorhandene Ressourcen auswirkt. Standardmäßig prüft die neue Richtlinie nur neu erstellte Ressourcen. Behalten Sie die Standardkonfiguration bei.

    Im Folgenden sehen Sie ein Beispiel für die ausgefüllte Registerkarte Wartung:

    Screenshot that shows the information captured in the Remediation tab.

  10. Wählen Sie die Registerkarte Überprüfen und erstellen aus. Überprüfen Sie die von Ihnen ausgewählten Werte, und wählen Sie dann Erstellen aus.

Wichtig

Wenn Sie einen vorhandenen AKS-Cluster verwenden, kann die Richtlinienzuweisung etwa 15 Minuten dauern.

Testen von Ressourcenanforderungen

Im letzten Schritt testen Sie nun die neue Richtlinie. Stellen Sie Ihren Test-Workload mit Ressourcenanforderungen und Grenzwerten bereit, die gegen die neue Richtlinie verstoßen. Wenn alles richtig abläuft, gibt der Server einen Fehler zurück, der angibt, dass die Richtlinie dies verweigert.

  1. Öffnen Sie Azure Cloud Shell, und stellen Sie sicher, dass Sie die Bash-Version von Cloud Shell auswählen.

  2. Erstellen Sie mithilfe des integrierten Editors eine Manifestdatei für die Kubernetes-Bereitstellung. Nennen Sie die Datei test-policy.yaml:

    code test-policy.yaml
    

    Tipp

    Cloud Shell enthält einen integrierten Datei-Editor. Der Cloud Shell-Editor unterstützt Features wie die Sprachhervorhebung, die Befehlspalette und einen Datei-Explorer. Starten Sie den Editor für die einfache Dateierstellung und -bearbeitung, indem Sie code . im Cloud Shell-Terminal ausführen. Mit dieser Aktion wird der Editor mit dem aktiven Arbeitsverzeichnis geöffnet, das im Terminal festgelegt ist. Führen Sie code test-policy.yaml aus, um Ihre Manifestdatei direkt für die schnelle Bearbeitung zu öffnen. Mit diesem Befehl wird der Editor ohne den Datei-Explorer geöffnet.

  3. Fügen Sie den folgenden Text in die Datei ein:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Drücken Sie STRG+S, um die Datei zu speichern, und anschließend STRG+Q, um den Editor zu schließen.

  5. Führen Sie den Befehl kubectl apply aus, um die Konfiguration anzuwenden und die Anwendung im costsavings-Namespace bereitzustellen:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Die Ausgabe sollte wie im Folgenden aussehen:

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    Wie Sie sehen, hat der Zulassungswebhook validation.gatekeeper.sh die Anforderung zum Planen des Pods abgelehnt.

  6. Öffnen Sie die Manifestdatei, und korrigieren Sie die Ressourcenanforderung:

    code test-policy.yaml
    

    Ersetzen Sie den Text durch den folgenden Text:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Drücken Sie STRG+S, um die Datei zu speichern, und anschließend STRG+Q, um den Editor zu schließen.

  8. Führen Sie den Befehl kubectl apply aus, um die Konfiguration anzuwenden und die Anwendung im costsavings-Namespace bereitzustellen:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Sie erhalten die folgende Ausgabe:

    pod/nginx created
    
  9. Rufen Sie die Pods der neu erstellten Pods in Ihrem costsavings-Namensraum ab.

    kubectl get pods --namespace costsavings
    

    Nach wenigen Sekunden gehen die Pods in den Status Running über.

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Drücken Sie STRG+C, um die Überwachung zu beenden, sobald die Pods ausgeführt werden.