Ćwiczenie — implementowanie odporności infrastruktury za pomocą platformy Kubernetes

Ukończone

W poprzedniej lekcji zaimplementowano odporność, dodając kod obsługi błędów przy użyciu rozszerzenia odporności natywnej platformy .NET. Jednak ta zmiana dotyczy tylko zmienionej usługi. Aktualizowanie dużej aplikacji z wieloma usługami byłoby nietrywialne.

Zamiast używać odporności opartej na kodzie, ta jednostka stosuje podejście o nazwie odporność oparta na infrastrukturze, które obejmuje całą aplikację. Wykonasz:

  • Ponownie wdróż aplikację bez żadnej odporności na platformę Kubernetes.
  • Zainstaluj Linkerd w klastrze Kubernetes.
  • Skonfiguruj aplikację do używania Linkerd dla odporności.
  • Poznaj zachowanie aplikacji z Linkerd.

Ponowne wdrażanie aplikacji

Przed zastosowaniem Linkerd przywróć aplikację do stanu sprzed dodania odporności implementowanej w kodzie. Aby przywrócić, wykonaj następujące kroki:

  1. W dolnym panelu wybierz kartę TERMINAL i uruchom następujące polecenia git, aby cofnąć zmiany:

    cd Store
    git checkout Program.cs
    git checkout Store.csproj
    cd ..
    dotnet publish /p:PublishProfile=DefaultContainer
    

Instalowanie rozwiązania Kubernetes

W środowisku codespace zainstaluj platformę Kubernetes i k3d. k3d to narzędzie, które uruchamia klaster Kubernetes z jednym węzłem wewnątrz maszyny wirtualnej na maszynie lokalnej. Jest to przydatne do testowania wdrożeń platformy Kubernetes lokalnie i działa dobrze wewnątrz przestrzeni kodu.

Uruchom następujące polecenia, aby zainstalować platformę Kubernetes i aplikację MiniKube:

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubectl

curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
k3d cluster create devcluster --config k3d.yml

Wdrażanie usług eShop w usłudze Docker Hub

Lokalne obrazy usług, które skompilujesz, muszą być hostowane w rejestrze kontenerów, aby można je było wdrożyć na platformie Kubernetes. W tej lekcji użyjesz usługi Docker Hub jako rejestru kontenerów.

Uruchom następujące polecenia, aby wypchnąć obrazy do usługi Docker Hub:

sudo docker login

sudo docker tag products [your username]/productservice
sudo docker tag store [your username]/storeimage

sudo docker push [your username]/productservice
sudo docker push [your username]/storeimage

Konwertowanie pliku docker-compose na manifesty platformy Kubernetes

W tej chwili zdefiniujesz sposób działania aplikacji na platformie Docker. Platforma Kubernetes używa innego formatu do definiowania sposobu działania aplikacji. Możesz użyć narzędzia o nazwie Kompose, aby przekonwertować plik docker-compose na manifesty platformy Kubernetes.

  1. Musisz edytować te pliki, aby używać obrazów wypychanych do usługi Docker Hub.

  2. W przestrzeni kodu otwórz plik backend-deploy.yml.

  3. Zmień ten wiersz:

      containers:
        - image: [YOUR DOCKER USER NAME]/productservice:latest
    

    Zastąp symbol zastępczy [YOUR DOCKER USER NAME] rzeczywistą nazwą użytkownika platformy Docker.

  4. Powtórz te kroki dla pliku frontend-deploy.yml.

  5. Zmień ten wiersz:

      containers:
      - name: storefrontend
        image: [YOUR DOCKER USER NAME]/storeimage:latest  
    

    Zastąp symbol zastępczy [YOUR DOCKER USER NAME] rzeczywistą nazwą użytkownika platformy Docker.

  6. Wdróż aplikację eShop na platformie Kubernetes:

    kubectl apply -f backend-deploy.yml,frontend-deploy.yml  
    

    Powinny zostać wyświetlone dane wyjściowe podobne do następujących komunikatów:

    deployment.apps/productsbackend created
    service/productsbackend created
    deployment.apps/storefrontend created
    service/storefrontend created
    
  7. Sprawdź, czy wszystkie usługi są uruchomione:

    kubectl get pods
    

    Powinny zostać wyświetlone dane wyjściowe podobne do następujących komunikatów:

    NAME                        READY   STATUS    RESTARTS   AGE
    backend-66f5657758-5gnkw    1/1     Running   0          20s
    frontend-5c9d8dbf5f-tp456   1/1     Running   0          20s
    
  8. Przejdź do karty PORTS, aby wyświetlić aplikację eShop działającą na Kubernetes, wybierz obok ikonę globusa Front End (32000) portu.

Zainstaluj linkerd

