Files
taylanbakircioglu 6e503368f7 feat: L7 (Application Level) observability — Service Map, Trace Explorer, APM, Beyla
- Grafana Beyla DaemonSet for kernel-level HTTP/gRPC/DNS capture (passive,
  zero application changes, W3C traceparent header propagation)
- flowfish-l7-collector in-cluster bridge: OTLP receiver + buffered pull API
- L7 Ingestion Service: K8s service-proxy poll → enrich → RabbitMQ
- ClickHouse l7_http_flows / l7_grpc_flows / l7_dns_flows + APM RED MVs
- Neo4j L7Workload nodes + SAME_WORKLOAD cross-cluster bridges
- New pages: Service Map, Trace Explorer, APM Services List, APM Service Detail
- Analysis Wizard now supports L4 / L7 / Both modes with HTTP/gRPC/DNS picks
- Integration Hub gains L7 dependency summary + tree-summary integrations
- Multi-Cluster Management: dual-agent install (Inspector Gadget L4 + Beyla L7),
  runtime OpenShift detection so SCCs auto-install with kubectl too
- ServiceMap edge → Trace Explorer drill-down with virtual_trace_id correlation
- Docs: new L7 architecture diagram, README L7 sections, 3 new screenshots
2026-05-14 10:09:15 +03:00

