פריסת Solo Enterprise ל-kagent בהטמעה לדוגמה של תוכנת Distributed Cloud בלבד

‫Solo Enterprise for kagent מאפשר למנהלי פלטפורמות לפרוס ולנהל סוכני AI בתוכנת Google Distributed Cloud‏ (GDC) בלבד (GDC-SO). ביישום לדוגמה הזה, אתם משכפלים קובצי אימג' של קונטיינרים ותרשימי Helm למרשם פרטי של Harbor, פורסים את מישור הבקרה של kagent, את ממשק המשתמש ואת Solo Enterprise ל-agentgateway, ובודקים את ההנחיות לקביעת הגודל של האשכול. מידע נוסף על הארכיטקטורה זמין במאמר ארכיטקטורת עזר לשימוש בשרת MCP משלכם ב-kagent.

דרישות מוקדמות

לפני שמתחילים, ודאו שיש לכם גישה לתחנת עבודה של Linux עם Chrome,‏ Docker,‏ crane,‏ kubectl,‏ Helm,‏ envsubst ו-CLI של gdcloud. חשוב לוודא שהרכיבים הבאים מוגדרים בסביבת GDC-SO:

רכיב פרט או דרישה ערך לדוגמה
פרויקטGoogle Cloud ב-GDC-SO הפרויקט שמשויך לאשכול GDC-SO kagent-enterprise
אשכול אשכול היעד של GDC-SO user-project-8a210897
פרטי כניסה ל-Kubernetes ‏(Connect Gateway) חיבור לאשכול gcloud container fleet memberships get-credentials user-project-8a210897
מרשם פרטי כתובת ה-URL של המרשם ב-Harbor solo-kagent-enterprise.org-1.zone1.google.gdch.test
מאגר הפרויקט נתיב המאגר של הפרויקט solo-kagent-enterprise.org-1.zone1.google.gdch.test/kagent-enterprise
סוד משיכה שם הסוד של Docker pull solo-harbor-pull-secret

ההוראות הבאות רלוונטיות ל-Solo Enterprise ל-kagent מגרסה 0.4.0 ואילך.

הפריסה הזו אומתה בגרסה 1.31.5-gke.300 של GDC-SO.

פריסה באשכול GDC-SO

יוצרים קובץ .env על סמך הגדרות האשכול והמרשם:

export PUBLIC_REGISTRY="us-docker.pkg.dev/solo-public/kagent-enterprise-helm/charts"
export PUBLIC_MANAGEMENT_REGISTRY="us-docker.pkg.dev/solo-public/solo-enterprise-helm/charts"
export PUBLIC_AGENTGATEWAY_REGISTRY="us-docker.pkg.dev/solo-public/enterprise-agentgateway/charts"

# Set these based on your desired installation version
export KAGENT_ENT_VERSION=0.4.1
export KAGENT_VERSION=0.9.1
export AGENTGATEWAY_VERSION=v2.4.0-beta.0
export SOLO_LICENSE_KEY="SOLO_LICENSE_KEY"

# Set the following values based on your GDC setup
export PROJECT_ID="kagent-enterprise"
export CLUSTER_NAME="user-project-8a210897"
export NAMESPACE="solo-kagent"
export USER_CONTEXT="user-vm-1-zone1-gdch_console-org-1-zone1-google-gdch-test_user-vm-1"
export MGMT_CONTEXT="user-project-8a210897-zone1-gdch_console-org-1-zone1-google-gdch-test_user-project-8a210897"
export PULL_SECRET_NAME="solo-harbor-pull-secret"

# Set the following values based on your Harbor registry setup
export ORG="ORG"
export ZONE="ZONE"
export PRIVATE_REGISTRY="solo-kagent-enterprise.${ORG}.${ZONE}.google.gdch.test"
export PRIVATE_REPO="${PRIVATE_REGISTRY}/${PROJECT_ID}"
export PRIVATE_CHART_REGISTRY="${PRIVATE_REPO}/charts"

מחליפים את מה שכתוב בשדות הבאים:

  • ‫SOLO_LICENSE_KEY: מפתח הרישיון של Solo Enterprise
  • ‫ORG: שם הארגון ב-GDC
  • ‫ZONE: שם האזור ב-GDC

