SlideShare una empresa de Scribd logo
1 de 33
How Honestbee Does CI/CD On Kubernetes
Honestbee
@vincentdesmet
$ whoami
DevOps at Honestbee
tech.honestbee.com
@vincentdesmet / github.com/so0k
Singapore-Kubernetes-User-Group
Cloud-Native-Singapore
What is Honestbee?
Overview
- Honestbee technology choices
- Containers
- Kubernetes
- Helm
- Vault
What are Containers?
● Packages up software binaries & dependencies
● Immutable & testable
● Isolate software from each other
● Portable across environments
a self-contained process
ref: kubernetes-comic
Why Containers?
image: ruby:2.1
services:
- postgres
stages:
- Build
- Test
- Staging
- Production
...
source: GitLab CI
Lightweight
Reproducible builds
Versioning
$ make get-tags-prod
getting apse1a tag:
master-ebf3205b
getting apse1b tag:
master-ebf3205b
$ make get-tags-staging
getting apse1a tag:
staging-98a2aa4f
getting apse1b tag:
staging-98a2aa4f
latest is not a version
More than just packing and
Isolation
- Scheduling: Where should the containers run?
- Resource Optimisation: How much resources does each container
really need?
- Monitoring: What’s happening with the containers?
- Lifecycle and health: Keep containers running despite failures
- Auth{n,z}: Control who can do what with the containers?
- Scaling: Handle higher load by adding more instances
- Discovery: How can I connect to the containers?
- …
Source
ref: kubernetes-comic
origin story
Star Trek?
1
2
3
4
5
6
7
Version 1: sed
kube-install: update-manifests
kubectl create -f manifests/${SHORT_NAME}-deployment.tmp.yaml
kube-update: update-manifests
kubectl patch deployment ${SHORT_NAME} -p
'{"spec":{"template":{"spec":{"containers":[{"name":"'"${SHORT_NAME}"'","image":"'"$
{IMAGE}"'"}]}}}}'
update-manifests:
@sed 's#(image:) .*#1 $(IMAGE)#' manifests/${SHORT_NAME}-deployment.yaml
> manifests/${SHORT_NAME}-deployment.tmp.yaml
Version 2: jinja
$ kubectl get deploy -l release=backend
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE
backend-admin 16 16 16 16
backend-core 32 32 32 32
backend-core-bee 10 10 10 10
backend-karafka 1 1 1 1
backend-scheduler 1 1 1 1
backend-worker-all 8 8 8 8
backend-worker-critical 2 2 2 2
backend-worker-food-import 1 1 1 1
backend-worker-high 2 2 2 2
backend-worker-low 12 12 12 12
$ kubectl get hpa -l release=backend
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
backend-admin Deployment/backend-admin 9% / 70% 16 24 16
backend-core Deployment/backend-core 28% / 70% 32 48 32
backend-core-bee Deployment/backend-core-bee 20% / 80% 10 16 10
$ kubectl get scheduledscaler -l release=backend
NAME AGE
backend-admin 9d
backend-core 9d
backend-core-bee 9d
Different requirements
Kubernetes Deployment
challenges
- Each application has multiple components
- Every component has its own k8s resources
How to:
- Deploy, Manage, Edit and Update multiple k8s configurations
- Deploy multiple k8s configurations as a single application
- Parameterise and support multiple environments
- Manage application releases: rollout, rollback, history, ...
- ...
apiVersion: apps/v1beta1
kind: Deployment
metadata:
labels:
app: backend
component: service-core
name: backend-core
spec:
replicas: 32
...
template:
...
spec:
containers:
- env:
- name: NEW_RELIC_APP
value: backend-core-apse1a;backend-core
...
image: myregistry/backend:master-ebf3205b
volumeMounts:
- mountPath: /app/config/application.yml
name: backend-config
subPath: application.yml
volumes:
- name: backend-config
secret:
items:
- key: config
apiVersion: apps/v1beta1
kind: Deployment
metadata:
labels:
app: backend
component: scheduler
name: backend-scheduler
spec:
replicas: 1
...
template:
...
spec:
containers:
- command:
- bin/rake
- resque:scheduler
env:
- name: NEW_RELIC_APP
...
image: myregistry/backend:master-ebf3205b
volumeMounts:
- mountPath: /app/config/application.yml
name: backend-config
subPath: application.yml
volumes:
- name: backend-config
secret:
items:
- key: config
Helm
Package Manager for Kubernetes
- Aims to provide Apt/Yum/Homebrew User Experience
- Ensure collaboration
- Shareable Packages
Deployment Manager
- Repeatable deployments
- Manage multiple configurations
- Update, Rollback and test application deployments
Chart, Repositories, Releases
- Chart: “Package”, “Bundle”
- Repository: Package Repository
- Release: Installed Chart (same chart can be installed multiple times)
Helm Charts
Render(Templates + Values) = Release
Templates:
- The Go Template language: {{ .foo | quote }}
- Variables, simple control structures (looping, conditionals, ... )
- 50+ functions from Go/Sprig template libraries ...
{{- range $api_name, $api := .Values.api.types }}
{{- if gt $api.replicas 0.0 -}}
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" $ }}-{{ $api_name }}
labels: {{ include "labels.standard" $ | indent 4 }}
component: service-{{ $api_name }}
spec:
replicas: {{ $api.replicas }}
...
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: {{ template "fullname" $ }}-{{ $api_name }}
labels: {{ include "labels.standard" $ | indent 4 }}
component: {{ $api_name }}-service
spec:
scaleTargetRef:
apiVersion: apps/v1beta1
kind: Deployment
name: {{ template "fullname" $ }}-{{ $api_name }}
minReplicas: {{ $api.autoscaling.min }}
maxReplicas: {{ $api.autoscaling.max }}
targetCPUUtilizationPercentage: {{ $api.autoscaling.cpuTarget }}
---
{{- with $api.autoscaling.steps }}
apiVersion: "scaling.k8s.restdev.com/v1alpha1"
kind: ScheduledScaler
...
steps:
{{ toYaml . | indent 2 }}
{{- end }}
---
{{ end -}}
api:
types:
admin:
autoscaling:
min: 4
max: 12
cpuTarget: 70
steps:
- runat: '0 30 11 * * *'
mode: range
minReplicas: 8 # 11:30am: pre-lunch schedule
maxReplicas: 12
...
resources:
limits:
cpu: 2
memory: 6Gi
requests:
cpu: 2
memory: 6Gi
config:
admin-panel-enabled: true
url: foo.honestbee.com
core-bee:
autoscaling:
min: 2
max: 16
cpuTarget: 80
steps:
- runat: '0 00 08 * * *'
mode: range
minReplicas: 4 # 08:00am: day schedule
maxReplicas: 16
Easy to manage deployments
$ helm install backend --values production.yaml
$ helm history backend
REVISION UPDATED STATUS CHART DESCRIPTION
110 Tue Apr 24 17:53 SUPERSEDED backend-2.0.7 Upgrade complete
111 Wed Apr 25 10:53 SUPERSEDED backend-2.0.7 Upgrade complete
112 Wed Apr 25 14:58 SUPERSEDED backend-2.0.7 Upgrade complete
113 Wed Apr 25 15:02 SUPERSEDED backend-2.0.7 Upgrade complete
...
$ helm rollback backend 112
Helm Values
Define your application configuration per environment!
- Should be source controlled
- roboll/helmfile
- skuid/helm-value-store
- Should not contain secrets
SECRETS
Public Charts hub.kubeapps.com
Private Chart
Repository
Honestbee: Version 1
- Self-host:
- Using s3 Bucket + VPC endpoint
- CI/CD:
- Package
- Generate Index
- Push to s3
articles/devops/2017-07/drone-helm-
repository
resource "aws_s3_bucket" "b" {
bucket = "${var.bucket_name_prefix}.${var.domain_name}"
policy = "${data.aws_iam_policy_document.s3-read.json}"
website {
index_document = "index.html"
}
cors_rule {
allowed_headers = ["*"]
allowed_methods = ["PUT", "POST"]
allowed_origins = [
"https://${var.bucket_name_prefix}.${var.domain_name}",
]
}
}
data "aws_iam_policy_document" "s3-read" {
statement {
sid = "Access-from-specific-VPC-only"
effect = "Allow"
actions = [ "s3:GetObject" ]
resources = [
"arn:aws:s3:::${var.bucket_name_prefix}.${var.domain_name}/*",
]
condition {
test = "StringEquals"
variable = "aws:sourceVpce"
values = [ "${values(data.terraform_remote_state.kops-
state.vpc_endpoint)}",
]
}
}
}
Integration with CI/CD
Private Chart Repository
Honestbee Version 2:
- Use ChartMuseum
- CI/CD:
- Package and push
honestbee/drone-chartmuseum
ChartMuseum is an open-source Helm Chart Repository written in Go (Golang), with support for cloud
storage backends, including Google Cloud Storage and Amazon S3.
Works as a valid Helm Chart Repository, and also provides an API for uploading new chart packages to
storage etc.
Secrets?
Vault + VaultController
- Hashicorp Vault
- Supports k8s auth
- roboll/kube-vault-controller
- Add k8s custom resource: secretClaim
kind: SecretClaim
apiVersion: vaultproject.io/v1
metadata:
name: {{ template "fullname" . }}
labels:
{{- include "labels.standard" . | indent 4 }}
spec:
type: Opaque
path: "secret/{{ .Values.env }}/{{ .Release.Name }}"
renew: 3900
Join us https://careers.honestbee.com/departments/engineering/
How Honestbee Does CI/CD on Kubernetes - Vincent DeSmet

