Distributed Cloud 소프트웨어 전용 참조 구현에 kagent용 Solo Enterprise 배포

kagent용 Solo Enterprise를 사용하면 플랫폼 관리자가 Google Distributed Cloud(GDC) 소프트웨어 전용(GDC-SO)에서 AI 에이전트를 배포하고 관리할 수 있습니다. 이 참조 구현에서는 컨테이너 이미지와 Helm 차트를 비공개 Harbor 레지스트리에 미러링하고, kagent 컨트롤 플레인, UI, agentgateway용 Solo Enterprise를 배포하고, 클러스터 크기 조절 가이드라인을 검토합니다. 아키텍처에 대한 자세한 내용은 kagent 참조 아키텍처에 자체 MCP 서버 가져오기를 참조하세요.

기본 요건

시작하기 전에 Chrome, Docker, crane, kubectl, Helm, envsubst, gdcloud CLI가 설치된 Linux 워크스테이션에 액세스할 수 있는지 확인합니다. GDC-SO 환경에 다음 구성요소가 구성되어 있는지 확인합니다.

구성요소 세부정보 또는 요구사항 예시 값
GDC-SO용Google Cloud 프로젝트 GDC-SO 클러스터와 연결된 프로젝트 kagent-enterprise
클러스터 대상 GDC-SO 클러스터 user-project-8a210897
Kubernetes 사용자 인증 정보(Connect Gateway) 클러스터에 연결 gcloud container fleet memberships get-credentials user-project-8a210897
비공개 레지스트리 Harbor 레지스트리 URL solo-kagent-enterprise.org-1.zone1.google.gdch.test
프로젝트 저장소 프로젝트 저장소 경로 solo-kagent-enterprise.org-1.zone1.google.gdch.test/kagent-enterprise
pull 보안 비밀 Docker pull 보안 비밀 이름 solo-harbor-pull-secret

다음 안내는 kagent 버전 0.4.0 이상의 Solo Enterprise에 적용됩니다.

이 배포는 GDC-SO 버전 1.31.5-gke.300에서 검증되었습니다.

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 값 파일 만들기

차트 3개의 Helm 값 파일을 만듭니다. 설치를 맞춤설정하지 않는 한 값을 수정할 필요가 없습니다. 나중에 kagent UI에서 추가 모델과 에이전트를 구성할 수 있습니다.

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 pull 보안 비밀을 만들어 클러스터에 적용

클러스터에 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 차트와 kagent용 Solo Enterprise 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"

배포 검증

네임스페이스에서 포드가 실행 중인지 확인합니다.

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로 이동하여 kagent용 Solo Enterprise UI를 열고 모델과 에이전트를 구성합니다.

kagent UI 대시보드용 Solo Enterprise입니다.

성능 고려사항 및 배포 크기 조정

다음 섹션에서는 구성요소 리소스 소비가 확장되는 방식을 설명하고 단일 클러스터 배포의 기준 스토리지 및 리소스 크기 조정을 제공합니다.

확장 특성

단일 클러스터 설치에서 에이전트 수와 에이전트당 요청 부하가 증가함에 따라 리소스 소비가 질적으로 변화합니다(릴레이가 없는 management 및 kagent-enterprise 차트). 이러한 특성을 사용하여 리소스 할당을 조정하거나 용량을 계획하기 전에 특정 확장 측정기준에 민감한 구성요소를 식별합니다.

