AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證An operator for streaming Kubernetes resource metadata, logs, events, and network traffic telemetry over mTLS to Kestrel Cloud.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
An operator for streaming Kubernetes resource metadata, events, logs, and network traffic telemetry over mTLS to Kestrel Cloud.
The Kestrel Operator connects to Kestrel Cloud using gRPC bidirectional streaming. It authenticates using OAuth2 credentials, establishes an mTLS HTTP/2 connection, and performs the following functions:檢視完整 README ↗An operator for streaming Kubernetes resource metadata, events, logs, and network traffic telemetry over mTLS to Kestrel Cloud.
The Kestrel Operator connects to Kestrel Cloud using gRPC bidirectional streaming. It authenticates using OAuth2 credentials, establishes an mTLS HTTP/2 connection, and performs the following functions:
The Kestrel Operator can optionally integrate with Cilium for L3/L4 network flow collection. This integration is not required for basic functionality.
The operator will continue to function normally without Cilium installed, providing:
When Cilium is available, the Kestrel Operator additionally provides:
To disable Cilium integration entirely:
Via Helm values:
operator:
cilium:
disableFlows: true
Via environment variable:
DISABLE_CILIUM_FLOWS=true
The Kestrel Operator integrates with Istio for L7 access log collection via Envoy's Access Log Service (ALS). This integration provides detailed L7 (HTTP/gRPC) traffic visibility.
The operator will continue to function normally without Istio installed, providing:
When Istio is available and properly configured, the Kestrel Operator additionally provides:
For Istio integration to work, the following must be configured:
istio-injection=enabled so workloads get Envoy sidecarsTo enable Istio integration (already done by selecting Istio as the traffic data source at cluster onboarding):
Via Helm values:
operator:
istio:
enabled: true
cilium:
disableFlows: true # Typically disable Cilium when using Istio for flow collection
The operator automatically creates the necessary Telemetry resources via its Helm chart, but you must configure Istio's mesh configuration to define the Kestrel Operator as an extension provider for access logging.
Required extension providers:
meshConfig:
extensionProviders:
- name: kestrel-operator-als
envoyHttpAls:
service: kestrel-operator-als.kestrel-ai.svc.cluster.local
port: 8080
- name: kestrel-operator-als-tcp
envoyTcpAls:
service: kestrel-operator-als.kestrel-ai.svc.cluster.local
port: 8080
There are several ways to apply this depending on your Istio setup:
--set flags (new Istio installations or Helm-managed Istio)helm repo add istio https://istio-release.storage.googleapis.com/charts
helm upgrade --install istiod istio/istiod -n istio-system \
--set 'meshConfig.extensionProviders[0].name=kestrel-operator-als' \
--set 'meshConfig.extensionProviders[0].envoyHttpAls.service=kestrel-operator-als.kestrel-ai.svc.cluster.local' \
--set 'meshConfig.extensionProviders[0].envoyHttpAls.port=8080' \
--set 'meshConfig.extensionProviders[1].name=kestrel-operator-als-tcp' \
--set 'meshConfig.extensionProviders[1].envoyTcpAls.service=kestrel-operator-als.kestrel-ai.svc.cluster.local' \
--set 'meshConfig.extensionProviders[1].envoyTcpAls.port=8080'
kubectl patch (existing installations without custom mesh config)If your Istio installation doesn't have custom mesh configuration, you can apply the extension providers with a single command:
kubectl patch configmap istio -n istio-system --type merge -p '{"data":{"mesh":"extensionProviders:\n- name: kestrel-operator-als\n envoyHttpAls:\n service: kestrel-operator-als.kestrel-ai.svc.cluster.local\n port: 8080\n- name: kestrel-operator-als-tcp\n envoyTcpAls:\n service: kestrel-operator-als.kestrel-ai.svc.cluster.local\n port: 8080"}}'
After patching, restart Istiod:
kubectl rollout restart deployment istiod -n istio-system
⚠️ Warning: This
--type mergepatch replaces the entiremeshkey. Only use this if you don't have existing custom mesh configuration. If you do, use Option 3 instead.
If you already have custom mesh configuration (e.g., custom discoveryAddress, trustDomain, defaultProviders), edit the ConfigMap directly to avoid overwriting your existing settings:
kubectl edit configmap istio -n istio-system
Find the mesh: key in the data section and add the extensionProviders block while keeping all existing settings:
data:
mesh: |-
# ... your existing mesh config (keep all existing settings) ...
extensionProviders:
- name: kestrel-operator-als
envoyHttpAls:
service: kestrel-operator-als.kestrel-ai.svc.cluster.local
port: 8080
- name: kestrel-operator-als-tcp
envoyTcpAls:
service: kestrel-operator-als.kestrel-ai.svc.cluster.local
port: 8080
After saving, restart Istiod to pick up the changes:
kubectl rollout restart deployment istiod -n istio-system
Application namespaces must have Istio sidecar injection enabled. Label each namespace before deploying workloads:
kubectl label namespace <your-namespace> istio-injection=enabled
If workloads are already running, label the namespace and restart the deployments to inject sidecars:
kubectl label namespace <your-namespace> istio-injection=enabled --overwrite
kubectl rollout restart deployment -n <your-namespace> <deployment-name>
Verify sidecars are injected by checking that pods have an istio-proxy container:
kubectl get pods -n <your-namespace> -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.containers[*]}{.name}{" "}{end}{"\n"}{end}' | grep istio-proxy
If sidecars are injected, each pod will show istio-proxy in the container list.
The operator's Helm chart will automatically create the necessary Telemetry resources that reference these extension providers.
The Kestrel Operator can receive and store OTEL metrics locally for incident root cause analysis (RCA). When enabled, the operator exposes an OTLP gRPC receiver (default port 4317) that accepts metrics from your OpenTelemetry Collectors.
Via Helm values:
operator:
otel:
enabled: true
receiverPort: 4317
metricsStore:
retention: "30m" # Rolling retention window
maxSeries: 100000 # Max unique metric series
ringSize: 60 # Data points per series
IMPORTANT: For metrics to include Kubernetes context (namespace, workload, pod names), your OpenTelemetry Collector MUST have the k8sattributes processor configured.
Required k8sattributes processor configuration:
processors:
k8sattributes:
auth_type: "serviceAccount"
passthrough: false
extract:
metadata:
- k8s.namespace.name
- k8s.pod.name
- k8s.pod.uid
- k8s.deployment.name
- k8s.statefulset.name
- k8s.daemonset.name
- k8s.replicaset.name
- k8s.container.name
- k8s.node.name
pod_association:
- sources:
- from: resource_attribute
name: k8s.pod.ip
- from: resource_attribute
name: ip
- from: connection
Exporter configuration to send metrics to Kestrel Operator:
exporters:
otlp/kestrel:
endpoint: kestrel-operator.kestrel-ai.svc.cluster.local:4317
tls:
insecure: true # In-cluster communication
# compression: gzip # Optional, enable for reduced bandwidth
service:
pipelines:
metrics:
receivers: [otlp, prometheus]
processors: [k8sattributes, batch]
exporters: [otlp/kestrel]
Note: The operator supports gzip compression. The OpenTelemetry Collector enables gzip by default, but if using the Go SDK directly, enable it via OTEL_EXPORTER_OTLP_COMPRESSION=gzip or the compression: gzip exporter option.
Without the k8sattributes processor:
To install the Kestrel Operator on your cluster, simply copy the command from the Onboard Cluster page on the Kestrel Platform:
helm install kestrel-operator oci://ghcr.io/kestrelai/charts/kestrel-operator --version 0.1.0 --namespace kestrel-ai --create-namespace -f kestrel-ai-operator-values-<cluster-name>.yaml