Más contenido relacionado

La actualidad más candente

Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)
Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)
Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)Matt Butcher
 
Devoxx UK 2018 - A cloud application journey with helm and kubernetes
Devoxx UK 2018 - A cloud application journey with helm and kubernetesDevoxx UK 2018 - A cloud application journey with helm and kubernetes
Devoxx UK 2018 - A cloud application journey with helm and kubernetesAna-Maria Mihalceanu
 
Manage Kubernetes application complexity with Helm
Manage Kubernetes application complexity with HelmManage Kubernetes application complexity with Helm
Manage Kubernetes application complexity with HelmAnnie Talvasto
 
Cooking with OpenStack Heat
Cooking with OpenStack HeatCooking with OpenStack Heat
Cooking with OpenStack HeatEric Williams
 
Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and...
 Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and... Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and...
Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and...Codefresh
 
Eric Williams (Rackspace) - Using Heat on OpenStack
Eric Williams (Rackspace) - Using Heat on OpenStackEric Williams (Rackspace) - Using Heat on OpenStack
Eric Williams (Rackspace) - Using Heat on OpenStackOutlyer
 
Kubeflow Control Plane 中文
Kubeflow Control Plane 中文Kubeflow Control Plane 中文
Kubeflow Control Plane 中文Weiqiang Zhuang
 