190 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
set -e
NAMESPACE="flowfish-local"
GITHUB_RAW="https://raw.githubusercontent.com/taylanbakircioglu/flowfish/main/deployment/local-test"
MANIFESTS=(
"00-namespace.yaml"
"01-rbac.yaml"
"02-databases.yaml"
"03-migrations.yaml"
"04-backend.yaml"
"05-cluster-manager.yaml"
"06-analysis-orchestrator.yaml"
"07-ingestion-service.yaml"
"08-graph-query.yaml"
"09-timeseries-query.yaml"
"10-graph-writer.yaml"
"11-timeseries-writer.yaml"
"12-change-detection-worker.yaml"
"13-frontend.yaml"
"14-nginx-proxy.yaml"
)
GADGET_MANIFEST="15-inspektor-gadget.yaml"
usage() {
echo "Flowfish Local Deployment Script"
echo ""
echo "Usage: $0 [install|install-with-gadget|uninstall|status|restart]"
echo ""
echo "Commands:"
echo " install Deploy Flowfish (without eBPF data collection)"
echo " install-with-gadget Deploy Flowfish + Inspektor Gadget DaemonSet"
echo " Enables local cluster analysis with eBPF events"
echo " Requires: amd64 Linux, kernel 5.4+, privileged access"
echo " uninstall Remove Flowfish from the local Kubernetes cluster"
echo " status Show pod and service status"
echo " restart Restart all Flowfish deployments (re-pull images)"
echo ""
echo "Prerequisites: kubectl configured with a running Kubernetes cluster"
}
check_kubectl() {
if ! command -v kubectl &> /dev/null; then
echo "ERROR: kubectl is not installed or not in PATH"
exit 1
fi
if ! kubectl cluster-info &> /dev/null; then
echo "ERROR: Cannot connect to Kubernetes cluster"
echo "Make sure your cluster is running and kubectl is configured."
exit 1
fi
}
install() {
local with_gadget="${1:-false}"
echo "============================================="
echo " Flowfish Platform - Local Deployment"
if [ "$with_gadget" = "true" ]; then
echo " (with Inspektor Gadget eBPF collection)"
fi
echo "============================================="
echo ""
check_kubectl
if [ "$with_gadget" = "true" ]; then
ARCH=$(kubectl get nodes -o jsonpath='{.items[0].status.nodeInfo.architecture}' 2>/dev/null || echo "unknown")
if [ "$ARCH" != "amd64" ]; then
echo "WARNING: Node architecture is '${ARCH}', not amd64."
echo "Inspektor Gadget requires amd64 (x86_64) Linux."
echo "The DaemonSet will be applied but pods may fail to start."
echo ""
fi
fi
echo "Applying manifests from GitHub..."
echo ""
# Delete old migration job if exists (completed Jobs don't re-run on apply)
kubectl delete job flowfish-migrations -n "${NAMESPACE}" --ignore-not-found 2>/dev/null || true
for manifest in "${MANIFESTS[@]}"; do
echo " Applying ${manifest}..."
kubectl apply -f "${GITHUB_RAW}/${manifest}"
done
if [ "$with_gadget" = "true" ]; then
echo " Applying ${GADGET_MANIFEST}..."
kubectl apply -f "${GITHUB_RAW}/${GADGET_MANIFEST}"
fi
echo ""
echo "Waiting for migrations job to complete..."
kubectl wait --for=condition=complete job/flowfish-migrations -n "${NAMESPACE}" --timeout=180s 2>/dev/null || {
echo " Migrations job still running or waiting for databases."
echo " Check status with: kubectl get jobs -n ${NAMESPACE}"
}
echo ""
echo "Waiting for core pods to be ready..."
kubectl wait --for=condition=ready pod -l app=backend -n "${NAMESPACE}" --timeout=300s 2>/dev/null || true
kubectl wait --for=condition=ready pod -l app=frontend -n "${NAMESPACE}" --timeout=120s 2>/dev/null || true
if [ "$with_gadget" = "true" ]; then
echo ""
echo "Waiting for Inspektor Gadget pods..."
kubectl wait --for=condition=ready pod -l app=inspektor-gadget -n "${NAMESPACE}" --timeout=120s 2>/dev/null || {
echo " Gadget pods not ready yet. Check: kubectl get pods -l app=inspektor-gadget -n ${NAMESPACE}"
}
fi
echo ""
echo "============================================="
echo " Deployment Complete!"
echo "============================================="
echo ""
echo " UI: http://localhost:30080"
echo " API: http://localhost:30080/api/v1/health"
echo ""
echo " Login: admin / admin123"
echo ""
if [ "$with_gadget" = "true" ]; then
echo " Inspektor Gadget: ENABLED (eBPF data collection active)"
echo " Container runtime socket path is auto-detected at pod startup."
echo " Supported: K3s, RKE2, standard K8s, MicroK8s."
echo " You can add this cluster as In-Cluster and run analyses."
else
echo " Inspektor Gadget: NOT installed"
echo " To analyze a cluster, add a remote cluster via Token method,"
echo " or re-deploy with: $0 install-with-gadget"
fi
echo ""
echo " Check status: $0 status"
echo "============================================="
}
uninstall() {
echo "Removing Flowfish from namespace ${NAMESPACE}..."
for (( i=${#MANIFESTS[@]}-1; i>=0; i-- )); do
manifest="${MANIFESTS[$i]}"
echo " Deleting ${manifest}..."
kubectl delete -f "${GITHUB_RAW}/${manifest}" --ignore-not-found 2>/dev/null || true
done
echo " Deleting ${GADGET_MANIFEST}..."
kubectl delete -f "${GITHUB_RAW}/${GADGET_MANIFEST}" --ignore-not-found 2>/dev/null || true
kubectl delete clusterrole flowfish-cluster-reader --ignore-not-found 2>/dev/null || true
kubectl delete clusterrolebinding flowfish-cluster-reader-binding --ignore-not-found 2>/dev/null || true
kubectl delete clusterrole inspektor-gadget --ignore-not-found 2>/dev/null || true
kubectl delete clusterrolebinding inspektor-gadget --ignore-not-found 2>/dev/null || true
kubectl delete crd traces.gadget.kinvolk.io --ignore-not-found 2>/dev/null || true
echo ""
echo "Flowfish has been removed."
}
status() {
echo "Flowfish Platform Status (namespace: ${NAMESPACE})"
echo ""
echo "--- Pods ---"
kubectl get pods -n "${NAMESPACE}" -o wide 2>/dev/null || echo "Namespace not found"
echo ""
echo "--- Services ---"
kubectl get svc -n "${NAMESPACE}" 2>/dev/null || true
echo ""
echo "--- Jobs ---"
kubectl get jobs -n "${NAMESPACE}" 2>/dev/null || true
}
restart() {
echo "Restarting all Flowfish deployments..."
kubectl rollout restart deployment -n "${NAMESPACE}" 2>/dev/null || true
echo "Rollout restart initiated. Pods will re-pull images."
echo "Monitor with: $0 status"
}
case "${1:-}" in
install) install false ;;
install-with-gadget) install true ;;
uninstall) uninstall ;;
status) status ;;
restart) restart ;;
*) usage ;;
esac