Gyakorlat – Infrastruktúra rugalmasságának megvalósítása a Kubernetes használatával

Befejeződött

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:

  1. 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.

  1. Ezeket a fájlokat szerkesztenie kell a Docker Hubba leküldett képek használatához.

  2. A kódtérben nyissa meg a fájlt backend-deploy.yml.

  3. A sor módosítása:

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

    Cserélje le a helyőrzőt [SAJÁT DOCKER-FELHASZNÁLÓNEVE] a tényleges Docker-felhasználónévre.

  4. Ismételje meg ezeket a lépéseket a frontend-deploy.yml fájl esetében.

  5. A sor módosítása:

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

    Cserélje le a helyőrzőt [SAJÁT DOCKER-FELHASZNÁLÓNEVE] a tényleges Docker-felhasználónévre.

  6. Az eShop alkalmazás üzembe helyezése a Kubernetesben:

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

    A következő üzenetekhez hasonló kimenetnek kell megjelennie:

    deployment.apps/productsbackend created
    service/productsbackend created
    deployment.apps/storefrontend created
    service/storefrontend created
    
  7. Ellenőrizze, hogy az összes szolgáltatás fut-e:

    kubectl get pods
    

    A 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          20s
    
  8. Vá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 install lé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.

  1. Adja hozzá a linkerd.io/inject: enabled megjegyzést a backend-deploy.yml fájlhoz a sablon metaadatai alatt.

      template:
        metadata:
          annotations:
            linkerd.io/inject: enabled
          labels: 
    
  2. Adja hozzá a linkerd.io/inject: enabled széljegyzetet a frontend-deploy.yml fájlhoz ugyanazon a helyen.

  3. 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/Product megfelelő 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.

  1. A terminálban futtassa ezt a parancsot a bővítmény telepítéséhez:

    linkerd viz install | kubectl apply -f -
    
  2. Tekintse meg az irányítópultot a következő paranccsal:

    linkerd viz dashboard
    

    Lé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.

  3. A Linkerd irányítópulton válassza a Névterek lehetőséget.

  4. A HTTP-metrikák területen válassza az alapértelmezett beállítást.

    Képernyőkép a Linkerd irányítópultról az előtérben és a háttérrendszeren is.

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:

  1. Ellenőrizze a futó podok állapotát a következő paranccsal:

    kubectl get pods --all-namespaces
    
  2. Állítsa le az összes termékszolgáltatás-podot:

    kubectl scale deployment productsbackend --replicas=0
    
  3. Nyissa 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."

  4. Indítsa újra a termékszolgáltatási egységeket:

    kubectl scale deployment productsbackend --replicas=1
    
  5. Az 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: