Udostępnij przez


Sandboxowanie podów w Azure Kubernetes Service (AKS)

Aby zabezpieczyć i chronić obciążenia kontenerów przed niezaufanym lub potencjalnie złośliwym kodem, usługa AKS zawiera teraz mechanizm o nazwie Piaskownica zasobnika. Piaskownica podów zapewnia granicę izolacji między aplikacją kontenerową a wspólnym jądrem i zasobami obliczeniowymi hosta kontenera, takimi jak CPU, pamięć i sieć. Aplikacje są uruchamiane w izolowanych, lekkich maszynach wirtualnych pod. Piaskowanie podów uzupełnia inne środki zabezpieczające lub mechanizmy kontroli ochrony danych w ramach ogólnej architektury, aby ułatwić spełnienie wymagań dotyczących zgodności z przepisami, standardami branżowymi lub zarządzaniem w celu zabezpieczenia poufnych informacji.

Ten artykuł pomaga zrozumieć tę nową funkcję i jak ją zaimplementować.

Prerequisites

  • Interfejs wiersza polecenia platformy Azure w wersji 2.80.0 lub nowszej. Uruchom polecenie az --version , aby znaleźć wersję interfejsu wiersza polecenia platformy Azure i uruchomić polecenie az upgrade w celu uaktualnienia. Aby uzyskać więcej informacji, zobacz kroki opisane w temacie Instalowanie interfejsu wiersza polecenia platformy Azure.

  • Usługa AKS obsługuje izolację podów (Pod Sandboxing) w Kubernetes w wersji 1.27.0 i wyższej.

  • Aby zarządzać klastrem Kubernetes, użyj narzędzia kubectl klienta wiersza polecenia Kubernetes. Usługa Azure Cloud Shell jest dostarczana z usługą kubectl. Narzędzie kubectl można zainstalować lokalnie przy użyciu polecenia az aks install-cli .

Limitations

Poniżej przedstawiono ograniczenia dotyczące sandboxingu Pod.

  • Kata containers mogą nie osiągnąć limitów wydajności operacji IO, które mogą osiągnąć tradycyjne kontenery w usłudze Azure Files i wysokowydajnym lokalnym dysku SSD.

  • Usługa Microsoft Defender for Containers nie obsługuje oceny zasobników środowiska uruchomieniowego Kata.

  • Dostęp do sieci hosta Kata nie jest obsługiwany. Nie można bezpośrednio uzyskać dostępu do konfiguracji sieci hosta z poziomu maszyny wirtualnej.

  • Alokacja CPU i pamięci przy użyciu Sandboxing z Pod ma inne zagadnienia w porównaniu z runc. Odwołaj się do sekcji zarządzania pamięcią na stronie zagadnień.

Jak to działa

Piaskownica podów w usłudze AKS opiera się na projekcie open source Kata Containers. Kata Containers działające na hoście kontenera Azure Linux dla usługi AKS zapewniają izolację opartą na maszynie wirtualnej i oddzielne jądro dla każdego poda. Pod Sandboxing umożliwia użytkownikom przydzielanie zasobów dla każdego pod i nie udostępnia ich innym Kata Containers ani kontenerom namespace uruchomionym na tym samym hoście.

Architektura rozwiązania jest oparta na następujących głównych składnikach:

Wdrażanie piaskownicy zasobnika przy użyciu kontenerów Kata jest podobne do standardowego containerd przepływu pracy w celu wdrożenia kontenerów. Klastry z włączonym sandboxingiem zasobników mają określoną klasę środowiska uruchomieniowego, do której można odwoływać się w manifeście poda (runtimeClassName: kata-vm-isolation).

Aby użyć tej funkcji z zasobnikiem, jedyną różnicą jest dodanie parametru runtimeClassNamekata-vm-isolation do specyfikacji zasobnika. Gdy zasobnik używa kata-vm-isolation klasy runtimeClass, funkcja hypervisor uruchamia uproszczoną maszynę wirtualną z własnym jądrem, aby obciążenie działało.

