Hosting platformy Kubernetes
Platforma Kubernetes jest popularnym wyborem do hostowania Orleans aplikacji. Orleans Będzie działać na platformie Kubernetes bez określonej konfiguracji, ale może również skorzystać z dodatkowej wiedzy, którą może zapewnić platforma hostingu.
Pakiet Microsoft.Orleans.Hosting.Kubernetes
dodaje integrację do hostowania Orleans aplikacji w klastrze Kubernetes. Pakiet udostępnia metodę rozszerzenia , UseKubernetesHostingktóra wykonuje następujące akcje:
- SiloOptions.SiloName jest ustawiona na nazwę zasobnika.
- EndpointOptions.AdvertisedIPAddress jest ustawiona na adres IP zasobnika.
- EndpointOptions.SiloListeningEndpoint I EndpointOptions.GatewayListeningEndpoint są skonfigurowane do nasłuchiwania na dowolnym adresie ze skonfigurowanymi SiloPort elementami i GatewayPort. Wartości portów domyślnych
11111
i30000
są używane, jeśli żadne wartości nie są ustawiane jawnie). - ClusterOptions.ServiceId jest ustawiona na wartość etykiety zasobnika o nazwie
orleans/serviceId
. - ClusterOptions.ClusterId jest ustawiona na wartość etykiety zasobnika o nazwie
orleans/clusterId
. - Na początku procesu uruchamiania silos będzie sondować kubernetes, aby znaleźć, które silosy nie mają odpowiednich zasobników i oznaczyć te silosy jako martwe.
- Ten sam proces będzie występować w czasie wykonywania dla podzestawu wszystkich silosów, aby usunąć obciążenie na serwerze interfejsu API platformy Kubernetes. Domyślnie 2 silosy w klastrze będą oglądać platformę Kubernetes.
Należy pamiętać, że pakiet hostingowy Kubernetes nie używa rozwiązania Kubernetes do klastrowania. W przypadku klastrowania wymagany jest oddzielny dostawca klastrowania. Aby uzyskać więcej informacji na temat konfigurowania klastrowania, zobacz dokumentację konfiguracji serwera.
Ta funkcja nakłada pewne wymagania dotyczące sposobu wdrażania usługi:
- Nazwy silosów muszą być zgodne z nazwami zasobników.
- Zasobniki muszą mieć etykietę i
orleans/clusterId
odpowiadającąorleans/serviceId
silosomServiceId
iClusterId
. Wyżej wymieniona metoda będzie propagować te etykiety do odpowiednich opcji z Orleans zmiennych środowiskowych. - Zasobniki muszą mieć następujące zmienne środowiskowe:
POD_NAME
, ,POD_NAMESPACE
POD_IP
,ORLEANS_SERVICE_ID
,ORLEANS_CLUSTER_ID
.
W poniższym przykładzie pokazano, jak poprawnie skonfigurować te etykiety i zmienne środowiskowe:
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
W przypadku klastrów z obsługą kontroli dostępu opartej na rolach konto usługi Kubernetes dla zasobników może również wymagać udzielenia wymaganego dostępu:
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 i startup probes
Platforma Kubernetes może sondować zasobniki w celu określenia kondycji usługi. Aby uzyskać więcej informacji, zobacz Konfigurowanie kondycji, gotowości i sond uruchamiania w dokumentacji platformy Kubernetes.
Orleans używa protokołu członkostwa w klastrze do szybkiego wykrywania i odzyskiwania po awarii procesu lub sieci. Każdy węzeł monitoruje podzestaw innych węzłów, wysyłając okresowe sondy. Jeśli węzeł nie odpowie na wiele kolejnych sond z wielu innych węzłów, zostanie wymuszone usunięcie z klastra. Gdy węzeł, który uległ awarii, dowie się, że został usunięty, zostanie natychmiast zakończony. Platforma Kubernetes ponownie uruchomi zakończony proces i podejmie próbę ponownego dołączenia klastra.
Sondy platformy Kubernetes mogą pomóc określić, czy proces w zasobniku jest wykonywany i nie jest zablokowany w stanie zombie. sondy nie weryfikują łączności między zasobnikami ani nie wykonują żadnych testów funkcjonalności na poziomie aplikacji. Jeśli zasobnik nie odpowie na sondę liveness, platforma Kubernetes może ostatecznie zakończyć działanie tego zasobnika i zmienić jego harmonogram. Sondy i Orleanssondy kubernetes są zatem uzupełnieniem.
Zalecaną metodą jest skonfigurowanie sond liveness na platformie Kubernetes, które wykonują proste lokalne sprawdzanie, czy aplikacja działa zgodnie z oczekiwaniami. Te sondy służą do zakończenia procesu, jeśli występuje całkowite zamrożenie, na przykład z powodu błędu środowiska uruchomieniowego lub innego mało prawdopodobnego zdarzenia.
Limity przydziałów zasobów
Platforma Kubernetes działa w połączeniu z systemem operacyjnym w celu zaimplementowania przydziałów zasobów. Umożliwia to wymuszanie rezerwacji procesora CPU i pamięci i/lub limitów. W przypadku podstawowej aplikacji obsługującej ładowanie interakcyjne zalecamy nie implementowanie restrykcyjnych limitów, chyba że jest to konieczne. Ważne jest, aby pamiętać, że żądania i limity różnią się znacznie w ich znaczeniu i tam, gdzie są implementowane. Przed ustawieniem żądań lub limitów pośmiń czas na uzyskanie szczegółowego zrozumienia sposobu ich implementowania i wymuszania. Na przykład pamięć może nie być mierzona równomiernie między platformą Kubernetes, jądrem systemu Linux i systemem monitorowania. Limity przydziału procesora CPU mogą nie być wymuszane w oczekiwany sposób.
Rozwiązywanie problemów
Zasobniki uległy awarii, narzekając, że KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined
Pełny komunikat o wyjątku:
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()
- Sprawdź, czy
KUBERNETES_SERVICE_HOST
zmienne środowiskowe iKUBERNETES_SERVICE_PORT
są ustawiane wewnątrz zasobnika. Możesz to sprawdzić, wykonując następujące poleceniekubectl exec -it <pod_name> /bin/bash -c env
. - Upewnij się, że
automountServiceAccountToken
ustawiono wartość true na platformie Kubernetesdeployment.yaml
. Aby uzyskać więcej informacji, zobacz Konfigurowanie kont usług dla zasobników