> ## Documentation Index
> Fetch the complete documentation index at: https://docs.befailproof.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Triển khai Single-Pod: Collector + Application Sidecar trên EKS

> Tài liệu AgentEye Single-Pod Deployment: Collector + Application Sidecar trên EKS.

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](/vi/agenteye/kubernetes-deployment) thay thế.

***

## Tóm tắt nhanh

```
┌──────────────────────────────── Pod ─────────────────────────────────┐
│                                                                      │
│   ┌──────────────────────┐              ┌──────────────────────┐     │
│   │ your-app             │              │ agenteye-collector   │     │
│   │ (SDK writes JSONL)   │              │ (sweeps events/,     │     │
│   │                      │              │  uploads over mTLS)  │     │
│   └──────────┬───────────┘              └──────────┬───────────┘     │
│              │ writes                        reads │                 │
│              ▼                                     ▼                 │
│     ┌────────────────────────────────────────────────────┐           │
│     │  emptyDir: /var/lib/agenteye/{events,failed}/      │           │
│     │  (AGENTEYE_HOME - shared event spool)              │           │
│     └────────────────────────────────────────────────────┘           │
│                                                   ▲                  │
│                                                   │ reads cert       │
│                                          ┌────────┴─────────┐        │
│                                          │ CSI (read-only): │        │
│                                          │ /etc/agenteye/   │        │
│                                          │ tls/client.{crt, │        │
│                                          │   key}, ca.crt   │        │
│                                          └────────┬─────────┘        │
└───────────────────────────────────────────────────┼──────────────────┘
                                                    │ mounted by
                                                    │ Secrets Store CSI
                                                    │ (AWS provider +
                                                    │ IRSA)
                                           ┌────────┴──────────┐
                                           │ AWS Secrets       │
                                           │ Manager           │
                                           │ agenteye/mtls-    │
                                           │ client/<cluster>  │
                                           └────────┬──────────┘
                                                    ▲
                                                    │ push on issue /
                                                    │ renewal
                                           ┌────────┴──────────┐
                                           │ Exosphere         │
                                           │ delivers the cert │
                                           │ bundle into your  │
                                           │ Secrets Manager   │
                                           │ on renewal        │
                                           └───────────────────┘

Outbound: collector → AGENTEYE_URL (mTLS, using the CSI-mounted cert).
```

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ên       | Trách nhiệm                                                                                                                                                                                 |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exosphere | Phá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ạn       | Cà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:

  ```bash theme={null}
  aws eks describe-cluster --name <your-cluster> \
    --query "cluster.identity.oidc.issuer" --output text
  ```

  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:

  ```bash theme={null}
  eksctl utils associate-iam-oidc-provider \
    --cluster <your-cluster> --approve
  ```