Paul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLON
Paul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLONPaul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLON
Paul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLONOutlyer
 
Developingapiplug insforcs-151112204727-lva1-app6891
Developingapiplug insforcs-151112204727-lva1-app6891Developingapiplug insforcs-151112204727-lva1-app6891
Developingapiplug insforcs-151112204727-lva1-app6891NetApp
 
Concourse - CI for the cloud
Concourse - CI for the cloudConcourse - CI for the cloud
Concourse - CI for the cloudJohannes Rudolph
 
Terraform -- Infrastructure as Code
Terraform -- Infrastructure as CodeTerraform -- Infrastructure as Code
Terraform -- Infrastructure as CodeMartin Schütte
 
Immutable infrastructure with Terraform
Immutable infrastructure with TerraformImmutable infrastructure with Terraform
Immutable infrastructure with TerraformPrashant Kalkar
 
DevOps with Azure, Kubernetes, and Helm Webinar
DevOps with Azure, Kubernetes, and Helm WebinarDevOps with Azure, Kubernetes, and Helm Webinar
DevOps with Azure, Kubernetes, and Helm WebinarCodefresh
 
Best Practice for Deploying Application with Heat
Best Practice for Deploying Application with HeatBest Practice for Deploying Application with Heat
Best Practice for Deploying Application with HeatEthan Lynn
 
Debugging Go in Kubernetes
Debugging Go in KubernetesDebugging Go in Kubernetes
Debugging Go in KubernetesAlexei Ledenev
 

La actualidad más candente (20)

Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)
Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)
Kubernetes Helm (Boulder Kubernetes Meetup, June 2016)
 
Devoxx UK 2018 - A cloud application journey with helm and kubernetes
Devoxx UK 2018 - A cloud application journey with helm and kubernetesDevoxx UK 2018 - A cloud application journey with helm and kubernetes
Devoxx UK 2018 - A cloud application journey with helm and kubernetes
 
Manage Kubernetes application complexity with Helm
Manage Kubernetes application complexity with HelmManage Kubernetes application complexity with Helm
Manage Kubernetes application complexity with Helm
 
Cooking with OpenStack Heat
Cooking with OpenStack HeatCooking with OpenStack Heat
Cooking with OpenStack Heat
 
Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and...
 Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and... Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and...
Updating Kubernetes With Helm Charts: Build, Test, Deploy with Codefresh and...
 
Eric Williams (Rackspace) - Using Heat on OpenStack
Eric Williams (Rackspace) - Using Heat on OpenStackEric Williams (Rackspace) - Using Heat on OpenStack
Eric Williams (Rackspace) - Using Heat on OpenStack
 
Kubeflow control plane
Kubeflow control planeKubeflow control plane
Kubeflow control plane
 
Kubeflow Control Plane 中文
Kubeflow Control Plane 中文Kubeflow Control Plane 中文
Kubeflow Control Plane 中文
 
Kubeflow repos
Kubeflow reposKubeflow repos
Kubeflow repos
 
