Udostępnij przez


Włącz Istio CNI dla dodatku Istio-based service mesh w usłudze Azure Kubernetes Service (wersja zapoznawcza)

W tym artykule pokazano, jak włączyć funkcję Istio CNI dla dodatku siatki usługi opartej na technologii Istio w usłudze Azure Kubernetes Service (AKS). Istio CNI zwiększa bezpieczeństwo, eliminując konieczność korzystania z uprzywilejowanych funkcji sieciowych w obciążeniach aplikacji w ramach siatki usług.

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi i wymagają zapisania się. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów, świadczoną w miarę możliwości. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Przegląd

Domyślnie siatka serwisowa Istio używa uprzywilejowanych kontenerów init (istio-init) w każdym podzie aplikacji, aby skonfigurować przekierowanie ruchu sieciowego do serwera proxy sidecar Envoy. Te kontenery inicjujące wymagają uprawnień NET_ADMIN i NET_RAW, które często są postrzegane jako kwestie bezpieczeństwa w środowiskach korporacyjnych.

Istio CNI rozwiązuje ten problem związany z bezpieczeństwem, przenosząc obowiązki konfiguracji sieci z poszczególnych kontenerów init podów do wtyczki CNI na poziomie klastra. Takie podejście:

  • Zwiększa bezpieczeństwo: eliminuje konieczność korzystania z uprzywilejowanych funkcji sieciowych (NET_ADMIN, NET_RAW) z obciążeń aplikacji
  • Upraszcza zasady zabezpieczeń zasobników: zasobniki aplikacji wymagają tylko minimalnych możliwości
  • Utrzymuje funkcjonalność: zapewnia te same możliwości zarządzania ruchem co tradycyjne podejście kontenera init

Gdy funkcja Istio CNI jest włączona, zasobniki aplikacji używają minimalnego istio-validation kontenera inicjowania, który usuwa wszystkie uprawnienia zamiast uprzywilejowanego istio-init kontenera.

Uwaga / Notatka

Istio CNI nie jest zamiennikiem usługi Azure CNI i nie zakłóca normalnego działania sieci usługi AKS. Jest to oddzielna wtyczka przeznaczona do konfigurowania przekierowania ruchu Istio na poziomie węzła, co zwiększa bezpieczeństwo, eliminując potrzebę kontenerów inicjujących o uprzywilejowanych uprawnieniach w zasobnikach aplikacji.

Zanim rozpoczniesz

  • Zainstaluj interfejs wiersza polecenia platformy Azure w wersji 2.77.0 lub nowszej. Możesz uruchomić polecenie az --version , aby zweryfikować wersję. Aby zainstalować lub uaktualnić, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

  • Zainstaluj rozszerzenie Azure CLI w wersji 19.0.0b5 lub nowszej:

    az extension add --name aks-preview
    

    Jeśli masz aks-preview już rozszerzenie, zaktualizuj je do najnowszej wersji:

    az extension update --name aks-preview
    
  • Zarejestruj flagę IstioCNIPreview funkcji w subskrypcji platformy Azure:

    az feature register --namespace "Microsoft.ContainerService" --name "IstioCNIPreview"
    

    Użyj następującego polecenia, aby sprawdzić stan rejestracji:

    az feature show --namespace "Microsoft.ContainerService" --name "IstioCNIPreview"
    

    Zarejestrowanie funkcji trwa kilka minut. Sprawdź, czy wyświetlany stan rejestracji to Registered:

    {
      "id": "/subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Features/providers/Microsoft.ContainerService/features/IstioCNIPreview",
      "name": "Microsoft.ContainerService/IstioCNIPreview",
      "properties": {
        "state": "Registered"
      },
      "type": "Microsoft.Features/providers/features"
    }
    
  • Potrzebujesz klastra AKS z włączonym dodatkiem siatki usług opartym na Istio. Jeśli nie masz tej konfiguracji, zobacz Deploy Istio-based service mesh add-on for Azure Kubernetes Service (Wdrażanie dodatku siatki usługi opartej na środowisku Istio dla usługi Azure Kubernetes Service).

  • Upewnij się, że siatka usługi Istio używa wersji asm-1-25 lub nowszej. Bieżącą poprawkę można sprawdzić za pomocą następujących funkcji:

    az aks show --resource-group <resource-group-name> --name <cluster-name> --query 'serviceMeshProfile.istio.revisions'
    

Uwaga / Notatka

Istio CNI nie jest zgodny z pulami węzłów ubuntu 20.04. Upewnij się, że klaster korzysta z pul węzłów systemu Ubuntu 22.04 lub Azure Linux.

Ustawianie zmiennych środowiskowych

export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>

Włącz Istio CNI

Użyj następującego polecenia, aby włączyć usługę Istio CNI w klastrze usługi AKS:

