Tworzenie i dołączanie klastra Azure Kubernetes Service przy użyciu wersji 1

DOTYCZY:Zestaw SDK języka Python w wersji 1

DOTYCZY:Rozszerzenie uczenia maszynowego platformy Azure w wersji 1

Ważne

W tym artykule pokazano, jak za pomocą interfejsu wiersza polecenia i zestawu SDK w wersji 1 utworzyć lub dołączyć klaster Azure Kubernetes Service, który jest teraz uważany za starszą funkcję. Aby dołączyć klaster Azure Kubernetes Service przy użyciu zalecanej metody dla wersji 2, zobacz Wprowadzenie do docelowego obiektu obliczeniowego kubernetes w wersji 2.

Usługa Azure Machine Learning umożliwia wdrażanie wytrenowanych modeli uczenia maszynowego w celu Azure Kubernetes Service. Należy jednak najpierw utworzyć klaster Azure Kubernetes Service (AKS) z obszaru roboczego usługi Azure Machine Learning lub dołączyć istniejący klaster usługi AKS. Ten artykuł zawiera informacje dotyczące tworzenia i dołączania klastra.

Wymagania wstępne

Ograniczenia

  • Usługę AKS można utworzyć lub dołączyć tylko jako pojedynczy docelowy obiekt obliczeniowy w obszarze roboczym usługi Azure Machine Learning. Usługa AKS nie obsługuje wielu załączników.

  • Jeśli potrzebujesz usługa Load Balancer w warstwie Standardowa (SLB) wdrożonego w klastrze zamiast podstawowego Load Balancer (BLB), utwórz klaster w portalu usługi AKS/interfejsie wiersza polecenia/zestawie SDK, a następnie dołącz go do obszaru roboczego usługi Azure Machine Learning.

  • Jeśli masz zasady usługi Azure Policy, które ograniczają tworzenie publicznych adresów IP, tworzenie klastra usługi AKS zakończy się niepowodzeniem. Usługa AKS wymaga publicznego adresu IP na potrzeby ruchu wychodzącego. Artykuł na temat ruchu wychodzącego zawiera również wskazówki dotyczące blokowania ruchu wychodzącego z klastra za pośrednictwem publicznego adresu IP, z wyjątkiem kilku w pełni kwalifikowanych nazw domen. Istnieją dwa sposoby włączania publicznego adresu IP:

    Płaszczyzna sterowania usługi Azure Machine Learning nie komunikuje się z tym publicznym adresem IP. Komunikuje się z płaszczyzną sterowania usługi AKS na potrzeby wdrożeń.

  • Aby dołączyć klaster usługi AKS, jednostka usługi/użytkownik wykonujący operację musi mieć przypisaną rolę Właściciel lub Współautor kontroli dostępu na podstawie ról (RBAC) platformy Azure w grupie zasobów platformy Azure, która zawiera klaster. Jednostka usługi/użytkownik musi mieć również przypisaną rolę Azure Kubernetes Service klastra Administracja w klastrze.

  • Jeśli dołączasz klaster usługi AKS z włączonym autoryzowanym zakresem adresów IP na potrzeby dostępu do serwera interfejsu API, włącz zakresy adresów IP płaszczyzny sterowania usługi Azure Machine Learning dla klastra usługi AKS. Płaszczyzna sterowania usługi Azure Machine Learning jest wdrażana w sparowanych regionach i wdraża zasobniki wnioskowania w klastrze usługi AKS. Bez dostępu do serwera interfejsu API nie można wdrożyć zasobników wnioskowania. Włączając zakresy adresów IP w klastrze usługi AKS, użyj zakresów adresów IP dla obu sparowanych regionów.

    Autoryzowane zakresy adresów IP działają tylko w przypadku usługi Load Balancer w warstwie Standardowa.

  • Jeśli chcesz użyć prywatnego klastra usługi AKS (z zastosowaniem usługi Azure Private Link), najpierw musisz utworzyć klaster, a następnie dołączyć go do obszaru roboczego. Aby uzyskać więcej informacji, zobacz Tworzenie prywatnego klastra usługi Azure Kubernetes Service.

  • Używanie publicznej w pełni kwalifikowanej nazwy domeny (FQDN) z prywatnym klastrem usługi AKSnie jest obsługiwane w usłudze Azure Machine Learning.

  • Nazwa obiektu obliczeniowego dla klastra usługi AKS MUSI być unikatowa w obszarze roboczym usługi Azure Machine Learning. Może ona zawierać litery, cyfry i kreski. Musi zaczynać się literą, kończyć literą lub cyfrą i składać się z 3 do 24 znaków.

  • Jeśli chcesz wdrożyć modele w węzłach procesora GPU lub węzłach FPGA (lub dowolnej konkretnej jednostce SKU), musisz utworzyć klaster z określoną jednostkę SKU. Tworzenie puli węzłów pomocniczych w istniejącym klastrze i wdrażanie modeli w tej puli węzłów pomocniczych nie jest obsługiwane.

  • Podczas tworzenia lub dołączania klastra możesz wybrać, czy chcesz utworzyć klaster na potrzeby tworzenia i testowania, czy produkcji. Jeśli chcesz utworzyć klaster usługi AKS na potrzeby programowania, walidacji i testowania, a nie produkcji, jako przeznaczenie klastra ustaw tworzenie i testowanie. Jeśli nie określisz przeznaczenia klastra, zostanie utworzony klaster produkcyjny.

    Ważne

    Klaster dev-test nie jest odpowiedni dla ruchu na poziomie produkcyjnym i może wydłużyć czas wnioskowania. Klastry tworzenia i testowania nie gwarantują również odporności na uszkodzenia.

  • Podczas tworzenia lub dołączania klastra, jeśli klaster będzie używany do produkcji, musi on zawierać co najmniej 3 węzły. Klaster tworzenia i testowania musi zawierać co najmniej 1 węzeł.

  • Zestaw SDK usługi Azure Machine Learning nie zapewnia obsługi skalowania klastra usługi AKS. Aby skalować węzły w klastrze, użyj interfejsu użytkownika klastra usługi AKS w usłudze Azure Machine Learning studio. Można zmienić jedynie liczbę węzłów, a nie rozmiar maszyny wirtualnej klastra. Aby uzyskać więcej informacji na temat skalowania węzłów w klastrze usługi AKS, zobacz następujące artykuły:

  • Nie należy bezpośrednio aktualizować klastra przy użyciu konfiguracji YAML. Mimo że usługa Azure Kubernetes Service obsługuje aktualizacje za pośrednictwem konfiguracji YAML, wdrożenia usługi Azure Machine Learning zastąpią wprowadzone zmiany. Jedyne dwa pola YAML, które nie zostaną zastąpione, to limity żądań oraz procesor i pamięć.

  • Tworzenie klastra usługi AKS przy użyciu interfejsu użytkownika Azure Machine Learning studio, zestawu SDK lub rozszerzenia interfejsu wiersza polecenia nie jest idempotentne. Próba ponownego utworzenia zasobu spowoduje błąd typu „klaster o tej samej nazwie już istnieje”.

    • Użycie szablonu usługi Azure Resource Manager i zasobu Microsoft.MachineLearningServices/workspaces/computes w celu utworzenia klastra usługi AKS również nie jest idempotentne. Jeśli spróbujesz ponownie użyć szablonu, aby zaktualizować już istniejący zasób, zostanie wyświetlony ten sam błąd.