Running Cloudbreak on Kubernetes
Running Cloudbreak on KubernetesRunning Cloudbreak on Kubernetes
Running Cloudbreak on Kubernetes
 
Paul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLON
Paul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLONPaul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLON
Paul Angus (ShapeBlue) - Push infrastructure with Ansible #DOXLON
 
Developingapiplug insforcs-151112204727-lva1-app6891
Developingapiplug insforcs-151112204727-lva1-app6891Developingapiplug insforcs-151112204727-lva1-app6891
Developingapiplug insforcs-151112204727-lva1-app6891
 
Concourse - CI for the cloud
Concourse - CI for the cloudConcourse - CI for the cloud
Concourse - CI for the cloud
 
Helm
HelmHelm
Helm
 
Terraform -- Infrastructure as Code
Terraform -- Infrastructure as CodeTerraform -- Infrastructure as Code
Terraform -- Infrastructure as Code
 
Immutable infrastructure with Terraform
Immutable infrastructure with TerraformImmutable infrastructure with Terraform
Immutable infrastructure with Terraform
 
DevOps with Azure, Kubernetes, and Helm Webinar
DevOps with Azure, Kubernetes, and Helm WebinarDevOps with Azure, Kubernetes, and Helm Webinar
DevOps with Azure, Kubernetes, and Helm Webinar
 
Best Practice for Deploying Application with Heat
Best Practice for Deploying Application with HeatBest Practice for Deploying Application with Heat
Best Practice for Deploying Application with Heat
 
Optimized Hive replication
Optimized Hive replicationOptimized Hive replication
Optimized Hive replication
 
Debugging Go in Kubernetes
Debugging Go in KubernetesDebugging Go in Kubernetes
Debugging Go in Kubernetes
 

Similar a How Honestbee Does CI/CD on Kubernetes - Vincent DeSmet

GitOps & the deployment branching models - DevOps D-day Marseille 2021
GitOps & the deployment branching models - DevOps D-day Marseille 2021GitOps & the deployment branching models - DevOps D-day Marseille 2021
GitOps & the deployment branching models - DevOps D-day Marseille 2021SoKube
 
k8s practice 2023.pptx
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptxwonyong hwang
 
Drupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google Cloud
Drupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google CloudDrupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google Cloud
Drupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google CloudDropsolid
 
Kubernetes - training micro-dragons without getting burnt
Kubernetes -  training micro-dragons without getting burntKubernetes -  training micro-dragons without getting burnt
Kubernetes - training micro-dragons without getting burntAmir Moghimi
 
Kube Your Enthusiasm
Kube Your EnthusiasmKube Your Enthusiasm
Kube Your EnthusiasmVMware Tanzu
 
Kube Your Enthusiasm - Paul Czarkowski
Kube Your Enthusiasm - Paul CzarkowskiKube Your Enthusiasm - Paul Czarkowski
Kube Your Enthusiasm - Paul CzarkowskiVMware Tanzu
 
CERN OpenStack Cloud Control Plane - From VMs to K8s
CERN OpenStack Cloud Control Plane - From VMs to K8sCERN OpenStack Cloud Control Plane - From VMs to K8s
CERN OpenStack Cloud Control Plane - From VMs to K8sBelmiro Moreira
 
ContainerDayVietnam2016: Docker for JS Developer
ContainerDayVietnam2016: Docker for JS DeveloperContainerDayVietnam2016: Docker for JS Developer
ContainerDayVietnam2016: Docker for JS DeveloperDocker-Hanoi
 
Kubernetes @ Nanit
Kubernetes @ NanitKubernetes @ Nanit
Kubernetes @ NanitChen Fisher
 
Web scale infrastructures with kubernetes and flannel
Web scale infrastructures with kubernetes and flannelWeb scale infrastructures with kubernetes and flannel
Web scale infrastructures with kubernetes and flannelpurpleocean
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesRobert Lemke
 
Kubernetes @ Nanit by Chen Fisher
Kubernetes @ Nanit by Chen FisherKubernetes @ Nanit by Chen Fisher
Kubernetes @ Nanit by Chen FisherDoiT International
 
Kubernetes for the PHP developer
Kubernetes for the PHP developerKubernetes for the PHP developer
Kubernetes for the PHP developerPaul Czarkowski
 
Exploring the Future of Helm
Exploring the Future of HelmExploring the Future of Helm
Exploring the Future of HelmMatthew Farina
 
Containerizing your Security Operations Center
Containerizing your Security Operations CenterContainerizing your Security Operations Center
Containerizing your Security Operations CenterJimmy Mesta
 
CI / CD / CS - Continuous Security in Kubernetes
CI / CD / CS - Continuous Security in KubernetesCI / CD / CS - Continuous Security in Kubernetes
CI / CD / CS - Continuous Security in KubernetesSysdig
 
