Merge lp:~ricardokirkner/isitdeployable/k8s-job-for-schema-migration into lp:isitdeployable

Proposed by Ricardo Kirkner
Status: Merged
Approved by: Ricardo Kirkner
Approved revision: 270
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: lp:~ricardokirkner/isitdeployable/k8s-job-for-schema-migration
Merge into: lp:isitdeployable
Diff against target: 147 lines (+64/-29)
3 files modified
deployment/Makefile (+23/-1)
deployment/config/deployments.yaml.tpl (+0/-28)
deployment/config/migrate-db-job.yaml.tpl (+41/-0)
To merge this branch: bzr merge lp:~ricardokirkner/isitdeployable/k8s-job-for-schema-migration
Reviewer Review Type Date Requested Status
Guillermo Gonzalez Approve
Review via email: mp+333757@code.launchpad.net

Commit message

use jobs to run db schema migrations before deployments

Description of the change

By using a job instead of an initContainer it's possible to ensure db migrations are run before the deployment is started. This enables us to remove the throttling on the rolling update process thus improving overall deployment time.

To post a comment you must log in.
Revision history for this message
Guillermo Gonzalez (verterok) wrote :

LGTM

review: Approve
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'deployment/Makefile'
2--- deployment/Makefile 2017-11-13 14:28:56 +0000
3+++ deployment/Makefile 2017-11-15 15:54:57 +0000
4@@ -34,7 +34,15 @@
5 deploy: render-config ## Deploy stack (from scratch)
6 @$(check-env-vars)
7 @$(check-image-vars)
8- kubectl apply -f tmp -f secrets.yaml --record
9+ kubectl apply --record \
10+ -f tmp/configmaps.yaml \
11+ -f secrets.yaml \
12+ -f tmp/services.yaml \
13+ -f tmp/ingress.yaml
14+ $(MAKE) migrate-db
15+ kubectl apply --record -f tmp/deployments.yaml
16+ kubectl -n $(NAMESPACE) rollout status deployment/app
17+ $(MAKE) clean-migrate-db
18
19 .PHONY: update-deploy
20 update-deploy: FILENAME ?= tmp/deployments.yaml
21@@ -42,6 +50,7 @@
22 @$(check-env-vars)
23 @$(check-image-vars)
24 kubectl replace -f $(FILENAME) --record
25+ kubectl -n $(NAMESPACE) rollout status deployment/app
26
27 .PHONY: update-config
28 update-config: tmp/configmaps.yaml ## Update config options
29@@ -60,13 +69,26 @@
30 kubectl -n $(NAMESPACE) set image deployment/app app=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) worker=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) --record
31 kubectl -n $(NAMESPACE) rollout status deployment/app
32
33+.PHONY: migrate-db
34+migrate-db: tmp/migrate-db-job.yaml ## Run schema migrations
35+ @$(check-env-vars)
36+ kubectl apply -f tmp/migrate-db-job.yaml --record
37+ until kubectl -n $(NAMESPACE) get jobs migrate-db -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}' | grep True ; do sleep 1 ; done
38+
39+.PHONY: clean-migrate-db
40+clean-migrate-db: tmp/migrate-db-job.yaml ## Remove job for schema migrations
41+ @$(check-env-vars)
42+ kubectl delete -f tmp/migrate-db-job.yaml
43+
44 .PHONY: release
45 release: ## Cut a new release
46 @$(check-env-vars)
47 @$(check-image-vars)
48 $(MAKE) clean-config
49 $(MAKE) render-config
50+ $(MAKE) migrate-db
51 $(MAKE) update-deploy
52+ $(MAKE) clean-migrate-db
53
54 .PHONY: rollback
55 rollback: ## Undo latest release
56
57=== modified file 'deployment/config/deployments.yaml.tpl'
58--- deployment/config/deployments.yaml.tpl 2017-11-10 16:02:18 +0000
59+++ deployment/config/deployments.yaml.tpl 2017-11-15 15:54:57 +0000
60@@ -11,9 +11,6 @@
61 revisionHistoryLimit: 2
62 strategy:
63 type: RollingUpdate
64- rollingUpdate:
65- maxSurge: 1
66- maxUnavailable: 0
67 minReadySeconds: 5
68 selector:
69 matchLabels:
70@@ -38,31 +35,6 @@
71 - key: "id_rsa.pub"
72 path: ./id_rsa.pub
73 mode: 0644
74- initContainers:
75- - name: migrate-db
76- image: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
77- imagePullPolicy: Always
78- env:
79- # config
80- - name: DJANGO_SETTINGS_MODULE
81- value: django_project.settings_base
82- # secrets
83- - name: ADMIN_DATABASE_URL
84- valueFrom:
85- secretKeyRef:
86- name: app
87- key: ADMIN_DATABASE_URL
88- - name: DATABASE_URL
89- valueFrom:
90- secretKeyRef:
91- name: app
92- key: DATABASE_URL
93- - name: SECRET_KEY
94- valueFrom:
95- secretKeyRef:
96- name: app
97- key: SECRET_KEY
98- command: ["make", "app-update-db"]
99 containers:
100 - name: app
101 image: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
102
103=== added file 'deployment/config/migrate-db-job.yaml.tpl'
104--- deployment/config/migrate-db-job.yaml.tpl 1970-01-01 00:00:00 +0000
105+++ deployment/config/migrate-db-job.yaml.tpl 2017-11-15 15:54:57 +0000
106@@ -0,0 +1,41 @@
107+apiVersion: batch/v1
108+kind: Job
109+metadata:
110+ name: migrate-db
111+ namespace: ${NAMESPACE}
112+ labels:
113+ revision: "${REVISION}"
114+spec:
115+ template:
116+ metadata:
117+ name: migrate-db
118+ namespace: ${NAMESPACE}
119+ labels:
120+ revision: "${REVISION}"
121+ spec:
122+ restartPolicy: Never
123+ containers:
124+ - name: migrate-db
125+ image: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
126+ imagePullPolicy: Always
127+ env:
128+ # config
129+ - name: DJANGO_SETTINGS_MODULE
130+ value: django_project.settings_base
131+ # secrets
132+ - name: ADMIN_DATABASE_URL
133+ valueFrom:
134+ secretKeyRef:
135+ name: app
136+ key: ADMIN_DATABASE_URL
137+ - name: DATABASE_URL
138+ valueFrom:
139+ secretKeyRef:
140+ name: app
141+ key: DATABASE_URL
142+ - name: SECRET_KEY
143+ valueFrom:
144+ secretKeyRef:
145+ name: app
146+ key: SECRET_KEY
147+ command: ["make", "app-update-db"]

Subscribers

People subscribed via source and target branches