יצירת קובצי הערכים של Helm

יוצרים את קובצי הערכים של Helm לשלושת התרשימים. לא צריך לשנות ערכים, אלא אם רוצים להתאים אישית את ההתקנה. אפשר להגדיר מודלים וסוכנים נוספים בהמשך בממשק המשתמש של kagent.

יוצרים את הקובץ enterprise-agentgateway-values.yaml:

image:
  registry: ${PRIVATE_REPO}/enterprise-agentgateway
  tag: ${AGENTGATEWAY_VERSION}
licensing:
  licenseKey: ${SOLO_LICENSE_KEY}
imagePullSecrets:
- name: ${PULL_SECRET_NAME}
inferenceExtension:
  enabled: true

יוצרים את הקובץ kagent-enterprise-values.yaml:

registry: ${PRIVATE_REPO}
cluster: ${CLUSTER_NAME}
imagePullSecrets:
- name: ${PULL_SECRET_NAME}
global:
  imagePullSecrets:
  - name: ${PULL_SECRET_NAME}
oidc:
  skipOBO: true
otel:
  tracing:
    enabled: true
    exporter:
      otlp:
        endpoint: http://solo-enterprise-telemetry-collector.${NAMESPACE}.svc.cluster.local.:4317
        insecure: true
kubernetes:
  jwksUrl: "https://kubernetes.default.svc.cluster.local/openid/v1/jwks"
providers:
  default: OpenAI # Choose the model API type
  OpenAI:
    provider: OpenAI
    model: "/model/gemma-4-12B" # Choose the model
    apiKeySecretRef: "kagent-openai"
    apiKeySecretKey: "none" # Name of the key in the Secret, or "none" if no API key is required
controller:
  agentDeployment:
    podLabels:
      egress.networking.gke.io/enabled: "true"
  imagePullSecrets:
  - name: ${PULL_SECRET_NAME}
  image:
    registry: ${PRIVATE_REPO}
  agentImage:
    registry: ${PRIVATE_REPO}
    repository: "kagent-dev/kagent/app"
    pullSecret: "${PULL_SECRET_NAME}"
licensing:
  createSecret: true
  secretName: "enterprise-kagent-license"
kmcp:
  imagePullSecrets:
  - name: ${PULL_SECRET_NAME}
  image:
    registry: ${PRIVATE_REPO}
  enabled: true
kagent-tools:
  enabled: true
  imagePullSecrets:
  - name: ${PULL_SECRET_NAME}
  tools:
    image:
      registry: ${PRIVATE_REPO}
agents:
  k8s-agent:
    enabled: true
grafana-mcp:
  enabled: false # Pull secret is not supported
tools:
  grafana-mcp:
    enabled: false # Pull secret is not supported
database:
  postgres:
    bundled:
      storageClassName: local-shared
      image:
        registry: ${PRIVATE_REPO}
      enabled: true

יוצרים את הקובץ management-values.yaml:

cluster: ${CLUSTER_NAME}
context: "${USER_CONTEXT}"

management-crds:
  enabled: false

global:
  imagePullPolicy: IfNotPresent
  imagePullSecrets:
  - name: ${PULL_SECRET_NAME}

products:
  kagent:
    enabled: true
  agentgateway:
    enabled: true
  mesh:
    enabled: false
  agentregistry:
    enabled: false

oidc:
  issuer: ""

traces:
  verbose: false

tunnelserver:
  registry: ${PRIVATE_REPO}
  repository: solo-enterprise
  name: solo-enterprise-tunnel-server

ui:
  backend:
    registry: ${PRIVATE_REPO}
    repository: solo-enterprise
    name: solo-enterprise-ui-backend
    clickhouse:
      migrations:
        registry: ${PRIVATE_REPO}
  frontend:
    registry: ${PRIVATE_REPO}
    repository: solo-enterprise
  telemetryGateway:
    repository: ${PRIVATE_REPO}/otel/opentelemetry-collector-contrib

idp:
  registry: ${PRIVATE_REPO}
  repository: solo-enterprise

