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:
- SiloOptions.SiloName ditetapkan sebagai nama pod.
- EndpointOptions.AdvertisedIPAddress diset ke IP pod.
-
EndpointOptions.SiloListeningEndpoint & EndpointOptions.GatewayListeningEndpoint dikonfigurasi untuk mendengarkan pada alamat apa pun, bersama dengan SiloPort dan GatewayPortyang telah dikonfigurasi. Nilai port default
11111
dan30000
digunakan jika tidak ada nilai yang diatur secara eksplisit). -
ClusterOptions.ServiceId diatur ke nilai label pod dengan nama
orleans/serviceId
. -
ClusterOptions.ClusterId diatur pada nilai label pod dengan nama
orleans/clusterId
. - Di awal proses startup, silo akan memeriksa Kubernetes untuk menemukan silo mana yang tidak memiliki pod yang sesuai dan menandai silo tersebut sebagai mati.
- Proses yang sama akan terjadi pada runtime untuk subset semua silo, untuk menghapus beban pada server API Kubernetes. Secara default, 2 silo dalam kluster akan menonton Kubernetes.
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
danorleans/clusterId
yang sesuai dengan siloServiceId
danClusterId
. 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
danKUBERNETES_SERVICE_PORT
diatur di dalam Pod Anda. Anda dapat memeriksa dengan menjalankan perintah berikutkubectl exec -it <pod_name> /bin/bash -c env
. - Pastikan
automountServiceAccountToken
diatur ke 'benar' di Kubernetesdeployment.yaml
Anda. Untuk informasi selengkapnya, lihat Mengonfigurasi Akun Layanan untuk Pod.