Continuous Delivery for Containerized Applications:
The Trials and Tribulations
Daniel Bryant
@danielbryantuk
Setting the scene…
• Continuous delivery is a large topic
• Focusing on the process and tooling
• No live coding today
• Mini-book contains more details
• “Building a CD pipeline” by Adrian and Kevin
15/12/2016 @danielbryantuk
TL;DR – Containers and CD
• Container image becomes the build pipeline ‘single binary’
• Adding metadata to containers images is vital
• Must validate container constraints (NFRs)
• Cultivate containerised ‘mechanical sympathy’
15/12/2016 @danielbryantuk
@danielbryantuk
• Chief Scientist at OpenCredo, CTO at SpectoLabs
• Agile, architecture, CI/CD, DevOps
• Java, Go, JS, microservices, cloud, containers
• Leading change through the application of technology and teams
15/12/2016 @danielbryantuk
Continuous Delivery
15/12/2016 @danielbryantuk
Continuous Delivery
• Produce valuable and robust software in short cycles
• Optimising for feedback and learning
• Not (necessarily) Continuous Deployment
15/12/2016 @danielbryantuk
Creation of a build pipeline is mandatory for continuous delivery
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
The Impact of containers on CD
15/12/2016 @danielbryantuk
Container technology (and CD)
• OS-level virtualisation
• cgroups, namespaces, rootfs
• Package and execute software
• Container image == ‘single binary’
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
Creating a pipeline for containers
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
Make your dev environment like production
• Develop locally or copy/code in container
• Use base images from production
• Must build/test containers locally
• Perform (at least) happy path tests
• All tests should be runnable locally
15/12/2016 @danielbryantuk
Lesson learned: Dockerfile content is super important
• OS choice
• Configuration
• Build artifacts
• Exposing ports
• Java
• JDK vs JRE and Oracle vs OpenJDK
• Golang
• Statically compiled binary
• Python
• Virtualenv
15/12/2016 @danielbryantuk
Please talk to the sysadmin people:
Their operational knowledge is invaluable
15/12/2016 @danielbryantuk
Different prod and test containers?
• Create “test” version of container
• Full OS (e.g. Ubuntu)
• Test tools and data
• Easy to see app/configuration drift
• Use test sidecar containers instead
• ONTEST proposal by Alexi Ledenev
15/12/2016 @danielbryantuk
http://blog.terranillius.com/post/docker_testing/
15/12/2016 @danielbryantuk
Building images with Jenkins
• My report covers this
• Build as usual…
• Build Docker Image
• Cloudbees Docker Build and Publish Plugin
• Push image to registry
15/12/2016 @danielbryantuk
Storing in an image registry (DockerHub)
15/12/2016 @danielbryantuk
Lesson learned: Metadata is valuable
• Application metadata
• Version / GIT SHA
• Build metadata
• Build date
• Image name
• Vendor
• Quality metadata
• QA control
• Security audited etc
15/12/2016 @danielbryantuk
Metadata – Beware of “latest” Docker Tag
• Beware of the ‘latest’ Docker tag
• “Latest” simply means
• the last build/tag that ran without
a specific tag/version specified
• Ignore “latest” tag
• Version your tags, every time
• Danielbryantuk/test:2.4.1
15/12/2016 @danielbryantuk
Metadata - Adding Labels at build time
• Docker Labels
• Add key/value data to image
15/12/2016 @danielbryantuk
Metadata - Adding Labels at build time
• Microscaling Systems’ Makefile
• Labelling automated builds on
DockerHub (h/t Ross Fairbanks)
• Create file /hooks/build
• label-schema.org
• microbadger.com
15/12/2016 @danielbryantuk
Metadata - Adding Labels at runtime
15/12/2016 @danielbryantuk
$ docker run -d --label
uk.co.danielbryant.lbname=frontdoor nginx
• Can ’docker commit’, but creates new image
• Not possible to update running container
• Docker Proposal: Update labels #21721
15/12/2016 @danielbryantuk
Component testing
15/12/2016 @danielbryantuk
Testing: Jenkins Pipeline (as code)
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
Testing individual containers
15/12/2016 @danielbryantuk
Integration testing
15/12/2016 @danielbryantuk
Introducing Docker Compose
15/12/2016 @danielbryantuk
Docker Compose & Jenkins Pipeline
15/12/2016 @danielbryantuk
Mechanical sympathy: Docker and Java
• Watch for cgroup limits (and cgroup awareness)
• getAvailableProcessors issue (bugs.openjdk.java.net/browse/JDK-8140793)
• Default fork/join thread pool sizes (based from host CPU count)
• Set container memory appropriately
• JVM requirements = Heap size (Xmx) + Metaspace + JVM overhead
• Account for native thread requirements e.g. thread stack size (Xss)
• Entropy
• Host entropy can soon be exhausted by crypto operations
15/12/2016 @danielbryantuk | @spoole167 35
Mechanical sympathy: Docker and security
15/12/2016 @danielbryantuk
Containers are not a silver bullet
15/12/2016 @danielbryantuk
Containers: Expectations versus reality
15/12/2016 @danielbryantuk
“DevOps”
Containerise an existing (monolithic) app?
• For
• We know the monolith well
• Allows homogenization of the
pipeline and deployment platform
• Can be a demonstrable win for
tech and the business
• Against
• Can be difficult (100+ line scripts)
• Often not designed for operation
within containers, nor cloud native
• Putting lipstick on a pig?
15/12/2016 @danielbryantuk
Whatever you decide…
push it through the pipeline ASAP!
15/12/2016 @danielbryantuk
Key lessons learned
• Conduct an architectural review
• Architecture for Developers, by Simon Brown
• Architecture Interview, by Susan Fowler
• Look for data ingress/egress
• File system access
• Support resource constraints/transience
• Optimise for quick startup and shutdown
• Evaluate approach to concurrency
• Store configuration (secrets) remotely
15/12/2016 @danielbryantuk
New design patterns
15/12/2016 @danielbryantuk
bit.ly/2efe0TP
Microservices…
Containers and microservices are
complementary
Testing and deployment change
15/12/2016 @danielbryantuk
https://specto.io/blog/recipe-for-designing-building-testing-microservices.html
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
Microservice architectural impact on CD
• Application decomposition
• Bounded context
• Change cadence
• Risk
• Performance
• Scalability
• Team location
h/t Matthew Skelton, Adam Tornhill
• Worth knowing about:
• Consumer-based contracts
• Service virtualisation
• Synthetic transactions and
semantic monitoring
15/12/2016 @danielbryantuk
Using containers does not obviate the need for
good architectural practices
15/12/2016 @danielbryantuk
15/12/2016 @danielbryantuk
https://speakerdeck.com/caseywest/containercon-north-america-cloud-anti-patterns
Summary
15/12/2016 @danielbryantuk
In summary
• Continuous delivery is vitally important in modern architectures/ops
• Container images must be the (single) source of truth within pipeline
• Mechanical sympathy is important (assert properties in the pipeline)
• We’re now bundling more responsibility into our artifact (e.g. an OS)
• Not all developers are operationally aware
• The tooling is now becoming stable/mature
• We need to re-apply old CD practices with new technologies/tooling
15/12/2016 @danielbryantuk
Bedtime reading
15/12/2016 @danielbryantuk
Thanks for listening
• Any questions?
• Feel free to contact me
• @danielbryantuk
• daniel.bryant@opencredo.com
15/12/2016 @danielbryantuk

