The Atlas Kubernetes Operator
Manage your database with Kubernetes using Atlas.
⚠️ This project is still missing some key safety features that will be added in the near future,
until then please treat this project as a work in progress and not ready for use in production.
What is Atlas?
Atlas is a popular open-source schema management tool.
It is designed to help software engineers, DBAs and DevOps practitioners manage their database schemas.
Users can use the Atlas DDL (data-definition language)
or plain SQL to describe the desired database
schema and use the command-line tool to plan and apply the migrations to their systems.
What is the Atlas Kubernetes Operator?
Like many other stateful resources, reconciling the desired state of a database with its actual state
can be a complex task that requires a lot of domain knowledge. Kubernetes Operators
were introduced to the Kubernetes ecosystem to help users manage complex stateful resources by codifying
this domain knowledge into a Kubernetes controller.
The Atlas Kubernetes Operator is a Kubernetes controller that uses Atlas to manage
the schema of your database. The Atlas Kubernetes Operator allows you to define the desired schema of your
and apply it to your database using the Kubernetes API.
Features
- Support for declarative migrations
for schemas defined in Plain SQL or
Atlas HCL.
- Detect risky changes such as accidentally dropping columns or tables and define a policy to handle them. (Coming Soon)
- Support for versioned migrations. (Coming Soon)
- Supported databases: MySQL, MariaDB, PostgresSQL, SQLite, TiDB, CockroachDB
Declarative schema migrations
The Atlas Kubernetes Operator supports declarative migrations.
In declarative migrations, the desired state of the database is defined by the user and the operator is responsible
for reconciling the desired state with the actual state of the database (planning and executing CREATE
, ALTER
and DROP
statements).
Installation
The Atlas Kubernetes Operator is available as a Helm chart. To install the chart with the release name atlas-operator
:
helm install atlas-operator oci://ghcr.io/ariga/charts/atlas-operator
Getting started
In this example, we will create a MySQL database and apply a schema to it. After installing the
operator, follow these steps to get started:
- Create a MySQL database and a secret with an Atlas URL
to the database:
kubectl apply -f https://raw.githubusercontent.com/ariga/atlas-operator/master/config/integration/mysql.yaml
Result:
deployment.apps/mysql created
service/mysql created
secret/mysql-credentials created
- Create a file named
schema.yaml
containing an AtlasSchema
resource to define the desired schema:
apiVersion: db.atlasgo.io/v1alpha1
kind: AtlasSchema
metadata:
name: atlasschema-mysql
spec:
urlFrom:
secretKeyRef:
key: url
name: mysql-credentials
schema:
sql: |
create table users (
id int not null auto_increment,
name varchar(255) not null,
email varchar(255) unique not null,
short_bio varchar(255) not null,
primary key (id)
);
- Apply the schema:
kubectl apply -f schema.yaml
Result:
atlasschema.db.atlasgo.io/atlasschema-mysql created
- Check that our table was created:
kubectl exec -it $(kubectl get pods -l app=mysql -o jsonpath='{.items[0].metadata.name}') -- mysql -uroot -ppass -e "describe myapp.users"
Result:
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| short_bio | varchar(255) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
Hooray! We applied our desired schema to our target database.
API Reference
Example resource:
apiVersion: db.atlasgo.io/v1alpha1
kind: AtlasSchema
metadata:
name: atlasschema-mysql
spec:
urlFrom:
secretKeyRef:
key: url
name: mysql-credentials
policy:
# Fail if the diff planned by Atlas contains destructive changes.
lint:
destructive:
error: true
diff:
# Omit any DROP INDEX statements from the diff planned by Atlas.
skip:
drop_index: true
schema:
sql: |
create table users (
id int not null auto_increment,
name varchar(255) not null,
primary key (id)
);
exclude:
- ignore_me
This resource describes the desired schema of a MySQL database.
Support
Need help? File issues on the Atlas Issue Tracker or join
our Discord server.
Development
Start MiniKube
minikube start
Install CRDs
make install
Start Skaffold
skaffold dev
License
The Atlas Kubernetes Operator is licensed under the Apache License 2.0.