Hostování Kubernetes
Kubernetes je oblíbenou volbou pro hostování Orleans aplikací. Orleans bude běžet 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í Orleans aplikace v clusteru Kubernetes. Balíček poskytuje rozšiřující metodu, UseKubernetesHostingkterá 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 nakonfigurovány tak, aby naslouchaly na libovolné adrese s nakonfigurovaným SiloPort a GatewayPort. Výchozí hodnoty
11111
portů a30000
se použijí, pokud nejsou explicitně nastaveny žádné hodnoty). - ClusterOptions.ServiceId je nastavena na hodnotu popisku podu s názvem
orleans/serviceId
. - ClusterOptions.ClusterId je nastavena na hodnotu popisku podu s názvem
orleans/clusterId
. - V rané fázi procesu spuštění bude sil testovat Kubernetes, aby zjistil, 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 sil, aby se odebralo zatížení serveru rozhraní API Kubernetes. Ve výchozím nastavení bude Kubernetes sledovat 2 sila v clusteru.
Mějte na paměti, že hostitelský balíček Kubernetes pro clustering nepoužívá Kubernetes. 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
orleans/serviceId
aorleans/clusterId
popisek, který odpovídá silovýmServiceId
aClusterId
. Výše uvedená metoda tyto popisky rozšíří do odpovídajících možností z Orleans proměnných prostředí. - Pody musí mít následující sadu proměnných 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 popisky 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 aktivity, připravenosti a spouštění
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 testů v dokumentaci Kubernetes.
Orleans používá protokol členství clusteru k okamžitému zjištění a obnovení 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 více dalších uzlů, dojde k vynucení odebrání z clusteru. Jakmile se uzel, který selhal, zjistí, že se odebral, 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 se proces v podu spouští a není zablokovaný 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 sondu aktivity, může kubernetes nakonec tento pod ukončit a přeplánovat ho. Sondy Kubernetes a Orleanssondy se proto doplňují.
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 paměti nebo 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ému
Pody se chybově ukončí, stěžuje si, že 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, jestli
KUBERNETES_SERVICE_HOST
KUBERNETES_SERVICE_PORT
jsou v podu nastavené proměnné prostředí a proměnné prostředí. Můžete to zkontrolovat spuštěním následujícího příkazukubectl exec -it <pod_name> /bin/bash -c env
. - Ujistěte se, že
automountServiceAccountToken
je v Kubernetesdeployment.yaml
nastavená hodnota true . Další informace najdete v tématu Konfigurace účtů služby pro pody.