From c74f64c56da57889760c2562f8a7ea22746fe9cd Mon Sep 17 00:00:00 2001 From: Albin Severinson Date: Wed, 27 Mar 2024 14:00:32 +0000 Subject: [PATCH] Update docs (#3478) * Updated docs * Updated docs * Update docs --- README.md | 46 +- docs/consistency.md | 22 + docs/design/architecture.md | 80 -- docs/design/database_interfaces.md | 187 ----- docs/design/diagrams/relationships/README.md | 25 - .../relationships/armada_v1_system.png | Bin 129589 -> 0 bytes .../relationships/armada_v2_system.png | Bin 148579 -> 0 bytes .../design/diagrams/relationships/generate.py | 11 - .../diagrams/relationships/generate_v1.py | 144 ---- .../diagrams/relationships/generate_v2.py | 148 ---- .../diagrams/relationships/images/armada.png | Bin 16551 -> 0 bytes .../diagrams/relationships/images/browser.png | Bin 39639 -> 0 bytes .../diagrams/relationships/images/pulsar.png | Bin 3356 -> 0 bytes docs/design/index.md | 76 -- docs/design/jobservice/airflow-sequence.pml | 8 - docs/design/jobservice/airflow-sequence.svg | 18 - docs/design/jobservice/job-service.md | 112 --- docs/design/jobservice/job-service.svg | 15 - docs/design/jobservice/jobservice.pml | 5 - docs/design/priority.md | 52 -- docs/design/relationships_diagram.md | 51 -- docs/design/scheduler.md | 154 ---- docs/production-install.md | 252 ------ docs/python_airflow_operator.md | 730 ------------------ docs/scheduler.md | 280 +++++++ docs/system_overview.md | 78 ++ 26 files changed, 402 insertions(+), 2092 deletions(-) create mode 100644 docs/consistency.md delete mode 100644 docs/design/architecture.md delete mode 100644 docs/design/database_interfaces.md delete mode 100644 docs/design/diagrams/relationships/README.md delete mode 100644 docs/design/diagrams/relationships/armada_v1_system.png delete mode 100644 docs/design/diagrams/relationships/armada_v2_system.png delete mode 100644 docs/design/diagrams/relationships/generate.py delete mode 100644 docs/design/diagrams/relationships/generate_v1.py delete mode 100644 docs/design/diagrams/relationships/generate_v2.py delete mode 100644 docs/design/diagrams/relationships/images/armada.png delete mode 100644 docs/design/diagrams/relationships/images/browser.png delete mode 100644 docs/design/diagrams/relationships/images/pulsar.png delete mode 100644 docs/design/index.md delete mode 100644 docs/design/jobservice/airflow-sequence.pml delete mode 100644 docs/design/jobservice/airflow-sequence.svg delete mode 100644 docs/design/jobservice/job-service.md delete mode 100644 docs/design/jobservice/job-service.svg delete mode 100644 docs/design/jobservice/jobservice.pml delete mode 100644 docs/design/priority.md delete mode 100644 docs/design/relationships_diagram.md delete mode 100644 docs/design/scheduler.md delete mode 100644 docs/production-install.md delete mode 100644 docs/python_airflow_operator.md create mode 100644 docs/scheduler.md create mode 100644 docs/system_overview.md diff --git a/README.md b/README.md index c7ace1edb35..c0cb8daba61 100644 --- a/README.md +++ b/README.md @@ -7,47 +7,44 @@ # Armada -Armada is a multi-[Kubernetes](https://kubernetes.io/docs/concepts/overview/) cluster batch job scheduler. +Armada is a system built on top of [Kubernetes](https://kubernetes.io/docs/concepts/overview/) for running batch workloads. With Armada as middleware for batch, Kubernetes can be a common substrate for batch and service workloads. Armada is used in production and can run millions of jobs per day across tens of thousands of nodes. -Armada is designed to address the following issues: +Armada addresses the following limitations of Kubernetes: -1. A single Kubernetes cluster can not be scaled indefinitely, and managing very large Kubernetes clusters is [challenging](https://openai.com/blog/scaling-kubernetes-to-7500-nodes/). Hence, Armada is a multi-cluster scheduler built on top of several Kubernetes clusters. -2. Achieving very high throughput using the in-cluster storage backend, etcd, is [challenging](https://etcd.io/docs/v3.5/op-guide/performance/). Hence, queueing and scheduling is performed partly out-of-cluster using a specialized storage layer. +1. Scaling a single Kubernetes cluster beyond a certain size is [challenging](https://openai.com/blog/scaling-kubernetes-to-7500-nodes/). Hence, Armada is designed to effectively schedule jobs across many Kubernetes clusters. Many thousands of nodes can be managed by Armada in this way. +2. Achieving very high throughput using the in-cluster storage backend, etcd, is [challenging](https://etcd.io/docs/v3.5/op-guide/performance/). Hence, Armada performs queueing and scheduling out-of-cluster using a specialized storage layer. This allows Armada to maintain queues composed of millions of jobs. +3. The default [kube-scheduler](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/) is not suitable for batch. Instead, Armada includes a novel multi-Kubernetes cluster scheduler with support for important batch scheduling features, such as: + * Fair queuing and scheduling across multiple users. Based on dominant resource fairness. + * Resource and job scheduling rate limits. + * Gang-scheduling, i.e., atomically scheduling sets of related jobs. + * Job preemption, both to run urgent jobs in a timely fashion and to balance resource allocation between users. -Armada is designed primarily for machine learning, AI, and data analytics workloads, and to: +Armada also provides features to help manage large compute clusters effectively, including: -- Manage compute clusters composed of tens of thousands of nodes in total. -- Schedule a thousand or more pods per second, on average. -- Enqueue tens of thousands of jobs over a few seconds. -- Divide resources fairly between users. -- Provide visibility for users and admins. -- Ensure near-constant uptime. +* Detailed analytics exposed via [Prometheus](https://prometheus.io/) showing how the system behaves and how resources are allocated. +* Automatically removing nodes exhibiting high failure rates from consideration for scheduling. +* A mechanism to earmark nodes for a particular set of jobs, but allowing them to be used by other jobs when not used for their primary purpose. -Armada is a [CNCF](https://www.cncf.io/) Sandbox project used in production at [G-Research](https://www.gresearch.co.uk/). +Armada is designed with the enterprise in mind; all components are secure and highly available. -For an overview of Armada, see these videos: +Armada is a [CNCF](https://www.cncf.io/) Sandbox project and is used in production at [G-Research](https://www.gresearch.co.uk/). + +For an overview of Armada, see the following videos: - [Armada - high-throughput batch scheduling](https://www.youtube.com/watch?v=FT8pXYciD9A) - [Building Armada - Running Batch Jobs at Massive Scale on Kubernetes](https://www.youtube.com/watch?v=B3WPxw3OUl4) -Armada adheres to the CNCF [Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). +The Armada project adheres to the CNCF [Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). ## Documentation -For an overview of the architecture and design of Armada, and instructions for submitting jobs, see: - +For documentation, see the following: -- [Components overview](./docs/design/relationships_diagram.md) -- [Scheduler](./docs/design/scheduler.md) -- [Architecture](./docs/design/architecture.md) +- [System overview](./docs/system_overview.md) +- [Scheduler](./docs/scheduler.md) - [User guide](./docs/user.md) - [Quickstart](./docs/quickstart/index.md) - -For a full developer guide, see: - - [Development guide](./docs/developer.md) - -For API reference, see: - [API Documentation](./docs/developer/api.md) We expect readers of the documentation to have a basic understanding of Docker and Kubernetes; see, e.g., the following links: @@ -56,6 +53,7 @@ We expect readers of the documentation to have a basic understanding of Docker a - [Kubernetes overview](https://kubernetes.io/docs/concepts/overview/) ## Contributions + Thank you for considering contributing to Armada! We want everyone to feel that they can contribute to the Armada Project. Your contributions are valuable, whether it's fixing a bug, implementing a new feature, improving documentation, or suggesting enhancements. diff --git a/docs/consistency.md b/docs/consistency.md new file mode 100644 index 00000000000..7b1644e7568 --- /dev/null +++ b/docs/consistency.md @@ -0,0 +1,22 @@ +# A note on consistency + +The data stream approach taken by Armada is not the only way to maintain consistency across views. Here, we compare this approach with the two other possible solutions. + +Armada stores its state across several databases. Whenever Armada receives an API call to update its state, all those databases need to be updated. However, if each database were to be updated independently it is possible for some of those updates to succeed while others fail, leading to an inconsistent application state. It would require complex logic to detect and correct for such partial failures. However, even with such logic we could not guarantee that the application state is consistent; if Armada crashes before it has had time to correct for the partial failure the application may remain in an inconsistent state. + +There are three commonly used approaches to address this issue: + +* Store all state in a single database with support for transactions. Changes are submitted atomically and are rolled back in case of failure; there are no partial failures. +* Distributed transaction frameworks (e.g., X/Open XA), which extend the notation of transactions to operations involving several databases. +* Ordered idempotent updates. + +The first approach results in tight coupling between components and would limit us to a single database technology. Adding a new component (e.g., a new dashboard) could break existing component since all operations part of the transaction are rolled back if one fails. The second approach allows us to use multiple databases (as long as they support the distributed transaction framework), but components are still tightly coupled since they have to be part of the same transaction. Further, there are performance concerns associated with these options, since transactions may not be easily scalable. Hence, we use the third approach, which we explain next. + +First, note that if we can replay the sequence of state transitions that led to the current state, in case of a crash we can recover the correct state by truncating the database and replaying all transitions from the beginning of time. Because operations are ordered, this always results in the same end state. If we also, for each database, store the id of the most recent transition successfully applied to that database, we only need to replay transitions more recent than that. This saves us from having to start over from a clean database; because we know where we left off we can keep going from there. For this to work, we need transactions but not distributed transactions. Essentially, applying a transition already written to the database results in a no-op, i.e., the updates are idempotent (meaning that applying the same update twice has the same effect as applying it once). + +The two principal drawbacks of this approach are: + +* Eventual consistency: Whereas the first two approaches result in a system that is always consistent, with the third approach, because databases are updated independently, there will be some replication lag during which some part of the state may be inconsistent. +* Timeliness: There is some delay between submitting a change and that change being reflected in the application state. + +Working around eventual consistency requires some care, but is not impossible. For example, it is fine for the UI to show the a job as "running" for a few seconds after the job has finished before showing "completed". Regarding timeliness, it is not a problem if there is a few seconds delay between a job being submitted and the job being considered for queueing. However, poor timeliness may lead to clients (i.e., the entity submitting jobs to the system) not being able to read their own writes for some time, which may lead to confusion (i.e., there may be some delay between a client submitting a job a that job showing as "pending"). This issue can be worked around by storing the set of submitted jobs in-memory either at the client or at the API endpoint. diff --git a/docs/design/architecture.md b/docs/design/architecture.md deleted file mode 100644 index eacfcad41a8..00000000000 --- a/docs/design/architecture.md +++ /dev/null @@ -1,80 +0,0 @@ -# Architecture - -Armada is designed to manage millions of batch jobs across compute clusters made up of potentially hundreds of thousands of nodes, while providing near-constant uptime. Hence, the Architecture of Armada must be highly resilient and scalable. The current architecture was chosen in early 2022 to achieve these goals while also ensuring new features, e.g., advanced scheduling techniques, can be delivered. - -At a high level, Armada is a so-called data stream system (sometimes referred to as an event sourcing system), for which there are two components responsible for tracking the state of the system: - -* A log-based message broker that stores state transitions durably in order, referred to throughout this document simply as "the log". -* A set of databases, each deriving its state from the log (but are otherwise mutually independent) and storing a different so-called materialised view of the state of the system. - -The log is a publish-subscribe system consisting of multiple topics to which messages can be published. Those messages are eventually delivered to all subscribers of the topic. Important properties of the log are: - -* Durability: Messages published to the log are stored in a durable manner, i.e., they are not lost in case of up to x node failures, where x is a tuneable parameter. -* Ordering: All subscribers of a topic see messages in the same order as they were published in, and replaying messages on a topic always results in the same message order. Further, all messages on the same topic are annotated with a message id that is monotonically increasing within each topic. - -In Armada, the log is implemented using Apache Pulsar. - -In a data stream system, the log is the source of truth and the databases an optimisation to simplify querying – since the databases can be re-constructed by replaying messages from the log, if the log was replayed for each query, although highly unpractical, the databases could be omitted. For example, in Armada there are separate PostgreSQL databases for storing jobs to be scheduled and the jobs to be shown in the UI, Lookout. Both of these derive their state from the log but are otherwise independent. - -To change the state of the system, a message (e.g., corresponding to a job being submitted) is published to the log. Later, that message is picked up by a log processor, which updates some database accordingly (in the case of a job being submitted, by storing the new job in the database). Hence, the log serialises state transitions and the database is a materialised view of part of the state of the system, as derived from the state transitions submitted to the log. In effect, a data stream system is a bespoke distributed database with the log acting as the transaction log. - -This approach has several benefits: - -* Resiliency towards bursts of high load: Because the log buffers state transitions, the components reading from the log and acting on those transitions are not directly affected by incoming requests. -* Simplicity and extensibility: Adding new materialised views (e.g., for a new dashboard) can be accomplished by adding a new subscriber to the log. This new subscriber has the same source of truth as all others (i.e., the log) but is loosely coupled to those components; adding or removing views does not affect other components of the system. -* Consistency: When storing state across several independent databases, those databases are guaranteed to eventually be consistent; there is no failure scenario where the different databases become permanently inconsistent, thus requiring a human to manually reconcile them (assuming acting on state transitions is idempotent). - -However, the approach also has some drawbacks: - -* Eventual consistency: Because each database is updated from the log independently, they do not necessarily represent the state of the system at the same point of time. For example, a job may be written to the scheduler database (thus making it eligible for scheduling) before it shows up in the UI. -* Timeliness: Because databases are updated from the log asynchronously, there may be a lag between a message being published and the system being updated to reflect the change (e.g., a submitted job may not show up in the UI immediately). - -## System overview - -Besides the log, Armada consists of the following components: - -* Submit API: Clients (i.e., users) connect to this API to request state transitions (e.g., submitting jobs or updating job priorities) and each such state transition is communicated to the rest of the system by writing to the log (more detail on this below). -* Streams API: Clients connect to this API to subscribe to log messages for a particular set of jobs. Armada components can receive messages either via this API or directly from the log, but users have to go via the streams API to isolate them from internal messages. -* Scheduler: A log processor responsible for maintaining a global view of the system and preempting and scheduling jobs. Preemption and scheduling decisions are communicated to he rest of the system by writing to the log. -* Executors: Each executor is responsible for one Kubernetes worker cluster and is the component that communicates between the Armada scheduler and the Kubernetes API of the cluster it is responsible for. -* Lookout: The web UI showing the current state of the system. Lookout maintains its views by reading log messages to populate its database. - -### Job submission logic - -Here, we outline the sequence of actions resulting from submitting a job. - -1. A client submits a job to the submit-query API, which is composed of a Kubernetes podspec and some Armada-specific metadata (e.g., the priority of the job). -2. The submit API authenticates and authorizes the user, validates the submitted job, and, if valid, submits the job spec. to the log. The submit API annotates each job with a randomly generated UUID that uniquely identifies the job. This UUID is returned to the user. -3. The scheduler receives the job spec. and stores it in-memory (discarding any data it doesn't need, such as the pod spec.). The scheduler runs periodically, at which point it schedules queued jobs. At the start of each scheduling run, the scheduler queries each executor for its available resources. The scheduler uses this information in making scheduling decisions. When the scheduler assigns a job to an executor, it submits a message to the log indicating this state transition. It also updates its in-memory storage immediately to reflect the change (to avoid scheduling the same job twice). -4. A log processor receives the message indicating the job was scheduled, and writes this decision to a database acting as the interface between the scheduler and the executor. -5. Periodically, each executor queries the database for the list of jobs it should be running. It compares that list with the list of jobs it is actually running and makes changes necessary to reconcile any differences. -6. When a job has finished, the executor responsible for running the job informs the scheduler, which on its behalf submits a "job finished" message to the log. The same log processor as in step 4. updates its database to reflect that the job has finished. - -### Streams API - -Armada does not maintain a user-queryable database of the current state of the system. This is by design to avoid overloading the system with connections. For example, say there is one million active jobs in the system and that there are clients who want to track the state of all of those jobs. With a current-state-of-the-world database, those client would need to resort to polling that database to catch any updates, thus opening a total of one million connections to the database, which, while not impossible to manage, would pose significant challenges. - -Instead, users are expected to be notified of updates to their jobs via an event stream (i.e., the streams API), where a client opens a single connection for all jobs in a so-called job set over which all state transitions are streamed as they happen. This approach is highly scalable since data is only sent when something happens and since a single connection that contain updates for thousands of jobs. Users who want to maintain a view of their jobs are thus responsible for maintaining that view themselves by subscribing to events. - -## Notes on consistency - -The data stream approach taken by Armada is not the only way to maintain consistency across views. Here, we compare this approach with the two other possible solutions. - -Armada stores its state across several databases. Whenever Armada receives an API call to update its state, all those databases need to be updated. However, if each database were to be updated independently it is possible for some of those updates to succeed while others fail, leading to an inconsistent application state. It would require complex logic to detect and correct for such partial failures. However, even with such logic we could not guarantee that the application state is consistent; if Armada crashes before it has had time to correct for the partial failure the application may remain in an inconsistent state. - -There are three commonly used approaches to address this issue: - -* Store all state in a single database with support for transactions. Changes are submitted atomically and are rolled back in case of failure; there are no partial failures. -* Distributed transaction frameworks (e.g., X/Open XA), which extend the notation of transactions to operations involving several databases. -* Ordered idempotent updates. - -The first approach results in tight coupling between components and would limit us to a single database technology. Adding a new component (e.g., a new dashboard) could break existing component since all operations part of the transaction are rolled back if one fails. The second approach allows us to use multiple databases (as long as they support the distributed transaction framework), but components are still tightly coupled since they have to be part of the same transaction. Further, there are performance concerns associated with these options, since transactions may not be easily scalable. Hence, we use the third approach, which we explain next. - -First, note that if we can replay the sequence of state transitions that led to the current state, in case of a crash we can recover the correct state by truncating the database and replaying all transitions from the beginning of time. Because operations are ordered, this always results in the same end state. If we also, for each database, store the id of the most recent transition successfully applied to that database, we only need to replay transitions more recent than that. This saves us from having to start over from a clean database; because we know where we left off we can keep going from there. For this to work, we need transactions but not distributed transactions. Essentially, applying a transition already written to the database results in a no-op, i.e., the updates are idempotent (meaning that applying the same update twice has the same effect as applying it once). - -The two principal drawbacks of this approach are: - -* Eventual consistency: Whereas the first two approaches result in a system that is always consistent, with the third approach, because databases are updated independently, there will be some replication lag during which some part of the state may be inconsistent. -* Timeliness: There is some delay between submitting a change and that change being reflected in the application state. - -Working around eventual consistency requires some care, but is not impossible. For example, it is fine for the UI to show the a job as "running" for a few seconds after the job has finished before showing "completed". Regarding timeliness, it is not a problem if there is a few seconds delay between a job being submitted and the job being considered for queueing. However, poor timeliness may lead to clients (i.e., the entity submitting jobs to the system) not being able to read their own writes for some time, which may lead to confusion (i.e., there may be some delay between a client submitting a job a that job showing as "pending"). This issue can be worked around by storing the set of submitted jobs in-memory either at the client or at the API endpoint. diff --git a/docs/design/database_interfaces.md b/docs/design/database_interfaces.md deleted file mode 100644 index 0003e7b00e7..00000000000 --- a/docs/design/database_interfaces.md +++ /dev/null @@ -1,187 +0,0 @@ -# Armada Database Interfaces - -## Problem Description - -Open source projects should not be hard coded to a particular Database. Armada currently only allows users to use Postgres. This project is to build interfaces around our connections to Postgres so we can allow other databases. - -## Solution - -1. Introduce base common database interfaces that can be shared reused by all components (Lookout, Scheduler, Scheduler Ingester). -2. Add interfaces that abstracts the hardcoded Postgres configuration. -3. Add interfaces around `pgx` structs. - -### Functional Specification (API Description) - -#### Database Connection - -Most of the components (Lookout, Scheduler, Scheduler Ingester) rely on [PostgresConfig](https://github.com/armadaproject/armada/blob/master/internal/armada/configuration/types.go#L294) to connect to external databases, we can avoid hardcoding the configuration of those components to use `PostgresConfig` but defining a generic `DatabaseConfig` interface that's when implemented will provide those components with the necessary details to connect to databases. - - /** - Components configuration (e.g. LookoutConfiguration) can now make use of this interface instead of hardcoding PostgresConfig. - */ - type DatabaseConfig interface { - GetMaxOpenConns() int - GetMaxIdleConns() int - GetConnMaxLifetime() time.Duration - GetConnectionString() string - } - - type DatabaseConnection interface { - GetConnection() (*sql.DB, error) - GetConfig() DatabaseConfig - } - -The existing configurations can then be tweaked to use the new generic `DatabaseConfig` interface instead of hardcoding `PostgresConfig` - - type LookoutConfiguration struct { - Postgres PostgresConfig // this can be replaced with the new Database property - Database DatabaseConfig // new property - } - -#### Database Communication - -Currently, most of the Armada components make use of the `github.com/jackc/pgx` Postgres client which provides APIs to interact exclusively with Postgres databases, this makes Armada tightly coupled with Postgres and makes it impossible to use other SQL dialects (e.g. MySQL). - -A way to fix this would be to design database-agnostic interfaces that can abstract away the existing Postgres core implementation (pgx), and then implement adapters around `pgx` that implement those interfaces. This will allow for having a high level abstraction API for interacting with databases while maintaining the existing Postgres core implementation. -To accomplish this, we will need to define interfaces for the following features: - -1. Connection Handler - - // DatabaseConn represents a connection handler interface that provides methods for managing the open connection, executing queries, and starting transactions. - type DatabaseConn interface { - // Close closes the database connection. It returns any error encountered during the closing operation. - Close(context.Context) error - - // Ping pings the database to check the connection. It returns any error encountered during the ping operation. - Ping(context.Context) error - - // Exec executes a query that doesn't return rows. It returns any error encountered. - Exec(context.Context, string, ...any) (any, error) - - // Query executes a query that returns multiple rows. It returns a DatabaseRows interface that allows you to iterate over the result set, and any error encountered. - Query(context.Context, string, ...any) (DatabaseRows, error) - - // QueryRow executes a query that returns one row. It returns a DatabaseRow interface representing the result row, and any error encountered. - QueryRow(context.Context, string, ...any) DatabaseRow - - // BeginTx starts a transcation with the given DatabaseTxOptions, or returns an error if any occured. - BeginTx(context.Context, DatabaseTxOptions) (DatabaseTx, error) - - // BeginTxFunc starts a transaction and executes the given function within the transaction. It the function runs successfuly, BeginTxFunc commits the transaction, otherwise it rolls back and return an errorr. - BeginTxFunc(context.Context, DatabaseTxOptions, func(DatabaseTx) error) error - } - -2. Connection Pool - - // DatabasePool represents a database connection pool interface that provides methods for acquiring and managing database connections. - type DatabasePool interface { - // Acquire acquires a database connection from the pool. It takes a context and returns a DatabaseConn representing the acquired connection and any encountered error. - Acquire(context.Context) (DatabaseConn, error) - - // Ping pings the database to check the connection. It returns any error encountered during the ping operation. - Ping(context.Context) error - - // Close closes the database connection. It returns any error encountered during the closing operation. - Close() - - // Exec executes a query that doesn't return rows. It returns any error encountered. - Exec(context.Context, string, ...any) (any, error) - - // Query executes a query that returns multiple rows. It returns a DatabaseRows interface that allows you to iterate over the result set, and any error encountered. - Query(context.Context, string, ...any) (DatabaseRows, error) - - // BeginTx starts a transcation with the given DatabaseTxOptions, or returns an error if any occured. - BeginTx(context.Context, DatabaseTxOptions) (DatabaseTx, error) - - // BeginTxFunc starts a transaction and executes the given function within the transaction. It the function runs successfuly, BeginTxFunc commits the transaction, otherwise it rolls back and return an errorr. - BeginTxFunc(context.Context, DatabaseTxOptions, func(DatabaseTx) error) error - } - -3. Transaction - - // DatabaseTx represents a database transaction interface that provides methods for executing queries, managing transactions, and performing bulk insertions. - type DatabaseTx interface { - // Exec executes a query that doesn't return rows. It returns any error encountered. - Exec(context.Context, string, ...any) (any, error) - - // Query executes a query that returns multiple rows. It returns a DatabaseRows interface that allows you to iterate over the result set, and any error encountered. - Query(context.Context, string, ...any) (DatabaseRows, error) - - // QueryRow executes a query that returns one row. It returns a DatabaseRow interface representing the result row, and any error encountered. - QueryRow(context.Context, string, ...any) DatabaseRow - - // CopyFrom performs a bulk insertion of data into a specified table. It accepts the table name, column names, and a slice of rows representing the data to be inserted. It returns the number of rows inserted and any error encountered. - CopyFrom(ctx context.Context, tableName string, columnNames []string, rows [][]any) (int64, error) - - // Commit commits the transaction. It returns any error encountered during the commit operation. - Commit(context.Context) error - - // Rollback rolls back the transaction. It returns any error encountered during the rollback operation. - Rollback(context.Context) error - } - -4. Result Row - - // DatabaseRow represents a single row in a result set. - type DatabaseRow interface { - // Scan reads the values from the current row into dest values positionally. It returns an error if any occured during the read operation. - Scan(dest ...any) error - } - -5. Resultset - - // DatabaseRows represents an interator over a result set. - type DatabaseRows interface { - // Close closes the result set. - Close() error - - // Next moves the iterator to the next row in the result set, it returns false if the result set is exhausted, otherwise true. - Next() bool - - // Err returns the error, if any, encountered during iteration over the result set. - Err() error - - // Scan reads the values from the current row into dest values positionally. It returns an error if any occured during the read operation. - Scan(dest ...any) error - } - -### Implementation Plan - -Designing interfaces that can remove the coupling between Armada and Postgres while maintaining the existing core Postgres implementation is a requirement. - -To fullfill this requirement, we can implement adapters around the `pgx` client so that it also implements the interfaces defined above. - -For example, an adapter can be implemented for `pgxpool.Pool` so that it can be used with `DatabasePool`: - - type PostgresPoolAdapter struct { - *pgxpool.Pool - } - - func (p PostgresPoolAdapter) Exec(ctx context.Context, sql string, args ...any) (any, error) { - return p.Pool.Exec(ctx, sql, args) - } - - func (p PostgresPoolAdapter) BeginTxFunc(ctx context.Context, opts dbtypes.DatabaseTxOptions, action func(dbtypes.DatabaseTx) error) error { - tx, err := p.Pool.BeginTx(ctx, pgx.TxOptions{ - IsoLevel: pgx.TxIsoLevel(opts.Isolation), - DeferrableMode: opts.DeferrableMode, - AccessMode: pgx.TxAccessMode(opts.AccessMode), - }) - - if err != nil { - return err - } - - // PostgresTrxAdapter is the Postgres adapter for DatabaseTx interface - if err := action(PostgresTrxAdapter{Tx: tx}); err != nil { - return tx.Rollback(ctx) - } - - return tx.Commit(ctx) - } - -The example above showcases the implementation of a Postgres connection pool adapter, this example implements the `DatabasePool` interface (the rest of the methods can be implemented similarly to `Exec` and `BeginTxFunc`). - -This allows the components that make use `pgxpool.Pool` (e.g. Lookout) to switch to using `DatabasePool` which underneath can make use of `pgxpool.Pool` (or any other `DatabasePool` implementation) without making any changes to the core Postgres implementation. - -To support new SQL dialects, we can simply introduce adapters that implement the interfaces, as well as introduce some level of flexibility into the configuration of components to allow choosing which dialect we want to use. diff --git a/docs/design/diagrams/relationships/README.md b/docs/design/diagrams/relationships/README.md deleted file mode 100644 index 1360c3f904a..00000000000 --- a/docs/design/diagrams/relationships/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Diagrams of Armada Architecture - -## Generating the Diagram - -To generate this diagram, you can use the following command: - -```bash -# install graphviz -sudo apt-get install graphviz - -# then install diagrams from pip -pip install diagrams - -# then run the following command to generate the diagram -python3 generate.py -``` - -To find out more about the diagrams library, see https://diagrams.mingrammer.com/ -To find out more about the graphviz library, see https://graphviz.org/ - - - - - - diff --git a/docs/design/diagrams/relationships/armada_v1_system.png b/docs/design/diagrams/relationships/armada_v1_system.png deleted file mode 100644 index f7921b52299c90bcda4a6ee824d6bb5c4c34ee44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129589 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

  • 8 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 g@GFN1>$+V_pq^D=V^vmFEbqE_W=na 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 diff --git a/docs/design/diagrams/relationships/armada_v2_system.png b/docs/design/diagrams/relationships/armada_v2_system.png deleted file mode 100644 index bbf244c1fd441f981536740d9b7286432e513a67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148579 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%0AJ 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 P1fr~FfUkwsGNT diff --git a/docs/design/diagrams/relationships/generate.py b/docs/design/diagrams/relationships/generate.py deleted file mode 100644 index bb4050850db..00000000000 --- a/docs/design/diagrams/relationships/generate.py +++ /dev/null @@ -1,11 +0,0 @@ -import subprocess - -def run_scripts(): - # Run generate_v1.py - subprocess.run(["python", "generate_v1.py"]) - - # Run generate_v2.py - subprocess.run(["python", "generate_v2.py"]) - -if __name__ == "__main__": - run_scripts() diff --git a/docs/design/diagrams/relationships/generate_v1.py b/docs/design/diagrams/relationships/generate_v1.py deleted file mode 100644 index f478b4e45cc..00000000000 --- a/docs/design/diagrams/relationships/generate_v1.py +++ /dev/null @@ -1,144 +0,0 @@ -from diagrams import Cluster, Diagram, Edge -from diagrams.onprem.database import PostgreSQL -from diagrams.onprem.inmemory import Redis -from diagrams.k8s.controlplane import API -from diagrams.custom import Custom - -graph_attr = { - "concentrate": "false", - "splines": "ortho", - "pad": "2", - "nodesep": "0.30", - "ranksep": "1.5", - "fontsize": "20", -} - -node_attr = { - # decrease image size - "fixedsize": "true", - "width": "1", - "height": "1", - "fontsize": "15", -} - -edge_attr = { - "minlen": "1", -} - -cluster_attr_common = { - "margin": "20", - "fontsize": "15", -} - -cluster_attr_server = { - "labelloc": "b", - "bgcolor": "#c7ffd5", -} -cluster_attr_server = {**cluster_attr_common, **cluster_attr_server} - -cluster_attr_exec = { - "labelloc": "t", - "bgcolor": "#c7ffd5", -} - -cluster_attr_exec = {**cluster_attr_common, **cluster_attr_exec} - -armada_logo = "./images/armada.png" -pulsar_logo = "./images/pulsar.png" -browser_logo = "./images/browser.png" - -with Diagram( - name="Armada V1 System", - show=False, - direction="LR", - graph_attr=graph_attr, - edge_attr=edge_attr, - node_attr=node_attr, - # filename="out/armada_systems_diagram", -): - pulsar = Custom("Pulsar", pulsar_logo) - - # Databases - postgres_lookout = PostgreSQL("Postgres (Lookout)") - redis_events = Redis("Redis (Events)") - - # Components - server = Custom("Server", armada_logo) - client = Custom("Client", armada_logo) - executorAPI = Custom("Executor API", armada_logo) - lookoutV2API = Custom("Lookout V2 API", armada_logo) - lookoutV1API = Custom("Lookout V1 API", armada_logo) - lookoutV1UI = Custom("Lookout V1 UI", armada_logo) - - # Ingesters - lookout_v2_ingester = Custom("Lookout V2 Ingester", armada_logo) - lookout_v1_ingester = Custom("Lookout V1 Ingester", armada_logo) - - with Cluster("Executor Cluster", graph_attr=cluster_attr_server): - executor = Custom("Executor", armada_logo) - k8s_api = API("K8s API") - - with Cluster("Executor Cluster 2", graph_attr=cluster_attr_server): - executor2 = Custom("Executor 2", armada_logo) - k8s_api2 = API("K8s API 2") - - # Relationships - - # The lookout V2 API talks to The Lookout V1 UI - lookoutV2API >> Edge(color="black") >> lookoutV1UI - - # Lookout V2 ingester talks to each other Postgres lookout - lookout_v2_ingester >> Edge(color="blue") >> postgres_lookout - - # Pulsar talks to lookout_ingester - pulsar >> Edge(color="red") >> lookout_v1_ingester - - # Lookout V1 Ingester talks to Lookout V1 API - lookout_v1_ingester >> Edge(color="black") >> lookoutV1API - - # Lookout V1 Ingester talks to Postgres(Lookout) - lookout_v1_ingester >> Edge(color="blue") >> postgres_lookout - - # Pulsar talks to lookout_ingester - pulsar >> Edge(color="red") >> lookout_v2_ingester - - # Lookout V2 Ingester talks to Lookout V2 API - lookout_v2_ingester >> Edge(color="black") >> lookoutV2API - - # Pulsar talks to server - pulsar >> Edge(color="red") >> server - - # Server and client talks to each other - server >> Edge(color="black") >> client - client >> Edge(color="black") >> server - - # Executor API and server talks to each other - executorAPI >> Edge(color="black") >> server - server >> Edge(color="black") >> executorAPI - - # server talks to redis_events - server >> Edge(color="orange") >> redis_events - - # in Executor Cluster - executor >> Edge(color="blue") >> k8s_api - k8s_api >> Edge(color="blue") >> executor - - # in Executor Cluster 2 - executor2 >> Edge(color="blue") >> k8s_api2 - k8s_api2 >> Edge(color="blue") >> executor2 - - # Executor talks to executor API - executor >> Edge(color="black") >> executorAPI - executorAPI >> Edge(color="black") >> executor - - # Executor 2 talks to executor API - executor2 >> Edge(color="black") >> executorAPI - executorAPI >> Edge(color="black") >> executor2 - - # lookout v1 api talks to lookout v1 UI - lookoutV1API >> Edge(color="black") >> lookoutV1UI - - - - - diff --git a/docs/design/diagrams/relationships/generate_v2.py b/docs/design/diagrams/relationships/generate_v2.py deleted file mode 100644 index d5bc6682793..00000000000 --- a/docs/design/diagrams/relationships/generate_v2.py +++ /dev/null @@ -1,148 +0,0 @@ -from diagrams import Cluster, Diagram, Edge -from diagrams.onprem.database import PostgreSQL -from diagrams.onprem.inmemory import Redis -from diagrams.k8s.controlplane import API -from diagrams.custom import Custom - -graph_attr = { - "concentrate": "false", - "splines": "ortho", - "pad": "2", - "nodesep": "0.30", - "ranksep": "1.5", - "fontsize": "20", -} - -node_attr = { - # decrease image size - "fixedsize": "true", - "width": "1", - "height": "1", - "fontsize": "15", -} - -edge_attr = { - "minlen": "1", -} - -cluster_attr_common = { - "margin": "20", - "fontsize": "15", -} - -cluster_attr_server = { - "labelloc": "b", - "bgcolor": "#c7ffd5", -} -cluster_attr_server = {**cluster_attr_common, **cluster_attr_server} - -cluster_attr_exec = { - "labelloc": "t", - "bgcolor": "#c7ffd5", -} - -cluster_attr_exec = {**cluster_attr_common, **cluster_attr_exec} - -armada_logo = "./images/armada.png" -pulsar_logo = "./images/pulsar.png" -browser_logo = "./images/browser.png" - -with Diagram( - name="Armada V2 System", - show=False, - direction="LR", - graph_attr=graph_attr, - edge_attr=edge_attr, - node_attr=node_attr, - # filename="out/armada_systems_diagram", -): - pulsar = Custom("Pulsar", pulsar_logo) - - - # Databases - postgres_lookout = PostgreSQL("Postgres (Lookout)") - postgres_scheduler = PostgreSQL("Postgres (Scheduler)") - redis_events = Redis("Redis (Events)") - - # Components - server = Custom("Server", armada_logo) - client = Custom("Client", armada_logo) - scheduler = Custom("Scheduler", armada_logo) - - # Lookout Parts - lookout_api = Custom("Lookout V2 API", armada_logo) - lookoutUI = Custom("Lookout V2 UI", armada_logo) - - # Ingesters - lookout_ingester = Custom("Lookout V2 Ingester", armada_logo) - scheduler_ingester = Custom("Scheduler Ingester", armada_logo) - event_ingerster = Custom("Event Ingester", armada_logo) - - with Cluster("Executor Cluster", graph_attr=cluster_attr_server): - executor = Custom("Executor", armada_logo) - k8s_api = API("K8s API") - binoculars = Custom("Binoculars", armada_logo) - - with Cluster("Executor Cluster 2", graph_attr=cluster_attr_server): - executor2 = Custom("Executor 2", armada_logo) - k8s_api2 = API("K8s API 2") - binoculars2 = Custom("Binoculars", armada_logo) - - # Relationships - - # client sends requests to the server - client >> Edge(color="black") >> server - - # submit api talks to pulsar - server >> Edge(color="red") >> pulsar - - # pulsar talks to each of the ingesters - pulsar >> Edge(color="red") >> lookout_ingester - pulsar >> Edge(color="red") >> scheduler_ingester - pulsar >> Edge(color="red") >> event_ingerster - - # make postgres blue, redis orange - # lookout and scheduler ingesters talk to postgres - # the other ingesters talk to redis - lookout_ingester >> Edge(color="blue") >> postgres_lookout - scheduler_ingester >> Edge(color="blue") >> postgres_scheduler - - event_ingerster >> Edge(color="orange") >> redis_events - - # the postgres scheduler talks to the scheduler and executor api - postgres_scheduler >> Edge(color="blue") >> scheduler - - # the scheduler talks to pulsar - scheduler >> Edge(color="red") >> pulsar - - executor >> Edge(color="blue") >> k8s_api - k8s_api >> Edge(color="blue") >> executor - - executor2 >> Edge(color="blue") >> k8s_api2 - k8s_api2 >> Edge(color="blue") >> executor2 - - # The binoculars in every cluster talks to k8s, and - # then talks directly to the lookout UI - k8s_api >> Edge(color="blue") >> binoculars - binoculars >> Edge(color="black") >> lookoutUI - - k8s_api2 >> Edge(color="blue") >> binoculars2 - binoculars2 >> Edge(color="black") >> lookoutUI - - # Lookout API gets its data from postgres - # and passes it to the lookout UI - postgres_lookout >> Edge(color="blue") >> lookout_api - lookout_api >> Edge(color="black") >> lookoutUI - - # The scheduler talks to the executor api - scheduler >> Edge(color="blue") >> executor - scheduler >> Edge(color="blue") >> executor2 - - # pulsar talks to the server - pulsar >> Edge(color="red") >> server - - # redis events are given back to the server - redis_events >> Edge(color="orange") >> server - - # and passed to the client - server >> Edge(color="black") >> client diff --git a/docs/design/diagrams/relationships/images/armada.png b/docs/design/diagrams/relationships/images/armada.png deleted file mode 100644 index f4c86ed5cbe4094312858bd784087a725eb33d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16551 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 EA3=xUwEzGB diff --git a/docs/design/diagrams/relationships/images/browser.png b/docs/design/diagrams/relationships/images/browser.png deleted file mode 100644 index a02b3a98eedee2d502a237bf5e0cc6f7d0fe7f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39639 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

    nQDwH4tSIf`a7vo=TcVgXu*Z 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 LSm%M3L-_v#ICB#2 diff --git a/docs/design/diagrams/relationships/images/pulsar.png b/docs/design/diagrams/relationships/images/pulsar.png deleted file mode 100644 index 36de6bb18ffe663cb755b078436b4c61973b8b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3356 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 m8q*|6uf%*%z(R Airflow : Creates a dag -Airflow -> AirflowOperator : Specify ArmadaPythonClient and JobServiceClient and pod definitions -AirflowOperator -> ArmadaPythonClient : Submits pod spec to Armada -AirflowOperator -> JobServiceClient : Polls GetJobStatus rpc call for given job id -AirflowOperator <- JobServiceClient : Wait for finished event and returns state, message -Airflow <- AirflowOperator : Airflow moves on to new task in schedule -@enduml \ No newline at end of file diff --git a/docs/design/jobservice/airflow-sequence.svg b/docs/design/jobservice/airflow-sequence.svg deleted file mode 100644 index 894e02b708a..00000000000 --- a/docs/design/jobservice/airflow-sequence.svg +++ /dev/null @@ -1,18 +0,0 @@ -UserUserAirflowAirflowAirflowOperatorAirflowOperatorArmadaPythonClientArmadaPythonClientJobServiceClientJobServiceClientCreates a dagSpecify ArmadaPythonClient and JobServiceClient and pod definitionsSubmits pod spec to ArmadaPolls GetJobStatus rpc call for given job idWait for finished event and returns state, messageAirflow moves on to new task in schedule \ No newline at end of file diff --git a/docs/design/jobservice/job-service.md b/docs/design/jobservice/job-service.md deleted file mode 100644 index 1d3b1cfa956..00000000000 --- a/docs/design/jobservice/job-service.md +++ /dev/null @@ -1,112 +0,0 @@ -# Armada Job Service - -## Problem Description -Armada’s API is event driven, preventing it from integrating with tools, such as Apache Airflow, written with the expectation that it can easily fetch status of a running job. It is not scalable to have Airflow subscribe to the event stream to observe status, so we must implement a caching layer which will expose a friendlier API for individual job querying. - -## Proposed Change -### Notes -- Add an optional caching API and service to Armada -- Caches job_id:(job_status, message) relationship for subscribed (queue,job_set) tuples -- Service is written in Go for performance and to reuse code from armadactl - -### Proposed Airflow Operator flow -1. Create the job_set -2. [do the work to schedule the job] -3. Status polling loop that talks to job service - -## Alternative Options - -### Change Armada API -Armada could expose a direct endpoint allowing access to status of a running job. -A previous iteration of Armada did provide an endpoint to get status of a running job. This was found to be a bottleneck for scaling to large number of jobs and/or users. The switch to an event API was used to alleviate this performance issue. - -### Change Airflow DAG API -Airflow could be modified to allow alternate forms of integration which work better with event-based systems. -This is impractical because we do not have Airflow contributors on staff, and the timeline required to get such a change proposed, approved, and merged upstream is much too long and includes lots of risk. - -## Data Access -- Service will need to insert job-id and state for a given queue and job-set -- Service will need to delete all jobs for a given queue and job-set. -- Service will access by job-id for polling loop. -- We will use in an in memory cache while doing subscription and then write to a persistent DB periodically. -- We will delete data after a configuration amount of time without an update. -## Data Model - - The Job Service will contain a table of queue, job-set, job-id, state and timestamp. - - What database should store this? - - We will use SQLLite. - - A in memory database will be used to get job-sets and then we will write in batches to our database for persistence. -### SQLLite -Pros - - Lightweight - - In memory db - - Part of service - - Persists database to a file - - SQL operations for inserting and deleting are simple. - -Cons - - Writing is sequential and blocks. - - Meant for small amount of concurrent users. - - Difficult to scale with Kubernetes. - - Scaling is only possible by increasing the number of job services - - Logic for deleting is more complicated. - - Writing to virtualized file volume will be slow in Kubernetes. - -## API (impact/changes?) -- What should be the API between Armada cache <-> Airflow? - - The proto file above will generate a python client where they can call get_job_status with job_id, job_set_id and queue specified. All of these are known by the Airflow Operator. - - [API Definition](https://github.com/armadaproject/armada/blob/master/pkg/api/jobservice/jobservice.proto) -- JobSet subscription will happen automatically for all tasks in a dag. - -## Security Impact - -The cache should use the same security as our armadactl. Airflow does not currently support multitenancy. - -## Documentation Impact -- Update dev and quickstart guides -- Update production deployment guides - -## Use Cases - -### Airflow Operator -1) User creates a dag and assigns a job-set. -2) Dag setup includes ArmadaPythonClient and JobServiceClient -3) Airflow operator takes both ArmadaPythonClient and JobServiceClient -4) Airflow operator submits job via ArmadaPythonClient -5) Airflow operator polls JobServiceClient via GetJobStatus -6) Once Armada has a terminal event, the airflow task is complete. - -### Implementation Plan - -I have a PR that implements this [plan](https://github.com/armadaproject/armada/pull/1122). -- Created a jobservice proto definition -- Generated GRPC service for the correspond proto definition -- Created a jobservice cmd that takes an configuration object -- JobService starts a GRPC server -- Added ApiConnection and GRPC configuration parameters - - -### Subscription - -After talking with Chris Martin, I found out that we will be implementing our own redis cache for the events. We will not be using pulsar, nats, or jetstream to stream events. - -The logic for this service should be as follows: - -- When a request comes in, check if we already have a subscription to that jobset. -If we don't have a subscription, create one using the armada go client (grpc api). -- Have a function connected to this subscription that updates the jobId key in the local cache with the new state for all jobs in the jobset (even those nobody has asked for yet). -- The local redis should just store jobId -> state mappings. Any messages you get that don't correspond to states we care about (ingresses, unableToSchedule) just ignore. -- Return the latest state. If we just subscribed then it's probably "not found" -The armada operator just polls for the job state. The first poll for a given jobset will cause a subscription to be made for that jobset. - -### Airflow Sequence Diagram - -![AirflowSequence](./airflow-sequence.svg) - - -### JobService Server Diagram - -![JobService](./job-service.svg) - -- EventClient is the GRPC public GRPC client for watching events - -- The JobService deployment consists of a GRPC Go Server and a database. diff --git a/docs/design/jobservice/job-service.svg b/docs/design/jobservice/job-service.svg deleted file mode 100644 index 795a12f733e..00000000000 --- a/docs/design/jobservice/job-service.svg +++ /dev/null @@ -1,15 +0,0 @@ -JobServiceJobServiceEventClientEventClientDatabaseDatabaseJobServiceClientJobServiceClientCalls Event client with job-set and queueStores all job status and message for a given job-set in the databaseCalls Database via rpc call to retrieve status and message for given id \ No newline at end of file diff --git a/docs/design/jobservice/jobservice.pml b/docs/design/jobservice/jobservice.pml deleted file mode 100644 index 4d45e346bec..00000000000 --- a/docs/design/jobservice/jobservice.pml +++ /dev/null @@ -1,5 +0,0 @@ -@startuml -JobService -> EventClient : Calls Event client with job-set and queue -EventClient -> JobService : Stores all job status and message for a given job-set in the database -Database -> JobServiceClient : Calls Database via rpc call to retrieve status and message for given id -@enduml \ No newline at end of file diff --git a/docs/design/priority.md b/docs/design/priority.md deleted file mode 100644 index f49b8d50762..00000000000 --- a/docs/design/priority.md +++ /dev/null @@ -1,52 +0,0 @@ -# Armada priority - -This document describes priority calculation algorithm in detail. - -## How is priority calculated - -### Resource usage -Armada schedules jobs which can use multiple types of resources (cpu, memory, gpu, ...). -To get one number which represents the share of a resource by a particular queue, Armada firstly calculates how much of particular -resource is available for one cpu `resource factor`. -Then queue usage can be calculated as `usage = # of cpu + # gpu / gpu factor + # memory / memory factor + ...` - -In example: -If our cluster has 10 cpus, 20Gb of memory and 5 gpus.
    -Gpu factor will be `0.5` and memory factor `2`.
    -Queue using 5 cpu, 2 Gb memory and 1 gpu will have usage `5 + 2 / 2 + 1 / 0.5 = 8` . - -### Queue priority -Queue priority is calculated based on current resource usage; if a particular queue usage is constant, the queue priority will approach this number and eventually stabilize on this value. -Armada allows configuration of `priorityHalftime` which influences how quickly queue priority approaches resource usage. - -The formula for priority update is as follows (inspired by Condor priority calculation): - -`priority = priority (1 - beta) + resourceUsage * beta` - -`beta = 0.5 ^ (timeChange / priorityHalftime)` - -### Priority factor -Each queue has a priority factor, this is a multiplicative constant which is applied to the priority. The lower this number is the more resources a queue will be allocated in scheduling. - -`effectivePriority = priority * priorityFactor` - -## Scheduling resources -Available resources are divided between non empty queues based on queue priority. The share allocated to the queue is proportional to inverse of its priority. - -For example if queue `A` has priority `1` and queue `B` priority `2`, `A` will get `2/3` and `B` `1/3` of the resources. - -There are 2 approaches Armada uses to schedule jobs: - -### Slices of resources -When the Executor requests new jobs with information about available resources, resources are divided into slices according to the inverse priority. - -Armada iterates through queues and allocates jobs up to the slice size for each queue. - -Whatever resources remain after this round are scheduled using probabilistic slicing. - -This round is skipped if Armada Server is configured with the option `scheduling.useProbabilisticSchedulingForAllResources = true`. - -### Probabilistic scheduling -To schedule any remaining resources Armada randomly selects a non-empty queue with probability distribution corresponding to the remainders of queue slices. One job from this queue is scheduled, and the queue slice is reduced. This continues until there is no resource available, queues are empty or the scheduling time is up. - -This way there is a chance than one queue will get allocated more than it is entitled to in the scheduling round. However as we are concerned with fair share over the time, rather than in a moment, this does not matter much. Queue priority will compensate for this in the future. diff --git a/docs/design/relationships_diagram.md b/docs/design/relationships_diagram.md deleted file mode 100644 index 2f624f44403..00000000000 --- a/docs/design/relationships_diagram.md +++ /dev/null @@ -1,51 +0,0 @@ -## Relationships Diagram - -These diagrams show the high-level relationships between components of Armada and third-party softwares. - -### Armada V1 System - -![Systems Diagram](./diagrams/relationships/armada_v1_system.png) - - -### Armada V2 System - -![Systems Diagram](./diagrams/relationships/armada_v2_system.png) - - -For a more detailed view of Armada, see the [Scheduler Architecture Doc](./architecture.md). - -### Armada Client - -This is the component that is used by users to submit jobs to Armada, using gRPC. Current languages supported are: -- Go -- Python -- C# - -### Ingester Loops - -All data-flows in armada are controlled by pulsar. This means that all data is first written to pulsar, and then ingested into the appropriate database. The ingester loops are the components that read data from pulsar and write it to the appropriate database. - -There are 3 ingester loops: -- **Event Ingester**: This ingests data from pulsar into redis. -- **Lookout Ingester**: This ingests data from pulsar into postgres. -- **Scheduler Ingester**: This ingests data from pulsar into postgres. - -### Scheduler - -The scheduler is the component that is responsible for scheduling jobs. - -It receives data from the ingester loops, and then uses that data to schedule jobs. Its decisions are then fed back to pulsar, allowing the process to repeat. - -### Armada Executor Components - -These are the components that run on each k8s cluster that executes jobs. - -It includes: -- **Armada Executor**: The main component of the executor. It is responsible for the execution of jobs on the cluster. -- **Binoculars**: A component that reads logs from the k8s API. - -### Lookout - -Lookout is made of 2 components: -- **Lookout API**: This is the component that acts as a gateway to the lookout database. It is a gRPC API. -- **Lookout UI**: This is the component that is used by users to query the state of jobs. It is a web UI. diff --git a/docs/design/scheduler.md b/docs/design/scheduler.md deleted file mode 100644 index e8e6afff538..00000000000 --- a/docs/design/scheduler.md +++ /dev/null @@ -1,154 +0,0 @@ -# Scheduler - -The scheduler is the component of Armada responsible for determining when and where each job should run. Here, we describe how it works, including its support for - -* fair resource allocation, -* bin-packing, -* gang-scheduling, and -* preemption (urgency-based and to fair share). - -## Jobs - -An Armada job represents a computational task to be carried out and consists of a bag of Kubernetes objects (e.g., pods, services, and ingresses) with a shared life cycle, i.e., all objects are created at the start of the job (within the same cluster) and are destroyed at its end. Each job is a member of a queue (e.g., corresponding to a particular user) and a job set (a per-queue logical grouping of jobs that can be managed as a unit), and has a priority associated with it, i.e., each job has associated with it a tuple (queue, jobSet, priority). Each job also has a priority class (PC) associated with it; see the section on preemption. - -Each job is submitted to a specific queue and is stored in that queue while waiting to be scheduled. Job sets typically represent workflows consisting of multiple jobs. For example, if fitting a machine learning model against several different data sets, there may be a separate job for each data set, and these jobs could all be members of the same job set. Job sets can be monitored and, e.g., cancelled as a unit, which simplifies managing large numbers of jobs. - -Armada jobs are created by submitting a job specification to the Armada server via either the gRPC API, client libraries, or the armadactl command-line-utility. - -## Resource usage and fairness - -Each job has a cost associated with it that is the basis of fair resource allocation. In particular, Armada tries to balance the aggregate cost of jobs between queues. Specifically, the cost of each job is a weighted sum of all resources requested by that job. For example, a job requesting CPU, GPU, and RAM, has cost - -CPU + w_GPU * GPU + w_RAM * RAM, - -where w_GPU and w_RAM is the cost of GPU and RAM relative to 1 CPU. Currently, w_GPU=1 and w_RAM=0. - -Further, the cost associated with each queue is the sum of the cost of all jobs in the pending or running state associated with the queue; this per-queue cost is what the Armada scheduler tries to balance. (This notion of fairness is sometimes referred to as asset fairness.) Specifically, each queue has a weight associated with it that determines the size of its fair share. If we denote these per-queue weights by - -w_1, ..., w_N, - -where N is the number of active queues (see below) and by - -w = sum(w_1, ..., w_N) - -their sum, then the fair share of each of the N queues is - -w_1 / w, ..., w_N / w. - -This computation only includes active queues, i.e., queues for which there are jobs in the queued, pending, or running state. Hence, the fair share of a queue may vary over time as other queues transition between active and inactive. Armada considers the cost associated with each queue (more specifically, the fraction of its fair share each queue is currently assigned) when selecting which job to schedule next; see the following section. - -## Job scheduling order - -Armada schedules one job at a time, and choosing the order in which jobs are attempted to be scheduled is the mechanism by which Armada ensures resources are divided fairly between queues. In particular, jobs within each queue are ordered by per-job priorities set by the user, but there is no inherent ordering between jobs associated with different queues; the scheduler is responsible for establishing such a global ordering. To divide resources fairly, Armada establishes such a global ordering as follows: - -1. For each queue, find the next schedulable job in that queue, where jobs are considered in order of per-job priority first and submission time second. -2. For each queue, compute what fraction of its fair share the queue would have if the next schedulable job were to be scheduled. -3. Select for scheduling the next schedulable job from the queue for which this computation resulted in the smallest fraction of fair share. - -Including the next schedulable job in the computation in step 2. is important since the next job may be a gang job requesting thousands of nodes. - -This approach is sometimes referred to as progressive filling and is known to achieve max-min fairness, i.e., for an allocation computed in this way, an attempt to increase the allocation of one queue necessarily results in decreasing the allocation of some other queue with equal or smaller fraction of its fair share, under certain conditions, e.g., when the increments are sufficiently small. - -Note that when finding the next schedulable job, there is a limit to the number of jobs considered, i.e., there may be schedulable job in a queue blocked behind a long sequence of unschedulable jobs. - -## Bin-packing -When assigning jobs to nodes, Armada adheres to the following principles: - -* When choosing a node to assign a job to, Armada first considers the set of nodes on which the queue the job is associated with is the only user. If not schedulable on any of those nodes, Armada considers the set of unused nodes, and, only if not schedulable there either, considers nodes with multiple users. This principle is important to reduce interference between jobs associated with different queues during the scheduling cycle and serves to reduce the number of preemptions necessary when preempting to fair share (see the section on preemption). -* When choosing among the nodes in such a set, Armada attempts to schedule the job onto the node with the smallest amount of available resources on which the job fits. This principle is important to increase the amount of contiguous resources available, thus facilitating scheduling large jobs later – Armada is optimised for large jobs in this way since the difficulty of scheduling a job increases with its size; very small jobs are typically easy to schedule regardless. - -Together, these principles result in jobs being bin-packed on a per-queue basis – the second step above can be seen as greedy bin-packing solver. - -This approach comes with an important trade-off compared global bin-packing in that it reduces cross-queue job contention at the expense of potentially increasing inter-queue job contention. I.e., each user has a greater level of control of how the resources on a node are utilised – since a user submitting a large number of jobs is likely to be the only user on most of the nodes assigned to those jobs. However, this approach also results in jobs that are likely to have similar resource usage profiles being clustered together – since jobs originating from the same queue are more likely to, e.g., consume large amounts of network bandwidth at the same time, than jobs originating from different queues. We opt for giving users the greater level of control since it can allow for overall more performant applications (hence, this is also the approach typically taken in the high-performance computing community). - -## Gang scheduling -Armada supports gang scheduling of jobs, i.e., all-or-nothing scheduling of a set of jobs, such that all jobs in the gang are scheduled onto the same cluster at the same time or not at all. Specifically, Armada implicitly groups jobs using a special annotation set on the pod spec embedded in the job. A set of jobs (not necessarily a "job set") for which the value of this annotation is the same across all jobs in the set is referred to as a gang. All jobs in a gang are gang-scheduled onto the same cluster at the same time. The cluster is chosen dynamically by the scheduler and does not need to be pre-specified. - -Details related to the gang-scheduling algorithm: - -* Jobs are grouped using the armadaproject.io/gangId annotation. The value of the armadaproject.io/gangId annotation must not be re-used. For example, a unique UUID generated for each gang is a good choice. -* All jobs in a gang must also specify the total number of jobs in the gang using another annotation armadaproject.io/gangCardinality. It's the responsibility of the submitter to ensure this value is set correctly on each job that makes up a gang. -* All jobs in a gang must be submitted within the same request to Armada. This is to ensure that Armada can validate at submit-time that all jobs in the gang are present. -* During scheduling, Armada iterates over jobs. Whenever the Armada scheduler find a job that sets the armadaproject.io/gangId annotation, it stores that job in a separate place. Armada only considers these jobs for scheduling once it has found all of the jobs that make up the gang. Note that the scheduler object already supports several pods. - -## Preemption - -Armada supports two forms of preemption: - -1. Urgency-based preemption, i.e., making room for a job by preempting less urgent jobs. This form of preemption works in the same way as Kubernetes priority classes (PCs). -2. Preemption to fair share, i.e., preempting jobs belonging to users with more than their fair share of resources, such that those resources can be re-allocated to improve fairness. - -These forms of preemption are driven by separate processes and operate independently of each other. Incidentally, preemption also makes it easier to schedule large jobs, since currently running jobs can be preempted to make room for them. - -Both forms of preemption are based on Armada job PCs, each of which is represented by a tuple (name, priority, isPreemptible). Armada comes with two PCs by default: - -* (armada-default, 30000, false) -* (armada-preemptible, 20000, true) - -Job priority classes are set by setting the priorityClassName field of the embedded podspec. Jobs with no PC are automatically assigned the armada-default PC (i.e., preemption is opt-in). We describe both forms of preemption in more detail below. - -### Urgency-based preemption - -When scheduling a job, Armada may preempt other jobs to make room for it. Specifically, Armada may preempt running preemptible jobs with a lower-priority PC. Hence, the PC priority of a job expresses how urgent a job is. In this way, PCs support the following use cases: - -* A user wants to run, e.g., a speculative job and doesn't want to occupy the farm if there are more urgent jobs to run. To that end, the user chooses a low-priority preemptible PC when submitting it. If there are more urgent jobs to run (i.e., with a higher-priority PC), those jobs may preempt the submitted job. -* A user has an urgent job they want to be run immediately. To that end, they choose a high-priority PC, such that it may preempt currently running preemptible jobs to make room for itself. - -Hence, this is a cooperative form of preemption that requires users to coordinate among themselves to set appropriate PCs. - -Urgency-based preemption is implemented in Armada via tracking the allocatable resources at different PC priorities. For example, if a 32-core node has running on it - -* an armada-default job requesting 10 cores and -* an armada-preemptible job requesting 20 cores, - -then Armada understands that up to 22 cores can be allocated to armada-default jobs (allocating more than 2 cores is possible by preempting the armada-preemptible job) and up to 2 cores can be allocated to armada-preemptible jobs. If during scheduling a job needs to be preempted, kube-scheduler (a Kubernetes component) makes the decision on which job should be preempted. - -### Preemption to fair share - -Whereas urgency-based preemption is triggered by a job being submitted that can not be scheduled without preempting a lower-urgency job, preemption to fair share is triggered whenever a queue A has been allocated more than their fair share of resources – and at least some of those jobs are preemptible – and another queue B has jobs of equal PC priority queued. Recall that the fair share of each queue is computed from the set of currently active queues, i.e., queue A may be exceeding its fair share because a previously inactive queue B has become active as a result of jobs being submitted to it, thus reducing the size of the fair share of queue A. - -For example, if jobs of PC armada-preemptible are submitted to queue A and are allocated all available resources, and later jobs of PC armada-preemptible are submitted to queue B, Armada would preempt some of the jobs of user A to make room for the jobs submitted by user B (the fraction of resources reclaimed from queue A depends on the relative weights of the two user's queues). - -At a high level, preemption to fair share works as follows: - -1. Some preemptible jobs are evicted from the nodes to which they are assigned and are placed at the front of their respective queues. Specifically, for each node, all preemptible jobs on that node are evicted with a configurable probability. If a job part of gang is evicted, all other jobs in that gang that are still running are also evicted, regardless of which node they are assigned to. This happens only within the scheduler, i.e., no running jobs are preempted at this stage. The cost of the evicted jobs are subtracted from the cost of their respective queues. -2. Armada performs a scheduling cycle, thus computing a mapping from jobs to nodes as if the evicted jobs had never started running and were still queued. Recall that Armada selects which queue to schedule from next based on what fraction of its fair share the queue is currently allocated. Hence, any queue above its fair share is unlikely to have all of its evicted jobs re-scheduled as part of the cycle (unless other jobs for some reason can not be scheduled). -3. Any jobs that were evicted and not re-scheduled as part of step 2. are preempted. Any jobs scheduled in step 2. that were not previously evicted are new jobs that should be allowed to start running. Because evicted jobs are placed at the front of each queue, Armada will always, for each queue, try to re-schedule evicted jobs before trying to schedule now jobs. - -In this way Armada makes a unified of which jobs should be preempted and scheduled. It is then the responsibility of the rest of the system to reconcile against this new desired state. - -For this process to be effective, i.e., not cause large numbers of avoidable preemptions, the mapping from jobs to nodes must be stable across invocations of the scheduler. We use two strategies to increase stability: - -* Evicted jobs may only be scheduled onto the node they were evicted from, i.e., no moving jobs between nodes. -* Jobs are bin-packed on a per-queue basis. This reduces interference between queues during the scheduling cycle. - -For example, consider a scenario with two queues A and B of equal weight and two nodes – node 1 and node 2 – with 32 cores each. Say that initially 40 1-core preemptible jobs are submitted to queue A, 32 of which are scheduled onto node 1 and 8 on node 2. Later, 50 1-core preemptible jobs are submitted to queue B. During the next scheduler invocation, Armada evicts all jobs from nodes 1 and 2 and places these at the front of queue A. At this point, there are 40 jobs in queue A and 50 jobs in queue B. Then, Armada starts scheduling from both queue A and B. Because Armada selects which queue to schedule from next based on which queue is currently assigned the smallest fraction of its fair share, Armada will alternate between scheduling from queue A and B, such that at the end of the scheduling cycle, 32 jobs are scheduled from each queue; the scheduling cycle will have terminated because both node 1 and 2 are full at this point. For queue A, all these jobs are re-scheduled evicted jobs, whereas for queue B the 32 scheduled jobs are new jobs. For queue A, 8 evicted jobs were not re-scheduled and are thus preempted. For queue B, 18 jobs could not be scheduled and are still queued. - -The above example also illustrates why per-queue bin-packing (as opposed to bin-packing in a non-queue-aware manner) is important; because Armada alternates between scheduling from queue A and B, non-queue-aware bin-packing would fill up node 1 with 16 jobs from each queue before scheduling onto node 2, thus unnecessarily preempting 16 jobs from queue A. Per-queue bin-packing, on the other hand, avoids scheduling jobs from queue B onto node 1 when possible, which results in the 32 jobs of queue B all being scheduled onto node 2. - -To control the rate of preemptions, the expected fraction of currently running jobs considered for preemption to fair share is configurable. Specifically, for each node, the preemptible jobs on that node are evicted with a configurable probability. - -## Graceful termination - -Armada will sometimes kill pods, e.g., because the pod is being preempted or because the corresponding job has been cancelled. Pods can optionally specify a graceful termination period, i.e., an amount of time that the pod is given to exit gracefully before being terminated. Graceful termination works as follows: - -1. The pod is sent a SIGTERM. Kubernetes stores the time at which the signal was sent. -2. After the amount of time specified in the graceful termination period field of the pod has elapsed, the job is sent a SIGKILL if still running. - -Armada implements graceful termination periods as follows: - -* Jobs submitted to Armada with no graceful termination period set, are assigned a 1s period. -* Armada validates that all submitted jobs have a termination period between 1s and a configurable maximum. It is important that the minimum is positive, since a 0s grace period is interpreted by Kubernetes as a "force delete", which may result in inconsistencies due to pods being deleted from etcd before they have stopped running. - -Jobs that set a termination period of 0s will be updated in-place at submission to have a 1s termination period. This is to ensure that current workflows, some of which unnecessarily set a 0s termination period, are not disrupted. - -Jobs that explicitly set a termination period higher than the limit will be rejected at submission. Jobs that set a termination period greater than 0s but less than 1s will also be rejected at submission. - -## Job deadlines - -All Armada jobs can be assigned default job deadlines, i.e., jobs have a default maximum runtime after which the job will be killed. These defaults are: - -* CPU jobs: 3 days -* GPU jobs: 14 days - -Default deadlines are only added to jobs that do not already specify one. To manually specify a deadline, set the ActiveDeadlineSeconds field of the pod spec embedded in the job; see https://github.com/kubernetes/api/blob/master/core/v1/types.go#L3182 diff --git a/docs/production-install.md b/docs/production-install.md deleted file mode 100644 index 306e4e157e6..00000000000 --- a/docs/production-install.md +++ /dev/null @@ -1,252 +0,0 @@ -# Production Installation - -### Prerequisites - -* At least one running Kubernetes cluster - -### Installing Armada Server - -For production it is assumed that the server component runs inside a Kubernetes cluster. - -The below sections will cover how to install the component into Kubernetes. - -#### Recommended prerequisites - - -* Cert manager installed [https://cert-manager.io/docs/installation/helm/#installing-with-helm](https://cert-manager.io/docs/installation/helm/#installing-with-helm) -* gRPC compatible ingress controller installed for gRPC ingress such as [https://github.com/kubernetes/ingress-nginx](https://github.com/kubernetes/ingress-nginx) -* Redis installed [https://github.com/helm/charts/tree/master/stable/redis-ha](https://github.com/helm/charts/tree/master/stable/redis-ha) -* Optionally install NATS streaming server helm chart:[https://github.com/nats-io/k8s/tree/main/helm/charts/stan](https://github.com/nats-io/k8s/tree/main/helm/charts/stan), additional docs: [https://docs.nats.io/running-a-nats-service/nats-kubernetes](https://docs.nats.io/running-a-nats-service/nats-kubernetes) - - -Set `ARMADA_VERSION` environment variable and clone [this repository](https://github.com/armadaproject/armada.git) with the same version tag as you are installing. For example to install version `v1.2.3`: -```bash -export ARMADA_VERSION=v1.2.3 -git clone https://github.com/armadaproject/armada.git --branch $ARMADA_VERSION -``` - -#### Installing server component - -To install the server component, we will use Helm. - -You'll need to provide custom config via the values file, below is a minimal template that you can fill in: - -```yaml -ingressClass: "nginx" -clusterIssuer: "letsencrypt-prod" -hostnames: - - "server.component.url.com" -replicas: 3 - -applicationConfig: - redis: - masterName: "mymaster" - addrs: - - "redis-ha-announce-0.default.svc.cluster.local:26379" - - "redis-ha-announce-1.default.svc.cluster.local:26379" - - "redis-ha-announce-2.default.svc.cluster.local:26379" - poolSize: 1000 - eventsRedis: - masterName: "mymaster" - addrs: - - "redis-ha-announce-0.default.svc.cluster.local:26379" - - "redis-ha-announce-1.default.svc.cluster.local:26379" - - "redis-ha-announce-2.default.svc.cluster.local:26379" - poolSize: 1000 - -basicAuth: - users: - "user1": "password1" -``` - -For all configuration options you can specify in your values file, see [server Helm docs](https://armadaproject.io/helm#server-helm-chat). - -Fill in the appropriate values in the above template and save it as `server-values.yaml` - -Then run: - -```bash -helm install ./deployment/armada --set image.tag=$ARMADA_VERSION -f ./server-values.yaml -``` - -#### Using NATS Streaming -You can optionally setup Armada to route all job events through persistent NATS Streaming subject before saving them to redis. This is useful if additional application needs to consume events from Armada as NATS subject contains job events from all job sets. - -Required additional server configuration is: - -```yaml -eventsNats: - servers: - - "armada-nats-0.default.svc.cluster.local:4222" - - "armada-nats-1.default.svc.cluster.local:4222" - - "armada-nats-2.default.svc.cluster.local:4222" - clusterID: "nats-cluster-ID" - subject: "ArmadaEvents" - queueGroup: "ArmadaEventsRedisProcessor" -``` - -### Installing Armada Executor - -For production the executor component should run inside the cluster it is "managing". - -To install the executor into a cluster, we will use Helm. - -You'll need to provide custom config via the values file, below is a minimal template that you can fill in: - -```yaml -applicationConfig: - application: - clusterId : "clustername" - apiConnection: - armadaUrl : "server.component.url.com:443" - basicAuth: - username: "user1" - password: "password1" -``` - -
    - -##### Moving Executor off the control plane - -By default, the executor runs on the control plane. - -When that isn't an option, maybe because you are using a managed kubernetes service where you cannot access the master nodes. - -Add the following to your values file: - ```yaml -nodeSelector: null -tolerations: [] -``` -
    - - -For other node configurations and all other executor options you can specify in your values file, see [executor Helm docs](https://armadaproject.io/helm#Executor-helm-chart). - -Fill in the appropriate values in the above template and save it as `executor-values.yaml`. - -Then run: - -```bash -helm install ./deployment/armada-executor --set image.tag=$ARMADA_VERSION -f ./executor-values.yaml -``` -# Interacting with Armada - -Once you have the Armada components running, you can interact with them via the command-line tool called `armadactl`. - -## Setting up armadactl - -`armadactl` connects to `localhost:50051` by default with no authentication. - -For authentication please create a config file described below. - -#### Config file - -By default config is loaded from `$HOME/.armadactl.yaml`. - -You can also set location of the config file using command line argument: - -```bash -armada command --config=/config/location/config.yaml -``` - -The format of this file is a simple yaml file: - -```yaml -armadaUrl: "server.component.url.com:443" -basicAuth: - username: "user1" - password: "password1" -``` - -For Open Id protected server armadactl will perform PKCE flow opening web browser. -Config file should look like this: -```yaml -armadaUrl: "server.component.url.com:443" -openIdConnect: - providerUrl: "https://myproviderurl.com" - clientId: "***" - localPort: 26354 - useAccessToken: true - scopes: [] -``` - -To Invoke an external program to generate an access token, config file should be as follows: -```yaml -armadaUrl: "server.component.url.com:443" -execAuth: - # Command to run. Needs to be on the path and should write only a token to stdout. Required. - cmd: some-command - # Environment variables to set when executing the command. Optional. - args: - - "arg1" - # Arguments to pass when executing the command. Optional. - env: - - name: "FOO" - value: "bar" - # Whether the command requires user input. Optional - interactive: true -``` - -For Kerberos authentication, config file should contain this: -``` -KerberosAuth: - enabled: true -``` - -#### Environment variables - - --- TBC --- - -## Submitting Test Jobs - -For more information about usage please see the [User Guide](./user.md) - -Specify the jobs to be submitted in a yaml file: -```yaml -queue: test -jobSetId: job-set-1 -jobs: - - priority: 0 - podSpec: - terminationGracePeriodSeconds: 0 - restartPolicy: Never - containers: - ... any Kubernetes pod spec ... - -``` - -Use the `armadactl` command line utility to submit jobs to the Armada server -```bash -# create a queue: -armadactl create queue test --priorityFactor 1 - -# submit jobs in yaml file: -armadactl submit ./example/jobs.yaml - -# watch jobs events: -armadactl watch test job-set-1 - -``` - -**Note: Job resource request and limit should be equal. Armada does not support limit > request currently.** - -## Metrics - -All Armada components provide a `/metrics` endpoint providing relevant metrics to the running of the system. - -We actively support Prometheus through our Helm charts (see below for details), however any metrics solution that can scrape an endpoint will work. - -### Component metrics - -#### Server - -The server component provides metrics on the `:9000/metrics` endpoint. - -You can enable Prometheus components when installing with Helm by setting `prometheus.enabled=true`. - -#### Executor - -The executor component provides metrics on the `:9001/metrics` endpoint. - -You can enable Prometheus components when installing with Helm by setting `prometheus.enabled=true`. - diff --git a/docs/python_airflow_operator.md b/docs/python_airflow_operator.md deleted file mode 100644 index 048667a2562..00000000000 --- a/docs/python_airflow_operator.md +++ /dev/null @@ -1,730 +0,0 @@ ---- -docname: python_airflow_operator -images: {} -path: /python-airflow-operator -title: Armada Airflow Operator ---- - -# Armada Airflow Operator - -This class provides integration with Airflow and Armada - -## armada.operators.armada module - - -### _class_ armada.operators.armada.ArmadaOperator(name, armada_channel_args, job_service_channel_args, armada_queue, job_request_items, lookout_url_template=None, poll_interval=30, \*\*kwargs) -Bases: `BaseOperator` - -Implementation of an ArmadaOperator for airflow. - -Airflow operators inherit from BaseOperator. - - -* **Parameters** - - - * **name** (*str*) – The name of the airflow task - - - * **armada_channel_args** (*GrpcChannelArgsDict*) – GRPC channel arguments to be used when creating - a grpc channel to connect to the armada server instance. - - - * **job_service_channel_args** (*GrpcChannelArgsDict*) – GRPC channel arguments to be used when creating - a grpc channel to connect to the job service instance. - - - * **armada_queue** (*str*) – The queue name for Armada. - - - * **job_request_items** (*List**[**JobSubmitRequestItem**]*) – A PodSpec that is used by Armada for submitting a job - - - * **lookout_url_template** (*str** | **None*) – A URL template to be used to provide users - a valid link to the related lookout job in this operator’s log. - The format should be: - “[https://lookout.armada.domain/jobs](https://lookout.armada.domain/jobs)?job_id=” where will - be replaced with the actual job ID. - - - * **poll_interval** (*int*) – How often to poll jobservice to get status. - - - -* **Returns** - - an armada operator instance - - - -#### execute(context) -Executes the Armada Operator. - -Runs an Armada job and calls the job_service_client for polling. - - -* **Parameters** - - **context** – The airflow context. - - - -* **Returns** - - None - - - -* **Return type** - - None - - - -#### render_template_fields(context, jinja_env=None) -Template all attributes listed in *self.template_fields*. - -This mutates the attributes in-place and is irreversible. - - -* **Parameters** - - - * **context** (*Context*) – Context dict with values to apply on content. - - - * **jinja_env** (*Environment** | **None*) – Jinja’s environment to use for rendering. - - - -* **Return type** - - None - - - -#### template_fields(_: Sequence[str_ _ = ('job_request_items',_ ) -## armada.operators.armada_deferrable module - - -### _class_ armada.operators.armada_deferrable.ArmadaDeferrableOperator(name, armada_channel_args, job_service_channel_args, armada_queue, job_request_items, lookout_url_template=None, poll_interval=30, \*\*kwargs) -Bases: `BaseOperator` - -Implementation of a deferrable armada operator for airflow. - -Distinguished from ArmadaOperator by its ability to defer itself after -submitting its job_request_items. - -See -[https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/deferring.html](https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/deferring.html) -for more information about deferrable airflow operators. - -Airflow operators inherit from BaseOperator. - - -* **Parameters** - - - * **name** (*str*) – The name of the airflow task. - - - * **armada_channel_args** (*GrpcChannelArgsDict*) – GRPC channel arguments to be used when creating - a grpc channel to connect to the armada server instance. - - - * **job_service_channel_args** (*GrpcChannelArgsDict*) – GRPC channel arguments to be used when creating - a grpc channel to connect to the job service instance. - - - * **armada_queue** (*str*) – The queue name for Armada. - - - * **job_request_items** (*List**[**JobSubmitRequestItem**]*) – A PodSpec that is used by Armada for submitting a job. - - - * **lookout_url_template** (*str** | **None*) – A URL template to be used to provide users - a valid link to the related lookout job in this operator’s log. - The format should be: - “[https://lookout.armada.domain/jobs](https://lookout.armada.domain/jobs)?job_id=” where will - be replaced with the actual job ID. - - - * **poll_interval** (*int*) – How often to poll jobservice to get status. - - - -* **Returns** - - A deferrable armada operator instance. - - - -#### execute(context) -Executes the Armada Operator. Only meant to be called by airflow. - -Submits an Armada job and defers itself to ArmadaJobCompleteTrigger to wait -until the job completes. - - -* **Parameters** - - **context** – The airflow context. - - - -* **Returns** - - None - - - -* **Return type** - - None - - - -#### render_template_fields(context, jinja_env=None) -Template all attributes listed in *self.template_fields*. - -This mutates the attributes in-place and is irreversible. - - -* **Parameters** - - - * **context** (*Context*) – Context dict with values to apply on content. - - - * **jinja_env** (*Environment** | **None*) – Jinja’s environment to use for rendering. - - - -* **Return type** - - None - - - -#### resume_job_complete(context, event, job_id) -Resumes this operator after deferring itself to ArmadaJobCompleteTrigger. -Only meant to be called from within Airflow. - -Reports the result of the job and returns. - - -* **Parameters** - - - * **context** – The airflow context. - - - * **event** (*dict*) – The payload from the TriggerEvent raised by - ArmadaJobCompleteTrigger. - - - * **job_id** (*str*) – The job ID. - - - -* **Returns** - - None - - - -* **Return type** - - None - - - -#### serialize() -Get a serialized version of this object. - - -* **Returns** - - A dict of keyword arguments used when instantiating - - - -* **Return type** - - dict - - -this object. - - -#### template_fields(_: Sequence[str_ _ = ('job_request_items',_ ) - -### _class_ armada.operators.armada_deferrable.ArmadaJobCompleteTrigger(job_id, job_service_channel_args, armada_queue, job_set_id, airflow_task_name, poll_interval=30) -Bases: `BaseTrigger` - -An airflow trigger that monitors the job state of an armada job. - -Triggers when the job is complete. - - -* **Parameters** - - - * **job_id** (*str*) – The job ID to monitor. - - - * **job_service_channel_args** (*GrpcChannelArgsDict*) – GRPC channel arguments to be used when - creating a grpc channel to connect to the job service instance. - - - * **armada_queue** (*str*) – The name of the armada queue. - - - * **job_set_id** (*str*) – The ID of the job set. - - - * **airflow_task_name** (*str*) – Name of the airflow task to which this trigger - belongs. - - - * **poll_interval** (*int*) – How often to poll jobservice to get status. - - - -* **Returns** - - An armada job complete trigger instance. - - - -#### _async_ run() -Runs the trigger. Meant to be called by an airflow triggerer process. - - -#### serialize() -Return the information needed to reconstruct this Trigger. - - -* **Returns** - - Tuple of (class path, keyword arguments needed to re-instantiate). - - - -* **Return type** - - tuple - - -## armada.operators.jobservice module - - -### _class_ armada.operators.jobservice.JobServiceClient(channel) -Bases: `object` - -The JobService Client - -Implementation of gRPC stubs from JobService - - -* **Parameters** - - **channel** – gRPC channel used for authentication. See - [https://grpc.github.io/grpc/python/grpc.html](https://grpc.github.io/grpc/python/grpc.html) - for more information. - - - -* **Returns** - - a job service client instance - - - -#### get_job_status(queue, job_set_id, job_id) -Get job status of a given job in a queue and job_set_id. - -Uses the GetJobStatus rpc to get a status of your job - - -* **Parameters** - - - * **queue** (*str*) – The name of the queue - - - * **job_set_id** (*str*) – The name of the job set (a grouping of jobs) - - - * **job_id** (*str*) – The id of the job - - - -* **Returns** - - A Job Service Request (State, Error) - - - -* **Return type** - - *JobServiceResponse* - - - -#### health() -Health Check for GRPC Request - - -* **Return type** - - *HealthCheckResponse* - - - -### armada.operators.jobservice.get_retryable_job_service_client(target, credentials=None, compression=None) -Get a JobServiceClient that has retry configured - - -* **Parameters** - - - * **target** (*str*) – grpc channel target - - - * **credentials** (*ChannelCredentials** | **None*) – grpc channel credentials (if needed) - - - * **compresion** – grpc channel compression - - - * **compression** (*Compression** | **None*) – - - - -* **Returns** - - A job service client instance - - - -* **Return type** - - *JobServiceClient* - - -## armada.operators.jobservice_asyncio module - - -### _class_ armada.operators.jobservice_asyncio.JobServiceAsyncIOClient(channel) -Bases: `object` - -The JobService AsyncIO Client - -AsyncIO implementation of gRPC stubs from JobService - - -* **Parameters** - - **channel** (*Channel*) – AsyncIO gRPC channel used for authentication. See - [https://grpc.github.io/grpc/python/grpc_asyncio.html](https://grpc.github.io/grpc/python/grpc_asyncio.html) - for more information. - - - -* **Returns** - - A job service client instance - - - -#### _async_ get_job_status(queue, job_set_id, job_id) -Get job status of a given job in a queue and job_set_id. - -Uses the GetJobStatus rpc to get a status of your job - - -* **Parameters** - - - * **queue** (*str*) – The name of the queue - - - * **job_set_id** (*str*) – The name of the job set (a grouping of jobs) - - - * **job_id** (*str*) – The id of the job - - - -* **Returns** - - A Job Service Request (State, Error) - - - -* **Return type** - - *JobServiceResponse* - - - -#### _async_ health() -Health Check for GRPC Request - - -* **Return type** - - *HealthCheckResponse* - - - -### armada.operators.jobservice_asyncio.get_retryable_job_service_asyncio_client(target, credentials, compression) -Get a JobServiceAsyncIOClient that has retry configured - - -* **Parameters** - - - * **target** (*str*) – grpc channel target - - - * **credentials** (*ChannelCredentials** | **None*) – grpc channel credentials (if needed) - - - * **compresion** – grpc channel compression - - - * **compression** (*Compression** | **None*) – - - - -* **Returns** - - A job service asyncio client instance - - - -* **Return type** - - *JobServiceAsyncIOClient* - - -## armada.operators.utils module - - -### _class_ armada.operators.utils.JobState(value) -Bases: `Enum` - -An enumeration. - - -#### CANCELLED(_ = _ ) - -#### CONNECTION_ERR(_ = _ ) - -#### DUPLICATE_FOUND(_ = _ ) - -#### FAILED(_ = _ ) - -#### JOB_ID_NOT_FOUND(_ = _ ) - -#### RUNNING(_ = _ ) - -#### SUBMITTED(_ = _ ) - -#### SUCCEEDED(_ = _ ) - -### armada.operators.utils.airflow_error(job_state, name, job_id) -Throw an error on a terminal event if job errored out - - -* **Parameters** - - - * **job_state** (*JobState*) – A JobState enum class - - - * **name** (*str*) – The name of your armada job - - - * **job_id** (*str*) – The job id that armada assigns to it - - - -* **Returns** - - No Return or an AirflowFailException. - - -AirflowFailException tells Airflow Schedule to not reschedule the task - - -### armada.operators.utils.annotate_job_request_items(context, job_request_items) -Annotates the inbound job request items with Airflow context elements - - -* **Parameters** - - - * **context** – The airflow context. - - - * **job_request_items** (*List**[**JobSubmitRequestItem**]*) – The job request items to be sent to armada - - - -* **Returns** - - annotated job request items for armada - - - -* **Return type** - - *List*[*JobSubmitRequestItem*] - - - -### armada.operators.utils.default_job_status_callable(armada_queue, job_set_id, job_id, job_service_client) - -* **Parameters** - - - * **armada_queue** (*str*) – - - - * **job_set_id** (*str*) – - - - * **job_id** (*str*) – - - - * **job_service_client** (*JobServiceClient*) – - - - -* **Return type** - - *JobServiceResponse* - - - -### armada.operators.utils.get_annotation_key_prefix() -Provides the annotation key prefix, -which can be specified in env var ANNOTATION_KEY_PREFIX. -A default is provided if the env var is not defined - - -* **Returns** - - string annotation key prefix - - - -* **Return type** - - str - - - -### armada.operators.utils.job_state_from_pb(state) - -* **Return type** - - *JobState* - - - -### armada.operators.utils.search_for_job_complete(armada_queue, job_set_id, airflow_task_name, job_id, poll_interval=30, job_service_client=None, job_status_callable=, time_out_for_failure=7200) -Poll JobService cache until you get a terminated event. - -A terminated event is SUCCEEDED, FAILED or CANCELLED - - -* **Parameters** - - - * **armada_queue** (*str*) – The queue for armada - - - * **job_set_id** (*str*) – Your job_set_id - - - * **airflow_task_name** (*str*) – The name of your armada job - - - * **poll_interval** (*int*) – Polling interval for jobservice to get status. - - - * **job_id** (*str*) – The name of the job id that armada assigns to it - - - * **job_service_client** (*JobServiceClient** | **None*) – A JobServiceClient that is used for polling. - It is optional only for testing - - - * **job_status_callable** – A callable object for test injection. - - - * **time_out_for_failure** (*int*) – The amount of time a job - can be in job_id_not_found - before we decide it was a invalid job - - - -* **Returns** - - A tuple of JobStateEnum, message - - - -* **Return type** - - *Tuple*[*JobState*, str] - - - -### _async_ armada.operators.utils.search_for_job_complete_async(armada_queue, job_set_id, airflow_task_name, job_id, job_service_client, log, poll_interval, time_out_for_failure=7200) -Poll JobService cache asyncronously until you get a terminated event. - -A terminated event is SUCCEEDED, FAILED or CANCELLED - - -* **Parameters** - - - * **armada_queue** (*str*) – The queue for armada - - - * **job_set_id** (*str*) – Your job_set_id - - - * **airflow_task_name** (*str*) – The name of your armada job - - - * **job_id** (*str*) – The name of the job id that armada assigns to it - - - * **job_service_client** (*JobServiceAsyncIOClient*) – A JobServiceClient that is used for polling. - It is optional only for testing - - - * **poll_interval** (*int*) – How often to poll jobservice to get status. - - - * **time_out_for_failure** (*int*) – The amount of time a job - can be in job_id_not_found - before we decide it was a invalid job - - - -* **Returns** - - A tuple of JobStateEnum, message - - - -* **Return type** - - *Tuple*[*JobState*, str] diff --git a/docs/scheduler.md b/docs/scheduler.md new file mode 100644 index 00000000000..1811b1afd3c --- /dev/null +++ b/docs/scheduler.md @@ -0,0 +1,280 @@ +# Scheduler + +Here, we give an overview of the algorithm used by Armada to determine which jobs to schedule and preempt. This algorithm runs within the scheduling subsystem of the Armada control plane. Note that Armada does not rely on kube-scheduler (or other in-cluster schedulers) for scheduling and preemption. + +Scheduling requires balancing throughput, timeliness, and fairness. The Armada scheduler operates according to the following principles: + +- Throughput: Maximise resource utilisation by scheduling jobs onto available nodes whenever possible. +- Timeliness: Schedule more urgent jobs before less urgent jobs. Always preempt less urgent jobs to make room for more urgent jobs, but never the opposite. +- Fairness: Schedule jobs from queues allocated a smaller fraction of their fair share of resources before those allocated a larger fraction. Always preempt jobs from queues with a larger fraction of their fair share if doing so helps schedule jobs from queues with a smaller fraction. + +The Armada scheduler also satisfies (with some exceptions as noted throughout the documentation) the following properties: + +- Sharing incentive: Each user should be better off sharing the cluster than exclusively using their own partition of the cluster. +- Strategy-proofness: Users should not benefit from lying about their resource requirements. +- Envy-freeness: A user should not prefer the allocation of another. This property embodies the notion of fairness. +- Pareto efficiency: It should not be possible to increase the allocation of a user without decreasing the allocation of another. +- Preemption stability: Whenever a job is preempted and subsequently re-submitted before any other jobs have completed, the re-submitted job should not trigger further preemptions. + +Next, we cover some specific features of the scheduler. + +## Jobs and queues + +Each Armada job represents a computational task to be carried out and consists of: + +- A Kubernetes podspec representing the workload to be run. +- Auxiliary Kubernetes objects, e.g., services and ingresses. + +All objects that make up the job are created at job startup and are deleted when the job terminates. + +Jobs are annotated with the following Armada-specific metadata: + +- Queue: Each job belongs to a queue, which is the basis for fair share in Armada. +- Job set: A per-queue logical grouping of jobs meant to make it easier to manage large number of jobs. Jobs within the same job set can be managed as a unit. +- Priority: Controls the order in which jobs appear in the queue. +- Armada priority class, which itself contains a priority that controls preemption. + +Jobs are totally ordered within each queue by: + +1. Priority class priority. +2. Job priority. +3. Time submitted. + +Armada attempts to schedule one job at a time. When scheduling from a particular queue, Armada chooses the next job to schedule according to this order. + +## Resource usage and fairness + +Armada divides resources fairly between queues. In particular, Armada will schedule and preempt jobs to balance the vector + +``` +c_1/w_1, c_2/w_2, ..., c_n/w_n +``` + +where `c_i` and `w_i`, is the cost and weight associated with the `i`-th active queue, respectively, and `n` is the number of active queues. Only active queues, i.e., queues with jobs either queued or running, are considered when computing fairness. Hence, the fair share of a queue may change over time as other queues become active or inactive. + +The cost of each queue is computed from the resource requests of running jobs originating from the queue. In particular, Armada relies on dominant resource fairness to compute cost, such that + +``` +c_i = max(cpu_i/cpu_total, memory_i/memory_total, ...) +``` + +where `cpu_i` is the total CPU allocated to jobs from the `i`-th queue and so on, and the totals is the total amount of resources available for scheduling. This fairness model has several desirable proprties; see + +- [Dominant Resource Fairness: Fair Allocation of Multiple Resource Types](https://amplab.cs.berkeley.edu/wp-content/uploads/2011/06/Dominant-Resource-Fairness-Fair-Allocation-of-Multiple-Resource-Types.pdf) + +The weight of each queue is the reciprocal of its priority factor, which is configured on a per-queue basis. + +## Priority classes and preemption + +Armada supports two forms of preemption: + +1. Urgency-based preemption, i.e., making room for a job by preempting less urgent jobs. This form of preemption works in the same way as the normal Kubernetes preemption. +2. Preemption to fair share, i.e., preempting jobs belonging to users with more than their fair share of resources, such that those resources can be re-allocated to improve fairness. + +Both forms of preemption are based on Armada priority classes (PCs). These are similar to but distinct from Kubernetes PCs. All Armada jobs have an Armada PC associated with them. Each Armada PC is represented by the following fields: + +- name: A unique name associated with each Armada PC. +- priority: An integer encoding the urgency of jobs with this PC. Jobs with a PC with higher priority can always preempt jobs with a PC with lower priority. +- isFairSharePreemptible: A boolean indicating whether jobs with this PC can be preempted via preemption to fair share. Note that all jobs can be preempted via urgency-based preemption, unless there is no other job with a higher PC priority. + +Job priority classes are set by setting the `priorityClassName` field of the podspec embedded in the job. Jobs with no PC are automatically assigned one. We describe both forms of preemption in more detail below. + +## Gang scheduling + +Armada supports gang scheduling of jobs, i.e., all-or-nothing scheduling of a set of jobs. Gang scheduling is controlled by the following annotations set on individual jobs submitted to Armada: + +* `armadaproject.io/gangId`: Jobs with the same value for this annotation are considered part of the same gang. The value of this annotation should not be re-used. For example, a unique UUID generated for each gang is a good choice. For jobs that do not set this annotation, a randomly generated value is filled in, i.e., single jobs are considered gangs of cardinality one. +* `armadaproject.io/gangCardinality`: Total number of jobs in the gang. The Armada scheduler relies on this value to know when it has collected all jobs that make up the gang. It is the responsibility of the submitter to ensure this value is set correctly for gangs. +* `armadaproject.io/gangMinimumCardinality`: Minimum number of jobs in the gang that must be scheduled. If the number of jobs scheduled is less than the cardinality of the gang, the remaining unscheduled jobs are failed by the scheduler. The value of this annotation defaults to that of `armadaproject.io/gangCardinality`. +* `armadaproject.io/gangNodeUniformityLabel`: Constrains the jobs that make up a gang to be scheduled across a uniform set of nodes. Specifically, if set, all gang jobs are scheduled onto nodes for which the value of the provided label is equal. This can be used to ensure, e.g., that all gang jobs are scheduled onto the same cluster or rack. + +## Node selection and bin-packing + +Armada schedules one job at a time. This process consists of: + +1. Selecting a job to schedule. +2. Assigning the selected job to a node. + +Here, we explain the second step. Armada adheres to the following principles in the order listed: + +1. Avoid preempting running jobs if possible. +2. If necessary, preempt according to the following principles: + 1. Preempt jobs of as low PC priority as possible. + 2. For jobs of equal PC priority, preempt jobs from queues allocated the largest fraction of fair share possible. +3. Assign to a node with the smallest amount of resources possible. + +These principles result in Armada doing the best it can to avoid preemptions, or at least preempt fairly, and then greedily bin-packing jobs. + +## Graceful termination + +Armada will sometimes kill pods, e.g., because the pod is being preempted or because the corresponding job has been cancelled. Pods can optionally specify a graceful termination period, i.e., an amount of time that the pod is given to exit gracefully before being terminated. Graceful termination works as follows: + +1. The pod is sent a SIGTERM. Kubernetes stores the time at which the signal was sent. +2. After the amount of time specified in the graceful termination period field of the pod has elapsed, the job is sent a SIGKILL if still running. + +Armada implements graceful termination periods as follows: + +* Jobs submitted to Armada with no graceful termination period set, are assigned a 1s period. +* Armada validates that all submitted jobs have a termination period between 1s and a configurable maximum. It is important that the minimum is positive, since a 0s grace period is interpreted by Kubernetes as a "force delete", which may result in inconsistencies due to pods being deleted from etcd before they have stopped running. + +Jobs that set a termination period of 0s will be updated in-place at submission to have a 1s termination period. This is to ensure that current workflows, some of which unnecessarily set a 0s termination period, are not disrupted. + +Jobs that explicitly set a termination period higher than the limit will be rejected at submission. Jobs that set a termination period greater than 0s but less than 1s will also be rejected at submission. + +## Job deadlines + +All Armada jobs can be assigned default job deadlines, i.e., jobs have a default maximum runtime after which the job will be killed. Default deadlines are only added to jobs that do not already specify one. To manually specify a deadline, set the `ActiveDeadlineSeconds` field of the podspec embedded in the job. + +## Scheduler: implementation + +Each scheduling cycle can be seen as a pure function that takes the current state as its input and returns a new desired state. We could express this in code as the following function: + +```go +// Schedule determines which queued jobs to schedule and which running jobs to preempt. +func Schedule( + // Map from queues to the jobs in that queue. + queues map[Queue][]Job + // Nodes over which to schedule jobs. + nodes []Node + // Map from jobs to nodes. Queued jobs are not assigned to any node. + nodeByJob map[Job]Node +) map[Job]Node { + // Scheduling logic + ... + + // Return an updated mapping from jobs to nodes. + // - nodeByJob[job] == nil && updatedNodeByJob != nil: job was scheduled. + // - nodeByJob[job] != nil && updatedNodeByJob == nil: job was preempted. + // - nodeByJob[job] == updatedNodeByJob: no change for job. + return updatedNodeByJob +} +``` + +Each scheduling cycle thus produces a mapping from jobs to nodes that is the desired state of the system. It is the responsibility of the rest of the system to reconcile any differences between the actual and desired state. Note that in actuality the scheduler does maintain state between iterations for efficiency and for certain features (e.g., rate-limiting). + +Each scheduling cycle in turn consists of the following steps: + +1. Eviction +2. Queue ordering +3. Job scheduling: + 1. Job selection + 2. Node selection + +Which we express in pseudocode as (a more detailed version of the above snippet): + +```go +func Schedule(queues map[Queue][]Job, nodes []Node, nodeByJob map[Job]Node) map[Job]Node { + queues, nodeByJob := evict(queues, nodeByJob) + queues = sortQueues(queues) + for { + gang := selectNextQueuedGangToSchedule(queues) + if gang == nil { + // No more jobs to schedule. + break + } + nodeByJobForGang := selectNodesForGang(gang, nodes) + copy(nodeByJob, nodeByJobForGang) + } + return nodeByJob +} + +func evict(queues map[Queue][]Job, nodeByJob map[Job]Node) (map[Queue][]Job, map[Job]Node) { + updatedNodeByJob := make(map[Job]Node) + for job, node := range nodeByJob { + if isFairSharePreemptible(job) { + queue := queueFromJob(job) + queues[queue] = append(queues[queue], job) + } else { + updatedNodeByJob[job] = node + } + } + return updatedNodeByJob +} + +func sortQueues(queues map[Queue][]Job) map[Queue][]Job { + updatedQueues := clone(queues) + for queue, jobs := range queues { + updatedQueues[queue] = sort(jobs, sortFunc) + } + return updatedQueues +} + +func selectNextQueuedGangToSchedule(queues map[Queue][]Job) Gang { + var Gang selectedGang + var Queue selectedQueue + for queue, jobs := range queues { + // Consider jobs in the order they appear in the queue. + gang := firstGangFromJobs(jobs) + // Select the queue with smallest fraction of its fair share. + if fractionOfFairShare(queue, gang) < fractionOfFairShare(selectedQueue, selectedGang) { + selectedJob = job + selectedQueue = queue + } + } + // Remove the selected gang from its queue. + popFirstGang(queues[selectedQueue]) + return gang +} + +func selectNodesForGang(gang Gang, nodes []Node) map[Job]Node { + nodes = clone(nodes) + nodeByJob := make(map[Job]Node) + for _, job := range jobsFromGang(gang) { + node = selectNodeForJob(job, nodes) + nodeByJob[job] = node + } + return nodeByJob +} + +func selectNodeForJob(job Job, nodes []Node) Node { + var Node selectedNode + for _, node := range nodes { + if jobFitsOnNode(job, node) { + if fitScore(job, node) > fitScore(job, selectedNode) { + selectedNode = node + } + } + } + return selectedNode +} +``` + +Next, we explain eviction and job ordering in more detail. + +### Eviction + +Eviction is part of the preemption strategy used by Armada. It consists of, at the start of each cycle, moving all currently running preemptible jobs from the nodes to which they are assigned back to their respective queues. As a result, those jobs appear to Armada as if they had never been scheduled and are still queued. We refer to such jobs moved back to the queue as *evicted*. + +Whether a job is evicted or not and whether it is assigned to a node in the job scheduling stage or not determines which jobs are scheduled, preempted, or neither. Specifically: + +- Not evicted and assigned a node: Queued jobs that should be scheduled. +- Not evicted and not assigned a node: Queued jobs that remain queued. +- Evicted and assigned a node: Running jobs that should remain running. +- Evicted and not assigned a node: Running jobs that should be preempted. + +Eviction and (re-)scheduling thus provides a unified mechanism for scheduling and preemption. This approach comes with several benefits: + +- No need to maintain separate scheduling and preemption algorithms. Improvements to scheduling also improves preemption. +- We are guaranteed there are no preemptions that do not help scheduling new jobs without needing to check specifically that is the case. +- Preemption and scheduling is consistent in the sense that a job that was preempted will if re-submitted not be scheduled. +- Many-to-many preemption, i.e., one preemption may facilitate scheduling several other jobs. + +There are two caveats for which some care needs to be taken: + +1. Evicted jobs may only be re-scheduled onto the node from which they were evicted. +2. We should avoid preventing re-scheduling evicted jobs when scheduling new jobs. + +To address these issues, Armada maintains a record of which node each job was evicted from that is used when assigning jobs to nodes. + + +### Job scheduling order + +Armada schedules one job at a time, and choosing the order in which jobs are attempted to be scheduled is the mechanism by which Armada ensures resources are divided fairly between queues. In particular, jobs within each queue are totally ordered, but there is no inherent ordering between jobs associated with different queues; the scheduler is responsible for establishing such a global ordering. To divide resources fairly, Armada establishes such a global ordering as follows: + +1. Get the topmost gang (which may be a single job) in each queue. +2. For each queue, compute what fraction of its fair share the queue would have if the topmost gang were to be scheduled. +3. Select for scheduling the next gang from the queue for which this computation resulted in the smallest fraction of fair share. + +Including the topmost gang in the computation in step 2. is important since it may request thousands of nodes. + +This approach is sometimes referred to as progressive filling and is known to achieve max-min fairness, i.e., for an allocation computed in this way, an attempt to increase the allocation of one queue necessarily results in decreasing the allocation of some other queue with equal or smaller fraction of its fair share, under certain conditions, e.g., when the increments are sufficiently small. diff --git a/docs/system_overview.md b/docs/system_overview.md new file mode 100644 index 00000000000..6b5b7c5a37c --- /dev/null +++ b/docs/system_overview.md @@ -0,0 +1,78 @@ +# System overview + +At a high level, Armada is a multi-Kubernetes cluster batch job scheduler. Each Armada job represents a computational task to be carried out over a finite amount of time and consists of + +- a Kubernetes pod, +- zero or more auxiliary Kubernetes objects (e.g., services and ingresses), and +- metadata specific to Armada (e.g., the name of the queue to which job belongs). + +Jobs are submitted to Armada and Armada is responsible for determining when and where each job should be run. + +An Armada deployments consists of: +- One or more Kubernetes clusters containing nodes to be used for running jobs. Such clusters are referred to as worker clusters. +- The Armada control plane components responsible for job submission and scheduling. Jobs are submitted to the control plane and are automatically transferred to worker clusters once scheduled. +- The Armada executors responsible for communication between the Armada control plane and the [Kubernetes control plane](https://kubernetes.io/docs/concepts/overview/kubernetes-api/). There is one executor per worker cluster. + +The Armada control plane components may run anywhere from which they can be reached by the executors, e.g., in the same cluster as an executor, on a different Kubernetes cluster, or on a node not managed by Kubernetes. Each executor normally runs within the worker cluster it is responsible for. + +We show an overview of an Armada deployment with three worker clusters below. Clients here refers to systems submitting jobs to Armada. + +``` + Worker clusters + + ┌──────────────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +┌──────────┐ │ │ │┼────────┼│ │┼────────┼│ │┼────────┼│ +│ Clients │ ─────► │ Armada control plane │ ─────► ││Executor││ ││Executor││ ││Executor││ +│ │ │ │ │┼────────┼│ │┼────────┼│ │┼────────┼│ +└──────────┘ │ │ │┼───▼────┼│ │┼───▼────┼│ │┼───▼────┼│ + │ │ ││kube-api││ ││kube-api││ ││kube-api││ + │ │ │┼────────┼│ │┼────────┼│ │┼────────┼│ + └──────────────────────┘ └──────────┘ └──────────┘ └──────────┘ +``` + +The arrows in the above diagram show the path jobs take though the system. Specifically, each job passes through the following stages: + +1. The job is submitted to Armada, where it is stored in one of several queues, e.g., corresponding to different users. At this point, the job is stored in the Armada control plane and does not exist in any Kubernetes cluster. The job is in the *queued* state. +2. The Armada scheduler eventually determines that the job should be run and marks the job with the Kubernetes cluster and node it should be run on. The job is in the *leased* state. +3. The Kubernetes resources that make up the job are created in the cluster it was assigned to via kube-api calls. The pod contained in the job is bound to the node it was assigned to. The job is in the "pending" state. +4. Container images are pulled, volumes and secrets mounted, and init containers run, after which the main containers of the pod start running. The job is in the *running* state. +5. The job terminates once all containers in the pod have stopped running. Depending on the exit codes of the containers, the job transitions to either the *succeeded* or *failed* state. + +All Kubernetes resources associated with the job are deleted once the job terminates. For more information on jobs, see the scheduler documentation. + +## The Armada control plane + +The Armada control plane is the set of components responsible for job submission and scheduling. It consists of the following subsystems: + +- Job submission and control. Exposes an API through which clients can submit, re-prioritise, and cancel jobs. +- Job state querying. Allows clients to query the current state of a job. +- Job state querying (streaming). Allows clients to subscribe to a stream of updates to a set of jobs. +- Scheduler. Responsible for assigning jobs to clusters and nodes. +- Lookout. Web UI showing the current state of jobs. + +The services that make up these subsystems communicate according to event-sourcing principles, i.e., message routing is handled by a log-based message broker shared by all services. In particular, Armada relies on Apache Pulsar for message routing. Each subsystem then operates in cycles consisting of: + +1. Receive messages from Pulsar. +2. Do either or both of: + - Update the internal state of the subsystem. + - Publish messages to Pulsar. + +Those published messages may then be received by other subsystems, causing them to publish other messages, and so on. Note that the log is the source of truth; each subsystem can recover its internal state by replaying messages from the log. We include a diagram showing this process below with two subsystems. + +``` +┌────────────────────────────────────────────────────────────────────────────────────┐ +│ │ +│ ┌───────────────────────────────────────┐ ┌───────────────────────────┐ │ +│ │ Pulsar │ │ Subsystem 1 │ │ +└► │ ┌───────────────────────────────────┐ │ ─────► │ │ ──┘ + │ │ Multiple topics/topic partitions. │ │ └───────────────────────────┘ + │ │ │ │ + │ │ │ │ ┌───────────────────────────┐ +┌► │ └───────────────────────────────────┘ │ ─────► │ Subsystem 2 │ ──┐ +│ │ │ │ │ │ +│ └───────────────────────────────────────┘ └───────────────────────────┘ │ +│ │ +└────────────────────────────────────────────────────────────────────────────────────┘ +``` + +See [a note on consistency](./consistency.md) for some more detail on how Armada ensures consistency between components.