SlideShare una empresa de Scribd logo
1 de 48
Descargar para leer sin conexión
meetup 16/7/2018
Agenda
● Redis Labs intro and architecture
● Double orchestration
● Our kubernetes solution
● The way to operators
● Operators intro
● Operators development
● Demo
Redis Labs
Intro And Arch
3
Introduction to Redis Enterprise
Open source. The leading in-memory database platform,
supporting any high performance operational, analytics or
hybrid use case.
The open source home and commercial provider of Redis
Enterprise (Redise
) technology, platform, products & services.
We Are Hiring !
Redise
- Open Source & Proprietary Technology
Redise
Node
Cluster Manager
Redise
Cluster
• Shared nothing, symmetrical cluster
architecture
• Fully compatible with open source
commands & data structures
Enterprise Layer
Open Source Layer
REST API
Zero latency proxy
• Faster time to market with continuity between
dev/test and production environments that use
Redise
Pack
• Highly available, easier to scale, simpler to manage
Redis technology, integrated with orchestration tools
such as PCF, Kubernetes, Mesosphere...
• Node in a container approach — All Redise
services
inside each container.
Run Redise
clusters on single or multiple nodes
Redise
in Containers
Node in a Pod Approach
Node 1
Vs
Node 2 Node 3 Node 1 Node 2 Node 3
One pod, multiple services per nodeMultiple pods, multiple services per node
Double Orchestration
For fun and profit!
10
What’s Double Orchestration ?
Kubernetes PKS
External
Redis Cluster
Orchestration
Node 1
Redis Shards
Node 2 Node N
Internal
Why like this?
• Resource management - Orchestration platforms are
designed to be generic.
• Again - Performance is king.
• Last but not least, it allows us to maintain a common
architecture - regardless of running environment, be it bare
metal, VM, K8s, Pivotal Cloud Foundry.
(.… Surprisingly enough, not everybody in the world uses containers…)
Who Does What
• Node auto-healing
• Node scaling
• Failover & scaling
• Configuration & monitoring
• Service discovery
• Upgrade
+
And specifically on Kubernetes
Node in a
Pod
Statefulset
Persistent
Volumes
Custom
Controller
Services
Manager
Our Kubernetes Solution
StatefulSet
Our cluster nodes are deployed as part of a statefulset
Affinity
Allows us to control the Redislabs cluster nodes topology
Redislabs Service Manager
Create/Update/Delete service entries for each Redis DB hosted on the cluster
RBAC
The Service Manager must have permissions to access the namespace to create services
Ingress
Allow access to Redis DBs from outside of the k8s cluster
17
Redis Labs on Kubernetes - Building Blocks
StatefulSet
• Introduced in 1.5, GAed in 1.9
• Statefulset Pod consistency
– Pod naming
– Scale-out/Scale-in
– Pod Upgrade
• Persistent Disks
– Same PVC will be used when Pod is (re)scheduled
• All Pods are uniform
• Recovery from error state
pod-0 pod-1 pod-2
PV PV PV
Pod features
• Anti-affinity
– Allows us to control where the pods are being scheduled
• Readiness Probes
– Allows us to control the action flows to avoid data loss
• Pre-stop hook
– Drain the node and move resources to a different node
Why?
• Redis Enterprise is a multi-tenant Redis cluster
• Redis Enterprise Database can have 1 or more network endpoints
Problem
• Expose databases as a service instance
Solution
• Python based application that will: create, delete or update necessary database
service entries
• Based on an idempotent reconciliation loop
Redis Enterprise Services Manager
Kubernetes Cluster
Redis Labs Stateful Set
Worker Node
pod-0
Worker Node
pod-2
Worker Node
pod-1
Redis Enterprise Cluster
PV PV PV
K8s API
Services
Manager
Add/Edit/Delete
Database Services
App App App
The way to operators
• Provide a solid primary db solution for end-users
• Stateful application
– Some changes cannot be performed
– Some changes need to mutate the state before applying the actual change
– Data-loss is unacceptable
• Support multiple k8s deployments
– Cloud: GKE, AWS, etc
– Openshift
– PKS
– Vanilla
– On-prem hardware vendor
• Ingress
• Packaging
Redis Labs Challenges
• Started out with 9 static yaml files
– Hard to deploy
– Hard to maintain
– Hard to distribute
– No control over the deployment life-cycle
• Helm
– Customized deployment
– Easier to maintain
– Not fully supported everywhere
– No control over the deployment life-cycle
• Operator
– Simple deployment (2 yaml files)
– Full control over life-cycle
– K8s compatible
Our journey
.yaml
.yaml
Operator
26
Custom Resource
+
Custom Controller
=
Operator
27
kubectl
API Server
StatefulSet Controller
Watch(StatefulSet)
pod-0 pod-1 pod-2
my-sts
kubectl create -f my-sts.yaml
PV PV PV
28
kubectl
StatefulSet Controller
Watch(StatefulSet)
pod-0 pod-1 pod-2
my-sts
kubectl scale statefulset my-sts --replicas=5
pod-3 pod-4
API Server
29
kubectl
API Server
RedisCluster Controller
Watch(RedisCluster)
my-redis-cluster
kubectl create -f my-redis-cluster.yaml
Stateful
Set
UI
service
Service
Account
...
30
kubectl
API Server
RedisCluster Controller
Watch(RedisCluster)
my-redis-cluster
kubectl apply -f my-redis-cluster.yaml
Stateful
Set
UI
service
Service
Account
...
get-status()
example: downscale
● Life Cycle Control
○ Scale Up → Add new pod, Rebalance Data
○ Healing → Restore Backups, Auto Recovery
○ Backup
○ Validations (ex. even # pods)
● Configuration
○ Automate complex deployments (ex. Vault cluster and etcd cluster)
○ Reconfiguration
○ Agnostic configuration (ex. PVC by cloud provider)
● 3rd party resource (ex. prometheus)
● Cross distribution
● Easy to deploy
Why are operators useful?
32
Our Upgrade Flow
In a Redis Enterprise Cluster we need to:
1. Drain pod
2. Stop pod
3. Start new pod
● Downgrade - not supported (oss backward compatibility)
Our Upgrade Flow
With Yaml/Helm -
We used a life cycle preStop hook of a stateful set
1. Encoded inside the yaml - cumbersome
2. Cannot validate version
3. No error handling
With Operator -
1. Maintain logic in code not in a config file
2. Validations: not a downgrade, cluster is not already in an upgrade process
3. Error handling
4. Manage canary deployment
34
crd_cluster.yaml
35
operator.yaml
36
cr.yaml
37
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
matchExpressions:
key: app
operator: In
values:
{{ template "redisenterprise.name" . }}
key: release
operator: In
values:
{{ .Release.Name }}
key: redis.io/role
operator: In
values:
node
topologyKey: kubernetes.io/hostname
terminationGracePeriodSeconds: 31536000
serviceAccountName: {{ template "redisenterprise.serviceAccountName" . }}
{{ with .Values.imagePullSecrets }}
imagePullSecrets:
{{ toYaml . | indent 8 }}
{{ end }}
containers:
name: redis
image: {{ .Values.redisImage.repository }}:{{ .Values.redisImage.tag }}
imagePullPolicy: {{ .Values.redisImage.pullPolicy }}
readinessProbe:
exec:
command:
# check that the node is bootstrapped and that its connected and synced.
bash
c
curl silent localhost:8080/v1/bootstrap && /opt/redislabs/bin/rladmin status
nodes | grep node:$(cat /etc/opt/redislabs/node.id) | grep OK
initialDelaySeconds: 20
timeoutSeconds: 5
lifecycle:
preStop:
exec:
command:
# enslave the node, if this current node is master, change the master to
the first slave node.
bash
c
/opt/redislabs/bin/rladmin node $(cat /etc/opt/redislabs/node.id) enslave
&& ((/opt/redislabs/bin/rladmin status nodes | grep node:$(cat
/etc/opt/redislabs/node.id) | grep q master) && /opt/redislabs/bin/rlutil
change_master master=$(/opt/redislabs/bin/rladmin status nodes | grep slave |
head 1 | cut d " " f 1| cut d ":" f2) && sleep 10) || /bin/true
resources:
{{ toYaml .Values.redisResources | indent 10 }}
ports:
containerPort: 8001
containerPort: 8443
containerPort: 9443
securityContext:
capabilities:
add:
SYS_RESOURCE
{{ if .Values.persistentVolume.enabled }}
volumeMounts:
mountPath: "/opt/persistent"
name: redisstorage
{{ end }}
env:
name: K8S_ORCHASTRATED_DEPLOYMENT
value: "yes"
name: JOIN_HOSTNAME
value: {{ template "redisenterprise.fullname" . }}
{{ if .Values.persistentVolume.enabled }}
name: PERSISTANCE_PATH
value: /opt/persistent
{{ end }}
name: K8S_SERVICE_NAME
value: {{ template "redisenterprise.fullname" . }}
name: BOOTSTRAP_HANDLE_REDIRECTS
value: "enabled"
name: BOOTSTRAP_CLUSTER_FQDN
value: {{ template "redisenterprise.clusterDNS" . }}
name: BOOTSTRAP_DMC_THREADS
value: "10"
name: BOOTSTRAP_USERNAME
valueFrom:
secretKeyRef:
name: {{ template "redisenterprise.fullname" . }}
key: username
name: BOOTSTRAP_PASSWORD
valueFrom:
secretKeyRef:
name: {{ template "redisenterprise.fullname" . }}
key: password
name: BOOTSTRAP_LICENSE
valueFrom:
secretKeyRef:
name: {{ template "redisenterprise.fullname" . }}
key: license
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: {{ template "redisenterprise.statefulsetName" . }}
labels:
app: {{ template "redisenterprise.name" . }}
chart: {{ template "redisenterprise.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
{{ if .Values.persistentVolume.enabled }}
volumeClaimTemplates:
metadata:
name: redisstorage
labels:
app: {{ template "redisenterprise.name" . }}
chart: {{ template "redisenterprise.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: {{ .Values.persistentVolume.size | quote }}
{{ if .Values.persistentVolume.storageClass }}
{{ if (eq "" .Values.persistentVolume.storageClass) }}
storageClassName: ""
{{ else }}
storageClassName: "{{ .Values.persistentVolume.storageClass }}"
{{ end }}
{{ end }}
{{ end }}
serviceName: {{ template "redisenterprise.fullname" . }}
replicas: {{ .Values.replicas }}
updateStrategy:
type: "RollingUpdate"
template:
metadata:
labels:
redis.io/role: node
app: {{ template "redisenterprise.name" . }}
chart: {{ template "redisenterprise.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
{{ with .Values.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{ end }}
38
kubectl create -f cr.yaml
cr.yaml
"apiVersion": "app.redislabs.com/v1alpha1",
"items": [
{
"apiVersion": "app.redislabs.com/v1alpha1",
"kind": "RedisEnterpriseCluster",
"metadata": {
...
"creationTimestamp": "2018-07-12T15:47:31Z",
"generation": 0,
"name": " my-cluster-test",
"namespace": "redis"
},
"spec": {
"nodes": 3,
"serviceAccountName": "my-cluster-test",
"uiServiceType": "ClusterIP",
"username": " demo@redislabs.com "
...
curl http://127.0.0.1:8001/apis/app.redislabs.com/v1alpha1/
redisenterpriseclusters
Operator Development
39
• Started by CoreOS
– CoreOS pioneered by creating a few Operators (Prometheus & vault)
• Operator SDK:
minimize boilerplate and help developers to get started writing Operators
• The Basic API:
– Register Watchers on any Resource
– Create/Read/Update/Delete/Get on any resource
– Register schemas using k8s GO api
• Operator Lifecycle Manager
41
The Reconciliation/Control Loop
• Called for every update, delete or creation on the watched resources
– No way of knowing what type of event except Delete
• Called every X seconds to “resync” resources
• Our responsibility is to allow the user to use our resource as any other in k8s
– AKA idempotent API
• Every call to handle we get our watched resources, we need to determine what to
do exactly
42
Idempotent APIs
Desired State = Current Resource Current State
• Aggregation of deployed
resources
• Internal application
state
43
The Reconciliation/Control Loop - Challenges
• Determine which changes need to happen
• Determine if the change is valid
• K8s doesn’t provide a solid validation before applying changes to CR
– 1.9 has a beta feature for OpenAPI validations
• Long running processes as part of a resource change
Pending
Creation
Running
Invalid
Error
create
create
apply
create
apply
apply
Pending Creation - initial state where cluster is not deployed yet
Running - Cluster Deployed and is either running or starting to run and not ready yet
Invalid - Invalid configuration was requested. E.g. even #nodes. Until a valid configuration is applied the status will remain invalid
Error - Error when trying to deploy or update the Redis Enterprise Cluster
apply
Redis Cluster Status
applyapply
create = kubectl create -f cr.yaml
apply = kubectl apply -f cr.yaml
45
Development Challenges
• Deep understanding of how Kubernetes works (statefulsets, controller, APIs)
• Workflows - Idempotent APIs are challenging due to state mutation
• Double Orchestration - Adds a level of complexity compared to stateless
deployments
• Various SDK issues
https://www.telepresence.io
46
One Last Thing
Demo
We Are Hiring !

Más contenido relacionado

La actualidad más candente

April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...
April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...
April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...
Yahoo Developer Network
 

La actualidad más candente (20)

Container Orchestration @Docker Meetup Hamburg
Container Orchestration @Docker Meetup HamburgContainer Orchestration @Docker Meetup Hamburg
Container Orchestration @Docker Meetup Hamburg
 
Clocker - The Docker Cloud Maker
Clocker - The Docker Cloud MakerClocker - The Docker Cloud Maker
Clocker - The Docker Cloud Maker
 
Building Web Scale Apps with Docker and Mesos by Alex Rukletsov (Mesosphere)
Building Web Scale Apps with Docker and Mesos by Alex Rukletsov (Mesosphere)Building Web Scale Apps with Docker and Mesos by Alex Rukletsov (Mesosphere)
Building Web Scale Apps with Docker and Mesos by Alex Rukletsov (Mesosphere)
 
Tutorial ceph-2
Tutorial ceph-2Tutorial ceph-2
Tutorial ceph-2
 
Scaling Development Environments with Docker
Scaling Development Environments with DockerScaling Development Environments with Docker
Scaling Development Environments with Docker
 
Geode on Docker
Geode on DockerGeode on Docker
Geode on Docker
 
OSDC 2018 | Lifecycle of a resource. Codifying infrastructure with Terraform ...
OSDC 2018 | Lifecycle of a resource. Codifying infrastructure with Terraform ...OSDC 2018 | Lifecycle of a resource. Codifying infrastructure with Terraform ...
OSDC 2018 | Lifecycle of a resource. Codifying infrastructure with Terraform ...
 
Deploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with Senlin
Deploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with SenlinDeploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with Senlin
Deploy an Elastic, Resilient, Load-Balanced Cluster in 5 Minutes with Senlin
 
Openstack study-nova-02
Openstack study-nova-02Openstack study-nova-02
Openstack study-nova-02
 
Crossing the Streams Mesos <> Kubernetes
Crossing the Streams Mesos <> KubernetesCrossing the Streams Mesos <> Kubernetes
Crossing the Streams Mesos <> Kubernetes
 
[OpenInfra Days Korea 2018] Day 2 - E6 - OpenInfra monitoring with Prometheus
[OpenInfra Days Korea 2018] Day 2 - E6 - OpenInfra monitoring with Prometheus[OpenInfra Days Korea 2018] Day 2 - E6 - OpenInfra monitoring with Prometheus
[OpenInfra Days Korea 2018] Day 2 - E6 - OpenInfra monitoring with Prometheus
 
Docker 進階實務班
Docker 進階實務班Docker 進階實務班
Docker 進階實務班
 
Mesos and Kubernetes ecosystem overview
Mesos and Kubernetes ecosystem overviewMesos and Kubernetes ecosystem overview
Mesos and Kubernetes ecosystem overview
 
Federated mesos clusters for global data center designs
Federated mesos clusters for global data center designsFederated mesos clusters for global data center designs
Federated mesos clusters for global data center designs
 
[OpenInfra Days Korea 2018] Day 1 - T4-7: "Ceph 스토리지, PaaS로 서비스 운영하기"
[OpenInfra Days Korea 2018] Day 1 - T4-7: "Ceph 스토리지, PaaS로 서비스 운영하기"[OpenInfra Days Korea 2018] Day 1 - T4-7: "Ceph 스토리지, PaaS로 서비스 운영하기"
[OpenInfra Days Korea 2018] Day 1 - T4-7: "Ceph 스토리지, PaaS로 서비스 운영하기"
 
Container orchestration
Container orchestrationContainer orchestration
Container orchestration
 
Big Data in Container; Hadoop Spark in Docker and Mesos
Big Data in Container; Hadoop Spark in Docker and MesosBig Data in Container; Hadoop Spark in Docker and Mesos
Big Data in Container; Hadoop Spark in Docker and Mesos
 
Spark / Mesos Cluster Optimization
Spark / Mesos Cluster OptimizationSpark / Mesos Cluster Optimization
Spark / Mesos Cluster Optimization
 
April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...
April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...
April 2016 HUG: The latest of Apache Hadoop YARN and running your docker apps...
 
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
 

Similar a Orchestrating Redis & K8s Operators

Operator Lifecycle Management
Operator Lifecycle ManagementOperator Lifecycle Management
Operator Lifecycle Management
DoKC
 
RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...
RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...
RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...
Redis Labs
 
Kubernetes Operators And The Redis Enterprise Journey: Michal Rabinowitch
Kubernetes Operators And The Redis Enterprise Journey: Michal RabinowitchKubernetes Operators And The Redis Enterprise Journey: Michal Rabinowitch
Kubernetes Operators And The Redis Enterprise Journey: Michal Rabinowitch
Redis Labs
 
Apache Druid Auto Scale-out/in for Streaming Data Ingestion on Kubernetes
Apache Druid Auto Scale-out/in for Streaming Data Ingestion on KubernetesApache Druid Auto Scale-out/in for Streaming Data Ingestion on Kubernetes
Apache Druid Auto Scale-out/in for Streaming Data Ingestion on Kubernetes
DataWorks Summit
 

Similar a Orchestrating Redis & K8s Operators (20)

Redis Meetup TLV - K8s Session 28/10/2018
Redis Meetup TLV - K8s Session 28/10/2018Redis Meetup TLV - K8s Session 28/10/2018
Redis Meetup TLV - K8s Session 28/10/2018
 
Operator Lifecycle Management
Operator Lifecycle ManagementOperator Lifecycle Management
Operator Lifecycle Management
 
Operator Lifecycle Management
Operator Lifecycle ManagementOperator Lifecycle Management
Operator Lifecycle Management
 
Redis on Kubernetes
Redis on KubernetesRedis on Kubernetes
Redis on Kubernetes
 
RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...
RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...
RedisDay London 2018 - Layered Orchestration & Redis Enterprise for fun and p...
 
Data weekender deploying prod grade sql 2019 big data clusters
Data weekender deploying prod grade sql 2019 big data clustersData weekender deploying prod grade sql 2019 big data clusters
Data weekender deploying prod grade sql 2019 big data clusters
 
Kubernetes Operators And The Redis Enterprise Journey: Michal Rabinowitch
Kubernetes Operators And The Redis Enterprise Journey: Michal RabinowitchKubernetes Operators And The Redis Enterprise Journey: Michal Rabinowitch
Kubernetes Operators And The Redis Enterprise Journey: Michal Rabinowitch
 
Managing Redis with Kubernetes - Kelsey Hightower, Google
Managing Redis with Kubernetes - Kelsey Hightower, GoogleManaging Redis with Kubernetes - Kelsey Hightower, Google
Managing Redis with Kubernetes - Kelsey Hightower, Google
 
Splunk: Druid on Kubernetes with Druid-operator
Splunk: Druid on Kubernetes with Druid-operatorSplunk: Druid on Kubernetes with Druid-operator
Splunk: Druid on Kubernetes with Druid-operator
 
Dok Talks #124 - Intro to Druid on Kubernetes
Dok Talks #124 - Intro to Druid on KubernetesDok Talks #124 - Intro to Druid on Kubernetes
Dok Talks #124 - Intro to Druid on Kubernetes
 
Orchestration tool roundup kubernetes vs. docker vs. heat vs. terra form vs...
Orchestration tool roundup   kubernetes vs. docker vs. heat vs. terra form vs...Orchestration tool roundup   kubernetes vs. docker vs. heat vs. terra form vs...
Orchestration tool roundup kubernetes vs. docker vs. heat vs. terra form vs...
 
Uri Cohen & Dan Kilman, GigaSpaces - Orchestration Tool Roundup - OpenStack l...
Uri Cohen & Dan Kilman, GigaSpaces - Orchestration Tool Roundup - OpenStack l...Uri Cohen & Dan Kilman, GigaSpaces - Orchestration Tool Roundup - OpenStack l...
Uri Cohen & Dan Kilman, GigaSpaces - Orchestration Tool Roundup - OpenStack l...
 
Kubernetes Walk Through from Technical View
Kubernetes Walk Through from Technical ViewKubernetes Walk Through from Technical View
Kubernetes Walk Through from Technical View
 
Container orchestration from theory to practice
Container orchestration from theory to practiceContainer orchestration from theory to practice
Container orchestration from theory to practice
 
DoK Talks #91- Leveraging Druid Operator to manage Apache Druid on Kubernetes
DoK Talks #91- Leveraging Druid Operator to manage Apache Druid on KubernetesDoK Talks #91- Leveraging Druid Operator to manage Apache Druid on Kubernetes
DoK Talks #91- Leveraging Druid Operator to manage Apache Druid on Kubernetes
 
KubeCon 2017: Kubernetes from Dev to Prod
KubeCon 2017: Kubernetes from Dev to ProdKubeCon 2017: Kubernetes from Dev to Prod
KubeCon 2017: Kubernetes from Dev to Prod
 
Apache Druid Auto Scale-out/in for Streaming Data Ingestion on Kubernetes
Apache Druid Auto Scale-out/in for Streaming Data Ingestion on KubernetesApache Druid Auto Scale-out/in for Streaming Data Ingestion on Kubernetes
Apache Druid Auto Scale-out/in for Streaming Data Ingestion on Kubernetes
 
Developing a Redis Module - Hackathon Kickoff
 Developing a Redis Module - Hackathon Kickoff Developing a Redis Module - Hackathon Kickoff
Developing a Redis Module - Hackathon Kickoff
 
Kubernetes Internals
Kubernetes InternalsKubernetes Internals
Kubernetes Internals
 
Hands-On Introduction to Kubernetes at LISA17
Hands-On Introduction to Kubernetes at LISA17Hands-On Introduction to Kubernetes at LISA17
Hands-On Introduction to Kubernetes at LISA17
 

Más de DoiT International

Más de DoiT International (18)

GAN training with Tensorflow and Tensor Cores
GAN training with Tensorflow and Tensor CoresGAN training with Tensorflow and Tensor Cores
GAN training with Tensorflow and Tensor Cores
 
K8s best practices from the field!
K8s best practices from the field!K8s best practices from the field!
K8s best practices from the field!
 
An Open-Source Platform to Connect, Manage, and Secure Microservices
An Open-Source Platform to Connect, Manage, and Secure MicroservicesAn Open-Source Platform to Connect, Manage, and Secure Microservices
An Open-Source Platform to Connect, Manage, and Secure Microservices
 
Is your Elastic Cluster Stable and Production Ready?
Is your Elastic Cluster Stable and Production Ready?Is your Elastic Cluster Stable and Production Ready?
Is your Elastic Cluster Stable and Production Ready?
 
Applying ML for Log Analysis
Applying ML for Log AnalysisApplying ML for Log Analysis
Applying ML for Log Analysis
 
GCP for AWS Professionals
GCP for AWS ProfessionalsGCP for AWS Professionals
GCP for AWS Professionals
 
Cloud Dataflow - A Unified Model for Batch and Streaming Data Processing
Cloud Dataflow - A Unified Model for Batch and Streaming Data ProcessingCloud Dataflow - A Unified Model for Batch and Streaming Data Processing
Cloud Dataflow - A Unified Model for Batch and Streaming Data Processing
 
AWS Cyber Security Best Practices
AWS Cyber Security Best PracticesAWS Cyber Security Best Practices
AWS Cyber Security Best Practices
 
Google Cloud Spanner Preview
Google Cloud Spanner PreviewGoogle Cloud Spanner Preview
Google Cloud Spanner Preview
 
Amazon Athena Hands-On Workshop
Amazon Athena Hands-On WorkshopAmazon Athena Hands-On Workshop
Amazon Athena Hands-On Workshop
 
AWS Athena vs. Google BigQuery for interactive SQL Queries
AWS Athena vs. Google BigQuery for interactive SQL QueriesAWS Athena vs. Google BigQuery for interactive SQL Queries
AWS Athena vs. Google BigQuery for interactive SQL Queries
 
Google BigQuery 101 & What’s New
Google BigQuery 101 & What’s NewGoogle BigQuery 101 & What’s New
Google BigQuery 101 & What’s New
 
Running Production-Grade Kubernetes on AWS
Running Production-Grade Kubernetes on AWSRunning Production-Grade Kubernetes on AWS
Running Production-Grade Kubernetes on AWS
 
Scaling Jenkins with Kubernetes by Ami Mahloof
Scaling Jenkins with Kubernetes by Ami MahloofScaling Jenkins with Kubernetes by Ami Mahloof
Scaling Jenkins with Kubernetes by Ami Mahloof
 
CI Implementation with Kubernetes at LivePerson by Saar Demri
CI Implementation with Kubernetes at LivePerson by Saar DemriCI Implementation with Kubernetes at LivePerson by Saar Demri
CI Implementation with Kubernetes at LivePerson by Saar Demri
 
Kubernetes @ Nanit by Chen Fisher
Kubernetes @ Nanit by Chen FisherKubernetes @ Nanit by Chen Fisher
Kubernetes @ Nanit by Chen Fisher
 
Dataflow - A Unified Model for Batch and Streaming Data Processing
Dataflow - A Unified Model for Batch and Streaming Data ProcessingDataflow - A Unified Model for Batch and Streaming Data Processing
Dataflow - A Unified Model for Batch and Streaming Data Processing
 
Kubernetes - State of the Union (Q1-2016)
Kubernetes - State of the Union (Q1-2016)Kubernetes - State of the Union (Q1-2016)
Kubernetes - State of the Union (Q1-2016)
 

Último

%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 

Último (20)

%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 

Orchestrating Redis & K8s Operators

  • 2. Agenda ● Redis Labs intro and architecture ● Double orchestration ● Our kubernetes solution ● The way to operators ● Operators intro ● Operators development ● Demo
  • 4. Introduction to Redis Enterprise Open source. The leading in-memory database platform, supporting any high performance operational, analytics or hybrid use case. The open source home and commercial provider of Redis Enterprise (Redise ) technology, platform, products & services.
  • 5.
  • 7. Redise - Open Source & Proprietary Technology Redise Node Cluster Manager Redise Cluster • Shared nothing, symmetrical cluster architecture • Fully compatible with open source commands & data structures Enterprise Layer Open Source Layer REST API Zero latency proxy
  • 8. • Faster time to market with continuity between dev/test and production environments that use Redise Pack • Highly available, easier to scale, simpler to manage Redis technology, integrated with orchestration tools such as PCF, Kubernetes, Mesosphere... • Node in a container approach — All Redise services inside each container. Run Redise clusters on single or multiple nodes Redise in Containers
  • 9. Node in a Pod Approach Node 1 Vs Node 2 Node 3 Node 1 Node 2 Node 3 One pod, multiple services per nodeMultiple pods, multiple services per node
  • 11.
  • 12. What’s Double Orchestration ? Kubernetes PKS External Redis Cluster Orchestration Node 1 Redis Shards Node 2 Node N Internal
  • 13. Why like this? • Resource management - Orchestration platforms are designed to be generic. • Again - Performance is king. • Last but not least, it allows us to maintain a common architecture - regardless of running environment, be it bare metal, VM, K8s, Pivotal Cloud Foundry. (.… Surprisingly enough, not everybody in the world uses containers…)
  • 14. Who Does What • Node auto-healing • Node scaling • Failover & scaling • Configuration & monitoring • Service discovery • Upgrade +
  • 15. And specifically on Kubernetes Node in a Pod Statefulset Persistent Volumes Custom Controller Services Manager
  • 17. StatefulSet Our cluster nodes are deployed as part of a statefulset Affinity Allows us to control the Redislabs cluster nodes topology Redislabs Service Manager Create/Update/Delete service entries for each Redis DB hosted on the cluster RBAC The Service Manager must have permissions to access the namespace to create services Ingress Allow access to Redis DBs from outside of the k8s cluster 17 Redis Labs on Kubernetes - Building Blocks
  • 18. StatefulSet • Introduced in 1.5, GAed in 1.9 • Statefulset Pod consistency – Pod naming – Scale-out/Scale-in – Pod Upgrade • Persistent Disks – Same PVC will be used when Pod is (re)scheduled • All Pods are uniform • Recovery from error state pod-0 pod-1 pod-2 PV PV PV
  • 19. Pod features • Anti-affinity – Allows us to control where the pods are being scheduled • Readiness Probes – Allows us to control the action flows to avoid data loss • Pre-stop hook – Drain the node and move resources to a different node
  • 20. Why? • Redis Enterprise is a multi-tenant Redis cluster • Redis Enterprise Database can have 1 or more network endpoints Problem • Expose databases as a service instance Solution • Python based application that will: create, delete or update necessary database service entries • Based on an idempotent reconciliation loop Redis Enterprise Services Manager
  • 21. Kubernetes Cluster Redis Labs Stateful Set Worker Node pod-0 Worker Node pod-2 Worker Node pod-1 Redis Enterprise Cluster PV PV PV K8s API Services Manager Add/Edit/Delete Database Services App App App
  • 22. The way to operators
  • 23. • Provide a solid primary db solution for end-users • Stateful application – Some changes cannot be performed – Some changes need to mutate the state before applying the actual change – Data-loss is unacceptable • Support multiple k8s deployments – Cloud: GKE, AWS, etc – Openshift – PKS – Vanilla – On-prem hardware vendor • Ingress • Packaging Redis Labs Challenges
  • 24. • Started out with 9 static yaml files – Hard to deploy – Hard to maintain – Hard to distribute – No control over the deployment life-cycle • Helm – Customized deployment – Easier to maintain – Not fully supported everywhere – No control over the deployment life-cycle • Operator – Simple deployment (2 yaml files) – Full control over life-cycle – K8s compatible Our journey .yaml .yaml
  • 27. 27 kubectl API Server StatefulSet Controller Watch(StatefulSet) pod-0 pod-1 pod-2 my-sts kubectl create -f my-sts.yaml PV PV PV
  • 28. 28 kubectl StatefulSet Controller Watch(StatefulSet) pod-0 pod-1 pod-2 my-sts kubectl scale statefulset my-sts --replicas=5 pod-3 pod-4 API Server
  • 29. 29 kubectl API Server RedisCluster Controller Watch(RedisCluster) my-redis-cluster kubectl create -f my-redis-cluster.yaml Stateful Set UI service Service Account ...
  • 30. 30 kubectl API Server RedisCluster Controller Watch(RedisCluster) my-redis-cluster kubectl apply -f my-redis-cluster.yaml Stateful Set UI service Service Account ... get-status() example: downscale
  • 31. ● Life Cycle Control ○ Scale Up → Add new pod, Rebalance Data ○ Healing → Restore Backups, Auto Recovery ○ Backup ○ Validations (ex. even # pods) ● Configuration ○ Automate complex deployments (ex. Vault cluster and etcd cluster) ○ Reconfiguration ○ Agnostic configuration (ex. PVC by cloud provider) ● 3rd party resource (ex. prometheus) ● Cross distribution ● Easy to deploy Why are operators useful?
  • 32. 32 Our Upgrade Flow In a Redis Enterprise Cluster we need to: 1. Drain pod 2. Stop pod 3. Start new pod ● Downgrade - not supported (oss backward compatibility)
  • 33. Our Upgrade Flow With Yaml/Helm - We used a life cycle preStop hook of a stateful set 1. Encoded inside the yaml - cumbersome 2. Cannot validate version 3. No error handling With Operator - 1. Maintain logic in code not in a config file 2. Validations: not a downgrade, cluster is not already in an upgrade process 3. Error handling 4. Manage canary deployment
  • 37. 37 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: labelSelector: matchExpressions: key: app operator: In values: {{ template "redisenterprise.name" . }} key: release operator: In values: {{ .Release.Name }} key: redis.io/role operator: In values: node topologyKey: kubernetes.io/hostname terminationGracePeriodSeconds: 31536000 serviceAccountName: {{ template "redisenterprise.serviceAccountName" . }} {{ with .Values.imagePullSecrets }} imagePullSecrets: {{ toYaml . | indent 8 }} {{ end }} containers: name: redis image: {{ .Values.redisImage.repository }}:{{ .Values.redisImage.tag }} imagePullPolicy: {{ .Values.redisImage.pullPolicy }} readinessProbe: exec: command: # check that the node is bootstrapped and that its connected and synced. bash c curl silent localhost:8080/v1/bootstrap && /opt/redislabs/bin/rladmin status nodes | grep node:$(cat /etc/opt/redislabs/node.id) | grep OK initialDelaySeconds: 20 timeoutSeconds: 5 lifecycle: preStop: exec: command: # enslave the node, if this current node is master, change the master to the first slave node. bash c /opt/redislabs/bin/rladmin node $(cat /etc/opt/redislabs/node.id) enslave && ((/opt/redislabs/bin/rladmin status nodes | grep node:$(cat /etc/opt/redislabs/node.id) | grep q master) && /opt/redislabs/bin/rlutil change_master master=$(/opt/redislabs/bin/rladmin status nodes | grep slave | head 1 | cut d " " f 1| cut d ":" f2) && sleep 10) || /bin/true resources: {{ toYaml .Values.redisResources | indent 10 }} ports: containerPort: 8001 containerPort: 8443 containerPort: 9443 securityContext: capabilities: add: SYS_RESOURCE {{ if .Values.persistentVolume.enabled }} volumeMounts: mountPath: "/opt/persistent" name: redisstorage {{ end }} env: name: K8S_ORCHASTRATED_DEPLOYMENT value: "yes" name: JOIN_HOSTNAME value: {{ template "redisenterprise.fullname" . }} {{ if .Values.persistentVolume.enabled }} name: PERSISTANCE_PATH value: /opt/persistent {{ end }} name: K8S_SERVICE_NAME value: {{ template "redisenterprise.fullname" . }} name: BOOTSTRAP_HANDLE_REDIRECTS value: "enabled" name: BOOTSTRAP_CLUSTER_FQDN value: {{ template "redisenterprise.clusterDNS" . }} name: BOOTSTRAP_DMC_THREADS value: "10" name: BOOTSTRAP_USERNAME valueFrom: secretKeyRef: name: {{ template "redisenterprise.fullname" . }} key: username name: BOOTSTRAP_PASSWORD valueFrom: secretKeyRef: name: {{ template "redisenterprise.fullname" . }} key: password name: BOOTSTRAP_LICENSE valueFrom: secretKeyRef: name: {{ template "redisenterprise.fullname" . }} key: license apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: {{ template "redisenterprise.statefulsetName" . }} labels: app: {{ template "redisenterprise.name" . }} chart: {{ template "redisenterprise.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: {{ if .Values.persistentVolume.enabled }} volumeClaimTemplates: metadata: name: redisstorage labels: app: {{ template "redisenterprise.name" . }} chart: {{ template "redisenterprise.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: {{ .Values.persistentVolume.size | quote }} {{ if .Values.persistentVolume.storageClass }} {{ if (eq "" .Values.persistentVolume.storageClass) }} storageClassName: "" {{ else }} storageClassName: "{{ .Values.persistentVolume.storageClass }}" {{ end }} {{ end }} {{ end }} serviceName: {{ template "redisenterprise.fullname" . }} replicas: {{ .Values.replicas }} updateStrategy: type: "RollingUpdate" template: metadata: labels: redis.io/role: node app: {{ template "redisenterprise.name" . }} chart: {{ template "redisenterprise.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: {{ with .Values.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} {{ end }}
  • 38. 38 kubectl create -f cr.yaml cr.yaml "apiVersion": "app.redislabs.com/v1alpha1", "items": [ { "apiVersion": "app.redislabs.com/v1alpha1", "kind": "RedisEnterpriseCluster", "metadata": { ... "creationTimestamp": "2018-07-12T15:47:31Z", "generation": 0, "name": " my-cluster-test", "namespace": "redis" }, "spec": { "nodes": 3, "serviceAccountName": "my-cluster-test", "uiServiceType": "ClusterIP", "username": " demo@redislabs.com " ... curl http://127.0.0.1:8001/apis/app.redislabs.com/v1alpha1/ redisenterpriseclusters
  • 40. • Started by CoreOS – CoreOS pioneered by creating a few Operators (Prometheus & vault) • Operator SDK: minimize boilerplate and help developers to get started writing Operators • The Basic API: – Register Watchers on any Resource – Create/Read/Update/Delete/Get on any resource – Register schemas using k8s GO api • Operator Lifecycle Manager
  • 41. 41 The Reconciliation/Control Loop • Called for every update, delete or creation on the watched resources – No way of knowing what type of event except Delete • Called every X seconds to “resync” resources • Our responsibility is to allow the user to use our resource as any other in k8s – AKA idempotent API • Every call to handle we get our watched resources, we need to determine what to do exactly
  • 42. 42 Idempotent APIs Desired State = Current Resource Current State • Aggregation of deployed resources • Internal application state
  • 43. 43 The Reconciliation/Control Loop - Challenges • Determine which changes need to happen • Determine if the change is valid • K8s doesn’t provide a solid validation before applying changes to CR – 1.9 has a beta feature for OpenAPI validations • Long running processes as part of a resource change
  • 44. Pending Creation Running Invalid Error create create apply create apply apply Pending Creation - initial state where cluster is not deployed yet Running - Cluster Deployed and is either running or starting to run and not ready yet Invalid - Invalid configuration was requested. E.g. even #nodes. Until a valid configuration is applied the status will remain invalid Error - Error when trying to deploy or update the Redis Enterprise Cluster apply Redis Cluster Status applyapply create = kubectl create -f cr.yaml apply = kubectl apply -f cr.yaml
  • 45. 45 Development Challenges • Deep understanding of how Kubernetes works (statefulsets, controller, APIs) • Workflows - Idempotent APIs are challenging due to state mutation • Double Orchestration - Adds a level of complexity compared to stateless deployments • Various SDK issues
  • 47. Demo