확장을 제어하는 주요 아키텍처 사실

  • 에이전트와 LLM 간의 트래픽은 직접 전송됩니다. 에이전트는 대규모 언어 모델(LLM) 엔드포인트(예: 클러스터 내 모델 서비스)를 직접 호출합니다. 이 트래픽은 컨트롤러 또는 다른 관리 영역 구성요소를 통과하지 않습니다. 에이전트를 추가하거나 요청 비율을 늘려도 공유 구성요소의 LLM 관련 부하는 증가하지 않습니다.
  • MCP 서버는 에이전트 도구 실행의 핫 경로에 있습니다. 에이전트가 모델 컨텍스트 프로토콜(MCP) 서버에서 지원하는 도구를 호출하면 호출은 동기식이며 차단됩니다. MCP 서버 지연 시간과 처리량은 에이전트 요청 지연 시간에 직접적인 영향을 미칩니다. 배포된 각 MCPServer 리소스는 자체 리소스 엔벨로프가 있는 별도의 배포입니다.
  • 원격 분석은 기본 확장 표면입니다. 측정항목, trace, Kubernetes 객체 스냅샷은 모두 원격 분석 파이프라인을 통해 ClickHouse로 전달됩니다. 이 파이프라인은 에이전트 수와 요청량에 따라 증가하며 시스템에서 리소스에 가장 민감한 부분입니다.
  • 터널 서버가 있지만 단일 클러스터 설치에서 의미 있는 트래픽을 전달하지 않습니다. tunnel-server 컨테이너는 UI 포드에서 실행되지만 제공할 클라이언트가 없으며 확장 압력에 기여하지 않습니다.

구성요소 확장 동작

다음 섹션에서는 에이전트 수와 요청 부하에 따라 개별 구성요소가 확장되는 방식을 설명합니다.

kagent-controller
  • 에이전트 수에 따라 하위 선형으로 증가합니다. 각 에이전트는 에이전트 간(A2A) 스트림 연결을 보유합니다.
  • LLM 호출 및 도구 실행이 컨트롤러를 우회하므로 요청 볼륨에 민감하지 않습니다.
  • 연결 및 정책 평가 부하를 분산하기 위한 수평 확장을 지원합니다.
KMCP 엔터프라이즈 컨트롤러

KMCP 엔터프라이즈 컨트롤러는 MCPServer 리소스 변경사항에만 이벤트 기반으로 작동하며 에이전트 수나 요청 볼륨에 민감하지 않습니다.

MCP 서버
  • MCPServer 커스텀 리소스(CR)당 배포 하나를 배포합니다. Fleet 크기는 배포된 MCPServer 리소스 수에 따라 증가합니다.
  • 에이전트 도구 실행의 동기식 핫 경로에서 실행됩니다. 지연 시간과 처리량이 에이전트에 직접적인 영향을 미칩니다.
  • 공유 서버가 여러 에이전트에 의해 동시에 호출될 때 모든 소비자 간의 총 도구 호출 속도에 따라 확장됩니다.
  • 기본적으로 기본 제공 서버(grafana-mcp, querydoc)를 단일 복제본으로 실행합니다. 많이 공유되는 사용 사례의 경우 복제본 또는 한도를 늘립니다.
  • 사용자 배포 MCP 서버에 사용자 정의 이미지, 리소스 요청, 리소스 한도를 사용합니다.
원격 분석 수집기
  • 요청 볼륨에 따라 선형적으로 확장됩니다. 각 요청은 측정항목과 trace(선택사항)를 내보냅니다.
  • 에이전트 부하가 높을 때 리소스 제약이 발생할 가능성이 가장 높은 구성요소입니다.
  • 멀티 클러스터 설치에서 원격 클러스터의 OpenTelemetry 프로토콜(OTLP) 게이트웨이(포트 4316~4318의 수신자) 역할을 합니다. 별도의 게이트웨이 포드가 없습니다.
  • 요청 비율이 아닌 Kubernetes 인벤토리 크기에 따라 확장되는 k8sobjects 사이드카를 사용합니다.
ClickHouse

ClickHouse는 지속적인 부하가 발생하는 경우 기본 리소스 병목 현상입니다. 스토리지, 메모리, CPU는 모두 다음 요소에 따라 증가합니다.

  • 에이전트 수: 에이전트 유형이 추가될 때마다 측정항목 카디널리티(고유 라벨 조합)가 증가합니다.
  • 요청 볼륨: 각 요청은 작성 및 색인 생성되는 측정항목 데이터 포인트와 trace 스팬을 생성합니다.
  • Kubernetes 인벤토리 크기: k8sobjects 스냅샷은 요청 부하와 관계없이 주기적으로 저장됩니다.

