Gyakorlat – Infrastruktúra rugalmasságának megvalósítása a Kubernetes használatával
Az előző leckében a rugalmasságot a .NET natív rugalmassági bővítményével hozzáadott hibakezelő kóddal implementálta. Ez a módosítás azonban csak a módosított szolgáltatásra vonatkozik. Egy nagy alkalmazás sok szolgáltatással való frissítése nem lenne egyszerű.
A kódalapú rugalmasság használata helyett ez az egység egy infrastruktúra-alapú rugalmasság nevű megközelítést használ, amely a teljes alkalmazást lefedi. Ezt fogja tenni:
- Helyezze újra az alkalmazást rugalmasság nélkül a Kubernetesbe.
- Telepítsd a Linkerdet a Kubernetes klaszteredben.
- Konfigurálja az alkalmazást úgy, hogy a Linkerdet használja a rugalmasság érdekében.
- Az alkalmazás viselkedésének megismerése a Linkerddel.
Az alkalmazás ismételt üzembe helyezése
A Linkerd alkalmazása előtt állítsa vissza az alkalmazást egy állapotba a kódalapú rugalmasság hozzáadása előtt. A visszaállításhoz kövesse az alábbi lépéseket:
Az alsó panelen válassza a TERMINÁL lapot, és futtassa a következő git-parancsokat a módosítások visszavonásához:
cd Store git checkout Program.cs git checkout Store.csproj cd .. dotnet publish /p:PublishProfile=DefaultContainer
A Kubernetes telepítése
A kódtérben telepítse a Kubernetes-t és a k3d-t. A k3d egy program, amely egy egycsomópontos Kubernetes-fürtöt futtat egy virtuális gépen belül a helyi számítógépen. Hasznos a Kubernetes-üzemelő példányok helyi teszteléséhez, és jól fut egy kódtérben.
Futtassa az alábbi parancsokat a Kubernetes és a MiniKube telepítéséhez:
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
Az eShop-szolgáltatások üzembe helyezése a Docker Hubon
A buildelt szolgáltatások helyi rendszerképeit egy tárolóregisztrációs adatbázisban kell üzemeltetni, hogy üzembe helyezhető legyen a Kubernetesben. Ebben az egységben a Docker Hubot használja konténer-regisztrációs tárként.
Futtassa az alábbi parancsokat a rendszerképek Docker Hubba való leküldéséhez:
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
A docker-compose fájl átalakítása Kubernetes-jegyzékekké
Jelenleg ön határozza meg, hogyan fut az alkalmazás a Dockerben. A Kubernetes más formátumot használ az alkalmazás működésének meghatározásához. A Kompose nevű eszközzel kubernetes-jegyzékfájllá alakíthatja a docker-compose fájlt.
Ezeket a fájlokat szerkesztenie kell a Docker Hubba leküldett képek használatához.
A kódtérben nyissa meg a fájlt backend-deploy.yml.
A sor módosítása:
containers: - image: [YOUR DOCKER USER NAME]/productservice:latestCserélje le a helyőrzőt [SAJÁT DOCKER-FELHASZNÁLÓNEVE] a tényleges Docker-felhasználónévre.
Ismételje meg ezeket a lépéseket a frontend-deploy.yml fájl esetében.
A sor módosítása:
containers: - name: storefrontend image: [YOUR DOCKER USER NAME]/storeimage:latestCserélje le a helyőrzőt [SAJÁT DOCKER-FELHASZNÁLÓNEVE] a tényleges Docker-felhasználónévre.
Az eShop alkalmazás üzembe helyezése a Kubernetesben:
kubectl apply -f backend-deploy.yml,frontend-deploy.ymlA következő üzenetekhez hasonló kimenetnek kell megjelennie:
deployment.apps/productsbackend created service/productsbackend created deployment.apps/storefrontend created service/storefrontend createdEllenőrizze, hogy az összes szolgáltatás fut-e:
kubectl get podsA következő üzenetekhez hasonló kimenetnek kell megjelennie:
NAME READY STATUS RESTARTS AGE backend-66f5657758-5gnkw 1/1 Running 0 20s frontend-5c9d8dbf5f-tp456 1/1 Running 0 20sVáltson a PORTS lapra, és a Kubernetesen futó eShop megtekintéséhez válassza az Előtér (32000) port melletti földgömb ikont.
A linkerd telepítése
A fejlesztői tárolónak telepítenie kell a Linkerd CLI-t. Futtassa a következő parancsot annak ellenőrzéséhez, hogy a Linkerd előfeltételei teljesülnek-e:
curl -sL run.linkerd.io/install | sh
export PATH=$PATH:/home/vscode/.linkerd2/bin
linkerd check --pre
Megjelenik a következő kimenet egy változata:
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 √
A Linkerd üzembe helyezése a Kubernetesben
Először futtassa a következő parancsot az egyéni erőforrás-definíciók (CRD-k) telepítéséhez:
linkerd install --crds | kubectl apply -f -
Ezután futtassa a következő parancsot:
linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
Az előző parancsban:
-
linkerd installlétrehoz egy Kubernetes-jegyzékfájlt a szükséges vezérlősík-erőforrásokkal. - A létrehozott jegyzék
kubectl apply-ba kerül továbbításra, amely telepíti a vezérlősík-erőforrásokat a Kubernetes-fürtben.
A kimenet első sora azt mutatja, hogy a vezérlősík a saját linkerd névterében lett telepítve. A fennmaradó kimenet a létrehozott objektumokat jelöli.
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
A Linkerd üzembe helyezésének ellenőrzése
Futtassa a következő parancsot:
linkerd check
Az előző parancs elemzi a Linkerd CLI és a vezérlősík konfigurációit. Ha a Linkerd megfelelően van konfigurálva, a következő kimenet jelenik meg:
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 √
Borravaló
A telepített Linkerd-összetevők listájának megtekintéséhez futtassa a következő parancsot: kubectl -n linkerd get deploy
Az alkalmazás konfigurálása a Linkerd használatára
A Linkerd üzembe van helyezve, de nincs konfigurálva. Az alkalmazás viselkedése nem változik.
A Linkerd nem tud a szolgáltatás belső funkcióiról, és nem tudja megállapítani, hogy helyénvaló-e újrapróbálkoznia egy sikertelen kérésnek. Például rossz ötlet lenne újrapróbálkozni egy sikertelen HTTP POST-tal egy fizetés esetén. Ezért szükség van egy szolgáltatásprofilra . A szolgáltatásprofil egy egyéni Kubernetes-erőforrás, amely a szolgáltatás útvonalait határozza meg. Emellett útvonalonkénti funkciókat is lehetővé tesz, például újrapróbálkozások és időtúllépések. A Linkerd csak a szolgáltatásprofil-jegyzékben konfigurált útvonalakat újrapróbálja.
A tömörség kedvéért implementálja a Linkerdet csak az aggregátoron és a kuponszolgáltatásokon. A Linkerd ezen két szolgáltatáshoz való implementálásához a következőt kell végrehajtania:
- Módosítsa az eShop deploymentokat úgy, hogy a Linkerd létrehozza a proxy konténert a podokban.
- Ha újrapróbálkozásokat szeretne konfigurálni a kuponszolgáltatás útvonalán, adjon hozzá egy szolgáltatásprofil-objektumot a fürthöz.
Az eShop telepítések módosítása
A szolgáltatásokat a Linkerd proxytárolók használatára kell konfigurálni.
Adja hozzá a
linkerd.io/inject: enabledmegjegyzést a backend-deploy.yml fájlhoz a sablon metaadatai alatt.template: metadata: annotations: linkerd.io/inject: enabled labels:Adja hozzá a
linkerd.io/inject: enabledszéljegyzetet a frontend-deploy.yml fájlhoz ugyanazon a helyen.Frissítse a telepítéseket a Kubernetes-fürtben:
kubectl apply -f backend-deploy.yml,frontend-deploy.yml
A Linkerd szolgáltatásprofil alkalmazása a termékszolgáltatáshoz
A termékszolgáltatás szolgáltatásprofil-jegyzékfájlja a következő:
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
Az előző jegyzékfájl a következőre van konfigurálva:
- A minta
/api/Productmegfelelő idempotens HTTP GET-útvonal újrapróbálkozható. - Az újrapróbálkozások legfeljebb 20 százalékot adhatnak hozzá a kérelembetöltéshez, valamint másodpercenként további 10 "ingyenes" újrapróbálkozási lehetőséget.
Futtassa a következő parancsot a Kubernetes-fürt szolgáltatásprofiljának használatához:
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
A következő kimenet jelenik meg:
serviceprofile.linkerd.io/backend created
Figyelés telepítése a szolgáltatáshálón
A Linkerd bővítményekkel rendelkezik, amelyek további funkciókat biztosítanak. Telepítse a viz bővítményt, és tekintse meg az alkalmazás állapotát a Linkerd irányítópultján.
A terminálban futtassa ezt a parancsot a bővítmény telepítéséhez:
linkerd viz install | kubectl apply -f -Tekintse meg az irányítópultot a következő paranccsal:
linkerd viz dashboardLépjen a PORTOK lapra, és tekintsen meg egy új portot, amelyet a „linkerd viz dashboard” folyamat továbbít. Válassza a Megnyitás böngészőben lehetőséget az irányítópult megnyitásához.
A Linkerd irányítópulton válassza a Névterek lehetőséget.
A HTTP-metrikák területen válassza az alapértelmezett beállítást.
A Linkerd rugalmasságának tesztelése
Miután az újra üzembe helyezett tárolók kifogástalan állapotban vannak, az alábbi lépésekkel tesztelje az alkalmazás viselkedését a Linkerddel:
Ellenőrizze a futó podok állapotát a következő paranccsal:
kubectl get pods --all-namespacesÁllítsa le az összes termékszolgáltatás-podot:
kubectl scale deployment productsbackend --replicas=0Nyissa meg az eShop webalkalmazást, és próbálja meg megtekinteni a termékeket. A "Probléma merült fel a termékek betöltésekor" hibaüzenetig eltelt idő. Próbálkozzon újra később."
Indítsa újra a termékszolgáltatási egységeket:
kubectl scale deployment productsbackend --replicas=1Az alkalmazásnak ekkor meg kell jelenítenie a termékeket.
A Linkerd a rugalmasság más megközelítését követi, mint amit a kódalapú rugalmassággal látott. A Linkerd gyorsan egymás után többször is újrapróbálkozott a művelettel. Az alkalmazást nem kellett módosítani a viselkedés támogatásához.
További információk
A Linkerd konfigurációjáról a következő forrásokban talál további információt: