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. 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:
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ý 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.
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:
- 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.
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 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.
Na řídicím panelu Linkerd vyberte Obory názvů.
V části Metriky HTTP vyberte výchozí.
Testování odolnosti linkerdu
Jakmile jsou znovu nasazené kontejnery v pořádku, pomocí následujících kroků otestujte chování aplikace pomocí Linkerdu:
Pomocí tohoto příkazu zkontrolujte stav spuštěných podů:
kubectl get pods --all-namespaces
Zastavte všechny instance služeb produktů:
kubectl scale deployment productsbackend --replicas=0
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."
Restartujte pody pro služby 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. 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í: