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. Budete:

  • Znovu nasaďte aplikaci bez odolnosti do Kubernetes.
  • Nasaďte Linkerd v clusteru Kubernetes.
  • Nakonfigurujte aplikaci tak, aby používala Linkerd pro zajištění odolnosti.
  • Prozkoumejte chování aplikace pomocí Linkerdu.

Opětovné nasazení aplikace

Před použitím linkerdu vraťte aplikaci do stavu před přidáním odolnosti na základě 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ý kontejner potřebuje mít nainstalované 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 uživatelské definice prostředků (CRD):

linkerd install --crds | kubectl apply -f -

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

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

V předchozím příkazu:

  • linkerd install generuje manifest pro Kubernetes s potřebnými prostředky pro řídicí část.
  • Vygenerovaný manifest se předá do kubectl apply, který tyto prostředky řídicí roviny nainstaluje do clusteru Kubernetes.

První řádek výstupu ukazuje, že řídicí vrstva byla nainstalována 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ěřte nasazení Linkerd

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

linkerd check

Předchozí příkaz analyzuje konfigurace rozhraní příkazového řádku Linkerd a řídicí roviny. Pokud je 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 √

Spropitné

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

Konfigurace aplikace pro použití Linkerd

Linkerd je nasazený, ale není nakonfigurovaný. Chování aplikace se nezmění.

Linkerd neví o interních službách a nemůže určit, jestli je vhodné opakovat neúspěšný požadavek. Například by bylo špatně zkusit opakovat neúspěšný HTTP POST pro platbu. Z tohoto důvodu je nutný profil služby . Profil služby je vlastní prostředek Kubernetes, který definuje trasy pro službu. Umožňuje také funkce pro jednotlivé trasy, jako jsou znovu pokusy a vypršení časových limitů. 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. Pokud chcete implementovat Linkerd pro tyto dvě služby, budete:

  • 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:

  • Každou idempotentní trasu HTTP GET odpovídající vzoru /api/Product je možné opakovat.
  • Opakování může přidat do zatížení požadavku maximálně 20 procent navíc, plus dalších 10 "bezplatný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

Zobrazí 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 abyste viděli nový port přeposlaný procesem linkerd viz dashboard běžícím. 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í.

    Snímek obrazovky zobrazující řídicí panel Linkerd s front-endem i back-endem

Testování odolnosti linkerdu

Jakmile jsou znovu nasazené kontejnery v pořádku, pomocí následujících kroků otestujte chování aplikace pomocí Linkerdu:

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

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

    kubectl scale deployment productsbackend --replicas=0
    
  3. Přejděte do webové aplikace eShop a zkuste zobrazit produkty. Zpráva o chybě byla zpožděna: "Při načítání našich produktů došlo k potížím. Zkuste to prosím znovu později."

  4. Restartujte pody pro služby 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. Linkerd automaticky opakoval operaci několikrát v rychlém sledu. 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í: