e0e362d700
SDK Tests / changes (push) Successful in 2m29s
Real E2E Tests / changes (push) Successful in 2m29s
Deploy Docs Pages / build (push) Has been cancelled
Deploy Docs Pages / deploy (push) Has been cancelled
Real E2E Tests / JavaScript E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Python E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Java E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / C# E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Go E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Real E2E CI (push) Has been cancelled
SDK Tests / SDK CI (push) Has been cancelled
SDK Tests / CLI Tests (push) Has been cancelled
SDK Tests / Python SDK Quality (code-interpreter) (push) Has been cancelled
SDK Tests / Python SDK Quality (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (sandbox) (push) Has been cancelled
SDK Tests / CLI Quality (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Go SDK Quality And Tests (push) Has been cancelled
396 lines
12 KiB
Markdown
396 lines
12 KiB
Markdown
# Task Executor Usage Guide
|
|
|
|
## Introduction
|
|
|
|
The `task-executor` is a lightweight component designed to run and manage short-lived tasks (processes or containers) within a Kubernetes Pod context. It acts as a local agent, receiving task specifications from a Kubernetes Controller (e.g., `BatchSandboxController`) and executing them on the node where it runs. It exposes a simple HTTP API for task creation, status inquiry, and management.
|
|
|
|
## Running the Task Executor
|
|
|
|
The `task-executor` can be started using the `cmd/task-executor/main.go` entry point. It supports various command-line flags and environment variables for configuration.
|
|
|
|
**Basic Startup:**
|
|
|
|
```bash
|
|
/path/to/cmd/task-executor/main --data-dir=/var/lib/sandbox/tasks --listen-addr=0.0.0.0:5758
|
|
```
|
|
|
|
**Key Configuration Parameters:**
|
|
|
|
| Flag / Environment Variable | Description | Default Value |
|
|
| :-------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------- |
|
|
| `--data-dir` (DATA_DIR) | Directory for persisting task state and logs. | `/var/lib/sandbox/tasks` |
|
|
| `--listen-addr` (LISTEN_ADDR)| Address and port for the HTTP API server. | `0.0.0.0:5758` |
|
|
| `--enable-sidecar-mode` (ENABLE_SIDECAR_MODE) | If `true`, enables sidecar mode execution, where tasks are run within the PID namespace of a specified main container. Requires `nsenter` and appropriate privileges. | `false` |
|
|
| `--main-container-name` (MAIN_CONTAINER_NAME)| When `enable-sidecar-mode` is `true`, specifies the name of the main container whose PID namespace should be used. | `main` |
|
|
| `--enable-container-mode` (ENABLE_CONTAINER_MODE) | If `true`, enables container mode execution using the CRI runtime. (Note: Current implementation may be a placeholder). | `false` |
|
|
| `--cri-socket` (CRI_SOCKET) | Path to the CRI socket (e.g., `containerd.sock`) when `enable-container-mode` is `true`. | `/var/run/containerd/containerd.sock` |
|
|
| `--reconcile-interval` | The interval at which the internal task manager reconciles task states. | `500ms` |
|
|
|
|
## HTTP API Endpoints
|
|
|
|
The `task-executor` exposes a RESTful HTTP API. All API calls expect JSON request bodies (where applicable) and return JSON responses.
|
|
|
|
### 1. `POST /tasks` - Create a new task
|
|
|
|
Creates and starts a single task.
|
|
|
|
* **Method:** `POST`
|
|
* **Path:** `/tasks`
|
|
* **Request Body (application/json):** An object representing the desired task.
|
|
|
|
```json
|
|
{
|
|
"name": "my-first-task",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["sh", "-c"],
|
|
"args": ["echo 'Hello from my task!' && sleep 5 && echo 'Task finished.'"]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
* **Response Body (application/json):** The created task object with its initial status.
|
|
|
|
```json
|
|
{
|
|
"name": "my-first-task",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["sh", "-c"],
|
|
"args": ["echo 'Hello from my task!' && sleep 5 && echo 'Task finished.'"]
|
|
}
|
|
},
|
|
"status": {
|
|
"state": {
|
|
"waiting": {
|
|
"reason": "Initialized"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Example (using `curl`):**
|
|
|
|
```bash
|
|
curl -X POST -H "Content-Type: application/json" -d '{
|
|
"name": "my-first-task",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["sh", "-c"],
|
|
"args": ["echo \"Hello from my task!\" && sleep 5 && echo \"Task finished.\""]
|
|
}
|
|
}
|
|
}' http://localhost:5758/tasks
|
|
```
|
|
|
|
### 2. `GET /tasks/{id}` - Get task status
|
|
|
|
Retrieves the current status of a specific task by its name.
|
|
|
|
* **Method:** `GET`
|
|
* **Path:** `/tasks/{taskName}`
|
|
* **Response Body (application/json):** The task object, including its current status.
|
|
|
|
```json
|
|
{
|
|
"name": "my-first-task",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["sh", "-c"],
|
|
"args": ["echo 'Hello from my task!' && sleep 5 && echo 'Task finished.'"]
|
|
}
|
|
},
|
|
"status": {
|
|
"state": {
|
|
"running": {
|
|
"startedAt": "2025-12-17T10:00:00Z"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Example (using `curl`):**
|
|
|
|
```bash
|
|
curl http://localhost:5758/tasks/my-first-task
|
|
```
|
|
|
|
### 3. `DELETE /tasks/{id}` - Delete a task
|
|
|
|
Marks a task for deletion. The `task-executor` will attempt to gracefully stop the task and then remove its state.
|
|
|
|
* **Method:** `DELETE`
|
|
* **Path:** `/tasks/{taskName}`
|
|
* **Response:** `204 No Content` on successful marking for deletion.
|
|
|
|
**Example (using `curl`):**
|
|
|
|
```bash
|
|
curl -X DELETE http://localhost:5758/tasks/my-first-task
|
|
```
|
|
|
|
### 4. `POST /setTasks` - Synchronize tasks
|
|
|
|
This endpoint is typically used by controllers to synchronize a desired set of tasks. Tasks not present in the desired list will be marked for deletion; new tasks will be created.
|
|
|
|
* **Method:** `POST`
|
|
* **Path:** `/setTasks`
|
|
* **Request Body (application/json):** An array of task objects representing the desired state.
|
|
|
|
```json
|
|
[
|
|
{
|
|
"name": "task-alpha",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["sleep", "10"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "task-beta",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["ls", "-l", "/tmp"]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
```
|
|
|
|
* **Response Body (application/json):** The current list of tasks managed by the executor after synchronization.
|
|
|
|
```json
|
|
[
|
|
{
|
|
"name": "task-alpha",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["sleep", "10"]
|
|
}
|
|
},
|
|
"status": {
|
|
"state": {
|
|
"waiting": {
|
|
"reason": "Initialized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "task-beta",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["ls", "-l", "/tmp"]
|
|
}
|
|
},
|
|
"status": {
|
|
"state": {
|
|
"waiting": {
|
|
"reason": "Initialized"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
```
|
|
|
|
**Example (using `curl`):**
|
|
|
|
```bash
|
|
curl -X POST -H "Content-Type: application/json" -d \
|
|
'[
|
|
{
|
|
"name": "task-alpha",
|
|
"spec": { "process": { "command": ["sleep", "10"] } }
|
|
},
|
|
{
|
|
"name": "task-beta",
|
|
"spec": { "process": { "command": ["ls", "-l", "/tmp"] } }
|
|
}
|
|
]' http://localhost:5758/setTasks
|
|
```
|
|
|
|
### 5. `GET /getTasks` - List all tasks
|
|
|
|
Retrieves a list of all tasks currently managed by the `task-executor`.
|
|
|
|
* **Method:** `GET`
|
|
* **Path:** `/getTasks`
|
|
* **Response Body (application/json):** An array of task objects.
|
|
|
|
```json
|
|
[
|
|
{
|
|
"name": "task-alpha",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["sleep", "10"]
|
|
}
|
|
},
|
|
"status": {
|
|
"state": {
|
|
"running": {
|
|
"startedAt": "2025-12-17T10:05:00Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "task-beta",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["ls", "-l", "/tmp"]
|
|
}
|
|
},
|
|
"status": {
|
|
"state": {
|
|
"terminated": {
|
|
"exitCode": 0,
|
|
"reason": "Succeeded",
|
|
"startedAt": "2025-12-17T10:06:00Z",
|
|
"finishedAt": "2025-12-17T10:06:01Z"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
```
|
|
|
|
**Example (using `curl`):**
|
|
|
|
```bash
|
|
curl http://localhost:5758/getTasks
|
|
```
|
|
|
|
### 6. `GET /health` - Health check
|
|
|
|
Returns the health status of the `task-executor`.
|
|
|
|
* **Method:** `GET`
|
|
* **Path:** `/health`
|
|
* **Response Body (application/json):**
|
|
|
|
```json
|
|
{
|
|
"status": "healthy"
|
|
}
|
|
```
|
|
|
|
**Example (using `curl`):**
|
|
|
|
```bash
|
|
curl http://localhost:5758/health
|
|
```
|
|
|
|
## Task Specification (`TaskSpec`) Structure
|
|
|
|
The `spec` field within a task object (`api/v1alpha1.TaskSpec`) defines how the task should be executed. It currently supports `process` and `container` execution modes.
|
|
|
|
### Process Task Example
|
|
|
|
This mode executes a command directly as a process.
|
|
|
|
```json
|
|
{
|
|
"name": "my-process-task",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["python3", "my_script.py"],
|
|
"args": ["--config", "/etc/app/config.yaml"],
|
|
"env": [
|
|
{ "name": "DEBUG_MODE", "value": "true" }
|
|
],
|
|
"workingDir": "/app"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Container Task Example (Placeholder/Future Feature)
|
|
|
|
This mode is intended for executing tasks within containers managed by the CRI runtime. Note that as per `internal/task-executor/runtime/container.go`, this mode might still be a placeholder.
|
|
|
|
```json
|
|
{
|
|
"name": "my-container-task",
|
|
"spec": {
|
|
"container": {
|
|
"image": "ubuntu:latest",
|
|
"command": ["/bin/bash", "-c"],
|
|
"args": ["apt update && apt install -y curl"],
|
|
"env": [
|
|
{ "name": "http_proxy", "value": "http://myproxy.com:5758" }
|
|
],
|
|
"volumeMounts": [
|
|
{
|
|
"name": "data-volume",
|
|
"mountPath": "/data"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Task Status (`TaskStatus`) Structure
|
|
|
|
The `status` field within a task object (`internal/task-executor/types/Status` mapped to `api/v1alpha1.TaskStatus` for external API) provides details about the task's current execution state.
|
|
|
|
```json
|
|
{
|
|
"name": "my-task",
|
|
"spec": { ... },
|
|
"status": {
|
|
"state": {
|
|
"waiting": {
|
|
"reason": "Initialized"
|
|
}
|
|
},
|
|
// or
|
|
"state": {
|
|
"running": {
|
|
"startedAt": "2025-12-17T10:00:00Z"
|
|
}
|
|
},
|
|
// or
|
|
"state": {
|
|
"terminated": {
|
|
"exitCode": 0,
|
|
"reason": "Succeeded",
|
|
"message": "Task completed successfully",
|
|
"startedAt": "2025-12-17T10:00:00Z",
|
|
"finishedAt": "2025-12-17T10:00:05Z"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**State Types:**
|
|
|
|
* `waiting`: Task is pending execution.
|
|
* `running`: Task is currently executing.
|
|
* `terminated`: Task has finished (succeeded or failed).
|
|
|
|
## Example Scenario: Running a Sidecar Task
|
|
|
|
If `task-executor` is configured with `--enable-sidecar-mode=true` and `--main-container-name=my-main-app`, it can execute tasks within the PID namespace of `my-main-app`.
|
|
|
|
```bash
|
|
# Assume task-executor is running in sidecar mode on a pod with 'my-main-app'
|
|
# This task will execute 'ls /proc/self/ns' from within the main container's namespace
|
|
curl -X POST -H "Content-Type: application/json" -d '{
|
|
"name": "sidecar-namespace-check",
|
|
"spec": {
|
|
"process": {
|
|
"command": ["ls", "/proc/self/ns"]
|
|
}
|
|
}
|
|
}' http://localhost:5758/tasks
|
|
```
|
|
|