Chuyển đến nội dung chính
Chạy ứng dụng của bạn và collector AgentEye trong cùng một Pod Kubernetes để telemetry không bao giờ phải vượt qua ranh giới mạng để được thu thập. SDK ứng dụng của bạn và collector chia sẻ một spool sự kiện trong pod duy nhất, có nghĩa là handoff telemetry độ trễ thấp, trong process không có localhost port để expose, không có service mesh để traverse, và vòng đời của collector được liên kết trực tiếp với workload mà nó quan sát. Chứng chỉ mTLS client mà collector trình bày được gửi trực tiếp vào pod của bạn từ AWS Secrets Manager, vì vậy vòng quay credential không yêu cầu sắp xếp tệp thủ công ở phía của bạn. Mô hình sidecar + shared-spool được mô tả ở đây là cloud-agnostic; hai container chia sẻ một spool sự kiện emptyDir hoạt động trên bất kỳ phân phối Kubernetes nào. Chỉ đường dẫn truyền tải chứng chỉ trong hướng dẫn này (AWS Secrets Manager + Secrets Store CSI Driver + IRSA) là cụ thể cho AWS / EKS. Nếu bạn chạy ở nơi khác, hãy giữ nguyên layout pod và spool, và thay thế cơ chế gắn secret của platform của bạn cho Phases 2 và 3.
Khi nào nên sử dụng pattern này. Chọn single-pod khi ứng dụng của bạn không nên gọi qua ranh giới mạng để tiếp cận collector (low-latency in-pod IPC, tight lifecycle coupling, per-tenant pod isolation). Đối với các fleet multi-app chia sẻ một collector trên mỗi node hoặc trên mỗi cluster, xem enterprise-docs/kubernetes-deployment.md thay thế.

Tóm tắt nhanh

Hai dòng dữ liệu, hai volume:
  • Events (in-pod): SDK của app bạn ghi các tệp .jsonl vào emptyDir chia sẻ tại $AGENTEYE_HOME/events/; collector sweeper đọc chúng và upload. Không có localhost port, không có loopback, handoff thuần pure shared-filesystem.
  • mTLS cert (pod ← cloud): Secrets Store CSI Driver gắn kết bundle chứng chỉ từ Secrets Manager vào một volume read-only tại /etc/agenteye/tls/, scoped đến collector container.
Hai bên độc lập:
BênTrách nhiệm
ExospherePhát hành chứng chỉ mTLS client và gửi bundle vào tài khoản AWS của bạn trong Secrets Manager dưới một tên ổn định. Tái xuất bản bundle được gia hạn vào cùng secret trước khi hết hạn.
BạnCài đặt Secrets Store CSI Driver, cấp quyền đọc cho ServiceAccount của pod tới secret thông qua IRSA, và áp dụng Pod manifest. Đó là tất cả.

Điều kiện tiên quyết

Trong tài khoản AWS / EKS cluster của bạn

  • Một EKS cluster với OIDC provider được liên kết. Xác nhận bằng:
    Nếu lệnh trả về một URL https://oidc.eks.…, OIDC được bật. Nếu không, hãy liên kết một:
  • Secrets Store CSI DriverAWS provider được cài đặt trong cluster (xem § Phase 2).
  • AWS CLI v2 và kubectl trên workstation của bạn.

Phối hợp với Exosphere

Trước khi deploy, Exosphere gửi bundle mTLS client vào Secrets Manager của tài khoản AWS của bạn và cung cấp:
  • Tên secret (quy ước: agenteye/mtls-client/<your-cluster>)
  • AWS region mà secret được lưu trữ
  • URL backend AgentEye để cấu hình collector
  • API key collector của bạn (xem enterprise-docs/api-keys.md)

Phase 1: Cái gì Exosphere gửi