az aks mesh enable-istio-cni --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Sprawdź, czy funkcja Istio CNI jest włączona

Użyj az aks get-credentials, aby uzyskać poświadczenia dla klastra usługi AKS.

az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Po włączeniu funkcji Istio CNI sprawdź instalację, sprawdzając, czy zestaw daemonSet CNI jest uruchomiony:

kubectl get daemonset -n aks-istio-system

Powinieneś zobaczyć uruchomiony DaemonSet Istio CNI.

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
azure-service-mesh-istio-cni-addon-node   3         3         3       3            3           kubernetes.io/os=linux   94s

Wdrażanie obciążeń i weryfikowanie zachowania

Aby sprawdzić poprawność zabezpieczeń, możesz wdrożyć przykładową aplikację bookinfo i sprawdzić, czy obciążenia używają bezpiecznego istio-validation kontenera init zamiast kontenera uprzywilejowanego istio-init .

Wdrażanie przykładowej aplikacji

Najpierw włącz iniekcję przyczepki dla domyślnej przestrzeni nazw:

# Get the current Istio revision
REVISION=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --query 'serviceMeshProfile.istio.revisions[0]' -o tsv)

# Label the namespace for sidecar injection
kubectl label namespace default istio.io/rev=${REVISION}

Wdróż przykładową aplikację bookinfo:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml

Zweryfikuj bezpieczne użycie kontenera init

Sprawdź, czy wdrożone pody używają bezpiecznego istio-validation kontenera init zamiast istio-init:

kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'

Oczekiwane dane wyjściowe powinny pokazywać istio-validation jako init container z ograniczonymi uprawnieniami:

details-v1-799dc5d847-7x9gl     istio-validation        {"drop":["ALL"]}
productpage-v1-99d6d698f-89gpj  istio-validation        {"drop":["ALL"]}
ratings-v1-7545c4bb6c-m7t42     istio-validation        {"drop":["ALL"]}
reviews-v1-8679d76d6c-jz4vg     istio-validation        {"drop":["ALL"]}
reviews-v2-5b9c77895c-b2b7m     istio-validation        {"drop":["ALL"]}
reviews-v3-5b57874f5f-kk9rt     istio-validation        {"drop":["ALL"]}

Możesz również opisać określony zasobnik, aby zweryfikować kontekst zabezpieczeń:

kubectl describe pod <pod-name> | grep -A 10 -B 5 "istio-validation"

Dane wyjściowe powinny wskazywać, że istio-validation kontener init nie ma uprzywilejowanych możliwości:

Init Containers:
  istio-validation:
    Container ID:  containerd://...
    Image:         mcr.microsoft.com/oss/istio/proxyv2:...
    ...
    Security Context:
      capabilities:
        drop:
        - ALL
      runAsGroup:     1337
      runAsNonRoot:   true
      runAsUser:      1337

Wyłączanie Istio CNI

Aby wyłączyć usługę Istio CNI i powrócić do używania tradycyjnych kontenerów inicjowania, użyj następującego polecenia:

az aks mesh disable-istio-cni --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Po wyłączeniu interfejsu CNI Istio:

  1. DaemonSet CNI zostanie usunięty:

    kubectl get daemonset azure-service-mesh-istio-cni-addon-node -n aks-istio-system
    

    Oczekiwane dane wyjściowe (bez CNI DaemonSet):

    Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not found
    
  2. Nowe obciążenia będą używać tradycyjnego istio-init kontenera inicjowania z funkcjami sieciowymi. Uruchom ponownie wszystkie istniejące wdrożenia, aby zastosować zmianę.

    kubectl rollout restart deployment/details-v1
    kubectl rollout restart deployment/productpage-v1
    kubectl rollout restart deployment/ratings-v1
    kubectl rollout restart deployment/reviews-v1
    kubectl rollout restart deployment/reviews-v2
    kubectl rollout restart deployment/reviews-v3
    
  3. Sprawdź nazwę i możliwości kontenera inicjowania:

    kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'
    

    Oczekiwane dane wyjściowe powinny być wyświetlane istio-init z możliwościami sieci:

    details-v1-57bc58c559-722v8     istio-init        {"drop":["ALL"]}
    productpage-v1-7bb64f657c-jw6gs istio-init        {"drop":["ALL"]}
    ratings-v1-57d5594c75-4zd49     istio-init        {"drop":["ALL"]}
    reviews-v1-7fd8f9cd59-mdcf9     istio-init        {"drop":["ALL"]}
    reviews-v2-7b8bdc9cdf-k9qgb     istio-init        {"drop":["ALL"]}
    reviews-v3-588854d9d7-s2f7j     istio-init        {"drop":["ALL"]}
    

Dalsze kroki