telemetry:
  image:
    registry: ${PRIVATE_REPO}
    repository: otel
    name: opentelemetry-collector-contrib
  k8sobjects:
    enabled: true
  metrics:
    enabled: false
  selfMonitoring:
    enabled: false
    verbose: false
  traces:
    enabled: true

clickhouse:
  enabled: true
  image:
    repository: ${PRIVATE_REPO}/clickhouse/clickhouse-server

הגדרת הסביבה

באותה ספרייה שבה נמצאים הקבצים .env וערכי Helm, טוענים את משתני הסביבה ויוצרים את התבניות של ערכי Helm. מריצים את שאר הפקודות במדריך הזה באותו סשן מעטפת, כדי שהמשתנים האלה יישארו מוגדרים:

SCRIPT_DIR="${PWD}"

set -a
source "$SCRIPT_DIR/.env"
set +a

COMMON_FLAGS=(--kube-context "$MGMT_CONTEXT" -n "$NAMESPACE" --create-namespace --insecure-skip-tls-verify)

# Values files live alongside the script. Render them with envsubst into
# *.generated.yaml siblings that are then fed to helm upgrade.

MANAGEMENT_VALUES_GENERATED="$SCRIPT_DIR/management-values.generated.yaml"
KAGENT_ENTERPRISE_VALUES_GENERATED="$SCRIPT_DIR/kagent-enterprise-values.generated.yaml"
ENTERPRISE_AGENTGATEWAY_VALUES_GENERATED="$SCRIPT_DIR/enterprise-agentgateway-values.generated.yaml"

envsubst < "$SCRIPT_DIR/management-values.yaml"            > "$MANAGEMENT_VALUES_GENERATED"
envsubst < "$SCRIPT_DIR/kagent-enterprise-values.yaml"     > "$KAGENT_ENTERPRISE_VALUES_GENERATED"
envsubst < "$SCRIPT_DIR/enterprise-agentgateway-values.yaml" > "$ENTERPRISE_AGENTGATEWAY_VALUES_GENERATED"

שיקוף של קובצי אימג' ותרשימים מהרישום הציבורי

מאמתים את Docker ו-Helm במאגר הפרטי של Harbor, ואז משכפלים את תרשימי Helm ואת קובצי האימג' של הקונטיינרים מהמאגר הציבורי:

# Authenticate to the private Harbor registry before mirroring charts and images.
helm registry login "$PRIVATE_REGISTRY"
docker login "$PRIVATE_REGISTRY"

function mirror() {
  if command -v crane &> /dev/null; then
    crane cp "$1" "$2"
  else
    docker pull "$1"
    docker tag "$1" "$2"
    docker push "$2"
  fi
}

MANAGEMENT_CHARTS=(management-crds management)
KAGENT_CHARTS=(kagent-enterprise-crds kagent-enterprise)
AGENTGATEWAY_CHARTS=(enterprise-agentgateway-crds enterprise-agentgateway)

# Mirror Helm chart OCI artifacts to the private registry using the same mirror() helper.

for CHART in "${MANAGEMENT_CHARTS[@]}"; do
  mirror \
    "${PUBLIC_MANAGEMENT_REGISTRY}/${CHART}:${KAGENT_ENT_VERSION}" \
    "${PRIVATE_CHART_REGISTRY}/${CHART}:${KAGENT_ENT_VERSION}"
done

for CHART in "${KAGENT_CHARTS[@]}"; do
  mirror \
    "${PUBLIC_REGISTRY}/${CHART}:${KAGENT_ENT_VERSION}" \
    "${PRIVATE_CHART_REGISTRY}/${CHART}:${KAGENT_ENT_VERSION}"
done

for CHART in "${AGENTGATEWAY_CHARTS[@]}"; do
  mirror \
    "${PUBLIC_AGENTGATEWAY_REGISTRY}/${CHART}:${AGENTGATEWAY_VERSION}" \
    "${PRIVATE_CHART_REGISTRY}/${CHART}:${AGENTGATEWAY_VERSION}"
done

# Discover images by templating the charts directly from their public OCI source.

IMAGES=$( (
  helm template management "oci://${PUBLIC_MANAGEMENT_REGISTRY}/management" \
    --version "$KAGENT_ENT_VERSION" \
    --set products.kagent.enabled=true \
    --set products.agentgateway.enabled=true \
    --set products.agentregistry.enabled=true \
    --set licensing.licenseKey=placeholder
  helm template kagent-enterprise "oci://${PUBLIC_REGISTRY}/kagent-enterprise" \
    --version "$KAGENT_ENT_VERSION" \
    --set licensing.licenseKey=placeholder \
    --set kmcp.licensing.licenseKey=placeholder \
    --set ui.enabled=true \
    --set kagent-tools.enabled=true \
    --set agents.k8s-agent.enabled=true
  helm template enterprise-agentgateway "oci://${PUBLIC_AGENTGATEWAY_REGISTRY}/enterprise-agentgateway" \
    --version "$AGENTGATEWAY_VERSION" \
    --set licensing.licenseKey=placeholder
) | grep "image:" | grep -v '{' | sed 's/.*image: //' | tr -d '" ' | grep -E '^[a-zA-Z0-9].*[:/]' | sort -u)

IMAGES_EXTRA="cr.kagent.dev/kagent-dev/kagent/golang-adk:$KAGENT_VERSION cr.kagent.dev/kagent-dev/kagent/app:$KAGENT_VERSION ghcr.io/kagent-dev/kagent/skills-init:$KAGENT_VERSION"

TARGET_PREFIX="${PRIVATE_REPO//\//\\/}"

for IMG in $IMAGES $IMAGES_EXTRA; do
  echo "From: $IMG"
  NEW_IMG=$(echo "$IMG" | sed s/'us-docker\.pkg\.dev\/solo-public'/"$TARGET_PREFIX"/ | sed s/'^clickhouse\/'/"$TARGET_PREFIX\/clickhouse\/"/ | sed s/'^argoproj\/'/"$TARGET_PREFIX\/argoproj\/"/ | sed s/'^docker.io\/otel\/'/"$TARGET_PREFIX\/otel\/"/ | sed s/'^docker.io\/library\/postgres'/"$TARGET_PREFIX\/library\/postgres"/ | sed s/'^cr.kagent.dev\/kagent-dev\/'/"$TARGET_PREFIX\/kagent-dev\/"/ | sed s/'^docker.io\/mcp\/'/"$TARGET_PREFIX\/mcp\/"/ | sed s/'^ghcr.io\/kagent-dev\/'/"$TARGET_PREFIX\/kagent-dev\/"/)
  echo "To  : $NEW_IMG"
  mirror "$IMG" "$NEW_IMG"
done

יצירת מרחב שמות באשכול GDC-SO

יוצרים את מרחב השמות של היעד באשכול:

kubectl create namespace "$NAMESPACE" --context "$MGMT_CONTEXT" \
    --dry-run=client -o yaml | kubectl apply --context "$MGMT_CONTEXT" -f -

יצירה והחלה של סוד משיכה של Docker באשכול

יוצרים את הסוד למשיכת נתונים ממאגר Docker באשכול:

kubectl create secret docker-registry "$PULL_SECRET_NAME" \
    --context "$MGMT_CONTEXT" \
    --namespace "$NAMESPACE" \
    --docker-server="$PRIVATE_REGISTRY" \
    --docker-username="REGISTRY_USERNAME" \
    --docker-password="REGISTRY_PASSWORD"

מחליפים את מה שכתוב בשדות הבאים:

  • ‫REGISTRY_USERNAME: שם המשתמש שלכם במרשם Harbor
  • ‫REGISTRY_PASSWORD: הסיסמה שלכם לרישום ב-Harbor

התקנת kagent

מתקינים את תרשימי ה-CRD ואת תרשימי Solo Enterprise for kagent Helm:

# Standard clusters allow cluster-scoped resources, so install CRD charts first.

helm upgrade -i management-crds \
  "oci://${PRIVATE_CHART_REGISTRY}/management-crds" \
  "${COMMON_FLAGS[@]}" \
  --version "$KAGENT_ENT_VERSION"

helm upgrade -i kagent-enterprise-crds \
  "oci://${PRIVATE_CHART_REGISTRY}/kagent-enterprise-crds" \
  "${COMMON_FLAGS[@]}" \
  --version "$KAGENT_ENT_VERSION"