Wdrażanie nowego klastra

Wykonaj następujące kroki, aby wdrożyć klaster usługi Azure Linux AKS przy użyciu interfejsu wiersza polecenia platformy Azure.

  1. Utwórz klaster usługi AKS przy użyciu polecenia az aks create i określ następujące parametry:

    • --workload-runtime: określ KataVmIsolation, aby włączyć funkcję piaskownicy zasobnika w puli węzłów. W przypadku tego parametru te inne parametry powinny spełniać następujące wymagania. W przeciwnym razie polecenie kończy się niepowodzeniem i zgłasza problem z odpowiednimi parametrami.
    • --os-sku: AzureLinux. Tylko Azure Linux os-sku obsługuje tę funkcję.
    • --node-vm-size: dowolny rozmiar maszyny wirtualnej platformy Azure, który jest maszyną wirtualną generacji 2, działa i obsługuje wirtualizację zagnieżdżoną. Na przykład maszyny wirtualne Dsv3 .

    Poniższy przykład tworzy klaster o nazwie myAKSCluster z jednym węzłem w grupie myResourceGroup:

    az aks create
        --name myAKSCluster \
        --resource-group myResourceGroup \
        --os-sku AzureLinux \
        --workload-runtime KataVmIsolation \
        --node-vm-size Standard_D4s_v3 \
        --node-count 3 \
        --generate-ssh-keys
    
  2. Uruchom następujące polecenie, aby uzyskać poświadczenia dostępu dla klastra Kubernetes. Użyj polecenia az aks get-credentials i zastąp wartości nazwy klastra i nazwy grupy zasobów.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. Wyświetl listę wszystkich zasobników we wszystkich przestrzeniach nazw przy użyciu polecenia kubectl get pods .

    kubectl get pods --all-namespaces
    

Wdrażanie w istniejącym klastrze

Aby korzystać z tej funkcji z istniejącym klastrem usługi AKS, należy spełnić następujące wymagania:

  • Sprawdź, czy klaster działa na platformie Kubernetes w wersji 1.27.0 lub nowszej.

Użyj następującego polecenia, aby włączyć Pod Sandboxing, tworząc pulę węzłów do jego hostowania.

  1. Dodaj do klastra AKS pulę węzłów przy użyciu polecenia az aks nodepool add. Określ następujące parametry:

    • --resource-group: wprowadź nazwę istniejącej grupy zasobów, w ramach których ma zostać utworzony klaster usługi AKS.
    • --cluster-name: wprowadź unikatową nazwę klastra usługi AKS, taką jak myAKSCluster.
    • --name: wprowadź unikatową nazwę puli węzłów klastrów, na przykład nodepool2.
    • --workload-runtime: określ KataVmIsolation, aby włączyć funkcję piaskownicy zasobnika w puli węzłów. Wraz z parametrem --workload-runtime te inne parametry spełniają następujące wymagania. W przeciwnym razie polecenie kończy się niepowodzeniem i zgłasza problem z odpowiednim parametrem.
      • --os-sku: AzureLinux. Tylko Azure Linux os-sku obsługuje tę funkcję.
      • --node-vm-size: dowolny rozmiar maszyny wirtualnej platformy Azure, który jest maszyną wirtualną generacji 2, działa i obsługuje wirtualizację zagnieżdżoną. Na przykład maszyny wirtualne Dsv3 .

    Poniższy przykład dodaje pulę węzłów do myAKSCluster z jednym węzłem w nodepool2 w myResourceGroup:

    az aks nodepool add --cluster-name myAKSCluster --resource-group myResourceGroup --name nodepool2 --os-sku AzureLinux --workload-runtime KataVmIsolation --node-vm-size Standard_D4s_v3
    
  2. Uruchom polecenie az aks update, aby włączyć piaskownicę pod w klastrze.

    az aks update --name myAKSCluster --resource-group myResourceGroup
    

Wdrażanie aplikacji

