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:

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 bir orleans/serviceId ve orleans/clusterIdClusterIdetiketi 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"]
---
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 komutu kubectl exec -it <pod_name> /bin/bash -c envyürüterek de denetlenebilirsiniz.
  • automountServiceAccountToken Kubernetes'inizde deployment.yamltrue olarak ayarlandığından emin olun. Daha fazla bilgi için bkz . Podlar için Hizmet Hesaplarını Yapılandırma