~cjwatson/isitdeployable/breezy

« back to all changes in this revision

Viewing changes to Makefile.k8s

  • Committer: Ubuntu One Auto Copilot
  • Author(s): Ricardo Kirkner
  • Date: 2017-10-19 21:57:24 UTC
  • mfrom: (264.1.11 trunk)
  • Revision ID: otto-copilot@canonical.com-20171019215724-kbscx6xpc9hpaye9
better config rendering from templates

- simplified rendering of templates
- deleted no longer necessary files (crt/key)
- separate environment variables definition from makefile
- automatically create namespace before deploying dev services

Merged from https://code.launchpad.net/~ricardokirkner/isitdeployable/improve-makefile-config-templates/+merge/332496

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
KUBECONFIG ?= $(HOME)/.kube/config
2
2
KUBECTL = kubectl --kubeconfig=$(KUBECONFIG) --insecure-skip-tls-verify=true
 
3
REGISTRY_CONFIG = deployment/registry.yaml
3
4
 
4
 
DOCKER_REGISTRY ?= localhost:5000
5
 
REGISTRY_CONFIG = deployment/registry.yml
6
5
IMAGE_NAME ?= isitdeployable
7
6
IMAGE_TAG ?= $(shell bzr version-info --custom --template={branch_nick}-{revno})
8
 
NAMESPACE ?= isitdeployable
9
 
DB_EXTERNAL_NAME ?= db.default.svc.cluster.local
10
 
AMQP_EXTERNAL_NAME ?= amqp.default.svc.cluster.local
11
 
 
12
 
DOMAIN ?= dpa.k8s
13
 
TLS_CRT ?= $(shell cat deployment/$(DOMAIN).crt | base64 -w0)
14
 
TLS_KEY ?= $(shell cat deployment/$(DOMAIN).key | base64 -w0)
15
7
 
16
8
HTTP_PROXY ?= $(http_proxy)
17
9
HTTPS_PROXY ?= $(https_proxy)
18
10
NO_PROXY ?= $(no_proxy)
19
11
 
 
12
# automatically source environment variables
 
13
include envrc.mk
 
14
 
20
15
# public targets
21
16
 
22
17
k8s-bootstrap: $(ENV) fetch-sourcedeps  ## Bootstrap k8s environment
30
25
        $(KUBECTL) --namespace kube-system port-forward $(REGISTRY_POD) 5000:5000
31
26
 
32
27
k8s-build: fetch-sourcedeps  ## Build container image
 
28
        @$(check-env-vars)
33
29
        @echo 'Building image on:' $(shell lsb_release -cs)
34
30
        @echo 'Building image using docker version:' $(shell docker version -f "Server: {{.Server.Version}} Client: {{.Client.Version}}")
35
31
        $(eval BUILD_ARGS = --label revision="$(shell bzr revno)")
45
41
        docker build $(BUILD_ARGS) -t $(IMAGE_NAME):$(IMAGE_TAG) .
46
42
 
47
43
k8s-upload:  ## Upload image to registry
 
44
        @$(check-env-vars)
48
45
        docker tag $(IMAGE_NAME):$(IMAGE_TAG) $(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) 
49
46
        docker push $(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG)
50
47
 
51
 
k8s-render-templates: $(shell find deployment -name *.yml.j2 -printf 'tmp/%f\n' | sed -e 's/.j2//g')
 
48
k8s-render-config: $(shell find deployment -name '*.yaml.tpl' -printf 'tmp/%f\n' | sed -e 's/.tpl//g')
 
49
 
 
50
k8s-clean-config:
 