helm upgrade -i enterprise-agentgateway-crds \
  "oci://${PRIVATE_CHART_REGISTRY}/enterprise-agentgateway-crds" \
  "${COMMON_FLAGS[@]}" \
  --version "$AGENTGATEWAY_VERSION"

helm upgrade -i management \
  "oci://${PRIVATE_CHART_REGISTRY}/management" \
  "${COMMON_FLAGS[@]}" \
  --version "$KAGENT_ENT_VERSION" \
  --values "$MANAGEMENT_VALUES_GENERATED" \
  --set "licensing.licenseKey=$SOLO_LICENSE_KEY"

helm upgrade -i kagent-enterprise \
  "oci://${PRIVATE_CHART_REGISTRY}/kagent-enterprise" \
  "${COMMON_FLAGS[@]}" \
  --version "$KAGENT_ENT_VERSION" \
  --values "$KAGENT_ENTERPRISE_VALUES_GENERATED" \
  --set "licensing.licenseKey=$SOLO_LICENSE_KEY" \
  --set "kmcp.licensing.licenseKey=$SOLO_LICENSE_KEY" \
  --set "controller.agentImage.tag=$KAGENT_VERSION" \
  --set "controller.skillsInitImage.tag=$KAGENT_VERSION"


helm upgrade -i enterprise-agentgateway \
  "oci://${PRIVATE_CHART_REGISTRY}/enterprise-agentgateway" \
  "${COMMON_FLAGS[@]}" \
  --version "$AGENTGATEWAY_VERSION" \
  --values "$ENTERPRISE_AGENTGATEWAY_VALUES_GENERATED" \
  --set "licensing.licenseKey=$SOLO_LICENSE_KEY"

אימות הפריסה

מוודאים שה-pods פועלים במרחב השמות:

kubectl get pods -n "$NAMESPACE" --context "$MGMT_CONTEXT"

הפלט אמור להיראות כך:

NAME                                                  READY   STATUS    RESTARTS   AGE
enterprise-agentgateway-5b57c9496b-hfnqq              1/1     Running   0          36m
k8s-agent-796b6674f5-fd8cq                            1/1     Running   0          4m8s
kagent-controller-5f7b44f647-9nd95                    1/1     Running   0          5m31s
kagent-postgresql-688d8c679d-4g9n9                    1/1     Running   0          36m
kagent-tools-6b9f8d58c6-t5zsm                         1/1     Running   0          23m
kmcp-enterprise-controller-manager-7886cdfb57-kgnmw   1/1     Running   0          23m
management-clickhouse-shard0-0                        1/1     Running   0          14m
solo-enterprise-telemetry-collector-0                 1/1     Running   0          23m
solo-enterprise-ui-7c7c889d6-frkvn                    5/5     Running   0          9m34s

מעבירים יציאה מקומית לשירות solo-enterprise-ui:

kubectl port-forward -n "$NAMESPACE" --context "$MGMT_CONTEXT" \
    svc/solo-enterprise-ui 9090:80

בדפדפן, עוברים אל http://localhost:9090 כדי לפתוח את ממשק המשתמש של Solo Enterprise for kagent ולהגדיר את המודלים והסוכנים:

‫Solo Enterprise לממשק המשתמש של לוח הבקרה של kagent.

שיקולי ביצועים וגודל הפריסה

בקטעים הבאים מוסבר איך צריכת המשאבים של הרכיבים משתנה, ומוצגות דוגמאות לאחסון בסיסי ולגודל המשאבים לפריסה של אשכול יחיד.

מאפייני שינוי קנה מידה

צריכת המשאבים משתנה באופן איכותי ככל שמספר הסוכנים ועומס הבקשות לכל סוכן גדלים בהתקנה של אשכול יחיד (התרשימים management ו-kagent-enterprise ללא ממסר). השתמשו במאפיינים האלה כדי לזהות אילו רכיבים רגישים לממדי התאמה ספציפיים, לפני שאתם משנים את הקצאות המשאבים או מתכננים את הקיבולת.

