Last modified November 27, 2024

'kubectl gs gitops add app' command reference

This command adds a new App to the GitOps repository.

Prerequisites

Your GitOps repository should provide the following structural layers:

Description

The structure created by this command is presented below. Resources enclosed in a square brackets [] are considered optional.

management-clusters/MC_NAME/organizations/ORG_NAME/workload-clusters/[mapi/]apps
├── kustomization.yaml
└── APP_NAME
    ├── [kustomization.yaml]
    ├── [appcr.yaml]
    ├── [configmap.yaml]
    ├── [patch_app_userconfig.yaml]
    └── [secret.enc.yaml]

Application can be added to the requested cluster either directly, resulting in the appcr.yaml file creation, or in-directly from a base, resulting in the kustomization.yaml creation, which then references the base. Note however, in order to use in-direct method user must have a working base to reference with the --base flag. In any case, user may provide configuration to the application with the --user-configmap and the --user-secret flags.

Usage

Basic command syntax: kubectl gs gitops add app FLAGS.

Flags

  • --management-cluster – name of the management cluster the workload cluster belongs to (required)
  • --organization – name of the organization the workload cluster belongs to (required)
  • --workload-cluster – name of the workload cluster to configure the app for (required)
  • --app – app name in the catalog
  • --base – path to the base directory; must be relative to the repository root
  • --catalog – catalog to install the app from
  • --name – name of the app to use for creating the repository directory structure
  • --target-namespace – namespace to install app into
  • --skip-mapi – skip mapi directory when adding the app
  • --user-configmap – values YAML to customize the app with; will get inserted into a ConfigMap.
  • --user-secret – values YAML to customize the app with; will get inserted into a Secret.
  • --version – app version to install.

The following flags are supported by all gitops subcommands:

  • --dry-run – Print files and directories instead of creating them.
  • --local-path – Path to the repository root folder (default “.”).

Examples

kubectl gs gitops add app \
  --local-path /tmp/gitops-demo \
  --management-cluster demomc \
  --organization demoorg \
  --workload-cluster demowc \
  --app hello-world \
  --catalog giantswarm \
  --version 0.3.0 \
  --target-namespace default \
  --name hello-world \
  --dry-run

Output:

## CREATE ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world/appcr.yaml
apiVersion: application.giantswarm.io/v1alpha1
kind: App
metadata:
  name: demowc-hello-world
spec:
  catalog: giantswarm
  name: hello-world
  namespace: default
  version: 0.3.0


## MODIFY ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
commonLabels:
  giantswarm.io/cluster: ${cluster_name}
  giantswarm.io/managed-by: flux
kind: Kustomization
namespace: org-${organization}
patches:
- path: patch_cluster_config.yaml
  target:
    kind: App
resources:
- hello-world/appcr.yaml

When needed, application can be given configuration passed with the --user-configmap and the --user-secret flags. Note, files referenced by these flags should carry a valid values YAML configuration conforming the values schema of the given the app version.

Below is the example of values.yaml configuring number of replicas and overriding the app’s name.

replicaCount: 5
fullnameOverride: "gitops-demo-app"

After saving this into /tmp/values.yaml, it can be referenced when adding an app.

kubectl gs gitops add app \
  --local-path /tmp/gitops-demo \
  --management-cluster demomc \
  --organization demoorg \
  --workload-cluster demowc \
  --app hello-world \
  --catalog giantswarm \
  --version 0.3.0 \
  --target-namespace default \
  --name hello-world \
  --user-configmap /tmp/values.yaml \
  --dry-run

Output:

## CREATE ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world/appcr.yaml
apiVersion: application.giantswarm.io/v1alpha1
kind: App
metadata:
  name: demowc-hello-world
spec:
  catalog: giantswarm
  name: hello-world
  namespace: default
  version: 0.3.0
  userConfig:
    configMap:
      name: demowc-hello-world-user-values
      namespace: org-demoorg

/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world/configmap.yaml
apiVersion: v1
data:
  values: |
    replicaCount: 5
    fullnameOverride: "gitops-demo-app"
kind: ConfigMap
metadata:
  name: demowc-hello-world-user-values
  namespace: org-demoorg


## MODIFY ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
commonLabels:
  giantswarm.io/cluster: ${cluster_name}
  giantswarm.io/managed-by: flux
kind: Kustomization
namespace: org-${organization}
patches:
- path: patch_cluster_config.yaml
  target:
    kind: App
resources:
- hello-world/appcr.yaml
- hello-world/configmap.yaml

In order to add app from a base the --base flag should be used instead of specifying all the apps parameters separately.

kubectl gs gitops add app \
  --local-path /tmp/gitops-demo \
  --management-cluster demomc \
  --organization demoorg \
  --workload-cluster demowc \
  --base bases/apps/hello-world \
  --name hello-world \
  --dry-run

Output:

## CREATE ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
buildMetadata: [originAnnotations]
kind: Kustomization
resources:
  - ../../../../../../../../../bases/apps/hello-world


## MODIFY ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
commonLabels:
  giantswarm.io/cluster: ${cluster_name}
  giantswarm.io/managed-by: flux
kind: Kustomization
namespace: org-${organization}
patches:
- path: patch_cluster_config.yaml
  target:
    kind: App
resources:
- hello-world

When adding app from a base, it can still be customized with user configuration. Note, files referenced by these flags should carry a valid values YAML configuration conforming the values schema of the given the app version.

Below is the example of values.yaml configuring number of replicas and overriding the app’s name.

replicaCount: 5
fullnameOverride: "gitops-demo-app"

After saving this into /tmp/values.yaml, it can be referenced when adding an app.

kubectl gs gitops add app \
  --local-path /tmp/gitops-demo \
  --management-cluster demomc \
  --organization demoorg \
  --workload-cluster demowc \
  --base bases/apps/hello-world \
  --name hello-world \
  --user-configmap /tmp/values.yaml \
  --dry-run

Output:

## CREATE ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world/configmap.yaml
apiVersion: v1
data:
  values: |
    replicaCount: 5
    fullnameOverride: "gitops-demo-app"
kind: ConfigMap
metadata:
  name: demowc-hello-world-user-values
  namespace: org-demoorg

/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
buildMetadata: [originAnnotations]
patchesStrategicMerge:
  - patch_app_userconfig.yaml
kind: Kustomization
resources:
  - ../../../../../../../../../bases/apps/hello-world
  - configmap.yaml

/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/hello-world/patch_app_userconfig.yaml
apiVersion: application.giantswarm.io/v1alpha1
kind: App
metadata:
  name: ${cluster_name}-hello-world
  namespace: org-${organization}
spec:
  userConfig:
    configMap:
      name: demowc-hello-world-user-values
      namespace: org-demoorg


## MODIFY ##
/tmp/gitops-demo/management-clusters/demomc/organizations/demoorg/workload-clusters/demowc/mapi/apps/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
commonLabels:
  giantswarm.io/cluster: ${cluster_name}
  giantswarm.io/managed-by: flux
kind: Kustomization
namespace: org-${organization}
patches:
- path: patch_cluster_config.yaml
  target:
    kind: App
resources:
- hello-world

Remove the --dry-run flag and re-run it to apply the changes.

This part of our documentation refers to our vintage product. The content may be not valid anymore for our current product. Please check our new documentation hub for the latest state of our docs.