SlideShare a Scribd company logo
1 of 114
DevelopingKubernetesServices
@MELANIECEBULA / MARCH 2019 / CON LONDON
at Airbnb Scale
InfoQ.com: News & Community Site
Watch the video with slide
synchronization on InfoQ.com!
https://www.infoq.com/presentations/
airbnb-kubernetes-services
• Over 1,000,000 software developers, architects and CTOs read the site world-
wide every month
• 250,000 senior developers subscribe to our weekly newsletter
• Published in 4 languages (English, Chinese, Japanese and Brazilian
Portuguese)
• Post content from our QCon conferences
• 2 dedicated podcast channels: The InfoQ Podcast, with a focus on
Architecture and The Engineering Culture Podcast, with a focus on building
• 96 deep dives on innovative topics packed as downloadable emags and
minibooks
• Over 40 new content items per week
Purpose of QCon
- to empower software development by facilitating the spread of
knowledge and innovation
Strategy
- practitioner-driven conference designed for YOU: influencers of
change and innovation in your teams
- speakers and topics driving the evolution and innovation
- connecting and catalyzing the influencers and innovators
Highlights
- attended by more than 12,000 delegates since 2007
- held in 9 cities worldwide
Presented at QCon London
www.qconlondon.com
Whatiskubernetes?
@MELANIECEBULA
WhoamI?
@MELANIECEBULA
A BRIEF HISTORY
MONOLITH LOC
0
1000000
2000000
3000000
4000000
2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
😳
@MELANIECEBULA
WhyMicroservices?
ENGINEERING TEAM
0
250
500
750
1000
2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
😲
@MELANIECEBULA
WhyMicroservices?
SCALING CONTINUOUS DELIVERY
@MELANIECEBULA
WhyMicroservices?
Deploys per week (all apps, all environments)
@MELANIECEBULA
WhyMicroservices?
Monolith production deploys per week
@MELANIECEBULA
WhyMicroservices?
125,000
production deploys
per year
@MELANIECEBULA
WhyMicroservices?
Manually configuring
boxes
Automate
configuration of
applications with Chef
Automate
configuration and
orchestration of
containerized
applications with
Kubernetes
@MELANIECEBULA
Whykubernetes?
EVOLUTION OF CONFIGURATION MANAGEMENT
@MELANIECEBULA
Whykubernetes?
• portable
• immutable
• reproducible
• declarative
• efficient scheduling
• extensible API
• human-friendly data
• standard format
TODAY
50%ofservices
in kubernetes
@MELANIECEBULA
migrationprogress
250+criticalservices
in kubernetes
@MELANIECEBULA
migrationprogress
• complex configuration
• complex tooling
• integrating with your current infrastructure
• open issues
• scaling
• … and more!
@MELANIECEBULA
Challengeswithkubernetes?
• complex configuration
• complex tooling
• integrating with your current infrastructure
• open issues
• scaling
• … and more!
@MELANIECEBULA
Challengeswithkubernetes?
solvable problems!
@MELANIECEBULA
youarenotalone.
1. abstract away k8s configuration
2. generate service boilerplate
3. version + refactor configuration
4. opinionated kubectl
5. custom ci/cd + validation
@MELANIECEBULA
Solutions?
ABSTRACT AWAY
CONFIGURATION
P
kubernetes
@MELANIECEBULA
kubectl
apply
Production
Deployment
Canary
Deployment
Production
ConfigMap
Canary
ConfigMap
Production
Service
Canary
Service
kubernetes cluster
Dev
Deployment
Dev
ConfigMap
Dev
Service
kubernetes config files
P
kubernetes
@MELANIECEBULA
kubectl
apply
Production
Deployment
Canary
Deployment
Production
ConfigMap
Canary
ConfigMap
Production
Service
Canary
Service
kubernetes cluster
Dev
Deployment
Dev
ConfigMap
Dev
Service
kubernetes config files
lots of boilerplate
repetitive by
environment
resources
environments
Reducingk8s
boilerplate
OUR REQUIREMENTS
• Prefertemplatingover file inheritance
• Input should be templatedYAML files
• Make it easier to migrate100soflegacyservices
• Make it easier toretrain1000engineers
@MELANIECEBULA
Project
Apps
Containers
Files
Volumes
Dockerfile
kube-gen
generate
kubectl
apply
kubernetes cluster
@MELANIECEBULA
kubectl
apply
Production
Deployment
Canary
Deployment
Production
ConfigMap
Canary
ConfigMap
Production
Service
Canary
Service
Dev
Deployment
Dev
ConfigMap
Dev
Service
kubernetes config files
generatingk8sconfigs
Project
Apps
Containers
Files
Volumes
Dockerfile
kube-gen
generate
kubectl
apply
kubernetes cluster
@MELANIECEBULA
kubectl
apply
Production
Deployment
Canary
Deployment
Production
ConfigMap
Canary
ConfigMap
Production
Service
Canary
Service
Dev
Deployment
Dev
ConfigMap
Dev
Service
kubernetes config files
kube-gen!
generatingk8sconfigs
Reducingk8s
boilerplate
WHAT WE WENT WITH
@MELANIECEBULA
Project
Apps
Containers
Files
Volumes
Dockerfile
sets
params per
environment
other files
access params
@MELANIECEBULA
Project
Apps
Containers
Files
Volumes
Dockerfile
kube-gen
generate
generatingk8sconfigs
@MELANIECEBULA
Project
Apps
Containers
Files
Volumes
Dockerfile
kube-gen
generate
standardized
namespaces based on
environments!
generatingk8sconfigs
kube-gen
COMPONENTS
@MELANIECEBULA
Project
Apps
Containers
Files
Volumes
Dockerfile
Which shared components
to use?
nginx logging statsd
example components
kube-gen
COMPONENTS
@MELANIECEBULA
Main
Container
Containers
Main App
Volumes
Files
Dockerfile
nginx component
• common pattern abstracted into component
• component yams is merged into project on generate
• components can require or set default params
Reducingk8s
boilerplate
OPEN SOURCE OPTIONS
@MELANIECEBULA
1. Combine with package management (ex: helm)
2. Override configuration via file inheritance (ex: kustomize)
3. Override configuration via templating (ex: kapitan)
•Reducekubernetesboilerplate
•Standardizeonenvironmentsand
namespaces
Takeaways
GENERATE SERVICE
BOILERPLATE
Everythingaboutaserviceisinone
placeingit,andmanagedwithone
process.
Everything about a service is in one place in git
• All configuration lives in _infra alongside project code
• Edit code and configuration with one pull request
• Easy to add new configuration
• Statically validated in CI/CD
Configuration
LIVES IN ONE PLACE
@MELANIECEBULA
What we support:
• kube-gen files
• framework boilerplate
• API boilerplate
• CI/CD
• docs
• AWS IAM roles
• project ownership
• storage
• .. and more!
Configuration
LIVES IN ONE PLACE
@MELANIECEBULA
Configuration
LIVES IN ONE PLACE
@MELANIECEBULA
this “hello world”
service was created
in one command
Configuration
LIVES IN ONE PLACE
@MELANIECEBULA
collection of config
generators (ex: docs,
ci)
Configuration
LIVES IN ONE PLACE
@MELANIECEBULA
collection of
framework-specific
generators (ex: Rails,
Dropwizard)
• make best practices the default (ex: deploy pipeline,
autoscaling, docs)
• run generators individually or as a group
• support for review, update, commit
Configuration
CAN BE GENERATED
@MELANIECEBULA
•Everythingaboutaserviceshould
beinoneplaceingit
•Makebestpracticesthedefaultby
generatingconfiguration
Takeaways
VERSION CONFIGURATION
Why do we version our kube configuration?
@MELANIECEBULA
• add support for something
new (ex: k8s version)
• want to change something
(ex: deployment strategy)
• want to drop support for
something (breaking
change)
• know which versions are
bad when we make a
regression 😅
• support release cycle and
cadence
kube.yml
v1
kubev1
deploy
kubev2
deploy
kubernetes cluster
kube.yml
v2
How do we version our kube configuration?
@MELANIECEBULA
1. version field
2. publish binaries for each
version
3. channels point to binaries
(ex: stable)
4. generate and apply using
the appropriate binary
bonk kube-gen.yml
Why do we version our generated configuration?
@MELANIECEBULA
• what our project generators
generate changes over
time
• best practices change
• and bugs in the generators
are found! 😅
kube.yml
generated by
sha1
kubev1
deploy
kubernetes cluster
kube.yml
generated by
sha2
generator at
sha2 has a bug
How do we version our generated configuration?
@MELANIECEBULA
generator tags
generated files with
version, sha, and
timestamp
REFACTOR CONFIGURATION
• services should be up-to-date with latest best practices
• update configuration to the latest supported versions
• apply security patches to images
• configuration migrations should be automated
Whydowerefactorconfiguration?
FOR HUNDREDS OF SERVICES
250+criticalservices
in kubernetes
@MELANIECEBULA
(wedon’twanttomanuallyrefactor)
How do we refactor configuration?
@MELANIECEBULA
• collection of general
purpose scripts
• scripts are modular
• scripts cover the lifecycle of
a refactor
list-pr-urls.py
get-repos.py
update-
prs.py
refactor.py
close.py
status.py
refactorator
The lifecycle of a refactor
Checks out repo, finds
project, runs refactor
job, tags owners,
creates PR
Comments on the PR,
reminding owners to
verify, edit, and merge
the PR
Merges the PR with
different levels of force
RunRefactor MergeUpdate
@MELANIECEBULA
How do we refactor configuration?
@MELANIECEBULA
• refactorator will run a
refactor for all services
given a refactor job
• refactor job updates _infra
file(s)
• ex: upgrade kube version to
stable
refactorator
upgrade-
kube.py
refactor job
Bumping stable version
@MELANIECEBULA
• bump stable version
• cron job uses refactorator
and with the upgrade-
kube.py refactor job to
create PRs
• another cron job handling
updating and merging PRs
runs daily on
weekdays
k8s cron job
refactorator
upgrade-
kube.py
refactor job
•Configurationshouldbeversioned
andrefactoredautomatically.
Takeaways
OPINIONATED KUBECTL
P
kubernetes
@MELANIECEBULA
kubectl
apply
Production
Deployment
Canary
Deployment
Production
ConfigMap
Canary
ConfigMap
Production
Service
Canary
Service
kubernetes cluster
Dev
Deployment
Dev
ConfigMap
Dev
Service
kubernetes config files
lots of boilerplate
repetitive by
environment
resources
environments
P
kubernetes
@MELANIECEBULA
kubectl
apply
Production
Deployment
Canary
Deployment
Production
ConfigMap
Canary
ConfigMap
Production
Service
Canary
Service
kubernetes cluster
Dev
Deployment
Dev
ConfigMap
Dev
Service
kubernetes config files
verbose
repetitive by
namespace
ktool
KUBECTL WRAPPER
kubernetes cluster
kubectl
apply
Production
Deployment
Canary
Deployment
Production
ConfigMap
Canary
ConfigMap
Production
Service
Canary
Service
Dev
Deployment
Dev
ConfigMap
Dev
Service
@MELANIECEBULA
calls kubectl
commands (incl.
plugins)
ktool
OPINIONATED KUBECTL
@MELANIECEBULA
ktool
USES ENV VARS
• Runs in the project home directory:

$ cd /path/to/bonk
$ k status
• Environment variables for arguments:
$ k status ENV=staging
• Prints the command that it will execute:

$ k status ENV=staging
kubectl get pods --namespace=bonk-staging
@MELANIECEBULA
standardized
namespaces!
ktool
SIMPLIFIES BUILDS AND
DEPLOYS
• k generate generates kubernetes files
• k build performs project build, docker build and
docker push with tags
• k deploy creates namespace, applies/replaces
kubernetes files, sleeps and checks deployment status
• can chain commands; ex: k all
@MELANIECEBULA
ktool
A DEBUGGING TOOL
• defaults to random pod, main container:
$ k ssh ENV=staging
• specify particular pod, specific container:
$ k logs ENV=staging POD=… CONTAINER=bonk
• automates debugging with k diagnose ENV=staging
@MELANIECEBULA
ktool
A DEBUGGING TOOL
• defaults to random pod, main container:
$ k ssh ENV=staging
• specify particular pod, specific container:
$ k logs ENV=staging POD=… CONTAINER=bonk
• automates debugging with k diagnose ENV=staging
@MELANIECEBULA
call kubectl diagnose
Whatarekubectlplugins?
@MELANIECEBULA
Whatarekubectlplugins?
@MELANIECEBULA
kdiagnose
SETUP
@MELANIECEBULA
deploy bonk
service with failing
command
new pod in
CrashLoopBackoff
kdiagnose
MANUALLY
@MELANIECEBULA
1. use “get pods -
o=yaml” and look
for problems
2. grab logs for
unready container
kdiagnose
MANUALLY
@MELANIECEBULA
3. get k8s events
related to this pod
kubectlpodevents
KUBECTL PLUGIN
@MELANIECEBULA
kubectl podevents
plugin
kubectldiagnose
USES COBRA GO CLI
@MELANIECEBULA
// defines CLI command and flags
var Namespace string
var rootCmd = &cobra.Command{
Use: “kubectl diagnose —namespace<namespace>"
Short: “diagnoses a namespace with pods in CrashLoopBackOff”
Run: func(cmd *cobra.Command, arg[]string) {
// Fill in with program logic
}
}
func Execute() {
rootCmd.Flags().StringVarP(&Namespace, "namespace", "n", “”)
rootCmd.MarkFlagRequired("namespace")
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
kubectldiagnose
USES K8S CLIENT-GO
@MELANIECEBULA
// get pods (assume Namespace is defined)
kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube","config")
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil { … }
clientset, err := kubernetes.NewForConfig(config)
if err != nil { … }
pods, err :=
clientset.CoreV1().Pods(Namespace).List(metav1.ListOptions{})
fmt.Printf("There are %d pods in the namespace %sn",
len(pods.Items), Namespace)
for _, pod := range pod.Items {
podName := pod.Name
for _, c := range pod.Status.ContainerStatuses {
if c.Ready != true {
// print c.LastTerminatedState and c.State
}
}
uses k8s client-go
and Namespace
param to get pods
kubectldiagnose
USES K8S CLIENT-GO
@MELANIECEBULA
// get pods (assume Namespace is defined)
kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube","config")
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil { … }
clientset, err := kubernetes.NewForConfig(config)
if err != nil { … }
pods, err :=
clientset.CoreV1().Pods(Namespace).List(metav1.ListOptions{})
fmt.Printf("There are %d pods in the namespace %sn",
len(pods.Items), Namespace)
for _, pod := range pod.Items {
podName := pod.Name
for _, c := range pod.Status.ContainerStatuses {
if c.Ready != true {
// print c.LastTerminatedState and c.State
}
}
prints info for all
unready containers
kubectldiagnose
USES OS/EXEC (WHEN LAZY)
@MELANIECEBULA
// get pod events for namespace and pod
cmd := exec.Command("kubectl", "podevents", Namespace, podName)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
log.Fatal(err)
} else {
fmt.Println("Events: n" + out.String())
}
}
// also grab logs
cmd = exec.Command("kubectl", "logs", podname, fmt.Sprintf("--
namespace=%s", Namespace), "-c", "bonk")
podevents kubectl
plugin
kubectldiagnose
GO KUBECTL PLUGIN
@MELANIECEBULA
kubectldiagnose
GO KUBECTL PLUGIN
@MELANIECEBULA
1. unready
container info
kubectldiagnose
GO KUBECTL PLUGIN
@MELANIECEBULA
1. unready
container info
2. kubectl
podevents
kubectldiagnose
GO KUBECTL PLUGIN
@MELANIECEBULA
1. unready
container info
2. kubectl
podevents
3. pod logs for
unready containers
•Createanopinionatedkubectl
wrapper
•Automatecommonk8sworkflows
withkubectlplugins
Takeaways
CI/CD
Each step in our CI /CD jobs are
RUN steps in a build Dockerfile
runs k commands
DEPLOY PROCESS
A single deploy process for every change
Write code and config
under your project
Open a PR and merge
your code to master
Deploy all code and
config changes
Develop DeployMerge
@MELANIECEBULA
A single deploy process for every change
Deployment
ConfigMap
Service
AWS
Alerts
Dashboards
Project
ownership
Docs
Secrets
kubectl
apply
kubernetes cluster
kubectl
apply
Storage
Service
Discovery
API Gateway
Routes
@MELANIECEBULA
How do we apply k8s configuration?
Deployment
ConfigMap
Service
“kubectl
apply”
kubernetes cluster
• kubectl apply all files
• in some cases where apply
fails, replace files without
force
• always restart pods on
deploy to pick up changes
• return atomic success or
failure state by sleeping and
checking status
@MELANIECEBULA
How do you always restart pods on deploy?
Deployment
ConfigMap
Service
kubectl
apply
kubernetes cluster
kubectl
apply
We add a date label
to the pod spec,
which convinces k8s
to relaunch all pods
@MELANIECEBULA
How do we apply custom configuration?
@MELANIECEBULA
How do we apply custom configuration?
aws.yml
kubectl
apply
kubernetes cluster
kubectl
apply
AWS CRD
AWS
Controller
AWS
webhook
@MELANIECEBULA
How do we apply custom configuration?
aws.yml
kubectl
apply
kubernetes cluster
kubectl
apply
AWS CRD
AWS
Controller
AWS
webhook
1. Create a custom
resource definition
for aws.yml
@MELANIECEBULA
How do we apply custom configuration?
aws.yml
kubectl
apply
kubernetes cluster
kubectl
apply
AWS CRD
AWS
Controller
AWS
webhook
2. Create a controller
that calls a web hook
when aws.yml is
applied
@MELANIECEBULA
How do we apply custom configuration?
aws.yml
kubectl
apply
kubernetes cluster
kubectl
apply
AWS CRD
AWS
Controller
AWS
webhook
3. Create a web hook
that updates a
custom resource
@MELANIECEBULA
How do we apply custom configuration?
AWS CRD
AWS
Controller
AWS
webhook
@MELANIECEBULA
AWS lambda
4. AWS lambda
exposes web hook to
be called
•Codeandconfigurationshouldbe
deployedwiththesameprocess
•Usecustomresourcesandcustom
controllerstointegratek8swithyour
infra
Takeaways
VALIDATION
• enforce best practices
• at build time with validation scripts
• at deploy time with admission controllerConfiguration
SHOULD BE VALIDATED
@MELANIECEBULA
How do we validate configuration at build time?
@MELANIECEBULA
How do we validate configuration at build time?
@MELANIECEBULA
kube
validation
script
job dispatcher
project.yml
validation
script
aws .yml
validation
script
global jobs repo
project
build
global
validation
jobs
docs
build
bonk CI jobs
How do we validate configuration at build time?
@MELANIECEBULA
kube
validation
script
job dispatcher
project.yml
validation
script
aws .yml
validation
script
global jobs repo
project
build
global
validation
jobs
docs
build
bonk CI jobs1. Define global job in
global jobs repo
How do we validate configuration at build time?
@MELANIECEBULA
kube
validation
script
job dispatcher
project.yml
validation
script
aws .yml
validation
script
global jobs repo
project
build
global
validation
jobs
docs
build
bonk CI jobs
2. job dispatcher
always dispatches
global jobs to
projects
How do we validate configuration at build time?
@MELANIECEBULA
kube
validation
script
job dispatcher
project.yml
validation
script
aws .yml
validation
script
global jobs repo
project
build
global
validation
jobs
docs
build
bonk CI jobs
3. global job runs
alongside project
jobs
What do we validate at build time?
@MELANIECEBULA
• invalid yaml
• invalid k8s configuration
• bad configuration versions
• max namespace length (63
chars)
• valid project name
• valid team owner in
project.yml
kube
validation
script
job dispatcher
project.yml
validation
script
aws .yml
validation
script
global jobs repo
How do we validate configuration at deploy time?
project.yml
kubectl
apply
kubernetes cluster
kubectl
apply
@MELANIECEBULA
admission
controller
admission controller
intercepts requests
to the k8s api server
prior to persistence
of the object
How do we validate configuration at deploy time?
project.yml
@MELANIECEBULA
admission
controller
• metadata is encoded as
annotations at generate
time
• admissioncontroller
checks for required
annotations
• reject any update to
resources that are missing
required annotations
What do we validate with admission controller?
project.yml
@MELANIECEBULA
admission
controller • project ownership
annotations
• configuration stored in git
• configuration uses
minimally supported version
What do we validate with admission controller?
project.yml
@MELANIECEBULA
admission
controller
• production images must be
uploaded to production
ECR
• prevent deployment of
unsafe workloads
• prevent deployment of
development namespaces
to production clusters
What do we validate with admission controller?
project.yml
@MELANIECEBULA
admission
controller
• production images must be
uploaded to production
ECR
• prevent deployment of
unsafe workloads
• prevent deployment of
development namespaces
to production clusters
standardized
namespaces!
•CI/CDshouldrunthesame
commandsthatengineersrunlocally
•CI/CDshouldruninacontainer
•ValidateconfigurationaspartofCI/
CD
Takeaways
1. Abstractaway complex kubernetes configuration
2. Standardize on environments and namespaces
3. Everything about a service should be in oneplaceingit
4. Makebestpracticesthedefault bygenerating configuration
5. Configuration should be versionedand refactoredautomatically.
6. Createanopinionatedkubectlwrapper that automates common workflows
7. CI/CDshouldrunthesamecommands that engineers run locally, in a container
8. Code and configuration should bedeployedwiththesameprocess
9. Usecustomresourcesandcustomcontrollers to integrate with your infrastructure
10.Validateconfiguration as part of CI/CD
10Takeaways
@MELANIECEBULA
keno
• thousands of services running in k8s
• moving all configuration to gitops workflow w/ custom controllers
• scaling the cluster / scaling etcd / multi cluster support
• stateful services / high memory requirements
• tighter integration with kubectl plugins
• … and more!
2019Challenges
@MELANIECEBULA
Watch the video with slide
synchronization on InfoQ.com!
https://www.infoq.com/presentations/
airbnb-kubernetes-services

More Related Content

More from C4Media

Shifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDShifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDC4Media
 
CI/CD for Machine Learning
CI/CD for Machine LearningCI/CD for Machine Learning
CI/CD for Machine LearningC4Media
 
Fault Tolerance at Speed
Fault Tolerance at SpeedFault Tolerance at Speed
Fault Tolerance at SpeedC4Media
 
Architectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsArchitectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsC4Media
 
ML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsC4Media
 
Build Your Own WebAssembly Compiler
Build Your Own WebAssembly CompilerBuild Your Own WebAssembly Compiler
Build Your Own WebAssembly CompilerC4Media
 
User & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleUser & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleC4Media
 
Scaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeScaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeC4Media
 
Make Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereMake Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereC4Media
 
The Talk You've Been Await-ing For
The Talk You've Been Await-ing ForThe Talk You've Been Await-ing For
The Talk You've Been Await-ing ForC4Media
 
Future of Data Engineering
Future of Data EngineeringFuture of Data Engineering
Future of Data EngineeringC4Media
 
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreAutomated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreC4Media
 
Navigating Complexity: High-performance Delivery and Discovery Teams
Navigating Complexity: High-performance Delivery and Discovery TeamsNavigating Complexity: High-performance Delivery and Discovery Teams
Navigating Complexity: High-performance Delivery and Discovery TeamsC4Media
 
High Performance Cooperative Distributed Systems in Adtech
High Performance Cooperative Distributed Systems in AdtechHigh Performance Cooperative Distributed Systems in Adtech
High Performance Cooperative Distributed Systems in AdtechC4Media
 
Rust's Journey to Async/await
Rust's Journey to Async/awaitRust's Journey to Async/await
Rust's Journey to Async/awaitC4Media
 
Opportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven UtopiaOpportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven UtopiaC4Media
 
Datadog: a Real-Time Metrics Database for One Quadrillion Points/Day
Datadog: a Real-Time Metrics Database for One Quadrillion Points/DayDatadog: a Real-Time Metrics Database for One Quadrillion Points/Day
Datadog: a Real-Time Metrics Database for One Quadrillion Points/DayC4Media
 
Are We Really Cloud-Native?
Are We Really Cloud-Native?Are We Really Cloud-Native?
Are We Really Cloud-Native?C4Media
 
CockroachDB: Architecture of a Geo-Distributed SQL Database
CockroachDB: Architecture of a Geo-Distributed SQL DatabaseCockroachDB: Architecture of a Geo-Distributed SQL Database
CockroachDB: Architecture of a Geo-Distributed SQL DatabaseC4Media
 
A Dive into Streams @LinkedIn with Brooklin
A Dive into Streams @LinkedIn with BrooklinA Dive into Streams @LinkedIn with Brooklin
A Dive into Streams @LinkedIn with BrooklinC4Media
 

More from C4Media (20)

Shifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDShifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CD
 
CI/CD for Machine Learning
CI/CD for Machine LearningCI/CD for Machine Learning
CI/CD for Machine Learning
 
Fault Tolerance at Speed
Fault Tolerance at SpeedFault Tolerance at Speed
Fault Tolerance at Speed
 
Architectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsArchitectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep Systems
 
ML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.js
 
Build Your Own WebAssembly Compiler
Build Your Own WebAssembly CompilerBuild Your Own WebAssembly Compiler
Build Your Own WebAssembly Compiler
 
User & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleUser & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix Scale
 
Scaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeScaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's Edge
 
Make Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereMake Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home Everywhere
 
The Talk You've Been Await-ing For
The Talk You've Been Await-ing ForThe Talk You've Been Await-ing For
The Talk You've Been Await-ing For
 
Future of Data Engineering
Future of Data EngineeringFuture of Data Engineering
Future of Data Engineering
 
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreAutomated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
 
Navigating Complexity: High-performance Delivery and Discovery Teams
Navigating Complexity: High-performance Delivery and Discovery TeamsNavigating Complexity: High-performance Delivery and Discovery Teams
Navigating Complexity: High-performance Delivery and Discovery Teams
 
High Performance Cooperative Distributed Systems in Adtech
High Performance Cooperative Distributed Systems in AdtechHigh Performance Cooperative Distributed Systems in Adtech
High Performance Cooperative Distributed Systems in Adtech
 
Rust's Journey to Async/await
Rust's Journey to Async/awaitRust's Journey to Async/await
Rust's Journey to Async/await
 
Opportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven UtopiaOpportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven Utopia
 
Datadog: a Real-Time Metrics Database for One Quadrillion Points/Day
Datadog: a Real-Time Metrics Database for One Quadrillion Points/DayDatadog: a Real-Time Metrics Database for One Quadrillion Points/Day
Datadog: a Real-Time Metrics Database for One Quadrillion Points/Day
 
Are We Really Cloud-Native?
Are We Really Cloud-Native?Are We Really Cloud-Native?
Are We Really Cloud-Native?
 
CockroachDB: Architecture of a Geo-Distributed SQL Database
CockroachDB: Architecture of a Geo-Distributed SQL DatabaseCockroachDB: Architecture of a Geo-Distributed SQL Database
CockroachDB: Architecture of a Geo-Distributed SQL Database
 
A Dive into Streams @LinkedIn with Brooklin
A Dive into Streams @LinkedIn with BrooklinA Dive into Streams @LinkedIn with Brooklin
A Dive into Streams @LinkedIn with Brooklin
 

Recently uploaded

Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 

Recently uploaded (20)

Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 

Develop Hundreds of Kubernetes Services at Scale with Airbnb