Kubernetes barındırma
Kubernetes, Orleans uygulamaları barındırmak için popüler bir seçimdir. Orleans kubernetes'te belirli bir yapılandırma olmadan çalışacaktır, ancak barındırma platformunun sağlayabilecekleri ek bilgilerden de yararlanabilir.
Microsoft.Orleans.Hosting.Kubernetes
paketi, kubernetes kümesinde bir Orleans uygulaması barındırmak için tümleştirme ekler. Paket, aşağıdaki eylemleri gerçekleştiren UseKubernetesHostingbir uzantı yöntemi sağlar:
- SiloOptions.SiloName pod ismine ayarlanır.
- EndpointOptions.AdvertisedIPAddress pod IP'sine ayarlanır.
-
EndpointOptions.SiloListeningEndpoint & EndpointOptions.GatewayListeningEndpoint, yapılandırılmış SiloPort ve GatewayPortile herhangi bir adres üzerinde dinleme yapacak şekilde yapılandırılmıştır.
11111
ve30000
varsayılan bağlantı noktası değerleri açıkça ayarlanmadıysa kullanılır). -
ClusterOptions.ServiceId,
orleans/serviceId
adlı pod etiketinin değerine ayarlanır. -
ClusterOptions.ClusterId,
orleans/clusterId
adlı pod etiketinin 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 sorgular ve bu siloları devre dışı 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, silonun
ServiceId
veClusterId
'üne karşılık gelenorleans/serviceId
veorleans/clusterId
etiketleri olmalıdır. Yukarıda bahsedilen yöntem, bu etiketleri ortam değişkenlerinden Orleans'daki ilgili seçeneklere 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 çalıştırma yoklamaları
Kubernetes, hizmetin durumunu belirlemek için podları yoklayabilir. Daha fazla bilgi için Kubernetes belgelerinde yer alan Canlılık, hazır olma ve başlatma yoklamasını yapılandırma bölümüne bakın.
Orleans, bir işlemi 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ığını doğrulayan basit bir yerel denetim gerçekleştiren Liveness Probes yapılandırmaktır. Bu probeler, örneğin bir çalışma zamanı hatası veya olası olmayan bir olay nedeniyle tamamen donma varsa işlemi sonlandırmaya hizmet eder.
Kaynak kotaları
Kubernetes, kaynak kotaları 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 uygulanıp yürütüldüğü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 uygulanmayabilir.
Sorun giderme
Podlar, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined
ile ilgili bir hata bildirerek çöküyor.
Tüm ö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
KUBERNETES_SERVICE_HOST
veKUBERNETES_SERVICE_PORT
ortam değişkenlerinin ayarlanıp ayarlanmadığını denetleyin.kubectl exec -it <pod_name> /bin/bash -c env
aşağıdaki komutu yürüterek de kontrol edebilirsiniz. - Kubernetes
deployment.yaml
üzerindeautomountServiceAccountToken
'in doğru olarak ayarlandığından emin olun. Daha fazla bilgi için bkz. Podlar için Hizmet Hesaplarını Yapılandırma.