Übung: Zuweisen einer Richtlinie zu einem Azure Kubernetes Services-Cluster
Jetzt können Sie Azure-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 nur vertrauenswürdiger Registrierungen erzwingt. Anschließend stellen Sie einen anderen nicht kompatiblen Pod bereit, um die Auswirkung der Richtlinie anzuzeigen. Sie lernen die Schritte zum Beheben von Problemen kennen und verstehen, 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 wir ein Image direkt vom Docker Hub in den Cluster bereit. Der erste Schritt besteht darin, sich beim Cluster anzumelden.
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 und die Bereitstellung freizugeben.
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
Listet alle bereitgestellten Dienste auf.
kubectl get services
Kopieren Sie die externe IP des simple-nginx-Diensts , und fügen Sie ihn in Ihren Browser ein, um festzustellen, ob der Dienst wie erwartet ausgeführt wird.
Wenn die externe IP als
<pending>
aufgeführt ist, führen Sie den Befehl erneut aus. Es dauert Zeit, um eine öffentliche IP-Adresse für Ihre Workload zuzuweisen.
Anwenden von Azure-Richtlinien auf den AKS-Cluster
Sie haben Ihre Workload erfolgreich in einem Cluster bereitgestellt, für den keine Richtlinienerzwingung vorhanden ist. Jetzt können Sie dem Cluster eine Richtlinie hinzufügen und sehen, wie sich dies darauf auswirkt.
Zuweisen einer Richtlinie
Sie möchten sicherstellen, dass nur Bilder aus bestimmten Registern im Cluster zulässig sind. Sie müssen eine neue Richtliniendefinition erstellen und dann einem Bereich zuweisen. In diesem Fall ist der Geltungsbereich unsere Videogamerg-Ressourcengruppe. Richtlinien können über das Azure-Portal, Azure PowerShell oder 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 Bilder" an.
Wechseln Sie zur Seite "Richtlinie" im Azure-Portal.
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 "Kubernetes-Clustercontainer sollten nur zulässige 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 Regex-Feld "Zulässiges Containerimage " ein, und wählen Sie die Schaltfläche " Überprüfen + Erstellen " aus.
.+\.azurecr\.io/.+$
- Wählen Sie die Schaltfläche "Erstellen " aus.
Nachdem die neue Richtlinie aktiviert ist, können Sie "Aufgaben " 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 bilder, die in der Azure-Containerregistrierung gehostet werden, 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-Richtlinieninitiative ist eine Sammlung von Azure-Richtliniendefinitionen oder -regeln, die zu einem bestimmten Ziel oder Zweck gruppiert sind. Azure-Initiativen vereinfachen die Verwaltung Ihrer Richtlinien, indem sie eine Reihe von Richtlinien logisch als einzelnes Element gruppieren.
Initiativen können auf die gleiche Weise zugewiesen werden, 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.
- Kehren Sie zur Seite "Richtlinie " im Azure-Portal zurück.
- Wählen Sie im linken Bereich der Azure-Richtlinienseite "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 etwas Zeit, um die verschiedenen Richtlinien zu überprüfen, die Teil der Initiative sind.
- Wählen Sie in der oberen linken Ecke des Bildschirms die Schaltfläche " Zuweisen " aus.
- Legen Sie den Geltungsbereich auf die Ressourcengruppe des erstellten Kubernetes-Clusters fest, die in diesem Fall die Videogamerg ist. 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 " aus.
Hier finden Sie die Richtlinienzuweisung erneut, indem Sie auf "Richtlinie " klicken und "Aufgaben" auswählen. Wenn Sie auf die von Ihnen erstellte Richtlinienzuweisung klicken, wird angezeigt, dass der Effekt in diesem Fall auf "Überwachen" festgelegt ist.
Testen der Azure-Richtlinie
Nachdem die Einschränkungsrichtlinie dem Cluster zugewiesen ist, können Sie einen Test ausführen, um festzustellen, ob die Richtlinie funktioniert. Um zu veranschaulichen, erstellen wir eine neue Bereitstellung und sehen, ob die Bereitstellung funktioniert. Zunächst erstellen wir eine neue Kubernetes-Manifestdatei und stellen sie bereit.
Von Bedeutung
Beachten Sie, dass es bis zu 30 Minuten dauern kann, bis die Richtlinienzuweisungen wirksam werden. Aufgrund dieser Verzögerung kann die Richtlinienüberprüfung in den folgenden Schritten erfolgreich sein, und die Bereitstellung schlägt nicht fehl. 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 hier dargestellt aussehen. Wenn in der Liste angezeigt wird k8sazurecontainerallowedimages
, wissen Sie, dass Ihre Richtlinie wirksam 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 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 von Ihnen erstellte Richtlinie hat die Bereitstellung 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 EXTERNAL-IP in einem Browser zu öffnen, erhalten Sie keine Antwort, was weiter 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 wir die Befehlszeile, um zu diagnostizieren, warum.
Zunächst beschreiben wir 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 wird das fehlgeschlagene ReplicaSet beschrieben. Kopieren Sie den Namen des ReplicaSets, das mit
second-simple-nginx
beginnt. Ersetzen 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 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 Bilder vom Docker-Hub in Ihrem Cluster basierend auf Ihrer Richtlinie erstellt werden. Versuchen wir, die gleiche Workload mithilfe eines Images aus der Azure Container Registry (ACR) erneut bereitzustellen. In diesem Abschnitt erstellen Sie eine Azure-Containerregistrierung. Anschließend kopieren Sie das nginx-Image vom Docker-Hub in die neue Registrierung und versuchen, den Pod aus Ihrer Containerregistrierung erneut bereitzustellen. Wir verwenden Azure CLI, um die Containerregistrierung zu erstellen.
Wechseln Sie zurück zur Cloud Shell im Azure-Portal, 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 von 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 Bild importiert wurde. nginx sollte in der Liste der Ergebnisse angezeigt werden.
az acr repository list --name $ACR_NAME
Verknüpfen Sie Ihren AKS-Cluster mit der von Ihnen erstellten Containerregistrierung.
az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
Erstellen Sie nun die Bereitstellung mithilfe der 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 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 gesehen, wie Sie Richtlinien verwenden, um sicherzustellen, dass Ihr Cluster nur die Bereitstellung von Images aus der Azure-Containerregistrierung zulässt. Sie haben auch gesehen, wie Sie eine der integrierten Initiativen hinzufügen, die Ihnen helfen können, Ihren Cluster auf einfache Weise zu steuern 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.