쓰기 처리량이 초기 압박 지점입니다. 스키마 또는 보관 조정 없이 데이터 볼륨이 증가하면 쿼리 성능(UI 백엔드에서 사용)이 저하됩니다. 기본 구성은 적당한 단일 노드 배포를 타겟팅합니다. 부하가 더 큰 경우 replicasPerShard 또는 shards를 늘리거나 보관 TTL을 조정해야 할 수 있습니다.

UI 백엔드
  • 스테이트리스(Stateless)이며 쿼리에 바인딩됩니다. 실시간 요청 처리량이 아닌 ClickHouse의 데이터 볼륨에 따라 확장됩니다.
  • 에이전트 수와 이전 데이터가 증가함에 따라 Fleet 그래프 및 trace 쿼리 비용이 증가합니다.
에이전트
  • Python 기반 에이전트:
    • 각 에이전트는 독립적인 배포입니다. 에이전트를 추가하는 것은 순수하게 추가적인 작업이며 공유 상태 페널티가 없습니다.
    • 에이전트별 리소스 소비는 요청 동시 실행 및 도구 체인 깊이에 따라 확장됩니다.
  • Go 기반 에이전트:
    • 유휴 메모리를 약 36배 적게 사용합니다(휴지 상태의 에이전트당 7MB 대 253MB).
    • 약 11배 더 작은 컨테이너 이미지(29.7MB 대 335.4MB)를 사용합니다.
    • 약 6.7배 더 빠르게 시작됩니다(2.7초 대 18.2초).

확장 특성 요약

다음 표에는 에이전트 수 및 요청 부하에 따라 각 구성요소가 확장되는 방식이 요약되어 있습니다.

구성요소 상담사 수에 민감함 요청 부하에 민감함 참고
컨트롤러 보통 낮음 에이전트별로 A2A 스트림을 유지하며 LLM 호출 속도의 영향을 받지 않음
Scaler 없음 없음 이벤트 기반, 사실상 정적
KMCP 엔터프라이즈 컨트롤러 없음 없음 MCPServer 리소스 변경사항에만 반응
MCP 서버 높음 높음 MCPServer CR당 배포 1개, 도구 실행의 핫 경로에 있음
원격 분석 수집기 높음 높음 기본 확장 영역, 요청량에 따라 선형적으로 확장
ClickHouse 높음 높음 기본 병목 현상, 카디널리티 및 쓰기 속도에 의해 발생
UI 백엔드 낮음 낮음 쿼리 바인딩, 이전 데이터 볼륨의 영향을 받음
에이전트(Python 및 Go) 해당 사항 없음 높음 독립적인 배포, 동시 실행으로 확장

스토리지 크기 조정

다음 표에서는 시작 스토리지 볼륨 크기에 대한 초기 권장사항을 제공합니다.

  • PostgreSQL 스토리지(세션, 메모리, 수명 주기 관리를 포함한 kagent 상태)는 채팅 세션 수가 증가함에 따라 선형적으로 확장됩니다.
  • ClickHouse 스토리지(추적)도 고유 채팅 세션 수가 증가함에 따라 선형적으로 확장됩니다.
구성요소 권장 시작 볼륨
PostgreSQL 50GiB
ClickHouse 50GiB

배포 크기 조정

다음 섹션에는 Helm 차트의 기본 CPU, 메모리, 스토리지 리소스 요청 및 한도가 나와 있습니다.

관리 차트

management 차트는 solo-enterprise-ui 포드, 독립형 원격 분석 수집기, ClickHouse를 배포합니다.

포드 컨테이너 solo-enterprise-ui개