Dzięki Pod Sandboxing, można wdrożyć mieszankę standardowych podów (które nie korzystają ze środowiska uruchomieniowego Kata) oraz podów Kata (które korzystają z tego środowiska). Główna różnica między nimi, podczas wdrażania, polega na tym, że pod Kata ma linię runtimeClassName: kata-vm-isolation w specyfikacji.

Wdrażanie aplikacji przy użyciu środowiska uruchomieniowego Kata

Aby wdrożyć pod ze środowiskiem uruchomieniowym Kata w klastrze AKS, wykonaj następujące kroki.

  1. Utwórz plik o nazwie kata-app.yaml, aby opisać pod kata, a następnie wklej następujący manifest.

    kind: Pod
    apiVersion: v1
    metadata:
      name: isolated-pod
    spec:
      runtimeClassName: kata-vm-isolation
      containers:
      - name: kata
        image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
        command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
    

    Wartość parametru runtimeClassNameSpec to kata-vm-isolation.

  2. Wdróż zasobnik Kubernetes, uruchamiając polecenie kubectl apply i określ plik kata-app.yaml :

    kubectl apply -f kata-app.yaml
    

    Dane wyjściowe polecenia przypominają następujący przykład:

    pod/isolated-pod created
    

(Opcjonalnie) Weryfikowanie konfiguracji izolacji jądra

Jeśli chcesz zweryfikować różnicę między jądrem zasobnika Kata a zasobnikiem bez Kata, możesz uruchomić kolejne obciążenie, które nie ma środowiska uruchomieniowego Kata.

kind: Pod
apiVersion: v1
metadata:
  name: normal-pod
spec:
  containers:
  - name: non-kata
    image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
  1. Aby uzyskać dostęp do kontenera w klastrze AKS, uruchom sesję powłoki, uruchamiając polecenie kubectl exec. W tym przykładzie uzyskujesz dostęp do kontenera w zasobniku kata-pod.

    kubectl exec -it isolated-pod -- /bin/sh
    

    Kubectl łączy się z klastrem, uruchamia /bin/sh wewnątrz pierwszego kontenera w isolated-pod i przekazuje strumienie wejściowe i wyjściowe terminala do procesu kontenera. Możesz również uruchomić sesję powłoki do kontenera obsługującego zasobnik inny niż Kata, aby zobaczyć różnice.

  2. Po uruchomieniu sesji powłoki w kontenerze z kata-pod, możesz uruchomić polecenia, aby sprawdzić, czy kontener kata jest uruchomiony w piaskownicy podu. Zwróć uwagę, że ma inną wersję jądra w porównaniu z kontenerem innym niż Kata poza piaskownicą.

    Aby wyświetlić wersję jądra, uruchom następujące polecenie:

    uname -r
    

    Poniższy przykład przypomina dane wyjściowe z jądra piaskownicy zasobnika:

    [user]/# uname -r
    6.6.96.mshv1
    
  3. Rozpocznij sesję powłoki do kontenera z normal-pod, aby zweryfikować dane wyjściowe jądra.

    kubectl exec -it normal-pod -- /bin/bash
    

    Aby wyświetlić wersję jądra, uruchom następujące polecenie:

    uname -r
    

    Poniższy przykład przypomina dane wyjściowe z maszyny wirtualnej, na której działa zasobnik normalny, który jest innym jądrem niż zasobnik Kata uruchomiony w piaskownicy zasobnika:

    6.6.100.mshv1-1.azl3
    

Cleanup

Po zakończeniu oceny tej funkcji, aby uniknąć opłat za platformę Azure, wyczyść niepotrzebne zasoby. Jeśli w ramach oceny lub testowania wdrożono nowy klaster, możesz usunąć klaster przy użyciu polecenia az aks delete .

az aks delete --resource-group myResourceGroup --name myAKSCluster

Jeśli wdrożono Sandboxing Pods w istniejącym klastrze, możesz usunąć zasobniki przy użyciu polecenia kubectl delete pod.

kubectl get pods
kubectl delete pod <kata-pod-name>

Dalsze kroki