Introducing Koki Short
Introducing Koki ShortIntroducing Koki Short
Introducing Koki ShortSidhartha Mani
 
Kubernetes Architecture and Introduction – Paris Kubernetes Meetup
Kubernetes Architecture and Introduction – Paris Kubernetes MeetupKubernetes Architecture and Introduction – Paris Kubernetes Meetup
Kubernetes Architecture and Introduction – Paris Kubernetes MeetupStefan Schimanski
 

Similar a How Honestbee Does CI/CD on Kubernetes - Vincent DeSmet (20)

GitOps & the deployment branching models - DevOps D-day Marseille 2021
GitOps & the deployment branching models - DevOps D-day Marseille 2021GitOps & the deployment branching models - DevOps D-day Marseille 2021
GitOps & the deployment branching models - DevOps D-day Marseille 2021
 
k8s practice 2023.pptx
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptx
 
Drupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google Cloud
Drupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google CloudDrupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google Cloud
Drupaljam 2017 - Deploying Drupal 8 onto Hosted Kubernetes in Google Cloud
 
Kubernetes - training micro-dragons without getting burnt
Kubernetes -  training micro-dragons without getting burntKubernetes -  training micro-dragons without getting burnt
Kubernetes - training micro-dragons without getting burnt
 
Kube Your Enthusiasm
Kube Your EnthusiasmKube Your Enthusiasm
Kube Your Enthusiasm
 
Kube Your Enthusiasm - Paul Czarkowski
Kube Your Enthusiasm - Paul CzarkowskiKube Your Enthusiasm - Paul Czarkowski
Kube Your Enthusiasm - Paul Czarkowski
 
CERN OpenStack Cloud Control Plane - From VMs to K8s
CERN OpenStack Cloud Control Plane - From VMs to K8sCERN OpenStack Cloud Control Plane - From VMs to K8s
CERN OpenStack Cloud Control Plane - From VMs to K8s
 
ContainerDayVietnam2016: Docker for JS Developer
ContainerDayVietnam2016: Docker for JS DeveloperContainerDayVietnam2016: Docker for JS Developer
ContainerDayVietnam2016: Docker for JS Developer
 
Kubernetes @ Nanit
Kubernetes @ NanitKubernetes @ Nanit
Kubernetes @ Nanit
 
Web scale infrastructures with kubernetes and flannel
Web scale infrastructures with kubernetes and flannelWeb scale infrastructures with kubernetes and flannel
Web scale infrastructures with kubernetes and flannel
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in Kubernetes
 
Kubernetes @ Nanit by Chen Fisher
Kubernetes @ Nanit by Chen FisherKubernetes @ Nanit by Chen Fisher
Kubernetes @ Nanit by Chen Fisher
 
Kubernetes for the PHP developer
Kubernetes for the PHP developerKubernetes for the PHP developer
Kubernetes for the PHP developer
 
Dockers zero to hero
Dockers zero to heroDockers zero to hero
Dockers zero to hero
 
Helm @ Orchestructure
Helm @ OrchestructureHelm @ Orchestructure
Helm @ Orchestructure
 
Exploring the Future of Helm
Exploring the Future of HelmExploring the Future of Helm
Exploring the Future of Helm
 
Containerizing your Security Operations Center
Containerizing your Security Operations CenterContainerizing your Security Operations Center
Containerizing your Security Operations Center
 
CI / CD / CS - Continuous Security in Kubernetes
CI / CD / CS - Continuous Security in KubernetesCI / CD / CS - Continuous Security in Kubernetes
CI / CD / CS - Continuous Security in Kubernetes
 
Introducing Koki Short
Introducing Koki ShortIntroducing Koki Short
Introducing Koki Short
 
Kubernetes Architecture and Introduction – Paris Kubernetes Meetup
Kubernetes Architecture and Introduction – Paris Kubernetes MeetupKubernetes Architecture and Introduction – Paris Kubernetes Meetup
Kubernetes Architecture and Introduction – Paris Kubernetes Meetup
 

Más de DevOpsDaysJKT

Migrating to Openshift - Reyhan Fabianto
Migrating to Openshift - Reyhan FabiantoMigrating to Openshift - Reyhan Fabianto
Migrating to Openshift - Reyhan FabiantoDevOpsDaysJKT
 
The Universe as Code - Dave Kerr
The Universe as Code - Dave KerrThe Universe as Code - Dave Kerr
The Universe as Code - Dave KerrDevOpsDaysJKT
 
Not a DevOps talk - Coté
Not a DevOps talk - CotéNot a DevOps talk - Coté
Not a DevOps talk - CotéDevOpsDaysJKT
 