עובדות מרכזיות לגבי הארכיטקטורה שקובעות את ההתאמה לעומס

  • התנועה מהנציג ל-LLM היא ישירה. הסוכנים קוראים ישירות לנקודות קצה של מודל שפה גדול (LLM) (כמו שירות מודל בתוך האשכול). התנועה הזו לא עוברת דרך הבקר או דרך רכיב אחר של מישור הניהול. הוספת נציגים או הגדלת קצב הבקשות לא מגדילות את העומס שקשור ל-LLM על רכיבים משותפים.
  • שרתי MCP נמצאים בנתיב החם של הפעלת כלי הסוכן. כשנציג מפעיל כלי שמגובה על ידי שרת Model Context Protocol‏ (MCP), הקריאה היא סינכרונית וחוסמת. זמן האחזור וקצב הנתונים של שרת ה-MCP משפיעים ישירות על זמן האחזור של הבקשות מהסוכן. כל משאב MCPServer שנפרס הוא פריסה נפרדת עם מעטפת משאבים משלו.
  • טלמטריה היא הפלטפורמה העיקרית להרחבה. מדדים, מעקבים ותמונות מצב של אובייקטים ב-Kubernetes עוברים דרך צינור עיבוד הנתונים של הטלמטריה אל ClickHouse. הצינור הזה גדל ככל שמספר הנציגים ונפח הבקשות גדלים, והוא החלק במערכת שהכי רגיש למשאבים.
  • שרת המנהרה קיים, אבל לא מעביר תנועה משמעותית בהתקנה של אשכול יחיד. הקונטיינר tunnel-server פועל ב-Pod של ממשק המשתמש, אבל אין לו לקוחות לשרת והוא לא תורם ללחץ על ההתאמה לעומס.

התנהגות קנה המידה של הרכיב

בקטעים הבאים מתואר איך רכיבים בודדים משתנים בהתאם למספר הנציגים ולעומס הבקשות.

kagent-controller
  • הוא גדל באופן תת-ליניארי עם מספר הנציגים – כל נציג מחזיק בחיבור של סטרימינג מנציג לנציג (A2A).
  • לא רגיש לנפח הבקשות כי קריאות ל-LLM והפעלות של כלים עוקפות את הבקר.
  • תמיכה בהתאמה לעומס (scaling) אופקית כדי לפזר את עומס החיבורים והערכת המדיניות.
בקר ארגוני של KMCP

בקר הארגון של KMCP מונחה אירועים רק בשינויים במשאבי MCPServer, והוא לא רגיש למספר הסוכנים או לנפח הבקשות.

שרתי MCP
  • פריסה אחת לכל משאב מותאם אישית (CR) של MCPServer. גודל הצי גדל בהתאם למספר המשאבים של MCPServer שנפרסו.
  • פועל בנתיב החם הסינכרוני של הפעלת כלי הסוכן – זמן האחזור וקצב הנתונים משפיעים ישירות על הסוכנים.
  • הקצב משתנה בהתאם לקצב הכולל של קריאות ה-API לכלים בכל הצרכנים, כשסוכנים רבים קוראים לשרתים משותפים בו-זמנית.
  • מריץ שרתים מובנים (grafana-mcp,‏ querydoc) כרפליקה אחת כברירת מחדל. אפשר להגדיל את מספר הרפליקות או את המגבלות לשימוש משותף נרחב.
  • משתמש בתמונות, בבקשות למשאבים ובמגבלות על משאבים שהוגדרו על ידי המשתמש לשרתי MCP שנפרסו על ידי המשתמש.
אוסף נתוני טלמטריה
  • הוא משתנה באופן לינארי בהתאם לנפח הבקשות – כל בקשה מפיקה מדדים, ולפעמים גם נתוני מעקב.
  • הרכיב שהכי סביר שיהיה מוגבל במשאבים כשיש עומס גבוה על הנציג.
  • משמש כשער של OpenTelemetry Protocol ‏(OTLP) (מקבלים ביציאות 4316-4318) לאשכולות מרוחקים בהתקנה של כמה אשכולות. אין pod נפרד לשער.
  • משתמש ב-sidecar של k8sobjects, שמשתנה בהתאם לגודל המלאי של Kubernetes ולא בהתאם לקצב הבקשות.
ClickHouse

