Proprietary + Confidential Proprietary + Confidential Continuous Deployment With Jenkins On Kubernetes
Proprietary + ConfidentialProprietary + Confidential
Continuous DeploymentWith JenkinsOn Kubernetes
A Very Special
Thank You,@vicnastea
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Evan Brown
● Software Engineer, Google
● @evandbrown
Proprietary + ConfidentialProprietary + Confidential
Proprietary + Confidential
Agenda
Deploying Jenkins to Kubernetes
Jenkins Pipelines
Continuous Deployment on Kubernetes
Canary Deployments
How to change text
1. Place cursor on text box and enter new text or copy and paste from another document
Proprietary + ConfidentialProprietary + Confidential
Proprietary + Confidential
Deploying Jenkins
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Deploying Jenkins to Kubernetes
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins Master
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins MasterDefinition
apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: jenkins namespace: jenkinsspec: replicas: 1 template: metadata: labels: app: master spec: containers: - name: master image: jenkins:1.642.4 ports: - containerPort: 8080 - containerPort: 50000 env: volumeMounts: - mountPath: /var/jenkins_home name: jenkins-home volumes: - name: jenkins-home gcePersistentDisk: pdName: jenkins-home fsType: ext4 partition: 1
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins Master
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins IngressDefinition
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: jenkins namespace: jenkinsspec: tls: - secretName: tls backend: serviceName: jenkins-ui servicePort: 8080
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins Executors
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Kubernetes Plugin
● Map pod templates to Jenkins labels
● Spins up/down pods on demand (per build)
● Bring your own Docker image
● Use k8s service account credentials for
authentication
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins PodDefinition
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Kubernetes Plugin
Thank you Carlos Sanchez
@csanchez
Proprietary + ConfidentialProprietary + Confidential
Proprietary + Confidential
Jenkins Pipelines
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins Pipelines
Build Test DeployDevelop Observe
Flexible
Reproducible
Auditable
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins Pipelinesnode { def project = 'vic-goog' def appName = 'gceme' def feSvcName = "${appName}-frontend" def imageTag = "gcr.io/${project}/${appName}:${env.BUILD_NUMBER}"
checkout scm
stage 'Build image' sh("docker build -t ${imageTag} .")
stage 'Run Go tests' sh("docker run ${imageTag} go test")
stage 'Push image to registry' sh("gcloud docker push ${imageTag}")
stage "Deploy Application" sh("sed -i.bak 's#IMAGE_NAME#${imageTag}#' ./k8s/*.yaml") sh("kubectl --namespace=production apply -f k8s/")}
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Jenkins Pipelines
Proprietary + ConfidentialProprietary + Confidential
Proprietary + Confidential
Continuous Deployment
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Canary Deployments in Kubernetes
kind: ServiceapiVersion: v1metadata: name: frontendspec: type: LoadBalancer ports: - name: http port: 80 targetPort: 80 protocol: TCP selector: app: awesome-stuff role: frontend
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: frontend-prodspec: replicas: 90 template: metadata: name: frontend labels: app: awesome-stuff role: frontend env: prod spec: containers: - name: frontend image: my-img:v1 ports: - name: ui containerPort: 80
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: frontend-stagingspec: replicas: 10 template: metadata: name: frontend labels: app: awesome-stuff role: frontend env: staging spec: containers: - name: frontend image:my-img:v2 ports: - name: ui containerPort: 80
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Kubernetes CD Pipeline Overview
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Canary Deployments in Kubernetes
kind: ServiceapiVersion: v1metadata: name: frontendspec: type: LoadBalancer ports: - name: http port: 80 targetPort: 80 protocol: TCP selector: app: awesome-stuff role: frontend
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: frontend-prodspec: replicas: 90 template: metadata: name: frontend labels: app: awesome-stuff role: frontend env: prod spec: containers: - name: frontend image: my-img:v1 ports: - name: ui containerPort: 80
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: frontend-stagingspec: replicas: 10 template: metadata: name: frontend labels: app: awesome-stuff role: frontend env: staging spec: containers: - name: frontend image:my-img:v2 ports: - name: ui containerPort: 80
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Canary Deployments in Kubernetes
kind: ServiceapiVersion: v1metadata: name: frontendspec: type: LoadBalancer ports: - name: http port: 80 targetPort: 80 protocol: TCP selector: app: awesome-stuff role: frontend
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: frontend-prodspec: replicas: 90 template: metadata: name: frontend labels: app: awesome-stuff role: frontend env: prod spec: containers: - name: frontend image: my-img:v1 ports: - name: ui containerPort: 80
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: frontend-stagingspec: replicas: 10 template: metadata: name: frontend labels: app: awesome-stuff role: frontend env: staging spec: containers: - name: frontend image:my-img:v2 ports: - name: ui containerPort: 80
Proprietary + ConfidentialProprietary + Confidential
Proprietary + Confidential
Developer Workflow Example
Deploy canary to stagingDeploy new features
Rollback
Source: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis non erat sem
Proprietary + Confidential
Sample App
Kubernetes Cluster
Node 2Node 1
Backend
Frontend Frontend
Backend Service
Frontend
Frontend Service
Backend Backend
Tutorial and Sample Appgithub.com/GoogleCloudPlatform/continuous-deployment-on-kubernetes
THANK YOU@evandbrown