Übung: Zuweisen einer Richtlinie zu einem AKS-Cluster

Abgeschlossen

Sie können jetzt Azure Policy-Richtlinien und -Initiativen für Ihren AKS-Cluster konfigurieren.

In dieser Lerneinheit stellen Sie einen nicht konformen Pod bereit, wenden eine Azure Policy-Richtline an, die nur die Verwendung vertrauenswürdiger Registrierungen erzwingt, und stellen dann einen anderen nicht konformen Pod bereit, um die Auswirkungen der Richtlinie zu ermitteln. Außerdem lernen Sie die Schritte zur Problembehandlung kennen, um herauszufinden, warum die Pods nicht erstellt werden. Darüber hinaus stellen Sie die Initiative Eingeschränkte Sicherheitsstandards für Kubernetes-Clusterpods bei Linux-basierten Workloads bereit.

Hinweis

Diese Übung ist optional. Wenn Sie die Schritte in dieser Übung ausführen möchten, müssen Sie zuvor ein Azure-Abonnement erstellen. Wenn Sie kein Azure-Konto besitzen oder gerade kein Konto erstellen möchten, können Sie die Anweisungen durchlesen und die dargelegten Informationen nachvollziehen.

Bereitstellen eines nicht konformen Pods im Cluster

Zunächst stellen Sie ein Image direkt aus Docker Hub im Cluster bereit. Der erste Schritt besteht in der Anmeldung beim Cluster.

  1. Melden Sie sich in Cloud Shell beim AKS-Cluster an.

    az aks get-credentials -n videogamecluster -g videogamerg 
    
  2. Führen Sie den folgenden Code aus, um einen einfachen nginx-Pod aus Docker Hub zu erstellen.

     cat <<EOF | kubectl apply -f -
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: simple-nginx
       labels:
         app: nginx
     spec:
       selector:
         matchLabels:
           app: nginx
       template:
         metadata:
           labels:
             app: nginx
         spec:
           containers:
           - name: simple-nginx
             image: docker.io/library/nginx:stable
             resources:
               requests:
                 cpu: 100m
                 memory: 100Mi
               limits:
                 cpu: 120m
                 memory: 120Mi
             ports:
             - containerPort: 80
    EOF
    
  3. Führen Sie den folgenden Code aus, um den Dienst bereitzustellen, mit dem die Bereitstellung verfügbar gemacht wird.

    cat <<EOF | kubectl create -f -
     apiVersion: v1
     kind: Service
     metadata:
       name: simple-nginx
       labels:
         app: nginx
     spec:
       type: LoadBalancer
       ports:
       - port: 80
       selector:
         app: nginx
    EOF
    
  4. Auflisten aller bereitgestellten Dienste

    kubectl get services
    
  5. Kopieren Sie die externe IP-Adresse (EXTERNAL-IP) des Diensts simple-nginx, und fügen Sie sie in Ihren Browser ein, um festzustellen, ob der Dienst wie erwartet ausgeführt wird.

    Wenn die externe IP-Adresse als <pending> aufgeführt ist, können Sie den Befehl erneut ausführen. Es dauert eine gewisse Zeit, eine öffentliche IP-Adresse für Ihre Workload zuzuordnen.

    A screenshot showing nginx running, which came from Docker Hub.

Anwenden einer Azure Policy-Richtlinie auf den AKS-Cluster

Sie haben Ihre Workload erfolgreich in einem Cluster bereitgestellt, für den keine Richtlinienerzwingung vorhanden ist. Nun fügen Sie dem Cluster eine Richtlinie hinzu und untersuchen, wie sie sich darauf auswirkt.

Zuweisen einer Richtlinie

Sie müssen sicherstellen, dass nur Images aus bestimmten Registrierungen im Cluster zulässig sind. Sie müssen eine neue Richtliniendefinition erstellen und sie dann einem Bereich zuweisen. In diesem Fall entspricht der Bereich der Ressourcengruppe videogamerg. Richtlinien können über das Azure-Portal, Azure PowerShell oder die Azure CLI erstellt und zugewiesen werden. Im Rahmen dieser Übung erstellen Sie eine Richtlinie im Portal.