‫ClickHouse הוא צוואר הבקבוק העיקרי של המשאבים בעומס מתמשך. האחסון, הזיכרון והמעבד (CPU) גדלים בהתאם לגורמים הבאים:

  • מספר הסוכנים: כל סוג סוכן נוסף מגדיל את עוצמת המדד (שילובים ייחודיים של תוויות).
  • נפח הבקשות: כל בקשה יוצרת נקודות נתונים של מדדים וטווחים של מעקב שנכתבים ומתווספים לאינדקס.
  • גודל המלאי של Kubernetes: תמונות מצב של k8sobjects נשמרות מדי פעם, בלי קשר לעומס הבקשות.

קצב העברת הנתונים בכתיבה הוא נקודת הלחץ הראשונית. ביצועי השאילתות (שמשמשים את הקצה העורפי של ממשק המשתמש) יורדים ככל שנפח הנתונים גדל, בלי כוונון של הסכימה או של השמירה. הגדרת ברירת המחדל מטרגטת פריסה מתונה של צומת יחיד. עומסים כבדים יותר עשויים לדרוש הגדלה של replicasPerShard או shards, או התאמה של ערכי ה-TTL לשמירה.

בק-אנד של ממשק המשתמש
  • הוא חסר מצב (stateless) וקשור לשאילתות. הוא משתנה בהתאם לנפח הנתונים ב-ClickHouse ולא בהתאם לנפח הבקשות בזמן אמת.
  • ככל שמספר הסוכנים והנתונים ההיסטוריים גדלים, כך עולה העלות של שאילתות מעקב ושל תרשים הצי.
סוכנים
  • סוכנים שמבוססים על Python:
    • כל נציג הוא פריסה עצמאית – הוספת נציגים היא תוספת בלבד, ללא קנס על מצב משותף.
    • צריכת המשאבים של כל סוכן משתנה בהתאם למספר הבקשות בו-זמנית ולעומק שרשרת הכלים.
  • סוכנים שמבוססים על Go:
    • צורך בערך פי 36 פחות זיכרון במצב חוסר פעילות (7MB לעומת 253MB לכל סוכן במצב מנוחה).
    • משתמש בקובץ אימג' של קונטיינר שקטן פי 11 בערך (29.7MB לעומת 335.4MB).
    • ההפעלה מהירה פי 6.7 בערך (2.7 שניות לעומת 18.2 שניות).

סיכום מאפייני ההתאמה לעומס

בטבלה הבאה מפורט איך כל רכיב משתנה בהתאם למספר הנציגים ולעומס הבקשות:

רכיב רגישות למספר הסוכנים רגישות לעומס הבקשות הערות
שלט רחוק בינוני נמוכה שומר על שידורי A2A לכל נציג, לא מושפע מקצב השיחות של ה-LLM
Scaler ללא ללא מבוסס-אירועים, סטטי בפועל
בקר ארגוני של KMCP ללא ללא מגיב רק לשינויים במשאב MCPServer
שרתי MCP גבוהה גבוהה פריסה אחת לכל MCPServer CR; בנתיב החם של הפעלת הכלי
אוסף נתוני טלמטריה גבוהה גבוהה משטח קנה מידה ראשי; לינארי עם נפח הבקשות
ClickHouse גבוהה גבוהה צוואר הבקבוק העיקרי; נובע מהעוצמה (cardinality) ומקצב הכתיבה
בק-אנד של ממשק המשתמש נמוכה נמוכה תלוי בשאילתה; מושפע מנפח הנתונים ההיסטוריים
סוכנים (Python ו-Go) לא רלוונטי גבוהה פריסות עצמאיות; התאמה לעומס (scaling) עם בו-זמניות (concurrency)

גודל האחסון

בטבלה הבאה מפורטות המלצות ראשוניות לגבי הגדלים של נפחי האחסון:

  • נפח האחסון של PostgreSQL (מצב kagent, כולל ניהול סשנים, זיכרון ומחזור חיים) גדל באופן ליניארי ככל שמספר הסשנים של הצ'אט גדל.
  • גם האחסון ב-ClickHouse (מעקב) גדל באופן לינארי ככל שמספר הסשנים הייחודיים בצ'אט גדל.
