Ćwiczenie — przypisywanie zasad do klastra usług Azure Kubernetes Services

Ukończone

Teraz możesz skonfigurować zasady i inicjatywy platformy Azure dla klastra usługi Azure Kubernetes Service (AKS).

W tej lekcji wdrożysz niezgodny zasobnik i zastosujesz usługę Azure Policy, która wymusza korzystanie tylko z zaufanych rejestrów. Następnie wdrożysz inny niezgodny zasobnik, aby zobaczyć efekt zasad. Poznasz kroki rozwiązywania problemów i dowiesz się, dlaczego zasobniki nie są tworzone. Wdrażasz również standardy z ograniczeniami zabezpieczeń zasobników klastra Kubernetes dla inicjatywy obciążeń opartych na systemie Linux.

Uwaga

To ćwiczenie jest opcjonalne. Jeśli chcesz wykonać to ćwiczenie, przed rozpoczęciem musisz utworzyć subskrypcję platformy Azure. Jeśli nie masz konta platformy Azure lub nie chcesz go tworzyć w tej chwili, możesz zapoznać się z instrukcjami, aby zrozumieć prezentowane informacje.

Wdrażanie niezgodnego zasobnika w klastrze

Zaczynamy od wdrożenia obrazu bezpośrednio z usługi Docker Hub w klastrze. Pierwszym krokiem jest zalogowanie się do klastra.

  1. W usłudze Cloud Shell zaloguj się do klastra usługi AKS.

    az aks get-credentials -n videogamecluster -g videogamerg 
    
  2. Uruchom następujący kod, aby utworzyć prosty zasobnik nginx z usługi Docker Hub.

     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. Uruchom następujący kod, aby wdrożyć usługę w celu uwidocznienia wdrożenia.

    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. Wyświetl listę wszystkich wdrożonych usług.

    kubectl get services
    
  5. Skopiuj zewnętrzny adres IP usługi simple-nginx i wklej go w przeglądarce, aby sprawdzić, czy usługa działa zgodnie z oczekiwaniami.

    Jeśli zewnętrzny adres IP jest wymieniony jako <pending>, uruchom ponownie polecenie. Przydzielanie publicznego adresu IP dla obciążenia zajmuje trochę czasu.

    Zrzut ekranu przedstawiający uruchomioną aplikację nginx, która pochodzi z usługi Docker Hub.

Stosowanie usługi Azure Policy do klastra usługi AKS

Obciążenie zostało pomyślnie wdrożone w klastrze, który nie ma na nim żadnych wymuszania zasad. Teraz możesz dodać zasady do klastra i zobaczyć, jak to wpływa.

Przypisywanie zasad

Chcesz mieć pewność, że w klastrze są dozwolone tylko obrazy z określonych rejestrów. Musisz utworzyć nową definicję zasad, a następnie przypisać ją do zakresu. W tym przypadku zakresem jest nasza grupa zasobów videogamerg . Zasady można tworzyć i przypisywać za pośrednictwem witryny Azure Portal, programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure. To ćwiczenie przeprowadzi Cię przez proces tworzenia zasad w portalu.

Znajdź wbudowane definicje zasad do zarządzania klastrem przy użyciu witryny Azure Portal, wykonując następujące kroki. W takim przypadku stosujesz zasady "tylko dozwolone obrazy".

  1. Przejdź do strony Zasady w witrynie Azure Portal.

  2. W okienku po lewej stronie usługi Azure Policy wybierz pozycję Definicje.

  3. Z listy rozwijanej Kategoria użyj pozycji Wybierz wszystko , aby wyczyścić filtr, a następnie wybierz pozycję Kubernetes.

    Zrzut ekranu przedstawiający platformę kubernetes wybraną dla kategorii.

  4. Wybierz kontenery klastra Kubernetes powinny używać tylko dozwolonej definicji zasad obrazów.

  5. Wybierz przycisk Przypisz.

  6. Ustaw zakres na grupę zasobów utworzonego klastra Kubernetes, czyli grupę zasobów videogamerg.

    Zrzut ekranu przedstawiający widok przypisania zasad.

  7. Wprowadź następujące informacje w polu Dozwolony rejestr obrazu kontenera i wybierz przycisk Przejrzyj i utwórz