The State Of DevOps 2018 - Matt Ray
The State Of DevOps 2018 - Matt RayThe State Of DevOps 2018 - Matt Ray
The State Of DevOps 2018 - Matt RayDevOpsDaysJKT
 
Scrum around the world - Red Tangerine
Scrum around the world - Red TangerineScrum around the world - Red Tangerine
Scrum around the world - Red TangerineDevOpsDaysJKT
 
Healthy DevOps - Masto Sitorus
Healthy DevOps - Masto SitorusHealthy DevOps - Masto Sitorus
Healthy DevOps - Masto SitorusDevOpsDaysJKT
 
DevOps Practice in Nonprofit - Abdurrachman Mappuji
DevOps Practice in Nonprofit - Abdurrachman MappujiDevOps Practice in Nonprofit - Abdurrachman Mappuji
DevOps Practice in Nonprofit - Abdurrachman MappujiDevOpsDaysJKT
 
Dockerize Your Web Application Stack - Salman El Farisi
Dockerize Your Web Application Stack -  Salman El FarisiDockerize Your Web Application Stack -  Salman El Farisi
Dockerize Your Web Application Stack - Salman El FarisiDevOpsDaysJKT
 
DevOps Adoption: Challenges & Opportunities
DevOps Adoption: Challenges & OpportunitiesDevOps Adoption: Challenges & Opportunities
DevOps Adoption: Challenges & OpportunitiesDevOpsDaysJKT
 
Batch size matter - Thomas Rothe
Batch size matter - Thomas Rothe Batch size matter - Thomas Rothe
Batch size matter - Thomas Rothe DevOpsDaysJKT
 
DevOpsDays Jakarta Igites
DevOpsDays Jakarta IgitesDevOpsDays Jakarta Igites
DevOpsDays Jakarta IgitesDevOpsDaysJKT
 

Más de DevOpsDaysJKT (11)

Migrating to Openshift - Reyhan Fabianto
Migrating to Openshift - Reyhan FabiantoMigrating to Openshift - Reyhan Fabianto
Migrating to Openshift - Reyhan Fabianto
 
The Universe as Code - Dave Kerr
The Universe as Code - Dave KerrThe Universe as Code - Dave Kerr
The Universe as Code - Dave Kerr
 
Not a DevOps talk - Coté
Not a DevOps talk - CotéNot a DevOps talk - Coté
Not a DevOps talk - Coté
 
The State Of DevOps 2018 - Matt Ray
The State Of DevOps 2018 - Matt RayThe State Of DevOps 2018 - Matt Ray
The State Of DevOps 2018 - Matt Ray
 
Scrum around the world - Red Tangerine
Scrum around the world - Red TangerineScrum around the world - Red Tangerine
Scrum around the world - Red Tangerine
 
Healthy DevOps - Masto Sitorus
Healthy DevOps - Masto SitorusHealthy DevOps - Masto Sitorus
Healthy DevOps - Masto Sitorus
 
DevOps Practice in Nonprofit - Abdurrachman Mappuji
DevOps Practice in Nonprofit - Abdurrachman MappujiDevOps Practice in Nonprofit - Abdurrachman Mappuji
DevOps Practice in Nonprofit - Abdurrachman Mappuji
 
Dockerize Your Web Application Stack - Salman El Farisi
Dockerize Your Web Application Stack -  Salman El FarisiDockerize Your Web Application Stack -  Salman El Farisi
Dockerize Your Web Application Stack - Salman El Farisi
 
DevOps Adoption: Challenges & Opportunities
DevOps Adoption: Challenges & OpportunitiesDevOps Adoption: Challenges & Opportunities
DevOps Adoption: Challenges & Opportunities
 
Batch size matter - Thomas Rothe
Batch size matter - Thomas Rothe Batch size matter - Thomas Rothe
Batch size matter - Thomas Rothe
 
DevOpsDays Jakarta Igites
DevOpsDays Jakarta IgitesDevOpsDays Jakarta Igites
DevOpsDays Jakarta Igites
 

Último

"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 

Último (20)

"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 