Wersja usługi Azure Kubernetes Service

Azure Kubernetes Service umożliwia utworzenie klastra przy użyciu różnych wersji platformy Kubernetes. Aby uzyskać więcej informacji na temat dostępnych wersji, zobacz obsługiwane wersje rozwiązania Kubernetes w Azure Kubernetes Service.

Podczas tworzenia klastra Azure Kubernetes Service przy użyciu jednej z następujących metod nie masz wyboru w wersji utworzonego klastra:

  • Azure Machine Learning studio lub sekcję usługi Azure Machine Learning Azure Portal.
  • Rozszerzenie usługi Machine Learning dla interfejsu wiersza polecenia platformy Azure.
  • Zestaw SDK usługi Azure Machine Learning.

Te metody tworzenia klastra usługi AKS używają domyślnej wersji klastra. Wersja domyślna zmienia się wraz z upływem czasu , gdy nowe wersje platformy Kubernetes staną się dostępne.

Podczas dołączania istniejącego klastra usługi AKS obsługujemy wszystkie obecnie obsługiwane wersje usługi AKS.

Ważne

Azure Kubernetes Service używa sterownika Blobfuse FlexVolume dla wersji <=1.16 i sterownika CSI obiektów blob dla wersji >=1.17. W związku z tym ważne jest ponowne wdrożenie lub zaktualizowanie usługi internetowej po uaktualnieniu klastra w celu wdrożenia w celu poprawienia metody blobfuse dla wersji klastra.

