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를 열고 모델과 에이전트를 구성합니다.
성능 고려사항 및 배포 크기 조정
다음 섹션에서는 구성요소 리소스 소비가 확장되는 방식을 설명하고 단일 클러스터 배포의 기준 스토리지 및 리소스 크기 조정을 제공합니다.
확장 특성
단일 클러스터 설치에서 에이전트 수와 에이전트당 요청 부하가 증가함에 따라 리소스 소비가 질적으로 변화합니다(릴레이가 없는 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 |