How Honestbee Does CI/CD on Kubernetes - Vincent DeSmet

  • 1. How Honestbee Does CI/CD On Kubernetes Honestbee @vincentdesmet
  • 2. $ whoami DevOps at Honestbee tech.honestbee.com @vincentdesmet / github.com/so0k Singapore-Kubernetes-User-Group Cloud-Native-Singapore
  • 4. Overview - Honestbee technology choices - Containers - Kubernetes - Helm - Vault
  • 5. What are Containers? ● Packages up software binaries & dependencies ● Immutable & testable ● Isolate software from each other ● Portable across environments a self-contained process ref: kubernetes-comic
  • 6. Why Containers? image: ruby:2.1 services: - postgres stages: - Build - Test - Staging - Production ... source: GitLab CI Lightweight Reproducible builds
  • 7. Versioning $ make get-tags-prod getting apse1a tag: master-ebf3205b getting apse1b tag: master-ebf3205b $ make get-tags-staging getting apse1a tag: staging-98a2aa4f getting apse1b tag: staging-98a2aa4f latest is not a version
  • 8.
  • 9. More than just packing and Isolation - Scheduling: Where should the containers run? - Resource Optimisation: How much resources does each container really need? - Monitoring: What’s happening with the containers? - Lifecycle and health: Keep containers running despite failures - Auth{n,z}: Control who can do what with the containers? - Scaling: Handle higher load by adding more instances - Discovery: How can I connect to the containers? - … Source
  • 13.
  • 14. Version 1: sed kube-install: update-manifests kubectl create -f manifests/${SHORT_NAME}-deployment.tmp.yaml kube-update: update-manifests kubectl patch deployment ${SHORT_NAME} -p '{"spec":{"template":{"spec":{"containers":[{"name":"'"${SHORT_NAME}"'","image":"'"$ {IMAGE}"'"}]}}}}' update-manifests: @sed 's#(image:) .*#1 $(IMAGE)#' manifests/${SHORT_NAME}-deployment.yaml > manifests/${SHORT_NAME}-deployment.tmp.yaml
  • 16. $ kubectl get deploy -l release=backend NAME DESIRED CURRENT UP-TO-DATE AVAILABLE backend-admin 16 16 16 16 backend-core 32 32 32 32 backend-core-bee 10 10 10 10 backend-karafka 1 1 1 1 backend-scheduler 1 1 1 1 backend-worker-all 8 8 8 8 backend-worker-critical 2 2 2 2 backend-worker-food-import 1 1 1 1 backend-worker-high 2 2 2 2 backend-worker-low 12 12 12 12 $ kubectl get hpa -l release=backend NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS backend-admin Deployment/backend-admin 9% / 70% 16 24 16 backend-core Deployment/backend-core 28% / 70% 32 48 32 backend-core-bee Deployment/backend-core-bee 20% / 80% 10 16 10 $ kubectl get scheduledscaler -l release=backend NAME AGE backend-admin 9d backend-core 9d backend-core-bee 9d
  • 18. Kubernetes Deployment challenges - Each application has multiple components - Every component has its own k8s resources How to: - Deploy, Manage, Edit and Update multiple k8s configurations - Deploy multiple k8s configurations as a single application - Parameterise and support multiple environments - Manage application releases: rollout, rollback, history, ... - ...
  • 19. apiVersion: apps/v1beta1 kind: Deployment metadata: labels: app: backend component: service-core name: backend-core spec: replicas: 32 ... template: ... spec: containers: - env: - name: NEW_RELIC_APP value: backend-core-apse1a;backend-core ... image: myregistry/backend:master-ebf3205b volumeMounts: - mountPath: /app/config/application.yml name: backend-config subPath: application.yml volumes: - name: backend-config secret: items: - key: config apiVersion: apps/v1beta1 kind: Deployment metadata: labels: app: backend component: scheduler name: backend-scheduler spec: replicas: 1 ... template: ... spec: containers: - command: - bin/rake - resque:scheduler env: - name: NEW_RELIC_APP ... image: myregistry/backend:master-ebf3205b volumeMounts: - mountPath: /app/config/application.yml name: backend-config subPath: application.yml volumes: - name: backend-config secret: items: - key: config
  • 20. Helm Package Manager for Kubernetes - Aims to provide Apt/Yum/Homebrew User Experience - Ensure collaboration - Shareable Packages Deployment Manager - Repeatable deployments - Manage multiple configurations - Update, Rollback and test application deployments
  • 21. Chart, Repositories, Releases - Chart: “Package”, “Bundle” - Repository: Package Repository - Release: Installed Chart (same chart can be installed multiple times)
  • 22. Helm Charts Render(Templates + Values) = Release Templates: - The Go Template language: {{ .foo | quote }} - Variables, simple control structures (looping, conditionals, ... ) - 50+ functions from Go/Sprig template libraries ...
  • 23. {{- range $api_name, $api := .Values.api.types }} {{- if gt $api.replicas 0.0 -}} apiVersion: apps/v1beta1 kind: Deployment metadata: name: {{ template "fullname" $ }}-{{ $api_name }} labels: {{ include "labels.standard" $ | indent 4 }} component: service-{{ $api_name }} spec: replicas: {{ $api.replicas }} ... --- apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: {{ template "fullname" $ }}-{{ $api_name }} labels: {{ include "labels.standard" $ | indent 4 }} component: {{ $api_name }}-service spec: scaleTargetRef: apiVersion: apps/v1beta1 kind: Deployment name: {{ template "fullname" $ }}-{{ $api_name }} minReplicas: {{ $api.autoscaling.min }} maxReplicas: {{ $api.autoscaling.max }} targetCPUUtilizationPercentage: {{ $api.autoscaling.cpuTarget }} --- {{- with $api.autoscaling.steps }} apiVersion: "scaling.k8s.restdev.com/v1alpha1" kind: ScheduledScaler ... steps: {{ toYaml . | indent 2 }} {{- end }} --- {{ end -}} api: types: admin: autoscaling: min: 4 max: 12 cpuTarget: 70 steps: - runat: '0 30 11 * * *' mode: range minReplicas: 8 # 11:30am: pre-lunch schedule maxReplicas: 12 ... resources: limits: cpu: 2 memory: 6Gi requests: cpu: 2 memory: 6Gi config: admin-panel-enabled: true url: foo.honestbee.com core-bee: autoscaling: min: 2 max: 16 cpuTarget: 80 steps: - runat: '0 00 08 * * *' mode: range minReplicas: 4 # 08:00am: day schedule maxReplicas: 16
  • 24. Easy to manage deployments $ helm install backend --values production.yaml $ helm history backend REVISION UPDATED STATUS CHART DESCRIPTION 110 Tue Apr 24 17:53 SUPERSEDED backend-2.0.7 Upgrade complete 111 Wed Apr 25 10:53 SUPERSEDED backend-2.0.7 Upgrade complete 112 Wed Apr 25 14:58 SUPERSEDED backend-2.0.7 Upgrade complete 113 Wed Apr 25 15:02 SUPERSEDED backend-2.0.7 Upgrade complete ... $ helm rollback backend 112
  • 25. Helm Values Define your application configuration per environment! - Should be source controlled - roboll/helmfile - skuid/helm-value-store - Should not contain secrets SECRETS
  • 27. Private Chart Repository Honestbee: Version 1 - Self-host: - Using s3 Bucket + VPC endpoint - CI/CD: - Package - Generate Index - Push to s3 articles/devops/2017-07/drone-helm- repository resource "aws_s3_bucket" "b" { bucket = "${var.bucket_name_prefix}.${var.domain_name}" policy = "${data.aws_iam_policy_document.s3-read.json}" website { index_document = "index.html" } cors_rule { allowed_headers = ["*"] allowed_methods = ["PUT", "POST"] allowed_origins = [ "https://${var.bucket_name_prefix}.${var.domain_name}", ] } } data "aws_iam_policy_document" "s3-read" { statement { sid = "Access-from-specific-VPC-only" effect = "Allow" actions = [ "s3:GetObject" ] resources = [ "arn:aws:s3:::${var.bucket_name_prefix}.${var.domain_name}/*", ] condition { test = "StringEquals" variable = "aws:sourceVpce" values = [ "${values(data.terraform_remote_state.kops- state.vpc_endpoint)}", ] } } }
  • 29. Private Chart Repository Honestbee Version 2: - Use ChartMuseum - CI/CD: - Package and push honestbee/drone-chartmuseum ChartMuseum is an open-source Helm Chart Repository written in Go (Golang), with support for cloud storage backends, including Google Cloud Storage and Amazon S3. Works as a valid Helm Chart Repository, and also provides an API for uploading new chart packages to storage etc.
  • 30. Secrets? Vault + VaultController - Hashicorp Vault - Supports k8s auth - roboll/kube-vault-controller - Add k8s custom resource: secretClaim kind: SecretClaim apiVersion: vaultproject.io/v1 metadata: name: {{ template "fullname" . }} labels: {{- include "labels.standard" . | indent 4 }} spec: type: Opaque path: "secret/{{ .Values.env }}/{{ .Release.Name }}" renew: 3900
  • 31.

Notas del editor

  1. I am focused on the adoption of DevOps culture, improve the agility of the company and improve Developer experience
  2. - How to keep up to speed: Engage, open source projects no longer just adopt but engage And share your success and failures Iterate, start small, and improve
  3. Docker Containers provided a powerful baseline for CI/CD Systems these systems pipelines: Using Docker Images and Containers For reproducible builds and pipelines often fully defined as code (Often the first phase of adopting containers, start with containerizing your CI/CD Pipelines)
  4. http://tech.honestbee.com/articles/devops/2017-07/drone-helm-repository
  5. http://tech.honestbee.com/articles/devops/2017-07/drone-helm-repository