Kubernetes 裝載

Kubernetes 是裝載 Orleans 應用程式的熱門選擇。 Orleans 將會在沒有特定設定的 Kubernetes 中執行,不過也可以利用裝載平台可以提供的額外知識。

Microsoft.Orleans.Hosting.Kubernetes 套件會新增整合,以在 Kubernetes 叢集中裝載 Orleans 應用程式。 封裝提供擴充方法 UseKubernetesHosting,其會執行下列動作:

請注意,Kubernetes 裝載套件不會使用 Kubernetes 進行叢集化。 針對叢集化,仍然需要個別的叢集提供者。 如需設定叢集的詳細資訊,請參閱伺服器設定文件。

這項功能會對服務部署方式施加一些需求:

  • 定址接收器名稱必須符合 Pod 名稱。
  • Pod 必須具有 orleans/serviceIdorleans/clusterId 標籤,其對應至定址接收器的 ServiceIdClusterId。 上述方法會將這些標籤傳播至環境變數中 Orleans 的對應選項。
  • Pod 必須設定下列環境變數:POD_NAMEPOD_NAMESPACEPOD_IPORLEANS_SERVICE_IDORLEANS_CLUSTER_ID

下列範例示範如何正確設定這些標籤和環境變數:

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 的叢集,針對 Pod 的 Kubernetes 服務帳戶可能需要授與必要的存取權:

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: ''

活躍度、整備度和啟動探查

Kubernetes 可以探查 Pod,以判斷服務的健康情況。 如需詳細資訊,請參閱 Kubernetes 文件中的設定活躍度、整備度和啟動探查

Orleans 會使用叢集成員資格通訊協定,以提示偵測並從程序或網路失敗復原。 每個節點都會監視其他節點的子集,並傳送定期探查。 如果節點無法回應來自多個其他節點的多個後續探查,則會強制從叢集中移除。 一旦失敗的節點發現其已移除,就會立即終止。 Kubernetes 會重新啟動終止的程序,且會嘗試重新加入叢集。

Kubernetes 的探查可協助判斷 Pod 中的程序是否正在執行,且不會停滯在廢止狀態中。 探查不會驗證 Pod 間連線能力或回應性,或執行任何應用程式層級功能檢查。 如果 Pod 無法回應活躍度探查,Kubernetes 最終可能會終止該 Pod 並重新排程。 因此,Kubernetes 的探查和 Orleans 的探查是彼此互補的。

建議的方法是在 Kubernetes 中設定活躍度探查,以執行簡單的僅限本機檢查應用程式是否如預期般執行。 如果發生完全凍結,這些探查會終止程序,例如,因為執行時間錯誤或其他不太可能的事件。

資源配額

Kubernetes 可與作業系統搭配運作,以實作資源配額。 如此可強制執行 CPU 和記憶體保留和/或限制。 對於提供互動式負載的主要應用程式,除非必要,否則不建議實作限制性限制。 請務必注意,要求和限制在其意義和實作位置方面明顯不同。 設定要求或限制之前,請花一點時間深入了解其實作和強制執行的方式。 例如,記憶體可能不會在 Kubernetes、Linux 核心和監視系統之間統一測量。 CPU 配額可能無法以您預期的方式強制執行。

疑難排解

Pod 當機並提報 KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined

完整例外狀況訊息:

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()
  • 檢查 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT 環境變數是否已在您的 Pod 內設定。 您可以執行下列命令 kubectl exec -it <pod_name> /bin/bash -c env 來進行檢查。
  • 請確定 automountServiceAccountToken 在 Kubernetes deployment.yaml 上設定為 true。 如需詳細資訊,請參閱設定 Pod 的服務帳戶