다음 표에는 solo-enterprise-ui 포드 컨테이너의 기본 리소스 요청 및 한도가 나와 있습니다.

컨테이너 사용 설정됨 CPU 요청 CPU 한도 메모리 요청 메모리 한도
ui-backend 항상 250m 500m 512Mi 1024Mi
ui-frontend 항상 250m 500m 512Mi 1024Mi
k8sobjects-collector telemetry.k8sobjects.enabled 100분 300m 384Mi 768Mi
idp autoAuth 사용 설정됨 100분 250m 256Mi 512Mi
원격 분석 수집기(StatefulSet 또는 배포)

다음 표에는 원격 분석 수집기의 기본 리소스 요청 및 한도가 나와 있습니다.

구성요소 CPU 요청 CPU 한도 메모리 요청 메모리 한도
telemetry-collector 200m 1,000m 512Mi 2Gi

원격 분석 게이트웨이(OpenTelemetry Collector)도 자체 리소스를 별도로 정의합니다.

구성요소 CPU 요청 CPU 한도 메모리 요청 메모리 한도
telemetry-gateway 100분 500m 300Mi 1024Mi
ClickHouse 하위 차트

다음 표에는 Bitnami 2xlarge 사전 설정을 기반으로 하고 replicasPerShard 및 shards 값을 사용하여 구성된 ClickHouse 하위 차트의 기본 리소스 요청 및 한도가 나와 있습니다.

구성요소 CPU 요청 CPU 한도 메모리 요청 메모리 한도 임시 스토리지
clickhouse 1000m(코어 1개) 6,000m(코어 6개) 3072Mi(3GiB) 12288Mi(12GiB) 50Mi

kagent-enterprise 차트

kagent-enterprise 차트는 핵심 컨트롤러, kmcp-enterprise 하위 차트, 기본 제공 MCP 도구 서버, 선택적 에이전트를 배포합니다.

핵심 구성요소

다음 표에는 핵심 컨트롤러의 기본 리소스 요청 및 한도가 나와 있습니다.

구성요소 사용 설정됨 CPU 요청 CPU 한도 메모리 요청 메모리 한도
controller 항상 100분 2000m(코어 2개) 128Mi 512Mi
kmcp-enterprise 하위 차트

다음 표에는 kmcp-enterprise 컨트롤러의 기본 리소스 요청 및 한도가 나와 있습니다.

구성요소 CPU 요청 CPU 한도 메모리 요청 메모리 한도
kmcp-enterprise-controller 100분 500m 128Mi 512Mi
기본 제공 도구

다음 표에는 기본 제공 도구 서버의 기본 리소스 요청 및 한도가 나와 있습니다.

구성요소 사용 설정됨 CPU 요청 CPU 한도 메모리 요청 메모리 한도
kagent-tools kagent-tools.enabled 100분 1,000m 256Mi 1Gi
grafana-mcp grafana-mcp.enabled 100분 500m 128Mi 512Mi
querydoc querydoc.enabled 100분 500m 128Mi 512Mi
에이전트

모든 에이전트는 동일한 기본 리소스 프로필을 공유합니다. 각 에이전트는 기본적으로 사용 중지되며 개별적으로 사용 설정됩니다.

에이전트 CPU 요청 CPU 한도 메모리 요청 메모리 한도
k8s-agent 100분 1,000m 256Mi 1Gi
kgateway-agent 100분 1,000m 256Mi 1Gi
istio-agent 100분 1,000m 256Mi 1Gi
promql-agent 100분 1,000m 256Mi 1Gi
observability-agent 100분 1,000m 256Mi 1Gi
argo-rollouts-agent 100분 1,000m 256Mi 1Gi
helm-agent 100분 1,000m 256Mi 1Gi
cilium-policy-agent 100분 1,000m 256Mi 1Gi
cilium-manager-agent 100분 1,000m 256Mi 1Gi
cilium-debug-agent 100분 1,000m 256Mi 1Gi