.+\.azurecr\.io/.+$
  1. Zaznacz przycisk Utwórz.

Teraz, gdy nowe zasady są włączone, możesz wybrać pozycję Przypisania , aby wyświetlić przypisane zasady i wybrać utworzone przypisanie zasad.

Zrzut ekranu przedstawiający przypisane zasady.

Przypisanie zasad powinno wyglądać podobnie jak na poniższej ilustracji. Efekt jest domyślnie ustawiony na odmowę. Oznacza to, że w klastrze można wdrażać tylko obrazy hostowane w usłudze Azure Container Registry.

zrzut ekranu przedstawiający szczegóły przypisania zasad.

Przypisywanie inicjatywy zasad

Po pomyślnym przypisaniu zasad należy przypisać inicjatywę przed przetestowaniem zasad. Inicjatywa usługi Azure Policy to kolekcja definicji lub reguł usługi Azure Policy, które są grupowane razem w celu osiągnięcia określonego celu lub celu. Inicjatywy platformy Azure upraszczają zarządzanie zasadami, grupując zestaw zasad logicznie jako pojedynczy element.

Inicjatywy można przypisywać w taki sam sposób, w jaki są przypisywane zasady. Wykonaj następujące kroki, aby przypisać inicjatywę "Standardy z ograniczeniami zabezpieczeń zasobników klastra Kubernetes dla obciążeń opartych na systemie Linux".

  1. Wróć do strony Zasady w witrynie Azure Portal.
  2. W okienku po lewej stronie usługi Azure Policy wybierz pozycję Definicje.
  3. Z listy rozwijanej Kategoria użyj pozycji Wybierz wszystko , aby wyczyścić filtr, a następnie wybierz pozycję Kubernetes.
  4. Wybierz definicję inicjatywy inicjatywy Zasobniki klastra Kubernetes z ograniczeniami zabezpieczeń dla obciążeń opartych na systemie Linux. Pośmiń trochę czasu, aby przejrzeć różne zasady, które są częścią inicjatywy.
  5. Wybierz przycisk Przypisz w lewym górnym rogu ekranu.
  6. Ustaw zakres na grupę zasobów utworzonego klastra Kubernetes, co w tym przypadku jest videogamerg. Wypełnij pozostałą część formularza, tak jak w poprzednim kroku, a następnie wybierz pozycję Przejrzyj i utwórz.
  7. Zaznacz przycisk Utwórz.

Tutaj możesz ponownie znaleźć przypisanie zasad, klikając pozycję Zasady i wybierając pozycję Przypisania. Kliknięcie utworzonego przypisania zasad pokazuje, że efekt jest ustawiony na Wartość Inspekcja w tym przypadku.

Testowanie usługi Azure Policy

Po przypisaniu zasad ograniczania do klastra możesz uruchomić test, aby sprawdzić, czy zasady działają. Aby zademonstrować, utwórzmy nowe wdrożenie i sprawdźmy, czy wdrożenie działa. Zaczynamy od utworzenia nowego pliku manifestu kubernetes i wdrożenia go.

Ważne

Należy pamiętać, że zastosowanie przypisań zasad może potrwać do 30 minut. Z powodu tego opóźnienia w poniższych krokach weryfikacja zasad może zakończyć się pomyślnie, a wdrożenie nie zakończy się niepowodzeniem. W takim przypadku należy poczekać, a następnie ponowić próbę wdrożenia.

Możesz sprawdzić, czy przypisanie zasad działa, uruchamiając następujące polecenie.

kubectl get ConstraintTemplates

Powinien zostać wyświetlony wynik podobny do poniższych danych wyjściowych. Jeśli widzisz k8sazurecontainerallowedimages na liście, wiesz, że zasady obowiązują.

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. Utwórz kolejne nginx wdrożenie i usługę przy użyciu następującego kodu.

    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. Tworzenie usługi

    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. Teraz możemy sprawdzić, czy zasobnik został utworzony.

    kubectl get pods
    

W poniższych danych wyjściowych, mimo że zostanie utworzone wdrożenie, zasobnik nie zostanie utworzony. Utworzone zasady zablokowały wdrożenie. Jednak zasobnik utworzony przed przypisaniem zasad nie został zatrzymany. Zasady nie uniemożliwiły również utworzenia usługi. Jeśli spróbujesz otworzyć zewnętrzny adres IP w przeglądarce, nie otrzymasz odpowiedzi, co dodatkowo pokazuje, że wdrożenie nie powiodło się.

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