Kontener deweloperski wymaga zainstalowania Linkerd CLI. Uruchom następujące polecenie, aby upewnić się, że wymagania wstępne Linkerd są spełnione.

curl -sL run.linkerd.io/install | sh
export PATH=$PATH:/home/vscode/.linkerd2/bin
linkerd check --pre

Zostanie wyświetlona odmiana następujących danych wyjściowych:

kubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes API

kubernetes-version
------------------
√ is running the minimum Kubernetes API version
√ is running the minimum kubectl version

pre-kubernetes-setup
--------------------
√ control plane namespace does not already exist
√ can create non-namespaced resources
√ can create ServiceAccounts
√ can create Services
√ can create Deployments
√ can create CronJobs
√ can create ConfigMaps
√ can create Secrets
√ can read Secrets
√ can read extension-apiserver-authentication configmap
√ no clock skew detected

pre-kubernetes-capability
-------------------------
√ has NET_ADMIN capability
√ has NET_RAW capability

linkerd-version
---------------
√ can determine the latest version
√ cli is up-to-date

Status check results are √

Wdrażanie Linkerd w Kubernetes

Najpierw uruchom następujące polecenie, aby zainstalować niestandardowe definicje zasobów (CRD):

linkerd install --crds | kubectl apply -f -

Następnie uruchom następujące polecenie:

linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -

W poprzednim poleceniu:

  • linkerd install generuje manifest Kubernetes z niezbędnymi zasobami płaszczyzny sterowania.
  • Wygenerowany manifest jest przekazywany do kubectl apply, który instaluje te zasoby płaszczyzny sterowania w klastrze Kubernetes.

Pierwszy wiersz danych wyjściowych pokazuje, że płaszczyzna sterowania została zainstalowana we własnej przestrzeni nazw linkerd. Pozostałe dane wyjściowe reprezentują tworzone obiekty.

namespace/linkerd created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-identity created
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-identity created
serviceaccount/linkerd-identity created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-controller created

Zwaliduj wdrożenie Linkerd

Uruchom następujące polecenie:

linkerd check

Poprzednie polecenie analizuje konfiguracje Linkerd CLI i płaszczyzny sterowania. Jeśli Linkerd jest poprawnie skonfigurowany, zostanie wyświetlony następujący wynik:

kubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes API

kubernetes-version
------------------
√ is running the minimum Kubernetes API version
√ is running the minimum kubectl version

linkerd-existence
-----------------
√ 'linkerd-config' config map exists
√ heartbeat ServiceAccount exist
√ control plane replica sets are ready
√ no unschedulable pods
√ controller pod is running
√ can initialize the client
√ can query the control plane API

linkerd-config
--------------
√ control plane Namespace exists
√ control plane ClusterRoles exist
√ control plane ClusterRoleBindings exist
√ control plane ServiceAccounts exist
√ control plane CustomResourceDefinitions exist
√ control plane MutatingWebhookConfigurations exist
√ control plane ValidatingWebhookConfigurations exist
√ control plane PodSecurityPolicies exist

linkerd-identity
----------------
√ certificate config is valid
√ trust anchors are using supported crypto algorithm
√ trust anchors are within their validity period
√ trust anchors are valid for at least 60 days
√ issuer cert is using supported crypto algorithm
√ issuer cert is within its validity period
√ issuer cert is valid for at least 60 days
√ issuer cert is issued by the trust anchor

linkerd-api
-----------
√ control plane pods are ready
√ control plane self-check
√ [kubernetes] control plane can talk to Kubernetes
√ [prometheus] control plane can talk to Prometheus
√ tap api service is running

linkerd-version
---------------
√ can determine the latest version
√ CLI is up to date

control-plane-version
---------------------
√ control plane is up to date
√ control plane and CLI versions match

linkerd-addons
--------------
√ 'linkerd-config-addons' config map exists

linkerd-grafana
---------------
√ grafana add-on service account exists
√ grafana add-on config map exists
√ grafana pod is running

Status check results are √

Napiwek

Aby wyświetlić listę składników zainstalowanych dla Linkerd, uruchom następujące polecenie: kubectl -n linkerd get deploy

Skonfiguruj aplikację do korzystania z Linkerd

Linkerd jest zainstalowany, ale nie jest skonfigurowany. Zachowanie aplikacji pozostaje niezmienione.

Linkerd nie zna wewnętrznych mechanizmów usług i nie może określić, czy należy ponowić próbę żądania, które zakończyło się niepowodzeniem. Na przykład złym pomysłem byłoby ponowne wysłanie nieudanego żądania HTTP POST w przypadku płatności. Z tego powodu konieczny jest profil usługi . Profil usługi to niestandardowy zasób Kubernetes, który definiuje trasy dla usługi. Umożliwia również funkcje dla poszczególnych tras, takie jak ponawianie prób i limity czasu. Linkerd ponawia próby tylko dla tras skonfigurowanych w manifeście profilu usługi.