Bạn không tự tạo ra chứng chỉ mTLS client. Exosphere phát hành nó và gửi bundle trực tiếp vào Secrets Manager của tài khoản AWS của bạn, vì vậy credential material duy nhất bao giờ được gửi tới môi trường của bạn là secret finished, ready-to-mount. Cái gì đến trong tài khoản của bạn:
Thuộc tínhGiá trị
Tên secretagenteye/mtls-client/<cluster-name> (ổn định qua renewals)
RegionAWS region bạn đã chỉ định cho EKS cluster của bạn
PayloadMột JSON secret duy nhất có ba keys (client.crt, client.key, và ca.crt), mỗi cái giữ PEM-encoded material
TagAgentEyeCluster=<cluster-name>
Khi gia hạn, cùng secret được cập nhật tại chỗ với một phiên bản mới, vì vậy ARN và tên không bao giờ thay đổi; SecretProviderClass và IAM policy của bạn tiếp tục hoạt động không thay đổi. Để biết về vòng đời chứng chỉ (validity, renewal cadence, expiry alerting), xem enterprise-docs/kubernetes-deployment.md.

Phase 2: Cài đặt Secrets Store CSI Driver + AWS provider

Bỏ qua bước này nếu bạn đã chạy một workload khác gắn AWS secrets qua CSI.
Xác minh:
Kỳ vọng: Running cho mỗi pod.
Tại sao rotationPollInterval=1h? Khi Exosphere xuất bản một chứng chỉ được gia hạn, Secrets Manager được cập nhật tại chỗ. CSI Driver đọc lại secret trên khoảng thời gian này và ghi lại các tệp được gắn. Collector đọc các tệp chứng chỉ một lần khi khởi động, vì vậy nó chỉ bắt đầu trình bày chứng chỉ được gia hạn sau khi process khởi động lại; xem § Certificate rotation để biết cách trigger một.

Phase 3: Cấp quyền đọc cho pod để truy cập secret (IRSA)

3.1 Tạo IAM policy

Lưu dưới dạng agenteye-mtls-reader-policy.json:
Thay thế <region>, <account-id>, và <cluster-name>. Hậu tố -* cuối cùng khớp với hậu tố ngẫu nhiên sáu ký tự AWS thêm vào mỗi secret ARN. Tạo policy:

3.2 Tạo IAM role và liên kết nó với ServiceAccount của pod

Cái này tạo một ServiceAccount tên agenteye-pod với annotation eks.amazonaws.com/role-arn trỏ tới role mới.

3.3 Quyền IAM bắt buộc: tóm tắt

QuyềnPhạm viLý do
secretsmanager:GetSecretValuearn:aws:secretsmanager:<region>:<acct>:secret:agenteye/mtls-client/<cluster>-*CSI Driver đọc bundle cert trên mỗi mount + rotation tick.
secretsmanager:DescribeSecretgiống nhauCSI Driver gọi DescribeSecret để phát hiện thay đổi version giữa các polls.
Không cấp secretsmanager:PutSecretValue, secretsmanager:UpdateSecret, hoặc secretsmanager:DeleteSecret cho pod. Pod chỉ khi nào đọc secret; viết phiên bản mới vào nó được xử lý bởi Exosphere khi chứng chỉ được phát hành hoặc gia hạn. Nếu secret được mã hóa bằng customer-managed KMS key (không phải default aws/secretsmanager key), cũng cấp:

Phase 4: Deploy Pod

4.1 SecretProviderClass

agenteye-mtls-spc.yaml:
Khối jmesPath báo cho AWS provider chia JSON secret thành ba tệp riêng biệt trên disk. Quoting trong '"client.crt"' được yêu cầu vì JMESPath coi . là một sub-expression operator.

4.2 Pod / Deployment manifest

Cách hai container nói chuyện với nhau. AgentEye SDK và collector không giao tiếp qua một network socket; không có local HTTP port. SDK ghi event batches dưới dạng các tệp .jsonl vào $AGENTEYE_HOME/events/, và collector liên tục xem thư mục đó và upload từng tệp. Đối với một sidecar pod, cái này có nghĩa là:
  • Cả hai container gắn cùng một emptyDir volume tại cùng một path.
  • Cả hai container đặt AGENTEYE_HOME tới path đó.
  • Image ứng dụng của bạn phải có AgentEye SDK được cài đặt và cấu hình (xem enterprise-docs/python-sdk.md).