Diagnozowanie, dlaczego zasobnik nie został wdrożony

W poprzedniej sekcji zauważyliśmy, że drugi zasobnik nie został wdrożony. W tej sekcji użyjemy wiersza polecenia, aby zdiagnozować przyczynę.

  1. Najpierw opiszmy wdrożenie. Widzimy, że zestaw replik jest tworzony, ale nie można utworzyć replik.

    kubectl get replicasets
    

    Powinny zostać wyświetlone dane wyjściowe podobne do następującego przykładu:

    NAME                             DESIRED   CURRENT   READY   AGE
    second-simple-nginx-64969b4566   1         0         0       8m45s
    simple-nginx-66d884c498          1         1         1       72m
    
  2. Następnie opiszemy zestaw replik, który zakończył się niepowodzeniem. Skopiuj nazwę zestawu replicaSet rozpoczynającego się od second-simple-nginx, zaktualizuj następujące polecenie za pomocą tej wartości i uruchom polecenie .

    kubectl describe replicaset <ReplicaSet name>
    
  3. Dane wyjściowe polecenia pokazują, że repliki nie powiodły się z powodu zasad.

    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.
    

Usuń wdrożenie, aby przygotować się do następnego kroku.

kubectl delete deployment second-simple-nginx

Ponowne wdrażanie zasobników przy użyciu obrazu usługi Azure Container Registry

Teraz, gdy wiesz, że zasady uniemożliwiają tworzenie obrazów z centrum Platformy Docker w klastrze na podstawie zasad. Spróbujmy ponownie wdrożyć to samo obciążenie przy użyciu obrazu z usługi Azure Container Registry (ACR). W tej sekcji utworzysz usługę Azure Container Registry. Następnie skopiujesz obraz nginx z centrum Platformy Docker do nowego rejestru i spróbujesz ponownie wdrożyć zasobnik z rejestru kontenerów. Do utworzenia rejestru kontenerów używamy interfejsu wiersza polecenia platformy Azure.

  1. Wróć do usługi Cloud Shell w witrynie Azure Portal i wprowadź następujące polecenia, aby utworzyć nowy rejestr kontenerów.

    ACR_NAME=videogameacr$RANDOM
    az acr create --name $ACR_NAME \
                  --resource-group videogamerg \
                  --sku Premium
    
  2. Zaimportuj obraz z usługi Docker Hub do nowego rejestru kontenerów.

    az acr import --name $ACR_NAME --source docker.io/library/nginx:stable --image nginx:v1
    
  3. Sprawdź, czy obraz został zaimportowany. Na liście wyników powinien zostać wyświetlony ciąg nginx.

    az acr repository list --name $ACR_NAME
    
  4. Połącz klaster usługi AKS z utworzonym rejestrem kontenerów.

    az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
    
  5. Teraz utwórz wdrożenie przy użyciu nowo utworzonego rejestru kontenerów, uruchamiając następujące polecenie.

     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. Pobierz adres EXTERNAL-IP, aby sprawdzić, czy usługa jest uruchomiona w klastrze.

    kubectl get pods
    kubectl get services
    

    Zrzut ekranu przedstawiający, że zasobniki zostały wdrożone tym razem.

    Skopiuj zewnętrzny adres IP i wklej go w przeglądarce. Zobaczysz, że strona zostanie załadowana.

    SScreenshot pokazujący, że zasobnik został pomyślnie wdrożony w przeglądarce internetowej.

Używanie zasad do wymuszania standardów

W tej lekcji pokazano, jak używać zasad w celu zapewnienia, że klaster zezwala na wdrażanie tylko obrazów z usługi Azure Container Registry. Pokazano również, jak dodać jedną z wbudowanych inicjatyw, które mogą ułatwić zarządzanie klastrem i zwiększyć bezpieczeństwo. Jednak widać, że zasobnik, który został wdrożony przed przypisaną zasadą, jest nadal uruchomiony. W następnej lekcji zobaczysz, jak możemy sprawdzić zgodność zasobników uruchomionych w klastrze.