Uwaga

Mogą wystąpić przypadki brzegowe, w których masz starszy klaster, który nie jest już obsługiwany. W takim przypadku operacja dołączania zwróci błąd i wyświetli listę obecnie obsługiwanych wersji.

Możesz dołączyć wersje zapoznawcze . Funkcje w wersji zapoznawczej są udostępniane bez umowy dotyczącej poziomu usług i nie są zalecane w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Obsługa korzystania z wersji zapoznawczych może być ograniczona. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

Dostępne i domyślne wersje

Aby znaleźć dostępne i domyślne wersje usługi AKS, użyj polecenia interfejsu wiersza polecenia platformy Azureaz aks get-versions. Na przykład następujące polecenie zwraca wersje dostępne w regionie Zachodnie stany USA:

az aks get-versions -l westus -o table

Dane wyjściowe tego polecenia są podobne do następującego tekstu:

KubernetesVersion    Upgrades
-------------------  ----------------------------------------
1.18.6(preview)      None available
1.18.4(preview)      1.18.6(preview)
1.17.9               1.18.4(preview), 1.18.6(preview)
1.17.7               1.17.9, 1.18.4(preview), 1.18.6(preview)
1.16.13              1.17.7, 1.17.9
1.16.10              1.16.13, 1.17.7, 1.17.9
1.15.12              1.16.10, 1.16.13
1.15.11              1.15.12, 1.16.10, 1.16.13

Aby znaleźć domyślną wersję używaną podczas tworzenia klastra za pomocą usługi Azure Machine Learning, możesz użyć parametru --query , aby wybrać wersję domyślną:

az aks get-versions -l westus --query "orchestrators[?default == `true`].orchestratorVersion" -o table

Dane wyjściowe tego polecenia są podobne do następującego tekstu:

Result
--------
1.16.13

Jeśli chcesz programowo sprawdzić dostępne wersje, użyj interfejsu API REST klienta usługi kontenera — lista koordynatorów. Aby znaleźć dostępne wersje, zapoznaj się z wpisami, w których orchestratorType wartość to Kubernetes. Skojarzone orchestrationVersion wpisy zawierają dostępne wersje, które można dołączyć do obszaru roboczego.

Aby znaleźć domyślną wersję używaną podczas tworzenia klastra za pomocą usługi Azure Machine Learning, znajdź wpis , gdzie orchestratorType jest Kubernetes i default ma truewartość . Skojarzona orchestratorVersion wartość jest wersją domyślną. Poniższy fragment kodu JSON przedstawia przykładowy wpis:

...
 {
        "orchestratorType": "Kubernetes",
        "orchestratorVersion": "1.16.13",
        "default": true,
        "upgrades": [
          {
            "orchestratorType": "",
            "orchestratorVersion": "1.17.7",
            "isPreview": false
          }
        ]
      },
...

Tworzenie nowego klastra usługi AKS

Szacowany czas: około 10 minut.

Tworzenie lub dołączanie klastra usługi AKS jest jednorazowym procesem dla obszaru roboczego. Możesz ponownie użyć tego klastra w przypadku wielu wdrożeń. Jeśli usuniesz klaster lub grupę zasobów, która go zawiera, musisz utworzyć nowy klaster przy następnym wdrożeniu. Do obszaru roboczego można dołączyć wiele klastrów usługi AKS.

W poniższym przykładzie pokazano, jak utworzyć nowy klaster usługi AKS przy użyciu zestawu SDK i interfejsu wiersza polecenia:

DOTYCZY:Zestaw SDK języka Python w wersji 1

