Übung: Zuweisen einer Richtlinie zu einem Azure Kubernetes Services-Cluster

Abgeschlossen

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

In dieser Einheit stellen Sie einen nicht kompatiblen Pod bereit und wenden eine Azure-Richtlinie an, die die Verwendung von ausschließlich vertrauenswürdigen Registrierungen erzwingt. Anschließend stellen Sie einen anderen nicht kompatiblen Pod bereit, um die Auswirkung der Richtlinie anzuzeigen. Sie lernen die Schritte zur Problembehandlung kennen und sehen, 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. Im ersten Schritt melden Sie sich beim Cluster an.

  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 simple-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.

    Screenshot mit laufendem NGINX-Server, der aus Docker Hub stammt

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 können Sie dem Cluster eine Richtlinie hinzufügen und untersuchen, wie sie sich darauf auswirkt.

Zuweisen einer Richtlinie

Sie können sicherstellen, dass nur Images aus bestimmten Registrierungen im Cluster zulässig sind. Sie müssen eine neue Richtliniendefinition erstellen und dann einem Bereich zuweisen. In diesem Fall ist der Bereich unsere videogamerg-Ressourcengruppe. 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 „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: Kubernetes für die Kategorie ausgewählt

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

  5. Wählen Sie die Schaltfläche Zuweisen aus.

  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 mit der Ansicht der Richtlinienzuweisung

  7. Geben Sie Folgendes in das Feld Zulässiger regulärer Ausdruck für Containerimage ein, und wählen Sie die Schaltfläche Überprüfen + erstellen aus.

.+\.azurecr\.io/.+$
  1. Wählen Sie die Schaltfläche Erstellen.

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

Screenshot mit der zugewiesenen Richtlinie

Ihre Richtlinienzuweisung sollte wie auf dem folgenden Bild 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 mit den Details der Richtlinienzuweisung

Zuweisen einer Richtlinieninitiative

Nachdem Sie Ihre Richtlinie erfolgreich zugewiesen haben, weisen Sie 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 diese 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 wählen Sie Überprüfen + erstellen aus.
  7. Wählen Sie die Schaltfläche Erstellen.

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

Testen der Azure Policy-Richtlinie

Nachdem dem Cluster die einschränkende Richtlinie jetzt zugewiesen ist, können Sie nun einen Test ausführen, 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 ist, indem Sie den folgenden Befehl ausführen.

kubectl get ConstraintTemplates

Das Ergebnis sollte in etwa wie in der folgenden Ausgabe aussehen: Wenn k8sazurecontainerallowedimages in der Liste angezeigt wird, wissen Sie, dass Ihre Richtlinie in Kraft ist.

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 wird der Pod nicht erstellt, auch wenn die Bereitstellung scheinbar 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 wir 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 sollten eine Ausgabe ähnlich dem folgenden Beispiel erhalten:

    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, der 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 Folgendes versuchen: dieselbe Workload mithilfe eines Images aus Azure Container Registry (ACR) erneut bereitstellen. In diesem Abschnitt erstellen Sie eine Azure Container Registry. Dann kopieren Sie das nginx-Image aus Docker Hub in die neue Registrierung und versuchen, den Pod erneut aus 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 erstellten Containerregistrierung.

    az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
    
  5. Erstellen Sie die Bereitstellung jetzt mit Ihrer neu erstellten Containerregistrierung, 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 mit den Pods, die dieses Mal bereitgestellt wurden

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

    Screenshot, der zeigt, dass der Pods erfolgreich im Webbrowser bereitgestellt wurde

Verwenden von Richtlinien zum Durchsetzen von Standards

In dieser Lektion haben Sie 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.