Kubernetes barındırma
Kubernetes, uygulamaları barındırmak Orleans için popüler bir seçimdir. Orleans belirli bir yapılandırma olmadan Kubernetes'te çalışacaktır, ancak barındırma platformunun sağlayabilecekleri ek bilgilerden de yararlanabilir.
Paket, Microsoft.Orleans.Hosting.Kubernetes
bir Orleans uygulamayı Kubernetes kümesinde barındırmak için tümleştirme ekler. Paket, UseKubernetesHostingaşağıdaki eylemleri gerçekleştiren bir uzantı yöntemi sağlar:
- SiloOptions.SiloName pod adına ayarlanır.
- EndpointOptions.AdvertisedIPAddress pod IP'sine ayarlanır.
- EndpointOptions.SiloListeningEndpoint ve EndpointOptions.GatewayListeningEndpoint ile herhangi bir adresi dinleyecek şekilde yapılandırılmıştır SiloPort GatewayPort. varsayılan bağlantı noktası değerleri
11111
ve30000
açıkça ayarlanmadıysa kullanılır). - ClusterOptions.ServiceId adlı pod etiketinin
orleans/serviceId
değerine ayarlanır. - ClusterOptions.ClusterId adlı pod etiketinin
orleans/clusterId
değerine ayarlanır. - Başlangıç sürecinin başlarında silo, karşılık gelen podlara sahip olmayan siloları bulmak için Kubernetes'i yoklar ve bu siloları ölü olarak işaretler.
- Kubernetes'in API sunucusundaki yükü kaldırmak için tüm siloların bir alt kümesi için çalışma zamanında aynı işlem gerçekleşir. Varsayılan olarak, kümedeki 2 silo Kubernetes'i izler.
Kubernetes barındırma paketinin kümeleme için Kubernetes kullanmadığını unutmayın. Kümeleme için ayrı bir kümeleme sağlayıcısı hala gereklidir. Kümeleme yapılandırma hakkında daha fazla bilgi için Sunucu yapılandırması belgelerine bakın.
Bu işlevsellik, hizmetin nasıl dağıtılacağına ilişkin bazı gereksinimlere neden olur:
- Silo adları pod adlarla eşleşmelidir.
- Podların ve silolarına
ServiceId
karşılık gelen birorleans/serviceId
veorleans/clusterId
ClusterId
etiketi olmalıdır. Yukarıda bahsedilen yöntem, bu etiketleri ortam değişkenlerinden içindeki ilgili seçeneklere Orleans yayacaktır. - Podlarda şu ortam değişkenleri ayarlanmalıdır:
POD_NAME
,POD_NAMESPACE
,POD_IP
,ORLEANS_SERVICE_ID
, .ORLEANS_CLUSTER_ID
Aşağıdaki örnekte bu etiketlerin ve ortam değişkenlerinin doğru yapılandırılması gösterilmektedir:
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
RBAC özellikli kümeler için podların Kubernetes hizmet hesabına da gerekli erişimin verilmesi gerekebilir:
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: ''
Canlılık, hazırlık ve başlangıç yoklamaları
Kubernetes, hizmetin durumunu belirlemek için podları yoklayabilir. Daha fazla bilgi için Kubernetes'in belgelerinde canlılık, hazır olma ve başlatma yoklamalarını yapılandırma bölümüne bakın.
Orleans bir işlem veya ağ hatalarını hemen algılamak ve kurtarmak için bir küme üyeliği protokolü kullanır. Her düğüm, düzenli aralıklarla yoklamalar göndererek diğer düğümlerin bir alt kümesini izler. Bir düğüm, birden çok diğer düğümden gelen birden çok ardışık yoklamaya yanıt vermezse, kümeden zorla kaldırılır. Başarısız bir düğüm kaldırıldığını öğrendiğinde hemen sonlandırılır. Kubernetes sonlandırılan işlemi yeniden başlatır ve kümeye yeniden katılmayı dener.
Kubernetes'in yoklamaları, poddaki bir işlemin yürütülüp yürütülmediğini ve zombi durumunda takılmadığını belirlemeye yardımcı olabilir. yoklamalar podlar arası bağlantıyı veya yanıt hızını doğrulamaz veya uygulama düzeyinde işlev denetimleri gerçekleştirmez. Bir pod canlılık yoklamasına yanıt vermezse Kubernetes sonunda bu podu sonlandırabilir ve yeniden zamanlayabilir. Bu nedenle Kubernetes'in yoklamaları ve Orleansyoklamaları tamamlayıcı niteliktedir.
Önerilen yaklaşım, Kubernetes'te uygulamanın amaçlandığı gibi çalıştığından yalnızca yerel olarak basit bir denetim gerçekleştiren Canlılık Yoklamaları yapılandırmaktır. Bu yoklamalar, örneğin bir çalışma zamanı hatası veya olası olmayan başka bir olay nedeniyle toplam dondurma varsa işlemi sonlandırmaya hizmet eder.
Kaynak kotaları
Kubernetes, kaynak kotalarını uygulamak için işletim sistemiyle birlikte çalışır. Bu, CPU ve bellek ayırmalarının ve/veya sınırlarının zorunlu kılınmasına olanak tanır. Etkileşimli yük sunan bir birincil uygulama için, gerekli olmadıkça kısıtlayıcı sınırlar uygulamamanızı öneririz. İsteklerin ve sınırların anlamları ve uygulandıkları yer açısından önemli ölçüde farklı olduğunu unutmayın. İstekleri veya sınırları ayarlamadan önce, bunların nasıl uygulandığını ve uygulandığını ayrıntılı olarak anlamak için zaman ayırın. Örneğin, bellek Kubernetes, Linux çekirdeği ve izleme sisteminiz arasında tekdüzen ölçülemeyebilir. CPU kotaları beklediğiniz şekilde zorlanmayabilir.
Sorun giderme
Podlar kilitleniyor, şikayet ediyor KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined
Tam özel durum iletisi:
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()
- Podunuzun içinde ve
KUBERNETES_SERVICE_PORT
ortam değişkenlerinin ayarlanıp ayarlanmadığınıKUBERNETES_SERVICE_HOST
denetleyin. Aşağıdaki komutukubectl exec -it <pod_name> /bin/bash -c env
yürüterek de denetlenebilirsiniz. automountServiceAccountToken
Kubernetes'inizdedeployment.yaml
true olarak ayarlandığından emin olun. Daha fazla bilgi için bkz . Podlar için Hizmet Hesaplarını Yapılandırma