from azureml.core.compute import AksCompute, ComputeTarget

# Use the default configuration (you can also provide parameters to customize this).
# For example, to create a dev/test cluster, use:
# prov_config = AksCompute.provisioning_configuration(cluster_purpose = AksCompute.ClusterPurpose.DEV_TEST)
prov_config = AksCompute.provisioning_configuration()

# Example configuration to use an existing virtual network
# prov_config.vnet_name = "mynetwork"
# prov_config.vnet_resourcegroup_name = "mygroup"
# prov_config.subnet_name = "default"
# prov_config.service_cidr = "10.0.0.0/16"
# prov_config.dns_service_ip = "10.0.0.10"
# prov_config.docker_bridge_cidr = "172.17.0.1/16"

aks_name = 'myaks'
# Create the cluster
aks_target = ComputeTarget.create(workspace = ws,
                                    name = aks_name,
                                    provisioning_configuration = prov_config)

# Wait for the create process to complete
aks_target.wait_for_completion(show_output = True)

Aby uzyskać więcej informacji na temat klas, metod i parametrów używanych w tym przykładzie, zobacz następujące dokumenty referencyjne:

Dołączanie istniejącego klastra usługi AKS

Szacowanie czasu: Około 5 minut.

Jeśli masz już klaster usługi AKS w subskrypcji platformy Azure, możesz użyć go z obszarem roboczym.

Porada

Istniejący klaster usługi AKS może znajdować się w regionie świadczenia usługi Azure innym niż obszar roboczy usługi Azure Machine Learning.

Ostrzeżenie

Nie twórz wielu równoczesnych załączników do tego samego klastra usługi AKS. Na przykład dołączenie jednego klastra usługi AKS do obszaru roboczego przy użyciu dwóch różnych nazw lub dołączenie jednego klastra usługi AKS do innego obszaru roboczego. Każdy nowy załącznik spowoduje przerwanie poprzednich istniejących załączników i spowoduje nieprzewidywalny błąd.

Jeśli chcesz ponownie dołączyć klaster usługi AKS, na przykład w celu zmiany protokołu TLS lub innego ustawienia konfiguracji klastra, musisz najpierw usunąć istniejący załącznik przy użyciu AksCompute.detach().

Aby uzyskać więcej informacji na temat tworzenia klastra usługi AKS przy użyciu interfejsu wiersza polecenia platformy Azure lub portalu, zobacz następujące artykuły:

W poniższym przykładzie pokazano, jak dołączyć istniejący klaster usługi AKS do obszaru roboczego:

DOTYCZY:Zestaw SDK języka Python w wersji 1

from azureml.core.compute import AksCompute, ComputeTarget
# Set the resource group that contains the AKS cluster and the cluster name
resource_group = 'myresourcegroup'
cluster_name = 'myexistingcluster'

# Attach the cluster to your workgroup. If the cluster has less than 12 virtual CPUs, use the following instead:
# attach_config = AksCompute.attach_configuration(resource_group = resource_group,
#                                         cluster_name = cluster_name,
#                                         cluster_purpose = AksCompute.ClusterPurpose.DEV_TEST)
attach_config = AksCompute.attach_configuration(resource_group = resource_group,
                                         cluster_name = cluster_name)
aks_target = ComputeTarget.attach(ws, 'myaks', attach_config)

# Wait for the attach process to complete
aks_target.wait_for_completion(show_output = True)

Aby uzyskać więcej informacji na temat klas, metod i parametrów używanych w tym przykładzie, zobacz następujące dokumenty referencyjne:

Tworzenie lub dołączanie klastra usługi AKS z kończeniem protokołu TLS

Podczas tworzenia lub dołączania klastra usługi AKS można włączyć zakończenie protokołu TLS za pomocą obiektów konfiguracji AksCompute.provisioning_configuration() i AksCompute.attach_configuration(). Obie metody zwracają obiekt konfiguracji, który ma metodę enable_ssl , i można użyć metody enable_ssl w celu włączenia protokołu TLS.

W poniższym przykładzie pokazano, jak włączyć zakończenie szyfrowania TLS z automatycznym generowaniem i konfiguracją certyfikatów TLS przy użyciu certyfikatu firmy Microsoft pod maską.

