Kubernetes-üzemeltetés

A Kubernetes népszerű választás alkalmazások üzemeltetéséhez Orleans . Orleans a Kubernetesben konkrét konfiguráció nélkül fog futni, azonban az üzemeltetési platform által biztosított további ismereteket is kihasználhatja.

A Microsoft.Orleans.Hosting.Kubernetes csomag integrációt biztosít egy Orleans alkalmazás Kubernetes-fürtön való üzemeltetéséhez. A csomag egy bővítménymetódust biztosít, UseKubernetesHostingamely a következő műveleteket hajtja végre:

Vegye figyelembe, hogy a Kubernetes üzemeltetési csomagja nem használja a Kubernetes-t a fürtözéshez. A fürtözéshez továbbra is külön fürtszolgáltatóra van szükség. A fürtözés konfigurálásával kapcsolatos további információkért tekintse meg a kiszolgáló konfigurációs dokumentációját.

Ez a funkció bizonyos követelményeket támaszt a szolgáltatás üzembe helyezésének módjával kapcsolatban:

  • A silóneveknek egyeznie kell a podok nevével.
  • A podoknak olyan orleans/serviceId címkével orleans/clusterId kell rendelkezniük, amely megfelel a silóénak ServiceId és ClusterIda . A fent említett módszer ezeket a címkéket a környezeti változók megfelelő beállításaiba Orleans propagálja.
  • A podoknak a következő környezeti változókkal kell rendelkezniük: , , , , ORLEANS_CLUSTER_IDORLEANS_SERVICE_ID. POD_IPPOD_NAMESPACEPOD_NAME

Az alábbi példa bemutatja, hogyan konfigurálhatja helyesen ezeket a címkéket és környezeti változókat:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dictionary-app
  labels:
    orleans/serviceId: dictionary-app
spec:
  selector:
    matchLabels:
      orleans/serviceId: dictionary-app
  replicas: 3
  template:
    metadata:
      labels:
        # This label is used to identify the service to Orleans
        orleans/serviceId: dictionary-app

        # This label is used to identify an instance of a cluster to Orleans.
        # Typically, this will be the same value as the previous label, or any
        # fixed value.
        # In cases where you are not using rolling deployments (for example,
        # blue/green deployments),
        # this value can allow for distinct clusters which do not communicate
        # directly with each others,
        # but which still share the same storage and other resources.
        orleans/clusterId: dictionary-app
    spec:
      containers:
        - name: main
          image: my-registry.azurecr.io/my-image
          imagePullPolicy: Always
          ports:
          # Define the ports which Orleans uses
          - containerPort: 11111
          - containerPort: 30000
          env:
          # The Azure Storage connection string for clustering is injected as an
          # environment variable
          # It must be created separately using a command such as:
          # > kubectl create secret generic az-storage-acct `
          #     --from-file=key=./az-storage-acct.txt
          - name: STORAGE_CONNECTION_STRING
            valueFrom:
              secretKeyRef:
                name: az-storage-acct
                key: key
          # Configure settings to let Orleans know which cluster it belongs to
          # and which pod it is running in
          - name: ORLEANS_SERVICE_ID
            valueFrom:
              fieldRef:
                fieldPath: metadata.labels['orleans/serviceId']
          - name: ORLEANS_CLUSTER_ID
            valueFrom:
              fieldRef:
                fieldPath: metadata.labels['orleans/clusterId']
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: DOTNET_SHUTDOWNTIMEOUTSECONDS
            value: "120"
          request:
            # Set resource requests
      terminationGracePeriodSeconds: 180
      imagePullSecrets:
        - name: my-image-pull-secret
  minReadySeconds: 60
  strategy:
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1

Az RBAC-kompatibilis fürtök esetében előfordulhat, hogy a podok Kubernetes-szolgáltatásfiókjának is rendelkeznie kell a szükséges hozzáféréssel:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: orleans-hosting
rules:
- apiGroups: [ "" ]
  resources: ["pods"]
  verbs: ["get", "watch", "list", "delete"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: orleans-hosting-binding
subjects:
- kind: ServiceAccount
  name: default
  apiGroup: ''
roleRef:
  kind: Role
  name: orleans-hosting
  apiGroup: ''

Élesség, felkészültség és indítási mintavételek

A Kubernetes mintavételt végezhet a podokon a szolgáltatás állapotának meghatározásához. További információt a Kubernetes dokumentációjában az élőség, a készültség és az indítási mintavételek konfigurálása című témakörben talál.

Orleans Fürttagsági protokollt használ a folyamat vagy hálózati hibák azonnali észleléséhez és helyreállításához. Minden csomópont figyeli a többi csomópont egy részét, és rendszeres mintavételeket küld. Ha egy csomópont nem válaszol több egymást követő mintavételre több másik csomópontról, akkor a rendszer kényszerítetten eltávolítja azt a fürtből. Miután egy sikertelen csomópont megtudja, hogy eltávolították, azonnal leáll. A Kubernetes újraindítja a leállított folyamatot, és megkísérli újracsatlakozni a fürtöt.

A Kubernetes mintavételei segíthetnek annak meghatározásában, hogy egy podban lévő folyamat fut-e, és nem ragadt-e zombi állapotban. a mintavételek nem ellenőrzik a podok közötti kapcsolatot vagy a válaszképességet, és nem végeznek alkalmazásszintű funkcióellenőrzéseket. Ha egy pod nem tud válaszolni egy élőségi mintavételre, akkor a Kubernetes végül leállíthatja a podot, és átütemezheti azt. A Kubernetes mintavételei és Orleansmintavételei ezért egymást kiegészítőek.

Az ajánlott módszer a Kubernetes liveness-mintavételeinek konfigurálása, amelyek egyszerű, csak helyi ellenőrzéssel ellenőrzik, hogy az alkalmazás a kívánt módon működik-e. Ezek a mintavételek a folyamat leállítására szolgálnak, ha például futásidejű hiba vagy más valószínűtlen esemény miatt teljes lefagyás történik.

Erőforráskvóták

A Kubernetes az operációs rendszerrel együttműködve valósítja meg az erőforráskvótákat. Ez lehetővé teszi a processzor- és memóriafoglalások és/vagy korlátok kényszerítását. Az interaktív terhelést kiszolgáló elsődleges alkalmazások esetében javasoljuk, hogy szükség esetén ne alkalmazzanak korlátozó korlátozásokat. Fontos megjegyezni, hogy a kérelmek és a korlátok lényegileg eltérnek jelentésükben és megvalósításuk helyén. A kérelmek vagy korlátok beállítása előtt szánjon időt a végrehajtásuk és érvényre juttatásuk részletes megismerésére. Előfordulhat például, hogy a memória nem mérhető egységesen a Kubernetes, a Linux kernel és a monitorozási rendszer között. Előfordulhat, hogy a cpu-kvóták nem a várt módon lesznek érvényesítve.

Hibaelhárítás

Podok összeomlanak, panaszkodnak, hogy KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined

Teljes kivételüzenet:

Unhandled exception. k8s.Exceptions.KubeConfigException: unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined
at k8s.KubernetesClientConfiguration.InClusterConfig()
  • Ellenőrizze, hogy a KUBERNETES_SERVICE_HOST környezeti változók és KUBERNETES_SERVICE_PORT a környezeti változók be vannak-e állítva a podon belül. Az ellenőrzést a következő parancs végrehajtásával kubectl exec -it <pod_name> /bin/bash -c envvégezheti el.
  • Győződjön meg arról, hogy a automountServiceAccountToken Kubernetesen deployment.yamligaz értékre van állítva. További információ: Szolgáltatásfiókok konfigurálása podokhoz