O'Reilly/Nginx 2016: "Continuous Delivery with Containers: The Trials and Tribulations"

  • 1.
    Continuous Delivery forContainerized Applications: The Trials and Tribulations Daniel Bryant @danielbryantuk
  • 2.
    Setting the scene… •Continuous delivery is a large topic • Focusing on the process and tooling • No live coding today • Mini-book contains more details • “Building a CD pipeline” by Adrian and Kevin 15/12/2016 @danielbryantuk
  • 3.
    TL;DR – Containersand CD • Container image becomes the build pipeline ‘single binary’ • Adding metadata to containers images is vital • Must validate container constraints (NFRs) • Cultivate containerised ‘mechanical sympathy’ 15/12/2016 @danielbryantuk
  • 4.
    @danielbryantuk • Chief Scientistat OpenCredo, CTO at SpectoLabs • Agile, architecture, CI/CD, DevOps • Java, Go, JS, microservices, cloud, containers • Leading change through the application of technology and teams 15/12/2016 @danielbryantuk
  • 5.
  • 6.
    Continuous Delivery • Producevaluable and robust software in short cycles • Optimising for feedback and learning • Not (necessarily) Continuous Deployment 15/12/2016 @danielbryantuk
  • 7.
    Creation of abuild pipeline is mandatory for continuous delivery 15/12/2016 @danielbryantuk
  • 8.
  • 9.
    The Impact ofcontainers on CD 15/12/2016 @danielbryantuk
  • 10.
    Container technology (andCD) • OS-level virtualisation • cgroups, namespaces, rootfs • Package and execute software • Container image == ‘single binary’ 15/12/2016 @danielbryantuk
  • 11.
  • 12.
  • 13.
    Creating a pipelinefor containers 15/12/2016 @danielbryantuk
  • 14.
  • 15.
    Make your devenvironment like production • Develop locally or copy/code in container • Use base images from production • Must build/test containers locally • Perform (at least) happy path tests • All tests should be runnable locally 15/12/2016 @danielbryantuk
  • 16.
    Lesson learned: Dockerfilecontent is super important • OS choice • Configuration • Build artifacts • Exposing ports • Java • JDK vs JRE and Oracle vs OpenJDK • Golang • Statically compiled binary • Python • Virtualenv 15/12/2016 @danielbryantuk
  • 17.
    Please talk tothe sysadmin people: Their operational knowledge is invaluable 15/12/2016 @danielbryantuk
  • 18.
    Different prod andtest containers? • Create “test” version of container • Full OS (e.g. Ubuntu) • Test tools and data • Easy to see app/configuration drift • Use test sidecar containers instead • ONTEST proposal by Alexi Ledenev 15/12/2016 @danielbryantuk http://blog.terranillius.com/post/docker_testing/
  • 19.
  • 20.
    Building images withJenkins • My report covers this • Build as usual… • Build Docker Image • Cloudbees Docker Build and Publish Plugin • Push image to registry 15/12/2016 @danielbryantuk
  • 21.
    Storing in animage registry (DockerHub) 15/12/2016 @danielbryantuk
  • 22.
    Lesson learned: Metadatais valuable • Application metadata • Version / GIT SHA • Build metadata • Build date • Image name • Vendor • Quality metadata • QA control • Security audited etc 15/12/2016 @danielbryantuk
  • 23.
    Metadata – Bewareof “latest” Docker Tag • Beware of the ‘latest’ Docker tag • “Latest” simply means • the last build/tag that ran without a specific tag/version specified • Ignore “latest” tag • Version your tags, every time • Danielbryantuk/test:2.4.1 15/12/2016 @danielbryantuk
  • 24.
    Metadata - AddingLabels at build time • Docker Labels • Add key/value data to image 15/12/2016 @danielbryantuk
  • 25.
    Metadata - AddingLabels at build time • Microscaling Systems’ Makefile • Labelling automated builds on DockerHub (h/t Ross Fairbanks) • Create file /hooks/build • label-schema.org • microbadger.com 15/12/2016 @danielbryantuk
  • 26.
    Metadata - AddingLabels at runtime 15/12/2016 @danielbryantuk $ docker run -d --label uk.co.danielbryant.lbname=frontdoor nginx • Can ’docker commit’, but creates new image • Not possible to update running container • Docker Proposal: Update labels #21721
  • 27.
  • 28.
  • 29.
    Testing: Jenkins Pipeline(as code) 15/12/2016 @danielbryantuk
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
    Docker Compose &Jenkins Pipeline 15/12/2016 @danielbryantuk
  • 35.
    Mechanical sympathy: Dockerand Java • Watch for cgroup limits (and cgroup awareness) • getAvailableProcessors issue (bugs.openjdk.java.net/browse/JDK-8140793) • Default fork/join thread pool sizes (based from host CPU count) • Set container memory appropriately • JVM requirements = Heap size (Xmx) + Metaspace + JVM overhead • Account for native thread requirements e.g. thread stack size (Xss) • Entropy • Host entropy can soon be exhausted by crypto operations 15/12/2016 @danielbryantuk | @spoole167 35
  • 36.
    Mechanical sympathy: Dockerand security 15/12/2016 @danielbryantuk
  • 37.
    Containers are nota silver bullet 15/12/2016 @danielbryantuk
  • 38.
    Containers: Expectations versusreality 15/12/2016 @danielbryantuk “DevOps”
  • 39.
    Containerise an existing(monolithic) app? • For • We know the monolith well • Allows homogenization of the pipeline and deployment platform • Can be a demonstrable win for tech and the business • Against • Can be difficult (100+ line scripts) • Often not designed for operation within containers, nor cloud native • Putting lipstick on a pig? 15/12/2016 @danielbryantuk
  • 40.
    Whatever you decide… pushit through the pipeline ASAP! 15/12/2016 @danielbryantuk
  • 41.
    Key lessons learned •Conduct an architectural review • Architecture for Developers, by Simon Brown • Architecture Interview, by Susan Fowler • Look for data ingress/egress • File system access • Support resource constraints/transience • Optimise for quick startup and shutdown • Evaluate approach to concurrency • Store configuration (secrets) remotely 15/12/2016 @danielbryantuk
  • 42.
    New design patterns 15/12/2016@danielbryantuk bit.ly/2efe0TP
  • 43.
    Microservices… Containers and microservicesare complementary Testing and deployment change 15/12/2016 @danielbryantuk https://specto.io/blog/recipe-for-designing-building-testing-microservices.html
  • 44.
  • 45.
  • 46.
  • 47.
    Microservice architectural impacton CD • Application decomposition • Bounded context • Change cadence • Risk • Performance • Scalability • Team location h/t Matthew Skelton, Adam Tornhill • Worth knowing about: • Consumer-based contracts • Service virtualisation • Synthetic transactions and semantic monitoring 15/12/2016 @danielbryantuk
  • 48.
    Using containers doesnot obviate the need for good architectural practices 15/12/2016 @danielbryantuk
  • 49.
  • 50.
  • 51.
    In summary • Continuousdelivery is vitally important in modern architectures/ops • Container images must be the (single) source of truth within pipeline • Mechanical sympathy is important (assert properties in the pipeline) • We’re now bundling more responsibility into our artifact (e.g. an OS) • Not all developers are operationally aware • The tooling is now becoming stable/mature • We need to re-apply old CD practices with new technologies/tooling 15/12/2016 @danielbryantuk
  • 52.
  • 53.
    Thanks for listening •Any questions? • Feel free to contact me • @danielbryantuk • daniel.bryant@opencredo.com 15/12/2016 @danielbryantuk