Khi AGENTEYE_HOME chưa được set, cả SDK và collector đều mặc định tới ~/.agenteye, và hai container có các thư mục home khác nhau, vì vậy chúng sẽ hạ cánh trên hai spools riêng biệt và handoff sẽ silently fail. Đặt AGENTEYE_HOME tới cùng một path tường minh trên cả hai containers. §4.3 verification và matching Troubleshooting row bắt cái này nếu nó bị bỏ sót.
agenteye-pod.yaml (Deployment với một replica, scale khi cần):
Secret agenteye-collector-api-key giữ API key của collector (xem enterprise-docs/api-keys.md để cấp phát). Áp dụng:

4.3 Xác minh

Kỳ vọng: client.crt, client.key, ca.crt tất cả đều có mặt và read-only, sở hữu bởi container user. Xác nhận spool sự kiện chia sẻ được hiển thị cho cả hai containers:
Nếu hai listings phân kỳ, volume không được gắn trong cả hai containers (hoặc AGENTEYE_HOME khác); xem § Troubleshooting. End-to-end smoke test:
Kỳ vọng: collector upload bất kỳ queued events nào và in tóm tắt Done: N/N uploaded, 0 failed.. Nếu spool trống, nó in No pending files. và thoát mà không validate bất cứ gì — vì vậy chỉ chạy điều này sau khi app của bạn đã flush ít nhất một event. Lưu ý rằng flush thoát non-zero chỉ cho local setup faults: missing configuration (no URL/key resolved) hoặc unreadable/unparseable TLS cert (check § Troubleshooting). Wrong API key không thay đổi exit code — upload nhận một 401, tệp được di chuyển đến failed/, và lệnh vẫn in [FAILED] … per file cộng với Done: 0/N uploaded, N failed. và thoát 0. Để phát hiện một bad key hoặc rejected upload, đọc đầu ra Done:/[FAILED] hoặc kiểm tra các tệp hạ cánh trong $AGENTEYE_HOME/failed/, không phải exit code.

Xoay vòng chứng chỉ

Chứng chỉ client có hiệu lực trong 90 ngày và được tự động gia hạn khoảng 15 ngày trước khi hết hạn; Exosphere sau đó xuất bản bundle được gia hạn vào cùng Secrets Manager secret. Từ đó, dòng in-pod là:
  1. Secret của Secrets Manager nhận được một phiên bản AWSCURRENT mới. ARN và tên không thay đổi.
  2. Trong rotationPollInterval (1h theo mặc định; xem § Phase 2), CSI Driver đọc phiên bản mới và ghi lại các tệp dưới /etc/agenteye/tls/.
  3. Collector tải các tệp chứng chỉ một lần khi khởi động, vì vậy nó tiếp tục trình bày chứng chỉ trước cho đến khi process khởi động lại. Để chuyển sang tài liệu được gia hạn, khởi động lại collector; rolling restart là đủ:
    Để làm cho điều này tự động, thêm một sidecar xem /etc/agenteye/tls/ (ví dụ với inotifywait) và trigger rollout khi các tệp thay đổi.
Vì chứng chỉ trước đó vẫn có hiệu lực khoảng 15 ngày sau khi gia hạn, bạn có một cửa sổ rộng để thực hiện restart mà không bị gián đoạn ingestion. Exosphere xuất bản bundle được gia hạn cho bạn; hành động thường xuyên duy nhất ở phía bạn là đảm bảo collector khởi động lại trong cửa sổ đó.

Khắc phục sự cố

