Hostování Kubernetes
Kubernetes je oblíbenou volbou pro hostování Orleans aplikací. Orleans se bude spouštět v Kubernetes bez konkrétní konfigurace, ale může také využít další znalosti, které může hostitelská platforma poskytovat.
Balíček Microsoft.Orleans.Hosting.Kubernetes
přidává integraci pro hostování aplikace Orleans v clusteru Kubernetes. Balíček poskytuje rozšiřující metodu, UseKubernetesHosting, která provádí následující akce:
- SiloOptions.SiloName je nastaven na název podu.
- EndpointOptions.AdvertisedIPAddress je nastavená na IP adresu podu.
-
EndpointOptions.SiloListeningEndpoint & EndpointOptions.GatewayListeningEndpoint jsou nakonfigurované tak, aby naslouchaly na libovolné adrese s nakonfigurovanými SiloPort a GatewayPort. Výchozí hodnoty portů
11111
a30000
se použijí, pokud nejsou explicitně nastaveny žádné hodnoty). -
ClusterOptions.ServiceId je nastaveno na hodnotu štítku podu s názvem
orleans/serviceId
. -
ClusterOptions.ClusterId je nastaveno na hodnotu štítku podu s názvem
orleans/clusterId
. - V rané fázi procesu spuštění bude silo prověřovat Kubernetes, aby zjistilo, která sila nemají odpovídající pody, a označí tato sila jako mrtvá.
- Stejný proces bude probíhat za běhu pro podmnožinu všech uzlů, aby se snížilo zatížení Kubernetes API serveru. Ve výchozím nastavení budou 2 sila v klastru sledovat Kubernetes.
Mějte na paměti, že balíček Kubernetes pro hosting nevyužívá Kubernetes pro clustering. Pro clustering je stále potřeba samostatný poskytovatel clusteringu. Další informace o konfiguraci clusteringu najdete v dokumentaci ke konfiguraci Serveru.
Tato funkce má určité požadavky na nasazení služby:
- Názvy sila musí odpovídat názvům podů.
- Pody musí mít označení
orleans/serviceId
aorleans/clusterId
, které odpovídá číslůmServiceId
aClusterId
sila. Výše uvedená metoda tyto popisky rozšíří do odpovídajících možností v Orleans z proměnných prostředí. - Pody musí mít nastavené následující proměnné prostředí:
POD_NAME
,POD_NAMESPACE
,POD_IP
,ORLEANS_SERVICE_ID
,ORLEANS_CLUSTER_ID
.
Následující příklad ukazuje, jak správně nakonfigurovat tyto štítky a proměnné prostředí:
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
U clusterů s podporou RBAC může být také potřeba udělit požadovaný přístup účtu služby Kubernetes pro pody:
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: ''
Sondy životaschopnosti, připravenosti a zaváděcí
Kubernetes dokáže testovat pody a určit stav služby. Další informace najdete v tématu Konfigurace aktivity, připravenosti a spouštěcích sond v dokumentaci Kubernetes.
Orleans používá protokol členství v clusteru k okamžitému zjištění a zotavení z procesu nebo selhání sítě. Každý uzel monitoruje podmnožinu jiných uzlů a odesílá pravidelné sondy. Pokud uzel nereaguje na několik po sobě jdoucích sond z několika dalších uzlů, bude z clusteru vynuceně odstraněn. Jakmile se uzel, který selhal, dozví, že byl odstraněn, okamžitě se ukončí. Kubernetes restartuje ukončený proces a pokusí se znovu připojit ke clusteru.
Sondy Kubernetes můžou pomoct určit, jestli proces v podu běží a není uvízlý v zombie stavu. sondy neověřují připojení mezi pody ani rychlost odezvy ani neprovádějí žádné kontroly funkčnosti na úrovni aplikace. Pokud pod nereaguje na liveness probe, může Kubernetes nakonec tento pod ukončit a přeplánovat ho. Sondy Kubernetes a sondy Orleansjsou proto doplňkové.
Doporučeným přístupem je nakonfigurovat sondy živé aktivity v Kubernetes, které provádějí jednoduchou místní kontrolu, že aplikace funguje podle očekávání. Tyto sondy slouží k ukončení procesu, pokud dojde k celkovému zablokování, například kvůli chybě za běhu nebo jiné nepravděpodobné události.
Kvóty prostředků
Kubernetes spolupracuje s operačním systémem na implementaci kvót prostředků . To umožňuje vynutit rezervace procesoru a/nebo paměti, případně stanovit limity. Pro primární aplikaci, která obsluhuje interaktivní načítání, doporučujeme neimprimovat omezující omezení, pokud není to nutné. Je důležité si uvědomit, že požadavky a limity se podstatně liší ve svém významu a jejich implementaci. Než nastavíte požadavky nebo limity, potřebujete čas, abyste získali podrobné informace o tom, jak se implementují a vynucují. Paměť se například nemusí měřit jednotně mezi Kubernetes, jádrem Linuxu a monitorovacím systémem. Kvóty procesoru se nemusí vynucovat očekávaným způsobem.
Řešení problémů
Pody havarují a hlásí chybu KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined
Úplná zpráva o výjimce:
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()
- Zkontrolujte, že proměnné prostředí
KUBERNETES_SERVICE_HOST
aKUBERNETES_SERVICE_PORT
jsou nastaveny uvnitř vašeho podu. Kontrolu můžete provést spuštěním následujícího příkazukubectl exec -it <pod_name> /bin/bash -c env
. - Ujistěte se, že je
automountServiceAccountToken
nastavena na true v Kubernetesdeployment.yaml
. Další informace najdete v tématu Nastavení účtů služeb pro pody.