DOTYCZY:Zestaw SDK języka Python w wersji 1

   from azureml.core.compute import AksCompute, ComputeTarget
   
   # Enable TLS termination when you create an AKS cluster by using provisioning_config object enable_ssl method

   # Leaf domain label generates a name using the formula
   # "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
   # where "######" is a random series of characters
   provisioning_config.enable_ssl(leaf_domain_label = "contoso")
   
   # Enable TLS termination when you attach an AKS cluster by using attach_config object enable_ssl method

   # Leaf domain label generates a name using the formula
   # "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
   # where "######" is a random series of characters
   attach_config.enable_ssl(leaf_domain_label = "contoso")


W poniższym przykładzie pokazano, jak włączyć zakończenie szyfrowania TLS przy użyciu certyfikatu niestandardowego i niestandardowej nazwy domeny. W przypadku domeny niestandardowej i certyfikatu należy zaktualizować rekord DNS, aby wskazywał adres IP punktu końcowego oceniania. Zobacz Aktualizowanie systemu DNS

DOTYCZY:Zestaw SDK języka Python w wersji 1

   from azureml.core.compute import AksCompute, ComputeTarget

   # Enable TLS termination with custom certificate and custom domain when creating an AKS cluster
   
   provisioning_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")
    
   # Enable TLS termination with custom certificate and custom domain when attaching an AKS cluster

   attach_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")


Uwaga

Aby uzyskać więcej informacji na temat zabezpieczania wdrożenia modelu w klastrze usługi AKS, zobacz Zabezpieczanie usługi internetowej za pomocą protokołu TLS za pośrednictwem usługi Azure Machine Learning

Tworzenie lub dołączanie klastra usługi AKS do korzystania z wewnętrznego Load Balancer z prywatnym adresem IP

Podczas tworzenia lub dołączania klastra usługi AKS można skonfigurować klaster tak, aby używał Load Balancer wewnętrznego. W przypadku Load Balancer wewnętrznego punkty końcowe oceniania dla wdrożeń w usłudze AKS będą używać prywatnego adresu IP w sieci wirtualnej. Poniższe fragmenty kodu pokazują, jak skonfigurować wewnętrzny Load Balancer dla klastra usługi AKS.

DOTYCZY:Zestaw SDK języka Python w wersji 1

Aby utworzyć klaster usługi AKS używający Load Balancer wewnętrznego, użyj load_balancer_type parametrów i load_balancer_subnet :

from azureml.core.compute.aks import AksUpdateConfiguration
from azureml.core.compute import AksCompute, ComputeTarget

# When you create an AKS cluster, you can specify Internal Load Balancer to be created with provisioning_config object
provisioning_config = AksCompute.provisioning_configuration(load_balancer_type = 'InternalLoadBalancer')

# Create the cluster
aks_target = ComputeTarget.create(workspace = ws,
                                name = aks_name,
                                provisioning_configuration = provisioning_config)

# Wait for the create process to complete
aks_target.wait_for_completion(show_output = True)

Ważne

Jeśli klaster usługi AKS jest skonfigurowany z wewnętrznym Load Balancer, użycie dostarczonego certyfikatu firmy Microsoft nie jest obsługiwane i należy użyć certyfikatu niestandardowego do włączenia protokołu TLS.

Uwaga

Aby uzyskać więcej informacji na temat zabezpieczania środowiska wnioskowania, zobacz Zabezpieczanie środowiska wnioskowania usługi Azure Machine Learning

Odłączanie klastra usługi AKS

Aby odłączyć klaster od obszaru roboczego, użyj jednej z następujących metod:

Ostrzeżenie

Używanie Azure Machine Learning studio, zestawu SDK lub rozszerzenia interfejsu wiersza polecenia platformy Azure do uczenia maszynowego w celu odłączenia klastra usługi AKS nie powoduje usunięcia klastra usługi AKS. Aby usunąć klaster, zobacz Używanie interfejsu wiersza polecenia platformy Azure z usługą AKS.

DOTYCZY:Zestaw SDK języka Python w wersji 1

aks_target.detach()

Rozwiązywanie problemów

Aktualizowanie klastra

