Cvičení – implementace odolnosti infrastruktury pomocí Kubernetes
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:
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.
Tyto soubory musíte upravit tak, aby používaly image, které jste odeslali do Docker Hubu.
V codespace otevřete soubor backend-deploy.yml.
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.
Tento postup opakujte pro soubor frontend-deploy.yml .
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.
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
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
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 apply
kaná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.
Přidejte poznámku
linkerd.io/inject: enabled
do souboru backend-deploy.yml v metadatech šablony.template: metadata: annotations: linkerd.io/inject: enabled labels:
Přidejte poznámku
linkerd.io/inject: enabled
do souboru frontend-deploy.yml na stejném místě.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.
V terminálu spusťte tento příkaz a nainstalujte rozšíření:
linkerd viz install | kubectl apply -f -
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.
Na řídicím panelu Linkerd vyberte Obory názvů.
V části Metriky HTTP vyberte výchozí.
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:
Pomocí tohoto příkazu zkontrolujte stav spuštěných podů:
kubectl get pods --all-namespaces
Zastavte všechny pody služeb produktů:
kubectl scale deployment productsbackend --replicas=0
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."
Restartujte pody služeb produktů:
kubectl scale deployment productsbackend --replicas=1
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í:
- Konfigurace opakování – dokumentace ke službě Linkerd
- Konfigurace časových limitů – dokumentace linkerdu
- How we designed retries in Linkerd 2.2 (Jak jsme navrhli opakování ve službě Linkerd 2.2) – blog Linkerd