Cvičení – implementace odolnosti infrastruktury pomocí Kubernetes

Dokončeno

V předchozí lekci jste implementovali odolnost přidáním kódu pro zpracování selhání pomocí nativního rozšíření odolnosti .NET. Tato změna se ale vztahuje pouze na službu, kterou jste změnili. Aktualizace velké aplikace s mnoha službami by byla netriviální.

Místo použití odolnosti založené na kódu tato lekce používá přístup označovaný jako odolnost založená na infrastruktuře, která pokrývá celou aplikaci. V této lekci:

  • Znovu nasaďte aplikaci bez odolnosti do Kubernetes.
  • Nasaďte Linkerd v clusteru Kubernetes.
  • Konfigurace aplikace na používání řešení Linkerd kvůli odolnosti
  • Prozkoumání chování aplikace s řešením Linkerd

Opětovné nasazení aplikace

Před použitím řešení Linkerd vraťte aplikaci do stavu, v jakém byla před přidáním odolnosti založené na kódu. Pokud se chcete vrátit zpět, postupujte takto:

  1. Na dolním panelu vyberte kartu TERMINÁL a spuštěním následujících příkazů Gitu vraťte provedené změny zpět:

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

Instalace Kubernetes

V codespace nainstalujte Kubernetes a k3d. k3d je nástroj, který na místním počítači spouští cluster Kubernetes s jedním uzlem v rámci virtuálního počítače. Je užitečné pro místní testování nasazení Kubernetes a funguje dobře v prostředí codespace.

Spuštěním těchto příkazů nainstalujte Kubernetes a 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

Nasazení služeb eShop do Docker Hubu

Místní image vašich služeb, které vytvoříte, musí být hostované v registru kontejneru, aby bylo možné nasadit do Kubernetes. V této lekci jako registr kontejneru použijete Docker Hub.

Spuštěním těchto příkazů nasdílejte image do Docker Hubu:

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

Převod souboru docker-compose na manifesty Kubernetes

V tuto chvíli definujete, jak aplikace běží v Dockeru. Kubernetes používá k definování způsobu spouštění aplikace jiný formát. Pomocí nástroje s názvem Kompose můžete převést soubor docker-compose na manifesty Kubernetes.

  1. Tyto soubory musíte upravit tak, aby používaly image, které jste odeslali do Docker Hubu.

  2. V codespace otevřete soubor backend-deploy.yml.

  3. Změňte tento řádek:

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

    Zástupný symbol [VAŠE UŽIVATELSKÉ JMÉNO DOCKERU] nahraďte skutečným uživatelským jménem Dockeru.

  4. Tento postup opakujte pro soubor frontend-deploy.yml .

  5. Změňte tento řádek:

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

    Zástupný symbol [VAŠE UŽIVATELSKÉ JMÉNO DOCKERU] nahraďte skutečným uživatelským jménem Dockeru.

  6. Nasazení aplikace eShop do Kubernetes:

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

    Měl by se zobrazit výstup podobný následujícím zprávům:

    deployment.apps/productsbackend created
    service/productsbackend created
    deployment.apps/storefrontend created
    service/storefrontend created
    
  7. Zkontrolujte, že jsou spuštěné všechny služby:

    kubectl get pods
    

    Měl by se zobrazit výstup podobný následujícím zprávům:

    NAME                        READY   STATUS    RESTARTS   AGE
    backend-66f5657758-5gnkw    1/1     Running   0          20s
    frontend-5c9d8dbf5f-tp456   1/1     Running   0          20s
    
  8. Přepněte na kartu PORTY, abyste zobrazili eShop spuštěný v Kubernetes, vyberte ikonu zeměkoule vedle portu Front End (32000).

Instalace linkerdu

Vývojového kontejneru je potřeba nainstalovat rozhraní příkazového řádku Linkerd. Spuštěním následujícího příkazu potvrďte, že jsou splněné požadavky linkerdu:

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

Zobrazí se varianta následujícího výstupu:

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 √

Nasazení linkerdu do Kubernetes

Nejprve spuštěním následujícího příkazu nainstalujte vlastní definice prostředků (CRD):

linkerd install --crds | kubectl apply -f -

Potom spusťte následující příkaz:

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

V předcházejícím příkazu:

  • linkerd install generuje manifest Kubernetes s nezbytnými prostředky řídicí roviny.
  • Vygenerovaný manifest se předá do kubectl applykanálu , který tyto prostředky řídicí roviny nainstaluje do clusteru Kubernetes.

První řádek výstupu ukazuje, že se řídicí rovina nainstalovala ve svém vlastním oboru názvů linkerd. Zbývající výstup představuje vytvářené objekty.

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

Ověření nasazení řešení Linkerd

Spusťte následující příkaz:

linkerd check

Předchozí příkaz analyzuje konfigurace Linkerd CLI a řídicí roviny. Pokud je řešení Linkerd správně nakonfigurované, zobrazí se následující výstup:

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 √

Tip

Pokud chcete zobrazit seznam nainstalovaných komponent Linkerd, spusťte tento příkaz: kubectl -n linkerd get deploy

Konfigurace aplikace na používání řešení Linkerd

Linkerd je nasazený, ale není nakonfigurovaný. Chování aplikace je beze změny.

Řešení Linkerd nemá přehled o vnitřních operacích služby a nemůže určit, jestli je vhodné neúspěšný požadavek opakovat. Špatným nápadem by například bylo opakování neúspěšného požadavku HTTP POST pro platbu. Z tohoto důvodu je potřeba profil služby. Profil služby je vlastní prostředek Kubernetes, který definuje trasy pro službu. Umožňuje také funkce jednotlivých tras, jako jsou například opakování a časové limity. Linkerd opakuje pouze trasy nakonfigurované v manifestu profilu služby.

Pro stručnost implementujte Linkerd pouze v agregátoru a kuponových službách. Abyste mohli implementovat Linkerd pro tyto dvě služby, budete muset:

  • Upravte nasazení eShopu tak, aby Linkerd v podech vytvořil svůj proxy kontejner.
  • Pokud chcete nakonfigurovat opakování na trase kuponové služby, přidejte do clusteru objekt profilu služby.

Úprava nasazení eShopu

Služby musí být nakonfigurované tak, aby používaly kontejnery proxy serveru Linkerd.

  1. Přidejte poznámku linkerd.io/inject: enabled do souboru backend-deploy.yml v metadatech šablony.

      template:
        metadata:
          annotations:
            linkerd.io/inject: enabled
          labels: 
    
  2. Přidejte poznámku linkerd.io/inject: enabled do souboru frontend-deploy.yml na stejném místě.

  3. Aktualizujte nasazení v clusteru Kubernetes:

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

Použití profilu služby Linkerd pro produktovou službu

Manifest profilu služby pro produktovou službu je:

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

Předchozí manifest je nakonfigurovaný takto:

  • Bylo možné opakovat všechny idempotentní trasy HTTP GET, které odpovídají vzoru /api/Product.
  • Opakování může do zatížení požadavku přidat maximálně 20 procent navíc a dalších 10 "volných" opakování za sekundu.

Spuštěním následujícího příkazu použijte profil služby v clusteru 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

Objeví se následující výstup:

serviceprofile.linkerd.io/backend created

Instalace monitorování v síti služeb

Linkerd nabízí rozšíření, která vám poskytnou další funkce. Nainstalujte rozšíření viz a zobrazte stav aplikace na řídicím panelu Linkerdu.

  1. V terminálu spusťte tento příkaz a nainstalujte rozšíření:

    linkerd viz install | kubectl apply -f -
    
  2. Zobrazte řídicí panel pomocí tohoto příkazu:

    linkerd viz dashboard
    

    Přejděte na kartu PORTY a zobrazte nový port přeposlaný procesem řídicího panelu linkerd viz. Výběrem možnosti Otevřít v prohlížeči otevřete řídicí panel.

  3. Na řídicím panelu Linkerd vyberte Obory názvů.

  4. V části Metriky HTTP vyberte výchozí.

    Screenshot showing the Linkerd dashboard with both the frontend and backend.

Testování odolnosti řešení Linkerd

Jakmile budou opětovně nasazené kontejnery ve správném stavu, použijte následující postup k otestování chování aplikace s řešením Linkerd:

  1. Pomocí tohoto příkazu zkontrolujte stav spuštěných podů:

    kubectl get pods --all-namespaces
    
  2. Zastavte všechny pody služeb produktů:

    kubectl scale deployment productsbackend --replicas=0
    
  3. Přejděte do webové aplikace eShop a zkuste zobrazit produkty. Do chybové zprávy došlo ke zpoždění, že při načítání našich produktů došlo k potížím. Zkuste to prosím znovu později."

  4. Restartujte pody služeb produktů:

    kubectl scale deployment productsbackend --replicas=1
    
  5. Aplikace by teď měla zobrazit produkty.

Linkerd se řídí jiným přístupem k odolnosti, než jakou jste viděli s odolností založenou na kódu. Řešení Linkerd transparentně opakovalo operaci několikrát rychle za sebou. Aby bylo možné toto chování podporovat, nemusí být aplikace změněna.

Další informace

Další informace o konfiguraci Linkerd najdete v následujících zdrojích informací: