monopole b9f05dd357 Expose some top level kustomize commands.
The PR exposes some of the top level kustomize commands
(especially `build`) for reuse in other command line tools
(expecially `kubectl`, see #1500).

This PR represents option 3 from the following list of ways
this exposure could be arranged.

1. Expose the commands in the `api` module.

```
REPO/api/go.mod
REPO/api/builtins
REPO/api/commands <- new
REPO/api/...
```

Disadvantage: This would make `api` module depend on cobra.
That's bad for clients that want to depend on the api, but
want to write their own commands at their own version of
cobra.  The `api` module shouldn't depend on UX libraries
like cobra.

2. Expose the commands in their own `commands` module.

They'd appear alongside `api`, e.g. `

```
REPO/api/go.mod
REPO/api/builtins
REPO/api/...
REPO/commands/go.mod
REPO/commands/build
REPO/commands/edit
REPO/commands/...
```

Advantage: The commands would be consumed by the kustomize
binary and the kubectl binary in the same way.

Disadvantage: The kustomize binary module and the commands
module could evolve separately with their own version
numbers, creating confusion.

3. Expose the commands in the existing `kustomize` module

```
REPO/api/go.mod
REPO/api/builtins
REPO/api/...
REPO/kustomize/go.mod
REPO/kustomize/main.go
REPO/kustomize/commands/build
REPO/kustomize/commands/edit
REPO/kustomize/commands/...
```

Outside users, e.g. kubectl, could then

```
import sigs.k8s.io/kustomize/kustomize/v3/commands/build
```

and hopefully still get the `main` package
as they do now via:

```
go get sigs.k8s.io/kustomize/kustomize/v3
```

Advantage: 1) The kustomize binary ships at the same version
as the commands - which makes sense as the binary's
_version_ refers to how the CLI operates (command names,
flags, etc.).  This makes it easy to related the version of
a kustomize binary with the version of commands running in
some other CLI binary.  2) The path to the kustomize binary
doesn't change.

Disadvantage: It's an atypical Go module arrangement.
Usually `main` packages live as leaves under a directory
called `cmd` inside a module, rather than at the _top_ of
the module.  This might cause some problems.  If so, we can
go with option 4.

4. Same as 3, but move `main.go` (the `main` package) down one step.

```
REPO/api/go.mod
REPO/api/builtins
REPO/api/...
REPO/kustomize/go.mod
REPO/kustomize/cmd/main.go
REPO/kustomize/commands/build
REPO/kustomize/commands/edit
REPO/kustomize/commands/...
```
2021-02-04 08:35:01 -08:00
2020-11-03 10:04:42 -08:00
2021-02-03 14:30:25 -08:00
2021-01-28 09:17:39 +09:00
2021-02-03 14:30:25 -08:00
2021-01-17 10:25:19 -08:00
2020-11-25 12:41:20 -08:00
2020-06-10 14:59:19 -07:00
2020-12-13 18:03:35 -05:00
2018-05-08 10:37:01 -07:00
2018-05-11 11:33:39 -07:00
2020-09-03 10:57:50 -07:00
2020-12-01 13:18:59 -05:00

kustomize

kustomize lets you customize raw, template-free YAML files for multiple purposes, leaving the original YAML untouched and usable as is.

kustomize targets kubernetes; it understands and can patch kubernetes style API objects. It's like make, in that what it does is declared in a file, and it's like sed, in that it emits edited text.

This tool is sponsored by sig-cli (KEP).

Build Status Go Report Card

kubectl integration

The kustomize build flow at v2.0.3 was added to kubectl v1.14. The kustomize flow in kubectl has remained frozen at v2.0.3 while work to extract kubectl from the k/k repo, and work to remove kustomize's dependence on core k/k code (#2506) has proceeded. The reintegration effort is tracked in #1500 (and its blocking issues).

For examples and guides for using the kubectl integration please see the kubectl book or the kubernetes documentation.

Usage

1) Make a kustomization file

In some directory containing your YAML resource files (deployments, services, configmaps, etc.), create a kustomization file.

This file should declare those resources, and any customization to apply to them, e.g. add a common label.

base image

File structure:

~/someApp
├── deployment.yaml
├── kustomization.yaml
└── service.yaml

The resources in this directory could be a fork of someone else's configuration. If so, you can easily rebase from the source material to capture improvements, because you don't modify the resources directly.

Generate customized YAML with:

kustomize build ~/someApp

The YAML can be directly applied to a cluster:

kustomize build ~/someApp | kubectl apply -f -

2) Create variants using overlays

Manage traditional variants of a configuration - like development, staging and production - using overlays that modify a common base.

overlay image

File structure:

~/someApp
├── base
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── development
    │   ├── cpu_count.yaml
    │   ├── kustomization.yaml
    │   └── replica_count.yaml
    └── production
        ├── cpu_count.yaml
        ├── kustomization.yaml
        └── replica_count.yaml

Take the work from step (1) above, move it into a someApp subdirectory called base, then place overlays in a sibling directory.

An overlay is just another kustomization, referring to the base, and referring to patches to apply to that base.

This arrangement makes it easy to manage your configuration with git. The base could have files from an upstream repository managed by someone else. The overlays could be in a repository you own. Arranging the repo clones as siblings on disk avoids the need for git submodules (though that works fine, if you are a submodule fan).

Generate YAML with

kustomize build ~/someApp/overlays/production

The YAML can be directly applied to a cluster:

kustomize build ~/someApp/overlays/production | kubectl apply -f -

Community

Code of conduct

Participation in the Kubernetes community is governed by the Kubernetes Code of Conduct.

Description
No description provided
Readme Apache-2.0 124 MiB
2026-02-09 16:15:02 +00:00
Languages
Go 58.1%
PureBasic 40.7%
Shell 0.6%
Makefile 0.4%
HTML 0.1%