51
        rm -f tmp/*.yaml
52
52
 
53
53
k8s-deploy-all:  ## Deploy isitdeployable full stack (PRODUCTION)
54
54
        $(MAKE) k8s-deploy-namespace
58
58
        $(MAKE) k8s-deploy-app
59
59
        $(MAKE) k8s-deploy-firewall
60
60
 
61
 
k8s-deploy-namespace: k8s-render-templates  ## Deploy namespace for isitdeployable (PRODUCTION)
62
 
        $(KUBECTL) create -f tmp/namespace.yml || true
 
61
k8s-deploy-namespace: k8s-render-config  ## Deploy namespace for isitdeployable (PRODUCTION)
 
62
        $(KUBECTL) create -f tmp/namespace.yaml || true
63
63
 
64
 
k8s-deploy-config: k8s-render-templates  ## Deploy configuration for isitdeployable (PRODUCTION)
65
 
        $(KUBECTL) create -f tmp/configmaps.yml || true
 
64
k8s-deploy-config: k8s-render-config  ## Deploy configuration for isitdeployable (PRODUCTION)
 
65
        $(KUBECTL) create -f tmp/configmaps.yaml || true
66
66
 
67
67
k8s-deploy-registry-secret: k8s-deploy-namespace  ## Deploy secret for registry access into isitdeployable namespace (PRODUCTION)
 
68
        @$(check-env-vars)
68
69
        $(KUBECTL) get secret registry-access -o yaml | sed 's/default/$(NAMESPACE)/g' | kubectl -n $(NAMESPACE) create -f - || true
69
70
 
70
 
k8s-deploy-services: k8s-render-templates  ## Deploy isitdeployable supporting services (PRODUCTION)
71
 
        $(KUBECTL) create -f tmp/services.yml || true
 
71
k8s-deploy-services: k8s-render-config  ## Deploy isitdeployable supporting services (PRODUCTION)
 
72
        $(KUBECTL) create -f tmp/services.yaml || true
72
73
 
73
 
k8s-deploy-app: k8s-render-templates  ## Deploy isitdeployable app
74
 
        $(KUBECTL) create --record -f tmp/secrets.yml -f tmp/deployments.yml || true
 
74
k8s-deploy-app: k8s-render-config  ## Deploy isitdeployable app
 
75
        @$(check-env-vars)
 
76
        $(KUBECTL) create --record -f tmp/secrets.yaml -f tmp/deployments.yaml || true
75
77
        $(KUBECTL) --namespace $(NAMESPACE) rollout status deployment/app
76
78
 
77
 
k8s-deploy-firewall: k8s-render-templates  ## Deploy ingress rules
78
 
        $(KUBECTL) create -f tmp/ingress.yml || true
 
79
k8s-deploy-firewall: k8s-render-config  ## Deploy ingress rules
 
80
        $(KUBECTL) create -f tmp/ingress.yaml || true
79
81
 
80
82
k8s-update-app:  ## Update isitdeployable app
 
83
        @$(check-env-vars)
81
84
        $(KUBECTL) --namespace $(NAMESPACE) set image deployment/app app=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) worker=$(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) 
82
85
        $(KUBECTL) --namespace $(NAMESPACE) rollout status deployment/app
83
86
 
84
 
k8s-deploy-all-dev: k8s-render-templates  ## Deploy isitdeployable full stack for development
 
87
k8s-deploy-all-dev: k8s-render-config  ## Deploy isitdeployable full stack for development
 
88
        $(MAKE) k8s-deploy-namespace
85
89
        $(MAKE) k8s-deploy-services-dev
86
90
        $(MAKE) k8s-deploy-all
87
91
 
88
 
k8s-deploy-services-dev: k8s-render-templates  ## Deploy isitdeployable supporting services for development
89
 
        $(KUBECTL) create -f deployment/services-dev.yml || true
90
 
        $(KUBECTL) rollout status deployment/db
91
 
        $(KUBECTL) rollout status deployment/amqp
 
92
k8s-deploy-services-dev: k8s-render-config  ## Deploy isitdeployable supporting services for development
 
93
        @$(check-env-vars)
 
94
        $(KUBECTL) create -f tmp/services-dev.yaml || true
 
95
        $(KUBECTL) --namespace $(NAMESPACE) rollout status deployment/db
 
96
        $(KUBECTL) --namespace $(NAMESPACE) rollout status deployment/amqp
92
97
 
93
98
# helper targets
94
99
 
95
 
tmp/%.yml: deployment/%.yml.j2
96
 
        $(MAKE) generate-config K8S_CONFIG=$@ K8S_CONFIG_TEMPLATE=$<
97
 
 
98
 
generate-config:
99
 
        IMAGE_NAME="$(IMAGE_NAME)" IMAGE_TAG="$(IMAGE_TAG)" \
100
 
        DOCKER_REGISTRY="$(DOCKER_REGISTRY)" \
101
 
        BUILD_REVISION="$(shell docker inspect -f '{{ .Config.Labels.revision }}' $(DOCKER_REGISTRY):$(IMAGE_NAME):$(IMAGE_TAG))" \
102
 
        NAMESPACE=$(NAMESPACE) \
103
 
        DB_EXTERNAL_NAME=$(DB_EXTERNAL_NAME) \
104
 
        AMQP_EXTERNAL_NAME=$(AMQP_EXTERNAL_NAME) \
105
 
        DOMAIN="$(DOMAIN)" TLS_CRT="$(TLS_CRT)" TLS_KEY="$(TLS_KEY)" \
106
 
        LP_BOT="$(shell bzr lp-login)" \
107
 
        python scripts/generate-config $(K8S_CONFIG_TEMPLATE) > $(K8S_CONFIG)
 
100
tmp/%.yaml: deployment/%.yaml.tpl
 
101
        $(MAKE) render-template SRC=$< DST=$@
 
102
 
 
103
render-template:
 
104
        @$(check-env-vars)
 
105
        @$(eval REVISION=$(shell docker inspect -f '{{.Config.Labels.revision}}' $(DOCKER_REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG)))
 
106
        @REVISION=$(REVISION) IMAGE_NAME=$(IMAGE_NAME) IMAGE_TAG=$(IMAGE_TAG) envsubst < $(SRC) > $(DST)
 
107
 
 
108
# defines
 
109
 
 
110
define check-env-vars
 
111
        if test -z "$(NAMESPACE)"; then \
 
112
                echo "NAMESPACE variable not defined; aborting."; \
 
113
                exit 1; \
 
114
        elif test -z "$(DOMAIN)"; then \
 
115
                echo "DOMAIN variable not defined; aborting."; \
 
116
                exit 1; \
 
117
        elif test -z "$(DB_EXTERNAL_NAME)"; then \
 
118
                echo "DB_EXTERNAL_NAME variable not defined; aborting."; \
 
119
                exit 1; \
 
120
        elif test -z "$(AMQP_EXTERNAL_NAME)"; then \
 
121
                echo "AMQP_EXTERNAL_NAME variable not defined; aborting."; \
 
122
                exit 1; \
 
123
        elif test -z "$(DOCKER_REGISTRY)"; then \
 
124
                echo "DOCKER_REGISTRY variable not defined; aborting."; \
 
125
                exit 1; \
 
126
        elif test -z "$(IMAGE_NAME)"; then \
 
127
                echo "IMAGE_NAME variable not defined; aborting."; \
 
128
                exit 1; \
 
129
        elif test -z "$(IMAGE_TAG)"; then \
 
130
                echo "IMAGE_TAG variable not defined; aborting."; \
 
131
                exit 1; \
 
132
        elif test -z "$(LP_BOT)"; then \
 
133
                echo "LP_BOT variable not defined; aborting."; \
 
134
                exit 1; \
 
135
        fi
 
136
endef