Bagikan melalui


Hosting Kubernetes

Kubernetes adalah pilihan populer untuk menghosting aplikasi Orleans. Orleans akan berjalan di Kubernetes tanpa konfigurasi tertentu, namun, ia juga dapat memanfaatkan pengetahuan tambahan yang dapat disediakan platform hosting.

Paket Microsoft.Orleans.Hosting.Kubernetes menambahkan integrasi untuk menghosting aplikasi Orleans dalam kluster Kubernetes. Paket ini menyediakan metode ekstensi, UseKubernetesHosting, yang melakukan tindakan berikut:

Perhatikan bahwa paket hosting Kubernetes tidak menggunakan Kubernetes untuk pengklusteran. Untuk pengklusteran, penyedia pengklusteran terpisah masih diperlukan. Untuk informasi selengkapnya tentang mengonfigurasi pengklusteran, lihat dokumentasi konfigurasi Server.

Fungsionalitas ini memberlakukan beberapa persyaratan tentang bagaimana layanan disebarkan:

  • Nama silo harus cocok dengan nama pod.
  • Pod harus memiliki label orleans/serviceId dan orleans/clusterId yang sesuai dengan silo ServiceId dan ClusterId. Metode yang disebutkan di atas akan menyebarkan label tersebut ke dalam opsi yang sesuai dalam Orleans dari variabel lingkungan.
  • Pod harus memiliki variabel lingkungan berikut diprogram: POD_NAME, POD_NAMESPACE, POD_IP, ORLEANS_SERVICE_ID, ORLEANS_CLUSTER_ID.

Contoh berikut menunjukkan cara mengonfigurasi label dan variabel lingkungan ini dengan benar:

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

Untuk kluster yang mendukung RBAC, akun layanan Kubernetes untuk pod mungkin juga perlu diberikan akses yang diperlukan:

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

Keaktifan, kesiapan, dan uji pengerjaan

Kubernetes dapat melakukan pengujian pada pod untuk menentukan kesehatan suatu layanan. Untuk informasi selengkapnya, lihat Mengonfigurasi liveness, kesiapan, dan pemeriksaan startup dalam dokumentasi Kubernetes.

Orleans menggunakan protokol keanggotaan kluster untuk segera mendeteksi dan memulihkan dari proses atau kegagalan jaringan. Setiap simpul memantau sebagian dari simpul lain, mengirimkan pemeriksaan berkala. Jika node gagal merespons beberapa pemeriksaan berturut-turut dari beberapa simpul lain, maka node tersebut akan dihapus secara paksa dari kluster. Setelah node yang gagal mengetahui bahwa ia telah dihapus, node tersebut segera dihentikan. Kubernetes akan memulai ulang proses yang dihentikan dan akan mencoba bergabung kembali dengan kluster.

Pengecekan Kubernetes dapat membantu menentukan apakah proses dalam pod sedang berjalan dan tidak dalam keadaan zombie. probes tidak memverifikasi konektivitas atau respons antar pod atau melakukan pemeriksaan fungsionalitas tingkat aplikasi apa pun. Jika sebuah pod gagal merespons pemeriksaan liveness, Kubernetes mungkin akan menghentikan dan menjadwalkan ulang pod tersebut. Probe Kubernetes dan Orleanskarena itu bersifat saling melengkapi.

Pendekatan yang disarankan adalah mengonfigurasi Liveness Probes di Kubernetes yang melakukan pemeriksaan lokal sederhana saja bahwa aplikasi berkinerja seperti yang dimaksudkan. Probe ini berfungsi untuk menghentikan proses jika terjadi pembekuan total, misalnya, karena kesalahan runtime atau peristiwa lain yang tidak biasa.

Kuota sumber daya

Kubernetes bekerja bersama dengan sistem operasi untuk mengimplementasikan kuota sumber daya . Hal ini memungkinkan reservasi CPU dan memori dan/atau batasan untuk diberlakukan. Untuk aplikasi utama yang melayani beban interaktif, sebaiknya jangan terapkan batas pembatasan kecuali diperlukan. Penting untuk dicatat bahwa permintaan dan batasan secara substansial berbeda dalam maknanya dan di mana mereka diimplementasikan. Sebelum menetapkan permintaan atau batasan, luangkan waktu untuk mendapatkan pemahaman terperinci tentang bagaimana mereka diterapkan dan diberlakukan. Misalnya, memori mungkin tidak diukur secara seragam antara Kubernetes, kernel Linux, dan sistem pemantauan Anda. Kuota CPU mungkin tidak diberlakukan dengan cara yang Anda harapkan.

Pemecahan masalah

Pod crash, mengeluh bahwa KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined

Pesan pengecualian lengkap:

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()
  • Periksa apakah variabel lingkungan KUBERNETES_SERVICE_HOST dan KUBERNETES_SERVICE_PORT diatur di dalam Pod Anda. Anda dapat memeriksa dengan menjalankan perintah berikut kubectl exec -it <pod_name> /bin/bash -c env.
  • Pastikan automountServiceAccountToken diatur ke 'benar' di Kubernetes deployment.yamlAnda. Untuk informasi selengkapnya, lihat Mengonfigurasi Akun Layanan untuk Pod.