Führen Sie die folgenden Schritte aus, um die integrierten Richtliniendefinitionen für die Verwaltung Ihres Clusters über das Azure-Portal zu finden. In diesem Fall wenden Sie die Richtlinie „Only allowed images“ (Nur zulässige Images) an.

  1. Wechseln Sie im Azure-Portal zur Seite Richtlinie.

  2. Wählen Sie im linken Bereich der Seite „Azure Policy“ die Option Definitionen aus.

  3. Verwenden Sie im Dropdown-Listenfeld Kategorie die Option Alle auswählen, um den Filter zu löschen, und wählen Sie dann Kubernetes aus.

    Screenshot showing kubernetes selected for category.

  4. Wählen Sie die Richtliniendefinition Container in einem Kubernetes-Cluster dürfen nur zugelassene Images verwenden aus.

  5. Klicken Sie auf die Schaltfläche Zuweisen.

  6. Legen Sie den Bereich auf die Ressourcengruppe des Kubernetes-Clusters fest, den Sie erstellt haben. In diesem Fall handelt es sich dabei um die Ressourcengruppe videogamerg.

    Screenshot showing policy assignment view.

  7. Geben Sie Folgendes in das Feld Allowed container image regex (Zulässiger regulärer Ausdruck für Containerimage) ein, und klicken Sie auf die Schaltfläche Überprüfen + erstellen.

.+\.azurecr\.io/.+$
  1. Klicken Sie auf die Schaltfläche Erstellen.

Nachdem die neue Richtlinie aktiviert wurde, können Sie auf Zuweisungen klicken, um die zugewiesene Richtlinie anzuzeigen und die von Ihnen erstellte Richtlinienzuweisung auszuwählen.

screenshot showing Policy assigned.

Ihre Richtlinienzuweisung sollte wie in der folgenden Abbildung aussehen. Der Effekt ist standardmäßig auf „deny“ (Verweigern) festgelegt. Dies bedeutet, dass nur in Azure Container Registry gehostete Images im Cluster bereitgestellt werden können.

screenshot showing details of Policy assignment.

Zuweisen einer Richtlinieninitiative

Nachdem Sie Ihre Richtlinie erfolgreich zugewiesen haben, weisen Sie nun eine Initiative zu, bevor Sie die Richtlinien testen. Eine Azure Policy ist eine Sammlung mit Azure-Richtliniendefinitionen oder -Regeln, die gruppiert werden, um ein bestimmtes Ziel zu erreichen bzw. einen bestimmten Zweck zu erfüllen. Azure-Initiativen vereinfachen die Verwaltung Ihrer Richtlinien, indem Richtlinien logisch unter einem einzelnen Element gruppiert werden.

Initiativen können auf die gleiche Weise wie Richtlinien zugewiesen werden. Führen Sie die folgenden Schritte aus, um die Initiative Eingeschränkte Sicherheitsstandards für Kubernetes-Clusterpods bei Linux-basierten Workloads zuzuweisen.

  1. Wechseln Sie im Azure-Portal zurück zur Seite Richtlinie.
  2. Wählen Sie im linken Bereich der Seite „Azure Policy“ die Option Definitionen aus.
  3. Verwenden Sie im Dropdown-Listenfeld Kategorie die Option Alle auswählen, um den Filter zu löschen, und wählen Sie dann Kubernetes aus.
  4. Wählen Sie die Initiativendefinition Eingeschränkte Sicherheitsstandards für Kubernetes-Clusterpods bei Linux-basierten Workloads aus. Nehmen Sie sich Zeit, um die verschiedenen Richtlinien zu überprüfen, die Teil der Initiative sind.
  5. Klicken Sie oben links auf dem Bildschirm auf die Schaltfläche Zuweisen.
  6. Legen Sie den Bereich auf die Ressourcengruppe des Kubernetes-Clusters fest, den Sie erstellt haben (in diesem Fall videogamerg). Füllen Sie den Rest des Formulars wie im vorherigen Schritt aus, und klicken Sie auf Überprüfen + erstellen.
  7. Klicken Sie auf die Schaltfläche Erstellen .

Hier finden Sie die Richtlinienzuweisung erneut, indem Sie auf Richtlinie klicken und auf dem linken Blatt Zuweisungen auswählen. Wenn Sie auf die von Ihnen erstellte Richtlinienzuweisung klicken, wird angezeigt, dass die Auswirkung in diesem Fall auf „Audit“ (Überwachung) festgelegt wurde.

Testen der Azure Policy-Richtlinie

Nachdem Sie dem Cluster die einschränkende Richtlinie zugewiesen haben, führen Sie nun einen Test aus, um festzustellen, ob die Richtlinie funktioniert. Um dies zu ermitteln, erstellen Sie eine neue Bereitstellung und prüfen, ob die Bereitstellung funktioniert. Zunächst erstellen Sie eine neue Kubernetes-Manifestdatei und stellen sie bereit.