Aktualizacje do składników usługi Azure Machine Learning zainstalowanych w klastrze Azure Kubernetes Service należy zastosować ręcznie.

Te aktualizacje można zastosować, odłączając klaster od obszaru roboczego usługi Azure Machine Learning i ponownie dołączając klaster do obszaru roboczego.

DOTYCZY:Zestaw SDK języka Python w wersji 1

compute_target = ComputeTarget(workspace=ws, name=clusterWorkspaceName)
compute_target.detach()
compute_target.wait_for_completion(show_output=True)

Przed ponownym dołączeniem klastra do obszaru roboczego należy najpierw usunąć wszystkie azureml-fe powiązane zasoby. Jeśli w klastrze nie ma aktywnej usługi, możesz usunąć azureml-fe powiązane zasoby przy użyciu następującego kodu.

kubectl delete sa azureml-fe
kubectl delete clusterrole azureml-fe-role
kubectl delete clusterrolebinding azureml-fe-binding
kubectl delete svc azureml-fe
kubectl delete svc azureml-fe-int-http
kubectl delete deploy azureml-fe
kubectl delete secret azuremlfessl
kubectl delete cm azuremlfeconfig

Jeśli protokół TLS jest włączony w klastrze, należy podać certyfikat TLS/SSL i klucz prywatny podczas ponownego dołączenia klastra.

DOTYCZY:Zestaw SDK języka Python w wersji 1

attach_config = AksCompute.attach_configuration(resource_group=resourceGroup, cluster_name=kubernetesClusterName)

# If SSL is enabled.
attach_config.enable_ssl(
    ssl_cert_pem_file="cert.pem",
    ssl_key_pem_file="key.pem",
    ssl_cname=sslCname)

attach_config.validate_configuration()

compute_target = ComputeTarget.attach(workspace=ws, name=args.clusterWorkspaceName, attach_configuration=attach_config)
compute_target.wait_for_completion(show_output=True)

Jeśli nie masz już certyfikatu TLS/SSL i klucza prywatnego lub używasz certyfikatu wygenerowanego przez usługę Azure Machine Learning, możesz pobrać pliki przed odłączeniem klastra, łącząc się z klastrem przy użyciu kubectl i pobierając wpis tajny azuremlfessl.

kubectl get secret/azuremlfessl -o yaml

Uwaga

Platforma Kubernetes przechowuje wpisy tajne w formacie zakodowanym w formacie Base64. Przed przekazaniem ich attach_config.enable_ssldo pliku należy zdekodować cert.pem składniki i i key.pem wpisów tajnych.

Błędy usługi internetowej

Wiele błędów usługi internetowej w usłudze AKS można debugować, łącząc się z klastrem przy użyciu polecenia kubectl. Klaster usługi AKS można pobrać kubeconfig.json , uruchamiając polecenie

DOTYCZY:Rozszerzenie interfejsu wiersza polecenia platformy Azure w wersji 1

az aks get-credentials -g <rg> -n <aks cluster name>

Po odłączeniu klastra, jeśli w klastrze nie ma żadnej aktywnej usługi, usuń azureml-fe powiązane zasoby przed ponownym dołączeniem:

kubectl delete sa azureml-fe
kubectl delete clusterrole azureml-fe-role
kubectl delete clusterrolebinding azureml-fe-binding
kubectl delete svc azureml-fe
kubectl delete svc azureml-fe-int-http
kubectl delete deploy azureml-fe
kubectl delete secret azuremlfessl
kubectl delete cm azuremlfeconfig

Moduły równoważenia obciążenia nie powinny mieć publicznych adresów IP

Podczas próby utworzenia lub dołączenia klastra usługi AKS może zostać wyświetlony komunikat o odmowie żądania, ponieważ "Moduły równoważenia obciążenia nie powinny mieć publicznych adresów IP". Ten komunikat jest zwracany, gdy administrator zastosował zasady uniemożliwiające używanie klastra usługi AKS z publicznym adresem IP.

Aby rozwiązać ten problem, utwórz/dołącz klaster przy użyciu load_balancer_type parametrów i load_balancer_subnet . Aby uzyskać więcej informacji, zobacz Wewnętrzny Load Balancer (prywatny adres IP).

Następne kroki