Dla zwięzłości, zaimplementuj Linkerd tylko na agregatorze i usługach kuponowych. Aby zaimplementować usługę Linkerd dla tych dwóch usług, wykonasz następujące kroki:

  • Zmodyfikuj wdrożenia eShop, aby Linkerd tworzył kontener proxy w zasobnikach.
  • Aby skonfigurować ponawianie prób na trasie usługi kuponowej, dodaj do klastra obiekt profilu usługi.

Modyfikowanie wdrożeń eShop

Usługi muszą być skonfigurowane do używania kontenerów proxy Linkerd.

  1. Dodaj adnotację linkerd.io/inject: enabled do pliku backend-deploy.yml w obszarze metadanych szablonu.

      template:
        metadata:
          annotations:
            linkerd.io/inject: enabled
          labels: 
    
  2. Dodaj adnotację linkerd.io/inject: enabled do pliku frontend-deploy.yml w tym samym miejscu.

  3. Zaktualizuj wdrożenia w klastrze Kubernetes:

    kubectl apply -f backend-deploy.yml,frontend-deploy.yml
    

Zastosuj profil usługi Linkerd dla usługi produktowej

Manifest profilu usługi dla usługi produktu to:

apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
  name: backend
  namespace: default
spec:
  routes:
  - condition:
      method: GET
      pathRegex: /api/Product
    name: GET /v1/products
    isRetryable: true
  retryBudget:
    retryRatio: 0.2
    minRetriesPerSecond: 10
    ttl: 120s

Poprzedni manifest jest skonfigurowany tak:

  • Dowolna idempotentna trasa HTTP GET zgodna ze wzorcem /api/Product można ponownie spróbować.
  • Ponowne próby mogą dodać nie więcej niż dodatkowe 20 procent do obciążenia żądania, a kolejne 10 "bezpłatnych" ponownych prób na sekundę.

Uruchom następujące polecenie, aby użyć profilu usługi w klastrze Kubernetes:

kubectl apply -f - <<EOF
apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
  name: backend
  namespace: default
spec:
  routes:
  - condition:
      method: GET
      pathRegex: /api/Product
    name: GET /v1/products 
    isRetryable: true
  retryBudget:
    retryRatio: 0.2
    minRetriesPerSecond: 10
    ttl: 120s  
EOF

Zostanie wyświetlone następujące dane wyjściowe:

serviceprofile.linkerd.io/backend created

Instalacja monitorowania na Service Mesh

Linkerd ma rozszerzenia, które zapewniają dodatkowe funkcje. Zainstaluj rozszerzenie viz i wyświetl stan aplikacji na pulpicie nawigacyjnym Linkerd.

  1. W terminalu uruchom następujące polecenie, aby zainstalować rozszerzenie:

    linkerd viz install | kubectl apply -f -
    
  2. Wyświetl pulpit nawigacyjny za pomocą tego polecenia:

    linkerd viz dashboard
    

    Przejdź do karty PORTY, aby zobaczyć nowy przekierowany port z procesem działającego linkerd viz dashboard . Wybierz Otwórz w przeglądarce, aby otworzyć pulpit nawigacyjny.

  3. Na panelu Linkerd wybierz pozycję Przestrzenie nazw.

  4. W obszarze Metryki HTTP wybierz domyślne.

    Zrzut ekranu przedstawiający dashboard Linkerd z frontendem i backendem.

Testowanie odporności Linkerd

Po ponownym rozmieszczeniu kontenerów w dobrej kondycji wykonaj następujące kroki, aby przetestować zachowanie aplikacji za pomocą Linkerd:

  1. Sprawdź stan uruchomionych podów za pomocą tego polecenia:

    kubectl get pods --all-namespaces
    
  2. Zatrzymaj wszystkie zasobniki usługi produktu:

    kubectl scale deployment productsbackend --replicas=0
    
  3. Przejdź do aplikacji internetowej eShop i spróbuj wyświetlić produkty. Występuje opóźnienie do momentu, gdy zostanie wyświetlony komunikat o błędzie, "Wystąpił problem podczas ładowania naszych produktów. Spróbuj ponownie później".

  4. Uruchom ponownie zasobniki usługi produktu:

    kubectl scale deployment productsbackend --replicas=1
    
  5. Aplikacja powinna teraz wyświetlać produkty.

Linkerd stosuje inne podejście do odporności niż to, które widziałeś w przypadku odporności opartej na kodzie. Linkerd przezroczysto ponowił operację wiele razy w szybkim tempie. Aplikacja nie musi zostać zmieniona, aby obsługiwać to zachowanie.

Dodatkowe informacje

Aby uzyskać więcej informacji na temat konfiguracji konsolidatora Linkerd, zobacz następujące zasoby: