Best way to DRY up deployments that all depend on a very similar init-container

8/20/2018

I have 10 applications to deploy to Kubernetes. Each of the deployments depends on an init container that is basically identical except for a single parameter (and it doesn't make conceptual sense for me to decouple this init container from the application). So far I've been copy-pasting this init container into each deployment.yaml file, but I feel like that's got to be a better way of doing this!

I haven't seen a great solution from my research, though the only thing I can think of so far is to use something like Helm to package up the init container and deploy it as part of some dependency-based way (Argo?).

Has anyone else with this issue found a solution they were satisfied with?

-- Mike
kubernetes

1 Answer

8/21/2018

A Helm template can contain an arbitrary amount of text, just so long as when all of the macros are expanded it produces a valid YAML Kubernetes manifest. ("Valid YAML" is trickier than it sounds because the indentation matters.)

The simplest way to do this would be to write a shared Helm template that included the definition for the init container:

_init_container.tpl:

{{- define "common.myinit" -}}
name: myinit
image: myname/myinit:{{ .Values.initTag }}
# Other things from a container spec
{{ end -}}

Then in your deployment, include this:

deployment.yaml:

apiVersion: v1
kind: Deployment
spec:
  template:
    spec:
      initContainers:
        - {{ include "common.myinit" . | indent 10 | strip }}

Then you can copy the _init_container.tpl file into each of your individual services.

If you want to avoid the copy-and-paste (reasonable enough) you can create a Helm chart that contains only templates and no actual Kubernetes resources. You need to set up some sort of repository to hold this chart. Put the _init_container.tpl into that shared chart, declare it as a dependency is the chart metadata, and reference the template in your deployment YAML in the same way (Go template names are shared across all included charts).

-- David Maze
Source: StackOverflow