Wichtig

Beachten Sie, dass es bis zu 30 Minuten dauern kann, bis die Richtlinienzuweisungen wirksam werden. Aufgrund dieser Verzögerung kann in den folgenden Schritten die Richtlinienüberprüfung erfolgreich sein, und bei der Bereitstellung tritt kein Fehler auf. Warten Sie in diesem Fall noch etwas, und wiederholen Sie dann die Bereitstellung.

Sie können überprüfen, ob die Richtlinienzuweisung wirksam wurde, indem Sie den folgenden Befehl ausführen:

kubectl get ConstraintTemplates

Es sollte ein Ergebnis ähnlich der folgenden Ausgabe angezeigt werden. Wenn k8sazurecontainerallowedimages in der Liste angezeigt wird, wissen Sie, dass Ihre Richtlinie erfolgreich angewendet wurde.

k8sazureallowedcapabilities              40m
k8sazureallowedseccomp                   20m
k8sazureallowedusersgroups               40m
k8sazureblockautomounttoken              40m
k8sazureblockdefault                     40m
k8sazureblockhostnamespace               40m
k8sazurecontainerallowedimages           40m
k8sazurecontainerallowedports            40m
k8sazurecontainerlimits                  40m
k8sazurecontainernoprivilege             40m
k8sazurecontainernoprivilegeescalation   40m
k8sazuredefenderblockvulnerableimages    40m
k8sazuredisallowedcapabilities           40m
k8sazureenforceapparmor                  40m
k8sazurehostfilesystem                   40m
k8sazurehostnetworkingports              40m
k8sazureingresshttpsonly                 40m
k8sazurereadonlyrootfilesystem           40m
k8sazureserviceallowedports              40m
k8sazurevolumetypes                      20m
  1. Erstellen Sie eine weitere nginx-Bereitstellung und einen weiteren Dienst mithilfe des folgenden Codes:

    cat <<EOF | kubectl create -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: second-simple-nginx
      labels:
        app: second-nginx
    spec:
      selector:
        matchLabels:
          app: second-nginx
      template:
        metadata:
          labels:
            app: second-nginx
        spec:
          containers:
          - name: second-simple-nginx
            image: docker.io/library/nginx:stable
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
              limits:
                cpu: 120m
                memory: 120Mi
            ports:
            - containerPort: 80
    EOF
    
  2. Erstellen des Diensts

    cat <<EOF | kubectl create -f -
     apiVersion: v1
     kind: Service
     metadata:
       name: second-simple-nginx
       labels:
         app: second-nginx
     spec:
       type: LoadBalancer
       ports:
       - port: 80
       selector:
         app: second-nginx
    EOF
    
  3. Nun können Sie überprüfen, ob der Pod erstellt wurde.

    kubectl get pods
    

In der folgenden Ausgabe wurde der Pod nicht erstellt, obwohl die Bereitstellung anscheinend erstellt wurde. Die Bereitstellung wurde durch die von Ihnen erstellte Richtlinie blockiert. Der Pod, der vor der Zuweisung der Richtlinie erstellt wurde, wurde jedoch nicht beendet. Die Richtlinie hat auch nicht verhindert, dass der Dienst erstellt wird. Wenn Sie versuchen, die externe IP-Adresse (EXTERNAL-IP) in einem Browser zu öffnen, erhalten Sie keine Antwort, was ebenfalls zeigt, dass die Bereitstellung nicht erfolgreich war.

NAME                            READY   STATUS    RESTARTS   AGE
simple-nginx-66d884c498-msbpc   1/1     Running   0          63m

Diagnostizieren, warum der Pod nicht bereitgestellt wurde

