Übung: Zuweisen einer Richtlinie zu einem Azure Kubernetes Services-Cluster
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.
Melden Sie sich in Cloud Shell beim AKS-Cluster an.
az aks get-credentials -n videogamecluster -g videogamerg
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
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
Auflisten aller bereitgestellten Dienste.
kubectl get services
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.
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.
Wechseln Sie im Azure-Portal zur Seite Richtlinie.
Wählen Sie im linken Bereich der Seite „Azure Policy“ die Option Definitionen aus.
Verwenden Sie im Dropdown-Listenfeld Kategorie die Option Alle auswählen, um den Filter zu löschen, und wählen Sie dann Kubernetes aus.
Wählen Sie die Richtliniendefinition Container in einem Kubernetes-Cluster dürfen nur zugelassene Images verwenden aus.
Wählen Sie die Schaltfläche Zuweisen aus.
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.
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/.+$
- 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.
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.
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.
- Wechseln Sie im Azure-Portal zurück zur Seite Richtlinie.
- Wählen Sie im linken Bereich der Seite „Azure Policy“ die Option Definitionen aus.
- Verwenden Sie im Dropdown-Listenfeld Kategorie die Option Alle auswählen, um den Filter zu löschen, und wählen Sie dann Kubernetes aus.
- 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.
- Klicken Sie oben links auf dem Bildschirm auf die Schaltfläche Zuweisen.
- 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.
- 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
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
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
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.
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
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>
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.
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
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
Überprüfen Sie, ob das Image importiert wurde. In der Ergebnisliste sollte nginx angezeigt werden.
az acr repository list --name $ACR_NAME
Verknüpfen Sie Ihren AKS-Cluster mit der erstellten Containerregistrierung.
az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
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
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
Kopieren Sie die externe IP-Adresse, und fügen Sie sie in den Browser ein. Sie sehen, dass die Seite jetzt geladen wird.
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.