* [Secrets Store CSI Driver](https://secrets-store-csi-driver.sigs.k8s.io/) và [AWS provider](https://github.com/aws/secrets-store-csi-driver-provider-aws) đượ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](/vi/agenteye/api-keys))

***

## 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ính | Giá trị                                                                                                         |
| ---------- | --------------------------------------------------------------------------------------------------------------- |
| Tên secret | `agenteye/mtls-client/<cluster-name>` (ổn định qua renewals)                                                    |
| Region     | AWS region bạn đã chỉ định cho EKS cluster của bạn                                                              |
| Payload    | Một JSON secret duy nhất có ba keys (`client.crt`, `client.key`, và `ca.crt`), mỗi cái giữ PEM-encoded material |
| Tag        | `AgentEyeCluster=<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](/vi/agenteye/kubernetes-deployment).

***

## 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.

```bash theme={null}
# CSI Driver
helm repo add secrets-store-csi-driver \
  https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install -n kube-system csi-secrets-store \
  secrets-store-csi-driver/secrets-store-csi-driver \
  --set syncSecret.enabled=true \
  --set enableSecretRotation=true \
  --set rotationPollInterval=1h

# AWS provider
kubectl apply -f \
  https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml
```

**Xác minh:**

```bash theme={null}
kubectl get pods -n kube-system | grep -E 'csi-secrets-store|aws-provider'
```

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`:

```json theme={null}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ReadAgentEyeMtlsBundle",
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "arn:aws:secretsmanager:<region>:<account-id>:secret:agenteye/mtls-client/<cluster-name>-*"
    }
  ]
}
```

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:

```bash theme={null}
aws iam create-policy \
  --policy-name AgentEyeMtlsReader-<cluster-name> \
  --policy-document file://agenteye-mtls-reader-policy.json
```

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

```bash theme={null}
eksctl create iamserviceaccount \
  --name agenteye-pod \
  --namespace <your-namespace> \
  --cluster <your-cluster> \
  --role-name AgentEyePodRole-<cluster-name> \
  --attach-policy-arn arn:aws:iam::<account-id>:policy/AgentEyeMtlsReader-<cluster-name> \
  --approve
```

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ền                           | Phạm vi                                                                          | Lý do                                                                         |
| ------------------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `secretsmanager:GetSecretValue` | `arn:aws:secretsmanager:<region>:<acct>:secret:agenteye/mtls-client/<cluster>-*` | CSI Driver đọc bundle cert trên mỗi mount + rotation tick.                    |
| `secretsmanager:DescribeSecret` | giống nhau                                                                       | CSI 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:

```json theme={null}
{
  "Effect": "Allow",
  "Action": ["kms:Decrypt"],
  "Resource": "arn:aws:kms:<region>:<acct>:key/<key-id>",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": "secretsmanager.<region>.amazonaws.com"
    }
  }
}
```

***

## Phase 4: Deploy Pod

### 4.1 SecretProviderClass

`agenteye-mtls-spc.yaml`:

```yaml theme={null}
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: agenteye-mtls
  namespace: <your-namespace>
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "agenteye/mtls-client/<cluster-name>"
        objectType: "secretsmanager"
        jmesPath:
          - path: '"client.crt"'
            objectAlias: "client.crt"
          - path: '"client.key"'
            objectAlias: "client.key"
          - path: '"ca.crt"'
            objectAlias: "ca.crt"
```

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.

```bash theme={null}
kubectl apply -f agenteye-mtls-spc.yaml
```

### 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](/vi/agenteye/python-sdk)).

> 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):

```yaml theme={null}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-with-collector
  namespace: <your-namespace>
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app-with-collector
  template:
    metadata:
      labels:
        app: my-app-with-collector
    spec:
      serviceAccountName: agenteye-pod
      containers:
        - name: app
          image: <your-app-image>
          env:
            # SDK writes event JSONL files into $AGENTEYE_HOME/events/
            - name: AGENTEYE_HOME
              value: /var/lib/agenteye
          volumeMounts:
            - name: agenteye-spool
              mountPath: /var/lib/agenteye

        - name: agenteye-collector
          # Pin to a versioned :v<version> tag for production; :beta-latest
          # tracks the current beta build (:latest exists only for stable releases).
          image: ghcr.io/agenteye-enterprise/collector:beta-latest
          args: ["start"]
          env:
            # Must match the app container's AGENTEYE_HOME so the collector
            # sweeps the same directory the SDK writes to.
            - name: AGENTEYE_HOME
              value: /var/lib/agenteye
            - name: AGENTEYE_URL
              value: "https://ingest.example.agenteye.com/events"
            - name: AGENTEYE_KEY
              valueFrom:
                secretKeyRef:
                  name: agenteye-collector-api-key
                  key: key
            - name: AGENTEYE_TLS_CERT
              value: /etc/agenteye/tls/client.crt
            - name: AGENTEYE_TLS_KEY
              value: /etc/agenteye/tls/client.key
            # Only when the AgentEye server presents a cert not signed by a
            # publicly-trusted CA (e.g. self-signed by an in-cluster issuer
            # because you have no real DNS domain). The CSI mount already
            # exposes ca.crt alongside the client cert/key.
            - name: AGENTEYE_TLS_CA
              value: /etc/agenteye/tls/ca.crt
          volumeMounts:
            - name: agenteye-spool
              mountPath: /var/lib/agenteye
            - name: agenteye-mtls
              mountPath: /etc/agenteye/tls
              readOnly: true
          livenessProbe:
            exec:
              command: ["agenteye-collector", "health"]
            initialDelaySeconds: 10
            periodSeconds: 30

      volumes:
        # Shared event spool between app and collector. emptyDir is fine:
        # events are transient and the collector drains them before pod
        # termination on graceful shutdown.
        - name: agenteye-spool
          emptyDir: {}
        # mTLS cert bundle, mounted read-only into the collector only.
        - name: agenteye-mtls
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: agenteye-mtls
```