Im vorherigen Abschnitt haben Sie festgestellt, dass der zweite Pod nicht bereitgestellt wurde. In diesem Abschnitt verwenden Sie die Befehlszeile, um die Ursache zu diagnostizieren.

  1. Zunächst beschreiben Sie die Bereitstellung. Sie sehen, dass das ReplicaSet erstellt wurde, aber die Replikate konnten nicht erstellt werden.

    kubectl get replicasets
    

    Sie erhalten eine Ausgabe ähnlich der folgenden:

    NAME                             DESIRED   CURRENT   READY   AGE
    second-simple-nginx-64969b4566   1         0         0       8m45s
    simple-nginx-66d884c498          1         1         1       72m
    
  2. Als Nächstes beschreiben Sie das fehlerhafte ReplicaSet. Kopieren Sie den Namen des ReplicaSet, das mit „second-simple-nginx“ beginnt, aktualisieren Sie den folgenden Befehl mit diesem Wert, und führen Sie den Befehl aus.

    kubectl describe replicaset <ReplicaSet name>
    
  3. Die Ausgabe des Befehls zeigt, dass bei den Replikaten aufgrund der Richtlinie ein Fehler aufgetreten ist.

    Warning  FailedCreate  3m9s (x18 over 14m)  replicaset-controller  Error creating: admission webhook "validation.gatekeeper.sh" denied the request: [azurepolicy-container-allowed-images-bcfbd5e1e78f7c8b4104] Container image docker.io/library/nginx:stable for container second-simple-nginx has not been allowed.
    

Löschen Sie die Bereitstellung, um sich auf den nächsten Schritt vorzubereiten.

kubectl delete deployment second-simple-nginx

Erneutes Bereitstellen der Pods mithilfe eines Azure Container Registry-Images

Nachdem Sie nun wissen, dass die Richtlinie verhindert, dass Images aus Docker Hub basierend auf Ihrer Richtlinie in Ihrem Cluster erstellt werden, können Sie versuchen, dieselbe Workload mithilfe eines Images aus ACR erneut bereitzustellen. In diesem Abschnitt erstellen Sie eine Azure Container Registry-Instanz, kopieren das nginx-Image aus Docker Hub in die neue Registrierung und versuchen, den Pod erneut in Ihrer Containerregistrierung bereitzustellen. Sie verwenden die Azure CLI, um die Containerregistrierung zu erstellen.

  1. Navigieren Sie im Azure-Portal zurück zu Cloud Shell, und geben Sie die folgenden Befehle ein, um eine neue Containerregistrierung zu erstellen.

    ACR_NAME=videogameacr$RANDOM
    az acr create --name $ACR_NAME \
                  --resource-group videogamerg \
                  --sku Premium
    
  2. Importieren Sie das Image aus Docker Hub in Ihre neue Containerregistrierung.

    az acr import --name $ACR_NAME --source docker.io/library/nginx:stable --image nginx:v1
    
  3. Überprüfen Sie, ob das Image importiert wurde. In der Ergebnisliste sollte nginx angezeigt werden.

    az acr repository list --name $ACR_NAME
    
  4. Verknüpfen Sie Ihren AKS-Cluster mit der soeben erstellten Containerregistrierung.

    az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
    
  5. Erstellen Sie die Bereitstellung jetzt mit Ihrer neu erstellten Containerregistrierung neu, indem Sie den folgenden Befehl ausführen:

     cat <<EOF | kubectl apply -f -
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: second-simple-nginx
       labels:
         app: second-nginx
     spec:
       selector:
         matchLabels:
           app: second-nginx
       template:
         metadata:
           labels:
             app: second-nginx
         spec:
           containers:
           - name: second-simple-nginx
             image: ${ACR_NAME}.azurecr.io/nginx:v1
             resources:
               requests:
                 cpu: 100m
                 memory: 100Mi
               limits:
                 cpu: 120m
                 memory: 120Mi
             ports:
             - containerPort: 80
    EOF
    
  6. Rufen Sie die externe IP-Adresse (EXTERNAL-IP) ab, damit Sie testen können, ob der Dienst im Cluster ausgeführt wird.

    kubectl get pods
    kubectl get services
    

    screenshot showing that the pods got deployed this time.

    Kopieren Sie die externe IP-Adresse, und fügen Sie sie in den Browser ein. Sie werden sehen, dass die Seite jetzt geladen wird.

    sScreenshot showing that the pod was now successfully deployed on the web browser.

Verwenden von Richtlinien zum Durchsetzen von Standards

Sie haben erfahren, wie Sie Richtlinien verwenden können, um sicherzustellen, dass Ihr Cluster nur die Bereitstellung von Images aus Azure Container Registry zulässt. Außerdem haben Sie gelernt, wie Sie eine der integrierten Initiativen hinzufügen, die Ihnen helfen können, Ihren Cluster einfach zu verwalten und sicherer zu machen. Sie haben jedoch gesehen, dass der Pod, der vor der Zuweisung der Richtlinie bereitgestellt wurde, weiterhin ausgeführt wird. In der nächsten Lerneinheit erfahren Sie, wie Sie die Konformität von Pods überprüfen können, die im Cluster ausgeführt werden.