Aracılığıyla paylaş


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:

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 ve ClusterId'üne karşılık gelen orleans/serviceId ve orleans/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 ve KUBERNETES_SERVICE_PORT ortam değişkenlerinin ayarlanıp ayarlanmadığını denetleyin. kubectl exec -it <pod_name> /bin/bash -c envaşağıdaki komutu yürüterek de kontrol edebilirsiniz.
  • Kubernetes deployment.yamlüzerinde automountServiceAccountToken'in doğru olarak ayarlandığından emin olun. Daha fazla bilgi için bkz. Podlar için Hizmet Hesaplarını Yapılandırma.