Secret `agenteye-collector-api-key` giữ API key của collector (xem [enterprise-docs/api-keys.md](/vi/agenteye/api-keys) để cấp phát).

**Áp dụng:**

```bash theme={null}
kubectl apply -f agenteye-pod.yaml
```

### 4.3 Xác minh

```bash theme={null}
# Pod should be Running with 2/2 containers ready
kubectl get pods -n <your-namespace> -l app=my-app-with-collector

# Confirm the cert bundle was mounted
kubectl exec -n <your-namespace> deploy/my-app-with-collector \
  -c agenteye-collector -- ls -l /etc/agenteye/tls/
```

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:**

```bash theme={null}
# In the collector, should show the events/ and failed/ subdirs that
# the collector auto-creates on startup:
kubectl exec -n <your-namespace> deploy/my-app-with-collector \
  -c agenteye-collector -- ls /var/lib/agenteye/

# In the app, should show the same directory contents:
kubectl exec -n <your-namespace> deploy/my-app-with-collector \
  -c app -- ls /var/lib/agenteye/
```

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:**

```bash theme={null}
kubectl exec -n <your-namespace> deploy/my-app-with-collector \
  -c agenteye-collector -- agenteye-collector flush
```

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à đủ:

   ```bash theme={null}
   kubectl rollout restart deploy/my-app-with-collector -n <your-namespace>
   ```

   Để 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ứng                                                                                                                   | Nguyên nhân có khả năng                                                                                 | Sử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 Manager                                                         | Kiể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:GetSecretValue`                                       | IAM policy được scoped tới ARN sai                                                                      | Secret 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 provider                                                                                    | Secret name mismatch giữa `SecretProviderClass.objects[].objectName` và secret mà Exosphere gửi         | Xá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ắn                                                                                        | JMESPath syntax                                                                                         | Cá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 renewal                                                                         | CSI 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 động | Xá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.crt`                                  | Volume chưa được populate trên first start; startup probe quá aggressive                                | Thê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 `OOMKilled`                                                                                                    | Default memory limits quá thấp cho clusters với nhiều SecretProviderClasses                             | Bump `--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ện | App và collector không chia sẻ event spool                                                              | Kiể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:**

```bash theme={null}
kubectl logs -n kube-system -l app=secrets-store-csi-driver --tail=100
kubectl logs -n kube-system -l app=csi-secrets-store-provider-aws --tail=100
kubectl describe pod -n <your-namespace> -l app=my-app-with-collector
```

***

## 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ệp          | Nội dung                       | Được sử dụng bởi collector như                                                          |
| ------------ | ------------------------------ | --------------------------------------------------------------------------------------- |
| `client.crt` | PEM-encoded client certificate | `AGENTEYE_TLS_CERT`                                                                     |
| `client.key` | PEM-encoded private key        | `AGENTEYE_TLS_KEY`                                                                      |
| `ca.crt`     | PEM-encoded CA cert            | `AGENTEYE_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`.

| Path                            | Viết bởi                      | Đọc bởi           | Mục đích                                                  |
| ------------------------------- | ----------------------------- | ----------------- | --------------------------------------------------------- |
| `$AGENTEYE_HOME/events/*.jsonl` | App (AgentEye SDK)            | Collector sweeper | Event 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.json`    | Bạn (optional)                | Collector         | Optional collector config file (alternative to env vars). |

Cả hai subdirectories `events/` và `failed/` được auto-created bởi collector khi khởi động; không cần `initContainer`.

***

## Tài liệu liên quan

* [enterprise-docs/collector-installation.md](/vi/agenteye/collector-installation): collector binary options, mTLS config reference, daemon modes.
* [enterprise-docs/kubernetes-deployment.md](/vi/agenteye/kubernetes-deployment): multi-pod deployment, cert issuance internals, lifecycle và expiry alerts.
* [enterprise-docs/api-keys.md](/vi/agenteye/api-keys): cấp phát collector API key được sử dụng bởi pod.
* [enterprise-docs/troubleshooting.md](/vi/agenteye/troubleshooting): cluster-wide troubleshooting index.
