@KeithResar
STATEFUL APPLICATIONS USING
KUBERNETES _OPERATORS_
Slide 2
Slide 2 text
No content
Slide 3
Slide 3 text
@KeithResar
Operators are _application aware Kubernetes objects._
Active throughout the application’s lifecycle,
they manage instantiation, ongoing state, and
destruction.
Slide 4
Slide 4 text
No content
Slide 5
Slide 5 text
@KeithResar
FROM VISION TO _PROBLEM_
Slide 6
Slide 6 text
@KeithResar
_problem:_
_turnkey management of stateless application_
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
@KeithResar
_problem:_
_turnkey management of stateless application_
_solution:_
_kubernetes (we just saw this)_
_S2I, Helm_
Slide 9
Slide 9 text
@KeithResar
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
@KeithResar
_problem:_
_I’m a vendor or I create stateful apps,
_kubernetes doesn’t know anything about me_
Slide 12
Slide 12 text
@KeithResar
etcd is a _distributed key value store_
that provides a reliable way to store
data across a cluster of machines.
Stand-in
for
your app
Slide 13
Slide 13 text
@KeithResar
Create and Destroy • Resize • Failover
Rolling upgrade • Backup and Restore
Stand-in
for
your app
Slide 14
Slide 14 text
@KeithResar
_problem:_
_I’m a vendor or I create stateful apps,
_kubernetes doesn’t know anything about me_
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
No content
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
@KeithResar
---
apiVersion: v1
kind: Service
metadata:
name: simpleapp
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
deploymentconfig: simpleapp
sessionAffinity: None
type: ClusterIP
defining a
_service_
resource
service resources
are a built in object
type.
@KeithResar
AS
DS
_Ansible operator_
watch reconcile
ansible-runner
_________
_______________________
______
_____________________________
Ansible playbook or role
This is the only component
you need to worry about!
Slide 30
Slide 30 text
@KeithResar
kubernetes layer
application layer
Slide 31
Slide 31 text
@KeithResar
kubernetes layer
ETCD
pod
ETCD
pod
Phase I
Manage native K8s objects
application layer
Slide 32
Slide 32 text
@KeithResar
application layer
kubernetes layer
ETCD
pod
ETCD
pod
Phase II
Manage application objects
01001
etcd data
01001
etcd data
Slide 33
Slide 33 text
No content
Slide 34
Slide 34 text
@KeithResar
A GIFT OF THE _DEMO_ TO YOU
Slide 35
Slide 35 text
@KeithResar
Demo Operator for data
service _SimpleDB,_ that
manages instantiation and
version upgrades.
RBAC
CRD
CR
DC
Slide 36
Slide 36 text
@KeithResar
Create service account, role, and
role binding. Our operator uses
these to monitor events and
reconcile desired and actual
states.
RBAC
CRD
CR
DC
@KeithResar
RBAC
CRD
CR
DC
# Dockerfile
FROM quay.io/water-hole/ansible-operator
USER root
RUN yum -y install MySQL-python && \
pip --no-cache-dir install dnspython
COPY roles/ ${HOME}/roles/
COPY playbook.yaml ${HOME}/playbook.yaml
COPY watches.yaml ${HOME}/watches.yaml
Slide 44
Slide 44 text
@KeithResar
RBAC
CRD
CR
DC
# roles/SimpleDB/tasks/main.yml
---
Slide 45
Slide 45 text
@KeithResar
RBAC
CRD
CR
DC
# roles/SimpleDB/tasks/main.yml
---
# … (skip setting some variables)
Slide 46
Slide 46 text
@KeithResar
RBAC
CRD
CR
DC
# roles/SimpleDB/tasks/main.yml
---
# … (skip setting some variables)
# If no service defined then run our install playbook
# This is idempotent so we could run it regardless
- include_tasks: mariadb_install.yml
when: mysql_ip == "NXDOMAIN"
Slide 47
Slide 47 text
@KeithResar
RBAC
CRD
CR
DC
# roles/SimpleDB/tasks/main.yml
---
# … (skip setting some variables)
# If no service defined then run our install playbook
# This is idempotent so we could run it regardless
- include_tasks: mariadb_install.yml
when: mysql_ip == "NXDOMAIN"
# Run our upgrade path if we need to change versions
- include_tasks: mariadb_upgrade.yml
when: version != version_query.json.version
@KeithResar
Instantiate our custom resource
object. The operator is listening
for any SimpleDB events in our
namespace.
RBAC
CRD
CR
DC
Slide 50
Slide 50 text
@KeithResar
RBAC
CRD
CR
DC
---
apiVersion: example.com/v1alpha1
kind: SimpleDB
metadata:
name: simpledb
spec:
# Add fields here
version: 1
Slide 51
Slide 51 text
@KeithResar
AS
DS
_Ansible operator_
watch reconcile
ansible-runner
_________
_______________________
______
_____________________________
Ansible playbook or role
This is the only component
you need to worry about!
Slide 52
Slide 52 text
No content
Slide 53
Slide 53 text
@KeithResar
GO FARTHER WITH THESE _RESOURCES_
● OperatorHub
● Introducing the operator framework
● water-hole’s ansible-operator repo
● ansible-operator-demo repo
● Awesome operators in the wild