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
=== modified file 'deployment/Makefile'
--- deployment/Makefile 2017-11-13 14:28:56 +0000
+++ deployment/Makefile 2017-11-15 15:54:57 +0000
@@ -34,7 +34,15 @@
34deploy: render-config ## Deploy stack (from scratch)34deploy: render-config ## Deploy stack (from scratch)
35 @$(check-env-vars)35 @$(check-env-vars)
36 @$(check-image-vars)36 @$(check-image-vars)
37 kubectl apply -f tmp -f secrets.yaml --record37 kubectl apply --record \
38 -f tmp/configmaps.yaml \
39 -f secrets.yaml \
40 -f tmp/services.yaml \
41 -f tmp/ingress.yaml
42 $(MAKE) migrate-db
43 kubectl apply --record -f tmp/deployments.yaml
44 kubectl -n $(NAMESPACE) rollout status deployment/app
45 $(MAKE) clean-migrate-db
3846
39.PHONY: update-deploy47.PHONY: update-deploy
40update-deploy: FILENAME ?= tmp/deployments.yaml48update-deploy: FILENAME ?= tmp/deployments.yaml
@@ -42,6 +50,7 @@
42 @$(check-env-vars)50 @$(check-env-vars)
43 @$(check-image-vars)51 @$(check-image-vars)
44 kubectl replace -f $(FILENAME) --record52 kubectl replace -f $(FILENAME) --record
53 kubectl -n $(NAMESPACE) rollout status deployment/app
4554
46.PHONY: update-config55.PHONY: update-config
47update-config: tmp/configmaps.yaml ## Update config options56update-config: tmp/configmaps.yaml ## Update config options
@@ -60,13 +69,26 @@
60 kubectl -n $(NAMESPACE) set image deployment/app app=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) worker=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) --record69 kubectl -n $(NAMESPACE) set image deployment/app app=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) worker=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) --record
61 kubectl -n $(NAMESPACE) rollout status deployment/app70 kubectl -n $(NAMESPACE) rollout status deployment/app
6271
72.PHONY: migrate-db
73migrate-db: tmp/migrate-db-job.yaml ## Run schema migrations
74 @$(check-env-vars)
75 kubectl apply -f tmp/migrate-db-job.yaml --record
76 until kubectl -n $(NAMESPACE) get jobs migrate-db -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}' | grep True ; do sleep 1 ; done
77
78.PHONY: clean-migrate-db
79clean-migrate-db: tmp/migrate-db-job.yaml ## Remove job for schema migrations
80 @$(check-env-vars)
81 kubectl delete -f tmp/migrate-db-job.yaml
82
63.PHONY: release83.PHONY: release
64release: ## Cut a new release84release: ## Cut a new release
65 @$(check-env-vars)85 @$(check-env-vars)
66 @$(check-image-vars)86 @$(check-image-vars)
67 $(MAKE) clean-config87 $(MAKE) clean-config
68 $(MAKE) render-config88 $(MAKE) render-config
89 $(MAKE) migrate-db
69 $(MAKE) update-deploy90 $(MAKE) update-deploy
91 $(MAKE) clean-migrate-db
7092
71.PHONY: rollback93.PHONY: rollback
72rollback: ## Undo latest release94rollback: ## Undo latest release
7395
=== modified file 'deployment/config/deployments.yaml.tpl'
--- deployment/config/deployments.yaml.tpl 2017-11-10 16:02:18 +0000
+++ deployment/config/deployments.yaml.tpl 2017-11-15 15:54:57 +0000
@@ -11,9 +11,6 @@
11 revisionHistoryLimit: 211 revisionHistoryLimit: 2
12 strategy:12 strategy:
13 type: RollingUpdate13 type: RollingUpdate
14 rollingUpdate:
15 maxSurge: 1
16 maxUnavailable: 0
17 minReadySeconds: 514 minReadySeconds: 5
18 selector:15 selector:
19 matchLabels:16 matchLabels:
@@ -38,31 +35,6 @@
38 - key: "id_rsa.pub"35 - key: "id_rsa.pub"
39 path: ./id_rsa.pub36 path: ./id_rsa.pub
40 mode: 064437 mode: 0644
41 initContainers:
42 - name: migrate-db
43 image: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
44 imagePullPolicy: Always
45 env:
46 # config
47 - name: DJANGO_SETTINGS_MODULE
48 value: django_project.settings_base
49 # secrets
50 - name: ADMIN_DATABASE_URL
51 valueFrom:
52 secretKeyRef:
53 name: app
54 key: ADMIN_DATABASE_URL
55 - name: DATABASE_URL
56 valueFrom:
57 secretKeyRef:
58 name: app
59 key: DATABASE_URL
60 - name: SECRET_KEY
61 valueFrom:
62 secretKeyRef:
63 name: app
64 key: SECRET_KEY
65 command: ["make", "app-update-db"]
66 containers:38 containers:
67 - name: app39 - name: app
68 image: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}40 image: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
6941
=== added file 'deployment/config/migrate-db-job.yaml.tpl'
--- deployment/config/migrate-db-job.yaml.tpl 1970-01-01 00:00:00 +0000
+++ deployment/config/migrate-db-job.yaml.tpl 2017-11-15 15:54:57 +0000
@@ -0,0 +1,41 @@
1apiVersion: batch/v1
2kind: Job
3metadata:
4 name: migrate-db
5 namespace: ${NAMESPACE}
6 labels:
7 revision: "${REVISION}"
8spec:
9 template:
10 metadata:
11 name: migrate-db
12 namespace: ${NAMESPACE}
13 labels:
14 revision: "${REVISION}"
15 spec:
16 restartPolicy: Never
17 containers:
18 - name: migrate-db
19 image: ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
20 imagePullPolicy: Always
21 env:
22 # config
23 - name: DJANGO_SETTINGS_MODULE
24 value: django_project.settings_base
25 # secrets
26 - name: ADMIN_DATABASE_URL
27 valueFrom:
28 secretKeyRef:
29 name: app
30 key: ADMIN_DATABASE_URL
31 - name: DATABASE_URL
32 valueFrom:
33 secretKeyRef:
34 name: app
35 key: DATABASE_URL
36 - name: SECRET_KEY
37 valueFrom:
38 secretKeyRef:
39 name: app
40 key: SECRET_KEY
41 command: ["make", "app-update-db"]

Subscribers

People subscribed via source and target branches