Files
kustomize/examples/multibases
2018-07-27 10:43:16 -07:00
..
2018-07-27 10:43:16 -07:00
2018-07-27 10:43:16 -07:00
2018-07-27 10:43:16 -07:00
2018-07-27 10:43:16 -07:00
2018-07-27 10:43:16 -07:00
2018-07-27 10:43:16 -07:00

Demo: multibases with a common base

When managing application in different environment, many Kustomize users have seen this scenario. There is a base Kustomization for this application. On top of this base, there are several variants such as dev, staging and production variants. In each of those variants, a different namePrefix is applied. Users sometimes need to create another kustomization compsing all three variants, applying the same namePrefix, commonLables or commonAnnotations and deploying them together with one kubectl command.

Kustomize supports composing multiple variants like that in the same kustomization.yaml. This demo shows how this works with a pod object.

Define a place to work:

DEMO_HOME=$(mktemp -d)

Define a common base:

BASE=$DEMO_HOME/base
mkdir $BASE

cat <<EOF >$BASE/kustomization.yaml
resources:
- pod.yaml
EOF

cat <<EOF >$BASE/pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
EOF

Define a dev variant overlaying base:

DEV=$DEMO_HOME/dev
mkdir $DEV

cat <<EOF >$DEV/kustomization.yaml
bases:
- ./../base
namePrefix: dev-
EOF

Define a staging variant overlaying base:

STAG=$DEMO_HOME/staging
mkdir $STAG

cat <<EOF >$STAG/kustomization.yaml
bases:
- ./../base
namePrefix: stag-
EOF

Define a production variant overlaying base:

PROD=$DEMO_HOME/production
mkdir $PROD

cat <<EOF >$PROD/kustomization.yaml
bases:
- ./../base
namePrefix: prod-
EOF

Then define a Kustomization composing three variants together:

cat <<EOF >$DEMO_HOME/kustomization.yaml
bases:
- ./dev
- ./staging
- ./production

namePrefix: cluster-a-
EOF

Now the workspace has following directories

.
├── base
│   ├── kustomization.yaml
│   └── pod.yaml
├── dev
│   └── kustomization.yaml
├── kustomization.yaml
├── production
│   └── kustomization.yaml
└── staging
    └── kustomization.yaml

Confirm that the kustomize build output contains three pod objects from dev, staing and production variants.

test 1 == \
  $(kustomize build $DEMO_HOME | grep cluster-a-dev-myapp-pod | wc -l); \
  echo $?
  
test 1 == \
  $(kustomize build $DEMO_HOME | grep cluster-a-stag-myapp-pod | wc -l); \
  echo $?
  
test 1 == \
  $(kustomize build $DEMO_HOME | grep cluster-a-prod-myapp-pod | wc -l); \
  echo $?