Hosting Kubernetes
Platforma Kubernetes jest popularnym wyborem do hostowania aplikacji Orleans. Orleans będzie działać na platformie Kubernetes bez określonej konfiguracji, jednak może również skorzystać z dodatkowej wiedzy, którą może zapewnić platforma hostingu.
Pakiet Microsoft.Orleans.Hosting.Kubernetes
dodaje integrację do hostowania aplikacji Orleans w klastrze Kubernetes. Pakiet udostępnia metodę rozszerzenia UseKubernetesHosting, która wykonuje następujące akcje:
- SiloOptions.SiloName jest ustawiony na nazwę pod.
- EndpointOptions.AdvertisedIPAddress jest ustawiony na adres IP zasobnika.
-
EndpointOptions.SiloListeningEndpoint & EndpointOptions.GatewayListeningEndpoint są skonfigurowane do nasłuchiwania na dowolnym adresie, z SiloPort i GatewayPortskonfigurowanymi. Wartości portów domyślnych
11111
i30000
są używane, jeśli żadne wartości nie są ustawiane jawnie). -
ClusterOptions.ServiceId jest ustawiony na wartość etykiety zasobnika o nazwie
orleans/serviceId
. -
ClusterOptions.ClusterId jest ustawiony na wartość etykiety zasobnika o nazwie
orleans/clusterId
. - Na początku procesu uruchamiania, silos będzie sondował Kubernetes, aby znaleźć te silosy, które nie mają odpowiednich zasobników, i zaznaczyć je 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ą monitorować 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 Server.
Ta funkcja nakłada pewne wymagania dotyczące sposobu wdrażania usługi:
- Nazwy silosów muszą być zgodne z nazwami podów.
- Zasobniki muszą mieć etykiety
orleans/serviceId
iorleans/clusterId
, które odpowiadają etykietomServiceId
iClusterId
silosu. Wyżej wymieniona metoda będzie propagować te etykiety do odpowiednich opcji w Orleans pochodzących ze zmiennych środowiskowych. - Zasobniki muszą mieć ustawione 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 włączoną kontrolą dostępu opartą na rolach, może być konieczne przyznanie wymaganego dostępu kontu usługi Kubernetes dla zasobników.
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 sondy
Platforma Kubernetes może sondować pody w celu określenia kondycji usługi. Aby uzyskać więcej informacji, zobacz Konfigurowanie sond gotowości, kondycji i uruchamiania w dokumentacji platformy Kubernetes.
Orleans używa protokołu członkostwa klastra 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, kończy działanie natychmiast. 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 podzie prawidłowo działa i nie jest zablokowany w stanie zombie. sondy nie sprawdzają łączności między podami ani nie wykonują żadnych kontroli 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 kubernetes i sondy Orleanssą zatem uzupełniające.
Zalecanym podejściem jest skonfigurowanie sond gotowości na platformie Kubernetes, które wykonują proste tylko 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.
Przydziały zasobów
Platforma Kubernetes działa w połączeniu z systemem operacyjnym w celu zaimplementowania przydziałów zasobów. Umożliwia to wymuszanie rezerwacji pamięci i procesora 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 CPU mogą nie być wymuszane w oczekiwany sposób.
Rozwiązywanie problemów
Zasobniki uległy awarii, zgłaszając problem z 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 zmienne środowiskowe
KUBERNETES_SERVICE_HOST
iKUBERNETES_SERVICE_PORT
są ustawione wewnątrz twojego Podu. Możesz to sprawdzić, wykonując następujące poleceniekubectl exec -it <pod_name> /bin/bash -c env
. - Upewnij się, że
automountServiceAccountToken
jest ustawione na "true" na platformie Kubernetesdeployment.yaml
. Aby uzyskać więcej informacji, zobacz Konfigurowanie kont usługowych dla Podów.