Dela via


Kubernetes-hosting

Kubernetes är ett populärt val för att vara värd för Orleans program. Orleans kommer att köras i Kubernetes utan specifik konfiguration, men det kan också dra nytta av extra kunskap som värdplattformen kan ge.

Microsoft.Orleans.Hosting.Kubernetes-paketet lägger till integrering för värd för ett Orleans-program i ett Kubernetes-kluster. Paketet innehåller en tilläggsmetod, UseKubernetesHosting, som utför följande åtgärder:

Observera att Kubernetes-värdpaketet inte använder Kubernetes för klustring. För klustring behövs fortfarande en separat klusterprovider. Mer information om hur du konfigurerar kluster finns i dokumentationen Server-konfiguration.

Den här funktionen ställer vissa krav på hur tjänsten distribueras:

  • Silonamn måste matcha poddnamn.
  • Poddarna måste ha etiketterna orleans/serviceId och orleans/clusterId som motsvarar silons ServiceId och ClusterId. Metoden ovan sprider dessa etiketter till motsvarande alternativ i Orleans från miljövariabler.
  • Poddar måste ha följande miljövariabler inställda: POD_NAME, POD_NAMESPACE, POD_IP, ORLEANS_SERVICE_ID, ORLEANS_CLUSTER_ID.

I följande exempel visas hur du konfigurerar dessa etiketter och miljövariabler korrekt:

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

För RBAC-aktiverade kluster kan Kubernetes-tjänstkontot för poddarna också behöva beviljas den åtkomst som krävs:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: orleans-hosting
rules:
- apiGroups: [ "" ]
  resources: ["pods"]
  verbs: ["get", "watch", "list", "delete", "patch"]
---
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: ''

Liveness-, readiness- och startup-prober

Kubernetes kan undersöka poddar för att fastställa hälsan hos en tjänst. Mer information finns i Konfigurera liveness, beredskap och startkontroller i dokumentationen för Kubernetes.

Orleans använder ett protokoll för klustermedlemskap för att snabbt identifiera och återställa från en process eller ett nätverksfel. Varje nod övervakar en delmängd av andra noder och skickar periodiska sonder. Om en nod inte svarar på flera på varandra följande avsökningar från flera andra noder kommer den att tas bort med tvång från klustret. När en misslyckad nod får reda på att den har tagits bort avslutas den omedelbart. Kubernetes startar om den avslutade processen och försöker ansluta till klustret igen.

Kubernetes prober kan hjälpa till att avgöra om en process i en pod körs och inte har fastnat i ett zombietillstånd. prober verifierar inte anslutning mellan poddar eller responsivitet och utför inga funktionalitetskontroller på applikationsnivå. Om en podd inte svarar på en liveness-avsökning kan Kubernetes så småningom avsluta podden och schemalägga om den. Kubernetes avsökningar och Orleansavsökningar kompletterar därför varandra.

Den rekommenderade metoden är att konfigurera Liveness-avsökningar i Kubernetes som utför en enkel lokal kontroll av att programmet fungerar som avsett. Dessa sonder kan avbryta processen vid en total frysning, till exempel till följd av en körningsstörning eller en annan osannolik händelse.

Resurskvoter

Kubernetes fungerar tillsammans med operativsystemet för att implementera resurskvoter. Detta gör att processor- och minnesreservationer och/eller gränser kan tillämpas. För ett primärt program som hanterar interaktiv belastning rekommenderar vi att du inte implementerar restriktiva gränser om det inte behövs. Det är viktigt att notera att begäranden och gränser skiljer sig avsevärt åt i deras betydelse och var de implementeras. Innan du anger begäranden eller begränsningar tar du dig tid att få en detaljerad förståelse för hur de implementeras och tillämpas. Minnet kanske till exempel inte mäts jämnt mellan Kubernetes, Linux-kerneln och ditt övervakningssystem. CPU-kvoter kanske inte tillämpas på det sätt som du förväntar dig.

Felsökning

Poddar kraschar och klagar på att KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined

Fullständigt undantagsmeddelande:

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()
  • Kontrollera att miljövariablerna KUBERNETES_SERVICE_HOST och KUBERNETES_SERVICE_PORT har satts inuti din Pod. Du kan kontrollera genom att köra följande kommando kubectl exec -it <pod_name> /bin/bash -c env.
  • Se till att automountServiceAccountToken inställt på sant på Kubernetes-deployment.yaml. Mer information finns i Konfigurera tjänstkonton för poddar.