רכיב עוצמת הקול המומלצת להתחלה
PostgreSQL ‫50 GiB
ClickHouse ‫50 GiB

גודל הפריסה

בקטעים הבאים מפורטות בקשות ברירת המחדל למשאבי מעבד (CPU), זיכרון ואחסון, והמגבלות שלהם בתרשימי Helm.

תרשים ניהול

התרשים management פורס את ה-pod‏ solo-enterprise-ui, אוסף טלמטריה עצמאי ו-ClickHouse.

‫solo-enterprise-ui קונטיינרים של Pod

בטבלה הבאה מפורטות בקשות המשאבים ומגבלות ברירת המחדל של קונטיינרים של pod ב-solo-enterprise-ui:

מאגר מופעל בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון
ui-backend תמיד ‫250 מ' ‫500 מ' 512Mi 1024Mi
ui-frontend תמיד ‫250 מ' ‫500 מ' 512Mi 1024Mi
k8sobjects-collector telemetry.k8sobjects.enabled 100 מ' ‫300 מ' 384Mi 768Mi
idp ‫autoAuth מופעל 100 מ' ‫250 מ' 256Mi 512Mi
אוסף טלמטריה (StatefulSet או Deployment)

בטבלה הבאה מפורטות בקשות המשאבים ומגבלות ברירת המחדל לאיסוף נתוני הטלמטריה:

רכיב בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון
telemetry-collector 200 מטר ‫1,000 מטר 512Mi 2Gi

גם שער הטלמטריה (OpenTelemetry collector) מגדיר את המשאבים שלו בנפרד:

רכיב בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון
telemetry-gateway 100 מ' ‫500 מ' 300Mi 1024Mi
תרשים משנה של ClickHouse

בטבלה הבאה מפורטות בקשות המשאבים ומגבלות ברירת המחדל של תרשים המשנה של ClickHouse, על סמך ההגדרה הקבועה מראש של Bitnami 2xlarge, שמוגדרת באמצעות הערכים replicasPerShard ו-shards:

רכיב בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון אחסון זמני
clickhouse ‫1,000m (ליבה אחת) ‫6,000m‏ (6 ליבות) ‫3072Mi‏ (3 GiB) ‫12288Mi‏ (12 GiB) 50Mi

תרשים kagent-enterprise

תרשים kagent-enterprise פורס את הבקר הראשי, תרשים המשנה kmcp-enterprise, שרתי כלים מובנים של MCP וסוכנים אופציונליים.

רכיבי ליבה

בטבלה הבאה מפורטות בקשות המשאבים ומגבלות ברירת המחדל של בקר הליבה:

רכיב מופעל בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון
controller תמיד 100 מ' ‫2,000m‏ (2 ליבות) 128Mi 512Mi
תרשים משנה של kmcp-enterprise

בטבלה הבאה מפורטות בקשות המשאבים ומגבלות ברירת המחדל של הבקר kmcp-enterprise:

רכיב בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון
kmcp-enterprise-controller 100 מ' ‫500 מ' 128Mi 512Mi
כלים מובנים

בטבלה הבאה מפורטות בקשות המשאבים ומגבלות ברירת המחדל של שרתי הכלים המובנים:

רכיב מופעל בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון
kagent-tools kagent-tools.enabled 100 מ' ‫1,000 מטר 256Mi 1Gi
grafana-mcp grafana-mcp.enabled 100 מ' ‫500 מ' 128Mi 512Mi
querydoc querydoc.enabled 100 מ' ‫500 מ' 128Mi 512Mi
סוכנים

כל הנציגים משתמשים באותו פרופיל משאבים שמוגדר כברירת מחדל. כל סוכן מושבת כברירת מחדל ומופעל בנפרד:

סוכן בקשת מעבד (CPU) מגבלת מעבד (CPU) בקשת זיכרון מגבלת הזיכרון
k8s-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
kgateway-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
istio-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
promql-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
observability-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
argo-rollouts-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
helm-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
cilium-policy-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
cilium-manager-agent 100 מ' ‫1,000 מטר 256Mi 1Gi
cilium-debug-agent 100 מ' ‫1,000 מטר 256Mi 1Gi