Triệu chứngNguyên nhân có khả năngSửa chữa
Pod stuck in ContainerCreating, events show MountVolume.SetUp failed for volume "agenteye-mtls"CSI provider không thể tiếp cận Secrets ManagerKiểm tra IRSA được liên kết chính xác: kubectl describe sa agenteye-pod -n <ns> cho thấy annotation eks.amazonaws.com/role-arn. Kiểm tra CloudTrail cho cuộc gọi AssumeRole.
Error: AccessDeniedException: not authorized to perform secretsmanager:GetSecretValueIAM policy được scoped tới ARN saiSecret ARN suffix là random; sử dụng agenteye/mtls-client/<cluster>-* với wildcard, không phải ARN chính xác.
Error: ParameterNotFound từ AWS providerSecret name mismatch giữa SecretProviderClass.objects[].objectName và secret mà Exosphere gửiXác nhận tên chính xác với aws secretsmanager list-secrets --filters Key=tag-key,Values=AgentEyeCluster.
jmesPath error, chỉ một tệp được gắnJMESPath syntaxCác dấu chấm trong các keys JSON yêu cầu double-quoting: '"client.crt"', không phải client.crt.
Collector logs tls: bad certificate sau một renewalCSI Driver chưa poll phiên bản mới, hoặc collector vẫn chạy với chứng chỉ trước mà nó tải khi khởi độngXác nhận các tệp được gắn đã cập nhật (ls -l /etc/agenteye/tls/), sau đó khởi động lại collector để tải chúng: kubectl rollout restart deploy/my-app-with-collector -n <ns>. Xem § Certificate rotation.
Collector container crashloops với no such file or directory: /etc/agenteye/tls/client.crtVolume chưa được populate trên first start; startup probe quá aggressiveThêm một small initial delay hoặc sử dụng init container chờ tệp tồn tại: until [ -f /etc/agenteye/tls/client.crt ]; do sleep 1; done.
CSI Driver pod OOMKilledDefault memory limits quá thấp cho clusters với nhiều SecretProviderClassesBump --set linux.resources.limits.memory=200Mi trong Helm install.
App chạy cleanly, agenteye-collector flush báo No pending files., nhưng AgentEye dashboard của bạn không hiển thị sự kiệnApp và collector không chia sẻ event spoolKiểm tra (a) cả hai containers gắn cùng agenteye-spool emptyDir tại cùng path, và (b) cả hai đặt AGENTEYE_HOME tới path đó. Chạy hai kiểm tra ls /var/lib/agenteye/ từ § 4.3; listings phải khớp.
Logs để grab trước tiên:

Tham khảo: tệp trên disk trong pod

Pod có hai data paths trên disk:

mTLS cert bundle: /etc/agenteye/tls/ (CSI, read-only, collector only)

Được gắn bởi Secrets Store CSI Driver từ AWS Secrets Manager.
TệpNội dungĐược sử dụng bởi collector như
client.crtPEM-encoded client certificateAGENTEYE_TLS_CERT
client.keyPEM-encoded private keyAGENTEYE_TLS_KEY
ca.crtPEM-encoded CA certAGENTEYE_TLS_CA (optional, chỉ khi cert server AgentEye không được tin cậy công khai)
Cả ba được gắn read-only và sở hữu bởi container user. Chúng được ghi lại bởi CSI Driver khi secret quay vòng.

Event spool: $AGENTEYE_HOME/ (emptyDir, shared read-write giữa cả hai containers)

Chia sẻ qua một emptyDir volume tên agenteye-spool.
PathViết bởiĐọc bởiMục đích
$AGENTEYE_HOME/events/*.jsonlApp (AgentEye SDK)Collector sweeperEvent batches mà SDK đã flush, đợi upload.
$AGENTEYE_HOME/failed/Collector (on upload failure)Bạn (khi debug)JSONL files mà collector không thể upload sau retries.
$AGENTEYE_HOME/config.jsonBạn (optional)CollectorOptional collector config file (alternative to env vars).
Cả hai subdirectories events/failed/ được auto-created bởi collector khi khởi động; không cần initContainer.

Tài liệu liên quan