continuous deployment with jenkins on kubernetes

Post on 07-Jan-2017

714 Views

Category:

Internet

8 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related